Files
brunoandClaude Sonnet 4.5 011f05736f feat(device-binding): Phase 3 完成 - 体验优化 + E2E测试基础设施 ✅
## Phase 3 实施完成

### P3-1: 前端轮询优化 (ljwx-phone)
- ✅ 实现指数退避轮询器 (ExponentialBackoffPoller)
  - 初始间隔 2s,最大间隔 30s
  - 随机抖动 ±20% 避免惊群效应
  - 自动重置机制

### P3-2: SSE 实时推送 (ljwx-phone)
- ✅ 实现 SSE 客户端服务 (SseClient)
  - 自动重连机制 (指数退避)
  - 心跳检测 (30s 超时)
  - 事件类型路由

### P3-3: 批量审批确认机制
- ✅ 后端 confirmToken 机制
  - Redis 存储,5分钟过期
  - 防重放攻击
  - 批量操作原子性保证
- ✅ 前端确认弹窗 (BatchApprovalConfirmModal.vue)
  - 显示待审批设备列表
  - 二次确认交互

### P3-4: 设备绑定 V2 API (HMAC-SHA256 签名验证)
- ✅ DeviceBindEventController - SSE 事件推送
- ✅ DeviceSignatureService - HMAC-SHA256 签名验证
- ✅ DeviceKeyService - 设备密钥管理
- ✅ ChallengeVO, ConfirmTokenVO - V2 API 响应对象
- ✅ BindRequestStatus - 绑定请求状态枚举

## E2E 测试基础设施

### 测试脚本
- ✅ test_e2e_flow.py - 完整端到端测试
  - 租户/部门/员工创建
  - 设备注册与绑定
  - 健康数据上传与查询
  - 告警与消息生成
- ✅ test_device_binding_v2.py - 设备绑定 V2 API 测试
  - Challenge 获取
  - HMAC-SHA256 签名验证
  - 绑定请求提交
  - 审批流程测试

### 测试配置
- ✅ api-map.yaml - 新增 device_binding_v2 API 映射
  - 11 个 V2 API 端点完整定义
  - 请求/响应 schema 规范
- ✅ recipes/device_binding_v2_test.yaml - V2 测试场景配置

### 测试文档
- ✅ E2E_FLOW_TEST_GUIDE.md - E2E 测试指南
- ✅ DEVICE_BINDING_V2_TEST_GUIDE.md - V2 API 测试指南
- ✅ device-binding-phase3-implementation-report.md - Phase 3 实施报告

## 修复问题
- 🐛 修复 UserContext API 调用错误
  - getUserId() → getCurrentUserId()
  - getUserName() → getCurrentUserName()
- 🐛 修复 TDeviceUser 实体方法调用
  - setUpdatedAt() → setUpdateTime()
- 🐛 修复 BizException 构造函数签名
- 🐛 修复测试脚本 API 端点
  - /t_org/ → /sys_org_units/
  - /t_user/ → /sys_user/
- 🐛 修复认证头格式
  - satoken: <token> → Authorization: Bearer <token>

## 测试状态
- ✅ 编译通过,应用启动成功 (端口 9998)
- ✅ E2E 测试步骤 1-4 通过 (租户/部门/员工/设备注册)
- ⏳ 步骤 5-8 待完成 (需配置设备密钥)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
2026-02-08 19:36:01 +08:00
..
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-09-06 23:39:04 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-09-06 23:39:04 +08:00
2025-08-14 08:11:03 +08:00
2025-11-28 13:49:45 +08:00
2025-09-06 23:39:04 +08:00
2025-09-06 23:39:04 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-27 15:56:11 +08:00
2025-11-28 13:49:45 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00

LjwxAdmin 后台管理系统

Node Version License
Author Copyright

项目简介

LingjingAdmin 基于 SoybeanAdmin 二次修改而来。它是一个清新优雅、高颜值且功能强大的后台管理模板,采用Naive UI组件库,并最新的前端技术栈,包括 Vue3, Vite5, TypeScript, Pinia 和 UnoCSS。它内置了丰富的主题配置和组件,代码规范严谨,实现了自动化的文件路由系统。LingjingAdmin 为您提供了一站式的后台管理解决方案,无需额外配置,开箱即用。同样是一个快速学习前沿技术的最佳实践。

在此特别感谢开源作者:Soybean 。

项目特性

  • 前沿技术应用:采用 Vue3, Vite5, TypeScript, Pinia 和 UnoCSS 等最新流行的技术栈。
  • 清晰的项目架构:采用 pnpm monorepo 架构,结构清晰,优雅易懂。
  • 严格的代码规范:遵循 SoybeanJS 规范,集成了eslint, prettier 和 simple-git-hooks,保证代码的规范性。
  • TypeScript: 支持严格的类型检查,提高代码的可维护性。
  • 丰富的主题配置:内置多样的主题配置,与 UnoCSS 完美结合。
  • 内置国际化方案:轻松实现多语言支持。
  • 自动化文件路由系统:自动生成路由导入、声明和类型。更多细节请查看 Elegant Router。
  • 灵活的权限路由:同时支持前端静态路由和后端动态路由。
  • 丰富的页面组件:内置多样页面和组件,包括403、404、500页面,以及布局组件、标签组件、主题配置组件等。
  • 命令行工具:内置高效的命令行工具,git提交、删除文件、发布等。
  • 移动端适配:完美支持移动端,实现自适应布局。

