Skip to content

用户 API

用户接口维护建档资料、健康指标、疾病史、手术史和头像。所有 endpoint 都要求 Bearer JWT,后端用当前 token 解析出的 user_id 作为归属边界。

Endpoint 索引

MethodPath用途
PUT/api/user/basic-info更新基本资料。
PUT/api/user/health-metrics更新健康指标与肿瘤相关字段。
POST/api/user/diseases新增疾病史。
PUT/api/user/diseases/{disease_id}更新本人疾病史。
DELETE/api/user/diseases/{disease_id}删除本人疾病史。
POST/api/user/operations新增手术史。
PUT/api/user/operations/{operation_id}更新本人手术史。
DELETE/api/user/operations/{operation_id}删除本人手术史。
GET/api/user/profile-completion读取建档完成度。
POST/api/user/avatar通过后端上传头像。
POST/api/user/avatar/upload-policy获取头像直传策略或本地上传指示。
POST/api/user/avatar/confirm确认 OSS 直传头像。
DELETE/api/user/avatar删除头像。
GET/api/user/avatar读取头像地址。
GET/api/user/profile读取完整用户档案。
GET/api/user/profile/basic读取运动计算所需基础资料。

Endpoint 契约

资料与健康指标

PUT /api/user/basic-info

内容
Requestuser_nicknameuser_nameid_nogenderbirthemailaddress
Responsesuccessupdated_fields
Errors400 字段校验;401500
ConsumerUserApiClient.updateBasicInfo
Handleruser.update_basic_info
DB Touchpoints更新 users;写 update_logs
Teststests/api/test_user.pytests/services/test_user_service.py

PUT /api/user/health-metrics

内容
Requestheightweightbloodtype、血压、肿瘤相关字段
Responsesuccessprofile_id
Errors400 范围/格式;401500
ConsumerUserApiClient.updateHealthMetrics
Handleruser.update_health_metrics
DB Touchpoints更新 user_profiles;写 update_logs
Teststests/api/test_user.pytests/services/test_user_service.py

GET /api/user/profile-completion

内容
Request
Response完成百分比、缺失字段、疾病/手术记录状态
Errors401500
ConsumerUserApiClient.getProfileCompletion
Handleruser.get_profile_completion
DB Touchpointsusersuser_profilesuser_diseasesuser_operations
Teststests/api/test_user.py

GET /api/user/profile

内容
Request
Responsebasic_infohealth_metricsdiseasesoperations
Errors401500
ConsumerUserApiClient.getUserProfile
Handleruser.get_user_profile
DB Touchpointsusersuser_profilesuser_diseasesuser_operations
Teststests/api/test_auth_dependency.py 覆盖 storage 注入

GET /api/user/profile/basic

内容
Request
Responsegenderweightheight
Errors401500
ConsumerUserApiClient.getBasicProfile、运动热量计算
Handleruser.get_user_basic_profile
DB Touchpointsusersuser_profiles
TestsFlutter exercise feedback tests

疾病史

POST /api/user/diseases

内容
Requestdisease_namedisease_stage
Responsesuccessdisease_id
Errors401500
ConsumerUserApiClient.addDisease
Handleruser.add_disease
DB Touchpointsuser_diseases;写 update_logs
Teststests/api/test_user.py

PUT /api/user/diseases/{disease_id}

内容
Requestpath disease_id;body disease_namedisease_stage
Responsesuccess
Errors404 不存在或非本人;401500
ConsumerUserApiClient.updateDisease
Handleruser.update_disease
DB Touchpoints更新本人 user_diseases;写 update_logs
Teststests/services/test_user_service_owner_guard.py

DELETE /api/user/diseases/{disease_id}

内容
Requestpath disease_id
Responsesuccess
Errors404 不存在或非本人;401500
ConsumerUserApiClient.deleteDisease
Handleruser.delete_disease
DB Touchpoints软删除本人 user_diseases;写 update_logs
Teststests/services/test_user_service_owner_guard.py

手术史

POST /api/user/operations

内容
Requestoprt_diseaseoprt_stageoprt_time
Responsesuccessoperation_id
Errors401500
ConsumerUserApiClient.addOperation
Handleruser.add_operation
DB Touchpointsuser_operations;写 update_logs
Teststests/api/test_user.py

PUT /api/user/operations/{operation_id}

内容
Requestpath operation_id;body oprt_diseaseoprt_stageoprt_time
Responsesuccess
Errors404 不存在或非本人;401500
ConsumerUserApiClient.updateOperation
Handleruser.update_operation
DB Touchpoints更新本人 user_operations;写 update_logs
Teststests/services/test_user_service_owner_guard.py

DELETE /api/user/operations/{operation_id}

内容
Requestpath operation_id
Responsesuccess
Errors404 不存在或非本人;401500
ConsumerUserApiClient.deleteOperation
Handleruser.delete_operation
DB Touchpoints软删除本人 user_operations;写 update_logs
Teststests/services/test_user_service_owner_guard.py

头像

POST /api/user/avatar

内容
Requestmultipart file
Responsesuccessavatar_urlavatar_path
Errors400 类型/大小/内容不合法;401404 用户不存在;500
ConsumerUserApiClient.uploadAvatar
Handleruser.upload_avatar
DB Touchpoints更新 users.avatar;写 update_logs;本地或 OSS 存储
Testsavatar storage tests、replacement point tests

POST /api/user/avatar/upload-policy

内容
Requestfile_namefile_size
Response本地上传指示或 OSS policy
Errors400 文件名/类型/大小;401500
ConsumerUserApiClient.getAvatarUploadPolicy
Handleruser.get_avatar_upload_policy
DB Touchpoints不写业务表;读取 storage settings
Teststests/services/test_avatar_storage_service_unittest.py

POST /api/user/avatar/confirm

内容
Requestobject_key
Responsesuccessavatar_keyavatar_url
Errors400 object key 不合法/直传未启用;401404500
ConsumerUserApiClient.confirmAvatarUpload
Handleruser.confirm_avatar_upload
DB Touchpoints更新 users.avatar;写 update_logs
Testsavatar storage tests

DELETE /api/user/avatar

内容
Request
Responsesuccessremovedavatar_url=null
Errors401404500
ConsumerUserApiClient.deleteAvatar
Handleruser.delete_avatar
DB Touchpoints清空 users.avatar;写 update_logs;本地文件 best-effort cleanup
Testsavatar storage tests

GET /api/user/avatar

内容
Request
Responsesuccessavatar_urlavatar
Errors401404500
ConsumerUserApiClient.getAvatarUrl
Handleruser.get_avatar
DB Touchpointsusers.avatar
Testsreplacement point tests

字段边界

字段组主要约束
基本资料birth 使用 YYYY-MM-DD;身份证格式由共享规则校验;字段更新写入 users
健康指标身高、体重、血压、脉搏有范围校验;diagnosis_date 归一为业务日期。
手术日期oprt_time 归一为业务日期,落 user_operations.oprt_time
头像支持 jpg/png/webp;后端校验扩展名、MIME、文件头和大小;OSS policy 只返回临时上传参数,不持久暴露密钥。

来源锚点

  • Router: apps/backend_service/app/api/user.py
  • Service: apps/backend_service/app/services/user_service.py
  • Storage: apps/backend_service/app/services/avatar_storage_service.py
  • Flutter: apps/flutter_app/lib/api/user_api_client.dart
  • Tests: apps/backend_service/tests/api/test_user.pyapps/backend_service/tests/services/test_user_service_owner_guard.pyapps/flutter_app/test/api/replacement_point_contract_test.dart