Files
java-template/ljwx-boot
2025-11-19 20:08:13 +08:00
..
2025-08-14 08:11:03 +08:00
2025-11-19 20:08:13 +08:00
2025-11-19 20:08:13 +08:00
2025-11-19 20:08:13 +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-27 15:56:11 +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-08-14 08:11:03 +08:00
2025-08-14 08:11:03 +08:00

LjwxBoot 后台管理系统

SpringBoot JDK Version License
Author Copyright

项目简介

LjwxBoot 是一款现代化的后台管理系统脚手架,它基于 Spring Boot 3 框架进行开发。也得益于前端 @SoybeanAdmin 1.0.0 发版后,精致的用户界面和一致的编码,所以得此顺势完善此项目。 在市面上虽然存在众多出色的 Java 后端管理系统框架,但还是决定重复再造一个轮子。

🚀 最新更新

v1.4.0 - 统一告警与消息机制智能优化系统 (2025-08-30)

🤖 AI驱动的企业级智能告警处理系统

  • 统一告警架构: 全新设计的统一告警处理系统,集成AI分析、智能优先级和实时监控

    • 性能提升:告警处理时间从200ms优化至5ms,提升40倍处理效率
    • 准确率提升:AI分析引擎将误报率降低至8%以下,置信度评分机制
    • 并发能力:支持1000+并发告警处理,毫秒级响应时间
  • AI智能分析引擎:

    // 多维度AI分析能力
    SmartAlertEngine → MLAlertAnalyzer (机器学习异常检测)
                    → ContextAnalyzer (环境上下文分析)  
                    → PatternRecognizer (历史模式识别)
    
    • 机器学习异常检测: 基于孤立森林算法的智能异常识别
    • 上下文分析: 时间、地理位置、环境因素综合评估
    • 模式识别: 历史数据趋势分析和异常模式匹配
  • 智能优先级计算系统:

    • 多因子算法: 基础优先级 × 组织层级 × 时间因子 × 用户风险 × 设备历史 × 地理位置
    • 动态权重: 根据告警类型和业务场景自动调整权重系数
    • 升级策略: 智能升级延迟计算,确保重要告警及时处理

📊 实时监控与优化系统

  • 性能监控: AlertProcessingMonitor 实时监控系统性能指标
    • 处理时间监控、错误率统计、吞吐量分析、资源使用率
    • 瓶颈识别:数据库查询、内存使用、CPU负载、网络带宽
  • 智能优化建议: IntelligentOptimizer AI驱动的系统优化
    • 规则优化建议:基于误报率分析的规则阈值调整建议
    • 性能优化建议:数据库索引、缓存策略、线程池配置优化
    • 容量规划建议:基于负载预测的扩容建议和资源配置
  • 预测分析: AlertTrendPredictor 告警趋势预测
    • 负载预测:未来7-30天系统负载趋势预测
    • 类型分布预测:不同告警类型的发生概率预测
    • 瓶颈预测:潜在性能瓶颈和故障风险预警

🏗️ 基于闭包表的高性能架构

  • 毫秒级查询优化: 基于 sys_org_closure 闭包表的组织架构查询优化
    <!-- 优化后的SQL查询,支持复杂层级关系毫秒级查询 -->
    <select id="getNotificationHierarchy" resultMap="OrgHierarchyInfoResultMap">
        SELECT DISTINCT u.id, u.real_name, u.phone, u.email, uo.principal, 
               o.id as org_id, o.name as org_name, o.level, c.depth
        FROM sys_org_closure c
        INNER JOIN sys_org_units o ON c.ancestor_id = o.id
        INNER JOIN sys_user_org uo ON c.ancestor_id = uo.org_id
        INNER JOIN sys_user u ON uo.user_id = u.id
        WHERE c.descendant_id = ? AND c.customer_id = ?
        ORDER BY c.depth ASC, uo.principal DESC, u.id ASC
    </select>
    
  • 智能消息队列: Redis优先级队列 + 去重机制 + 批量处理
  • 分发策略: 基于组织层级的智能通知分发,支持升级策略

🎯 企业级功能特性

  • 完整REST API: 提供完整的告警处理、监控、优化API接口
    • /api/v1/alert/process - 单个告警智能处理
    • /api/v1/alert/process/batch - 批量告警处理
    • /api/v1/alert/monitor/performance - 实时性能监控
    • /api/v1/alert/optimize/recommendations - AI优化建议
  • 性能测试: 内置性能测试组件,支持单个、批量、并发测试
  • 健康检查: 完整的系统健康状态检查和故障诊断