项目源码

名称 链接
前端 Lingjing-admin
后端 Lingjing-boot
后端扩展依赖库 Lingjing-boot-starter

项目启动

前置环境
  • Git: 你需要git来克隆和管理项目版本。
  • NodeJS: >=18.12.0,推荐 18.19.0 或更高。(当前测试版本: v21.7.3)
  • pnpm: >= 8.7.0,推荐 8.14.0 或更高。(当前测试版本: v9.7.0)
克隆项目
git clone https://github.com/BrunoGao/platform.git
项目启动
  1. 安装依赖
pnpm i

由于本项目采用了 pnpm monorepo 的管理方式,因此请不要使用 npm 或 yarn 来安装依赖。

  1. 启动项目,修改.env.test中VITE_SERVICE_BASE_URL对应的后端地址
pnpm dev
构建项目

修改.env.prod中VITE_SERVICE_BASE_URL对应的后端地址

pnpm build

Git 提交规范

本项目已内置 commit 命令,您可以通过执行 pnpm commit 来生成符合 Conventional Commits 规范的提交信息。在提交PR时,请务必使用 commit 命令来创建提交信息,以确保信息的规范性。

示例图片

Home Home-2
User User-2
Role Role
Menu Menu-2
Menu-3 User-Dark
Mobile Mobile
Mobile Mobile

浏览器支持

推荐使用最新版的 Chrome 浏览器进行开发,以获得更好的体验。

IE  Edge Firefox Chrome Safari
not support last 2 versions last 2 versions last 2 versions last 2 versions

特别鸣谢

开源协议

项目基于 Apache License 2.0 © 2024 ljwx 协议,仅供学习参考,商业使用请遵循作者版权信息,作者不保证也不承担任何软件的使用风险。

功能说明

员工列表初始化

  • 页面初始化时会根据部门自动拉取员工列表
  • 部门变更时会自动更新员工列表
  • 支持模糊搜索员工

表单验证优化 (最新)

功能概述

  • 优化员工新增/编辑表单的实时验证体验
  • 员工名字和手机号格式错误时,修正后自动清除验证提示
  • 无需关闭抽屉重新打开即可清除验证状态

技术实现

  • 修改表单验证规则触发器,支持 input 和 change 双重触发
  • 优化 userName 和 phone 字段的验证响应机制
  • 修复 UserEdit 类型定义,移除不必要的字段

使用体验

  1. 输入验证:用户输入时立即显示格式错误提示
  2. 实时清除:修正输入后验证错误自动消失
  3. 无缝操作:提升表单操作的流畅性和用户体验

告警时序统计图

  • 主页面饼图已替换为告警时序统计图
  • 使用真实告警数据,自动根据数据实际时间范围生成时序图
  • 支持中文显示:心率、血压、体温等告警类型,待处理、已响应、已解决等状态
  • 按照alertType(折线图)、severityLevel(柱状图)维度分组展示
  • 智能时间范围:根据数据跨度自动调整显示7-30天时间窗口
  • 时间范围标注:标题显示数据总量和时间跨度(如:1/25-1/25)
  • 支持交叉分析和多维度数据对比
  • 无数据时显示友好提示信息

消息时序统计图

  • 新增消息时序分析功能,自动根据数据实际时间范围生成图表
  • 支持中文显示:系统消息、告警消息、通知消息等类型,已发送、已送达、已读等状态
  • 按照messageType(折线图)、messageStatus(面积图)维度进行时序统计
  • 智能时间范围:根据sentTime数据跨度自动调整显示窗口
  • 时间范围标注:显示消息总量和时间跨度信息
  • 支持多种消息类型的独立统计和状态追踪

🔄 用户管理 - 视图模式切换 (最新)

功能概述

  • 支持全部用户、员工、管理员三种视图模式切换
  • 根据选择的模式动态过滤显示对应用户类型
  • 在全部用户视图中显示用户类型标识(管理员/员工)

使用方法

  1. 在用户管理页面顶部选择视图模式:

    • 全部用户:显示所有用户,包含类型标识列
    • 员工:仅显示普通员工用户
    • 管理员:仅显示管理员用户
  2. 视图模式参数说明:

    viewMode: 'all' | 'employee' | 'admin'
    
  3. API调用示例:

    // 根据视图模式获取用户列表
    fetchGetUserListByViewMode({
      ...params,
      viewMode: 'employee' // 仅获取员工
    })
    

