feat: 敏感词管理页面(脱敏词后台化,限 lqq 账号)
- 后端 /api/sensitive-words:全局共享词表,开放读、admin 或 lqq 整体替换写 - 前端 desensitize 种子化:SEED_DESENSITIZE_MAP + 运行时 replaceDesensitizeMap - 启动加载后台配置回灌脱敏映射;管理页支持增删改启停 + 一键导入种子词 - 入口置于左下角设置下拉(全量/简洁两种侧边栏均有),仅用户名 lqq 可见 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
39d7dab3e2
commit
25e4e3dbc9
18 files changed
+788
-5
No files matched your search
@@ -1,9 +1,16 @@
|
||||
/**
|
||||
* 脱敏词映射表
|
||||
* 脱敏词「种子」映射表(前端内置)。
|
||||
* key: 原始词(支持正则特殊字符,会被转义)
|
||||
* value: 脱敏后替换词
|
||||
*
|
||||
* 这份常量是**部署种子**:新机器首次启动、后台还没有任何敏感词时,运行时直接用它;
|
||||
* 管理员也可在「敏感词管理」页一键「导入种子词」把它写入后台。线上以后台配置为准
|
||||
* (见 {@link replaceDesensitizeMap}),后台为空时回退到这份种子。
|
||||
*
|
||||
* 注意:请勿在运行时修改本对象——它要保持与「出厂种子」一致。运行时可变映射见
|
||||
* {@link DESENSITIZE_MAP}。
|
||||
*/
|
||||
export const DESENSITIZE_MAP: Record<string, string> = {
|
||||
export const SEED_DESENSITIZE_MAP: Readonly<Record<string, string>> = Object.freeze({
|
||||
方案: "FA",
|
||||
设计: "SJ",
|
||||
任务: "RW",
|
||||
@@ -44,8 +51,15 @@ export const DESENSITIZE_MAP: Record<string, string> = {
|
||||
军: "J",
|
||||
美军: "MJ",
|
||||
台军: "TJ",
|
||||
});
|
||||
|
||||
};
|
||||
/**
|
||||
* 运行时实际生效的脱敏词映射表(可变)。
|
||||
*
|
||||
* 初始为 {@link SEED_DESENSITIZE_MAP} 的浅拷贝(保证后台数据加载前 `desensitize`
|
||||
* 立即可用);应用启动后由 {@link replaceDesensitizeMap} 用后台配置整体替换。
|
||||
*/
|
||||
export const DESENSITIZE_MAP: Record<string, string> = { ...SEED_DESENSITIZE_MAP };
|
||||
|
||||
/**
|
||||
* 将 DESENSITIZE_MAP 编译为单个正则,避免多次遍历字符串。
|
||||
@@ -107,3 +121,18 @@ export function addDesensitizeEntries(entries: Record<string, string>): void {
|
||||
Object.assign(DESENSITIZE_MAP, entries);
|
||||
_regex = buildRegex(DESENSITIZE_MAP);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用后台配置**整体替换**运行时脱敏词映射表,替换后自动重编译正则。
|
||||
*
|
||||
* 与 {@link addDesensitizeEntries} 不同,本函数会先清空现有词条,因此后台里被
|
||||
* 删除的词不会因为还残留在种子里而继续生效。应用启动时拉取
|
||||
* `/api/sensitive-words` 后调用;若后台为空则不调用,保持使用种子。
|
||||
*
|
||||
* @param entries 后台返回的「启用」词条,格式同 {@link DESENSITIZE_MAP}
|
||||
*/
|
||||
export function replaceDesensitizeMap(entries: Record<string, string>): void {
|
||||
for (const key of Object.keys(DESENSITIZE_MAP)) delete DESENSITIZE_MAP[key];
|
||||
Object.assign(DESENSITIZE_MAP, entries);
|
||||
_regex = buildRegex(DESENSITIZE_MAP);
|
||||
}
|
||||
Reference in new issue
Block a user