00先看这一页
服务端本轮迭代已完成并全部上线。这份文档给小程序的开发同学:哪些接口新增、哪些被重新设计、哪些要停用,以及每块业务背后的数据关系。
最重要的五件事
| # | 变化 | 对小程序意味着什么 | 章节 |
|---|---|---|---|
| 1 | 破坏性 身份标识改成 user_no |
路径里的“人”不再用数字 ID,响应里也不再出现 user.id。传数字 ID 一律 404。教练、同班、成员、分享人全部改为 xxUserNo。 |
§02 |
| 2 | 重构 约训练独立成域 | 不再是“活动 + 时段”,而是「场馆 → 课程类型 → 课次 → 约课」。三级页面(总览 / 列表 / 详情)各有一组新接口,旧的 /api/training/schedule 已删除。 |
§03 |
| 3 | 新增 课包按次抵扣 + 核销 | 约课可能“扣课包次数”而不是付钱:amount=0 表示直接约课成功。课次有「待核销」状态,教练发布训练记录才算核销。小程序要展示可用次数、扣次流水。 |
§04 |
| 4 | 新增 课程商品(卖课包次数) | 新增一套「课程商品」:直售或拼团,买的是课包次数。它是老「考证拼团」的泛化替代,老拼团接口已标待下线。 | §05 |
| 5 | 新增 个人日志 / 他人主页 / 训练评价 | 课后教练填评价与成绩、学员查看训练记录与成绩曲线;他人主页可看资料/约潜/日志。涉及 4 个新页面组。 | §07 §08 |
按页面看:需要改哪些
| 页面 / 模块 | 是否要改 | 原因 |
|---|---|---|
| 首页 / 活动 / 潜伴 / 社区 / 商城 | 部分改 | 接口本身基本不变;但凡响应里带“人”的,字段可能从 userId 变 userNo,需要逐个核对。 |
| 约训练(整个模块) | 重写 | 模型与接口全换,见 §03。 |
| 考证 / 课包 / 我的课包 | 新增 | 课包列表、详情、扣次流水是新增能力,见 §04。 |
| 证书(上传 / 我的证书) | 改 | 目录接口路径变更、按目录编码提交、驳回重提要带 id,见 §06。 |
| 考证拼团 | 迁移 | 改用课程商品;老接口保留但已标待下线,见 §09 / §10。 |
| 我的(个人中心) | 改 | 新增训练记录、潜水记录、他人主页入口;资料读取换新路径。 |
docs/api-changes.md 与迁移脚本。
如发现文档与线上实际返回不一致,以线上返回为准,并告知后端修正本文。
01通用约定
所有接口共享同一套响应、鉴权与错误约定,先对齐这页能省掉一半联调时间。
| 项 | 约定 |
|---|---|
| C 端 BaseURL | https://api.deepblueplan.com(小程序的 API Base 为 https://deepblueplan.com/apis,Nginx 转发到同一服务)。代码里的 /api/** 就是完整路径。 |
| 鉴权 | Authorization: Bearer <token>。用户端与管理端 token 完全独立,不可混用。 |
| 统一响应 | { code, message, data, timestamp, transactionId };code != 200 时 message 已是可直接展示的中文文案。 |
| 分页入参 | pageNum(默认 1)、pageSize(默认 10,上限 50;课包流水默认 20)。 |
| 分页响应 | { list, total, page, size, pages }。 |
| 时间格式 | 日期 yyyy-MM-dd;时间 yyyy-MM-dd HH:mm:ss。个别 VO 为 ISO 字符串,以示例为准。 |
| 文件上传 | POST /api/file/upload(form-data,字段 file,可带 type、scene),返回 { url, key }。 |
| 请求追踪 | 响应头/体带 transactionId;报障时请提供它,后端可直接定位日志。 |
错误码与前端动作
| code | 含义 | 前端应该怎么做 |
|---|---|---|
200 | 成功 | 取 data。 |
401 | 未登录 / token 失效 | 清理登录态 → 拉起登录弹窗;不要直接 toast 错误文案。 |
403 + 1006 | 资料不完整 | 弹出「完善资料」引导(头像/昵称/性别),完成后重试原请求。 |
403 | 用户被禁用 | 提示并退出。 |
404 | 资源不存在 / userNo 非法 | 展示空态或“内容不存在”,不要重试。 |
409 | 重复提交(如重复证书) | 提示已存在,引导改为“重新提交/编辑”。 |
429 | 触发限流 | 按 retryAfter 退避;不要密集轮询。 |
500 | 业务规则拒绝 | 直接展示 message(后端把业务规则拒绝也放在这里),不要替换成“系统繁忙”。 |
code=1006,两者处理方式不同。
联调入口
生产 Swagger 只在服务器回环可用,用 SSH 隧道访问:
ssh -N -i ~/.ssh/deepblue_admin_prod_ed25519 -L 9081:127.0.0.1:9081 -L 9082:127.0.0.1:9082 deploy@8.138.236.251
# C 端接口文档: http://127.0.0.1:9082/actuator/swagger-ui
# OpenAPI 规范: http://127.0.0.1:9082/actuator/openapi (可导入 Apifox)
如果本地连不上,先确认隧道进程还在;Swagger 端口仅绑定回环,不要尝试从公网访问。
02身份标识:user.id → user_no
这是本轮唯一的破坏性变更:所有“人”的对外标识从自增数字改成不可枚举的 user_no。它影响每一个带用户的接口。
规则
| 场景 | 写法 |
|---|---|
| 路径里的“当前用户” | /api/users/me/profile、/api/users/me/dive-logs(需登录,字面量 me) |
| 路径里的“某个用户” | /api/users/{userNo}/profile,例如 /api/users/usr_9f2c…/profile |
| 教练 | GET /api/coaches/{userNo};课次卡片里下发 coachUserNo |
| 分享人 / 分销 | 下单时传 shareUserNo(不是 shareUserId) |
| 响应里的人物字段 | userNo、coachUserNo、shareUserNo、authorUserNo;不再返回 user.id |
| 传了数字 ID | 一律 404 用户不存在(不做兼容,避免枚举) |
存量用户没有 user_no 怎么办
后端不做全量回填。两种时机按需生成(CAS + 唯一索引,幂等):
① 新版小程序登录时
登录成功后该用户的 user_no 已就绪,后续接口可直接用。
② 出现在新接口响应里时
例如他人主页、同班名单里第一次被引用时生成。
路径对照(旧 → 新)
| 旧 | 新 | 状态 | 备注 |
|---|---|---|---|
GET /api/user/profile | GET /api/users/me/profile | 改 | 读取改新路径;写入仍在 POST /api/user/profile/update |
GET /api/coach/detail/{id} | GET /api/coaches/{userNo} | 待下线 | 教练主页改用新路径 |
GET /api/user/dive-logs | GET /api/users/{userNo|me}/dive-logs | 待下线 | 发布/编辑/删除仍在 /api/user/dive-logs |
GET /api/coach/{id}/activities | GET /api/users/{userNo}/summary | 待下线 | 他人主页聚合接口 |
| — | GET /api/users/{userNo}/buddy-activities | 新增 | TA 的约潜 |
| — | GET /api/users/{userNo}/summary | 新增 | 首屏聚合(资料+日志+约潜+勋章占位) |
shareUserNo;② 同班名单、潜伴成员、帖子作者等嵌套人物字段是否还在读 userId;③ 任何把 user id 拼进路径的地方,是否都会拿到 404(这是预期行为,不是 bug)。
03约训练域:场馆 → 课次 → 约课
约训练从「活动 + 时段 + 按身份计费」重构成独立领域。旧的 /api/training/schedule、/api/training/session/{id}、/api/training/booking*、/api/training/my-bookings 已删除,必须换新接口。
三级页面与接口
| 层级 | 接口 | 登录 | 用途与关键字段 |
|---|---|---|---|
| 一级:总览 | GET /api/training/course-types/overview?cityId&lat&lng |
否 | 课程类型卡片:code、name、coverImage、upcomingCount、nextSession{…}(含 coachUserNo、distanceKm、bookable、blockReason) |
| 一级:筛选 | GET /api/training/course-typesGET /api/training/venues?cityIdGET /api/venues?cityIdGET /api/city/list |
否 | 课程类型 / 场馆 / 城市下拉数据源。/api/venues 与 /api/training/venues 等价。 |
| 二级:课次列表 | GET /api/training/sessions?from&to&courseType&venueId&cityId&coachUserNo&lat&lng&upcomingOnly |
否 | 按日期分组的 sessions[]:id/date/weekday/startTime/endTime/title、venueName/locationAddress/venueImages/distanceKm、participantPreview[]、booked/remaining/capacity、soloPrice/ticketPrice、coachName/coachAvatar/coachUserNo/coachCertification、requiredCertificateCode/Name、bookable/blockReason。默认只返回未过期课次。 |
| 日期弹窗 | GET /api/training/sessions/calendar?month&courseType&cityId |
否 | date、sessionCount、bookableCount |
| 三级:课次详情 | GET /api/training/sessions/{id}?lat&lng |
否 | 列表字段 + maleCount/femaleCount、myBookingId/myBookingStatus/StatusName、myBookingCancellable/myBookingCancelBlockReason、upcomingSessions[](同类型后续场次) |
| 教练资料 | GET /api/coaches/{userNo} |
否 | 认证、证书图片、从业年限、简介、城市、评分、学员数、照片、联系方式 |
| 资格与价格 | GET /api/training/sessions/{id}/eligibility |
是 | canBook、blockReason、payType/payTypeName、amount、entitlementType、remainingQuota、requiredCertificateName、myCertificateName |
| 约课(下单) | POST /api/training/sessions/{id}/bookings |
是 | 请求:travelerId?、contactName、contactPhone、emergencyName、emergencyPhone、emergencyRelation、shareUserNo?;响应:bookingId/bookingNo、payType/amount、orderId/orderNo、message。amount=0 即约课成功。 |
| 支付 | POST /api/payment/createGET /api/payment/status/{orderNo} |
是 | 微信支付参数;轮询支付状态(间隔 ≥ 2s,不要密集轮询)。 |
| 我的约课 | GET /api/training/bookingsGET /api/training/bookings/{id} |
是 | 列表:bookingNo/orderNo/venueName/coachName/date/startTime/endTime/courseTypeName/payTypeName/amount/status/statusName/cancellable/cancelBlockReason/refundPolicyText/travelerName;详情额外含联系人与紧急联系人(仅本人可查,他人 404)。 |
| 取消 | POST /api/training/bookings/{id}/cancel?reason= |
是 | 开课前 cancelDeadlineHours(默认 12h)内可自助取消;课包扣次自动回滚。 |
| 同班 | GET /api/user/training/sessions/{sessionId}/classmates |
是 | userNo、昵称、头像、是否教练、到课状态;仅该节课报名学员可访问。 |
课程类型的语义(决定“要不要付钱”)
| 课程类型 | 权益绑定 | 报名与计费 |
|---|---|---|
DEPTH 深度课 / POOL 泳池课 / THEORY 理论课 | 绑定同名权益 | 有课包则扣次数;次数用尽按门票价 TICKET;无课包按单买价 SOLO。 |
PHOTO 水下摄影课 | 绑定 PHOTO 权益 | 单次履约。课包可以包含它(权益字典已支持),没有课包则单次付费。 |
体验课 TRIAL | 不绑定 | 不参与课包抵扣,只能单次付费。 |
日常训练 DAILY_TRAINING | 不绑定 | 排课时单卖价填 0 → amount=0,报名即可参与,不扣任何次数;可设参与证书门槛。 |
required_certificate_code 支持多个编码逗号分隔,表示持有任一即可;精确匹配证书编码,不做等级大小比较。
约课主流程
payType 判定顺序(后端已算好,前端只展示)
| 顺序 | 条件 | payType | 金额 |
|---|---|---|---|
| 1 | 认证教练(持教练类证书) | FREE_COACH | 0 |
| 2 | 预备教练且本周免费额度未用 | FREE_QUOTA | 0 |
| 3 | 课程类型不参与课包抵扣(体验课等) | SOLO | 单卖价 |
| 4 | 可用课包且对应权益有余额 | PACKAGE | 0(扣 1 次) |
| 5 | 对应权益用尽但补考池有余量 | PACKAGE(RETAKE) | 0(扣补考 1 次) |
| 6 | 可用课包含该权益但已用尽 | TICKET | 门票价 |
| 7 | 其余(无课包 / 已过期 / 已暂停) | SOLO | 单卖价 |
课次状态与「待核销」
| status | 含义 | 对学员 | 对教练 |
|---|---|---|---|
| 0 | 停排 | 不可见 | — |
| 1 | 可约 | 正常展示与报名 | 正常 |
| 2 | 已结束 | 不可报名 | 可查看记录 |
| 3 | 已取消 | 不可报名,订单走退款 | 已取消 |
| 4 | 待核销 | 一律按“已结束”处理,不可再报名 | 待填写评价入口(status=4 可筛出,含 pendingStudentCount) |
状态 4 是 2026-10 新增:课次到期且有报名时进入,教练发布训练记录后转 2;超过 72 小时未处理由系统兜底核销并扣次。
取消与退款
| 情形 | 次数 | 金额 |
|---|---|---|
| 课包扣次、尚未上课(BOOKED) | 释放占用(次数回到可用) | 0 元订单,无需退款 |
| 课包扣次、已核销(ATTENDED / NO_SHOW) | 回滚已用次数(写 RESTORE 流水) | — |
| 付费待支付 | 取消订单、释放名额 | 未支付,无需退款 |
| 付费已支付 | 释放名额 | 按退款政策申请退款 |
开课前 12 小时内不可自助取消(每节课可用 cancelDeadlineHours 覆盖):接口返回 cancellable=false + cancelBlockReason,前端引导走订单退款。
常见错误文案(可直接展示)
| 场景 | message |
|---|---|
| 课次已结束 / 已取消 | 该课次已结束 / 该课次已取消 |
| 名额已满 | 名额已满(canBook=false) |
| 证书门槛未满足 | 需持有 AIDA 2 证书方可参与(你当前:AIDA 1) |
| 超出取消窗口 | 距开课不足 12 小时,无法自助取消;可联系客服按退款政策处理 |
| userNo 非法 | 用户不存在(404) |
| 不是教练 | 该用户不是教练(404) |
04课包与权益:按次抵扣与核销
课包是“按次承诺”的商品:买了课包,约课时按课程类型对应的权益扣次数,而不是付钱。理解这张图,就能理解所有“剩余次数”的口径。
我的课包(3 个接口)
| 接口 | 说明 |
|---|---|
GET /api/user/course-packages | 列表(不含待成团):状态中文、剩余权益、有效期、是否可约课 |
GET /api/user/course-packages/{packageNo} | 详情:权益明细、目标证书清单、最近流水 |
GET /api/user/course-packages/{packageNo}/records | 扣次流水(分页,默认 20):pageNum、pageSize |
列表 / 详情字段
| 字段 | 含义 |
|---|---|
packageNo | 课包编号(详情与流水的入参,不是内部 id) |
templateCode / templateName | 来源课包模板(编码即商品,如 AIDA_2)。已无 templateVersion 字段——模板不再分版本。 |
status / statusName | 状态枚举 / 中文名(中文名可直接展示) |
canBook | 是否可约课(使用中且未过期) |
activationHint | 未激活时的提示,如“首次约课后开始计算有效期” |
activatedAt / expiresAt | 激活时间 / 到期时间;未激活时为 null |
suspendedAt / suspendReason | 暂停时间与原因 |
certificates[] | 目标证书清单 {code, displayName, primary} |
quotas[] | 权益余额 {type, unlimited, total, reserved, used, available} |
quotaSummary | 摘要文案,可直接展示(如“深度课剩 2 次”) |
sourceType / sourceOrderId / grantReason | 来源:ORDER 购买 / GROUP 拼团 / ADMIN 管理台发放 |
available = total − reserved − used。无限次时 unlimited=true 且 available=null;
reserved 是“已报名但还没核销”的占用,取消后会自动释放。
状态字典
| status | 含义 | 前端处理 |
|---|---|---|
WAITING_GROUP | 待成团 | 列表接口不返回(详情可见),展示“待成团” |
PENDING_ACTIVATION | 待激活(首次约课前不开始计时) | 展示 activationHint |
ACTIVE | 使用中 | 可约课,展示 expiresAt |
SUSPENDED | 已暂停(有效期冻结) | 展示暂停原因 |
COMPLETED / EXPIRED | 已完成 / 已过期 | 灰色展示,不可约课 |
REVOKED | 已撤销(退款) | 不可约课 |
流水字段
| 字段 | 说明 |
|---|---|
entitlementType | 权益编码,来自权益字典(THEORY/POOL/DEPTH/PHOTO/RETAKE…) |
action | GRANT 发放 / RESERVE 预约占用 / CONSUME 核销 / RELEASE 释放 / ADJUST_TOTAL / ADJUST_USED(管理台手工调整) |
quantity | 数量;手工调整时为带符号增量 |
beforeReserved/afterReserved、beforeUsed/afterUsed | 变更前后的余额快照 |
businessNo | 业务号(订单号 / 预约号 / 调整单号) |
remark | 备注;手工调整时的原因,可直接展示 |
createdAt | 发生时间 |
权益字典(新增能力)
权益不再是写死的枚举,而是可维护的字典:GET /api/entitlement-types(公开)返回启用中的权益。
{
"code": 200,
"data": [
{ "code": "THEORY", "name": "理论课" },
{ "code": "POOL", "name": "泳池课" },
{ "code": "DEPTH", "name": "深度课" },
{ "code": "PHOTO", "name": "水下摄影" },
{ "code": "RETAKE", "name": "免费补考" }
]
}
响应结构没变。新增权益(例如把水摄做成课包可抵扣项)由运营在管理台维护,小程序无需改代码;权益中文名一律用接口返回值,不要在前端写死映射。
ADJUST_USED,这是正常的。
05课程商品:直售 / 拼团卖课包次数
课程商品是「考证拼团」的泛化:售卖的是课包模板的次数,买完到约训练约课扣次。价格与档位一律取自课包模板,商品本身不存价格。
接口
| 接口 | 登录 | 说明 |
|---|---|---|
GET /api/course-products?saleMode&pageNum&pageSize | 否 | 列表:仅上架且在可售时间内;封面、标题、销售方式、单价(取自模板)、成团人数 |
GET /api/course-products/{id} | 否 | 详情:含 detailImages[](详情长图,按顺序纵向拼接);下架可看但标记不可下单 |
POST /api/course-products/{id}/orders | 是 | 下单:直售直接成单;拼团 type=create 开团 / type=join 参团(需 instanceId);返回 orderNo 供支付 |
GET /api/course-products/my?status | 是 | 我的订单:含团进度(还差 N 人)与发放状态 |
业务口径
| 项 | 规则 |
|---|---|
| 销售方式 | STANDARD 直售:支付成功立即发放课包;GROUP 拼团:满员后逐单发放 |
| 拼团价格 | 成团人数即档位,命中课包模板「分层拼团价」对应 size 的单价;档位为空表示该课包不支持拼团 |
| 重复购买 | repeatPurchase=0 每人限购一次;=1 允许重复购买、次数叠加 |
| 拼团失败 | 到期未成团 → 关团,已支付订单转「待退款」(不是已退款);未支付订单 30 分钟超时取消并释放团位 |
| 水摄类 | 教练单次履约、不涉及发证,课包模板目标证书可留空 |
我的订单状态
| 状态 | 前端展示 |
|---|---|
| 待支付 | 展示倒计时与“去支付” |
| 已支付待成团 | 展示「还差 N 人」与邀请入口 |
| 已发放 | 引导“去约课”,并可用 packageNo 跳「我的课包」 |
| 待退款 / 已退款 | 展示“拼团未成团,退款处理中/已退款” |
| 已取消 | 展示取消原因 |
06证书:目录、我的证书、教练资格
证书体系从“手填文本”改成“目录 + 审核”:用户从字典里选证书,服务端按目录回填名称/机构/等级;证书是报名门槛与教练资格的依据。
① 证书目录(公开)
GET /api/certificate-definitions — 无需登录,按 sortOrder 升序返回启用中的目录项。
{
"code": 200,
"data": [
{
"certificateCode": "AIDA_2",
"category": "FREEDIVING", // FREEDIVING 自由潜 / SCUBA 水肺
"qualificationType": "DIVER", // DIVER 潜水员证书 / COACH 教练资格
"organizationCode": "AIDA", // 列表分组建议用这个
"organizationName": "AIDA International",
"levelCode": "2",
"levelName": "AIDA 2",
"displayName": "AIDA 2",
"cardImageUrl": "https://…/card.png",
"badgeImageUrl": "https://…/badge.png",
"sortOrder": 102
}
]
}
/certificate-definitions 已下线,统一用 /api/certificate-definitions。
② 我的证书
| 接口 | 登录 | 说明 |
|---|---|---|
GET /api/user/certifications | 是 | 列表,按提交时间倒序 |
GET /api/user/certification/{id} | 是 | 详情,仅限本人(他人返回业务错误) |
POST /api/user/certification/save | 是 | 提交或更新(见下方规则) |
POST /api/user/certification/delete/{id} | 是 | 删除,仅限本人 |
| 字段 | 说明 |
|---|---|
id | 证书记录 ID,重新提交 / 删除时回传 |
certificateCode | 目录编码 |
certName / certOrg / certLevel | 由服务端按目录回填,客户端不必传 |
organizationCode | 机构编码,列表分组用 |
sortOrder | 目录排序值,组内排序用(越大等级越高) |
certNo / issuedAt | 证书编号 / 签发日期 |
cardImageUrl / badgeImageUrl | 证书卡图 / 徽章,来自目录,可直接展示 |
certImages[] | 用户上传的证书照片(≤ 9 张) |
status | 0 待审核 / 1 已通过 / 2 已驳回 |
auditRemark / auditTime | 审核备注(驳回时即原因)/ 审核时间 |
提交规则(容易踩坑)
// 新增:不传 id
{ "certificateCode": "AIDA_2", "certNo": "AIDA-CN-2024-001",
"issuedAt": "2019-04-28", "certImages": ["https://…/1.jpg"] }
// 被驳回后重新提交:必须带 id(服务端会把状态置回 0 并清空驳回原因)
{ "id": 12, "certificateCode": "AIDA_2", "certNo": "…", "issuedAt": "…", "certImages": ["…"] }
- 同一张证书重复新增返回
409「该用户已提交过此证书」——重新提交请带id; - 未传
certificateCode(兼容老客户端)时必须传certName; - 证书名称/机构/等级由目录回填,前端不要自己拼。
③ 教练资格
用户持有的证书中,若目录的 qualificationType = COACH 且该条记录 coach_qualification = 1,则作为教练教学资格;教练审核通过会同步用户类型与认证状态。
前端只需:教练主页/课次卡片展示认证信息;「教练入驻」表单里选择教练类证书。
④ 证书还能从哪来
除了用户自己上传、管理台审核,运营现在还可以按课包直接发证(管理台「用户详情 › 课包 › 发放证书」)。
对小程序的影响:用户可能在没有上传记录的情况下突然多一张「已通过」的证书——这是正常业务动作,列表与「我的证书」会直接出现。
certificateCode 每人只有一条,重复授予是覆盖;
② 没有有效期与撤销状态,发错只能删除或改审核状态;
③ 不记录“这张证书由哪笔订单/哪个课包发放”。若产品需要复训换证或发放审计,需后端再扩展。
07个人日志:训练记录、教练评价、成绩档案
课程结束后,教练为每个报名学员登记评价(文字、图片、成绩指标);学员在「我的日志 → 训练记录」查看每次约训与历史成绩曲线。
① 指标字典(决定“不同课程类型填不同内容”)
GET /api/user/training/metric-defs?courseType=DEPTH(需登录)
| 字段 | 说明 |
|---|---|
code / name | 指标编码与名称,如 DYNB / 动态双蹼 |
category | POOL 泳池 / DEPTH 深度 / OTHER |
unit | 米 / 秒(闭气以秒存储,前端展示 2'00") |
betterDirection | MAX 越大越好 / MIN 越小越好(决定“最佳成绩”) |
courseTypeCodes | 适用课程类型数组,空 = 所有类型 |
required | 该课程类型下是否必填(发布评价时校验) |
初始种子 8 项:STA(秒)、DYNB/DYM/DNF(米)→ 泳池课;FIM/CWTB/CWT/CNF(米)→ 深度课。运营可新增,新增指标无需发版。
② 教练端(需登录且必须是该课教练)
| 接口 | 说明 |
|---|---|
GET /api/coach/training/sessions?status=pending|done | 我的已结束课程:日期、时间、场馆、课程类型、学员数、待评价数。status 新增取值 4(只看待核销),响应含 pendingStudentCount |
GET /api/coach/training/sessions/{sessionId}/students | 学员名单:到课状态、logStatus(NONE/DRAFT/PUBLISHED)、本次成绩摘要、该学员历史最佳 |
GET /api/coach/training/logs/{bookingId} | 填写页数据:课程与学员信息、已填成绩、availableMetrics、历史版本数 |
POST /api/coach/training/logs | 保存或发布(见下方请求体) |
GET /api/coach/training/logs/{logId}/history | 修改历史(版本倒序) |
{
"bookingId": 51,
"content": "本次深度训练完成攀绳下潜 26 米,耳压平衡顺畅。",
"images": ["https://…/1.jpg"],
"metrics": [
{ "code": "FIM", "value": 26, "remark": "个人最好成绩" },
{ "code": "CWTB", "value": 26 }
],
"draft": false
}
- 每个预约一条日志,重复提交是更新并自动写历史版本;
draft=true存草稿:不校验必填、不计入最佳成绩;发布(false/缺省)时required=1的指标缺失会被拒绝;- 只有课程已结束且预约状态为「已上课/未到场」时可填写;并发修改返回「评价刚被修改过,请刷新后重试」;
- 发布即核销该学员报名(占用转已用、扣课包次数)。
③ 学员端(需登录,仅本人)
| 接口 | 说明 |
|---|---|
GET /api/user/training/logs?from&to&courseType | 训练记录,按日期分组;未评价也会返回(logStatus=NONE、logId 为空) |
GET /api/user/training/logs/{logId} | 已发布评价详情(图片、评价、本次成绩、本次最佳) |
GET /api/user/training/bookings/{bookingId} | 按预约取详情;未评价时返回课程/场馆/教练 + logStatus=NONE |
GET /api/user/training/metrics/best | 最佳成绩汇总(按 POOL/DEPTH 分组,仅统计已发布) |
GET /api/user/training/metrics/{code}/history | 单项成绩历史与曲线:points[](按日期升序,最多 50 点)+ best/latest/count |
// 训练记录的一天
{
"date": "2026-10-12",
"weekday": "周一",
"records": [
{ "logId": 88, "bookingId": 51, "sessionId": 9, "title": "深度训练",
"venueName": "深蓝一号泳池", "coachName": "李教练", "courseTypeName": "深度课",
"startTime": "09:00", "endTime": "11:00", "thumbnail": "https://…",
"logStatus": "PUBLISHED" }
]
}
08他人主页与潜水记录
他人主页是公开页(无需登录),全部按 userNo 访问;潜水记录是作者侧的内容管理,支持可见性。
① 他人主页(公开,无需登录)
| 接口 | 说明 |
|---|---|
GET /api/users/{userNo}/profile | 公开资料:昵称、头像、性别、地区、签名、星座/MBTI/行业、实名与教练标签、最高证书等级、加入时间、统计 |
GET /api/users/{userNo}/buddy-activities | TA 的约潜:发起或参与的潜伴活动(日期、标题、封面、地点、人数、前 6 位头像、OWNER/JOINED) |
GET /api/users/{userNo}/dive-logs | TA 的日志:公开且未下架的潜水记录(封面、标题、地点、教练、点赞数;登录时带 liked) |
GET /api/users/{userNo}/medals | TA 的勋章:当前返回 { medals: [], comingSoon: true, message }(体系未实现) |
GET /api/users/{userNo}/summary | 首屏聚合:资料 + 最近 6 条潜水记录 + 最近 3 条约潜 + 勋章占位标记 |
GET /api/users/me/profile | 当前登录用户(等价于带自己的 userNo,但不必先取 userNo) |
user_no 之外的内部标识等敏感字段;被封禁或不存在的用户返回业务错误。
② 潜水记录(作者侧,需登录)
| 接口 | 说明 |
|---|---|
POST /api/user/dive-logs | 发布:{title, content, images[], diveDate, locationName, cityId?, diveSiteId?, hotspotId?, buddyPostId?, trainingLogId?, coachUserId?, maxDepth?, durationMinutes?, visibility} |
PUT /api/user/dive-logs/{id} | 编辑(仅作者;已下架不可编辑) |
DELETE /api/user/dive-logs/{id} | 删除(仅作者) |
GET /api/user/dive-logs?from&to&visibility&pageNum&pageSize | 我的潜水记录(含「仅自己可见」) |
GET /api/user/dive-logs/{id} | 详情(他人仅公开且未下架) |
POST /api/user/dive-logs/{id}/like / /unlike | 点赞 / 取消(幂等,返回最新点赞数) |
- 图片 ≤ 9 张;
diveDate不能晚于今天; buddyPostId必须是本人参与过的潜伴约潜;trainingLogId必须是本人的训练评价;visibility:PUBLIC(默认)/PRIVATE(仅自己)。
③ 同班入口
GET /api/user/training/sessions/{sessionId}/classmates(需登录,仅该节课报名学员可访问)→ 同班学员与教练(userNo、昵称、头像、是否教练、到课状态)。
另外 GET /api/user/training/bookings/{bookingId} 新增 classmates(前 10 位)与 classmateCount,用于「同班」头像条。
09考证拼团与分层拼团价(存量功能)
这套接口已被课程商品取代,但老小程序仍在用,所以保留为只读并标记待下线。若你还需维护它,这里是它的口径。
| 接口 | 状态 | 关键字段 |
|---|---|---|
GET /api/course/detail/{id} | 待下线 | soloPrice、groupPriceTiers[]({size, price})、groupBuyEnabled、validityDays、registrationDeadline(仅展示,服务端不阻断) |
GET /api/course/group/list | 待下线 | 分页拼团列表 |
GET /api/course/group/{id} | 待下线 | tierSize(该团档位)、unitAmount(该团单价)、remainingCount、canJoin、成员 |
POST /api/course/order/create | 待下线 | activityId、buyType(单独买/开团/参团)、groupId、tierSize(有多档位时必填) |
GET /api/group/*(通用拼团) | 待下线 | 同上一套语义 |
分层价的三个硬规则
groupBuyEnabled=false→ 隐藏拼团入口(该课包未配置拼团价);- 有多档位时下单必须传
tierSize,否则报「请选择拼团档位」;传了不存在的档位报「该课程不支持 N 人拼团」; - 团的有效期是团级的(开团时写死
endTime),与活动的registrationDeadline无关。
10废弃接口与迁移映射
服务端对“要停用”的接口都打了 deprecated 标记(共 13 个)。它们现在仍可调用,但新页面不要再接。
接口迁移表
| 旧接口 | 替代 | 状态 | 说明 |
|---|---|---|---|
/api/training/schedule/api/training/session/{id}/api/training/booking*/api/training/my-bookings | /api/training/sessions/*/api/training/bookings/* | 已删除 | 小程序主干 0 调用,2026-10-13 移除,白名单已清理 |
/api/training/eligibility/api/training/order/create | 新版约训练页面 | 保留 | activity 维度约训练,小程序主干仍在用;新版全量后下线 |
/api/course/detail/{id}/api/course/group/* | /api/course-products/* + /api/user/course-packages | 待下线 | 考证拼团改由课程商品承载 |
/api/group/*(通用拼团) | 同上 | 待下线 | 6 处标记 |
/api/coach/detail/{id}/api/coach/{id}/activities | /api/coaches/{userNo}/api/users/{userNo}/summary | 待下线 | 教练主页改按 userNo |
GET /api/user/profile(读取) | GET /api/users/me/profile | 待下线 | 写入仍在 POST /api/user/profile/update |
GET /api/user/dive-logs、/{id}(读取) | GET /api/users/{userNo|me}/dive-logs | 待下线 | 发布/编辑/删除保留 |
/api/buddy/* 中“查看他人约伴” | GET /api/users/{userNo}/buddy-activities | 待评估 | 需前端确认依赖页后再动 |
/certificate-definitions(无 /api 前缀) | /api/certificate-definitions | 已下线 | 路径变更 |
docs/api-changes.md。
11接入清单(按页面)
可直接当任务清单用。每项都对应上面的章节,做完打勾。
身份与通用
| 事项 | 章节 | |
|---|---|---|
| ☐ | 登录后保存 userNo;所有“当前用户”路径改 me 或对应 userNo | §02 |
| ☐ | 全量排查响应里的 userId / coachId / shareUserId,改读 *UserNo | §02 |
| ☐ | 错误处理:401 跳登录、403+1006 完善资料、500 直接展示 message | §01 |
| ☐ | 分页统一 pageNum/pageSize,pageSize ≤ 50 | §01 |
约训练(重写)
| 事项 | 章节 | |
|---|---|---|
| ☐ | 一级页改 course-types/overview,渲染课程类型卡片与“下一场课” | §03 |
| ☐ | 二级页接 training/sessions(按日期分组)+ 日历弹窗 | §03 |
| ☐ | 三级页接 sessions/{id},用 upcomingSessions 做日期横滑 | §03 |
| ☐ | 资格弹窗接 eligibility:展示 payTypeName、amount、remainingQuota | §03 |
| ☐ | 约课:amount=0 直接成功页;>0 拉起支付并轮询 | §03 |
| ☐ | 我的约课列表/详情;cancellable=false 时展示 cancelBlockReason 并引导退款 | §03 |
| ☐ | 证书门槛提示:requiredCertificateName + myCertificateName | §03 |
| ☐ | 同班头像条与同班列表 | §08 |
课包与课程商品
| 事项 | 章节 | |
|---|---|---|
| ☐ | 「我的课包」列表/详情:statusName、quotaSummary、expiresAt、RETAKE 余额 | §04 |
| ☐ | 扣次流水:区分 GRANT/RESERVE/CONSUME/RELEASE/ADJUST_*,展示 remark | §04 |
| ☐ | 无限次权益 available=null 的展示 | §04 |
| ☐ | 课程商品列表/详情(详情长图按序拼接)、下单、我的订单(团进度/发放状态) | §05 |
| ☐ | 权限字典 entitlement-types 拉取,中文名不写死 | §04 |
证书
| 事项 | 章节 | |
|---|---|---|
| ☐ | 证书目录改 /api/certificate-definitions,按 organizationCode 分组、sortOrder 排序 | §06 |
| ☐ | 上传证书只传 certificateCode + certNo + issuedAt + certImages | §06 |
| ☐ | 列表按 status 渲染;驳回展示 auditRemark 且“重新提交”带 id | §06 |
| ☐ | 处理“运营按课包发证”后突然出现的已通过证书 | §06 |
个人日志与内容
12附录:字典与字段速查
A. 字典
| 字典 | 取值 |
|---|---|
| 课包状态 | WAITING_GROUP 待成团 / PENDING_ACTIVATION 待激活 / ACTIVE 使用中 / SUSPENDED 已暂停 / COMPLETED 已完成 / EXPIRED 已过期 / REVOKED 已撤销(仅 ACTIVE 可约课) |
| 权益类型 | 来自字典接口:THEORY 理论课 / POOL 泳池课 / DEPTH 深度课 / PHOTO 水下摄影 / RETAKE 免费补考(可扩展) |
| 权益模式 | LIMITED 有限次(带 total)/ UNLIMITED 无限次 |
| 流水动作 | GRANT 发放 / RESERVE 预约占用 / CONSUME 核销 / RELEASE 释放 / ADJUST_TOTAL / ADJUST_USED(管理台手工调整) |
| 课包来源 | ORDER 购买 / GROUP 拼团 / ADMIN 管理台发放 |
| 课次状态 | 0 停排 / 1 可约 / 2 已结束 / 3 已取消 / 4 待核销 |
payType | FREE_COACH / FREE_QUOTA / PACKAGE / TICKET / SOLO |
| 约课状态 | BOOKED / ATTENDED / NO_SHOW / CANCELLED |
| 证书审核状态 | 0 待审核 / 1 已通过 / 2 已驳回 |
| 证书类别 / 用途 | FREEDIVING / SCUBA;DIVER / COACH |
| 日志状态 | NONE 未填写 / DRAFT 草稿 / PUBLISHED 已发布 |
| 潜水记录可见性 | PUBLIC / PRIVATE |
| 课程商品销售方式 | STANDARD 直售 / GROUP 拼团 |
B. 字段速查(旧 → 新)
| 旧字段 / 旧行为 | 新字段 / 新行为 | 说明 |
|---|---|---|
userId / coachId / shareUserId | userNo / coachUserNo / shareUserNo | 新接口不再返回内部数字 ID |
certificationLevel(手工维护) | certificationLevel(派生值) | 字段名不变,语义变为“已通过证书中等级最高的一张” |
templateVersion(课包/模板) | 已移除 | 课包模板不再分版本,一个编码一条模板 |
packageTemplateVersion(活动详情) | 已移除 | 同上;packageTemplateStatus 仍保留用于“已停用”提示 |
records[].action 仅 4 种 | 新增 ADJUST_TOTAL / ADJUST_USED | 管理台手工调整次数,remark 为原因 |
records[] 无备注 | records[].remark | 可直接展示 |
| 课次状态最多到 3 | 新增 4 待核销 | 学员侧按“已结束”处理 |
教练 /training/sessions 无待办筛选 | status=4 + pendingStudentCount | 教练端“待我填写”入口 |
| 证书文本手填 | certificateCode 目录驱动 | 名称/机构/等级由服务端回填 |
| 权益枚举 4 项 | 字典(含 PHOTO,可扩展) | 中文名取 GET /api/entitlement-types |
13附录:C 端完整接口清单(185 条)
由源码注解自动提取。可输入路径或关键字过滤;公开 表示无需登录。
| 方法 | 路径 | 登录 | 说明 |
|---|---|---|---|
| 约训练 / 训练日志 · 24 | |||
| POST | /api/coach/training/logs | 需登录 | 保存或发布评价 |
| GET | /api/coach/training/logs/{bookingId} | 需登录 | 填写评价页数据 |
| GET | /api/coach/training/logs/{logId}/history | 需登录 | 评价修改历史 |
| GET | /api/coach/training/sessions | 需登录 | 我的课程(待核销/待评价/已评价) |
| GET | /api/coach/training/sessions/{sessionId}/students | 需登录 | 课程学员名单 |
| GET | /api/training/bookings | 需登录 | 我的约课(课次维度) |
| GET | /api/training/bookings/{id} | 需登录 | 我的约课详情 |
| POST | /api/training/bookings/{id}/cancel | 需登录 | 取消约课(课次维度) |
| GET | /api/training/course-types | 公开 | 课程类型列表 |
| GET | /api/training/course-types/overview | 公开 | 课程类型总览(一级页面) |
| GET | /api/training/sessions | 公开 | 训练课次列表(课次维度) |
| GET | /api/training/sessions/calendar | 公开 | 课次日历 |
| GET | /api/training/sessions/{id} | 公开 | 课次详情(课次维度) |
| POST | /api/training/sessions/{id}/bookings | 需登录 | 约课(课次维度) |
| GET | /api/training/sessions/{id}/eligibility | 需登录 | 我的资格与价格(课次维度) |
| GET | /api/training/sessions/{id}/refund-policy | 公开 | 课次退款政策 |
| GET | /api/training/venues | 公开 | 可选场馆(课次维度) |
| GET | /api/user/training/bookings/{bookingId} | 需登录 | 训练记录详情(按预约) |
| GET | /api/user/training/logs | 需登录 | 我的训练记录 |
| GET | /api/user/training/logs/{logId} | 需登录 | 训练记录详情(按日志) |
| GET | /api/user/training/metric-defs | 需登录 | 成绩指标字典 |
| GET | /api/user/training/metrics/best | 需登录 | 最佳成绩汇总 |
| GET | /api/user/training/metrics/{code}/history | 需登录 | 单项成绩历史与曲线 |
| GET | /api/user/training/sessions/{sessionId}/classmates | 需登录 | 同班学员名单 |
| 我的课包 · 4 | |||
| GET | /api/entitlement-types | 公开 | 课程权益类型列表 |
| GET | /api/user/course-packages | 需登录 | 我的课包列表 |
| GET | /api/user/course-packages/{packageNo} | 需登录 | 我的课包详情 |
| GET | /api/user/course-packages/{packageNo}/records | 需登录 | 课包上课/扣次记录 |
| 课程商品 · 4 | |||
| GET | /api/course-products | 公开 | 课程商品列表 |
| GET | /api/course-products/my | 公开 | 我的课程商品订单 |
| GET | /api/course-products/{id} | 公开 | 课程商品详情 |
| POST | /api/course-products/{id}/orders | 需登录 | 下单(直售或拼团) |
| 证书目录 · 1 | |||
| GET | /api/certificate-definitions | 公开 | 启用的证书目录 |
| 他人主页 · 6 | |||
| GET | /api/users/{userNo}/buddy-activities | 公开 | TA 的约潜 |
| GET | /api/users/{userNo}/dive-logs | 公开 | TA 的日志 |
| GET | /api/users/{userNo}/medals | 公开 | TA 的勋章 |
| GET | /api/users/{userNo}/profile | 公开 | 公开资料(自己或他人) |
| GET | /api/users/{userNo}/summary | 公开 | 他人主页首屏聚合 |
| GET | /api/users/{userNo}/verification | 公开 | 实名认证情况(自己或他人) |
| 潜水记录 · 7 | |||
| GET | /api/user/dive-logs 待下线 | 需登录 | [待下线] 我的潜水记录 |
| POST | /api/user/dive-logs | 需登录 | 发布潜水记录 |
| DELETE | /api/user/dive-logs/{id} | 需登录 | 删除潜水记录 |
| GET | /api/user/dive-logs/{id} 待下线 | 需登录 | [待下线] 潜水记录详情 |
| PUT | /api/user/dive-logs/{id} | 需登录 | 编辑潜水记录 |
| POST | /api/user/dive-logs/{id}/like | 需登录 | 点赞潜水记录 |
| POST | /api/user/dive-logs/{id}/unlike | 需登录 | 取消点赞 |
| 用户与证书 · 15 | |||
| POST | /api/user/certification/delete/{id} | 需登录 | 删除我的证书 |
| POST | /api/user/certification/save | 需登录 | 提交或更新我的证书 |
| GET | /api/user/certification/{id} | 需登录 | 我的证书详情 |
| GET | /api/user/certifications | 需登录 | 我的证书列表 |
| POST | /api/user/phone/change | 需登录 | 更换绑定手机号 |
| GET | /api/user/profile 待下线 | 需登录 | [待下线] 获取个人资料 |
| POST | /api/user/profile/update | 需登录 | 更新个人资料 |
| POST | /api/user/real-name/lock | 需登录 | 锁定实名信息 |
| GET | /api/user/real-name/status | 需登录 | 获取实名认证状态 |
| POST | /api/user/real-name/update | 需登录 | 提交实名信息 |
| GET | /api/user/stats | 需登录 | 获取用户统计 |
| POST | /api/user/traveler/default/{id} | 需登录 | 设为默认同行人 |
| POST | /api/user/traveler/delete/{id} | 需登录 | 删除同行人 |
| POST | /api/user/traveler/save | 需登录 | 保存同行人 |
| GET | /api/user/travelers | 需登录 | 同行人列表 |
| 登录与资料 · 6 | |||
| GET | /api/auth/check-profile | 需登录 | 检查资料是否完整 |
| POST | /api/auth/complete-profile | 需登录 | 完善用户资料 |
| POST | /api/auth/phone-login | 公开 | — |
| POST | /api/auth/web/sms/login | 公开 | 网页端手机号验证码登录 |
| POST | /api/auth/web/sms/send | 公开 | 网页端发送登录验证码 |
| POST | /api/auth/wx-login | 公开 | — |
| 订单 · 8 | |||
| GET | /api/order/activity/{activityId}/refund-rules | 需登录 | 获取活动退款规则 |
| GET | /api/order/by-out-trade-no/{outTradeNo} | 需登录 | 根据微信支付out_trade_no获取订单跳转信息(订单中心入口) |
| POST | /api/order/create | 需登录 | 创建订单 |
| GET | /api/order/list | 需登录 | 获取订单列表 |
| GET | /api/order/{id} | 需登录 | 获取订单详情 |
| POST | /api/order/{id}/cancel | 需登录 | 取消订单 |
| POST | /api/order/{id}/refund | 需登录 | 申请退款 |
| GET | /api/order/{id}/refund-preview | 需登录 | 退款预览 |
| 支付 · 3 | |||
| POST | /api/payment/create | 需登录 | 创建支付 |
| GET | /api/payment/status/{orderNo} | 需登录 | 查询支付状态 |
| POST | /api/payment/wx-notify | 公开 | 微信支付回调 |
| 活动 / 行程 / 拼团(存量) · 18 | |||
| GET | /api/activity/banner/list | 需登录 | 获取小程序轮播图 |
| GET | /api/activity/list | 公开 | 获取活动列表 |
| GET | /api/activity/recommend | 公开 | 获取推荐活动 |
| GET | /api/activity/top/list | 需登录 | 获取置顶活动(去哪玩+考证拼团) |
| GET | /api/activity/{id} | 公开 | 获取活动详情 |
| GET | /api/activity/{id}/dates | 公开 | 获取活动可选日期 |
| GET | /api/activity/{id}/time-slots | 公开 | 获取活动时间段(训练类) |
| GET | /api/agreement/list | 公开 | 按类型获取启用中的协议列表 |
| GET | /api/agreement/{id} | 公开 | 获取协议详情 |
| GET | /api/course/detail/{id} | 公开 | 获取课程详情 |
| GET | /api/course/group/list 待下线 | 公开 | [待下线] 获取可参与拼团列表 |
| GET | /api/course/group/{id} 待下线 | 需登录 | [待下线] 获取考证拼团详情 |
| POST | /api/course/order/create 待下线 | 需登录 | [待下线] 创建拼团订单(单独买/开团/参团) |
| GET | /api/training/eligibility | 需登录 | 获取用户训练资格(计费规则) |
| POST | /api/training/order/create | 需登录 | 创建训练订单 |
| GET | /api/trip/list | 公开 | 获取去哪玩活动列表 |
| POST | /api/trip/order/create | 需登录 | 创建旅游订单 |
| GET | /api/trip/{id} | 公开 | 获取去哪玩活动详情(含团期) |
| 通用拼团(存量) · 6 | |||
| GET | /api/group/activity/{activityId} 待下线 | 公开 | [待下线] 活动相关团购 |
| POST | /api/group/create/{activityId} 待下线 | 需登录 | [待下线] 发起团购 |
| GET | /api/group/detail/{id} 待下线 | 公开 | [待下线] 团购详情 |
| POST | /api/group/join/{id} 待下线 | 需登录 | [待下线] 参与团购 |
| GET | /api/group/list 待下线 | 公开 | [待下线] 团购列表 |
| GET | /api/group/my 待下线 | 需登录 | [待下线] 我的团购 |
| 潜伴 · 11 | |||
| POST | /api/buddy/cancel/{id} | 需登录 | 取消潜伴 |
| POST | /api/buddy/create | 需登录 | 发布潜伴 |
| GET | /api/buddy/detail/{id} | 公开 | 潜伴详情 |
| POST | /api/buddy/join/{id} | 需登录 | 加入潜伴 |
| GET | /api/buddy/list | 公开 | 潜伴列表 |
| GET | /api/buddy/members/{id} | 公开 | 获取成员列表 |
| GET | /api/buddy/my/joined | 需登录 | 我参与的潜伴 |
| GET | /api/buddy/my/published | 需登录 | 我发布的潜伴 |
| GET | /api/buddy/publish-eligibility | 需登录 | 检查发布找潜伴的资格 |
| POST | /api/buddy/quit/{id} | 需登录 | 退出潜伴 |
| POST | /api/buddy/want/{id} | 需登录 | 标记/取消想去 |
| 社区 · 12 | |||
| POST | /api/community/comment/create | 需登录 | 发表评论 |
| POST | /api/community/comment/delete/{id} | 需登录 | 删除评论 |
| POST | /api/community/comment/like/{id} | 需登录 | 点赞评论 |
| POST | /api/community/comment/unlike/{id} | 需登录 | 取消点赞评论 |
| GET | /api/community/comments/{postId} | 公开 | 获取评论列表 |
| GET | /api/community/my/posts | 需登录 | 我的帖子 |
| POST | /api/community/post/create | 需登录 | 发布帖子 |
| POST | /api/community/post/delete/{id} | 需登录 | 删除帖子 |
| POST | /api/community/post/like/{id} | 需登录 | 点赞帖子 |
| POST | /api/community/post/unlike/{id} | 需登录 | 取消点赞帖子 |
| GET | /api/community/post/{id} | 需登录 | 帖子详情 |
| GET | /api/community/posts | 公开 | 帖子列表 |
| 商城 · 18 | |||
| POST | /api/mall/address/create | 需登录 | 新增地址 |
| GET | /api/mall/address/default | 需登录 | 获取默认地址 |
| GET | /api/mall/address/list | 需登录 | 获取地址列表 |
| GET | /api/mall/address/{id} | 需登录 | 获取地址详情 |
| POST | /api/mall/address/{id}/default | 需登录 | 设置默认地址 |
| POST | /api/mall/address/{id}/delete | 需登录 | 删除地址 |
| POST | /api/mall/address/{id}/update | 需登录 | 更新地址 |
| POST | /api/mall/cart/add | 需登录 | 添加购物车 |
| POST | /api/mall/cart/clear | 需登录 | 清空购物车 |
| GET | /api/mall/cart/list | 需登录 | 购物车列表 |
| POST | /api/mall/cart/remove/{id} | 需登录 | 删除购物车商品 |
| POST | /api/mall/cart/select-all | 需登录 | 全选/取消全选购物车 |
| POST | /api/mall/cart/select/{id} | 需登录 | 选择/取消选择购物车商品 |
| POST | /api/mall/cart/update | 需登录 | 更新购物车 |
| GET | /api/mall/categories | 公开 | 商品分类列表 |
| POST | /api/mall/order | 需登录 | 创建商城订单 |
| GET | /api/mall/product/{id} | 公开 | 商品详情 |
| GET | /api/mall/products | 公开 | 商品列表 |
| 教练(存量) · 3 | |||
| GET | /api/coach/detail/{id} 待下线 | 公开 | [待下线] 教练详情(内部ID) |
| GET | /api/coach/list | 公开 | 教练列表 |
| GET | /api/coaches/{userNo} | 公开 | 教练详情(按对外编号) |
| 场馆 · 2 | |||
| GET | /api/venues | 公开 | 场馆列表 |
| GET | /api/venues/{id} | 公开 | 场馆详情 |
| 城市 · 3 | |||
| GET | /api/city/hot | 公开 | 获取热门城市 |
| GET | /api/city/list | 公开 | 获取城市列表(按首字母分组) |
| GET | /api/city/search | 公开 | 搜索城市 |
| 潜点 · 4 | |||
| GET | /api/hotspot/dive-site/{id} | 公开 | 获取具体潜点详情 |
| GET | /api/hotspot/list | 公开 | 热门目的地列表 |
| GET | /api/hotspot/{hotspotId}/dive-sites | 公开 | 获取某目的地下的具体潜点列表 |
| GET | /api/hotspot/{id} | 公开 | 获取潜点详情 |
| 地区 · 4 | |||
| GET | /api/location/cities/hot | 需登录 | 获取热门城市列表 |
| GET | /api/location/continents | 需登录 | 获取洲列表 |
| GET | /api/location/countries | 需登录 | 根据洲获取国家/目的地列表 |
| GET | /api/location/hotspot/{hotspotId}/dive-sites | 需登录 | 根据目的地获取潜点列表 |
| 分销 · 11 | |||
| POST | /api/distribution/bind | 需登录 | 绑定分销关系 |
| POST | /api/distribution/qrcode | 需登录 | 生成分享太阳码 |
| GET | /api/distribution/qrcode/distributor | 需登录 | 生成分销专属二维码 |
| GET | /api/distribution/records | 需登录 | 获取分销记录 |
| GET | /api/distribution/referred-users | 需登录 | 推荐用户列表 |
| GET | /api/distribution/stats | 需登录 | 获取分销统计 |
| GET | /api/distribution/status | 需登录 | 检查是否为分销商 |
| GET | /api/distribution/wallet | 需登录 | 获取钱包信息 |
| GET | /api/distribution/wallet/records | 需登录 | 获取钱包流水 |
| POST | /api/distribution/withdrawal | 需登录 | 申请提现 |
| GET | /api/distribution/withdrawals | 需登录 | 提现记录 |
| 教练入驻 · 2 | |||
| GET | /api/coach-entry/status | 需登录 | 获取入驻申请状态 |
| POST | /api/coach-entry/submit | 需登录 | 提交入驻申请 |
| 勋章 · 2 | |||
| GET | /api/user/medals | 需登录 | 我的勋章 |
| GET | /api/user/medals/{code} | 需登录 | 勋章详情 |
| AI 助手 · 7 | |||
| POST | /api/ai/chat | 需登录 | 发送聊天消息 |
| POST | /api/ai/conversation/create | 需登录 | 创建新对话 |
| GET | /api/ai/conversation/id | 需登录 | 获取或创建对话ID |
| GET | /api/ai/conversation/{conversationId}/messages | 需登录 | 获取对话历史 |
| GET | /api/ai/conversations | 需登录 | 获取用户对话列表 |
| POST | /api/ai/image/generate | 需登录 | 图像生成 |
| POST | /api/ai/image/recognize | 需登录 | 图像识别 |
| 文件上传 · 1 | |||
| POST | /api/file/upload | 需登录 | 上传文件 |
| 场景演示 · 2 | |||
| GET | /api/scene/categories | 公开 | 演示:分类目录 |
| GET | /api/scene/destinations | 公开 | 演示:目的地商品列表 |
| 系统 · 1 | |||
| GET | /api/system/cs-config | 公开 | 获取客服配置 |