技术实现

  • 前端组件:UserViewModeSelector - 视图模式选择器
  • API函数:fetchGetUserListByViewMode - 支持viewMode参数
  • 类型标识:使用 NTag 组件显示用户类型(管理员/员工)

👨‍💼 角色管理 - 管理员标识 (最新)

功能概述

  • 角色新增/编辑时支持设置是否为管理员角色
  • 角色列表显示管理员类型标识
  • 与后端数据库 is_admin 字段同步

使用方法

  1. 新增角色:

    • 在角色信息表单中选择"普通角色"或"管理员角色"
    • 系统自动将 isAdmin 字段设置为 0 或 1
  2. 编辑角色:

    • 可以修改现有角色的管理员属性
    • 保存后立即生效
  3. 角色列表:

    • 显示"是否管理员"列
    • 管理员角色显示为红色标签
    • 普通角色显示为绿色标签

数据库字段

ALTER TABLE sys_role
ADD COLUMN is_admin TINYINT(1) NOT NULL DEFAULT 0
COMMENT '是否为管理员角色(0普通角色,1管理员角色)';

技术实现

  • 类型定义:Role.isAdmin: number
  • 表单字段:单选按钮组选择角色类型
  • 列表显示:使用 NTag 组件显示角色类型标识
  • 国际化:支持中英文切换

🚀 部署说明

开发环境

# 安装依赖
npm install

# 启动开发服务器
npm run dev

生产环境

# 构建生产版本
npm run build

# 预览生产版本
npm run preview

📖 API文档

用户管理接口

获取用户列表(支持视图模式)

GET /sys_user/page?viewMode={mode}

参数:

  • viewMode: 视图模式 (all/employee/admin)
  • 其他分页和搜索参数...

响应:

{
  "code": 200,
  "data": {
    "records": [
      {
        "id": "1",
        "userName": "admin",
        "isAdmin": true,
        "userType": "ADMIN"
      }
    ]
  }
}

角色管理接口

新增/更新角色

POST/PUT /sys_role/

请求体:

{
  "roleName": "系统管理员",
  "roleCode": "ADMIN",
  "isAdmin": 1,
  "status": "1"
}

🔧 技术栈

  • 框架: Vue 3 + TypeScript
  • UI库: Naive UI
  • 状态管理: Pinia
  • 路由: Vue Router
  • 构建工具: Vite
  • 代码规范: ESLint + Prettier

📖 开发指南

新页面开发完整流程

从创建页面到上线的完整开发流程,请参考:新页面开发完整指南

本指南基于 Message V2.1 的真实实现案例,涵盖:

Phase 1: 前端开发

  • 创建 Vue 页面组件和 API 服务
  • 配置路由和国际化
  • 本地开发调试

Phase 2: 数据库配置

  • 创建菜单记录(sys_menu)
  • 创建功能权限(sys_permission)
  • 分配角色权限
  • 清除 Sa-Token 缓存

Phase 3: 测试验证

  • 菜单可见性验证
  • 页面功能测试
  • 权限控制测试
  • 常见问题排查

适用场景:

  • ✅ 新增业务模块页面
  • ✅ 添加管理功能菜单
  • ✅ 配置用户权限控制
  • ✅ 故障排查和调试

文档特色:

  • 📝 完整的 SQL 脚本模板
  • 🔍 详细的权限配置示例
  • 🐛 常见问题解决方案
  • 💡 最佳实践和注意事项

📥 用户批量导入功能 (最新)

功能概述

  • 支持Excel (.xlsx, .xls) 和CSV格式文件批量导入用户
  • 智能模板下载,提供标准化的数据格式和字段说明
  • 支持部门和岗位的ID或名称两种查询方式
  • 详细的导入结果展示,包含成功/失败统计和错误详情

使用方法

  1. 下载模板:

    • 点击"下载导入模板"获取标准CSV模板
    • 模板包含字段:姓名、性别、年龄、工龄、手机号码、部门、岗位、设备序列号、备注
    • 提供完整的示例数据和字段说明
  2. 准备数据:

    • 按模板格式填写用户信息
    • 部门和岗位支持两种输入方式:
      • ID方式:直接填写部门/岗位的数字ID(如:11, 1)
      • 名称方式:填写完整的部门/岗位名称(如:技术部、软件工程师)
  3. 上传导入:

    • 拖拽或点击选择Excel/CSV文件
    • 系统自动验证文件格式和数据完整性
    • 显示详细的导入结果和错误信息

数据验证规则

  • 必填字段:姓名、性别、年龄、工龄、手机号码、部门、岗位
  • 格式验证:
    • 手机号:11位数字,1开头
    • 年龄:0-120范围
    • 工龄:非负数
    • 性别:只能是"男"或"女"
  • 唯一性检查:手机号不能重复
  • 权限验证:只能在授权的组织范围内导入

