# 拆解计划:管理端抽离 + API 转 Gin(API 路径不变、无缝切换) ## 目标与原则 - **管理端**:从当前 Next 单体中抽离为独立前端项目(SPA),所有请求使用**可配置 baseUrl**,**API 路径与现网完全一致**(如 `/api/orders`、`/api/admin/withdrawals`),便于先对接到现有 Next,后续一键切到 Gin。 - **小程序**:不改动;仅在未来切换后端时修改 `baseUrl` 指向 Gin。 - **后端**:先仍由当前 Next 提供 API;第二阶段用 **Gin** 重写全部接口,**路径、方法、请求/响应体与现有 Next API 保持一致**,实现无缝切换。 --- ## 阶段一:管理端抽离(独立前端) ### 1.1 产出物 - 新仓库或新目录:**soul-admin**(独立 SPA) - 技术栈:React 18 + TypeScript + Vite 5 + React Router 6 + Tailwind CSS 4 + Radix UI(与现有一致)+ Zustand + 统一 API 封装(baseUrl 来自 env) ### 1.2 API 基地址规范(必须 100% 遵守) - 环境变量:`VITE_API_BASE_URL`(如开发 `http://localhost:3006`,生产 `https://soul.quwanzhi.com`)。 - 所有请求统一为:`${VITE_API_BASE_URL}${path}`,其中 **path 与现网完全一致**,例如: - `/api/admin`(GET 鉴权 / POST 登录) - `/api/admin/logout`(POST) - `/api/orders`(GET) - `/api/db/users`(GET/POST/DELETE) - `/api/admin/withdrawals`(GET/POST) - 等等(见下方完整清单)。 - 禁止在管理端项目内写死域名或写死 `/api/...` 相对路径(相对路径仅在请求封装内与 baseUrl 拼接)。 ### 1.3 管理端页面与 API 对照表(迁移时逐项核对) | 管理端页面 | 使用的 API(路径保持不变) | |------------|----------------------------| | 登录 `/admin/login` | POST `/api/admin`(登录)、GET `/api/admin`(鉴权) | | 布局/侧栏 | GET `/api/admin`(鉴权)、POST `/api/admin/logout`(退出) | | 数据概览 `/admin` | GET `/api/db/users`、GET `/api/orders` | | 订单管理 `/admin/orders` | GET `/api/orders`、GET `/api/db/users` | | 用户管理 `/admin/users` | GET `/api/db/users`、DELETE `/api/db/users?id=xxx`、POST `/api/db/users`、GET `/api/db/users/referrals?userId=xxx` | | 交易中心 `/admin/distribution` | GET `/api/admin/distribution/overview`、GET `/api/db/users`、GET `/api/orders`、GET `/api/db/distribution`、GET `/api/admin/withdrawals`、POST `/api/admin/withdrawals`(审核/打款) | | 提现管理 `/admin/withdrawals` | GET `/api/admin/withdrawals?status=xxx`、POST `/api/admin/withdrawals`(审核/打款) | | 内容管理 `/admin/content` | GET `/api/db/book?action=read&id=xxx`、POST `/api/db/book`、POST `/api/upload`、GET `/api/search?q=xxx`、GET `/api/db/book?action=export`、POST `/api/db/init` | | 章节管理 `/admin/chapters` | GET `/api/admin/chapters`、POST `/api/admin/chapters`、PUT `/api/admin/chapters`、DELETE `/api/admin/chapters` | | 推广设置 `/admin/referral-settings` | GET `/api/db/config?key=referral_config`、POST `/api/db/config` | | 系统设置 `/admin/settings` | GET `/api/db/config`、POST `/api/db/settings`、POST `/api/db/config`(多次)、GET `/api/db/config`(验证) | | 站点/支付/二维码 `/admin/site`、`/admin/payment`、`/admin/qrcodes` | 依赖 `useStore().fetchSettings()` → GET `/api/config`;若另有保存逻辑需按实际请求补全 | | 找伙伴配置 `/admin/match` | GET `/api/db/config?key=match_config`、POST `/api/db/config` | 说明:`/api/db/settings` 在当前 Next 中未见对应 route,若 Next 未实现则 Gin 阶段需实现该路径并与管理端约定请求/响应体。 ### 1.4 迁移清单(执行顺序)— Phase 1 已完成 **已完成**:独立项目 `soul-admin/` 已创建,所有请求通过 `src/api/client.ts` 使用 `VITE_API_BASE_URL` + 与现网一致的 path,API 路径未做任何改动。 1. 创建 soul-admin 项目(Vite + React + TS + Tailwind + React Router)。 2. 配置 `VITE_API_BASE_URL`,实现统一请求封装(如 `src/api/client.ts`),所有 `fetch` 使用 `baseUrl + path`,path 与上表一致。 3. 迁移 `app/admin/layout.tsx` → 管理端布局与侧栏;鉴权请求 GET `/api/admin`、POST `/api/admin/logout` 走封装。 4. 迁移 `app/admin/login/page.tsx` → 登录页,POST `/api/admin` 走封装。 5. 按上表逐页迁移:`page.tsx`、`loading.tsx`(可改为本地 loading 状态),替换 `fetch('/api/...')` 为封装后的请求(路径不变)。 6. 迁移管理端用到的 `components/ui/*` 及 `components/admin/*`(若有);迁移 `lib/store.ts` 中管理端会用到的部分,且其中 `fetch` 改为使用 baseUrl 封装。 7. 移除对 `next/link`、`next/navigation` 的依赖,改用 React Router 的 `Link`、`useNavigate`、`useLocation`;路由表与现有 `/admin/*` 一一对应。 8. 验收:独立启动管理端,`VITE_API_BASE_URL=http://localhost:3006`,登录、各页数据加载、提现/订单等操作均正常,且浏览器网络请求 path 与现网一致。 --- ## 阶段二:API 转 Gin(路径不变、无缝切换) ### 2.1 产出物 - 新仓库或新目录:**soul-server**(Gin 项目,Go 1.25.7)。 - 所有对外 HTTP 路径与 Next 时期**完全一致**,请求方法、Query、Body、响应 JSON 结构与现有接口保持一致(以便管理端与小程序的 baseUrl 仅改域名/端口即可)。 ### 2.2 完整 API 路径清单(73 个 Route → 路径规范) 以下为当前 `app/api` 下 route 与路径的对应关系,Gin 需逐条实现,路径不可改。 | 序号 | 路径 | 方法 | 说明 | |------|------|------|------| | 1 | /api/admin | GET, POST | 鉴权 / 登录 | | 2 | /api/admin/logout | POST | 退出 | | 3 | /api/admin/chapters | GET, POST, PUT, DELETE | 后台章节 | | 4 | /api/admin/content | (见 content) | 后台内容 | | 5 | /api/admin/distribution/overview | GET | 分销概览 | | 6 | /api/admin/payment | (依实现) | 后台支付配置 | | 7 | /api/admin/referral | (依实现) | 后台推荐 | | 8 | /api/admin/withdrawals | GET, POST | 提现列表与审核 | | 9 | /api/auth/login | POST | C 端登录 | | 10 | /api/auth/reset-password | POST | 重置密码 | | 11 | /api/book/all-chapters | GET | 全部章节 | | 12 | /api/book/chapter/:id | GET | 单章 | | 13 | /api/book/chapters | GET, POST, PUT, DELETE | 章节 CRUD | | 14 | /api/book/hot | GET | 热门 | | 15 | /api/book/latest-chapters | GET | 最新章节 | | 16 | /api/book/stats | GET | 统计 | | 17 | /api/book/search | GET | 搜索 | | 18 | /api/book/sync | POST | 同步 | | 19 | /api/config | GET | 前端配置 | | 20 | /api/content | GET | 内容 | | 21 | /api/ckb/join | POST | CKB 加入 | | 22 | /api/ckb/match | POST | CKB 匹配 | | 23 | /api/ckb/sync | POST | CKB 同步 | | 24 | /api/cron/sync-orders | GET/POST | 定时同步订单 | | 25 | /api/cron/unbind-expired | GET/POST | 定时解绑 | | 26 | /api/db/book | GET, POST | 书/内容 | | 27 | /api/db/chapters | GET | 章节 | | 28 | /api/db/config | GET, POST | 系统配置 | | 29 | /api/db/distribution | GET | 分销数据 | | 30 | /api/db/init | POST | 初始化 | | 31 | /api/db/migrate | POST | 迁移 | | 32 | /api/db/users | GET, POST, DELETE | 用户 | | 33 | /api/db/users/referrals | GET | 用户推荐列表 | | 34 | /api/distribution | GET | 分销 | | 35 | /api/distribution/auto-withdraw-config | GET, POST | 自动提现配置 | | 36 | /api/distribution/messages | GET, POST | 消息 | | 37 | /api/documentation/generate | POST | 文档生成 | | 38 | /api/match/config | GET, POST | 找伙伴配置 | | 39 | /api/match/users | GET | 匹配用户 | | 40 | /api/menu | GET | 菜单 | | 41 | /api/miniprogram/login | POST | 小程序登录 | | 42 | /api/miniprogram/pay | POST | 小程序支付 | | 43 | /api/miniprogram/pay/notify | POST | 支付回调 | | 44 | /api/miniprogram/phone | POST | 手机号 | | 45 | /api/miniprogram/qrcode | GET | 二维码 | | 46 | /api/orders | GET | 订单列表 | | 47 | /api/payment/alipay/notify | POST | 支付宝回调 | | 48 | /api/payment/callback | GET/POST | 支付回调 | | 49 | /api/payment/create-order | POST | 创建订单 | | 50 | /api/payment/methods | GET | 支付方式 | | 51 | /api/payment/query | GET | 查询订单 | | 52 | /api/payment/status/:orderSn | GET | 订单状态 | | 53 | /api/payment/verify | POST | 核销 | | 54 | /api/payment/wechat/notify | POST | 微信支付回调 | | 55 | /api/payment/wechat/transfer/notify | POST | 微信转账回调 | | 56 | /api/referral/bind | POST | 绑定推荐码 | | 57 | /api/referral/data | GET | 分销数据 | | 58 | /api/referral/visit | POST | 推荐访问 | | 59 | /api/search | GET | 搜索 | | 60 | /api/sync | POST | 同步 | | 61 | /api/upload | POST | 上传 | | 62 | /api/user/addresses | GET, POST | 地址列表与新增 | | 63 | /api/user/addresses/:id | GET, PUT, DELETE | 地址单条 | | 64 | /api/user/check-purchased | GET | 是否已购 | | 65 | /api/user/profile | GET, POST | 用户资料 | | 66 | /api/user/purchase-status | GET | 购买状态 | | 67 | /api/user/reading-progress | GET, POST | 阅读进度 | | 68 | /api/user/track | GET | 行为轨迹 | | 69 | /api/user/update | POST | 更新用户 | | 70 | /api/wechat/login | POST | 微信登录 | | 71 | /api/withdraw | POST | 申请提现 | | 72 | /api/withdraw/records | GET | 提现记录 | | 73 | /api/withdraw/pending-confirm | GET | 待确认提现 | 说明:部分路径在 Next 中为同一 route 多方法(如 GET/POST),Gin 需按现有行为实现;带 `:id`、`:orderSn` 为路径参数,与 Next 动态段一致。 ### 2.3 Gin 实现顺序建议 1. 基础设施:Go 1.25.7、Gin、GORM、MySQL、env 配置、CORS、日志。 2. 鉴权:复刻现有 Cookie 或改为 JWT(若改 JWT,管理端需同步改为带 Authorization 头);小程序 openid/session 逻辑与现网一致。 3. 按「管理端必需」优先:`/api/admin`、`/api/admin/logout`、`/api/db/*`、`/api/orders`、`/api/admin/withdrawals`、`/api/admin/distribution/overview`、`/api/admin/chapters`、`/api/config`、`/api/db/config`、`/api/db/settings`(若现网无则按管理端调用约定实现)。 4. 再实现小程序与 C 端所需:`/api/miniprogram/*`、`/api/wechat/*`、`/api/user/*`、`/api/book/*`、`/api/referral/*`、`/api/payment/*`、`/api/withdraw/*` 等。 5. 最后:定时任务对应接口、文档生成等。 ### 2.4 无缝切换检查清单 - [ ] 管理端 `VITE_API_BASE_URL` 改为 Gin 地址后,登录、各页请求均 200,数据与 Next 时期一致。 - [ ] 小程序 `baseUrl` 改为 Gin 地址后,登录、支付、提现、推荐等流程正常。 - [ ] 所有 73 个路径在 Gin 中均有实现,且请求/响应与现网兼容(可做契约测试或对比脚本)。 --- ## 附录:当前 Next 中 route 文件与路径映射(供 Gin 对照) ``` app/api/admin/route.ts → /api/admin app/api/admin/logout/route.ts → /api/admin/logout app/api/admin/chapters/route.ts → /api/admin/chapters app/api/admin/content/route.ts → /api/admin/content app/api/admin/distribution/overview/route.ts → /api/admin/distribution/overview app/api/admin/payment/route.ts → /api/admin/payment app/api/admin/referral/route.ts → /api/admin/referral app/api/admin/withdrawals/route.ts → /api/admin/withdrawals app/api/auth/login/route.ts → /api/auth/login app/api/auth/reset-password/route.ts → /api/auth/reset-password app/api/book/all-chapters/route.ts → /api/book/all-chapters app/api/book/chapter/[id]/route.ts → /api/book/chapter/:id app/api/book/chapters/route.ts → /api/book/chapters app/api/book/hot/route.ts → /api/book/hot app/api/book/latest-chapters/route.ts → /api/book/latest-chapters app/api/book/stats/route.ts → /api/book/stats app/api/book/search/route.ts → /api/book/search app/api/book/sync/route.ts → /api/book/sync app/api/config/route.ts → /api/config app/api/content/route.ts → /api/content app/api/ckb/join/route.ts → /api/ckb/join app/api/ckb/match/route.ts → /api/ckb/match app/api/ckb/sync/route.ts → /api/ckb/sync app/api/cron/sync-orders/route.ts → /api/cron/sync-orders app/api/cron/unbind-expired/route.ts → /api/cron/unbind-expired app/api/db/book/route.ts → /api/db/book app/api/db/chapters/route.ts → /api/db/chapters app/api/db/config/route.ts → /api/db/config app/api/db/distribution/route.ts → /api/db/distribution app/api/db/init/route.ts → /api/db/init app/api/db/migrate/route.ts → /api/db/migrate app/api/db/users/route.ts → /api/db/users app/api/db/users/referrals/route.ts → /api/db/users/referrals app/api/distribution/route.ts → /api/distribution app/api/distribution/auto-withdraw-config/route.ts → /api/distribution/auto-withdraw-config app/api/distribution/messages/route.ts → /api/distribution/messages app/api/documentation/generate/route.ts → /api/documentation/generate app/api/match/config/route.ts → /api/match/config app/api/match/users/route.ts → /api/match/users app/api/menu/route.ts → /api/menu app/api/miniprogram/login/route.ts → /api/miniprogram/login app/api/miniprogram/pay/route.ts → /api/miniprogram/pay app/api/miniprogram/pay/notify/route.ts → /api/miniprogram/pay/notify app/api/miniprogram/phone/route.ts → /api/miniprogram/phone app/api/miniprogram/qrcode/route.ts → /api/miniprogram/qrcode app/api/orders/route.ts → /api/orders app/api/payment/alipay/notify/route.ts → /api/payment/alipay/notify app/api/payment/callback/route.ts → /api/payment/callback app/api/payment/create-order/route.ts → /api/payment/create-order app/api/payment/methods/route.ts → /api/payment/methods app/api/payment/query/route.ts → /api/payment/query app/api/payment/status/[orderSn]/route.ts → /api/payment/status/:orderSn app/api/payment/verify/route.ts → /api/payment/verify app/api/payment/wechat/notify/route.ts → /api/payment/wechat/notify app/api/payment/wechat/transfer/notify/route.ts → /api/payment/wechat/transfer/notify app/api/referral/bind/route.ts → /api/referral/bind app/api/referral/data/route.ts → /api/referral/data app/api/referral/visit/route.ts → /api/referral/visit app/api/search/route.ts → /api/search app/api/sync/route.ts → /api/sync app/api/upload/route.ts → /api/upload app/api/user/addresses/route.ts → /api/user/addresses app/api/user/addresses/[id]/route.ts → /api/user/addresses/:id app/api/user/check-purchased/route.ts → /api/user/check-purchased app/api/user/profile/route.ts → /api/user/profile app/api/user/purchase-status/route.ts → /api/user/purchase-status app/api/user/reading-progress/route.ts → /api/user/reading-progress app/api/user/track/route.ts → /api/user/track app/api/user/update/route.ts → /api/user/update app/api/wechat/login/route.ts → /api/wechat/login app/api/withdraw/route.ts → /api/withdraw app/api/withdraw/records/route.ts → /api/withdraw/records app/api/withdraw/pending-confirm/route.ts → /api/withdraw/pending-confirm ``` 注意:当前项目中没有 `app/api/db/settings/route.ts`,管理端系统设置页调用了 POST `/api/db/settings`。若 Next 未实现,Gin 需新增该路径并约定 body/response 与前端一致。