feat: 审核规则模版+设置页面整合+去掉角色切换demo

后端:
- AuditRule 新增 value 字段, rule_type 扩展 DDL/DML
- MySQL/PG/Redis 预设规则种子接口 POST /audit-rules/seed/{db_type}
- 公告管理 CRUD (announcements)
- 消息推送 CRUD+测试 (notifications: 钉钉/飞书/邮件)
- LDAP 配置 CRUD+测试连接 (ldap-config)
- 164 tests passing (+31 新增)

前端:
- AuditRulesPage 重写: DB类型Tab+DDL/DML分组+参数编辑
- SettingsPage: 系统设置主页(审核规则/公告/推送/LDAP)
- NotificationPage: 钉钉/飞书/SMTP配置
- LdapConfigPage: LDAP设置+测试连接
- AnnouncementPage: 公告Markdown编辑
- 去掉左下角角色切换demo
- 侧边栏合并为: 系统设置(含审核规则+公告+推送+LDAP)
This commit is contained in:
logan committed 2026-05-22 22:26:10 +08:00
1 parent d5d19d6be4
commit bab55d3927
27 files changed
+2881 -591

No files matched your search

+322
View File
@@ -0,0 +1,322 @@
"""Preset audit rule seed data for MySQL, PostgreSQL, and Redis."""
from typing import List, Dict, Any
# ── MySQL 预设规则 ──────────────────────────────────────────────
MYSQL_SEED_RULES: List[Dict[str, Any]] = [
{
"name": "DDLMultiToCommit",
"description": "DDL 允许单个工单提交多条DDL",
"rule_type": "DDL",
"severity": "info",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "DDL 允许单个工单提交多条DDL语句",
},
{
"name": "DDLAllowMultiAlter",
"description": "DDL 允许多alter",
"rule_type": "DDL",
"severity": "info",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "DDL 允许在单条ALTER TABLE中使用多个修改操作",
},
{
"name": "DDLAllowColumnType",
"description": "允许字段类型转换",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "允许字段类型转换,请确认数据兼容性",
},
{
"name": "DDLAllowChangeColumnPosition",
"description": "允许 AFTER/FIRST 修改列位置",
"rule_type": "DDL",
"severity": "info",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "允许使用 AFTER/FIRST 修改列位置",
},
{
"name": "DDLEnableDropTable",
"description": "允许删表操作",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "允许执行 DROP TABLE 操作,请确认已备份",
},
{
"name": "DDLEnablePrimaryKey",
"description": "检查表必须包含主键",
"rule_type": "DDL",
"severity": "error",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "建表必须指定主键",
},
{
"name": "DDLCheckTableComment",
"description": "强制表注释",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "建表时必须添加表注释(COMMENT)",
},
{
"name": "DMLAllowInsertNull",
"description": "允许 Insert Null 值",
"rule_type": "DML",
"severity": "info",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "允许 INSERT 语句中包含 NULL 值",
},
{
"name": "DMLWhere",
"description": "强制 DML 语句包含 WHERE 条件",
"rule_type": "DML",
"severity": "error",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "UPDATE/DELETE 语句必须包含 WHERE 条件",
},
{
"name": "DDLMaxKeyParts",
"description": "单索引字段上限",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "8",
"message": "单索引包含的字段数不得超过8个",
},
{
"name": "DDLMaxKey",
"description": "单表索引上限",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "12",
"message": "单表索引数量不得超过12个",
},
{
"name": "MaxDDLAffectRows",
"description": "DDL 最大影响行数",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "0",
"message": "DDL 最大影响行数为0(不限制)",
},
{
"name": "DDLMaxCharLength",
"description": "CHAR 类型最大长度",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "10",
"message": "CHAR 类型长度不得超过10,超出请使用 VARCHAR",
},
{
"name": "MaxTableNameLen",
"description": "表名长度限制",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "45",
"message": "表名长度不得超过45个字符",
},
{
"name": "DMLMaxInsertRows",
"description": "INSERT 最大行数限制",
"rule_type": "DML",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "500",
"message": "单次 INSERT 最多插入500行",
},
]
# ── PostgreSQL 预设规则 ─────────────────────────────────────────
POSTGRES_SEED_RULES: List[Dict[str, Any]] = [
{
"name": "PGDDLMultiToCommit",
"description": "PostgreSQL DDL 允许单个工单提交多条DDL",
"rule_type": "DDL",
"severity": "info",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "DDL 允许单个工单提交多条DDL语句",
},
{
"name": "PGDDLAllowColumnType",
"description": "PostgreSQL 允许字段类型转换",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "允许字段类型转换,请确认数据兼容性",
},
{
"name": "PGDDLEnablePrimaryKey",
"description": "PostgreSQL 检查表必须包含主键",
"rule_type": "DDL",
"severity": "error",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "建表必须指定主键",
},
{
"name": "PGDDLEnableDropTable",
"description": "PostgreSQL 允许删表操作",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "允许执行 DROP TABLE 操作,请确认已备份",
},
{
"name": "PGDDLCheckTableComment",
"description": "PostgreSQL 强制表注释",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "建表时必须添加表注释(COMMENT ON TABLE)",
},
{
"name": "PGDMLWhere",
"description": "PostgreSQL 强制 DML 包含 WHERE 条件",
"rule_type": "DML",
"severity": "error",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "UPDATE/DELETE 语句必须包含 WHERE 条件",
},
{
"name": "PGDMLAllowInsertNull",
"description": "PostgreSQL 允许 Insert Null 值",
"rule_type": "DML",
"severity": "info",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "允许 INSERT 语句中包含 NULL 值",
},
{
"name": "PGDDLMaxKeyParts",
"description": "PostgreSQL 单索引字段上限",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": "8",
"message": "单索引包含的字段数不得超过8个",
},
{
"name": "PGDDLMaxKey",
"description": "PostgreSQL 单表索引上限",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": "12",
"message": "单表索引数量不得超过12个",
},
{
"name": "PGMaxTableNameLen",
"description": "PostgreSQL 表名长度限制",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": "63",
"message": "表名长度不得超过63个字符",
},
{
"name": "PGDMLMaxInsertRows",
"description": "PostgreSQL INSERT 最大行数限制",
"rule_type": "DML",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": "500",
"message": "单次 INSERT 最多插入500行",
},
]
# ── Redis 预设规则 ──────────────────────────────────────────────
REDIS_SEED_RULES: List[Dict[str, Any]] = [
{
"name": "RedisAllowFlushDB",
"description": "Redis 允许 FLUSHDB 操作",
"rule_type": "DML",
"severity": "warning",
"db_type": "redis",
"pattern": None,
"value": None,
"message": "允许执行 FLUSHDB 操作,将清空当前数据库",
},
{
"name": "RedisMaxKeyLen",
"description": "Redis Key 最大长度限制",
"rule_type": "DDL",
"severity": "warning",
"db_type": "redis",
"pattern": None,
"value": "256",
"message": "Key 长度不得超过256个字符",
},
{
"name": "RedisRequireTTL",
"description": "Redis 写入操作必须设置 TTL",
"rule_type": "DML",
"severity": "error",
"db_type": "redis",
"pattern": None,
"value": None,
"message": "写入 Key 时必须设置过期时间(TTL)",
},
{
"name": "RedisDefaultTTL",
"description": "Redis 默认 TTL 值(秒)",
"rule_type": "DML",
"severity": "info",
"db_type": "redis",
"pattern": None,
"value": "3600",
"message": "默认 TTL 为3600秒(1小时)",
},
]
# 映射: db_type → 种子规则列表
SEED_RULES_MAP = {
"mysql": MYSQL_SEED_RULES,
"postgres": POSTGRES_SEED_RULES,
"redis": REDIS_SEED_RULES,
}