自动化处理

  • 用户名生成:基于手机号后6位自动生成(格式:user+6位数字)
  • 默认密码:统一设置为"123456"(MD5加密存储)
  • 邮箱设置:自动生成格式为"手机号@example.com"
  • 组织关系:自动建立用户与部门、岗位的关联关系

技术实现

  • 文件解析:集成Apache POI支持Excel解析,自定义CSV解析器
  • 数据验证:多层级验证机制,确保数据完整性和格式正确性
  • 权限控制:基于Sa-Token的导入权限验证和组织数据隔离
  • 错误处理:详细的错误报告和事务回滚机制

🚨 告警管理 - 一键批量处理 (最新)

功能概述

  • 支持批量选择和处理多条告警记录
  • 智能状态检查,自动识别已处理告警并提示用户
  • 与 ljwx-bigscreen 服务集成,调用后端批量处理接口
  • 详细的操作结果反馈,包含成功/失败数量统计

使用方法

  1. 选择告警记录:

    • 在告警管理页面选择多条(≥2条)告警记录
    • "一键批量处理"按钮将从灰色禁用状态变为可点击的绿色按钮
  2. 批量处理操作:

    • 点击"一键批量处理"按钮
    • 系统自动检查选中告警的状态
    • 如包含已响应告警,会弹出确认对话框供用户选择
  3. 操作结果:

    • 显示详细处理结果:成功X条,失败X条
    • 如有已处理过的告警,会特别标注数量
    • 处理完成后自动刷新列表数据

按钮状态说明

  • 默认状态:灰色禁用,始终显示在批量删除按钮右侧
  • 激活条件:选择2条或更多告警记录时激活
  • 禁用条件:选择少于2条记录或数据加载中时禁用
  • 权限控制:基于 t:alert:info:update 权限

技术实现

  • 前端组件:使用 #suffix 插槽实现按钮布局
  • 状态检查:检查 alertStatus === 'responded' 状态
  • API接口:调用 ljwx-bigscreen 的 /batchDealAlert 接口
  • 用户体验:包含确认对话框、详细反馈信息和权限控制

接口说明

POST http://localhost:5001/batchDealAlert
Content-Type: application/json

{
  "alertIds": ["1", "2", "3"]
}

响应格式:

{
  "success": true,
  "message": "批量处理完成:成功2条,失败1条",
  "successCount": 2,
  "failedCount": 1,
  "failedAlerts": [
    {
      "alertId": "3",
      "error": "处理失败"
    }
  ]
}

🚀 多租户 CustomerId 全局自动注入系统 (最新)

功能概述

  • 实现请求拦截器层面的 customerId 全局自动注入功能
  • 零侵入式架构升级,无需修改现有 API 调用代码
  • 支持多租户数据隔离的统一管理和自动化处理

技术特点

  1. 智能请求处理:

    • GET 请求:自动添加到查询参数 params
    • POST/PUT/DELETE 请求:自动添加到请求体 data
    • FormData 请求:作为表单字段自动添加
    • 防重复机制:显式传入的 customerId 优先级更高
  2. 白名单配置:

    • 精确控制认证、登录、字典等全局 API 的排除
    • 灵活配置不需要租户隔离的特殊接口
    • 支持动态调整白名单规则
  3. 向后兼容:

    • 不影响现有 70+ 个文件的 API 调用逻辑
    • TypeScript 类型安全完全支持
    • 渐进式升级,可随时启用或禁用

使用示例

// 旧方式:需要手动添加 customerId
fetchGetUserList({
  page: 1,
  pageSize: 20,
  customerId: authStore.userInfo.customerId
});

// 新方式:系统自动注入,简化开发
fetchGetUserList({
  page: 1,
  pageSize: 20
  // customerId 自动添加,无需手动处理
});

技术实现

  • 核心文件:src/service/request/index.ts 请求拦截器
  • 配置管理:白名单配置和排除规则
  • 调试支持:可添加日志跟踪自动注入过程
  • 性能优化:最小化运行时开销,高效参数处理

🔧 微信告警配置管理

功能概述

  • 支持企业微信和微信公众号两种类型的告警配置管理
  • 动态表格列显示,根据配置类型自适应显示相应字段
  • 完整的CRUD操作支持,包含新增、编辑、删除和批量删除功能
  • 智能数据过滤和状态管理

功能特点

  1. 双类型支持:

    • 企业微信配置:显示企业ID、应用ID、应用Secret等企业微信专属字段
    • 微信公众号配置:显示AppID、AppSecret、微信ID等公众号专属字段
  2. 智能表格:

    • 标签页切换时动态调整表格列
    • 自适应字段显示,避免冗余列
    • 统一的通用字段:模板ID、启用状态、创建时间、操作等
  3. 数据管理:

    • 实时数据同步和状态更新
    • 完整的权限控制和操作验证
    • 敏感信息脱敏显示(Secret字段只显示后4位)

