本文档用于明确前台、后台与后端之间的接口边界,避免:
- 前后台各自猜测数据结构
- 权限逻辑散落在多个应用里
- 未来切换部署平台时 API 契约跟着变形
- 所有业务数据都通过 API 层流转
- 公开 API 与后台 API 按访问意图拆分
- Better Auth 挂载在独立的认证路由下
- DTO、校验规则与错误码应由 monorepo 共享
- 写接口必须先校验输入,再校验权限,再执行业务
推荐保持以下结构:
/api/public/v1/*/api/admin/v1/*/api/internal/v1/*/api/auth/*
说明:
public供apps/site和公开表单使用public主要服务前台页面与公开提交能力admin供apps/admin使用internal供定时任务或受信内部调用使用auth由 Better Auth 挂载
- 默认使用 JSON
- 编码使用 UTF-8
- 标识符使用
UUID - 时间使用 ISO 8601
- 统一返回标准 HTTP 状态码
推荐成功响应:
{
"data": {},
"meta": {}
}推荐错误响应:
{
"error": {
"code": "VALIDATION_ERROR",
"message": "请求参数不合法",
"details": {}
}
}列表接口建议支持:
pagepageSizeqstatussortorder
当前项目常用的额外筛选字段:
branchIdbranchSlugcityfeatured
GET /api/public/v1/site-config- 返回站点名称、导航、页脚、基础联系信息
GET /api/public/v1/home- 返回首页区块数据,如 Hero、介绍、指标、精选活动、精选文章、加入 CTA
GET /api/public/v1/branches- 返回公开分会列表及董事会成员摘要
GET /api/public/v1/branches/:slug- 预留分会详情接口;即使当前前台不单独开放页面,也建议保留能力
GET /api/public/v1/members- 返回公开成员列表
- 建议支持
page、pageSize、q、branchSlug、city
GET /api/public/v1/members/:slug- 返回成员详情
补充原则:
- 成员资料展示是前台成员域能力
- 是否允许非成员查看全部成员信息,应由
visibility或页面策略决定 - 这里的“成员”不是后台工作人员角色
GET /api/public/v1/events- 返回公开活动列表
- 建议支持
page、pageSize、branchSlug、city、upcoming
GET /api/public/v1/events/:slug- 返回活动详情、议程、报名状态
POST /api/public/v1/events/:eventId/registrations- 活动报名
当前报名建议字段:
namephoneNumberwechatIdoptionalemailoptionalcompanyoptionaltitleoptionalnoteoptional
活动报名规则建议补充:
- 当前阶段活动报名统一采用开放提交
- 报名人是否符合活动要求,由工作人员在后台审核确认
- 这样可以避免在 MVP 阶段引入成员认证复杂度
GET /api/public/v1/articles- 返回公开文章列表
GET /api/public/v1/articles/:slug- 返回文章详情
当前文章 DTO 应收敛到当前公开站主线:
- 列表至少包含
slugtitleexcerptpublishedAtauthorNamecoverImagebranch
- 详情至少包含
- 列表全部字段
bodyauthor
说明:
- 当前公开文章接口不再以
topicSlugs、citySummary作为前台主结构 - 如底层 schema 仍保留旧字段,应仅作为兼容实现细节,不应继续外扩到当前前台契约
GET /api/public/v1/join- 返回加入说明页内容,包括申请条件、流程、FAQ、权益等
POST /api/public/v1/join-applications- 提交加入申请
当前表单字段至少包含:
namephoneNumberwechatIdemailintroductionapplicationMessagetargetBranchIdoptional
GET /api/public/v1/about- 返回关于我们页内容
- 只能返回已发布内容
- 草稿、归档内容不得泄露到公开接口
- 公开写接口必须做限流和输入校验
- 公开写接口建议记录
requestId、IP、User-Agent - 成员相关前台能力不得复用后台
role作为判断依据 - 当前阶段活动报名不依赖成员认证
所有后台接口都要求:
- 有效会话
- 有效
staff_account - 满足对应权限码
这里的后台 roles 只服务于工作人员 RBAC,不参与成员身份判断。
GET /api/admin/v1/me- 返回当前工作人员、角色、权限
GET /api/admin/v1/dashboard- 返回文章总数、活动总数、申请数量、系统状态摘要
建议返回字段:
articleCounteventCountapplicationCountpendingApplicationCountpendingRegistrationCountsystemHealthappVersion
GET /api/admin/v1/articlesPOST /api/admin/v1/articlesGET /api/admin/v1/articles/:idPATCH /api/admin/v1/articles/:idPOST /api/admin/v1/articles/:id/publishPOST /api/admin/v1/articles/:id/archive
当前阶段补充约束:
- 文章发布主线只要求标题、摘要、正文、作者与发布状态
- 旧
topic / city关联字段如果仍存在于历史模型中,应视为兼容字段,而不是当前主线必填项
GET /api/admin/v1/eventsPOST /api/admin/v1/eventsGET /api/admin/v1/events/:idPATCH /api/admin/v1/events/:idPOST /api/admin/v1/events/:id/publishPOST /api/admin/v1/events/:id/archive
GET /api/admin/v1/events/:id/registrationsGET /api/admin/v1/registrations/:idPATCH /api/admin/v1/registrations/:id
PATCH 至少支持修改:
statusreviewNotes
并自动写入:
reviewedAtreviewedByStaffId
GET /api/admin/v1/applicationsGET /api/admin/v1/applications/:idPATCH /api/admin/v1/applications/:id
PATCH 至少支持修改:
statusreviewNotes
成员模块除了成员本身,还需要承接分会与董事会维护能力。
成员接口:
GET /api/admin/v1/membersPOST /api/admin/v1/membersGET /api/admin/v1/members/:idPATCH /api/admin/v1/members/:id
成员接口应允许维护:
- 基本公开资料
membershipStatus- 公开可见性
分会接口:
GET /api/admin/v1/branchesPOST /api/admin/v1/branchesGET /api/admin/v1/branches/:idPATCH /api/admin/v1/branches/:id
董事会接口:
GET /api/admin/v1/branches/:id/board-membersPUT /api/admin/v1/branches/:id/board-members
说明:
- 这些接口可以在后台的“成员”一级菜单下实现
- 不要求额外新增“分会”一级菜单
GET /api/admin/v1/staffPOST /api/admin/v1/staffGET /api/admin/v1/staff/:idPATCH /api/admin/v1/staff/:idGET /api/admin/v1/rolesGET /api/admin/v1/roles/:idPATCH /api/admin/v1/roles/:id
GET /api/admin/v1/audit-logs
每条记录至少应包含:
actiontargetTypetargetId- 操作人
requestId- 操作时间
beforeJsonoptionalafterJsonoptional
为了支撑首页、单页与图片能力,建议保留下列接口,即使它们不在一级导航中单独出现:
GET /api/admin/v1/homepagePATCH /api/admin/v1/homepageGET /api/admin/v1/pages/:slugPATCH /api/admin/v1/pages/:slugGET /api/admin/v1/assetsPOST /api/admin/v1/assets/uploadsPOST /api/admin/v1/assets/uploads/complete
说明:
- 当前阶段支持
slug=join|about site-config由共享前台契约静态提供,暂不作为独立后台模块暴露
保留给定时任务或内部自动化调用。
当前建议至少保留:
POST /api/internal/v1/publish-scheduled-content- 用于发布到点文章或活动
后续可扩展:
POST /api/internal/v1/revalidate-sitePOST /api/internal/v1/export-audit-report
Better Auth 挂载在:
/api/auth/*
当前后台登录主要使用邮箱密码。 未来如果增加手机号 OTP,应继续挂在同一认证体系中,而不是新增第二套身份 API。
补充说明:
- 当前认证主线以工作人员后台登录为主
- 成员体系与工作人员体系按分离模型处理
- 当前不为成员提供认证能力
- 如果未来要增加成员认证,应单独设计成员认证与成员校验机制
- 当前版本以
v1为主 - 如果旧原型中仍保留
topics、cities等接口,应视为历史探索接口 - 在当前收敛版本里,不应继续扩张这些旧接口的范围
- 前后台契约变更时,优先更新
packages/shared中的 DTO 与校验模型