文档目录
用户资料API

简介

本文件为用户资料管理模块的完整API参考,覆盖以下能力:

  • 用户个人信息获取、更新
  • 修改密码、退出登录
  • 头像上传
  • 联系方式(地址簿)增删改查、设为默认
  • 数据验证规则(字段格式、必填项、完整性)
  • 隐私保护(敏感信息脱敏、访问权限控制)
  • 多端一致性与同步建议

项目结构

用户资料相关API位于API层控制器中,业务逻辑下沉至服务层,路由集中声明。认证通过中间件在HTTP边界完成。

graph TB
Client["客户端"] --> MW["UserAuthMiddleware<br/>鉴权中间件"]
MW --> Route["路由 user.php<br/>user/*, user/contact/*"]
Route --> UC["UserController<br/>个人资料/密码/头像/文件"]
Route --> CC["ContactController<br/>地址簿CRUD"]
UC --> PS["ProfileService<br/>资料装配/更新/昵称占用检测"]
CC --> CS["ContactService<br/>地址簿读写/默认地址"]
PS --> DB[("数据库: user / user_contact")]
CS --> DB

核心组件

  • 用户资料控制器:提供会员中心首页、注册/登录/找回密码、资料编辑保存、修改密码、第三方账号管理、地区数据、文件上传、头像上传、登录态检查等。
  • 联系人(地址簿)控制器:提供地址列表、新增、编辑、删除、设为默认、JSON列表与详情。
  • 资料服务:负责资料装配、更新、昵称占用检测、默认收货地址快照合并等。
  • 联系人服务:负责地址簿分页、新增/更新/删除、默认地址设置、JSON列表与详情、contact_id解析。
  • 认证中间件:从请求头提取Bearer Token,校验登录态与工作身份,未授权返回统一错误。

架构总览

  • 认证与授权:所有需要登录的接口均受中间件保护,未携带有效Token或Token失效将返回401;涉及工作身份的接口会进一步校验并可能返回403。
  • 路由组织:以 user 为根路径,子资源 contact 独立分组;所有动作通过声明式路由映射到控制器方法。
  • 分层设计:控制器仅做参数校验与响应组装,核心逻辑委托服务层;服务层再调用模型与基础设施(存储、审计日志等)。
sequenceDiagram
participant C as "客户端"
participant M as "鉴权中间件"
participant R as "路由"
participant U as "UserController"
participant S as "ProfileService"
participant D as "数据库"
C->>M : 携带Authorization : Bearer <token>
M-->>C : 401/403(失败时终止)
M->>R : 通过鉴权
R->>U : 调用 edit_post / upload_avatar 等
U->>S : updateProfile / 头像处理
S->>D : 写入 user / user_contact
D-->>S : 成功
S-->>U : 结果
U-->>C : ApiResponse.success(...)

详细组件分析

用户资料接口(UserController)

  • 会员中心首页:返回基础资料、登录状态、VIP/工作/分销详情等聚合数据。
  • 注册/登录/找回密码:表单与提交接口,含验证码校验、邮箱短信通道选择、推广关系登记。
  • 资料编辑:
    • 读取可编辑资料(包含默认地址快照、头像URL、性别选项等)。
    • 保存资料:对昵称、联系方式、电话、姓名、国家、省份、地址、邮编进行校验;若昵称变更则检测是否被其他用户占用;最终调用服务层更新用户主表与默认收货地址。
  • 修改密码:校验旧密码与新密码,成功后要求重新登录。
  • 退出登录:吊销当前设备的API会话Token。
  • 第三方账号管理:列出可用插件、支持解绑。
  • 省市区数据:根据类型返回初始化或级联列表。
  • 文件上传/删除:通用文件框,支持草稿模式与图片尺寸、水印、业务字段标记。
  • 头像上传:按用户维度存储并回写头像字段,返回文件URL。
  • 登录态检查:用于小程序侧判断当前Token有效性。
flowchart TD
Start(["edit_post 入口"]) --> V["参数校验<br/>nickname/phone/address/postcode等"]
V --> N{"昵称是否变更?"}
N -- 是 --> Check["检测昵称是否被其他用户占用"]
N -- 否 --> Build["构建更新数据"]
Check --> |占用| Err["抛出领域异常(重复昵称)"]
Check --> |未占用| Build
Build --> Update["调用 ProfileService.updateProfile"]
Update --> Done(["返回成功"])
Err --> End(["结束"])
Done --> End