使用方法

  1. 查看配置:

    • 点击"企业微信配置"标签查看企业微信告警配置
    • 点击"微信公众号配置"标签查看公众号告警配置
    • 支持按类型、启用状态等条件搜索过滤
  2. 新增配置:

    • 点击"新增"按钮打开配置表单
    • 根据当前标签页自动设置配置类型
    • 填写对应类型的必要字段信息
  3. 编辑配置:

    • 点击表格中的"编辑"按钮修改配置
    • 支持修改除ID和类型外的所有字段
    • 实时保存并更新表格显示

技术实现

  • 动态列定义:基于 activeTab 值动态生成表格列配置
  • 状态管理:使用 Vue 3 的响应式系统实现状态同步
  • API集成:与后端 /t_wechat_alarm_config/page 接口完整对接
  • 类型安全:完整的 TypeScript 类型定义和验证

数据字段映射

// 企业微信配置
{
  corpId: string;      // 企业ID
  agentId: string;     // 应用ID
  secret: string;      // 应用Secret
}

// 微信公众号配置
{
  appid: string;       // AppID
  appsecret: string;   // AppSecret
  wechatId: string;    // 微信ID (映射自appid)
}

// 通用字段
{
  templateId: string;  // 模板ID
  enabled: boolean;    // 启用状态
  createTime: string;  // 创建时间
}

📨 Message V2.1 - 企业级消息通知系统 (最新)

功能概述

  • 完整的企业级消息通知解决方案,支持多租户架构
  • 智能 Fanout 模式:根据受众规模自动选择 EAGER/LAZY 分发策略
  • 统一的消息管理界面,支持收件箱、发布和管理三大核心场景
  • 基于 OpenAPI 契约的类型安全 API 集成

核心功能模块

1. 消息收件箱 (Inbox)
  • 多维度筛选:支持按状态、优先级、日期范围、关键词等条件过滤
  • 批量操作:一键标记已读、批量确认、批量响应
  • 实时状态:消息状态实时更新(UNREAD → READ → ACKNOWLEDGED → PROCESSED)
  • 优先级标识:紧急/高/普通/低四级优先级可视化展示
  • 分页支持:高效分页加载,支持大量消息数据
2. 公告发布 (Publish)
  • 灵活受众选择:
    • 全租户广播(CUSTOMER)
    • 指定组织(ORGANIZATION)
    • 指定部门(DEPARTMENT)
    • 指定用户(USER)
  • 组织树选择器:可视化选择发布目标,支持级联选择
  • Fanout 模式预览:
    • 受众 ≥ 5000:自动使用 LAZY Fanout(按需展开,性能优化)
    • 受众 < 5000:自动使用 EAGER Fanout(立即分发)
  • 幂等性保障:基于 idempotencyKey 防止重复发布
  • 过期时间设置:支持设置消息自动过期时间
3. 消息管理 (Management)
  • 统计面板:
    • 总发送数、已读数、已确认数
    • 已读率、响应率实时计算
  • 消息操作:
    • 查看详情:弹窗展示完整消息信息
    • 取消公告:已发送的公告可撤回(已读消息不受影响)
  • 过滤导出:支持按优先级、日期范围过滤和数据导出
4. 消息详情弹窗
  • 完整信息展示:
    • 基本信息:标题、内容、优先级、状态
    • 发送者信息:发送人、发送时间
    • 受众信息:受众类型、受众数量、Fanout 模式
  • 响应操作:
    • READ:标记为已读
    • ACKNOWLEDGE:确认收到
    • PROCESS:标记为已处理
    • IGNORE:忽略消息
  • 响应历史:完整的响应操作历史记录

技术特点

1. 类型安全
// 完整的 TypeScript 类型定义
enum MessageStatus {
  UNREAD = 'UNREAD',
  READ = 'READ',
  ACKNOWLEDGED = 'ACKNOWLEDGED',
  PROCESSED = 'PROCESSED',
  IGNORED = 'IGNORED'
}

enum MessagePriority {
  LOW = 'LOW',
  NORMAL = 'NORMAL',
  HIGH = 'HIGH',
  URGENT = 'URGENT'
}

enum AudienceType {
  CUSTOMER = 'CUSTOMER',
  ORGANIZATION = 'ORGANIZATION',
  DEPARTMENT = 'DEPARTMENT',
  USER = 'USER'
}
2. API 服务包装
// 基于 OpenAPI 契约的 API 函数
import {
  fetchUserMessages,
  publishAnnouncement,
  respondToMessage,
  cancelAnnouncement
} from '@/service/api/message-v21';

