| 维度 | 详情 |
|---|---|
| 定位 | 客服中心运营数据采集→清洗→分析→决策→闭环管理一体化平台 |
| 技术栈 | Vue 3 + Vite + Element Plus / FastAPI + SQLAlchemy 2.0 + Gunicorn / PostgreSQL 15 / Redis 7 |
| 代码规模 | 后端 243 个 .py 文件 / 前端 9000+ 个 JS/TS 文件(含 node_modules) / 37 个 Alembic 迁移 / 56 张数据表 |
| 部署方式 | Docker Compose(4 服务: db/redis/backend/web),局域网单机部署 |
| 数据采集 | Playwright 浏览器自动化 + ddddocr OCR 自动登录 BMS/SCRM 平台 |
backend/tests/ 目录为空,无任何测试用例except Exception: 静默吞掉错误,排查困难| 检查项 | 状态 | 说明 |
|---|---|---|
| 目录结构 | 合规 | backend/web/docs/data 分层清晰,职责分明 |
| .gitignore | 合规 | .env / uploads / 样本数据 / 日志均正确忽略 |
| .env 未入库 | 合规 | git ls-files 验证 .env 未被跟踪 |
| .env.example 模板 | 合规 | 含占位符和安全注释,未暴露真实密钥 |
| .gitleaks.toml | 合规 | 已配置密钥泄露扫描规则 |
| Docker Compose 健康检查 | 合规 | db/backend 均有 healthcheck,web depends_on healthy |
| 端口暴露 | 合规 | DB/Redis 仅绑定 127.0.0.1,仅 80 对外 |
| 日志轮转 | 合规 | json-file 10m×3 轮转 + 后端 RotatingFileHandler |
| 依赖锁定 | 需改进 | 后端用 ≥ 版本范围非精确锁定;前端有 package-lock.json |
| CI/CD | 缺失 | 无 .github/workflows / .gitea/workflows 等 CI 配置 |
| 检查项 | 状态 | 说明 |
|---|---|---|
| 分层架构 | 良好 | models / services / api / core / schemas / middleware 分层清晰 |
| SQLAlchemy 2.0 用法 | 良好 | 使用 select() 新风格,无字符串拼接 SQL(仅 debug 脚本有 f-string SQL) |
| SQL 注入风险 | 无风险 | 生产代码全部使用 ORM 参数化查询 |
| eval/exec 使用 | 无 | 未发现 eval/exec/os.system 调用 |
| Ruff lint | 已配置 | line-length=100, select E/F/I/W |
| 文件大小 | 超标 | analytics.py 8508 行、bms_fetcher.py 3273 行严重超标 |
| 异常处理 | 需改进 | 30+ 处裸 except Exception 静默吞错 |
| 测试覆盖 | 零覆盖 | tests/ 目录为空,pytest 已在 dev 依赖但无用例 |
| 死依赖 | 存在 | passlib[bcrypt] 仍在 pyproject.toml 但代码未使用 |
| Dockerfile 重复安装 | 冗余 | Dockerfile 内联 pip install 与 pyproject.toml 重复,未用 pip install -e . |
| 检查项 | 状态 | 说明 |
|---|---|---|
| Vue 3 Composition API | 良好 | Pinia store 使用 setup 语法 |
| 路由懒加载 | 良好 | 全部路由使用动态 import() 按需加载 |
| 路由守卫 | 良好 | 三层权限: admin / manager / roles 白名单 |
| Axios 拦截器 | 良好 | 统一 token 注入 + 401 自动登出 + 错误提示 |
| XSS 防护 | 良好 | DOMPurify + escapeHtml 双重防护 |
| TypeScript | 缺失 | 全项目纯 JS,无类型约束 |
| ESLint/Prettier | 缺失 | 无 lint/format 配置文件 |
| 组件大小 | 超标 | SyncDashboard.vue 2010 行 / Today.vue 1816 行 |
| Token 存储 | 可接受 | localStorage 存储(XSS 风险,但 CSP 已缓解) |
| 检查项 | 状态 | 说明 |
|---|---|---|
| 模型数量 | 完整 | 56 张表,覆盖全业务域 |
| SCD Type 2 历史追溯 | 良好 | 人员分组/专项变更历史可追溯 |
| Alembic 迁移 | 良好 | 37 个版本,单一 head(已 merge),启动自动 upgrade |
| 连接池配置 | 良好 | pool_pre_ping + keepalive + pool_recycle=1800 + pool_use_lifo |
| 启动咨询锁 | 良好 | pg_try_advisory_lock 防多 worker 重复迁移/种子 |
| 僵尸任务清理 | 良好 | 启动时清理 running→failed,防误判跳过同步 |
| 检查项 | 状态 | 说明 |
|---|---|---|
| 密码哈希 | bcrypt | 直接用 bcrypt(非 passlib),超 72 字节拒绝而非截断 |
| JWT 签发与校验 | 良好 | HS256 + token_version 吊销 + sub 整数校验防 500 |
| 登录限速 | 已实施 | 5 分钟 10 次/IP(内存滑动窗口) |
| CORS 配置 | 受限 | 仅允许 localhost/127.0.0.1,allow_credentials=True |
| 静态文件安全 | 加固 | SafeStaticFiles: 白名单扩展名 + 路径穿越防御 + nosniff |
| 上传校验 | 加固 | 扩展名白名单 + magic bytes 校验 + 路径穿越防御 |
| 凭证加密存储 | Fernet | BMS/SCRM 凭证 Fernet 加密入库 |
| CSP / 安全头 | 完备 | CSP + X-Frame-Options + nosniff + Referrer-Policy + Permissions-Policy |
| v-html XSS 防护 | DOMPurify | marked + DOMPurify 消毒,限制允许标签/属性 |
| 微信扫码认证 | 已加固 | 申请者角色限制(防提权)+ prod 拒绝 mock openid |
| X-Forwarded-For 取值 | 正确 | 取末段(反代追加的真实 IP),非首段(可伪造) |
| 500 异常处理 | 良好 | 全局 handler 记录完整 traceback 到日志,prod 不暴露堆栈 |
| 操作日志审计 | 完备 | POST/PUT/PATCH/DELETE 全记录,含用户/IP/操作类型 |
| 改密验旧密码 | 良好 | 用户改自己密码需验旧密码(防会话劫持后锁户) |
| 限速多 worker 兼容 | 潜在风险 | 内存限速,多 worker 下各自计数(当前 -w 1 规避) |
| 加密 key 耦合 | 潜在风险 | CONFIG_ENCRYPTION_KEY 默认从 JWT_SECRET_KEY 派生 |
except Exception: 静默吞错。至少应加 logger.warning() 或 logger.debug() 记录被吞掉的异常,避免出现"功能不工作但日志里什么都没有"的排查惨案。
passlib[bcrypt](代码已直接使用 bcrypt 库)。Dockerfile 内联 pip install 改为 pip install -e . 统一从 pyproject.toml 安装,消除双重维护。
== 精确锁定版本或生成 requirements.lock,确保构建可复现。CSCTalon 是一个功能完整、安全意识较强的内部系统。从 git 历史可见团队已进行过多轮安全加固(v0.7 P0 修复、安全加固专项),核心安全机制(认证、授权、加密、限速、安全头、XSS 防护)均已到位且实现质量较高。
最大风险点是零测试覆盖——56 张表、8500 行分析引擎、3273 行数据抓取器,全部没有自动化测试保护,任何重构或修改都存在引入回归的高风险。建议优先建立核心路径的集成测试。
最大技术债是超大文件(analytics.py 8508 行)——这会严重拖慢后续开发效率和代码审查质量,建议尽快按业务域拆分。
整体而言,项目在安全性和架构设计上表现优秀(A-),在代码质量和工程规范上有较大改进空间(C+),测试覆盖需要紧急补齐(F),运维部署配置合理(B+)。