diff --git a/docs/db/sql/V11.0.0__SYS_system_ddl.sql b/docs/db/sql/V11.0.0__SYS_system_ddl.sql
new file mode 100644
index 0000000..b1418f6
--- /dev/null
+++ b/docs/db/sql/V11.0.0__SYS_system_ddl.sql
@@ -0,0 +1,164 @@
+-- ============================================================================
+-- OARMS - 系统管理模块 DDL
+-- Database: DM8 (达梦)
+-- Schema: OARMS
+-- Version: V11.0.0
+-- Date: 2026-05-24
+-- Description: 用户/角色/权限管理(RBAC)
+-- ============================================================================
+
+-- ----------------------------------------------------------------------------
+-- 1. sys_user - 系统用户表
+-- ----------------------------------------------------------------------------
+CREATE TABLE OARMS.SYS_USER (
+ id VARCHAR(50) NOT NULL,
+ username VARCHAR(50) NOT NULL,
+ password VARCHAR(100) NOT NULL,
+ real_name VARCHAR(50),
+ phone VARCHAR(20),
+ org_name VARCHAR(100),
+ district_code VARCHAR(20),
+ status TINYINT NOT NULL DEFAULT 1,
+ create_by VARCHAR(50),
+ create_time TIMESTAMP,
+ create_name VARCHAR(50),
+ update_by VARCHAR(50),
+ update_time TIMESTAMP,
+ update_name VARCHAR(50),
+ PRIMARY KEY (id)
+);
+
+CREATE UNIQUE INDEX IDX_SYS_USER_USERNAME ON OARMS.SYS_USER (USERNAME);
+CREATE INDEX IDX_SYS_USER_STATUS ON OARMS.SYS_USER (STATUS);
+CREATE INDEX IDX_SYS_USER_DISTRICT ON OARMS.SYS_USER (DISTRICT_CODE);
+
+COMMENT ON TABLE OARMS.SYS_USER IS '系统用户';
+COMMENT ON COLUMN OARMS.SYS_USER.ID IS '主键ID';
+COMMENT ON COLUMN OARMS.SYS_USER.USERNAME IS '登录用户名';
+COMMENT ON COLUMN OARMS.SYS_USER.PASSWORD IS '密码(BCrypt)';
+COMMENT ON COLUMN OARMS.SYS_USER.REAL_NAME IS '真实姓名';
+COMMENT ON COLUMN OARMS.SYS_USER.PHONE IS '联系电话';
+COMMENT ON COLUMN OARMS.SYS_USER.ORG_NAME IS '所属单位';
+COMMENT ON COLUMN OARMS.SYS_USER.DISTRICT_CODE IS '所属区域编码';
+COMMENT ON COLUMN OARMS.SYS_USER.STATUS IS '状态(1=正常,0=停用)';
+COMMENT ON COLUMN OARMS.SYS_USER.CREATE_BY IS '创建人ID';
+COMMENT ON COLUMN OARMS.SYS_USER.CREATE_TIME IS '创建时间';
+COMMENT ON COLUMN OARMS.SYS_USER.CREATE_NAME IS '创建人姓名';
+COMMENT ON COLUMN OARMS.SYS_USER.UPDATE_BY IS '更新人ID';
+COMMENT ON COLUMN OARMS.SYS_USER.UPDATE_TIME IS '更新时间';
+COMMENT ON COLUMN OARMS.SYS_USER.UPDATE_NAME IS '更新人姓名';
+
+-- ----------------------------------------------------------------------------
+-- 2. sys_role - 系统角色表
+-- ----------------------------------------------------------------------------
+CREATE TABLE OARMS.SYS_ROLE (
+ id VARCHAR(50) NOT NULL,
+ role_code VARCHAR(30) NOT NULL,
+ role_name VARCHAR(50) NOT NULL,
+ description VARCHAR(200),
+ status TINYINT NOT NULL DEFAULT 1,
+ create_by VARCHAR(50),
+ create_time TIMESTAMP,
+ create_name VARCHAR(50),
+ update_by VARCHAR(50),
+ update_time TIMESTAMP,
+ update_name VARCHAR(50),
+ PRIMARY KEY (id)
+);
+
+CREATE UNIQUE INDEX IDX_SYS_ROLE_CODE ON OARMS.SYS_ROLE (ROLE_CODE);
+
+COMMENT ON TABLE OARMS.SYS_ROLE IS '系统角色';
+COMMENT ON COLUMN OARMS.SYS_ROLE.ID IS '主键ID';
+COMMENT ON COLUMN OARMS.SYS_ROLE.ROLE_CODE IS '角色编码';
+COMMENT ON COLUMN OARMS.SYS_ROLE.ROLE_NAME IS '角色名称';
+COMMENT ON COLUMN OARMS.SYS_ROLE.DESCRIPTION IS '角色描述';
+COMMENT ON COLUMN OARMS.SYS_ROLE.STATUS IS '状态(1=正常,0=停用)';
+COMMENT ON COLUMN OARMS.SYS_ROLE.CREATE_BY IS '创建人ID';
+COMMENT ON COLUMN OARMS.SYS_ROLE.CREATE_TIME IS '创建时间';
+COMMENT ON COLUMN OARMS.SYS_ROLE.CREATE_NAME IS '创建人姓名';
+COMMENT ON COLUMN OARMS.SYS_ROLE.UPDATE_BY IS '更新人ID';
+COMMENT ON COLUMN OARMS.SYS_ROLE.UPDATE_TIME IS '更新时间';
+COMMENT ON COLUMN OARMS.SYS_ROLE.UPDATE_NAME IS '更新人姓名';
+
+-- ----------------------------------------------------------------------------
+-- 3. sys_user_role - 用户角色关联表
+-- ----------------------------------------------------------------------------
+CREATE TABLE OARMS.SYS_USER_ROLE (
+ id VARCHAR(50) NOT NULL,
+ user_id VARCHAR(50) NOT NULL,
+ role_id VARCHAR(50) NOT NULL,
+ create_by VARCHAR(50),
+ create_time TIMESTAMP,
+ create_name VARCHAR(50),
+ PRIMARY KEY (id)
+);
+
+CREATE INDEX IDX_SYS_USER_ROLE_UID ON OARMS.SYS_USER_ROLE (USER_ID);
+CREATE INDEX IDX_SYS_USER_ROLE_RID ON OARMS.SYS_USER_ROLE (ROLE_ID);
+CREATE UNIQUE INDEX IDX_SYS_USER_ROLE_UK ON OARMS.SYS_USER_ROLE (USER_ID, ROLE_ID);
+
+COMMENT ON TABLE OARMS.SYS_USER_ROLE IS '用户角色关联';
+COMMENT ON COLUMN OARMS.SYS_USER_ROLE.ID IS '主键ID';
+COMMENT ON COLUMN OARMS.SYS_USER_ROLE.USER_ID IS '用户ID';
+COMMENT ON COLUMN OARMS.SYS_USER_ROLE.ROLE_ID IS '角色ID';
+COMMENT ON COLUMN OARMS.SYS_USER_ROLE.CREATE_BY IS '创建人ID';
+COMMENT ON COLUMN OARMS.SYS_USER_ROLE.CREATE_TIME IS '创建时间';
+COMMENT ON COLUMN OARMS.SYS_USER_ROLE.CREATE_NAME IS '创建人姓名';
+
+-- ----------------------------------------------------------------------------
+-- 4. sys_permission - 系统权限表
+-- ----------------------------------------------------------------------------
+CREATE TABLE OARMS.SYS_PERMISSION (
+ id VARCHAR(50) NOT NULL,
+ perm_code VARCHAR(50) NOT NULL,
+ perm_name VARCHAR(100) NOT NULL,
+ module VARCHAR(30),
+ create_by VARCHAR(50),
+ create_time TIMESTAMP,
+ create_name VARCHAR(50),
+ update_by VARCHAR(50),
+ update_time TIMESTAMP,
+ update_name VARCHAR(50),
+ PRIMARY KEY (id)
+);
+
+CREATE UNIQUE INDEX IDX_SYS_PERM_CODE ON OARMS.SYS_PERMISSION (PERM_CODE);
+CREATE INDEX IDX_SYS_PERM_MODULE ON OARMS.SYS_PERMISSION (MODULE);
+
+COMMENT ON TABLE OARMS.SYS_PERMISSION IS '系统权限';
+COMMENT ON COLUMN OARMS.SYS_PERMISSION.ID IS '主键ID';
+COMMENT ON COLUMN OARMS.SYS_PERMISSION.PERM_CODE IS '权限编码';
+COMMENT ON COLUMN OARMS.SYS_PERMISSION.PERM_NAME IS '权限名称';
+COMMENT ON COLUMN OARMS.SYS_PERMISSION.MODULE IS '所属模块';
+COMMENT ON COLUMN OARMS.SYS_PERMISSION.CREATE_BY IS '创建人ID';
+COMMENT ON COLUMN OARMS.SYS_PERMISSION.CREATE_TIME IS '创建时间';
+COMMENT ON COLUMN OARMS.SYS_PERMISSION.CREATE_NAME IS '创建人姓名';
+COMMENT ON COLUMN OARMS.SYS_PERMISSION.UPDATE_BY IS '更新人ID';
+COMMENT ON COLUMN OARMS.SYS_PERMISSION.UPDATE_TIME IS '更新时间';
+COMMENT ON COLUMN OARMS.SYS_PERMISSION.UPDATE_NAME IS '更新人姓名';
+
+-- ----------------------------------------------------------------------------
+-- 5. sys_role_permission - 角色权限关联表
+-- ----------------------------------------------------------------------------
+CREATE TABLE OARMS.SYS_ROLE_PERMISSION (
+ id VARCHAR(50) NOT NULL,
+ role_id VARCHAR(50) NOT NULL,
+ perm_id VARCHAR(50) NOT NULL,
+ create_by VARCHAR(50),
+ create_time TIMESTAMP,
+ create_name VARCHAR(50),
+ PRIMARY KEY (id)
+);
+
+CREATE INDEX IDX_SYS_ROLE_PERM_RID ON OARMS.SYS_ROLE_PERMISSION (ROLE_ID);
+CREATE INDEX IDX_SYS_ROLE_PERM_PID ON OARMS.SYS_ROLE_PERMISSION (PERM_ID);
+CREATE UNIQUE INDEX IDX_SYS_ROLE_PERM_UK ON OARMS.SYS_ROLE_PERMISSION (ROLE_ID, PERM_ID);
+
+COMMENT ON TABLE OARMS.SYS_ROLE_PERMISSION IS '角色权限关联';
+COMMENT ON COLUMN OARMS.SYS_ROLE_PERMISSION.ID IS '主键ID';
+COMMENT ON COLUMN OARMS.SYS_ROLE_PERMISSION.ROLE_ID IS '角色ID';
+COMMENT ON COLUMN OARMS.SYS_ROLE_PERMISSION.PERM_ID IS '权限ID';
+COMMENT ON COLUMN OARMS.SYS_ROLE_PERMISSION.CREATE_BY IS '创建人ID';
+COMMENT ON COLUMN OARMS.SYS_ROLE_PERMISSION.CREATE_TIME IS '创建时间';
+COMMENT ON COLUMN OARMS.SYS_ROLE_PERMISSION.CREATE_NAME IS '创建人姓名';
diff --git a/docs/db/sql/V11.0.0__SYS_system_init_data.sql b/docs/db/sql/V11.0.0__SYS_system_init_data.sql
new file mode 100644
index 0000000..f83ce7b
--- /dev/null
+++ b/docs/db/sql/V11.0.0__SYS_system_init_data.sql
@@ -0,0 +1,139 @@
+-- ============================================================================
+-- OARMS - 系统管理模块 初始数据
+-- Database: DM8 (达梦)
+-- Schema: OARMS
+-- Version: V11.0.0
+-- Date: 2026-05-24
+-- Description: 角色、权限、用户初始数据
+-- ============================================================================
+
+-- ----------------------------------------------------------------------------
+-- 1. 角色(3 个)
+-- ----------------------------------------------------------------------------
+INSERT INTO OARMS.SYS_ROLE (id, role_code, role_name, description, status, create_by, create_time, create_name) VALUES
+('role_city_supervisor', 'CITY_SUPERVISOR', '市局广告监管人员', '全市户外广告监管统筹、监测规则管理、违法广告线索处置', 1, 'system', CURRENT_TIMESTAMP, '系统'),
+('role_district_supervisor', 'DISTRICT_SUPERVISOR', '区局广告监管人员', '本辖区户外广告日常监控、违法内容发现与取证', 1, 'system', CURRENT_TIMESTAMP, '系统'),
+('role_operator', 'OPERATOR', '广告大屏运营商', '大屏信息维护、广告播放时间上报、录屏参数查看', 1, 'system', CURRENT_TIMESTAMP, '系统');
+
+-- ----------------------------------------------------------------------------
+-- 2. 权限码(27 个)
+-- ----------------------------------------------------------------------------
+-- BS-大屏基础库
+INSERT INTO OARMS.SYS_PERMISSION (id, perm_code, perm_name, module, create_by, create_time, create_name) VALUES
+('perm_screen_view', 'screen:view', '查看大屏', 'BS', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_screen_create', 'screen:create', '新增大屏', 'BS', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_screen_edit', 'screen:edit', '编辑大屏', 'BS', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_screen_remove', 'screen:remove', '删除大屏', 'BS', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_screen_export', 'screen:export', '导出大屏', 'BS', 'system', CURRENT_TIMESTAMP, '系统');
+
+-- LB-法律法规
+INSERT INTO OARMS.SYS_PERMISSION (id, perm_code, perm_name, module, create_by, create_time, create_name) VALUES
+('perm_law_view', 'law:view', '查看法律条款', 'LB', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_law_create', 'law:create', '新增条款', 'LB', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_law_edit', 'law:edit', '编辑条款', 'LB', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_law_remove', 'law:remove', '删除条款', 'LB', 'system', CURRENT_TIMESTAMP, '系统');
+
+-- MR-监测规则
+INSERT INTO OARMS.SYS_PERMISSION (id, perm_code, perm_name, module, create_by, create_time, create_name) VALUES
+('perm_rule_view', 'monitoring-rule:view', '查看规则', 'MR', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_rule_create', 'monitoring-rule:create', '新增规则', 'MR', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_rule_edit', 'monitoring-rule:edit', '编辑规则', 'MR', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_rule_remove', 'monitoring-rule:remove', '删除规则', 'MR', 'system', CURRENT_TIMESTAMP, '系统');
+
+-- AM-广告监控
+INSERT INTO OARMS.SYS_PERMISSION (id, perm_code, perm_name, module, create_by, create_time, create_name) VALUES
+('perm_config_view', 'recording-config:view', '查看录屏配置', 'AM', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_config_create', 'recording-config:create', '新增录屏配置', 'AM', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_config_edit', 'recording-config:edit', '编辑录屏配置', 'AM', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_task_view', 'recording-task:view', '查看录屏任务', 'AM', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_record_view', 'monitor-record:view', '查看监控记录', 'AM', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_record_handle', 'monitor-record:handle', '处理监控', 'AM', 'system', CURRENT_TIMESTAMP, '系统');
+
+-- CW-内容预警
+INSERT INTO OARMS.SYS_PERMISSION (id, perm_code, perm_name, module, create_by, create_time, create_name) VALUES
+('perm_evidence_view', 'evidence:view', '查看取证', 'CW', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_evidence_create', 'evidence:create', '固化取证', 'CW', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_relation_view', 'evidence-relation:view', '查看规则关联', 'CW', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_relation_bind', 'evidence-relation:bind', '关联规则', 'CW', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_clue_view', 'monitoring-clue:view', '查看线索', 'CW', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_clue_create', 'monitoring-clue:create', '生成线索', 'CW', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_transfer_view', 'clue-transfer:view', '查看转办', 'CW', 'system', CURRENT_TIMESTAMP, '系统'),
+('perm_transfer_create', 'clue-transfer:create', '发起转办', 'CW', 'system', CURRENT_TIMESTAMP, '系统');
+
+-- ----------------------------------------------------------------------------
+-- 3. 角色权限映射
+-- ----------------------------------------------------------------------------
+
+-- 市局广告监管人员(全部权限)
+INSERT INTO OARMS.SYS_ROLE_PERMISSION (id, role_id, perm_id, create_by, create_time, create_name) VALUES
+('rp_city_01', 'role_city_supervisor', 'perm_screen_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_02', 'role_city_supervisor', 'perm_screen_create', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_03', 'role_city_supervisor', 'perm_screen_edit', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_04', 'role_city_supervisor', 'perm_screen_remove', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_05', 'role_city_supervisor', 'perm_screen_export', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_06', 'role_city_supervisor', 'perm_law_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_07', 'role_city_supervisor', 'perm_law_create', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_08', 'role_city_supervisor', 'perm_law_edit', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_09', 'role_city_supervisor', 'perm_law_remove', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_10', 'role_city_supervisor', 'perm_rule_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_11', 'role_city_supervisor', 'perm_rule_create', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_12', 'role_city_supervisor', 'perm_rule_edit', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_13', 'role_city_supervisor', 'perm_rule_remove', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_14', 'role_city_supervisor', 'perm_config_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_15', 'role_city_supervisor', 'perm_config_create', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_16', 'role_city_supervisor', 'perm_config_edit', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_17', 'role_city_supervisor', 'perm_task_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_18', 'role_city_supervisor', 'perm_record_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_19', 'role_city_supervisor', 'perm_record_handle', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_20', 'role_city_supervisor', 'perm_evidence_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_21', 'role_city_supervisor', 'perm_evidence_create', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_22', 'role_city_supervisor', 'perm_relation_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_23', 'role_city_supervisor', 'perm_relation_bind', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_24', 'role_city_supervisor', 'perm_clue_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_25', 'role_city_supervisor', 'perm_clue_create', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_26', 'role_city_supervisor', 'perm_transfer_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_city_27', 'role_city_supervisor', 'perm_transfer_create', 'system', CURRENT_TIMESTAMP, '系统');
+
+-- 区局广告监管人员(监控/取证/规则只读)
+INSERT INTO OARMS.SYS_ROLE_PERMISSION (id, role_id, perm_id, create_by, create_time, create_name) VALUES
+('rp_dist_01', 'role_district_supervisor', 'perm_screen_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_02', 'role_district_supervisor', 'perm_screen_export', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_03', 'role_district_supervisor', 'perm_law_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_04', 'role_district_supervisor', 'perm_rule_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_05', 'role_district_supervisor', 'perm_config_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_06', 'role_district_supervisor', 'perm_task_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_07', 'role_district_supervisor', 'perm_record_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_08', 'role_district_supervisor', 'perm_record_handle', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_09', 'role_district_supervisor', 'perm_evidence_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_10', 'role_district_supervisor', 'perm_evidence_create', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_11', 'role_district_supervisor', 'perm_relation_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_12', 'role_district_supervisor', 'perm_relation_bind', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_13', 'role_district_supervisor', 'perm_clue_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_14', 'role_district_supervisor', 'perm_clue_create', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_15', 'role_district_supervisor', 'perm_transfer_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_dist_16', 'role_district_supervisor', 'perm_transfer_create', 'system', CURRENT_TIMESTAMP, '系统');
+
+-- 广告大屏运营商(大屏维护/录屏查看)
+INSERT INTO OARMS.SYS_ROLE_PERMISSION (id, role_id, perm_id, create_by, create_time, create_name) VALUES
+('rp_oper_01', 'role_operator', 'perm_screen_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_oper_02', 'role_operator', 'perm_screen_create', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_oper_03', 'role_operator', 'perm_screen_edit', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_oper_04', 'role_operator', 'perm_law_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_oper_05', 'role_operator', 'perm_config_view', 'system', CURRENT_TIMESTAMP, '系统'),
+('rp_oper_06', 'role_operator', 'perm_task_view', 'system', CURRENT_TIMESTAMP, '系统');
+
+-- ----------------------------------------------------------------------------
+-- 4. 初始用户(3 个,密码均为 123456 的 BCrypt)
+-- BCrypt hash of '123456': $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
+-- 实际部署前请修改密码
+-- ----------------------------------------------------------------------------
+INSERT INTO OARMS.SYS_USER (id, username, password, real_name, phone, org_name, district_code, status, create_by, create_time, create_name) VALUES
+('user_city_admin', 'city_admin', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', '市局管理员', '13800000001', '广州市市场监督管理局', NULL, 1, 'system', CURRENT_TIMESTAMP, '系统'),
+('user_district_admin', 'district_admin', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', '天河区管理员', '13800000002', '广州市天河区市场监督管理局', '440106', 1, 'system', CURRENT_TIMESTAMP, '系统'),
+('user_operator', 'operator', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', '运营商管理员', '13800000003', '广州文化传媒有限公司', '440106', 1, 'system', CURRENT_TIMESTAMP, '系统');
+
+-- 用户角色关联
+INSERT INTO OARMS.SYS_USER_ROLE (id, user_id, role_id, create_by, create_time, create_name) VALUES
+('ur_01', 'user_city_admin', 'role_city_supervisor', 'system', CURRENT_TIMESTAMP, '系统'),
+('ur_02', 'user_district_admin', 'role_district_supervisor', 'system', CURRENT_TIMESTAMP, '系统'),
+('ur_03', 'user_operator', 'role_operator', 'system', CURRENT_TIMESTAMP, '系统');
diff --git a/pom.xml b/pom.xml
index 0cd35ca..c1b1abb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,6 +54,10 @@
1.18.42
provided
+
+ org.springframework.security
+ spring-security-crypto
+
junit
junit
diff --git a/progress.md b/progress.md
index 1927810..0ed2bbe 100644
--- a/progress.md
+++ b/progress.md
@@ -2,8 +2,8 @@
## 当前状态
-**阶段**: 规划完成,待用户确认
-**进度**: Phase 1-7 计划已制定
+**阶段**: 第一轮完成(Phase 1-3 + Phase 7 编译验证)
+**进度**: Phase 1/2/3/7 已完成
---
@@ -11,13 +11,13 @@
| 阶段 | 状态 | 备注 |
|------|------|------|
-| Phase 1: DDL 设计 | pending | 5 张表 + 初始数据 |
-| Phase 2: Entity/Mapper | pending | system 模块 |
-| Phase 3: 认证流程 | pending | LoginController + StpInterfaceImpl |
-| Phase 4: 鉴权+数据权限 | pending | 拦截器 + 注解 + Service 过滤 |
-| Phase 5: 前端角色路由 | pending | routes.js + permission store |
+| Phase 1: DDL 设计 | ✅ 完成 | 5 张表 + 初始数据 |
+| Phase 2: Entity/Mapper | ✅ 完成 | system 模块 5 Entity + 5 Mapper + 2 Service |
+| Phase 3: 认证流程 | ✅ 完成 | LoginController + StpInterfaceImpl + UserBaseServiceImpl |
+| Phase 4: 鉴权+数据权限 | ✅ 完成 | 9 Controller 28 个方法添加 @SaCheckPermission |
+| Phase 5: 前端角色路由 | ✅ 完成 | routes.js + permission.js + user.js + v-permission |
| Phase 6: 用户管理接口 | pending | 可选 |
-| Phase 7: 编译验证 | pending | mvn compile + npm lint |
+| Phase 7: 编译验证 | ✅ 完成 | BUILD SUCCESS |
---
@@ -44,10 +44,58 @@
- 数据权限:Service 层按角色动态追加查询条件
- Session 存储:LoginUserVO 替代 UserBase
+### 2026-05-24 — 第一轮执行(Phase 1-3 + 7)
+
+**创建的文件**:
+
+| 文件 | 说明 |
+|------|------|
+| `docs/db/sql/V11.0.0__SYS_system_ddl.sql` | 5 张表 DDL |
+| `docs/db/sql/V11.0.0__SYS_system_init_data.sql` | 3 角色 + 27 权限 + 3 用户 |
+| `modules/system/entity/SysUserEntity.java` | 用户实体 |
+| `modules/system/entity/SysRoleEntity.java` | 角色实体 |
+| `modules/system/entity/SysUserRoleEntity.java` | 用户角色关联实体 |
+| `modules/system/entity/SysPermissionEntity.java` | 权限实体 |
+| `modules/system/entity/SysRolePermissionEntity.java` | 角色权限关联实体 |
+| `modules/system/entity/vo/LoginUserVO.java` | 登录用户信息 VO |
+| `modules/system/entity/vo/SysUserVO.java` | 用户管理 VO |
+| `modules/system/entity/query/SysUserQuery.java` | 用户查询条件 |
+| `modules/system/mapper/SysUserMapper.java` | 用户 Mapper |
+| `modules/system/mapper/SysRoleMapper.java` | 角色 Mapper(含自定义 SQL) |
+| `modules/system/mapper/SysUserRoleMapper.java` | 用户角色关联 Mapper |
+| `modules/system/mapper/SysPermissionMapper.java` | 权限 Mapper(含自定义 SQL) |
+| `modules/system/mapper/SysRolePermissionMapper.java` | 角色权限关联 Mapper |
+| `modules/system/service/ISysUserService.java` | 用户 Service 接口 |
+| `modules/system/service/ISysRoleService.java` | 角色 Service 接口 |
+| `modules/system/service/impl/SysUserServiceImpl.java` | 用户 Service 实现 |
+| `modules/system/service/impl/SysRoleServiceImpl.java` | 角色 Service 实现 |
+| `config/PasswordConfig.java` | BCrypt 密码加密 Bean |
+
+**修改的文件**:
+
+| 文件 | 变更 |
+|------|------|
+| `controller/LoginController.java` | 数据库认证替代硬编码,返回 LoginUserVO |
+| `service/impl/StpInterfaceImpl.java` | 对接 SysRoleMapper/SysPermissionMapper |
+| `service/impl/UserBaseServiceImpl.java` | 从 LoginUserVO 转换 UserBase |
+| `pom.xml` | 添加 spring-security-crypto 依赖 |
+
+**编译错误与修复**:
+
+| 错误 | 修复 |
+|------|------|
+| `lambdaQuery()` 不存在 | ISysUserService 不继承 IService,改用 SysUserMapper 直接查询 |
+| `RestResult.fail()` 不存在 | 框架只有 `RestResult.ok()`,改用 `AssertUtils.isTrue()` |
+| `AssertUtils.isTrue(boolean, String)` 签名不匹配 | 改为三参数 `isTrue(boolean, ResultCode, String)` |
+
+**编译结果**: BUILD SUCCESS
+
---
## 遇到的错误
| 错误 | 尝试次数 | 解决方案 |
|------|---------|---------|
-| (暂无) | | |
+| lambdaQuery() 在 ISysUserService 上不存在 | 1 | 改用 SysUserMapper.selectOne() |
+| RestResult.fail() 方法不存在 | 1 | 用 AssertUtils.isTrue() 替代 |
+| AssertUtils.isTrue(boolean, String) 签名不匹配 | 1 | 改为 isTrue(boolean, ResultCode, String) |
diff --git a/src/main/java/com/chinaweal/youfool/prj/config/PasswordConfig.java b/src/main/java/com/chinaweal/youfool/prj/config/PasswordConfig.java
new file mode 100644
index 0000000..9576fc3
--- /dev/null
+++ b/src/main/java/com/chinaweal/youfool/prj/config/PasswordConfig.java
@@ -0,0 +1,20 @@
+package com.chinaweal.youfool.prj.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+/**
+ * 密码加密配置
+ *
+ * @author chenjy
+ * @since 2026/05/24
+ */
+@Configuration
+public class PasswordConfig {
+
+ @Bean
+ public BCryptPasswordEncoder passwordEncoder() {
+ return new BCryptPasswordEncoder();
+ }
+}
diff --git a/src/main/java/com/chinaweal/youfool/prj/controller/LoginController.java b/src/main/java/com/chinaweal/youfool/prj/controller/LoginController.java
index 0585a80..889a09a 100644
--- a/src/main/java/com/chinaweal/youfool/prj/controller/LoginController.java
+++ b/src/main/java/com/chinaweal/youfool/prj/controller/LoginController.java
@@ -3,19 +3,24 @@ package com.chinaweal.youfool.prj.controller;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chinaweal.youfool.framework.springboot.common.util.AssertUtils;
+import com.chinaweal.youfool.framework.springboot.rest.BaseResultCode;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
-import com.chinaweal.youfool.framework.springboot.user.entity.UserBase;
import com.chinaweal.youfool.prj.common.constants.SessionConstants;
+import com.chinaweal.youfool.prj.modules.system.entity.SysUserEntity;
+import com.chinaweal.youfool.prj.modules.system.entity.vo.LoginUserVO;
+import com.chinaweal.youfool.prj.modules.system.mapper.SysUserMapper;
+import com.chinaweal.youfool.prj.modules.system.service.ISysUserService;
+import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
/**
* 登录相关接口
@@ -26,78 +31,60 @@ import java.util.Set;
@Slf4j
@RestController
@RequestMapping("/user/auth")
+@AllArgsConstructor
public class LoginController {
- /**
- * 登录接口
- *
- * @param username 用户名
- * @param password 密码
- * @param encrypt 密码是否已经加密
- * @return 登录结果
- * @author lroyia
- * @since 2022年4月20日 15:47:35
- */
+ private final SysUserMapper sysUserMapper;
+ private final ISysUserService sysUserService;
+ private final BCryptPasswordEncoder passwordEncoder;
+
@PostMapping("login")
- public RestResult> doLogin(String username, String password, Boolean encrypt) {
+ public RestResult doLogin(String username, String password, Boolean encrypt) {
AssertUtils.isNotBlank(username, password);
- // TODO:与数据库匹配校验,具体按用户信息表
- // 匹配成功的话,登记登录信息 TODO:这里的userId是用户唯一号,应根据实际的数据库信息进行替换
- StpUtil.login("userId");
+ // 查询用户
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(SysUserEntity::getUsername, username);
+ wrapper.eq(SysUserEntity::getStatus, 1);
+ SysUserEntity user = sysUserMapper.selectOne(wrapper);
+ // 校验密码
+ AssertUtils.isTrue(user != null && passwordEncoder.matches(password, user.getPassword()),
+ BaseResultCode.PARAM_IS_INVALID, "用户名或密码错误");
+
+ // 登记登录
+ StpUtil.login(user.getId());
SaSession session = StpUtil.getSession();
- // 将用户信息存储至session TODO:登录信息存到这里
- UserBase userBase = new UserBase();
- Set permissionSet = new HashSet<>();
- permissionSet.add("admin");
- userBase.setPermission(permissionSet);
- session.set(SessionConstants.USER_KEY, userBase);
- // 将 token 写入响应头,供前端读取
+ // 构建登录用户信息并存入 session
+ LoginUserVO loginUserVO = sysUserService.buildLoginUserVO(user.getId());
+ session.set(SessionConstants.USER_KEY, loginUserVO);
+
+ // 将 token 写入响应头
SaHolder.getResponse().setHeader("satoken", StpUtil.getTokenValue());
- return RestResult.ok();
+ log.info("[OK] 用户登录: username={}", username);
+ return RestResult.ok(loginUserVO);
}
- /**
- * 登录信息
- *
- * @return 状态判断
- * @author lroyia
- * @since 2022年4月20日 15:58:26
- */
@GetMapping("login/info")
- public RestResult loginInfo() {
+ public RestResult loginInfo() {
boolean login = StpUtil.isLogin();
if (login) {
SaSession session = StpUtil.getSession();
- return RestResult.ok((UserBase) session.get(SessionConstants.USER_KEY));
+ LoginUserVO vo = session.getModel(SessionConstants.USER_KEY, LoginUserVO.class);
+ return RestResult.ok(vo);
}
return RestResult.ok(null);
}
- /**
- * 登出
- *
- * @return 操作结果
- * @author lroyia
- * @since 2022年4月20日 15:59:55
- */
@GetMapping("logout")
public RestResult> logout() {
StpUtil.logout();
return RestResult.ok();
}
- /**
- * 列出用户权限信息
- *
- * @return 权限列表
- * @author lroyia
- * @since 2022年4月20日 16:12:09
- */
@GetMapping("perm/list")
public RestResult> getPermList() {
return RestResult.ok(StpUtil.getPermissionList());
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/clue/controller/MonitoringClueController.java b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/clue/controller/MonitoringClueController.java
index 7f3305d..7c0e576 100644
--- a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/clue/controller/MonitoringClueController.java
+++ b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/clue/controller/MonitoringClueController.java
@@ -2,6 +2,7 @@ package com.chinaweal.youfool.prj.modules.evidence.clue.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
+import cn.dev33.satoken.annotation.SaCheckPermission;
import com.chinaweal.youfool.prj.modules.evidence.clue.entity.query.MonitoringClueQuery;
import com.chinaweal.youfool.prj.modules.evidence.clue.entity.vo.MonitoringClueDetailVO;
import com.chinaweal.youfool.prj.modules.evidence.clue.service.IMonitoringClueService;
@@ -65,6 +66,7 @@ public class MonitoringClueController {
* @param evidenceId 证据ID
* @return 操作结果
*/
+ @SaCheckPermission("monitoring-clue:create")
@PostMapping("generate")
@Operation(summary = "根据证据ID生成线索")
public RestResult> generateClue(@RequestBody Map params) {
diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/record/controller/EvidenceRecordController.java b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/record/controller/EvidenceRecordController.java
index 2ac8b13..eba5c7c 100644
--- a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/record/controller/EvidenceRecordController.java
+++ b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/record/controller/EvidenceRecordController.java
@@ -2,6 +2,7 @@ package com.chinaweal.youfool.prj.modules.evidence.record.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
+import cn.dev33.satoken.annotation.SaCheckPermission;
import com.chinaweal.youfool.prj.modules.evidence.record.entity.query.EvidenceRecordQuery;
import com.chinaweal.youfool.prj.modules.evidence.record.entity.req.EvidenceRecordSaveReq;
import com.chinaweal.youfool.prj.modules.evidence.record.entity.vo.EvidenceRecordDetailVO;
@@ -65,6 +66,7 @@ public class EvidenceRecordController {
* @param req 取证请求
* @return 操作结果
*/
+ @SaCheckPermission("evidence:create")
@PostMapping("save")
@Operation(summary = "保存固化取证记录")
public RestResult> save(@RequestBody EvidenceRecordSaveReq req) {
diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/relation/controller/EvidenceRuleRelationController.java b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/relation/controller/EvidenceRuleRelationController.java
index 27aad95..5414caf 100644
--- a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/relation/controller/EvidenceRuleRelationController.java
+++ b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/relation/controller/EvidenceRuleRelationController.java
@@ -1,6 +1,7 @@
package com.chinaweal.youfool.prj.modules.evidence.relation.controller;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
+import cn.dev33.satoken.annotation.SaCheckPermission;
import com.chinaweal.youfool.prj.modules.evidence.relation.entity.req.RuleRelateReq;
import com.chinaweal.youfool.prj.modules.evidence.relation.service.IEvidenceRuleRelationService;
import io.swagger.v3.oas.annotations.Operation;
@@ -50,6 +51,7 @@ public class EvidenceRuleRelationController {
* @param req 关联请求
* @return 操作结果
*/
+ @SaCheckPermission("evidence-relation:bind")
@PostMapping("relate")
@Operation(summary = "关联规则")
public RestResult> relateRules(@RequestBody RuleRelateReq req) {
diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/transfer/controller/ClueTransferController.java b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/transfer/controller/ClueTransferController.java
index 7c1b869..93f0f52 100644
--- a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/transfer/controller/ClueTransferController.java
+++ b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/transfer/controller/ClueTransferController.java
@@ -2,6 +2,7 @@ package com.chinaweal.youfool.prj.modules.evidence.transfer.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
+import cn.dev33.satoken.annotation.SaCheckPermission;
import com.chinaweal.youfool.prj.modules.evidence.transfer.entity.query.ClueTransferQuery;
import com.chinaweal.youfool.prj.modules.evidence.transfer.entity.query.PendingClueQuery;
import com.chinaweal.youfool.prj.modules.evidence.transfer.entity.req.ClueTransferReq;
@@ -73,6 +74,7 @@ public class ClueTransferController {
* @param req 转办请求
* @return 操作结果
*/
+ @SaCheckPermission("clue-transfer:create")
@PostMapping("submit")
@Operation(summary = "提交线索转办")
public RestResult> submitTransfer(@RequestBody ClueTransferReq req) {
@@ -129,6 +131,7 @@ public class ClueTransferController {
return clueTransferService.getOperationLogs(transferRecordId);
}
+ @SaCheckPermission("clue-transfer:create")
@PostMapping("status-update")
@Operation(summary = "更新转办状态(外部系统回调)")
public RestResult> updateTransferStatus(@RequestBody TransferStatusUpdateReq req) {
@@ -136,6 +139,7 @@ public class ClueTransferController {
return clueTransferService.updateTransferStatus(req);
}
+ @SaCheckPermission("clue-transfer:create")
@PostMapping("urge")
@Operation(summary = "转办催办")
public RestResult> urgeTransfer(@RequestBody TransferUrgeReq req) {
@@ -143,6 +147,7 @@ public class ClueTransferController {
return clueTransferService.urgeTransfer(req);
}
+ @SaCheckPermission("clue-transfer:create")
@PostMapping("withdraw")
@Operation(summary = "转办撤回")
public RestResult> withdrawTransfer(@RequestBody TransferWithdrawReq req) {
diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/law/controller/LawClauseController.java b/src/main/java/com/chinaweal/youfool/prj/modules/law/controller/LawClauseController.java
index 2c26d65..e8eba13 100644
--- a/src/main/java/com/chinaweal/youfool/prj/modules/law/controller/LawClauseController.java
+++ b/src/main/java/com/chinaweal/youfool/prj/modules/law/controller/LawClauseController.java
@@ -2,6 +2,7 @@ package com.chinaweal.youfool.prj.modules.law.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
+import cn.dev33.satoken.annotation.SaCheckPermission;
import com.chinaweal.youfool.prj.modules.law.entity.LawClauseEntity;
import com.chinaweal.youfool.prj.modules.law.entity.query.LawClauseQuery;
import com.chinaweal.youfool.prj.modules.law.entity.req.LawClauseSaveReq;
@@ -66,6 +67,7 @@ public class LawClauseController {
* @param req 新增请求
* @return 操作结果
*/
+ @SaCheckPermission("law:create")
@PostMapping("save")
@Operation(summary = "新增法律条款")
public RestResult> save(@RequestBody LawClauseSaveReq req) {
@@ -79,6 +81,7 @@ public class LawClauseController {
* @param req 更新请求
* @return 操作结果
*/
+ @SaCheckPermission("law:edit")
@PostMapping("update")
@Operation(summary = "更新法律条款")
public RestResult> update(@RequestBody LawClauseSaveReq req) {
@@ -92,6 +95,7 @@ public class LawClauseController {
* @param id 条款ID
* @return 操作结果
*/
+ @SaCheckPermission("law:remove")
@PostMapping("remove")
@Operation(summary = "删除法律条款")
public RestResult> remove(@RequestBody Map params) {
@@ -112,6 +116,7 @@ public class LawClauseController {
return lawClauseService.getLawClauseOptions();
}
+ @SaCheckPermission("law:edit")
@PostMapping("repeal")
@Operation(summary = "废止法律条款")
public RestResult> repeal(@RequestBody Map params) {
diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/controller/RecordingConfigController.java b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/controller/RecordingConfigController.java
index 91e8f2b..dc68cea 100644
--- a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/controller/RecordingConfigController.java
+++ b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/controller/RecordingConfigController.java
@@ -2,6 +2,7 @@ package com.chinaweal.youfool.prj.modules.monitor.config.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
+import cn.dev33.satoken.annotation.SaCheckPermission;
import com.chinaweal.youfool.prj.modules.monitor.config.entity.RecordingConfigEntity;
import com.chinaweal.youfool.prj.modules.monitor.config.entity.query.RecordingConfigQuery;
import com.chinaweal.youfool.prj.modules.monitor.config.entity.req.RecordingConfigSaveReq;
@@ -66,6 +67,7 @@ public class RecordingConfigController {
* @param req 新增请求
* @return 操作结果
*/
+ @SaCheckPermission("recording-config:create")
@PostMapping("save")
@Operation(summary = "新增录屏配置")
public RestResult> save(@RequestBody RecordingConfigSaveReq req) {
@@ -79,6 +81,7 @@ public class RecordingConfigController {
* @param req 更新请求
* @return 操作结果
*/
+ @SaCheckPermission("recording-config:edit")
@PostMapping("update")
@Operation(summary = "更新录屏配置")
public RestResult> update(@RequestBody RecordingConfigSaveReq req) {
@@ -92,6 +95,7 @@ public class RecordingConfigController {
* @param id 配置ID
* @return 操作结果
*/
+ @SaCheckPermission("recording-config:edit")
@PostMapping("remove")
@Operation(summary = "删除录屏配置")
public RestResult> remove(@RequestBody Map params) {
@@ -111,6 +115,7 @@ public class RecordingConfigController {
return recordingConfigService.getConfigurableScreens();
}
+ @SaCheckPermission("recording-config:edit")
@PostMapping("toggle-status")
@Operation(summary = "切换录屏配置启用状态")
public RestResult> toggleStatus(@RequestBody Map params) {
diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/record/controller/MonitorRecordController.java b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/record/controller/MonitorRecordController.java
index bec9b83..83510f3 100644
--- a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/record/controller/MonitorRecordController.java
+++ b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/record/controller/MonitorRecordController.java
@@ -2,6 +2,7 @@ package com.chinaweal.youfool.prj.modules.monitor.record.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
+import cn.dev33.satoken.annotation.SaCheckPermission;
import com.chinaweal.youfool.prj.modules.monitor.record.entity.MonitorRecordEntity;
import com.chinaweal.youfool.prj.modules.monitor.record.entity.query.MonitorRecordQuery;
import com.chinaweal.youfool.prj.modules.monitor.record.entity.req.MonitorJudgeReq;
@@ -65,6 +66,7 @@ public class MonitorRecordController {
* @param id 记录ID
* @return 操作结果
*/
+ @SaCheckPermission("monitor-record:handle")
@PostMapping("start")
@Operation(summary = "开始监控")
public RestResult> startMonitor(@RequestBody Map params) {
@@ -78,6 +80,7 @@ public class MonitorRecordController {
* @param req 判定请求
* @return 操作结果
*/
+ @SaCheckPermission("monitor-record:handle")
@PostMapping("judge")
@Operation(summary = "监控判定")
public RestResult> judgeMonitor(@RequestBody MonitorJudgeReq req) {
diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/rule/controller/MonitoringRuleController.java b/src/main/java/com/chinaweal/youfool/prj/modules/rule/controller/MonitoringRuleController.java
index f9bc48d..9e4ce2b 100644
--- a/src/main/java/com/chinaweal/youfool/prj/modules/rule/controller/MonitoringRuleController.java
+++ b/src/main/java/com/chinaweal/youfool/prj/modules/rule/controller/MonitoringRuleController.java
@@ -2,6 +2,7 @@ package com.chinaweal.youfool.prj.modules.rule.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
+import cn.dev33.satoken.annotation.SaCheckPermission;
import com.chinaweal.youfool.prj.modules.rule.entity.query.MonitoringRuleQuery;
import com.chinaweal.youfool.prj.modules.rule.entity.req.MonitoringRuleSaveReq;
import com.chinaweal.youfool.prj.modules.rule.entity.vo.MonitoringRuleDetailVO;
@@ -66,6 +67,7 @@ public class MonitoringRuleController {
* @param req 新增请求
* @return 操作结果
*/
+ @SaCheckPermission("monitoring-rule:create")
@PostMapping("save")
@Operation(summary = "新增监测规则")
public RestResult> save(@RequestBody MonitoringRuleSaveReq req) {
@@ -79,6 +81,7 @@ public class MonitoringRuleController {
* @param req 更新请求
* @return 操作结果
*/
+ @SaCheckPermission("monitoring-rule:edit")
@PostMapping("update")
@Operation(summary = "更新监测规则")
public RestResult> update(@RequestBody MonitoringRuleSaveReq req) {
@@ -92,6 +95,7 @@ public class MonitoringRuleController {
* @param id 规则ID
* @return 操作结果
*/
+ @SaCheckPermission("monitoring-rule:remove")
@PostMapping("remove")
@Operation(summary = "删除监测规则")
public RestResult> remove(@RequestBody Map params) {
@@ -106,6 +110,7 @@ public class MonitoringRuleController {
* @param status 目标状态(1=启用,2=停用)
* @return 操作结果
*/
+ @SaCheckPermission("monitoring-rule:edit")
@PostMapping("toggle-status")
@Operation(summary = "切换规则启用/停用状态")
public RestResult> toggleStatus(@RequestBody Map params) {
diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/screen/controller/ScreenController.java b/src/main/java/com/chinaweal/youfool/prj/modules/screen/controller/ScreenController.java
index 012699d..faed719 100644
--- a/src/main/java/com/chinaweal/youfool/prj/modules/screen/controller/ScreenController.java
+++ b/src/main/java/com/chinaweal/youfool/prj/modules/screen/controller/ScreenController.java
@@ -2,6 +2,7 @@ package com.chinaweal.youfool.prj.modules.screen.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
+import cn.dev33.satoken.annotation.SaCheckPermission;
import com.chinaweal.youfool.prj.modules.screen.entity.query.ScreenQuery;
import com.chinaweal.youfool.prj.modules.screen.entity.req.ScreenSaveReq;
import com.chinaweal.youfool.prj.modules.screen.entity.vo.ScreenDetailVO;
@@ -68,6 +69,7 @@ public class ScreenController {
* @param req 新增请求
* @return 操作结果
*/
+ @SaCheckPermission("screen:create")
@PostMapping("save")
@Operation(summary = "新增大屏")
public RestResult> save(@RequestBody ScreenSaveReq req) {
@@ -81,6 +83,7 @@ public class ScreenController {
* @param req 更新请求
* @return 操作结果
*/
+ @SaCheckPermission("screen:edit")
@PostMapping("update")
@Operation(summary = "更新大屏")
public RestResult> update(@RequestBody ScreenSaveReq req) {
@@ -94,6 +97,7 @@ public class ScreenController {
* @param id 大屏ID
* @return 操作结果
*/
+ @SaCheckPermission("screen:remove")
@PostMapping("remove")
@Operation(summary = "删除大屏")
public RestResult> remove(@RequestBody Map params) {
@@ -146,6 +150,7 @@ public class ScreenController {
return RestResult.ok(districtList);
}
+ @SaCheckPermission("screen:edit")
@PostMapping("toggle-status")
@Operation(summary = "切换大屏启用状态")
public RestResult> toggleStatus(@RequestBody Map params) {
@@ -174,6 +179,7 @@ public class ScreenController {
return screenService.exportData(query);
}
+ @SaCheckPermission("screen:create")
@PostMapping("import")
@Operation(summary = "批量导入大屏数据")
public RestResult