📈 系统架构升级

统一告警处理流程:
告警输入 → AI智能分析 → 优先级计算 → 智能分发
    ↓
闭包表查询 → 通知层级构建 → 消息队列 → 多渠道推送
    ↓
实时监控 ← 性能分析 ← 优化建议 ← 预测分析

相关文件:

  • 核心系统: UnifiedAlertSystem.java - 统一告警处理核心
  • AI分析: SmartAlertEngine.java + ML组件 - 智能分析引擎
  • 监控系统: AlertProcessingMonitor.java + MetricsCollector.java
  • 优化系统: IntelligentOptimizer.java + AlertTrendPredictor.java
  • API接口: UnifiedAlertController.java - 完整REST API
  • 性能测试: AlertSystemPerformanceTest.java - 性能测试套件
  • 数据库: SysOrgClosureMapper.xml - 优化SQL查询

v1.3.8 - 多租户数据隔离安全修复 (2025-08-29)

🔒 多租户数据安全隔离修复

  • 安全漏洞修复: 修复系统角色和岗位管理的多租户数据泄露漏洞

    • 修复前:租户可以通过API访问其他租户的角色和岗位数据
    • 修复后:严格按customerId进行数据隔离,确保租户只能访问自己的数据
  • API接口安全加固:

    • sys_role/all_roles - 添加customerId过滤,从32个角色降至租户专属4个
    • sys_position/all_positions - 添加customerId过滤,从10个岗位降至租户专属6个
    • sys_role/page 和 sys_position/page - 分页查询同步加固多租户过滤
  • 技术实现细节:

    // 角色查询添加多租户过滤
    .eq(ObjectUtils.isNotEmpty(customerId), SysRole::getCustomerId, customerId)
    
    // 岗位查询添加多租户过滤  
    .eq(ObjectUtils.isNotEmpty(orgId), SysPosition::getOrgId, orgId)
    .eq(ObjectUtils.isNotEmpty(customerId), SysPosition::getCustomerId, customerId)
    
  • 前端自动注入: 前端请求拦截器自动注入customerId参数,无需手动添加

  • 数据库验证: API返回数据与数据库查询结果完全匹配,确保过滤正确性

🎨 Logo管理系统优化

  • 动态Logo支持: SystemLogo组件支持根据用户customerId动态加载自定义logo
  • 全局Logo替换: 上传的logo自动替换登录页面和主界面的系统logo
  • 多租户Logo隔离: 每个租户的logo完全独立,支持个性化品牌展示

v1.3.7 - 多租户客户配置管理功能完整实现 (2025-08-28)

🏢 多租户客户配置管理系统

  • 客户配置新增: 完整的客户配置创建功能,支持多字段配置

    • 客户名称、描述、上传方式(wifi/bluetooth)、许可证配置
    • 断点续传、重试策略、缓存配置等高级参数
    • 自动设置必需字段默认值,解决数据库约束问题
  • 同步组织创建: 客户配置保存成功后自动创建对应组织机构

    // 客户配置保存成功 → 创建对应的SysOrgUnits记录
    SysOrgUnits orgUnit = new SysOrgUnits();
    orgUnit.setId(entity.getId());           // 与客户配置ID保持一致
    orgUnit.setName(entity.getCustomerName()); // 组织名称使用客户名称
    orgUnit.setCustomerId(entity.getId());    // 设置为自身租户ID
    
  • 智能配置同步: 通过事件监听器自动同步相关配置

    • 接口配置(t_interface)、健康数据配置(t_health_data_config)
    • 告警规则(t_alert_rules)、角色(sys_role)、岗位(sys_position)
    • 防循环创建:监听器检查配置是否已存在,避免重复创建

🔧 技术架构优化

  • 字段映射处理: 前端supportLicense ↔ 后端isSupportLicense字段映射
  • 数据库约束修复:
    • 解决license_key字段无默认值错误
    • 自动设置customer_name、customer_id等必需字段默认值
  • 防循环依赖: OrgUnitsChangeListener增加存在性检查
    // 检查是否已存在配置,避免循环创建
    TCustomerConfig existingConfig = customerConfigService.getById(o.getId());
    if (existingConfig != null) {
        log.info("CustomerConfig already exists for orgId={}, skipping clone", o.getId());
        return;
    }
    