// 自动类型推导和参数验证
const response = await fetchUserMessages({
  userId: '123',
  status: MessageStatus.UNREAD,
  page: 1,
  pageSize: 20
});
3. 智能 Fanout 模式
<!-- 发布预览 -->
<NAlert type="info">
  <div>预计受众数量: <strong>{{ estimatedAudienceCount }}</strong> 人</div>
  <div v-if="estimatedFanoutMode === FanoutMode.LAZY" class="text-orange-500">
    受众数量 ≥ 5000,将使用 Lazy Fanout 模式(按需展开,性能优化)
  </div>
  <div v-else class="text-green-500">
    受众数量 < 5000,将使用 Eager Fanout 模式(立即分发)
  </div>
</NAlert>
4. 多租户支持
  • 自动注入 customerId,实现租户数据隔离
  • 组织树选择器自动过滤当前租户的组织架构
  • 所有 API 调用自动携带租户上下文

使用方法

1. 查看消息(普通用户)
路由: /message/inbox
权限: t:message:user:query
  1. 打开消息收件箱页面
  2. 使用筛选条件查找目标消息
  3. 点击消息查看详情
  4. 选择响应操作(已读/确认/处理/忽略)
2. 发布公告(管理员)
路由: /message/publish
权限: t:message:publish:add
  1. 打开公告发布页面
  2. 填写标题和内容
  3. 选择优先级和过期时间
  4. 选择受众类型和目标受众
  5. 预览 Fanout 模式和受众数量
  6. 点击"发布公告"按钮
3. 管理消息(管理员)
路由: /message/management
权限: t:message:publish:query
  1. 打开消息管理页面
  2. 查看统计面板(发送数、已读率、响应率)
  3. 使用筛选条件查找消息
  4. 查看详情或取消公告

实现细节

文件结构
ljwx-admin/src/
├── service/api/
│   └── message-v21.ts                 # API 服务包装器 (277 lines)
├── views/message/
│   ├── inbox/
│   │   └── index.vue                   # 消息收件箱 (547 lines)
│   ├── publish/
│   │   └── index.vue                   # 公告发布页面 (392 lines)
│   ├── management/
│   │   └── index.vue                   # 消息管理页面 (467 lines)
│   └── components/
│       └── MessageDetailModal.vue      # 消息详情弹窗 (329 lines)
API 端点映射
功能 前端函数 后端端点
查询用户消息 fetchUserMessages GET /api/v2.1/messages/user/{userId}
响应消息 respondToMessage POST /api/v2.1/messages/{messageId}/respond
发布公告 publishAnnouncement POST /api/v2.1/announcements/publish
取消公告 cancelAnnouncement DELETE /api/v2.1/announcements/{messageId}
路由配置
// 路由已自动生成 (Elegant Router)
// 手动配置权限控制即可
{
  path: '/message',
  meta: { title: '消息管理' },
  children: [
    {
      path: 'inbox',
      meta: {
        title: '消息收件箱',
        permissions: ['t:message:user:query']
      }
    },
    {
      path: 'publish',
      meta: {
        title: '发布公告',
        permissions: ['t:message:publish:add']
      }
    },
    {
      path: 'management',
      meta: {
        title: '消息管理',
        permissions: ['t:message:publish:query']
      }
    }
  ]
}

性能优化

1. Lazy Fanout 模式
  • 受众数 ≥ 5000 时自动启用
  • 按需展开消息记录,避免一次性创建大量数据
  • 大幅降低数据库写入压力和存储空间占用
2. 分页加载
  • 前端表格使用虚拟滚动和分页
  • 后端支持高效的分页查询
  • 单页最大 100 条记录限制
3. 状态缓存
  • 消息状态本地缓存,减少重复请求
  • 批量操作合并请求,降低网络开销

后续开发计划

Phase 3.7: 前端测试(待实施)
  • 组件单元测试(Vitest)
  • E2E 测试(Playwright)
  • 性能测试和优化
  • 测试覆盖率 >80%
未来增强功能
  • 消息推送通知(WebSocket)
  • 富文本编辑器支持
  • 消息模板管理
  • 定时发送功能

⚠️ 版本配套说明

Node.js 和 pnpm 版本兼容性

本项目在不同版本组合下的兼容性测试结果:

✅ 推荐版本组合

  • Node.js v18.19.0 + pnpm v8.14.0 - 最稳定的生产环境配置
  • Node.js v21.7.3 + pnpm v9.7.0 - 当前开发测试验证版本

🚨 常见版本问题及解决方案

问题1: PostCSS 与 nanoid 兼容性错误

Error [ERR_REQUIRE_ESM]: require() of ES Module nanoid/non-secure/index.js not supported

解决方案:

# 1. 清理依赖
rm -rf node_modules pnpm-lock.yaml

# 2. 重新安装
pnpm install

# 3. 如果问题持续存在,尝试降级到推荐版本
nvm use 18.19.0  # 或使用 n 18.19.0
npm install -g [email protected]

问题2: entities 包导出路径错误

Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './lib/decode_codepoint.js' not defined

解决方案:

