78f60c6857
P0 修复: - /api/ready import 错误 (_get_engine + settings.create_redis_client) - 删 agent.otp_secret/otp_enabled 双字段 (migration 026) - 重建 021_rbac migration (IF NOT EXISTS 兼容) P1 新增: - 企微 SSO (auth_wecom_sso.py, useWeChatWorkSSO composable, PortalSelect UA 检测) - RBAC 5 角色 × 4 资源 × 4 操作 × 3 范围 (rbac_service + seed_rbac + require_permission) - audit_log 模型 + migration 027 + 服务 + API - 管理后台 RBAC 权限矩阵 UI (PermissionsMatrix.vue) 质量: - pytest 405 passed / 33 pre-existing failed / 4 xfailed (v0.7.1 引入失败 = 0) - conftest GBK patch 强制 UTF-8 读 .env - .gitignore 排除 *.b64 (含 admin token 凭据) - DEPLOY-v0.7.1.md 7 步 runbook + 4 坑 + 回滚预案
11 KiB
11 KiB
企微IT智能服务台 — 项目状态看板
📌 这个文件就是项目的"驾驶舱仪表盘"。任何时候新开 session,先读这个文件就懂上下文。
📝 更新规则:每次 Claude 完成 / 开始 / 阻塞重要任务,会主动更新本文件。你也可以自己改(纯 markdown,git 跟踪)。
最后更新:2026-06-22 下午(Claude 自动维护,看板本次刷新)
🎯 一句话总览
v0.7.0 + hotfix1 已上线,但生产有 2 个真 bug:
- 🐛 员工/坐席扫码登录报错(QR 码生成后,/api/auth_qrcode/scan 失败)
- 🐛 管理员 sxn 登录报错(用户名错/密码 hash 不对/或者 seed 数据问题) 用户决策(2026-06-22 下午):不再修 v0.7.0.1 bug,直接进 v0.7.1。 v0.7.1 范围(待 2026-06-23 7:00 前出范围规划):
- P0:修 2 个生产登录报错
- P0:修
/api/readyimport error(已 defer) - P1:评估 + 实施企微入口 SSO
- P1:管理后台 RBAC 细粒度权限
- P1:敏感词检测 + 语气优化(原 #81 提升)
- 保留 hotfix1 的 QR 码生成(已 work)
🟢 正在做(in_progress,1 件)
| # | 任务 | 我做什么 | 你做什么 | 完成定义 |
|---|---|---|---|---|
| #77 | v0.7.1 范围规划 + CHANGELOG | 拆 6-8 个子 task,出 v0.7.1-dev 分支 | 拍板 P0/P1 优先级 | task #78/79/80 拿到 owner |
🔴 P0 必做(下一个 sprint)
| # | 任务 | 重要程度 | 说明 |
|---|---|---|---|
| #48 | v1.0 收窄 set_real_ip_from | 🔴 P0 | 现 allow 0.0.0.0/0 是临时方案,正式上线前必须改精确代理 IP |
| #81 | v0.6.0 敏感词检测 + 语气优化 | 🔴 P0 | 下一个版本的核心功能 |
| #80 | v0.5.4 应急页 nginx 路由 + 部署 | 🔴 P0 | 当前生产缺路由,功能上了但用户访问不到 |
🟡 P1 重要(看时间做)
| # | 任务 | 说明 |
|---|---|---|
| #73 | 修后端文件未真正覆盖 | `yes |
| #86 | 排查流程图零依赖部分 review + 文档化 | 把 Mermaid 流程图从代码里剥离成可读文档 |
| #88 | 管理后台 RBAC 角色权限 | 管理后台细粒度角色权限(大功能,2-3 天) |
| #83 | 澄清"OTM 跟项目关系" | 已 2026-06-21 决策:走 TOTP+SMS 双引擎(MFA Phase 2 实施) |
| 🆕 | v0.7.0 部署 + 35 项 E2E 验收 | 看 docs/DEPLOY-QUICK-v0.7.0.md 6 步 + docs/E2E-CHECKLIST-v0.7.0.md |
| 🆕 | 修 64 pre-existing 测试失败 | Role.data_scope 缺字段 / WecomService DI / test_message_experience 等 |
🟢 P2 / 等用户决策
| # | 任务 | 卡在哪 |
|---|---|---|
| 🆕 服务器更新? | 把 v0.7.0 部署到生产(扫码+MFA+高危+4 项 P0) | 等你跑 DEPLOY-QUICK-v0.7.0.md 6 步 |
| #31 | 推 docker 镜像到生产 registry | 等你确认要走哪条路(自建 Harbor / 阿里云 / 别的) |
| #43 | 配置 HTTPS | 等域名备案完成 + 证书到位 |
| #53 | 用户在企微验证 /itportal/ | 等你去企微点一点 |
| 🆕 #23 | 清理 ~/Downloads/ patch1 包 | 部署观察期后拍板 |
| 🆕 #24 | 清理生产 patch1 回滚备份 | 1 周观察期后拍板 |
| 🆕 #48 | 收窄 set_real_ip_from 内网地址 | 部署后下一迭代(v1.0 前) |
🟢 P2 / 等用户决策
| # | 任务 | 卡在哪 |
|---|---|---|
| 🆕 服务器更新? | 把今天的 3 个 migration + 1 个 bug 修复部署到生产 v0.5.6 | 等你看这份看板后拍板 |
| #31 | 推 docker 镜像到生产 registry | 等你确认要走哪条路(自建 Harbor / 阿里云 / 别的) |
| #43 | 配置 HTTPS | 等域名备案完成 + 证书到位 |
| #53 | 用户在企微验证 /itportal/ | 等你去企微点一点 |
✅ 最近搞定(给你信心)
2026-06-22 凌晨 02:30+ (E2E §3.4 验证)
- ✅ #46 nginx path-prefix bug 真修好(之前 2026-06-22 凌晨已改配置,本次 admin token 验证三端点全部到 backend)
- ✅ #54 E2E §3.4 验证完成:
/api/admin/high-risk/whitelist→ HTTP 200 +{"code":2001,"message":"高危操作需要 OTP 二次验证"}(完美:鉴权链通 + #19 中间件工作 + #20 MFA UI 流程就绪) - ✅ #59 admin token 生成命令固化:
backend/scripts/gen_admin_token.py+docker exec单行命令,可复现 - ✅ 新发现:
/api/admin/mfa/users端点真不存在(backend 只定义/admin/mfa/reset/{id},无 list)→ 已加 v0.7.1 backlog - ✅ 新坑经验:
http://wecom_it_nginx/api/...容器内 curl 会 301 →https://(nginx 强制 HTTPS 升级),必须用https://+-k
2026-06-22 凌晨 (E2E 浏览器测试 - 用户反馈澄清)
- ⚠️ #61 用户反馈 2 个浏览器 bug:
- 二维码不显示 — 真 bug: 后端
auth_qrcode.py:91-96没返回qrcode_png_base64,前端QrcodeLogin.vue:34-40永远拿不到数据(已查,根因清楚,待修) - /itportal/ 直接出扫码页 — 不是 bug, 是设计: v0.7.0 故意把
/redirect 到/qrcode-login(c389959 feat(portal)),扫码成功后按角色自动跳(/itadmin/ /itagent/ /itdesk/),PortalSelect保留为多角色用户 fallback。原 v0.5.x 是「先选角色再登录」2 步,v0.7.0 改成「先扫码自动识别」1 步。
- 二维码不显示 — 真 bug: 后端
2026-06-22 凌晨(自动跑批)
- ✅ #23
~/Downloads/patch1*已删(backend-patch1-ws-fix.tar.gz21KB +backend-v070-patch1.tar.gz63KB) - ✅ #41 MkDocs 文档站后台跑起来(
http://127.0.0.1:8765/,58 个 markdown,Material theme) - ✅ #58 38 → 13 backend pytest 失败修复(根因:
conftestpatch 路径错 +h5_clientfixture 缺 WecomService mock) - ✅ #49
/api/readydefer 到 v0.7.1,backlog 已存memory/v0.7.1-backlog-2026-06-22.md - ✅ 4 个 agent 状态复核:#14/#17/#19/#20 全部合入 main(commit
bf872da+f564d0e),worktree 分支已清 - ✅ 集成测试再确认:4 套新测试 70 passed(扫码 13 + MFA 21 + 高危 28 + UUID 8)+ WS 8 passed + 4 xfail = 78 + 4 xfail(跟 merge 报告一致)
2026-06-21(凌晨 1 小时 sprint)
🆕 v0.7.0 release 收尾(8 个 worktree → main)
- ✅ #14 阶段 1.1:后端
auth_qrcode.py4 端点(create/poll/scan/confirm) - ✅ #15 阶段 1.2:前端
Login.vue+QrcodeLogin.vue扫码 UI - ✅ #16 阶段 1.3:坐席/管理员域名路由分发(
/itagent//itadmin/) - ✅ #17 阶段 2.1:后端 MFA 服务 + pyotp 集成
- ✅ #18 阶段 2.2:数据库 User MFA 字段 + Alembic migration 023
- ✅ #19 阶段 2.3:高危操作路由白名单 + 中间件(5 类白名单)
- ✅ #20 阶段 2.4:前端 MFA UI(绑定 + 验证 + 高危弹窗 + 管理表格)
- ✅ #21 集成测试 + E2E + 培训文档:E2E-CHECKLIST 176 行 + DEPLOY-QUICK 252 行
🔐 P0/P1 合规修复(#30)
- ✅ WS endpoint
missing argument 'request'(签名 + 8 个回归测试) - ✅ messages.id VARCHAR → UUID(migration 025)
- ✅ nginx access_log 脱敏脚本(删 Authorization/Cookie)
- ✅ Gitea token 撤销流程已文档化(旧 token 已 revoke,新 token 已签发)
🐛 测试修复(#32)
- ✅ wordfilter 1.0.6 API 适配(
Wordfilter()实例 +addWords()+blacklisted()) - ✅ SQLite ARRAY/JSONB 编译补丁(quiz.keywords / themes.palette)
- ✅ conftest autouse 业务表清理(feedback 事务隔离)
- ✅ h5_client 用
127.0.0.1跳过企微 UA 检测 - ✅ wecom mock 默认 name 不覆盖 body.name
- ✅ 测试基线:570 ERROR → 470 passed, 4 xfailed, 64 failed
📦 提交记录
8e748d1docs: CHANGELOG.md 添加 v0.7.0 release 节1255e95docs: v0.7.0 一键部署操作包c33abb6fix(tests): h5_client UA 检测a9b97defix(tests): wordfilter API + SQLite 编译补丁 + 事务隔离e96fbb2docs: v0.7.0 E2E 验收清单bf872dafeat(merge): 4 个 worktree 合入 main- tag v0.7.0 已打
历史(2026-06-16 选重点)
🛠️ Dev 环境(本地链路全通)
- ✅ 本地 dev 4 端链路跑通(#89-92):
- backend (8000) + h5 (5174) + agent (5173) + admin (5175) + portal (5176) 全起
- Mock 企微 OAuth 全通(
/api/dev/login给 token) - portal → H5 / 坐席 / 管理员 跳转正常
- ✅ 修了 3 个 dev 启动坑:
pydantic==2.7.5→2.7.4(2.7.5 被 PyPI yank)- docker-compose 加
PYTHONPATH=/app(alembic 1.13+ 不再默认 prepend cwd) - dev 启动必须用
--env-file .env.dev(根.env冲突)
🐛 Bug 修复
- ✅ #93 修 portal dev 模式跳错端口:
import.meta.env.DEV判断,生产走相对路径,dev 走完整 URL - ✅ #97 修 require_role 装饰器:
@wraps让 FastAPI 看到__wrapped__签名,Depends 未被解析 →current_user实际是 Depends 对象。用inspect合并 signature + 手动设wrapper.__signature__修 - ✅ #99 dev 模式短路企微推送:避免
.env.dev用dev_corp_id_xxxxx调企微 API 返invalid corpid噪音
🗃️ 数据库 migration(3 个)
- ✅ #94 alembic 010:加
agents.otp_secret+agents.otp_enabled - ✅ #94 alembic 011:加
conversations.impact_scope+is_blocking+emotion_state(用户坐席发消息 500 的真因) - ✅ #96 alembic 012:加
conversations.dify_conversation_id+employees.it_level+it_level_source+notes
🛡️ 防错工具(留底用)
- ✅ #95 dev-check-schema-drift.ps1:对比 SQLAlchemy 模型 vs Postgres schema,漂移 exit 1。以后模型加字段忘 migration 一跑就发现(用 docker exec,免去 Python 依赖)
📋 其他
- ✅ #68 H5 空白页闪一下:dev 模式验证不再白屏(生产未复测)
历史(选重点)
- ✅ v0.5.5:应急页 v0.5.4 + 移除 IT 设备升级 + admin 登录修复 + 内容审核架构
- ✅ v0.5.3:重打后端部署包(5 IT + 2 HR + 1 行政 + 1 财务 = 9 条)
- ✅ v0.5.6-dev-tooling 已 tag + push gitea(本地 dev 工具集)
- ✅ messages.id varchar=UUID SQL bug 修了(#60)+ 10 个回归测试通过
- ✅ nginx /api/admin/ 和 /itadmin/ 修复 403/allow(#57)
🚀 怎么跑起来(3 步)
1. 后端 dev(已经在跑 ✅)
cd D:\资料\03-项目开发\wecom_it_smart_desk-claude
docker compose -f docker-compose.dev.yml --env-file .env.dev up -d
curl http://localhost:8000/api/dev/health
2. 前端 dev(已经在跑 ✅)
# 一次性装 4 个前端依赖(已装好)
.\scripts\dev-frontend-install.ps1
# 之后:一起起所有前端
.\scripts\dev-frontend-start.ps1
# 单独停:.\scripts\dev-frontend-start.ps1 -Stop
3. 浏览器验证
- portal:http://localhost:5176/itportal/select
- H5:http://localhost:5174/itdesk/
- 坐席:http://localhost:5173/itagent/
- 管理员:http://localhost:5175/itadmin/
📌 怎么读这份文档
你是运维小白,不需要懂代码。看这个文件就能 1 分钟懂:
- "现在在干嘛?" → 看「正在做」表
- "接下来要干嘛?" → 看「P0 必做」表
- "我需要做什么?" → 看「正在做」表里的「你做什么」列
- "今天有啥进展?" → 看「最近搞定」
🤖 Claude 怎么帮你
每次开新 session 我会:
- 第一件事:读这个文件 + TaskList,告诉你"上次到这了"
- 完成一件重要事:更新这个文件(改状态、加完成项)
- 遇到阻塞:写在「P2 / 等用户决策」里,等你回话
- 新需求进来:跟当前 in_progress 比较,看是接着做还是并行加(参考你的"并行处理"反馈)
这个文件就是你和 Claude 之间的"工作交接本"。有问题改这里就行。