地址簿接口(ContactController)

  • 列表:分页返回当前用户的地址条目。
  • 新增/编辑:校验名称、电话、地址,中文环境下强制手机号格式;可选启用省市区必填;插入或更新后返回ID。
  • 删除:按用户隔离删除指定地址。
  • 设为默认:将指定地址设为默认,同时清空其他默认。
  • JSON列表/详情:供订单/预约等场景下拉选择与详情展示。
  • contact_id解析:优先使用传入ID,否则回退到默认或最新地址。
sequenceDiagram
participant C as "客户端"
participant CC as "ContactController"
participant CS as "ContactService"
participant DB as "数据库"
C->>CC : POST /api/user/contact/store
CC->>CC : 校验 name/phone/address/province/city
CC->>CS : insertContact(userId, data)
CS->>DB : 写入 user_contact
DB-->>CS : 新ID
CS-->>CC : ID
CC-->>C : {contact_id, 消息}

认证与权限(UserAuthMiddleware)

  • 从请求头 Authorization: Bearer &lt;token> 解析API会话Token。
  • 未登录返回401,无工作身份返回403。
  • 注入上下文后由后续控制器执行具体业务。

依赖关系分析

  • 控制器依赖服务:UserController 依赖 ProfileService、UserService、UserPasswordService、ApiTokenService 等;ContactController 依赖 ContactService。
  • 服务依赖基础设施:ProfileService 通过 User 模型、UserContactQuery、审计日志等;ContactService 通过 UserContact 模型。
  • 路由与中间件:所有受保护的接口经 UserAuthMiddleware 前置校验,路由文件集中声明 user 与 user/contact 的动作集合。
graph LR
UC["UserController"] --> PS["ProfileService"]
UC --> UPS["UserPasswordService"]
UC --> ATS["ApiTokenService"]
CC["ContactController"] --> CS["ContactService"]
PS --> UQ["UserContactQuery"]
CS --> UM["UserContact Model"]

性能与一致性

  • 数据一致性
    • 资料更新:服务层将收货相关字段上写到默认收货地址行,用户主表只保留非收货字段,减少冗余与冲突。
    • 默认地址:设为默认时会先清空其他默认,保证唯一性。
  • 性能要点
    • 列表分页:地址簿采用分页查询,避免一次性加载大量数据。
    • 头像与文件:上传时限制图片宽度、支持草稿模式,降低带宽与存储压力。
  • 多端一致性建议
    • 客户端缓存策略:本地缓存用户资料与地址簿,网络失败时降级显示;更新成功后主动刷新。
    • 冲突解决:服务端为权威源;客户端在提交前尽量复用服务端最新数据(如昵称可用性检查)。
    • 离线编辑:利用文件草稿机制暂存内容,待正式提交时持久化。

故障排查指南

  • 401 未登录
    • 检查请求头是否携带有效的 Authorization: Bearer &lt;token>。
    • 确认Token未过期且未被注销(logout会吊销)。
  • 403 无工作身份
    • 该接口需要工作身份,请确认当前用户具备相应角色。
  • 资料更新失败
    • 常见原因:昵称重复、非法字符、必填项缺失。查看返回的错误字段定位问题。
  • 地址簿操作失败
    • 中文环境需符合手机号格式;省市区开启时需填写对应字段;删除需确保属于当前用户。
  • 头像上传失败
    • 检查文件类型、大小、服务器存储配置;确认已正确传递 avatar 字段。

结论

本模块通过清晰的控制器-服务分层、严格的参数校验与统一的鉴权中间件,提供了完整的用户资料管理能力。结合默认地址快照、文件草稿与分页优化,兼顾了易用性与性能。建议在客户端实现合理的缓存与重试策略,以保证多端数据一致性与用户体验。

附录:接口参考

认证与会话

  • 获取登录态
    • 方法:GET
    • 路径:/api/user/check_login_state
    • 说明:检查当前Bearer Token是否有效,返回登录状态。
    • 鉴权:需要登录。
    • 响应:包含登录状态字段。
  • 退出登录
    • 方法:POST
    • 路径:/api/user/logout
    • 说明:吊销当前设备API会话Token。
    • 鉴权:需要登录。
    • 响应:空数据。

