feat(web3): 规则扩展为数值/日期类型(Python 函数 + 安全沙箱 + AI 生成)
需求:规则这里增加数值和日期规则(可以切换),同样可以使用AI生成,
目标结果是一个python函数,测试也是调用后台测试。
DB:
- rule 表新增 rule_type(regex/number/date,默认 regex)/ code(Python 函数源码)
- init_db() 自动 ALTER ADD COLUMN(每个 ADD 都带 DEFAULT,老规则仍按 regex 走)
后端:
- core/rule_runner.py(新增):run_rule(rule_type, regex, code, value)
- regex 走 re.compile.search
- number/date 走 _exec_user_function(白名单 exec 沙箱)
- 白名单 __import__:datetime/time/_strptime/math/decimal/re
(strptime 内部 lazy-import _strptime,所以不能一刀切屏蔽 __import__)
- 沙箱预注入 datetime/time/math/decimal/re 到 globals
- validate_user_code():compile + 必须 def check(value) -> bool
- core/ai_rule.py(新增):gen_rule(desc, rule_type)
- regex 复用老的 ai_regex.gen_regex(行为完全兼容)
- number/date 走 LLM,validate_user_code 校验,5 次重试
- models/rule.py:Rule 加 rule_type/code + to_dict + RULE_TYPES 常量
- routers/ai.py:
- 新增 /api/ai/rule(POST {desc, rule_type} → {ok, code, note})
- 新增 /api/rule/test(POST {rule_type, code, value} → {ok, pass_, error})
- 保留老 /api/ai/regex 和 /api/regex/test(薄壳转发,老测试不挂)
- routers/tasks.py:RulePayload/RuleOut 加 rule_type/code,按类型持久化
- routers/queries.py:按 rule_type dispatch,number/date 走沙箱;
沙箱报错(语法错 / 缺 check)也按不合规处理,把错误原因写进 issues
前端:
- src/api/ai.js:genRule/testRule 统一接口(rule_type 参数化)
- src/components/RuleModal.vue:
- 规则类型 tab 切换(正则/数值/日期)
- regex 走单行 input;number/date 走等宽 Python 编辑框
- AI 按钮文案按类型变(生成正则/数值校验函数/日期校验函数)
- 测试统一走 /api/rule/test,保证和检测引擎语义一致
测试:
- tests/test_rule_runner.py(新增,20 个用例):
- regex 简单匹配 / 空正则 / 非法正则
- number 校验函数 / 非法输入 / 缺 check / 运行时异常
- date strptime 校验 / 范围校验
- 沙箱安全:os 拒绝 / datetime 预注入 / open 拒绝 / eval 拒绝 / getattr 拒绝
- validate_user_code 4 项
- tests/test_rule_types_e2e.py(新增,5 个用例):
- 持久化三种 rule_type
- 默认 rule_type=regex(向后兼容)
- queries/run 按 rule_type dispatch
- 规则执行失败标记为不合规 + 暴露原因
- 老 /api/ai/regex 端点兼容
迁移:老规则行 rule_type='regex'、code=NULL,自动走旧逻辑(不动现有数据)。
Showing
web3/backend/core/ai_rule.py
0 → 100644
This diff is collapsed.
Please register or sign in to comment