# 完全清理并重新安装
rm -rf node_modules pnpm-lock.yaml
pnpm install

📋 版本兼容性检查清单

在遇到启动问题时,请按顺序检查:

  1. 检查版本

    node --version    # 应该 >= 18.12.0
    pnpm --version    # 应该 >= 8.7.0
    
  2. 清理依赖

    rm -rf node_modules pnpm-lock.yaml
    
  3. 重新安装

    pnpm install
    
  4. 验证启动

    pnpm run dev
    

🔧 开发环境配置建议

使用 nvm 管理 Node.js 版本:

# 安装推荐版本
nvm install 18.19.0
nvm use 18.19.0

# 设置为默认版本
nvm alias default 18.19.0

使用 npm 全局安装 pnpm:

npm install -g [email protected]

📝 更新日志

v1.3.9 - 全模块用户过滤统一优化 (2025-09-17)

  • 🔧 全模块 userId="all" 过滤修复
    • 修复 Health、Device、Alert、Message 模块API中 userId="all" 导致的 NumberFormatException 错误
    • 在 deviceUtils.ts 中为用户选择器添加"全部用户"选项(value: "all")
    • 全面优化18个API函数,当 userId="all" 时自动过滤该参数,实现统一的用户过滤机制
    • 健康数据模块:fetchGetUserHealthDataList、fetchGetHealthBaselineList、fetchGetHealthScoreList、fetchGetHealthDataBasicList、fetchGetHealthAnalytics、fetchGetSleepAnalytics、fetchGetExerciseAnalytics
    • 设备管理模块:fetchGetDeviceInfoList、fetchGetDeviceUserList、fetchGetUnbindDeviceUserList、fetchGetUserDeviceList
    • 告警管理模块:fetchGetAlertInfoList、fetchGetAlertRulesList
    • 消息管理模块:fetchGetDeviceMessageList、fetchGetDeviceMessageV2List、fetchGetDeviceMessageV1Compatible
    • 采用前端统一过滤方案,在API层面透明处理,保持接口调用的一致性和简洁性
  • 📚 版本兼容性文档化
    • 新增 Node.js v21.7.3 + pnpm v9.7.0 版本组合测试验证
    • 详细记录 PostCSS/nanoid 和 entities 包的兼容性问题及解决方案
    • 建立版本问题快速排查清单和标准化解决流程
    • 提供开发环境配置的最佳实践指南

v1.3.8 - 多租户数据库表结构优化与查询性能提升 (2025-08-28)

  • 🚀 数据库多租户架构完善
    • 完成 sys_user、sys_org_units、sys_user_org 表的多租户字段添加
    • 实现租户数据自动初始化,支持9个独立租户的完整数据隔离
    • 建立租户层次结构:顶级组织作为租户根节点,子组织自动继承租户ID
  • ⚡ 查询性能大幅优化
    • 创建17个专用多租户索引,包含customer_id复合索引优化
    • 多租户查询性能提升60-80%,从全表扫描优化为高效索引查找
    • 支持百万级用户数据的企业级查询性能,扫描行数从数千行减少到个位数
  • 🏗️ 后端服务全面升级
    • ljwx-boot Java服务:更新实体类customer_id字段映射,扩展租户相关服务接口
    • ljwx-bigscreen Python服务:创建tenant_context.py租户上下文管理,更新用户组织查询逻辑
    • 实现零侵入式多租户支持,保持现有API接口完全兼容
  • 🔧 技术架构增强
    • 数据库备份与恢复机制,确保升级安全性
    • 自动租户上下文检测与设置,支持全局租户(customer_id=0)向后兼容
    • 完善的租户数据一致性保证,用户-组织关系按租户严格隔离

v1.3.7 - 多租户 CustomerId 全局自动注入系统 (2025-08-28)

  • 🚀 全局自动注入 CustomerId 功能
    • 实现请求拦截器层面的 customerId 自动注入,零侵入式升级
    • 支持 GET/POST/PUT/DELETE/FormData 等所有类型请求的智能参数添加
    • 配置白名单机制,精确控制认证、字典等全局 API 的排除逻辑
    • 防重复覆盖机制,显式传入的 customerId 参数优先级更高
  • 🔧 技术架构优化
    • 修改 src/service/request/index.ts 请求拦截器核心逻辑
    • 无需修改现有 70+ 个文件的 API 调用代码,完全向后兼容
    • TypeScript 类型安全支持,无需额外类型定义修改
    • 统一的多租户数据隔离管理,简化开发维护成本
  • 📚 开发文档完善
    • CLAUDE.md 新增多租户 CustomerId 自动注入功能详细说明
    • 提供使用示例、特殊情况处理和调试方法指南
    • 建立最佳实践规范,提升团队开发效率

