简介
本开发文档面向 DouPHP 小程序“个人信息管理”模块,覆盖用户个人资料的查看与编辑、头像上传、昵称设置、社交账号绑定(微信等)、工作信息列表与权限控制、表单验证、图片上传、数据同步、隐私保护与用户体验优化等方面。文档以代码级为依据,提供端到端的数据流与调用时序说明,并给出可落地的实现建议与排错指引。
项目结构
个人信息管理在小程序前端位于 miniprogram/company/pages/user 目录,后端 API 位于 api/controller/user 目录。主要涉及:
- 个人资料编辑:edit.ts + UserController::edit / editPost / uploadAvatar
- 社交账号绑定:sns.ts / sns_link.ts + UserController::sns / WeixinController::login
- 工作信息列表:work.ts + WorkController::index
graph TB
subgraph "小程序前端"
E["pages/user/edit.ts"]
S["pages/user/sns.ts"]
SL["pages/user/sns_link.ts"]
W["pages/user/work.ts"]
end
subgraph "API 控制器"
UC["UserController.php"]
WC["WeixinController.php"]
WK["WorkController.php"]
end
E --> UC
S --> UC
S --> WC
SL --> UC
W --> WK
图表来源
- edit.ts:20-37
- sns.ts:35-47
- sns_link.ts:20-31
- work.ts:54-81
- UserController.php:421-496
- WeixinController.php:108-379
- WorkController.php:62-108
章节来源
- edit.ts:20-37
- sns.ts:35-47
- sns_link.ts:20-31
- work.ts:54-81
- UserController.php:421-496
- WeixinController.php:108-379
- WorkController.php:62-108
核心组件
- 个人资料编辑
- 前端:edit.ts 负责加载资料、提交基本信息、选择并上传头像
- 后端:UserController::edit 返回可编辑字段;editPost 校验并更新;uploadAvatar 处理头像存储与回写
- 社交账号绑定
- 前端:sns.ts 展示已绑定的第三方平台,发起微信授权登录;sns_link.ts 获取绑定入口页数据
- 后端:UserController::sns 列出插件列表并支持解绑;WeixinController::login 完成 code 换 session、绑定 user_sns、发放 token
- 工作信息列表
- 前端:work.ts 分页拉取用户列表,带权限检查
- 后端:WorkController::index 校验工作端权限后返回用户列表及统计
章节来源
- edit.ts:20-101
- UserController.php:421-496
- UserController.php:731-745
- sns.ts:35-130
- WeixinController.php:108-379
- work.ts:20-99
- WorkController.php:62-108
架构总览
个人信息管理采用前后端分离的 REST 风格交互:小程序通过 http 服务调用路由对应的 API 控制器方法,控制器内组合多个 Service/Facade 完成业务逻辑,最终统一以 ApiResponse 返回结果。
sequenceDiagram
participant U as "用户"
participant FE as "小程序前端<br/>edit.ts"
participant API as "API 控制器<br/>UserController.php"
participant SVC as "服务层<br/>ProfileService/Attachment"
participant DB as "数据库"
U->>FE : 打开个人资料编辑页
FE->>API : GET user.edit
API->>SVC : 构建可编辑资料
SVC-->>API : 资料数据
API-->>FE : 返回 title, user_info
U->>FE : 修改昵称/手机/地址等
FE->>API : POST user.edit_post
API->>DB : 校验并更新用户资料
DB-->>API : 成功
API-->>FE : 成功消息
U->>FE : 选择头像并上传
FE->>API : POST user.upload_avatar (multipart)
API->>SVC : 存储头像并生成URL
SVC-->>API : 返回 file_url
API-->>FE : 返回 file_url
图表来源
- edit.ts:20-37
- edit.ts:45-70
- edit.ts:72-101
- UserController.php:421-496
- UserController.php:731-745
详细组件分析
个人资料编辑与头像上传
- 功能要点
- 页面加载时请求 user.edit 获取可编辑字段与标题
- 提交 user.edit_post 进行字段校验(昵称、联系方式、手机、地址、邮编等),并通过 ProfileService 更新资料
- 头像上传使用 wx.chooseImage + wx.uploadFile 调用 user.upload_avatar,后端将图片写入存储并回写 user.avatar 字段,返回新 URL
- 数据流与校验
- 后端对 nickname/contact/phone/address/postcode 等进行非法字符校验
- 昵称唯一性校验避免重复
- 头像上传限制尺寸(宽度 200)并记录上传者
- 错误处理
- 前端统一通过 douMsg 提示错误
- 后端抛出 DomainException 携带错误信息
flowchart TD
Start(["进入编辑页"]) --> Load["请求 user.edit"]
Load --> EditUI["渲染表单"]
EditUI --> Submit{"提交表单?"}
Submit -- 否 --> Avatar{"上传头像?"}
Avatar -- 是 --> Upload["wx.uploadFile -> user.upload_avatar"]
Upload --> UpdateAvatar["后端存储并更新 avatar"]
UpdateAvatar --> ReturnUrl["返回 file_url"]
ReturnUrl --> EditUI
Avatar -- 否 --> End(["结束"])
Submit -- 是 --> Validate["后端校验字段"]
Validate --> Valid{"校验通过?"}
Valid -- 否 --> ShowErr["显示错误"]
ShowErr --> EditUI
Valid -- 是 --> Save["保存资料"]
Save --> Success["提示成功并跳转"]
Success --> End
图表来源
- edit.ts:20-37
- edit.ts:45-70
- edit.ts:72-101
- UserController.php:421-496
- UserController.php:731-745
章节来源
- edit.ts:20-101
- UserController.php:421-496
- UserController.php:731-745
社交账号绑定(微信)
- 功能要点
- sns.ts 展示已绑定平台列表,支持解绑
- 微信授权流程:获取 userInfo 与 login code,调用 user.weixin.login 完成绑定或自动注册
- WeixinController::login 根据 openid/unionid 匹配用户,必要时创建新用户并绑定 user_sns,发放 API token
- 安全与幂等
- IP 限频防止暴力登录
- unionid/openid 优先匹配,避免多账号分裂
- 未绑定场景支持仅返回 sns 信息供前端引导
sequenceDiagram
participant FE as "小程序前端<br/>sns.ts"
participant WX as "微信客户端"
participant API as "WeixinController.php"
participant DB as "数据库"
FE->>WX : 获取用户授权与登录code
FE->>API : GET user.weixin.login(code, rawData, signature, iv, encryptedData)
API->>API : 校验IP限频/参数
API->>DB : 按openid/unionid查找用户
alt 找到用户
API->>DB : 更新登录次数/可选绑定手机号
API-->>FE : 返回user_id与token
else 未找到用户
API->>DB : 创建新用户并插入user_sns
API-->>FE : 返回user_id与token
end
图表来源
- sns.ts:49-112
- WeixinController.php:108-379
章节来源
- sns.ts:35-130
- sns_link.ts:20-31
- UserController.php:555-582
- WeixinController.php:108-379
工作信息列表与权限控制
- 功能要点
- work.ts 在 onShow 中执行鉴权与权限检查 checkWorkPermission('user')
- 分页拉取 user.work,后端 WorkController::index 校验权限后返回用户列表、等级、积分、金额、最后登录时间等
- 数据展示
- 前端支持上拉加载更多,后端分页返回
sequenceDiagram
participant FE as "小程序前端<br/>work.ts"
participant API as "WorkController.php"
participant DB as "数据库"
FE->>FE : onShow 鉴权+权限检查
FE->>API : GET user.work?page=1
API->>API : 检查工作端权限
API->>DB : 分页查询用户表
DB-->>API : 用户列表
API-->>FE : 返回user_list
FE->>API : 上拉加载更多 page++
API-->>FE : 追加数据
图表来源
- work.ts:36-99
- WorkController.php:62-108
章节来源
- work.ts:20-99
- WorkController.php:62-108
概念总览
以下为个人信息管理的概念流程图,帮助理解整体交互与职责边界:
flowchart LR
A["用户操作"] --> B["小程序页面"]
B --> C["HTTP 请求"]
C --> D["API 控制器"]
D --> E["服务层/存储"]
E --> F["数据库/对象存储"]
F --> E
E --> D
D --> C
C --> B
[此图为概念图,不直接映射具体源码]
依赖关系分析
- 前端依赖
- stores/authStore、commonStore 用于鉴权与站点配置
- services/http 封装网络请求
- utils/route 生成路由路径
- utils/ui 提供统一提示
- 后端依赖
- ProfileService、UserService、UserAuthService、ApiTokenService 等
- Storage/Attachment 处理文件存储
- DB Facade 进行数据访问
- ApiResponse 统一响应格式
graph LR
FE["小程序前端<br/>edit.ts/sns.ts/work.ts"] --> HTTP["http 服务"]
HTTP --> Route["route 工具"]
Route --> API["UserController/WeixinController/WorkController"]
API --> SVC["ProfileService/UserService/..."]
API --> ATT["Attachment/Storage"]
API --> DB["DB Facade"]
图表来源
- edit.ts:2-6
- sns.ts:2-6
- work.ts:2-8
- UserController.php:17-43
- WeixinController.php:17-35
- WorkController.php:17-26
章节来源
- edit.ts:2-6
- sns.ts:2-6
- work.ts:2-8
- UserController.php:17-43
- WeixinController.php:17-35
- WorkController.php:17-26
性能考虑
- 前端
- 头像上传前压缩与选择原图/压缩图,减少带宽占用
- 列表分页加载,避免一次性拉取大量数据
- 后端
- 头像存储时限制图片宽度,降低存储与传输成本
- 登录接口 IP 限频,防止滥用
- 使用分页与只取必要字段,减少数据库压力
故障排查指南
- 常见问题
- 登录态失效:检查 Authorization 头是否携带有效 token,必要时重新登录
- 头像上传失败:确认文件类型与大小,检查后端存储路径与权限
- 微信绑定失败:核对 appid/appsecret 配置,检查 code 有效性
- 工作端无权限:确认当前用户是否具备工作端角色
- 定位方法
- 前端:通过 douMsg 捕获的错误信息进行初步判断
- 后端:关注 DomainException 抛出的错误信息与日志
章节来源
- edit.ts:31-36
- edit.ts:66-68
- sns.ts:44-46
- WeixinController.php:116-134
- WorkController.php:64-67
结论
个人信息管理模块围绕“资料编辑、头像上传、社交绑定、工作信息”四大能力展开,前后端职责清晰、数据流明确。通过严格的字段校验、权限控制与统一的错误处理,保障了功能的稳定性与安全性。建议在后续迭代中继续完善隐私脱敏展示、更细粒度的权限策略以及更丰富的交互反馈,以提升用户体验。
附录
- 关键接口与用途
- user.edit / user.edit_post:获取与更新个人资料
- user.upload_avatar:上传头像并更新用户头像字段
- user.sns / user.sns_link:第三方账号管理与绑定入口
- user.weixin.login:微信小程序登录与绑定
- user.work:工作端子用户列表(需权限)
- 推荐实践
- 表单侧做基础校验,服务端再做强校验
- 敏感信息(如手机号、邮箱)在列表页进行脱敏展示
- 所有写操作均需在鉴权后进行,并对异常进行统一处理
- 图片上传增加类型与大小限制,并在前端预览提升体验