7.1 KiB
7.1 KiB
孕育无忧 H5 应用修改记录
项目: app_03 (孕育无忧 — H5 小程序嵌入式) 时间跨度: 2026-05-21 ~ 2026-05-27 技术栈: FastAPI + MongoDB + React 18 + Vite 6
一、认证流程演进(4 次重构)
Phase 1: JWT 直传(80904e6 ~ 1eef3ae)
方案: 小程序 ?token=JWT → H5 decodeToken → 后端 verify_signature=False 按 openid 查/创建用户
关键改动:
- 后端
get_current_user取消签名验证 - JWT payload 字段调整为
{uid, openid, phone} - 前端
decodeToken()解析 token - 无需小程序手动传递 uid,仅 token 即可
问题: 小程序端 web-view URL 中 openid= 为空值 → 走 dev-login 分支 → 数据库记录 name='开发测试用户'
Phase 2: 参数直传(1eef3ae)
方案: ?uid=&openid=&phone= → 前端 createDummyToken() 构建本地 JWT → 直接登录
关键改动:
- 新增
createDummyToken()函数,前端构造 base64 编码的 JWT - JWT base64url 解码需
replace(/-/g,'+').replace(/_/g,'/') - 新增
/auth/params-login后端接口(可选,暂不需要) - 移除 paramsLogin API 调用,纯前端完成
问题: URL 传 3 个参数太繁琐,小程序端需要额外处理手机号敏感信息
Phase 3: 统一调试(150dafc ~ bceb4f4)
新增功能:
services/debug.ts— 统一调试模块:isDebug(),debugLog(),getDebugLogs()- 通过
.env中VITE_DEBUG=true控制,开发默认开启,生产关闭 - LoginPage 自动记录登录流程;ProfilePage 按条件显示调试面板
- 头像支持:后端
UserProfileUpdate新增avatar_url字段 - ProfilePage 头像卡片显示真实头像(有 avatar_url 时)
- ProfilePage 增加用户姓名编辑字段
Phase 4: CRMEB 代理(bceb4f4 ~ 96a938e,当前版本)
方案: ?openid=xxx(单参数)→ 后端 openid-login → 调 CRMEB 内部接口获取信息 → 自动补齐
关键改动(96a938e):
后端:
- 新增
POST /auth/openid-login— 接收 openid,调 CRMEB 获取 nickname/phone/avatar config.py新增crmeb_base_url、crmeb_api_key- 查找/创建用户时自动同步:name、phone、avatar_url
前端:
- LoginPage 简化:检测 openid → 调 openid-login → 跳转
- UserContext 修复 avatar_url 未映射导致头像不显示
CRMEB 端(外部):
- 新增
InternalController,GET /api/internal/user-info?openid=xxx X-Internal-KeyHeader 认证,硬编码密钥(后续改为 config 读取)
二、完整 Commit 清单
| SHA | 时间 | 类型 | 摘要 |
|---|---|---|---|
96a938e |
05/27 22:24 | feat | openid-login + avatar_url 修复 — CRMEB 代理登录方案最终版 |
bceb4f4 |
05/27 20:24 | feat | 支持从小程序获取微信头像和昵称同步到 H5 |
150dafc |
05/27 20:19 | feat | 统一调试模块 debug.ts,VITE_DEBUG 环境变量控制 |
27b5856 |
05/27 18:52 | cleanup | 移除所有调试代码,登录页精简 |
1eef3ae |
05/27 18:48 | refactor | 小程序参数直传 uid/openid/phone,前端构建本地 token |
8c50afc |
05/27 03:44 | feat | 小程序 web-view Token 传递问题分析与修复方案 |
6dc6258 |
05/27 03:07 | feat | H5 登录调试面板,URL 信息显示 |
5a0f1f4 |
05/27 02:27 | feat | API 前缀配置调整,Vite 代理更新 |
fe116b9 |
05/27 02:19 | feat | 调试面板 |
80904e6 |
05/27 01:49 | feat | 按 openid 查找/创建用户,调整 JWT 负载字段 |
3506731 |
05/23 02:15 | fix | 修复 DEV_MODE 解析 |
08df182 |
05/23 01:59 | refactor | 简化 H5 应用用户授权 |
53128a6 |
05/22 00:51 | feat | 添加 serv.sh 服务管理脚本 |
ded7ea1 |
05/21 20:56 | feat | 新增可配置路径前缀支持子路径部署 |
fd1aea1 |
05/21 17:10 | build | 配置部署子路径 /app_03/ |
409daba |
05/21 00:46 | feat | 初始化项目基础代码结构 |
三、新增/修改文件清单
新增文件
| 文件 | 目的 |
|---|---|
frontend/src/app/services/debug.ts |
统一调试模块:日志记录/读取/清除 |
backend/serv.sh |
服务管理脚本(start/stop/restart/logs) |
docs/crmeb-internal-api-plan.md |
CRMEB 内部接口方案文档 |
.env.example |
环境变量模板 |
关键修改文件
| 文件 | 变化 |
|---|---|
frontend/src/app/pages/LoginPage.tsx |
3 次重写:token 解码 → 参数直传 → openid-login |
frontend/src/app/pages/ProfilePage.tsx |
添加头像显示、姓名编辑、调试面板 |
frontend/src/app/services/api.ts |
添加 fetchApi export、createDummyToken |
frontend/src/app/context/UserContext.tsx |
修复 avatar_url 映射 |
frontend/.env |
添加 VITE_API_PREFIX、VITE_DEBUG、VITE_UPLOADS_PREFIX |
backend/app/config.py |
添加 crmeb_base_url、crmeb_api_key |
backend/app/routers/auth.py |
添加 openid-login 接口、dev-login 调整 |
backend/app/schemas/user.py |
UserProfileUpdate 添加 avatar_url |
backend/app/middleware/auth.py |
verify_signature=False |
backend/app/models/user.py |
添加 avatar_url 字段 |
四、部署与运维记录
服务器信息
| 项目 | 地址 |
|---|---|
| app_03 服务 | 8.145.39.61:8030(uvicorn) |
| CRMEB 服务 | 8.130.191.152:20199(Swoole) |
| H5 入口 | https://mp.yizhezhe.com/app_03/ |
| Git 远程 | gitea@git@git@gitea.nexjs.com:jone/app_03_pregnancy.git |
部署关键点
- Nginx 尾随斜杠问题:
location = /app_03 { return 301 /app_03/; }必须带,否则丢 query 参数 - API 代理:前后端统一使用
/app_03/api/*路径,Nginx rewrite 剥离前缀 - 后端重启命令:
fuser -k 8030/tcp && sleep 2 && \ nohup env DEV_MODE=1 .venv/bin/uvicorn app.main:app \ --host 127.0.0.1 --port 8030 --workers 1 > app.log 2>&1 & - 前端构建:
cd frontend && npm run build scp -r dist/* root@8.145.39.61:/opt/app/app_03_pregnancy/frontend/dist/
服务器 Git 管理
- 服务器仓库 reset 到 1eef3ae(合并前状态),remote 指向 gitea
- 回滚后 HEAD 在 96a938e,状态 clean
- 本地实现新功能后再 push 到 gitea,服务器 pull 部署
五、测试账号
| 角色 | openid | 手机号 | 昵称 |
|---|---|---|---|
| 真实用户 | oauWC1zc7hVn3j60QwkuHyjGn03Y |
13693687880 | 枫逸 |
| 开发测试 | dev_test_account_001 |
13800000000 | 开发测试用户 |
六、废弃方案记录
| 方案 | 原因 | commit |
|---|---|---|
| JWT 签名验证 | 小程序 token 无法共享签名密钥,改为不验签 | — |
jwt-yun exchange-code |
外部服务不可用 | — |
URL 传 3 参数 (?uid=&openid=&phone=) |
参数繁琐,敏感信息暴露 | 1eef3ae |
| paramsLogin 后端接口 | 纯前端可完成,不需要额外 API | 1eef3ae |
| 前端 createDummyToken() | 替代为后端 openid-login 返回 token | bceb4f4 |
七、待办项
- CRMEB InternalController 密钥从 config 读取(当前硬编码)
- 小程序端 web-view URL 改为
?openid=单参格式 - 前后端代码 commit + push 到 gitea
- 服务器 deploy 最新代码