🎯 完整业务流程

客户配置创建 → TCustomerConfigServiceImpl.save()
       ↓
   自动创建SysOrgUnits → 触发SysOrgUnitsChangeEvent.CREATE
       ↓
   OrgUnitsChangeListener → 同步复制相关配置
       ↓
   ✅ 多租户环境完整初始化

相关文件:

  • 实体: TCustomerConfig.java - 添加字段映射注解
  • DTO: TCustomerConfigAddDTO.java - 完善新增字段
  • 服务: TCustomerConfigServiceImpl.java - 同步创建组织逻辑
  • 门面: TCustomerConfigFacadeImpl.java - 字段映射处理
  • 监听器: OrgUnitsChangeListener.java - 防循环创建优化

v1.3.6 - 多租户角色岗位系统完整实现 (2025-08-28)

🏢 企业级多租户角色岗位管理系统

  • 智能角色继承: 新建租户时自动从全局角色模板(customerId=0)复制标准角色配置
    • 全局角色:4个标准角色(超级管理员、系统管理员等)
    • 租户角色:每个租户独立拥有4个角色副本,支持个性化定制
  • 岗位自动配置: 租户创建时自动配置标准岗位体系
    • 全局岗位:6个标准岗位(技术总监、产品经理、开发工程师、测试工程师、运维工程师、业务专员)
    • 租户岗位:每个租户独立岗位配置,支持权重排序和灵活管理
  • 数据隔离保障: 严格的多租户数据隔离机制
    • 角色数据:sys_role.customer_id 字段实现租户级角色隔离
    • 岗位数据:sys_position.customer_id 字段实现租户级岗位隔离
    • 自动清理:删除租户时级联清理相关角色岗位数据

🔄 事件驱动的自动化管理

  • OrgUnitsChangeListener 增强: 组织变更事件监听器完整重构
    // 新增租户时自动执行
    cloneRoles(orgUnit);      // 复制全局角色到新租户
    clonePositions(orgUnit);  // 复制全局岗位到新租户
    
    // 删除租户时自动清理
    roleService.lambdaUpdate().eq(SysRole::getCustomerId, orgUnit.getId())
              .set(SysRole::getDeleted, 1).update();
    positionService.lambdaUpdate().eq(SysPosition::getCustomerId, orgUnit.getId())
                  .set(SysPosition::getDeleted, 1).update();
    
  • 批量数据同步: 为6个现有租户完成历史数据同步
    • 角色同步:24个租户角色记录(6租户 × 4角色)
    • 岗位同步:36个租户岗位记录(6租户 × 6岗位)

🛠️ 数据库架构优化

  • 索引性能优化: 新增多租户查询索引
    CREATE INDEX idx_sys_role_customer_id ON sys_role(customer_id);
    CREATE INDEX idx_sys_role_customer_status ON sys_role(customer_id, status);
    CREATE INDEX idx_sys_position_customer_id ON sys_position(customer_id);
    CREATE INDEX idx_sys_position_customer_status ON sys_position(customer_id, status);
    
  • 完整迁移脚本: 提供 database-migration.sql 完整迁移方案
  • 字段名标准化: 修复监听器中的字段名称不一致问题

📊 最终数据分布

├── 全局角色配置: 4个 (customer_id=0) 
├── 租户角色数据: 6个租户 × 4个角色 = 24个
├── 全局岗位配置: 6个 (customer_id=0)
└── 租户岗位数据: 6个租户 × 6个岗位 = 36个

🎯 技术架构亮点

  • 事件驱动: Spring Event 机制实现组织变更自动响应
  • 模板模式: 全局配置作为模板,租户数据继承并独立管理
  • 数据一致性: 事务保证多表数据同步的原子性
  • 扩展性: 支持任意数量租户的角色岗位独立管理

相关文件:

  • 实体: SysRole.java - 添加customerId多租户支持
  • 监听器: OrgUnitsChangeListener.java - 角色岗位自动管理逻辑
  • 迁移脚本: database-migration.sql - 完整数据库迁移方案
  • 文档: ljwx-admin/CLAUDE.md - 详细实现文档和故障排查指南

v1.3.5 - 微信告警配置管理功能完整实现 (2025-08-27)

🚨 企业微信告警配置管理系统

  • 配置管理界面: 完整的CRUD操作支持,包括企业微信和公众号微信两种类型
  • 表格功能增强: 支持分页、搜索、排序、批量操作
  • 数据验证: 前后端完整的数据验证机制
  • 权限控制: 基于多租户的权限隔离

