yueli
52a3c4079c
feat(audit): 操作人筛选改为下拉选择,过滤由模糊改为精确
原来的「操作人」是自由文本输入,后端按 `LIKE %值%` 模糊匹配。
后端:
· 新增 GET /audit/operators,返回 [{value: 账号, label: '名(账号)'}],
按记录数降序(最活跃的排最前),排除 system;/logs 也内联一份省一次请求。
· username 过滤由 LIKE 改**精确匹配**。选出来的是完整账号,再模糊匹配就是错的:
实测 `LIKE '%gao%'` 会多带出 2439 条非 gaoxue 的记录,将来出现
gaoxue / gaoxue2 两个账号时,选前者会连带查出后者的记录。
部分匹配的需求由下拉的 filterable(在选项里搜)承担,不落到 SQL。
★ 选项从 **audit_logs** 取,不是从 sys_user:审计记的是操作发生时的账号,
用户被删/改名后 sys_user 就查不到,而历史审计仍需能按他筛选 ——
实测 32 个操作人里有 1 个在 sys_user 中已不存在。
display_name 本来就在审计行上('杜邢宸(duxingchen)'),不必 join。
★ 排除 system:它不是人,「操作来源」那组单选(真实用户/系统操作/全部)
已经专门管它,混进下拉会让两个控件语义打架。
★ /operators 加了 system_audit 权限码,与 /modules(仅 JWT)**故意不同**:
/modules 给的是模块名,这个给的是**人员账号清单**。它唯一的消费者就是
审计页,而审计页本身要 system_audit —— 没道理让人绕开页面直接拉全员名单。
前端 AuditLog.vue:
· 操作人由 el-input 改为 el-select(clearable + filterable),
选项由后端下发,前端不硬编。
· 拉取失败(无权限 403 等)时 catch 住,下拉优雅退化为空,不抛未捕获异常。
验证(21 + 20 项断言全过):
· 32 个操作人全覆盖、排除 system、label 带中文名、按记录数降序
· 精确匹配与 SQL count 逐一核对(gaoxue 2519 / duxingchen 16863 / liuqi 1236),
且结果里不含他人
· 导出口径在与列表一致的 4 组筛选下逐一对齐(含操作人筛选)
· 权限矩阵:/logs 与 /export 无 token 401、无权限 403;/operators 无权限 403;
/labels 保持仅 JWT(纯静态标签)
· 日报三天附件 490.5K/193.4K/92.3K 与 6 列结构未变;聚合行仍可读
· vue-tsc 与 vite build exit=0
2026-09-28 11:15:15 +08:00
..
2026-09-28 11:15:15 +08:00
2026-05-22 10:59:39 +08:00
2026-01-27 15:50:23 +08:00
2026-09-02 18:39:09 +08:00
2026-01-26 13:47:53 +08:00
2026-09-23 17:16:26 +08:00
2026-09-02 18:39:09 +08:00
2026-03-19 09:49:21 +08:00
2026-07-14 17:02:07 +08:00
2026-01-27 15:50:23 +08:00
2026-03-19 09:49:21 +08:00
2026-07-15 11:11:40 +08:00
2026-09-02 18:39:17 +08:00
2026-09-23 17:41:27 +08:00
2026-02-02 15:06:20 +08:00
2026-03-19 09:49:21 +08:00
2026-04-02 10:31:53 +08:00