个人资料

  • 会员中心首页
    • 方法:GET
    • 路径:/api/user/index
    • 说明:返回基础资料、登录状态、VIP/工作/分销详情等聚合数据。
    • 鉴权:需要登录。
    • 响应:包含 title、welcome、link_user_center、if_connect_plugin、dou.user、dou.auth、dou.vip、dou.work、dou.distribution。
  • 获取可编辑资料
    • 方法:GET
    • 路径:/api/user/edit
    • 说明:返回可编辑的用户资料(含默认地址快照、头像URL、性别选项等)。
    • 鉴权:需要登录。
    • 响应:包含 title、user_info。
  • 保存资料
    • 方法:POST
    • 路径:/api/user/edit_post
    • 说明:更新昵称、联系方式、电话、姓名、国家、省份、地址、邮编等;若昵称变更会检测占用。
    • 鉴权:需要登录。
    • 请求体关键字段:nickname、contact/first_name/last_name、phone、country、province、address、postcode、sex、defined(自定义字段)。
    • 响应:成功返回空数据;失败返回字段级错误。
  • 修改密码
    • 方法:POST
    • 路径:/api/user/password_post
    • 说明:校验旧密码与新密码,成功后返回要求重新登录。
    • 鉴权:需要登录。
    • 请求体关键字段:old_password、password、password_confirmation。
    • 响应:包含 relogin=true 及成功消息。
  • 头像上传
    • 方法:POST
    • 路径:/api/user/upload_avatar
    • 说明:上传头像并更新用户头像字段,返回文件URL。
    • 鉴权:需要登录。
    • 请求体:multipart/form-data,字段名为 avatar。
    • 响应:包含 file_url。

地址簿(联系方式)

  • 地址列表
    • 方法:GET
    • 路径:/api/user/contact
    • 说明:分页返回当前用户地址条目。
    • 鉴权:需要登录。
    • 响应:包含 title、contact_list、pager。
  • 新增地址
    • 方法:POST
    • 路径:/api/user/contact/store
    • 说明:新增地址,中文环境强制手机号格式;可选启用省市区必填。
    • 鉴权:需要登录。
    • 请求体关键字段:name、phone、address、province、city、district、id_card、tag、is_default。
    • 响应:包含 contact_id 与成功消息。
  • 编辑地址
    • 方法:POST
    • 路径:/api/user/contact/update
    • 说明:更新地址,校验规则同新增。
    • 鉴权:需要登录。
    • 请求体关键字段:id、name、phone、address、province、city、district、id_card、tag。
    • 响应:包含 contact_id 与成功消息。
  • 删除地址
    • 方法:POST
    • 路径:/api/user/contact/destroy
    • 说明:删除指定地址。
    • 鉴权:需要登录。
    • 请求体关键字段:id。
    • 响应:成功消息。
  • 设为默认
    • 方法:POST
    • 路径:/api/user/contact/set
    • 说明:将指定地址设为默认,同时清空其他默认。
    • 鉴权:需要登录。
    • 请求体关键字段:id。
    • 响应:成功消息。
  • JSON地址列表
    • 方法:POST
    • 路径:/api/user/contact/list_json
    • 说明:供订单/预约等下拉选择。
    • 鉴权:需要登录。
    • 请求体关键字段:contact_id(可选,传0取默认)。
    • 响应:包含 contact_list。
  • 地址详情
    • 方法:POST
    • 路径:/api/user/contact/info
    • 说明:返回单条地址详情。
    • 鉴权:需要登录。
    • 请求体关键字段:contact_id(可选,传0取默认)。
    • 响应:包含 contact。

数据验证规则

  • 资料更新(edit_post)
    • nickname:必填,禁止非法字符;若变更需检测是否被其他用户占用。
    • contact/first_name/last_name:必填,禁止非法字符(按语言切换)。
    • phone:必填,禁止非法字符。
    • country/province/address/postcode:允许为空,但需通过非法字符校验。
  • 地址簿(store/update)
    • name/phone/address:必填,禁止非法字符;中文环境下 phone 需符合手机号格式。
    • province/city/district:当启用地区功能时为必填。
  • 修改密码(password_post)
    • password/password_confirmation:必填,符合密码强度规则。

隐私与安全

  • 敏感信息脱敏
    • 资料聚合接口不返回密码、令牌、支付码等凭证类字段。
  • 访问权限控制
    • 所有需要登录的接口受鉴权中间件保护;未登录返回401;无工作身份返回403。
  • 安全输入
    • 资料与地址写入前进行XSS过滤与非法字符校验。
  • 文件安全
    • 头像与文件上传支持图片宽度限制、水印、草稿模式与业务字段标记,防止滥用。

典型请求与响应示例(描述性)

  • 个人资料更新
    • 请求:POST /api/user/edit_post,包含 nickname、phone、address、postcode、sex、defined 等。
    • 成功:返回空数据。
    • 失败:返回字段级错误,如 nickname 重复、非法字符等。
  • 头像上传成功
    • 请求:POST /api/user/upload_avatar,multipart/form-data,字段 avatar。
    • 成功:返回 file_url。
  • 信息修改失败
    • 请求:POST /api/user/edit_post,包含不符合规则的字段。
    • 失败:返回错误信息与字段提示。
添加日期:2026-10-05