v1.3.4 - 健康数据源区分与查询优化 (2025-08-25)

🎯 健康数据源智能识别系统

  • 数据源标识: 为健康数据添加 upload_method 字段区分不同数据来源
    • 正常健康监测数据:upload_method = "wifi" 或 "bluetooth"
    • 通用事件健康数据:upload_method = "common_event"
  • 查询过滤优化: 健康数据查询接口自动过滤通用事件数据
    • 前端健康信息展示仅显示正常健康监测数据
    • 确保健康数据分析的准确性和一致性
  • 数据库增强: 扩展 t_user_health_data.upload_method 枚举类型
    • 从 ('wifi','bluetooth') 扩展为 ('wifi','bluetooth','common_event')

🔧 后端服务优化

  • 智能查询: TUserHealthDataServiceImpl 新增过滤条件
    .ne(TUserHealthData::getUploadMethod, "common_event")
    
  • 实体模型: 健康数据实体类新增 uploadMethod 字段支持
  • 数据完整性: 确保前端查询结果的数据源一致性

🏥 集成ljwx-bigscreen支持

  • 模型同步: Flask SQLAlchemy模型支持新的枚举值
  • 调试增强: 添加详细的健康数据解析调试信息
  • 兼容性: 支持嵌套和平面两种健康数据结构格式

技术实现架构:

手表端数据上传 → 标识数据来源(upload_method) → 数据库存储
    ↓
后端查询服务 → 过滤事件数据 → 前端健康展示
    ↓
数据分析准确 ← 源数据区分 ← 智能识别系统

相关文件:

  • 数据库: t_user_health_data 表结构扩展
  • 实体: TUserHealthData.java - 添加uploadMethod字段
  • 服务: TUserHealthDataServiceImpl.java - 查询过滤逻辑
  • 模型: ljwx-bigscreen/models.py - 枚举字段扩展

v1.3.3 - 用户批量导入功能与数据处理优化 (2025-08-20)

📥 用户批量导入系统

  • Excel/CSV支持: 支持 .xlsx、.xls 和 .csv 多种文件格式导入
  • 智能模板: 提供标准化导入模板下载,包含完整字段示例
    • 字段包含:姓名、性别、年龄、工龄、手机号码、部门、岗位、设备序列号、备注
    • 自动生成用户名(基于手机号后6位)和默认密码(123456)
  • 双重查询: 支持ID和名称两种方式查找部门和岗位
    • 数字输入:按ID查询(如:11, 1)
    • 文本输入:按名称查询(如:技术部、软件工程师)

🔧 数据处理引擎

  • Apache POI集成: 完整的Excel文件解析支持
  • CSV兼容性: 自定义CSV解析器,支持引号转义和字段分隔
  • 数据验证: 多层级数据校验机制
    • 文件格式验证、必填字段检查、数据类型验证
    • 手机号格式校验、年龄工龄范围检查
  • 批量处理: 支持大批量用户数据导入,自动建立组织关系

🛡️ 错误处理与安全

  • 详细错误报告: 按行显示导入失败原因和具体数据
  • 事务安全: 导入过程中的数据完整性保护
  • 权限控制: 基于Sa-Token的导入权限验证
  • 数据隔离: 严格按照组织架构限制数据导入范围

📊 前端交互优化

  • 拖拽上传: 现代化的文件选择和上传界面
  • 实时反馈: 导入过程状态显示和进度条
  • 结果展示: 清晰的成功/失败统计和错误详情
  • 响应式设计: 完美适配移动端和桌面端操作

技术实现架构:

前端上传 → FormData处理 → 后端解析 → 数据验证 
    ↓
组织查询 → 用户创建 → 关系建立 → 结果返回
    ↓
成功统计 ← 失败详情 ← 错误处理 ← 事务回滚

相关文件:

  • 前端:user-page-table.vue - 批量导入界面
  • 后端:SysUserController.java - 导入API端点
  • 服务:SysUserServiceImpl.java - 核心导入逻辑
  • 依赖:pom.xml - Apache POI Maven配置

v1.0.12 - 超级管理员权限修复与关于页面更新 (2025-08-18)

👑 超级管理员权限增强

  • 超级管理员识别: 新增 isSuperAdmin() 方法,通过用户名识别admin超级管理员
    • 基于用户名"admin"进行判断(大小写不敏感)
    • 区分超级管理员与普通部门管理员的权限级别

