文档日期:2026-07-28
适用范围:mingdaojingjiang_uniapp游客小程序、backend统一后端、frontend管理后台,以及后续导游端接口。
文档目标:按照游客实际使用流程逐步补齐接口,保证小程序、导游端和管理后台使用同一套业务数据、状态机和权限规则。
完成后应满足以下结果:
pages.json 注册的 20 个业务页面不再依赖订单、用户、评价、反馈和协议 Mock 数据。{ code, message, data };分页数据使用 { records, total, page, size }。| 客户端 | 接口前缀 | Token 类型 | 权限 |
|---|---|---|---|
| 管理后台 | /api/admin/** |
ADMIN |
ROLE_ADMIN |
| 游客小程序 | /api/mini/** |
MINI |
ROLE_MINI_USER |
| 导游端 | /api/guide/** |
GUIDE |
ROLE_GUIDE_USER |
三端应继续使用独立 Token,不允许小程序 Token 调用后台或导游端接口。
| 领域 | 当前能力 | 结论 |
|---|---|---|
| 小程序认证 | 用户名密码登录、注册、退出 | 仅适合本地框架验证,不符合当前微信手机号授权页面 |
| 小程序资料 | 查询、修改昵称/手机号/头像 | 可复用,需要接入真实 Token 和上传能力 |
| 小程序评价 | 提交已完成订单评价 | 已有核心校验,但缺少评价查询和图片能力 |
| 城市管理 | 后台新增、查询、启停 | 已有后台能力,缺少小程序只读接口 |
| 景区管理 | 后台景区、四类价格、汇合点、时间参数配置 | 已有后台能力,缺少小程序只读接口 |
| 订单管理 | 后台列表、详情、直接退款 | 只有后台查询和模拟退款,缺少下单及真实状态流转 |
| 导游管理 | 档案、审核、讲解队、景区配置、启停 | 已有管理能力,缺少在线、位置、接单和服务接口 |
| 评价管理 | 后台查询、删除 | 已有闭环基础 |
| 反馈管理 | 后台查询、处理 | 缺少游客提交接口 |
| 协议管理 | 后台查询、编辑 | 缺少小程序读取接口 |
| 平台设置 | 自动退款时间、派单门槛、客服、结算等 | 配置已存在,但尚未驱动订单任务和小程序展示 |
constants/scenics.js:景区 Mock。constants/meeting-points.js:汇合点 Mock。constants/services.js:服务套餐和价格 Mock。pages/home/index.vue:当前订单、报价、下单和支付均为前端模拟。pages/order-waiting/index.vue:固定等待约 5 秒后进入待讲解页,并非后端接单结果。pages/orders/index.vue:订单列表为 Mock。pages/profile/index.vue:资料只保存在本地缓存。pages/feedback/index.vue:提交成功由 setTimeout 模拟。pages/agreement-detail/index.vue:协议内容未读取后台配置。pages/customer-service/index.vue:客服信息未读取平台设置。utils/request.js:未统一附加小程序 Token,也未集中处理 401 登录失效。services/city.js 和 services/scenic.js 当前请求 /api/cities、/api/scenics,与项目 /api/mini/** 的安全边界不一致。当前存在三套命名:
| 业务含义 | 景区价格配置 | 订单/后台 | 小程序 Mock |
|---|---|---|---|
| 拼团快讲 | GROUP_FAST |
GROUP_QUICK |
group_quick |
| 拼团精讲 | GROUP_PREMIUM |
GROUP_PREMIUM |
group_deep |
| 包团快讲 | PRIVATE_FAST |
PRIVATE_QUICK |
private_quick |
| 包团精讲 | PRIVATE_PREMIUM |
PRIVATE_PREMIUM |
private_deep |
统一后的后端领域编码固定为:
GROUP_QUICK
GROUP_PREMIUM
PRIVATE_QUICK
PRIVATE_PREMIUM
小程序可以保留展示文案,但提交接口时必须使用后端领域编码。历史 operation_scenic_pricing.service_type 中的 GROUP_FAST、PRIVATE_FAST 需要迁移为统一值。
游客在未登录时允许浏览城市、景区、套餐、汇合点、协议和客服信息;下单、订单、资料、反馈和评价必须登录。
建议在 SecurityConfig 中只放行:
POST /api/mini/auth/wechat-phone-login
GET /api/mini/catalog/**
GET /api/mini/content/**
POST /api/mini/payments/wechat/notify
支付回调必须进行微信签名校验,不能因为免登录而跳过安全验证。
clientRequestId,同一游客重复提交返回同一订单。409,前端收到后重新拉取订单详情。| 后端状态 | 小程序页面 | 后台显示 | 允许操作 |
|---|---|---|---|
PENDING_PAYMENT |
待支付 | 待支付 | 用户支付、用户取消、超时关闭 |
PENDING_ACCEPT |
等待接单 | 待接单 | 导游接单/拒单、用户取消、超时退款、后台指派 |
PENDING_MEETING |
待讲解 | 待前往汇合点 | 导游到达、开始讲解、用户申请取消、后台改派 |
IN_SERVICE |
讲解中 | 服务中 | 导游结束讲解;取消仅允许后台按售后规则处理 |
COMPLETED |
待评价或已完成 | 已完成 | 用户评价、后台退款 |
CANCELLED |
已取消 | 已取消 | 查看取消原因;已支付订单继续关注退款状态 |
REFUNDED |
已取消/已退款 | 已退款 | 只读 |
不新增 PENDING_REVIEW 订单主状态。订单 COMPLETED 后通过是否存在 tour_order_review 判断:
hasReview=false:进入小程序待评价页。hasReview=true:进入已完成页和评价详情页。这样后台订单、财务和评价统计不会因为评价动作改变服务完成状态。
订单主状态不能替代支付流水状态,建议独立维护:
paymentStatus: UNPAID | PAYING | PAID | CLOSED | FAILED
refundStatus: NONE | REFUNDING | REFUNDED | REFUND_FAILED
当前只有 refundStatus=NONE/REFUNDED,接入真实微信退款前必须扩展。
启动小程序
-> 加载城市、景区、汇合点、套餐和客服/协议配置
-> 游客选择景区、汇合点、套餐和人数
-> 后端报价
-> 未登录则微信手机号授权登录
-> 创建待支付订单
-> 微信支付预下单
-> wx.requestPayment
-> 微信支付回调确认成功
-> 订单进入待接单
-> 派单服务选择候选导游
-> 导游接单
-> 订单进入待讲解
-> 导游到达并开始讲解
-> 订单进入讲解中
-> 导游结束讲解
-> 订单进入已完成
-> 游客评价
-> 后台查看订单、评价和结算数据
取消分支:
待支付取消 -> 关闭订单,不退款
待接单取消/超时 -> 取消订单,已支付则发起退款
待讲解取消 -> 按业务规则退款并记录取消方、原因
讲解中取消 -> 不允许游客直接取消,进入后台售后处理
后台退款 -> 与用户取消共用退款服务和退款流水
实施状态(2026-07-28):已完成。代码、数据库迁移和三端构建验证均已通过。
已落地内容:
ServiceType、OrderStatus、PaymentStatus、RefundStatus、CancelParty、CancelReasonCode。GROUP_FAST、PRIVATE_FAST。GROUP_QUICK、GROUP_PREMIUM、PRIVATE_QUICK、PRIVATE_PREMIUM。backend/db/migrations/20260728_180000_unify_domain_enums.sql,用于迁移景区价格和历史订单旧编码。mvn test、管理后台 npm run build、小程序 npm run build:mp-weixin,均通过。tour_guide 数据库执行迁移,版本 20260728_180000_UNIFY_DOMAIN_ENUMS 已登记;景区价格和订单旧编码残留数量均为 0。目的: 先消除服务类型、订单状态、支付状态和取消原因的多套命名,避免前后端各自转换后继续产生脏数据。
操作:
ServiceType、OrderStatus、PaymentStatus、RefundStatus、CancelParty、CancelReasonCode。GROUP_FAST、PRIVATE_FAST 迁移为 GROUP_QUICK、PRIVATE_QUICK。constants/services.js 改为使用统一领域编码,不再使用 group_deep、private_deep 作为接口值。orderOptions.js 与后端枚举保持一致。影响范围: 景区价格表、订单表、后台景区配置、后台订单筛选、小程序套餐选择和后续所有订单接口。
验证:
operation_scenic_pricing,只能出现四个统一服务类型。注意: 数据迁移必须先备份;过渡期后端可临时读取旧值,但写入必须只写新值,兼容代码在数据迁移完成后删除。
目的: 后续页面只调用 services/,统一处理地址、Token、响应解包、错误提示和登录失效。
操作:
config/api.js 拆分为开发、测试、生产环境配置,真机不能使用 127.0.0.1。utils/request.js 自动读取 mini_token 并附加 Authorization: Bearer <token>。401 时清理 Token 和用户缓存,并跳转登录页,同时保留原目标页面地址。409 状态冲突不直接显示通用错误,订单页面应重新加载最新状态。services/auth.js、services/order.js、services/profile.js、services/content.js、services/feedback.js。uni.request 调用。影响范围: 小程序所有接口请求、登录守卫、错误提示和环境切换。
验证:
401,小程序跳转登录页。注意: 本地开发可关闭微信域名校验,但测试版和正式版必须配置 HTTPS 合法域名。
实施状态(2026-07-29):代码、本地 HTTP 启动验证、后端自动化测试和小程序微信构建均已通过;需要在微信开发者工具或真机使用一次性授权码完成最终微信侧联调。
已落地内容:
POST /api/mini/auth/wechat-phone-login,接收 loginCode 和 phoneCode。openid 创建游客,再次授权复用同一游客并同步手机号。clientType=MINI 的 JWT,并写入 Redis 会话。uni.login + getPhoneNumber 调用。Authorization: Bearer <token>。WECHAT_APPID、WECHAT_APP_SECRET 环境变量读取。mvn test,共 6 项测试通过;已执行小程序 npm run build:mp-weixin,构建通过。GET /api/health 返回 UP。POST /api/mini/auth/wechat-phone-login 不会被安全层拦截,空请求按业务校验返回 400。目的: 让当前登录页的 getPhoneNumber 授权结果换取真实小程序用户和 MINI Token。
操作:
POST /api/mini/auth/wechat-phone-login。uni.login 获取 loginCode,再将 loginCode 和 getPhoneNumber 返回的 phoneCode 提交后端。openid 和手机号,以 mini_user.openid 查找或创建用户。clientType=MINI 的 JWT,并写入 Redis 会话。建议请求:
{
"loginCode": "wx.login返回值",
"phoneCode": "getPhoneNumber返回值",
"agreementCodes": ["USER_AGREEMENT", "PRIVACY_POLICY"]
}
影响范围: MiniAuthController、AuthService、微信配置、mini_user、小程序登录页、后台游客列表。
验证:
mini_user.id,不会重复创建账号。/api/admin/** 和 /api/guide/**。注意: 微信密钥只能放在后端环境变量;不得将 session_key、AppSecret 或完整身份证信息返回小程序。
目的: 让首页和景区选择页完全由后台运营配置驱动。
操作:
新增只读接口:
GET /api/mini/catalog/cities
GET /api/mini/catalog/scenics?cityId=&keyword=
GET /api/mini/catalog/scenics/{scenicId}
GET /api/mini/catalog/scenics/{scenicId}/meeting-points
GET /api/mini/catalog/scenics/{scenicId}/services
GET /api/mini/catalog/scenics/nearest?longitude=&latitude=
查询规则:
operation_city.status=1 且未删除的城市。status=1,按 sort_order 和 id 排序。firstOrderLeadMinutes、visitorNoOrderMinutes、unpaidCancelMinutes,但是否可下单仍由报价接口实时判断。availableGuideCount=null,前端隐藏该文案。影响范围: 后端运营服务、小程序首页、景区选择页、后台城市和景区管理。
验证:
注意: 小程序当前接口地址 /api/cities、/api/scenics 必须统一改为 /api/mini/catalog/**。
目的: 登录协议、服务协议和客服页面与后台配置保持一致。
操作:
新增接口:
GET /api/mini/content/agreements
GET /api/mini/content/agreements/{code}
GET /api/mini/content/customer-service
协议接口复用 AgreementSettingService,客服接口复用 PlatformSettingsService;Controller 只负责鉴权边界和响应转换。
影响范围: 登录页、协议列表、协议详情、联系客服页、后台协议设置和平台设置。
验证:
注意: 后续如需强制重新同意,应为协议增加版本号和生效时间,不能只依赖 updatedAt。
目的: 防止小程序自行计算价格,并在下单前集中校验景区、汇合点、套餐、人数和运营时间。
操作:
新增:
POST /api/mini/orders/quote
请求至少包含:
{
"scenicId": 1,
"meetingPointId": 10,
"serviceType": "GROUP_QUICK",
"peopleCount": 2
}
后端校验:
minParticipants 与 maxParticipants 范围内。BigDecimal。影响范围: 景区价格配置、首页服务选择和确认订单弹窗。
验证:
注意: 创建订单时必须再次计算并校验,报价响应不能作为后端直接信任的最终金额。
目的: 让首页和全部订单页面由真实订单驱动,并为支付、派单和评价提供主数据。
操作:
新增接口:
POST /api/mini/orders
GET /api/mini/orders?page=&size=&status=
GET /api/mini/orders/current
GET /api/mini/orders/{orderId}
创建订单要求:
visitorId,不接受前端传游客 ID。PENDING_PAYMENT,支付状态为 UNPAID。clientRequestId 防止按钮连点产生重复订单。列表状态映射:
pendingPay -> PENDING_PAYMENT
waiting -> PENDING_ACCEPT
pendingGuide -> PENDING_MEETING
serving -> IN_SERVICE
pendingReview -> COMPLETED + hasReview=false
completed -> COMPLETED + hasReview=true
canceled -> CANCELLED 或 REFUNDED
影响范围: tour_order、订单状态日志、小程序首页当前订单、订单列表和七类订单详情页、后台订单列表与详情。
验证:
orderId 不能读取他人订单。clientRequestId 只产生一条订单。注意: 当前订单表主要保存名称快照,需要增加 scenic_spot_id、meeting_point_id、service_type、payment_status、client_request_id、取消信息和乐观锁字段。
目的: 替换首页 setTimeout 模拟支付,确保支付结果由微信回调确认。
操作:
新增接口:
POST /api/mini/orders/{orderId}/payment/prepay
POST /api/mini/payments/wechat/notify
GET /api/mini/orders/{orderId}/payment-status
支付流程:
PENDING_PAYMENT。uni.requestPayment。PAID、订单状态改为 PENDING_ACCEPT。影响范围: 小程序确认支付、订单支付状态、后端微信配置、支付流水、后台订单详情和财务数据。
验证:
注意: 开发环境如需模拟支付,必须由后端测试配置显式开启,不能由小程序直接把订单改成已支付。
目的: 让等待接单页由真实导游操作驱动,并与后台导游、讲解队和平台派单配置一致。
操作:
后端新增领域能力:
导游端接口建议:
PUT /api/guide/runtime/status
POST /api/guide/runtime/location
GET /api/guide/orders/pending
POST /api/guide/orders/{orderId}/accept
POST /api/guide/orders/{orderId}/reject
GET /api/guide/orders
后台接口建议:
GET /api/admin/orders/{orderId}/dispatch-records
POST /api/admin/orders/{orderId}/assign
POST /api/admin/orders/{orderId}/reassign
派单规则读取后台平台设置,优先级按当前后台文案:评分、接单数、注册先后;具体是否使用距离必须在启用位置上报后统一决定。
影响范围: 导游运行状态、导游景区配置、订单、派单记录、小程序等待接单页、后台订单详情和导游端。
验证:
409。PENDING_MEETING,小程序轮询后自动进入待讲解页。注意: 小程序 pages/order-waiting/index.vue 的固定 5 秒跳转必须删除;第一阶段可每 2 至 3 秒轮询订单详情,后续再接 WebSocket 或订阅消息。
目的: 将小程序取消弹窗、后台退款和平台自动退款统一到真实退款闭环。
操作:
新增接口:
POST /api/mini/orders/{orderId}/cancel
GET /api/mini/orders/{orderId}/refund-status
POST /api/mini/refunds/wechat/notify
后台现有 PUT /api/admin/orders/{id}/refund 改为调用统一退款服务,不再直接写 REFUNDED。
取消规则:
PENDING_PAYMENT:订单改为 CANCELLED,关闭支付单,不发起退款。PENDING_ACCEPT:订单改为 CANCELLED,已支付则创建退款流水。PENDING_MEETING:按后台配置和取消原因决定全额或人工处理。IN_SERVICE:游客端禁止直接取消,提示联系客服。影响范围: 订单、退款流水、定时任务、小程序取消弹窗、等待接单页、已取消页、后台订单和财务页面。
验证:
注意: 退款请求成功不等于退款完成,必须区分 REFUNDING 和 REFUNDED;退款失败需要后台可重试和查看原因。
目的: 让待讲解、讲解中和已完成页面由导游服务动作驱动。
操作:
导游端新增:
POST /api/guide/orders/{orderId}/arrive
POST /api/guide/orders/{orderId}/start
POST /api/guide/orders/{orderId}/complete
状态规则:
arrive 记录 arrivedAt,不改变主状态。start 仅允许从 PENDING_MEETING 进入 IN_SERVICE。complete 仅允许从 IN_SERVICE 进入 COMPLETED。影响范围: 导游端、订单详情、小程序待讲解/讲解中/待评价页面、后台订单时间线。
验证:
注意: 开始讲解是否要求导游在汇合点围栏内,应在定位精度和现场流程确认后实现;未确认前不要用前端坐标直接阻断业务。
目的: 复用现有评价服务,完成游客评价、导游评分和后台评价管理闭环。
操作:
保留并完善:
POST /api/mini/reviews
GET /api/mini/orders/{orderId}/review
小程序提交 orderId、score、content;后端继续校验本人订单、订单已完成、已关联导游且未评价。提交成功后重新查询订单详情,不由前端自行改状态。
影响范围: 待评价页、已完成页、评价详情页、导游评分、后台评价列表。
验证:
注意: 当前表只支持文字;如产品确认评价图片,需要独立附件表或 JSON 字段,并接入统一文件上传,不要把 Base64 直接存数据库。
实施状态(2026-07-29):个人资料、退出登录和账号注销已完成;反馈提交仍待后续接入。
个人资料已落地内容:
GET /api/mini/profile 回显当前登录用户手机号、昵称、头像、真实姓名和实名状态。PUT /api/mini/profile 修改昵称,手机号仍以微信授权绑定结果为准,不允许在资料页任意修改。POST /api/mini/profile/avatar 上传 JPG、PNG 或 WebP 头像,单文件不超过 5MB。PUT /api/mini/profile/real-name 填写真实姓名;当前业务规则下真实姓名非空即视为已实名。20260729_110000_ADD_MINI_USER_REAL_NAME 已执行并登记。20260729_120000_ENABLE_GLOBAL_LOGIC_DELETE 已执行;除迁移元数据表外全部业务表均具备 deleted 标识。目的: 清理个人中心剩余本地模拟数据,并使后台游客和反馈管理接收到真实数据。
操作:
使用或新增:
GET /api/mini/profile
PUT /api/mini/profile
POST /api/mini/profile/avatar
PUT /api/mini/profile/real-name
POST /api/mini/feedback
POST /api/mini/auth/logout
DELETE /api/mini/auth/account
反馈接口从当前用户获取 userId、昵称和手机号,固定 feedbackType=VISITOR;后端新增创建方法,后台继续使用现有查询和处理接口。
影响范围: 我的页面、个人资料、反馈、设置、后台游客详情和反馈管理。
验证:
realNameVerified=true,返回个人资料页显示“已实名”。deleted=1,历史订单仍保留。注意: 当前头像文件保存到后端 AVATAR_STORAGE_DIR 配置目录,适合单机开发和测试;生产环境多实例部署时应切换到对象存储或统一文件服务。
目的: 在关闭 Mock 前验证游客、导游、后台和微信回调共同组成的完整链路。
操作:
准备固定测试数据:
执行场景:
影响范围: 全系统。
验证: 后端单元/集成测试、小程序开发者工具、真机支付沙箱、导游端测试入口、后台页面和数据库状态日志全部一致。
注意: 只有当测试和生产配置明确关闭前端订单 Mock、模拟支付和固定 5 秒接单后,才能认为联调完成。
| 小程序页面 | 接口 |
|---|---|
pages/home/index |
城市/景区/汇合点/套餐、当前订单、报价、创建订单、预支付 |
pages/login/index |
微信手机号登录、协议列表/详情 |
pages/scenic-select/index |
城市、景区、附近景区 |
pages/mine/index |
个人资料摘要、订单数量 |
pages/profile/index |
查询和修改个人资料、头像上传 |
pages/real-name/index |
暂不开放;产品确认实名认证方案后单独设计 |
pages/orders/index |
本人订单分页和状态筛选 |
pages/order-pending-pay/index |
订单详情、预支付、取消 |
pages/order-waiting/index |
订单详情轮询、取消、退款状态 |
pages/order-pending-guide/index |
订单详情、导游信息、取消规则 |
pages/order-serving/index |
订单详情、讲解状态 |
pages/order-pending-review/index |
订单详情、提交评价 |
pages/order-completed/index |
订单详情、评价摘要 |
pages/order-canceled/index |
订单详情、取消和退款状态 |
pages/order-review-detail/index |
订单评价详情 |
pages/agreement-list/index |
协议列表 |
pages/agreement-detail/index |
协议详情 |
pages/settings/index |
退出登录;注销账号需另行确认规则 |
pages/customer-service/index |
客服微信和电话 |
pages/feedback/index |
提交游客反馈 |
0,应从订单表统计。按迁移脚本分批执行,不直接修改已部署数据库:
operation_scenic_pricing:统一服务类型历史值。tour_order:增加景区 ID、汇合点 ID、服务类型、支付状态、幂等请求号、取消方、取消原因、取消时间和版本号。tour_order_status_log:记录状态变化前后值、操作者类型、操作者 ID、原因和时间。payment_transaction:记录微信支付单、预支付 ID、金额、状态、回调报文摘要和时间。refund_transaction:记录退款单、退款原因、金额、状态、回调和重试信息。order_dispatch_record:记录候选导游、推送顺序、接单、拒单、超时和改派。guide_runtime_state:记录导游在线状态、忙碌状态、经纬度和最后上报时间。mini_user:保留现有 openid,按微信登录需要补充 unionid、最后登录时间;不持久化可直接换取的短期敏感凭据。一个步骤只有同时满足以下条件才算完成:
setTimeout 模拟业务结果。严格按以下顺序推进,前一步未通过验收时不进入依赖它的下一步:
领域枚举统一
-> 请求层和环境
-> 微信登录
-> 城市/景区/汇合点/套餐
-> 协议和客服
-> 报价
-> 订单创建/查询
-> 微信支付
-> 派单/导游接单
-> 取消/退款
-> 开始/结束讲解
-> 评价
-> 资料/反馈/退出
-> 全流程联调
第一轮建议只实施到“城市/景区/汇合点/套餐”,先验证后台运营配置能够稳定驱动小程序;第二轮完成报价、订单和支付;第三轮完成派单、导游服务、取消退款与评价闭环。