DB

接口交接文档

深蓝出逃 · 小程序开发专用,请输入访问密码

分支 feat/user-identity-system 提交 16c92a9 C API https://api.deepblueplan.com

00先看这一页

服务端本轮迭代已完成并全部上线。这份文档给小程序的开发同学:哪些接口新增、哪些被重新设计、哪些要停用,以及每块业务背后的数据关系。

6
业务域发生变化
185
C 端接口总数
13
已标记待下线
60
无需登录可调

最重要的五件事

#变化对小程序意味着什么章节
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。
我的(个人中心)改新增训练记录、潜水记录、他人主页入口;资料读取换新路径。
本文与代码的一致性 端点清单由源码注解自动提取(共 185 条),字段与口径来自 docs/api-changes.md 与迁移脚本。 如发现文档与线上实际返回不一致,以线上返回为准,并告知后端修正本文。

01通用约定

所有接口共享同一套响应、鉴权与错误约定,先对齐这页能省掉一半联调时间。

项约定
C 端 BaseURLhttps://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(后端把业务规则拒绝也放在这里),不要替换成“系统繁忙”。
两个容易踩的约定 ① 业务失败通常是 HTTP 500 + 可读 message,不是 400;② 未登录是 HTTP 401,而「资料不完整」是 HTTP 403 + 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。它影响每一个带用户的接口。