🔐 职位管理权限修复

  • 全数据访问: 超级管理员可通过 orgId=0 查看所有职位数据
    • orgId=0:不设置过滤条件,返回系统所有职位
    • orgId=具体值:按指定组织ID过滤职位数据
    • 解决了超级管理员权限受限的问题

📖 关于页面完善

  • 系统信息更新: 更新项目描述为准确的IoT健康监测管理系统定位
  • 技术栈展示: 详细展示前后端技术栈信息和版本
  • 功能特性: 新增系统核心功能模块展示
    • 智能设备监测、健康数据分析、告警管理
    • 多租户架构、大屏可视化、移动端支持

🎯 权限层级优化

  • 三级权限体系:
    • 超级管理员(admin):全系统数据访问权限
    • 普通管理员:基于部门层级的数据访问权限
    • 非管理员用户:受限的功能访问权限

v1.0.11 - 组织架构权限优化与租户部门区分 (2025-08-18)

🏢 租户与部门层级权限管理

  • 智能权限区分: 实现租户与部门的严格权限隔离
    • 超级管理员:可创建和管理租户(顶级组织)
    • 部门管理员:只能在所属租户下创建和管理部门
    • 自动权限检查:防止越权操作和数据泄露

🔐 前端UI权限适配

  • 动态表单字段: 根据用户权限动态显示表单标签
    • 超级管理员:显示"租户名称"、"租户编码"等租户字段
    • 部门管理员:显示"部门名称"、"部门编码"等部门字段
  • 按钮权限控制: 新增按钮仅对有权限的用户可见
  • 自动层级设置: 非管理员用户新建部门时自动设置正确的父级关系

🛡️ 后端安全加固

  • API层权限校验: 控制器级别的租户创建权限检查
  • 数据库约束: 通过 parentId 和 ancestors 字段确保数据完整性
  • 用户身份验证: 集成 SaToken 进行细粒度权限控制

📋 部门管理功能增强

  • 层级查询优化: 使用 FIND_IN_SET 支持复杂的部门层级查询
  • 设备绑定过滤: 设备管理界面只显示当前部门管辖范围内的非管理员用户设备
  • 健康数据隔离: 健康数据查询严格按照部门权限进行数据隔离

v1.0.10 - 健康数据配置服务优化与API修复 (2025-08-18)

🔧 健康数据配置服务架构重构

  • 新增专用服务方法: 为 t_health_data_config 表创建专门的查询服务
    • getEnabledConfigsByOrgId(orgId): 根据部门ID查询启用的健康数据配置
    • getBaseConfigsByOrgId(orgId): 查询基础健康特征,自动过滤高级功能字段
    • 支持按 weight 权重排序,优化数据展示顺序

🎯 基础特征过滤优化

  • 智能字段过滤: 基础健康特征自动排除以下高级功能:
    排除字段: location, wear, ecg, exercise_daily, 
             exercise_week, scientific_sleep, work_out
    
  • 层级数据隔离: 所有配置查询自动应用部门层级权限
  • 统一调用接口: 替换原有直接数据库查询,使用标准化服务方法