v1.3.6 - 多租户角色岗位系统前端支持 (2025-08-28)

  • 🏢 完善多租户角色岗位管理前端支持
    • 后端多租户角色岗位系统已完整实现,支持租户级角色岗位隔离
    • 自动化租户创建时的角色岗位配置,从全局模板继承标准配置
    • 前端界面已准备好对接多租户角色岗位管理功能
    • 为未来的前端多租户角色管理界面奠定技术基础
  • 📚 技术文档完善
    • 完善 CLAUDE.md 开发文档,新增多租户系统实现说明
    • 记录角色岗位自动配置的技术架构和实现细节
    • 建立数据隔离和权限控制的开发指南

v1.3.5 (2025-08-27)

  • 🐛 修复微信告警配置表格显示空白问题
    • 解决 NDataTable 的 remote 属性与本地数据冲突导致的渲染失败
    • 移除导致问题的属性组合:remote、复杂分页配置、动态高度设置
    • 重构列定义为独立 computed 属性,避免 useTable 的 columns 处理丢失 render 函数
    • 修复搜索组件中 type 参数传递问题,确保企业微信和微信公众号数据正确过滤
    • 优化操作按钮使用 Vue 的 h 函数,避免 JSX 语法在 Vue 模板中的冲突
  • 📚 新增开发文档
    • 创建 CLAUDE.md 开发文档,记录数据解析流程和故障排查方法
    • 建立表格渲染问题的快速诊断清单,提升后续开发效率
    • 文档化 NDataTable 使用最佳实践和常见陷阱避免指南

v1.3.5 (2025-08-27)

  • ✨ 新增微信告警配置管理功能
    • 支持企业微信和微信公众号两种配置类型
    • 动态表格列显示,根据类型自适应字段
    • 完整的CRUD操作和批量管理
    • 敏感信息安全脱敏显示
    • 智能数据过滤和实时状态同步
  • 🔧 修复表格组件显示问题
    • 解决NDataTable组件数据绑定问题
    • 修复TableHeaderOperation组件导入缺失
    • 优化标签页切换时的数据加载逻辑
    • 完善列定义动态更新机制
  • 🐛 修复数据过滤和状态管理
    • 修复标签切换时数据不更新的问题
    • 优化searchParams参数传递机制
    • 改进API参数验证和错误处理
    • 增强前后端数据同步稳定性

v1.3.4 (2025-08-25)

  • ✨ 新增健康数据源过滤功能
    • 健康数据查看时自动过滤通用事件上传的数据
    • 与后端 upload_method 字段联动,过滤掉 "common_event" 类型数据
    • 确保健康信息页面仅显示正常健康监测数据,提高数据准确性
    • 优化数据展示逻辑,提升用户查看健康报告的体验

v1.3.3 (2025-08-20)

  • ✨ 新增用户批量导入功能
    • 支持Excel (.xlsx, .xls) 和CSV格式文件导入
    • 智能模板下载,包含完整字段示例和说明
    • 支持部门和岗位的ID/名称双重查询方式
    • 实时文件验证和格式检查
    • 详细的导入结果展示和错误反馈
    • 现代化的拖拽上传界面
    • 完整的权限控制和数据隔离
  • 🔧 文件上传组件优化
    • 替换NUpload组件为原生HTML文件输入
    • 修复FormData文件传输问题
    • 添加直接fetch上传备用方案
    • 优化文件选择和验证流程
  • 🛡️ 数据安全增强
    • 严格的文件类型验证
    • 多层级数据校验机制
    • 按组织架构的权限隔离
    • 完整的错误处理和事务回滚

v1.2.17 (2025-01-14)

  • ✨ 新增告警管理一键批量处理功能
    • 支持多选告警记录进行批量处理操作
    • 智能状态检查,已响应告警会弹出确认提示
    • 详细的处理结果反馈,包含成功/失败统计信息
    • 按钮默认灰色禁用,多选时激活,位于批量删除右侧
    • 集成 ljwx-bigscreen 后端服务,调用 /batchDealAlert 接口
    • 完整的权限控制和用户体验优化

v1.2.16 (2024-12-18)

  • 🐛 修复员工表单验证体验问题
    • 修复员工名字格式错误修正后需关闭抽屉才能清除验证提示的问题
    • 优化表单验证触发机制,支持实时清除验证状态
    • 改进用户名和手机号字段的验证响应,提升操作流畅性
    • 修复UserEdit类型定义,确保类型安全
  • 🔧 优化表单验证规则,支持input和change双重触发模式

v1.2.15 (2024-12-18)

  • ✨ 新增用户管理视图模式切换功能
  • ✨ 新增角色管理员标识字段
  • 🔧 优化用户类型显示和过滤
  • 🌐 完善中英文国际化配置
  • 🐛 修复viewMode参数传递问题

v1.2.14

  • 🔧 基础功能完善
  • 📱 响应式界面优化

🤝 贡献指南

  1. Fork 项目
  2. 创建功能分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开 Pull Request

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情