## 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]>
LjwxAdmin 后台管理系统
项目简介
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
项目启动
- 安装依赖
pnpm i
由于本项目采用了 pnpm monorepo 的管理方式,因此请不要使用 npm 或 yarn 来安装依赖。
- 启动项目,修改
.env.test中VITE_SERVICE_BASE_URL对应的后端地址
pnpm dev
构建项目
修改.env.prod中VITE_SERVICE_BASE_URL对应的后端地址
pnpm build
Git 提交规范
本项目已内置 commit 命令,您可以通过执行 pnpm commit 来生成符合 Conventional Commits 规范的提交信息。在提交PR时,请务必使用 commit 命令来创建提交信息,以确保信息的规范性。
示例图片
![]() |
![]() |
|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
浏览器支持
推荐使用最新版的 Chrome 浏览器进行开发,以获得更好的体验。
![]() |
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|---|
| 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类型定义,移除不必要的字段
使用体验
- 输入验证:用户输入时立即显示格式错误提示
- 实时清除:修正输入后验证错误自动消失
- 无缝操作:提升表单操作的流畅性和用户体验
告警时序统计图
- 主页面饼图已替换为告警时序统计图
- 使用真实告警数据,自动根据数据实际时间范围生成时序图
- 支持中文显示:心率、血压、体温等告警类型,待处理、已响应、已解决等状态
- 按照alertType(折线图)、severityLevel(柱状图)维度分组展示
- 智能时间范围:根据数据跨度自动调整显示7-30天时间窗口
- 时间范围标注:标题显示数据总量和时间跨度(如:1/25-1/25)
- 支持交叉分析和多维度数据对比
- 无数据时显示友好提示信息
消息时序统计图
- 新增消息时序分析功能,自动根据数据实际时间范围生成图表
- 支持中文显示:系统消息、告警消息、通知消息等类型,已发送、已送达、已读等状态
- 按照messageType(折线图)、messageStatus(面积图)维度进行时序统计
- 智能时间范围:根据sentTime数据跨度自动调整显示窗口
- 时间范围标注:显示消息总量和时间跨度信息
- 支持多种消息类型的独立统计和状态追踪
🔄 用户管理 - 视图模式切换 (最新)
功能概述
- 支持全部用户、员工、管理员三种视图模式切换
- 根据选择的模式动态过滤显示对应用户类型
- 在全部用户视图中显示用户类型标识(管理员/员工)
使用方法
-
在用户管理页面顶部选择视图模式:
- 全部用户:显示所有用户,包含类型标识列
- 员工:仅显示普通员工用户
- 管理员:仅显示管理员用户
-
视图模式参数说明:
viewMode: 'all' | 'employee' | 'admin' -
API调用示例:
// 根据视图模式获取用户列表 fetchGetUserListByViewMode({ ...params, viewMode: 'employee' // 仅获取员工 })
技术实现
- 前端组件:
UserViewModeSelector- 视图模式选择器 - API函数:
fetchGetUserListByViewMode- 支持viewMode参数 - 类型标识:使用
NTag组件显示用户类型(管理员/员工)
👨💼 角色管理 - 管理员标识 (最新)
功能概述
- 角色新增/编辑时支持设置是否为管理员角色
- 角色列表显示管理员类型标识
- 与后端数据库
is_admin字段同步
使用方法
-
新增角色:
- 在角色信息表单中选择"普通角色"或"管理员角色"
- 系统自动将
isAdmin字段设置为 0 或 1
-
编辑角色:
- 可以修改现有角色的管理员属性
- 保存后立即生效
-
角色列表:
- 显示"是否管理员"列
- 管理员角色显示为红色标签
- 普通角色显示为绿色标签
数据库字段
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或名称两种查询方式
- 详细的导入结果展示,包含成功/失败统计和错误详情
使用方法
-
下载模板:
- 点击"下载导入模板"获取标准CSV模板
- 模板包含字段:姓名、性别、年龄、工龄、手机号码、部门、岗位、设备序列号、备注
- 提供完整的示例数据和字段说明
-
准备数据:
- 按模板格式填写用户信息
- 部门和岗位支持两种输入方式:
- ID方式:直接填写部门/岗位的数字ID(如:11, 1)
- 名称方式:填写完整的部门/岗位名称(如:技术部、软件工程师)
-
上传导入:
- 拖拽或点击选择Excel/CSV文件
- 系统自动验证文件格式和数据完整性
- 显示详细的导入结果和错误信息
数据验证规则
- 必填字段:姓名、性别、年龄、工龄、手机号码、部门、岗位
- 格式验证:
- 手机号:11位数字,1开头
- 年龄:0-120范围
- 工龄:非负数
- 性别:只能是"男"或"女"
- 唯一性检查:手机号不能重复
- 权限验证:只能在授权的组织范围内导入
自动化处理
- 用户名生成:基于手机号后6位自动生成(格式:user+6位数字)
- 默认密码:统一设置为"123456"(MD5加密存储)
- 邮箱设置:自动生成格式为"手机号@example.com"
- 组织关系:自动建立用户与部门、岗位的关联关系
技术实现
- 文件解析:集成Apache POI支持Excel解析,自定义CSV解析器
- 数据验证:多层级验证机制,确保数据完整性和格式正确性
- 权限控制:基于Sa-Token的导入权限验证和组织数据隔离
- 错误处理:详细的错误报告和事务回滚机制
🚨 告警管理 - 一键批量处理 (最新)
功能概述
- 支持批量选择和处理多条告警记录
- 智能状态检查,自动识别已处理告警并提示用户
- 与 ljwx-bigscreen 服务集成,调用后端批量处理接口
- 详细的操作结果反馈,包含成功/失败数量统计
使用方法
-
选择告警记录:
- 在告警管理页面选择多条(≥2条)告警记录
- "一键批量处理"按钮将从灰色禁用状态变为可点击的绿色按钮
-
批量处理操作:
- 点击"一键批量处理"按钮
- 系统自动检查选中告警的状态
- 如包含已响应告警,会弹出确认对话框供用户选择
-
操作结果:
- 显示详细处理结果:成功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 调用代码
- 支持多租户数据隔离的统一管理和自动化处理
技术特点
-
智能请求处理:
- GET 请求:自动添加到查询参数
params - POST/PUT/DELETE 请求:自动添加到请求体
data - FormData 请求:作为表单字段自动添加
- 防重复机制:显式传入的 customerId 优先级更高
- GET 请求:自动添加到查询参数
-
白名单配置:
- 精确控制认证、登录、字典等全局 API 的排除
- 灵活配置不需要租户隔离的特殊接口
- 支持动态调整白名单规则
-
向后兼容:
- 不影响现有 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操作支持,包含新增、编辑、删除和批量删除功能
- 智能数据过滤和状态管理
功能特点
-
双类型支持:
- 企业微信配置:显示企业ID、应用ID、应用Secret等企业微信专属字段
- 微信公众号配置:显示AppID、AppSecret、微信ID等公众号专属字段
-
智能表格:
- 标签页切换时动态调整表格列
- 自适应字段显示,避免冗余列
- 统一的通用字段:模板ID、启用状态、创建时间、操作等
-
数据管理:
- 实时数据同步和状态更新
- 完整的权限控制和操作验证
- 敏感信息脱敏显示(Secret字段只显示后4位)
使用方法
-
查看配置:
- 点击"企业微信配置"标签查看企业微信告警配置
- 点击"微信公众号配置"标签查看公众号告警配置
- 支持按类型、启用状态等条件搜索过滤
-
新增配置:
- 点击"新增"按钮打开配置表单
- 根据当前标签页自动设置配置类型
- 填写对应类型的必要字段信息
-
编辑配置:
- 点击表格中的"编辑"按钮修改配置
- 支持修改除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
- 打开消息收件箱页面
- 使用筛选条件查找目标消息
- 点击消息查看详情
- 选择响应操作(已读/确认/处理/忽略)
2. 发布公告(管理员)
路由: /message/publish
权限: t:message:publish:add
- 打开公告发布页面
- 填写标题和内容
- 选择优先级和过期时间
- 选择受众类型和目标受众
- 预览 Fanout 模式和受众数量
- 点击"发布公告"按钮
3. 管理消息(管理员)
路由: /message/management
权限: t:message:publish:query
- 打开消息管理页面
- 查看统计面板(发送数、已读率、响应率)
- 使用筛选条件查找消息
- 查看详情或取消公告
实现细节
文件结构
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
📋 版本兼容性检查清单
在遇到启动问题时,请按顺序检查:
-
检查版本
node --version # 应该 >= 18.12.0 pnpm --version # 应该 >= 8.7.0 -
清理依赖
rm -rf node_modules pnpm-lock.yaml -
重新安装
pnpm install -
验证启动
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层面透明处理,保持接口调用的一致性和简洁性
- 修复 Health、Device、Alert、Message 模块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 模板中的冲突
- 解决 NDataTable 的
- 📚 新增开发文档
- 创建 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
- 🔧 基础功能完善
- 📱 响应式界面优化
🤝 贡献指南
- Fork 项目
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
📄 许可证
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情



