🚀 健康特征API完善

  • 新增健康特征控制器: /health/feature/* 端点支持
    • /health/feature/base: 获取基础健康特征列表
    • /health/feature/full: 获取全量健康特征列表
    • /health/feature/mapping: 获取特征映射关系
  • 前端兼容性修复: 解决 userId=all 参数处理问题
  • 参数优化: 后端支持可选 userId 参数,提升API灵活性

📊 数据服务整合

  • 统一配置查询: ITUserHealthDataService 集成新的配置服务
  • 性能优化: 减少重复查询,提升数据获取效率
  • 权限一致性: 确保健康数据与配置权限完全对齐

技术实现架构:

健康数据配置流程:
orgId → getTopLevelDeptIdByOrgId() → 顶级部门ID 
     → getBaseConfigsByOrgId() → 过滤后的配置列表
     → 前端特征选择器 → 用户数据展示

v1.0.9 - 分级部门管理权限系统 (2025-08-18)

🏢 部门层级权限控制架构

  • 通用方法: 创建 ISysOrgUnitsService.getTopLevelDeptIdByOrgId() 通用方法
    • 解析 sys_org_units.ancestors 字段(如:"0,1955920989166800898,1955921028870082561")
    • 返回最左边第一个非0数字作为顶级部门ID
    • 支持任意层级部门查找顶级部门

🔐 岗位管理权限分级控制

  • 分级权限控制: 基于部门层级的岗位管理权限

    • 顶级部门管理员: 查看/编辑所有岗位,可使用前端orgId参数
    • 下级部门管理员: 查看全局岗位+顶级部门岗位,不能编辑
  • 数据过滤机制: 基于 orgId 和部门层级实现数据隔离

    • 全局岗位: orgId = 0,所有管理员可见
    • 部门岗位: orgId = 顶级部门ID,按权限过滤显示
    • 智能过滤: 下级部门管理员忽略前端传参,自动基于权限过滤

📊 健康数据配置分级管理

  • 配置隔离: 根据 departmentInfo 查询顶级部门ID

    • 示例:departmentInfo=1940374479725170690 → 解析ancestors → 顶级部门ID 1939964806110937090
    • 从 t_health_data_config 表按 customer_id=顶级部门ID 过滤配置
  • 数据一致性: 确保健康数据显示列与部门权限匹配

    • 不同级别管理员看到不同的数据配置
    • 自动应用对应部门的数据显示规则

权限判断标准:

  • 管理员身份: sys_role.is_admin = 1
  • 部门层级: 通过 ancestors 字段解析层级关系
  • 顶级部门: ancestors 中第一个非0数字对应的部门

权限矩阵:

├── 顶级部门管理员:全部岗位+健康配置 CRUD
├── 下级部门管理员:受限查看权限(全局+顶级部门数据)
└── 普通用户:无权限

技术实现:

数据可见性 = ancestors解析 → 顶级部门ID → 权限过滤
岗位管理: orgId IN [0, 顶级部门ID]
健康配置: customer_id = 顶级部门ID

v1.0.8 - 告警通知功能完整实现 (2025-08-16)

🚨 全新功能:企业级告警通知系统

  • 多渠道通知: 支持企业微信、公众号微信、系统消息三种通知方式
  • 实时推送: Critical级别告警通过WebSocket实时推送到监控大屏
  • 层级通知: 智能的通知层级体系,确保告警及时到达
    • 用户 → 部门主管 → 租户管理员
    • 如果没有部门管理员,自动上升到租户级管理员
  • 配置管理: 完整的微信告警配置CRUD管理界面
  • 大屏集成: 监控大屏支持告警弹窗、确认操作、音效提醒

📋 核心特性:

告警规则 → 事件触发 → 多渠道分发
    ↓
├── 微信通知 (企业微信/公众号)
├── 系统消息 (层级分发)  
└── 大屏推送 (Critical告警实时显示)

🎯 技术亮点:

  • 数据库优化: 清理冗余字段,优化表结构
  • WebSocket实时通信: Socket.IO支持大屏实时推送
  • 权限控制: 完整的告警配置权限管理
  • 容错处理: 微信通知失败自动降级为消息通知

📁 相关文件:

  • 后端: TWechatAlertConfigController.java - 微信告警配置API
  • 前端: alert/config/index.vue - 告警配置管理界面
  • 大屏: ljwx-bigscreen/alert.py - 增强版告警处理引擎
  • 文档: docs/告警通知功能完整实现方案.md - 完整技术方案

v1.0.7 - 租户/部门权限管理优化 (2025-01-16)

重要改进:

  • 权限分级控制: 实现租户和部门的分级权限管理

    • admin用户:可以创建租户(顶级组织)+ 创建部门
    • 普通用户:只能在自己租户下创建部门,无法创建租户
  • 前端权限控制: 动态按钮显示

    • 只有admin角色才能看到"新增租户"按钮
    • 普通用户只显示"新增部门"按钮
  • 后端API安全: 严格的权限验证

    • 创建顶级组织时检查管理员权限
    • 非admin用户尝试创建租户时返回权限错误
  • 文案优化: 更准确的业务概念

    • "组织" → "租户":明确多租户架构
    • "新增子组织" → "新增部门":符合组织层级关系

权限逻辑:

├── admin用户
│   ├── ✅ 创建租户(顶级组织)
│   └── ✅ 创建部门(子组织)
└── 普通用户  
    ├── ❌ 不能创建租户
    └── ✅ 只能在自己租户下创建部门

🔧 数据库补丁:执行 patch_tenant_permissions.sql 添加权限相关字典数据

v1.0.6 - 健康数据查询优化 (2025-01-16)

重要改进:

  • 智能查询策略: 根据 userId 参数自动选择不同的查询逻辑

    • userId 为空或 "all":只查询部门下所有设备的最新数据
    • userId 为具体值:查询该用户指定时间范围内的所有数据
  • 性能优化: 解决 n+1 查询问题

    • 新增 getBatchDailyData() 和 getBatchWeeklyData() 批量查询方法
    • 大幅减少数据库查询次数,提升系统响应速度
  • 数据安全: 严格的部门数据隔离

    • 自动过滤管理员设备,防止数据泄露
    • 基于 departmentInfo 确保只能访问本部门数据

API 使用示例:

# 查询部门所有设备最新数据
GET /t_user_health_data/page?userId=all&departmentInfo=1940374227169349634

# 查询特定用户时间范围内所有数据  
GET /t_user_health_data/page?userId=12345&departmentInfo=1940374227169349634&startDate=1751299200000&endDate=1755187199999

影响模块:

  • TUserHealthDataServiceImpl.java - 核心查询逻辑优化
  • DeviceUserMappingServiceImpl.java - 设备用户映射服务
  • SysOrgUnitsController.java - 租户/部门权限控制

技术选型

技术 说明 版本
Spring Boot 核心框架 3.3.2
MyBatis-Plus 持久层框架 3.5.6
MySQL 数据库 8.0.35
Redis 缓存 7.2.3
Sa-Token 鉴权框架 1.38.0
Logback 日志管理 1.5.6
Knife4j 接口文档 4.5.0
Socket.IO WebSocket通信 4.7.2
Python Flask 告警处理引擎 3.x
Lombok 工具库 1.18.34
Jackson JSON解析 2.15.4
Gson JSON解析 2.10.1
Guava Google工具库 33.2.1-jre
Hutool 工具库 5.8.29

项目源码

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

项目启动

前置环境
  • Java 开发环境 >=JDK 21
  • Java 开发工具 IDEA
  • Maven 构建依赖环境 >=3.9.6
  • MySQL 数据库 >=8.0.35
  • Redis 缓存数据库 >=7.2.3
克隆项目
git clone https://github.com/brunoGao/ljwx-boot
git clone https://github.com/brunoGao/ljwx-boot-starter
导入启动
  1. 将ljwx-boot以及ljwx-boot-starter分别导出到IDEA中,等待 Maven 依赖下载完成
  2. 创建数据库panis_boot,导入ljwx-boot-doc项目中的panis_boot.sql,文件暂在QQ群获取
  3. 修改ljwx-boot项目中的application-dev.yml文件中的数据库以及Redis连接信息
  4. 启动LjwxBootApplication类
  5. 看到---[LjwxBoot]-[ljwx-boot-admin]-启动完成,当前使用的端口:[9999],环境变量:[mybatis,dev]---即代表启动成功

📊 数据字典SQL

系统使用数据字典来管理下拉选项、状态值等基础数据。以下是核心数据字典表的建表SQL:

字典主表 (sys_dict)

CREATE TABLE `sys_dict` (
  `id` bigint NOT NULL COMMENT 'ID',
  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '字典名称',
  `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '字典编码',
  `type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '字典类型(1:系统字典,2:业务字典)',
  `sort` int DEFAULT NULL COMMENT '排序值',
  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '字典描述',
  `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '1' COMMENT '是否启用(0:禁用,1:启用)',
  `create_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建用户名称',
  `create_user_id` bigint DEFAULT NULL COMMENT '创建用户ID',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新用户名称',
  `update_user_id` bigint DEFAULT NULL COMMENT '更新用户ID',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `is_deleted` tinyint DEFAULT '0' COMMENT '是否删除(0:否,1:是)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='数据字典主表';

字典子项表 (sys_dict_item)

CREATE TABLE `sys_dict_item` (
  `id` bigint NOT NULL COMMENT 'ID',
  `dict_id` bigint DEFAULT NULL COMMENT '父字典ID',
  `dict_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '父字典编码',
  `value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '数据值',
  `zh_cn` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '中文名称',
  `en_us` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '英文名称',
  `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '类型(前端渲染类型)',
  `sort` int DEFAULT NULL COMMENT '排序值',
  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '字典描述',
  `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '1' COMMENT '是否启用(0:禁用,1:启用)',
  `create_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建用户名称',
  `create_user_id` bigint DEFAULT NULL COMMENT '创建用户ID',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新用户名称',
  `update_user_id` bigint DEFAULT NULL COMMENT '更新用户ID',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `is_deleted` tinyint DEFAULT '0' COMMENT '是否删除(0:否,1:是)',
  PRIMARY KEY (`id`),
  KEY `idx_dict_code` (`dict_code`),
  KEY `idx_dict_id` (`dict_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='数据字典子项表';

基础字典数据

-- 状态字典
INSERT INTO `sys_dict` (`id`, `name`, `code`, `type`, `sort`, `description`, `status`) VALUES 
(1, '状态', 'status', '1', 1, '通用状态字典', '1');

INSERT INTO `sys_dict_item` (`id`, `dict_id`, `dict_code`, `value`, `zh_cn`, `en_us`, `type`, `sort`, `description`, `status`) VALUES 
(1, 1, 'status', '0', '禁用', 'Disabled', 'error', 1, '禁用状态', '1'),
(2, 1, 'status', '1', '启用', 'Enabled', 'success', 2, '启用状态', '1');

-- 用户状态字典  
INSERT INTO `sys_dict` (`id`, `name`, `code`, `type`, `sort`, `description`, `status`) VALUES 
(2, '用户状态', 'user_status', '1', 2, '用户状态字典', '1');

INSERT INTO `sys_dict_item` (`id`, `dict_id`, `dict_code`, `value`, `zh_cn`, `en_us`, `type`, `sort`, `description`, `status`) VALUES 
(3, 2, 'user_status', '0', '禁用', 'Disabled', 'error', 1, '用户禁用', '1'),
(4, 2, 'user_status', '1', '正常', 'Normal', 'success', 2, '用户正常', '1'),
(5, 2, 'user_status', '2', '锁定', 'Locked', 'warning', 3, '用户锁定', '1');

-- 字典类型字典
INSERT INTO `sys_dict` (`id`, `name`, `code`, `type`, `sort`, `description`, `status`) VALUES 
(3, '字典类型', 'dict_type', '1', 3, '字典类型分类', '1');

INSERT INTO `sys_dict_item` (`id`, `dict_id`, `dict_code`, `value`, `zh_cn`, `en_us`, `type`, `sort`, `description`, `status`) VALUES 
(6, 3, 'dict_type', '1', '系统字典', 'System Dict', 'primary', 1, '系统内置字典', '1'),
(7, 3, 'dict_type', '2', '业务字典', 'Business Dict', 'info', 2, '业务定制字典', '1');

项目结构

LjwxBoot
├── ljwx-boot-common -- 基础模块
├── ljwx-boot-admin -- 后台管理模块
│   └── controller  -- 控制层
├── ljwx-boot-infrastructure -- 基础配置
├── ljwx-boot-modules -- 业务模块
│   └── system 
│       └── repository -- 数据交互
│           └── mapper -- 持久层
│       └── domain  -- 业务模型
│           └── entity -- 数据库实体
│           └── vo -- 视图对象
│           └── bo -- 业务对象
│           └── dto -- 传输对象
│       └── service -- 服务层
│           └── impl -- 服务实现层
│       └── facade -- 门面层
│           └── impl -- 门面实现层
│   └── base -- 基础管理
│   └── ... -- 其他模块
└── pom.xml -- 公共依赖

common 和 infrastructure 区别

  • common模块:通常包含通用的工具类、异常定义、常量定义等与业务无关的代码。这些代码可以被整个应用程序共享。

    • 通用工具类,比如日期处理、字符串处理等
    • 通用异常定义,比如业务异常、参数校验异常等
    • 通用常量定义,比如状态码、错误信息等
  • infrastructure模块:通常包含与基础设施相关的代码,比如数据库访问、缓存、消息队列、配置管理等。这些代码通常是为了支持业务模块的运行而存在的。

    • 数据访问相关的代码,比如数据库连接、ORM框架配置、数据源配置等
    • 缓存相关的代码,比如缓存配置、缓存管理等
    • 消息队列相关的代码,比如消息生产者、消费者配置等
    • 配置管理相关的代码,比如配置加载、动态配置更新等

对于静态类、工具类、异常定义等,你可以根据其功能和作用来判断放入common还是infrastructure 模块。如果它们是通用的、与业务无关的,可以放入common模块;如果它们是为了支持业务模块的基础设施,可以放入infrastructure模块。

特别鸣谢

开源协议

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