旧:内部数字 ID 对外暴露小程序/api/user/profile/api/training/bookingC APIuser.id(数字,可枚举)风险:遍历 ID 即可拿到他人资料 / 约课新:对外只用 user_no(不可枚举)小程序/api/users/me/profile/api/users/{userNo}/*C APIuser_no = usr_UserNoResolver → id传内部数字 ID 一律 404同一份数据,两种取法用户(user)id 内部主键user_no usr_nickname / avatar课次(training_session)coach_user_no 下发用coach_user_id 仅内部required_certificate_code约课(training_booking)user_id 内部traveler_id 内部order_id 内部前端只需要记住三条① 新接口路径里的“人”一律用 userNo 或字面量 me;② 响应里的“人”用 userNo / coachUserNo / shareUserNo;③ 老接口(返回数字 id)逐步下线,见 §10 迁移映射。
图 1 身份标识改造:从内部数字 ID 到对外 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/profileGET /api/users/me/profile改读取改新路径;写入仍在 POST /api/user/profile/update
GET /api/coach/detail/{id}GET /api/coaches/{userNo}待下线教练主页改用新路径
GET /api/user/dive-logsGET /api/users/{userNo|me}/dive-logs待下线发布/编辑/删除仍在 /api/user/dive-logs
GET /api/coach/{id}/activitiesGET /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 已删除,必须换新接口。

venue 场馆idname / city_idimages (json)lat / lngstatustraining_course_typecode 如 DEPTHnameentitlement_typestatustraining_session 课次id · venue_id · course_typecoach_user_id / coach_user_nosession_date / start_timecapacity / bookedsolo_price / ticket_pricecancel_deadline_hoursrequired_certificate_codestatus 0..4user 用户iduser_nocertification_status1:N1:N1:Norder_info 订单id · order_noorder_type = 1pay_amountstatustraining_booking 约课id · booking_nouser_id · session_idtraveler_idpay_type / amountstatus / order_idtraining_log 评价id · booking_id (uniq)content / imagesstatus / version1:11:11:N 报名user_course_packageid · package_nouser_idstatus / expires_atentitlement_snapshot_jsonuser_course_package_quotapackage_id + entitlement_typequota_modetotal / reserved / usedquota_ledger 流水package_idaction / quantitybefore / after扣次读法场馆 × 课程类型 = 课次;学员对课次产生约课;课包与权益次数决定“这次要不要付钱”,付完 / 扣完并由教练发布训练记录后完成核销。
图 2 约训练域关系:场馆 / 课次 / 约课 / 课包 / 评价

三级页面与接口

层级接口登录用途与关键字段
一级:总览 GET /api/training/course-types/overview
?cityId&lat&lng
否 课程类型卡片:code、name、coverImage、upcomingCount、nextSession{…}(含 coachUserNo、distanceKm、bookable、blockReason)
一级:筛选 GET /api/training/course-types
GET /api/training/venues?cityId
GET /api/venues?cityId
GET /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/create
GET /api/payment/status/{orderNo}
是 微信支付参数;轮询支付状态(间隔 ≥ 2s,不要密集轮询)。
我的约课 GET /api/training/bookings
GET /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 支持多个编码逗号分隔,表示持有任一即可;精确匹配证书编码,不做等级大小比较。

约课主流程

① 选课次② GET …/eligibilitycanBook ?是③ POST …/bookings否展示 blockReason金额判断amount == 0 ?是直接约课成功 BOOKED否(amount > 0):拿 orderNo 去支付返回 orderNoPOST /api/payment/createGET /payment/status/{orderNo}回调后 → BOOKED取消POST …/bookings/{id}/cancel开课前 ≥ 12h ?是释放名额 + 回滚课包次数否cancellable=false引导走订单退款(按退款政策)
图 3 约课主流程:资格 → 下单 → 支付 / 直接成功 → 取消

payType 判定顺序(后端已算好,前端只展示)

顺序条件payType金额
1认证教练(持教练类证书)FREE_COACH0
2预备教练且本周免费额度未用FREE_QUOTA0
3课程类型不参与课包抵扣(体验课等)SOLO单卖价
4可用课包且对应权益有余额PACKAGE0(扣 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课包与权益:按次抵扣与核销

课包是“按次承诺”的商品:买了课包,约课时按课程类型对应的权益扣次数,而不是付钱。理解这张图,就能理解所有“剩余次数”的口径。

WAITING_GROUP拼团待成团成团PENDING_ACTIVATION待激活(未开始计时)首次约课ACTIVE使用中(可约课)暂停SUSPENDED已暂停(有效期冻结)启用(按暂停时长顺延)到期 / 撤销EXPIREDREVOKED退款撤销:不退款不撤销配额是怎么记的每个权益一行:(package_id, entitlement_type) 唯一。reserved = 已占用(约课成功未核销),used = 已核销(教练发布记录)。可用 = total − reserved − used;UNLIMITED 时 available = null。快照原则(重要)课包发放时把模板 rulesJson 冻结进 entitlement_snapshot_json,之后改模板不影响已发放课包;订单也在下单时冻结规则快照。一次约课 / 核销在流水里的样子约课成功RESERVEreserved +1开课后教练记录CONSUMEreserved −1, used +1开课前取消RELEASEreserved −1管理台手工调整ADJUST_*带 before/after 与原因
图 4 课包生命周期与权益次数记账

我的课包(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…)
actionGRANT 发放 / 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课程商品:直售 / 拼团卖课包次数

课程商品是「考证拼团」的泛化:售卖的是课包模板的次数,买完到约训练约课扣次。价格与档位一律取自课包模板,商品本身不存价格。

course_product 课程商品id / titlesale_mode: STANDARD | GROUPgroup_sizerepeat_purchasestatus / sale_start / sale_endcourse_package_template_id课包模板(价格来源)template_codesolo_pricegroup_price_tiers_jsonrules_json取价STANDARD 直售支付成功 → 立即发放课包GROUP 拼团开团 / 参团 → 满员 → 逐单发放拼团时间线下单(type=create / join)支付窗口 30 分钟满员 ?是成团 → 发放课包到期仍未成团关团 → 已付转「待退款」前端要处理的三种异常未支付超时 → 订单取消、释放团位;成团失败 → 待退款(不是退款完成);重复购买受限 → 下单被拒。
图 5 课程商品:直售与拼团如何产出课包

接口

接口登录说明
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 跳「我的课包」
待退款 / 已退款展示“拼团未成团,退款处理中/已退款”
已取消展示取消原因
与老「考证拼团」的关系 老的 /api/course/group/* 与 /api/group/* 已标记 待下线(只读保留)。 新功能一律接课程商品;迁移映射见 §10。

06证书:目录、我的证书、教练资格

证书体系从“手填文本”改成“目录 + 审核”:用户从字典里选证书,服务端按目录回填名称/机构/等级;证书是报名门槛与教练资格的依据。

certificate_definition 目录certificate_code(唯一)category: FREEDIVING | SCUBAqualificationType: DIVER | COACHorganization / leveldisplay_name / card_imagestatus / sort_ordercourse_package_template_certificatetemplate_idcertificate_codeis_primaryuser_course_packagecertificate_code(目标)entitlement_snapshot_jsonstatus引用发放后应得user_certification 用户证书user_id + certificate_code(唯一)status: 0 待审 / 1 通过 / 2 驳回cert_no / issued_at / imagescoach_qualification实际授予证书能解锁什么报名门槛:课次 required_certificate_code(多个编码任一即可)教练资格:coach_qualification = 1 且目录 qualificationType = COACH用户等级:已通过证书中 sort_order 最高的一张
图 6 证书:目录 → 课包目标证书 → 用户实际持有

① 证书目录(公开)

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 张)
status0 待审核 / 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个人日志:训练记录、教练评价、成绩档案

课程结束后,教练为每个报名学员登记评价(文字、图片、成绩指标);学员在「我的日志 → 训练记录」查看每次约训与历史成绩曲线。

training_sessionidsession_datecourse_typetraining_bookingid · user_idstatus: BOOKED / ATTENDEDNO_SHOW / CANCELLEDtraining_logbooking_id(唯一)content / imagesstatus: DRAFT | PUBLISHEDversionlog_metriclog_idmetric_codevalue / unitmetric_definition 字典code / namecategory: POOL | DEPTHunit / betterDirectioncourse_type_codesrequired限定可填指标口径教练发布(draft=false)才计入学员「最佳成绩」;草稿不校验必填。发布即核销该学员约课(占用转已用、扣课包次数);标缺席只释放占用。重复提交是更新并写历史版本。
图 7 训练记录:约课 → 评价 → 成绩指标

① 指标字典(决定“不同课程类型填不同内容”)

GET /api/user/training/metric-defs?courseType=DEPTH(需登录)

字段说明
code / name指标编码与名称,如 DYNB / 动态双蹼
categoryPOOL 泳池 / DEPTH 深度 / OTHER
unit米 / 秒(闭气以秒存储,前端展示 2'00")
betterDirectionMAX 越大越好 / 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-activitiesTA 的约潜:发起或参与的潜伴活动(日期、标题、封面、地点、人数、前 6 位头像、OWNER/JOINED)
GET /api/users/{userNo}/dive-logsTA 的日志:公开且未下架的潜水记录(封面、标题、地点、教练、点赞数;登录时带 liked)
GET /api/users/{userNo}/medalsTA 的勋章:当前返回 { 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/*(通用拼团)待下线同上一套语义

分层价的三个硬规则

  1. groupBuyEnabled=false → 隐藏拼团入口(该课包未配置拼团价);
  2. 有多档位时下单必须传 tierSize,否则报「请选择拼团档位」;传了不存在的档位报「该课程不支持 N 人拼团」;
  3. 团的有效期是团级的(开团时写死 endTime),与活动的 registrationDeadline 无关。
建议 新页面直接接 §05 课程商品,不要在这套接口上继续加功能。迁移映射见 §10。

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已下线路径变更
下线节奏 标了 待下线 的接口会保留到“新版页面全量”之后。服务端删除前会先确认小程序主干 0 调用,并同步更新本文与 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

个人日志与内容

事项章节
☐学员「训练记录」:按日期分组、未评价占位、成绩详情与曲线§07
☐教练端「待核销」入口:status=4 + pendingStudentCount§07
☐教练评价表单:按 availableMetrics 渲染、草稿/发布§07
☐他人主页:资料/约潜/日志/勋章占位/首屏聚合§08
☐潜水记录发布/编辑/删除/可见性/点赞§08
☐老拼团页迁移到课程商品(或明确保留期限)§10

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 待核销
payTypeFREE_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 / shareUserIduserNo / 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 条)

由源码注解自动提取。可输入路径或关键字过滤;公开 表示无需登录。

显示 185 / 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公开获取客服配置