zhangtao
a4e8727a86
chore(backend): 新增 basedpyright 校准配置,并修复它暴露的三处真缺陷
...
背景:仓库此前没有 pyright/basedpyright 配置,basedpyright 使用自身默认(≈recommended),
在 app/ 下产生 247 errors / 3799 warnings,其中 143 条是 reportMissingTypeArgument
(未参数化泛型)这类注解完整度噪音,会把真缺陷淹没(例如 OSS 的 Client.uploader 方法误用)。
配置(backend/pyrightconfig.json)
- typeCheckingMode: basic;显式把能抓真缺陷的规则保持为 error
(reportAttributeAccessIssue / reportArgumentType / reportOptionalMemberAccess /
reportIncompatibleMethodOverride / reportConstantRedefinition / reportMissingImports 等)
- 关闭注解完整度与风格类规则;tests/ 用 executionEnvironments 单独放宽(extraPaths 保证 app 可解析)
- 结果:app + main.py + tests 全量 0 errors
- 红绿验证:合成「str | None 传参」「MethodType 上取属性」「Optional 成员访问」三类
仍全部报 error,证明校准没有把真缺陷一起关掉
修复配置暴露的三处真缺陷
1) template_safety.py:_SQLALCHEMY_TYPE_WHITELIST 对全大写常量二次赋值 → 合并为一次成型
2) template_safety.py:normalize_column_type 假定 _TYPE_BASE_RE 必命中(用 # type: ignore 盖住,
None 时 .group() 会崩)→ 改为 None 安全,去掉 type-ignore
3) node/service.py ×2:CustomException(msg=reason) 中 reason 为 str | None,客户端可能收到空文案
→ 新增 SchedulerUtil.require_schedulable() 收敛「判定 + 抛异常 + 兜底文案」,调用点改为一行
验证:basedpyright 0 errors(原 247);ruff All checks passed;pytest 97 passed;
已部署并线上复验(四端 200、Host 收窄、伪造令牌被拒、验证码过期 400 保留业务文案、
容器内 require_schedulable 与 OSS 调用修正均已生效)
2026-10-04 06:00:16 +08:00
zhangtao
b3882559de
fix(storage): 修复类型检查暴露的三处缺陷(含 OSS 上传运行时 bug)
...
basedpyright 报出的三处,逐条定位后发现都不是「标注问题」:
1) oss_adapter.py:70 —— 真运行时 bug
SDK 里 `Client.uploader` 是**方法**(`def uploader(self, **kwargs) -> Uploader`),
原写法 `self.client.uploader.upload_file(...)` 是在绑定方法上取属性,运行时必抛
AttributeError —— 即 OSS 上传链路从未成功过(生产未配 OSS 源,故未暴露)。
已改为 `self.client.uploader().upload_file(...)`,并按 SDK 签名核对
`upload_file(request, filepath, part_size=..., parallel_num=...)` 参数正确。
2) sftp_adapter.py:45 —— 缺主机校验
`config.host` 为 `str | None`(对象存储可不填),却直接传给 paramiko
`connect(hostname: str)`。已把 host 并入既有的用户名/密码守卫,
缺主机时返回业务异常 400「SFTP 存储源必须配置主机、用户名与密码」。
3) ftp_ftps_adapter.py:58 —— 同上
`_new_client()` 增加主机守卫(400「FTP 存储源必须配置主机地址」,并补 CustomException 导入);
顺带修复同文件 `_ImplicitFTP_TLS.connect` 覆写签名与 ftplib.FTP 不兼容
(timeout: float、source_address: tuple[str, int] | None),消除该文件最后一条 error。
验证:basedpyright 这三个文件 0 errors(修复前 4 条);ruff 全绿;pytest 97 passed;
运行时探针:缺主机 → 拦截为 400 业务异常;配主机 → 守卫放行并进入真实连接(ConnectionRefused 如期)。
2026-10-04 05:49:27 +08:00
zhangtao
644d262cad
refactor(backend): 错误码收敛为单一事实来源,统一异常写法
...
错误码(t16)
- HTTP 语义只由 core/exceptions.py 的 RET.code → fastapi.status 映射决定;
映射表显式登记 -1→400 与全部「数值即 HTTP 状态」的 RET 成员,_DEFAULT_BUSINESS_STATUS
降为「新增码忘登记」的安全网
- 移除冗余 status_code:131 处调用点改为纯 code 表达;security.py/dependencies.py
的 status_code=401/403 去除(映射表已给);get_or_404 → code=RET.NOT_FOUND.code
- 新增静态护栏(AST):app/ 下除 exceptions.py 外不得出现 status_code 传参,
路由装饰器 201 白名单显式放行并断言白名单非空
异常写法统一(t19)
- 删除 CustomException.internal 及 132 处包装:意外异常直接冒泡,由全局
@app.exception_handler(Exception) 统一映射 5xx + 通用文案 + 日志;
需要运维上下文处改为 logger.exception("<业务动作>失败") + raise
- 构造器不再接受 status_code 参数(属性保留,由 code 派生)→ 结构上杜绝第二来源
- 修复 6 处「宽泛 except 把 400 包成 500」的语义反转(补 except CustomException: raise),
并加 AST 护栏防止回潮
- 全局 SQLAlchemyError:非完整性错误由 400 改为 503(连接类)/500(其它),
不再把驱动原文/异常类型拼进客户端 msg;顺带修掉不存在的
status.HTTP_403_SERVICE_UNAVAILABLE 常量(命中即 AttributeError→500)
验证:pytest 97 passed / ruff 全绿;AST 审计残留 0;护栏红绿测试通过;
线上实测验证码过期仍 400 并保留业务文案、无令牌 401。
2026-10-04 05:44:21 +08:00
zhangtao
07fa789d2e
fix(backend): 安全默认值、异常语义、代码生成注入面与定时任务内置处理器
...
本批为 t10 → t13 → t15 三轮实现 + 一轮复核驳回整改的最终形态(pytest 83 passed / ruff clean,
已部署并线上验证)。
异常语义
- CustomException 默认状态码 500 → 400(约 433 处裸调用不再被计为服务端故障),
且「包装底层异常」的 130 处显式恢复 500;get_or_404 → 404;响应体结构不变
代码生成注入面(复核 blocker F1,二次修复)
- column_type 不再做字符串拼接:改为常量白名单派生(类型名 ∈ DB_TO_SQLALCHEMY ∪ {Boolean},
长度仅取数字/正则捕获),彻底移除 split("(")[1]
- 列类型加形状白名单;字符串/注释/文档字符串用 \uXXXX,标识符过 safe_ident(含 Python/JS 关键字),
.vue 文本与静态属性改 HTML 实体
- 落盘闸门由 ast.parse 升级为 assert_python_structure(语法 + 顶层语句白名单 + 与哨兵骨架逐节点比对)
与 assert_text_structure(.vue/.ts/.toml 行结构);U+2028/2029 与 C1 控制符纳入转义
安全默认值
- 生产 CORS 不再回落 ["*"](未配置即拒绝跨域,可选 CORS_STRICT_STARTUP 直接启动失败)
- OAUTH_ALLOWED_HOSTS 不再默认 "*";新增 ALLOW_LOCALHOST_HOSTS 控制 Host 校验范围
- ALLOWED_HOSTS 收窄为按配置派生;健康检查暴露 code_exec_enabled / cors_origins_configured
定时任务
- SCHEDULER_ALLOW_CODE_EXEC 默认 False;新增 builtin:<模块名>[.<函数名>] 内置处理器路线(不经 exec)
- 判定收敛到 describe_schedulability;列表返回 schedulable / unschedulable_reason;
启动 reconcile 与状态查询对「已启用但不可调度」打 WARN(去重、恢复后清除)
- 加固:内置处理器必须在本模块内定义或经 HANDLERS 声明,拒绝模块内导入的外部对象(复核 R1)
- 顺带修复:_WARNED_UNSCHEDULABLE 的 set.pop TypeError、job.next_run_time 缺失导致的列表 500
测试:新增 tests/test_generator_template_safety.py、test_security_defaults.py、
test_scheduler_schedulability.py(含恶意载荷、闸门红绿、静态护栏)
2026-10-04 05:12:32 +08:00
zhangtao
f12a40090a
fix: 修复主键类型非Integer时的模型生成与导入问题
...
1. 前端将MySQL主键默认类型从bigint改为int,同步后端代码适配
2. 增加SQLAlchemy主键类型自动导入逻辑,当主键类型不是Integer时自动添加对应导入
3. 重构模型模板,当主键类型与基类不一致时显式覆盖id字段定义
2026-09-13 22:17:49 +08:00
zhangtao
f15fdb86c0
feat(ticket,monitor): add ticket stats api and optimize server ip fetch
...
1. add TicketStatsSchema for work status aggregate
2. add stats method to TicketService to count pending/processing/done tickets
3. add ticket stats api endpoint
4. optimize server local ip detection with fallback logic
2026-09-12 12:33:00 +08:00
zhangtao
8d7efb6c58
refactor: 移除数据大屏页面及相关组件,更新滚动容器逻辑与配置
...
1. 移除dashboard数据大屏页面及全部依赖的图表、统计组件
2. 重构主滚动容器选择逻辑,统一使用getMainScrollEl获取滚动元素
3. 更新配置项,添加TRUSTED_PROXY_HOPS与IP2REGION相关配置
4. 替换IP归属地查询为离线本地解析,移除相关HTTP请求配置
5. 简化OAuth与微信小程序登录的background_tasks参数传递
6. 修复系统参数描述与前端提示文案,更新alembic版本清理逻辑
7. 简化页面滚动重置逻辑,过滤隐藏标签页
2026-09-12 01:16:03 +08:00
zhangtao
8b63042ecf
feat(generator): add python plugin template and fix frontend static path
...
1. 新增python包初始化模板和插件元数据模板
2. 修复前端静态文件挂载路径硬编码问题,使用配置中的FRONTEND_DIST_DIR
3. 优化代码生成模板中日期验证器的计算逻辑,改用jinja2过滤器一次性计算
4. 新增toml文件的文件图标适配
5. 更新文档说明代码生成后需要重启后端以及静态托管的注意事项
2026-09-10 21:22:09 +08:00
zhangtao
8cb5f17811
chore: 移除全局 API 与 WS 限流并修复代理配置
...
移除 fastapi-limiter 依赖及相关限流逻辑,更新健康检查请求头并信任反向代理转发头,避免生产环境 HTTPS 误判导致 301 循环。
2026-09-07 01:54:13 +08:00
zhangtao
a8d29d4ab4
fix: 修复多项后端缺陷并加固安全与限流
...
- 修正 AI 会话表初始化及异步数据库 URI 处理
- 新增全局 API 与 WS 聊天限流,健康检查豁免
- 修复忘记密码接口防用户枚举与参数校验
- 修复 SSE 推送数据重复编码问题
- 修复 Cron 表达式 Quartz 问号兼容
- 修复存储模块权限标识前缀
- 新增过期日志清理与任务错误中文提示
2026-09-07 00:08:00 +08:00
zhangtao
e340053efa
docs(readme): 更新项目说明与界面截图
...
补充移动端截图、Docker 部署说明与 Star History,同时更新后端技术栈版本和项目结构描述。
2026-09-06 20:52:11 +08:00
zhangtao
9e80f970d0
refactor(task): 重构定时任务与存储路由
...
- 移除各路由文件顶部冗余注释
- 将 JobRouter/NodeRouter 重命名为 CornJobRouter/CornJobNodeRouter
- 新增存储浏览、节点、传输、工作流路由注册
- 调整路由导入来源与任务表名
- 优化 main.py 启动方式及环境配置加载
2026-09-06 04:14:17 +08:00
zhangtao
d470c7eb1f
refactor(backend): 调整模块结构、调度器逻辑与健康检查路由
2026-09-06 00:54:24 +08:00