Skip to content

API 接口说明 — CodeNote Server

本文档为 CodeNote Server 端 REST API 的权威参考,涵盖所有后端接口。
数据模型说明见 /architecture/data-model.md,用户状态管理见 /designs/auth/user-state.md


目录

  1. 概述
  2. 核心基础模块
  3. 组织模块
  4. 业务模块
  5. 管理后台模块
  6. 安全架构

1. 概述

CodeNote Server 提供约 140 个 REST API 接口,管理 28 张 MySQL 数据表。

项目详情
框架Spring Boot 3.2.5 + Kotlin 1.9.23
认证JWT (io.jsonwebtoken) + Spring Security
数据库MySQL 8.0 + JPA (Hibernate) + Flyway 迁移
存储阿里云 OSS

角色体系

角色说明
GUEST(未登录)仅可访问公开分享页,无需 JWT
USER(普通用户)默认角色,可使用所有个人业务功能
ADMIN(系统管理员)可访问管理后台 API,全局数据查看和管理权限

认证方式

  • JWT TokenAuthorization: Bearer {token},有效期 7 天
  • 设备标识X-Device-Id: {deviceId}(设备身份/会话标识;已登录请求校验与活跃会话匹配,无匿名认证)

2. 核心基础模块

M1 - 用户认证(AuthController)

端点方法说明
/api/auth/registerPOST用户注册
/api/auth/loginPOST用户登录
/api/auth/device-loginPOST设备登录(查 DEVICE identity,无则自动建用户+登记,返回 LoginResponse)
/api/users/me/usernamePUT设置用户名(独立入口,仅未设置时可用)
/api/auth/password/setPOST设置密码(独立入口,仅未设置时可用)
/api/auth/password/forgot-codePOST忘记密码发验证码 { credential }(含@→邮箱,11位数字→手机)
/api/auth/password/resetPOST忘记密码重置
/api/auth/password/change-codePOST修改密码发验证码 { channel: PHONE|EMAIL }(发到当前用户已绑定凭证)
/api/auth/password/changePOST修改密码
/api/auth/email/unbindPOST解绑邮箱(无请求体)
/api/auth/phone/unbindPOST解绑手机(无请求体)

| /api/auth/userinfo | GET | 获取个人信息 | | /api/auth/userinfo | PUT | 修改个人信息 | | /api/users/me/current-org | PUT | 设置当前活跃组织 | | /api/auth/refresh | POST | 刷新 Token | | /api/auth/logout | POST | 登出 | | /api/auth/sessions | POST | 创建会话 | | /api/auth/sessions | GET | 获取所有有效会话 | | /api/auth/sessions/{sessionId} | GET | 获取会话详情 | | /api/auth/sessions/{sessionId}/switch | POST | 切换到指定会话 | | /api/auth/sessions/{sessionId} | DELETE | 注销会话 | | /api/auth/accounts | GET | 获取关联账号列表 | | /api/auth/accounts/{targetUserId}/switch | POST | 切换到关联账号(已废弃,使用 link/switch)| | /api/auth/link | POST | 添加关联账号(verifyType: PASSWORD=linkedUserId+password / PHONE_CODE / EMAIL_CODE=credential+code)| | /api/auth/sms/link-code | POST | 发送关联账号短信验证码(目标账号手机号,需登录)| | /api/auth/email/link-code | POST | 发送关联账号邮箱验证码(目标账号邮箱,需登录)| | /api/auth/link/list | GET | 获取关联账号列表 | | /api/auth/link/{linkId}/switch | POST | 切换关联账号(推荐)| | /api/auth/link/{linkId} | DELETE | 移除关联账号 | | /api/auth/quotas | GET | 获取配额配置 | | /api/auth/devices | GET | 当前账号绑定设备列表 | | /api/auth/devices/{deviceId} | DELETE | 移除设备身份(设备丢失处置) | | /api/auth/sms/send-code | POST | 发送登录短信验证码(PNVS) | | /api/auth/sms/bind-code | POST | 发送绑定手机号验证码(需登录)| | /api/auth/phone-login | POST | 手机号+验证码登录(自动注册)| | /api/auth/phone-password-login | POST | 手机号+密码登录 | | /api/auth/phone-bind | POST | 绑定手机号(需登录+验证码)| | /api/auth/sms/oneclick-login | POST | 一键登录(Android SDK token 取号) | | /api/auth/sms/verify-mobile | POST | 本机号码校验绑定(需登录+SDK token)|

管理后台登录

端点方法说明
/api/admin/auth/loginPOST管理员登录

会话管理特性

  • (user_id, device_id) 唯一索引,同用户同设备仅保留一条有效会话
  • Token 携带 sessionId,用于验证会话有效性
  • 活跃会话上限:10 个

设备身份特性(设备不再特殊,DEVICE 与 PHONE/EMAIL 平级)

  • 基于设备 ID 自动生成用户,无需手动注册
  • 用户可随时绑定用户名密码,实现跨设备登录
  • 凭据登录自动登记当前设备为账号的 DEVICE identity(一账号多设备)

M2 - 二维码 CRUD(QrCodeController)

职责:管理用户手动创建的二维码。业务二维码(资源/活动/签到/通行)由各业务模块独立管理,不写入 qr_codes 表。

端点方法说明
/api/qr-codesGET列表(分页+搜索+筛选)
/api/qr-codesPOST创建
/api/qr-codes/{id}GET详情
/api/qr-codes/{id}PUT更新
/api/qr-codes/{id}DELETE软删除
/api/qr-codes/batchPOST批量创建
/api/qr-codes/batch/exportPOST批量导出
/api/qr-codes/{id}/pinPATCH置顶/取消
/api/qr-codes/{id}/publicPATCH公开/私有
/api/qr-codes/trashGET回收站列表
/api/qr-codes/trash/restore/{id}PATCH恢复
/api/qr-codes/trashDELETE清空回收站
/api/qr-codes/statsGET统计数据
/api/qr-codes/public/{uuid}GET公开分享页
/api/qrcode/renderGET公开二维码渲染(无需登录,支持 content 参数指定内容,size 指定尺寸)

M3 - 分类管理(CategoryController)

端点方法说明
/api/categoriesGET列表
/api/categories/{id}GET获取分类详情
/api/categoriesPOST创建 { name, color, parentId }
/api/categories/{id}PUT更新 { name, color }
/api/categories/{id}DELETE删除
/api/categories/reorderPATCH批量重排序
/api/categories/{id}/parentPATCH更新父分类
/api/categories/{id}/deletableGET检查可删除性
/api/categories/treeGET获取分类树
/api/categories/{id}/pinPATCH置顶/取消
/api/categories/batch-pinPATCH批量置顶

M4 - 扫码记录(ScanRecordController)

端点方法说明
/api/scan-recordsGET列表(分页)
/api/scan-recordsPOST创建
/api/scan-records/{id}PATCH更新(收藏等)
/api/scan-records/{id}DELETE删除
/api/scan-records/statsGET统计数据

M5 - 登录记录(LoginRecordController)

端点方法说明
/api/login-recordsPOST记录登录事件
/api/login-records/user/{userId}GET查询用户登录记录(分页)
/api/login-records/recent?hours=24GET查询近期登录记录
/api/login-records/user/{userId}/recent?hours=24GET查询用户近期登录记录
/api/login-records/failedGET查询失败登录记录

M5b - 文件上传(FileController)

端点方法说明
/api/files/sts-tokenPOST获取 STS 临时凭证(15 分钟有效)
/api/files/uploadPOSTMultipart 文件上传(保底兜底方案)
/api/files/signed-urlGET获取私有资源签名 URL(用于直接访问)
/api/files/{id}GET获取文件元信息
/api/files/{id}DELETE删除文件
/api/files/callbackPOSTOSS 回调处理(由 OSS 触发)

上传流程:客户端获取 STS 凭证 → 直传 OSS → 回调服务端记录元数据。


M6 - 通知中心(NotificationController)

端点方法说明
/api/notificationsGET通知列表(分页,返回 bodyPlain 纯文本摘要)
/api/notifications/{id}GET通知详情(归属校验,返回 bodyHtml 供 MarkdownView 渲染)
/api/notifications/{id}/readPATCH标记已读
/api/notifications/read-allPATCH全部已读
/api/notifications/unread-countGET未读数量
/api/notifications/total-countGET通知总数(含已读)
/api/notifications/{id}DELETE删除通知

通知正文支持 Markdown:body 存 Markdown 原文,列表返回 bodyPlain(纯文本摘要),详情返回 bodyHtml(后端统一渲染,安全清洗);系统通知(ORG_INVITE/ORG_APPROVED/ORG_REJECTED/ORG_APPROVAL_REQUEST/ACCOUNT_LINK)为纯文本 body,渲染后即段落,生成方零改动。


M7 - 云同步(SyncController)

端点方法说明
/api/sync/pull?since={timestamp}GET增量拉取(首次传 0,单位:毫秒)
/api/sync/pushPOST离线记录补传
/api/sync/conflictsGET冲突记录列表
/api/sync/resolvePOST解决冲突

同步策略:首次全量 → 增量拉取 → 离线补传 → LWW 冲突仲裁 → 指数退避重试。

冲突解决机制/api/sync/resolve):

  • acceptServer=true:接受服务端版本,更新映射版本号,客户端下次拉取时获取服务端数据
  • acceptServer=false:拒绝服务端版本,重置映射版本号为0,客户端重新推送本地数据覆盖服务端

M8 - 协议公开接口(AgreementController)

端点方法说明
/api/agreement/current?type=SERVICEGET当前生效协议(公开,无需登录;type: SERVICE/PRIVACY;返回 content 原文 + contentHtml 渲染)

响应示例(version 为当前生效版本号):

json
{
  "code": 200,
  "data": {
    "type": "SERVICE",
    "version": 3,
    "title": "CodeNote 用户服务协议",
    "content": "# 服务协议\n\n## 一、服务说明\n- xxx",
    "contentHtml": "<h1>服务协议</h1><h2>一、服务说明</h2><ul><li>xxx</li></ul>"
  }
}

版本化策略:只增不改、发布即生效(version 自动 +1)、历史版本可回滚激活;后台接口见 A23。表结构与权限点见 /architecture/data-model.md「agreements 用户协议/隐私政策表」。


3. 组织模块

B1 - 组织管理(OrgController)

端点方法说明
/api/orgsPOST创建组织(body 含 visibility:PUBLIC/INTERNAL;INTERNAL 强制 joinPolicy=INVITE)
/api/orgsGET我的组织列表
/api/orgs/{id}GET组织详情(PUBLIC 组织放行非成员只读,permissions/roleName 为空;INTERNAL 非成员 403)
/api/orgs/{id}PUT更新设置(可改 visibility;INTERNAL 时 joinPolicy 锁定 INVITE)
/api/orgs/{id}/applyPOST申请加入公开组织(FREE 直接加入 / APPROVAL 提交申请 / INVITE·INTERNAL 拒绝 403)
/api/orgs/{id}DELETE解散(仅 OWNER)
/api/orgs/{id}/transfer-ownershipPOST转移所有权(管理后台专用)
/api/orgs/{id}/transferPOST转移所有权(Android 端,转让给成员)
/api/orgs/{id}/qrcodeGET组织二维码
/api/orgs/{id}/switchPATCH切换当前组织
/api/orgs/join-by-codePOST组织码加入
/api/orgs/join-by-qrcodePOST扫码加入
/api/orgs/{id}/leavePOST退出组织
/api/orgs/{id}/statsGET组织统计面板
/api/orgs/{orgId}/membersGET成员列表
/api/orgs/{orgId}/members/{userId}PUT改角色/昵称
/api/orgs/{orgId}/members/{userId}DELETE移除成员
/api/orgs/{id}/invitePOST邀请成员(批量,发通知)
/api/orgs/{id}/invitationsGET组织侧邀请记录列表(OWNER/ADMIN)
/api/orgs/{id}/invitations/{invitationId}/cancelPOST撤回邀请(OWNER/ADMIN,仅 PENDING)
/api/orgs/users/search?q=GET搜索用户(用户名/邮箱)
/api/orgs/public/{code}GET获取组织公开信息(无需登录)
/api/orgs/invitation/{invitationId}GET获取邀请详情
/api/orgs/invitation/respondPOST回应邀请(接受/拒绝)
/api/orgs/my-invitationsGET获取待处理邀请列表
/api/orgs/{id}/pendingGET获取待审批成员(ADMIN/OWNER)
/api/orgs/{id}/approvePOST审批成员(通过/拒绝)
/api/orgs/{orgId}/locationsGET获取组织位置列表
/api/orgs/{orgId}/locationsPOST创建位置
/api/orgs/{orgId}/locations/{locationId}PUT编辑位置
/api/orgs/{orgId}/locations/{locationId}DELETE删除位置
/api/orgs/{orgId}/locations/{locationId}/pinPATCH置顶/取消置顶位置
/api/orgs/{orgId}/locations/pinPATCH批量置顶位置
/api/orgs/{orgId}/locations/reorderPATCH批量排序位置
/api/orgs/{id}/sharesPOST共享资源
/api/orgs/{id}/sharesGET共享列表
/api/orgs/{id}/shares/{shareId}DELETE取消共享

组织角色:OWNER(所有者)→ ADMIN(管理员)→ MEMBER(成员)。


4. 业务模块

B4 - 固定资源管理(AssetController)

端点方法说明
/api/assetsGET列表(分页+筛选)
/api/assetsPOST登记
/api/assets/{id}GET详情
/api/assets/{id}PUT更新
/api/assets/{id}DELETE删除
/api/assets/importPOSTExcel 导入
/api/assets/exportGETExcel 导出
/api/assets/{id}/transferPOST资源流转
/api/assets/{id}/transfersGET流转记录
/api/assets/inventoriesPOST创建盘点
/api/assets/inventoriesGET盘点列表
/api/assets/inventories/{id}PUT更新盘点
/api/assets/inventories/{id}/scanPOST扫码盘点
/api/assets/mapGET资源地图
/api/assets/{id}/scrapPOST资源报废

资源分类

端点方法说明
/api/assets/categories?scope=PERSONAL&orgId=GET资源分类树
/api/assets/categoriesPOST创建分类
/api/assets/categories/{id}PUT更新分类
/api/assets/categories/{id}DELETE删除分类
/api/assets/categories/reorderPATCH批量重排序
/api/assets/categories/{id}/parentPATCH更新父分类
/api/assets/categories/{id}/deletableGET检查可删除性
/api/assets/categories/{id}/pinPATCH置顶/取消
/api/assets/categories/batch-pinPATCH批量置顶

通用动态数据模型(meta_*,起替代旧字段自定义系统;P2 三控制器已上线)

端点方法说明
/api/meta/objectsGET可见业务对象列表
/api/meta/objects/{objectName}/fieldsGET可见字段(GLOBAL ∪ ORG ∪ USER 合并;?entityId=&orgId=)
/api/meta/objects/{objectName}/fieldsPOST新建字段(USER 级)
/api/meta/objects/{objectName}/fields/{id}PUT/DELETE更新/软删字段
/api/meta/objects/{objectName}/templatesGET/POST可见模板列表(?categoryScope= 过滤)/新建模板
/api/meta/templates/{id}PUT/DELETE更新/软删模板
/api/meta/templates/{id}/forkPOST个人 fork(scope=USER)
/api/meta/templates/{id}/fieldsGET/PUT模板字段明细查询/批量全量替换
/api/meta/objects/{objectName}/entities/{entityId}/templatesGET/POST实体模板绑定列表/绑定(空 templateIds→自动绑默认模板)
/api/meta/objects/{objectName}/entities/{entityId}/templates/{templateId}DELETE解绑模板
/api/meta/objects/{objectName}/entities/{entityId}/valuesGET/PUT可见字段+值 / 批量写值(服务端按 config 校验)
/api/meta/objects/{objectName}/valuesGET按类型筛选(?fieldId=&min=&max=&orgId=)

组织级(OrgMetaController,/api/orgs/{orgId}/meta/...):fields/templates CRUD + POST /api/orgs/{orgId}/meta/templates/{id}/fork(fork 全局模板为本组织模板,深复制字段)+ entities/{entityId}/templates 绑定管理。写操作校验 ORG 域 meta_* 权限点(OWNER/ADMIN 有,MEMBER 无)。

Admin 级(AdminMetaController,/api/admin/meta/...):objects 注册/启停(仅 SYSTEM_ADMIN)、fields/templates 全量管理(跨 scope,可指定 orgId)、orgs/{orgId}/templates 查看任意组织模板;GET /api/admin/assets/{id}/fields 保留(admin 视角字段详情,meta 数据源)。

说明:/api/assets/field-definitions/api/assets/categories/{id}/field-bindings/api/assets/{id}/fields 旧端点已移除; 分类创建请求体改为 templateIds: List<Long>(不再接收 templateFields);值读写前校验实体归属(个人/组织)。


B6 - 活动管理(ActivityController)

端点方法说明
/api/activitiesPOST创建活动(含签到/通行配置)
/api/activitiesGET活动列表
/api/activities/{id}GET详情(含配置+统计)
/api/activities/{id}PUT更新
/api/activities/{id}DELETE删除
/api/activities/{id}/statusPATCH变更状态
/api/activities/{id}/qr-codeGET获取活动二维码列表
/api/activities/{id}/invite-codePATCH重置邀请码(仅 INVITE_ONLY,旧码作废,qr_content 联动)
/api/discover/activitiesGET发现页公开活动(PUBLIC+ACTIVE,分页,含 ownerName)
/api/discover/orgsGET发现页公开组织(PUBLIC+ACTIVE,分页,含 memberCount)

状态流转:DRAFT → ACTIVE → ENDED / CANCELLED。
容器模式:活动是签到和通行证的容器,通过 has_check_in / has_pass 开关子功能。
活动字段(新增 regionregion(所在地区,省市区)+ location(详细地址+门牌号);Create/UpdateActivityRequest 均支持 region(可选)。
可见性(§可见性架构)owner_type(PERSONAL/ORGANIZATION)+ owner_id 归属容器;visibility 三态——PUBLIC(发现页展示)/ RESTRICTED(restricted_scope_type/id 指向容器成员,个人活动禁选)/ INVITE_ONLY(invite_code 凭证,默认);二维码内容:INVITE_ONLY → activity:{id}:{code},其余 → activity:{id};详情/签到/通行证/落地页统一走 ActivityVisibility 校验(非 PUBLIC 不泄露 H5 内容)。


B7 - 签到系统(CheckInController)

端点方法说明
/api/activities/{id}/check-inPOST签到(扫活动码或签到码)
/api/activities/{id}/check-in/recordsGET签到记录列表
/api/activities/{id}/check-in/statsGET签到统计

特性:GPS 校验(可选)、次数限制、离线签到、手动签到码。


B8 - 通行证系统(PassController)

端点方法说明
/api/activities/{id}/pass/issuePOST签发通行证
/api/activities/{id}/pass/verifyPOST核验通行证(无需登录,扫码即核验)
/api/activities/{id}/pass/passesGET已签发通行证列表
/api/activities/{id}/pass/recordsGET通行使用记录
/api/passes/{passId}/revokePUT撤销通行证
/api/passes/{passId}/recordsGET通行证使用记录
/api/pass/templatesGET通行证模板列表
/api/pass/templatesPOST创建通行证模板
/api/pass/templates/{templateId}PUT更新通行证模板
/api/pass/templates/{templateId}DELETE删除通行证模板
/api/pass/templates/{templateId}/issuePOST通过模板签发通行证

B9 - 水印相册(AlbumController)

端点方法说明
/api/albumGET相册列表
/api/albumPOST上传照片
/api/album/{id}GET照片详情
/api/album/{id}DELETE删除照片
/api/album/qr-code/{qrCodeId}GET按二维码筛选照片

业务二维码渲染 & 落地页(PublicQrCodeController)

端点方法说明
/api/qrcode/render?content=activity:123&size=300GET即时渲染二维码图片(PNG)
/s/{type}/{id}GET业务二维码 H5 落地页

支持的落地页类型/s/activity/{id}/s/check-in/{id}/s/pass/{code}/s/asset/{code}


5. 管理后台模块

所有管理后台接口前缀:/api/admin/。需要 ADMIN 角色(@PreAuthorize("hasRole('ADMIN')"))。

A1 - 仪表盘

端点方法说明
/api/admin/statisticsGET全局统计数据

A2 - 用户管理

端点方法说明
/api/admin/usersGET用户列表
/api/admin/users/{userId}GET用户详情
/api/admin/usersPOST创建用户
/api/admin/users/{userId}PUT更新用户
/api/admin/users/{userId}/rolePATCH更新角色
/api/admin/users/{userId}/statusPATCH更新状态
/api/admin/users/{userId}/membershipsGET获取用户组织成员关系
/api/admin/users/{userId}/orgs/{orgId}POST将用户加入组织
/api/admin/users/{userId}/orgs/{orgId}DELETE从组织移除用户

A3 - 组织管理

端点方法说明
/api/admin/orgsGET组织列表
/api/admin/orgs/{orgId}GET组织详情
/api/admin/orgsPOST创建组织
/api/admin/orgs/{orgId}PUT更新组织
/api/admin/orgs/{orgId}DELETE解散组织
/api/admin/orgs/{orgId}/transfer-ownershipPOST转移所有权
/api/admin/orgs/{orgId}/membersGET组织成员列表
/api/admin/orgs/{orgId}/membersPOST添加组织成员
/api/admin/orgs/{orgId}/members/{userId}/rolePUT修改成员角色
/api/admin/orgs/{orgId}/members/{userId}DELETE移除组织成员

A5 - 二维码审计

端点方法说明
/api/admin/qr-codesGET二维码列表
/api/admin/qr-codes/{qrCodeId}DELETE强制删除

A6 - 资源管理

端点方法说明
/api/admin/assetsGET资源列表
/api/admin/assets/{id}/fieldsGET获取资源动态字段值
/api/admin/assets/{id}/scrapPUT直接报废(将资源状态设为 SCRAPPED)
/api/admin/assets/{id}DELETE强制删除

A8 - 活动管理

端点方法说明
/api/admin/activitiesGET活动列表
/api/admin/activitiesPOST创建活动
/api/admin/activities/{activityId}GET活动详情
/api/admin/activities/{activityId}PUT更新活动
/api/admin/activities/{activityId}DELETE删除活动

A9 - 签到管理

端点方法说明
/api/admin/check-inGET签到记录列表
/api/admin/check-in/{recordId}DELETE删除签到记录

A10 - 通行证管理

端点方法说明
/api/admin/passesGET通行证列表
/api/admin/passes/{passId}/revokePUT撤销通行证
/api/admin/passes/{passId}DELETE删除通行证

A11 - 水印相册管理

端点方法说明
/api/admin/albumsGET照片列表
/api/admin/albums/{photoId}DELETE删除照片

A12 - 分类管理

端点方法说明
/api/admin/categoriesGET分类列表
/api/admin/categories/{categoryId}DELETE删除分类

A13 - 资源分类管理

端点方法说明
/api/admin/asset-categoriesGET全局资源分类列表
/api/admin/asset-categories/{id}DELETE强制删除资源分类

A14 - 通知管理

端点方法说明
/api/admin/notificationsGET通知列表
/api/admin/notifications/{notificationId}DELETE删除通知
/api/admin/notificationsPOST发送系统通知

A15 - 分享记录管理

端点方法说明
/api/admin/sharesGET分享记录列表
/api/admin/shares/{shareId}DELETE删除分享

A16 - 系统配置

端点方法说明
/api/admin/settingsGET获取系统配置
/api/admin/settingsPUT更新系统配置

A17 - 操作日志

端点方法说明
/api/admin/logsGET操作日志列表(按操作类型/时间筛选)

A18 - 文件管理

端点方法说明
/api/admin/filesGET文件列表(按类型/实体/用户筛选)
/api/admin/files/{fileId}DELETE删除单个文件
/api/admin/files/batch-deletePOST批量删除
/api/admin/files/statsGET文件存储统计
/api/admin/files/orphanedGET检测孤儿文件
/api/admin/files/cleanup-orphanedPOST清理孤儿文件记录

A19 - 登录记录管理

端点方法说明
/api/admin/login-recordsGET登录记录查询
/api/login-records/user/{userId}GET查询指定用户登录记录
/api/login-records/recent?hours=24GET查询近期登录记录
/api/login-records/failedGET查询失败登录记录

A20 - 会话管理

端点方法说明
/api/admin/auth/sessions?userId=GET查询用户会话列表
/api/admin/auth/sessions/{sessionId}DELETE强制注销会话
/api/admin/auth/link/list?userId=GET查询用户关联账号列表
/api/admin/auth/linkPOST添加关联账号
/api/admin/auth/link/{linkId}DELETE移除关联账号

A21 - 元数据管理(meta_*,替代原字段定义管理)

/api/admin/field-definitions 4 端点已移除;管理端元数据管理由 AdminMetaController(/api/admin/meta)提供(P2 已上线)。

端点方法权限点说明
/api/admin/meta/objectsGET/POSTmeta_object:read/create对象列表(含停用)/注册业务对象(仅 SYSTEM_ADMIN)
/api/admin/meta/objects/{objectName}/statusPATCHmeta_object:update启停业务对象(仅 SYSTEM_ADMIN)
/api/admin/meta/fields?objectName=&scope=&orgId=GETmeta_field:read全量字段(跨 scope)
/api/admin/meta/fieldsPOSTmeta_field:create建字段(scope 任意,可指定 orgId/entityColumn)
/api/admin/meta/fields/{id}PUT/DELETEmeta_field:update/delete更新/软删字段
/api/admin/meta/templates?objectName=&scope=GETmeta_template:read模板列表
/api/admin/meta/templatesPOSTmeta_template:create新建模板(GLOBAL 或指定组织 ORG)
/api/admin/meta/templates/{id}PUTmeta_template:update更新模板(改名/默认标记/配置)
/api/admin/meta/templates/{id}/fieldsGET/PUTmeta_template:read/update模板字段明细查询/批量替换
/api/admin/meta/templates/{id}DELETEmeta_template:delete软删模板
/api/admin/meta/orgs/{orgId}/templatesGETmeta_template:read查看任意组织的 ORG 模板
/api/admin/assets/{id}/fieldsGETasset:readadmin 资产详情字段(meta 视角,保留)

A22 - 扫码记录

端点方法说明
/api/admin/scan-recordsGET全局扫码记录查询

A23 - 协议管理(AdminAgreementController)与 Markdown 渲染

端点方法权限点说明
/api/admin/agreements?type=SERVICEGETagreement:read协议版本列表(新版在前)
/api/admin/agreementsPOSTagreement:create发布新版本(版本号自动 +1,发布即生效)
/api/admin/agreements/{id}/activatePOSTagreement:activate切换生效版本
/api/admin/common/render-markdownPOSTcontent:renderMarkdown 渲染预览(每用户每分钟 60 次限流)

6. 安全架构

公开路径(permitAll,无需认证)

路径说明
/api/auth/register用户注册
/api/auth/login用户登录
/api/admin/auth/login管理员登录
/api/admin/auth/refresh管理员 Token 刷新
/api/auth/refreshToken 刷新
/api/auth/device-login设备登录(自动注册)
/api/qr-codes/public/**公开二维码访问
/api/qrcode/render/**公开二维码渲染
/api/orgs/public/**公开组织信息
/public/**静态公共资源
/s/**公开分享落地页
/ws/**WebSocket 握手
/actuator/health健康检查
/actuator/**(修正:仅 health 端点公开,其他 actuator 端点需 ADMIN 权限)

权限校验

  • 所有其他路径 → 必须认证(anyRequest().authenticated()
  • 管理员接口 → @PreAuthorize("hasRole('ADMIN')") 类级注解
  • 组织权限 → 业务逻辑校验(查询 org_members 表)

设备用户认证

bash
# 设备用户访问业务接口(JwtAuthFilter 自动注入 DeviceIdAuthentication)
curl http://localhost:8080/api/qr-codes -H "X-Device-Id: device_abc123"
# 响应:200 OK

# 无认证访问 → 401
curl http://localhost:8080/api/qr-codes
# 响应:401 Unauthorized

# 普通用户访问管理员接口 → 403
curl http://localhost:8080/api/admin/users -H "Authorization: Bearer <普通用户token>"
# 响应:403 Forbidden

附录:认证端点补充契约

改造端点

端点变更
POST /api/auth/password/set新增:设置密码(仅未设置时可用,不强制登出)
PUT /api/users/me/username新增:设置用户名(仅未设置时可用,用户名不可修改)
POST /api/auth/email-bind、phone-bind、sms/verify-mobile补唯一性检查(排除自身,换绑=覆盖旧值);成功后 verified=true + recalculateIdentity
PUT /api/users/userinfo不再接受 username 变更;新增 signature 支持(≤100 字符,null 不改);新增 nickname 支持(≤50 字符,null 不改,空串清空)
POST /api/auth/sms/send-code、sms/bind-code、email/send-code、email/bind-code发送前凭证归一化(normalizePhone/normalizeEmail)

响应变更

  • 登录/用户信息类响应统一补 nickname;UserInfoResponse 包含 phone/identities/hasPassword/hasRecoverableCredential
  • device-login 返回统一 LoginResponse(含 hasRecoverableCredential/isNewUser)
  • 新增 admin 端点:/api/admin/nickname/adjectives|nouns CRUD ×8(仅 ADMIN)

附录:密码/解绑端点完整契约

忘记密码(公开,无需登录)

POST /api/auth/password/forgot-code
Request: { credential: string }   # 含@→邮箱,11位数字→手机;凭证须已注册,未注册返回「该账号未注册」
响应:成功 code=200;限频 60s 重发 / 日上限(邮箱 5、短信 10/号、IP 20/日)

POST /api/auth/password/reset
Request: { credential, code, newPassword }   # newPassword ≥6 位
成功后:password 更新 + tokenVersion+1(全部旧 token 失效)

修改密码(登录态)

POST /api/auth/password/change-code
Request: { channel: "PHONE" | "EMAIL" }   # 发码到当前用户已绑定凭证(防向任意号码/邮箱轰炸);未绑定对应凭证 → 400

POST /api/auth/password/change
Request: { verifyType: "OLD_PASSWORD"|"PHONE_CODE"|"EMAIL_CODE",
           oldPassword?, code?, newPassword }
校验:OLD_PASSWORD 需原密码匹配(password=null 时拒绝「尚未设置密码,请先设置用户名和密码」);
      PHONE/EMAIL_CODE 需 phone_verified/email_verified
成功后:password 更新 + tokenVersion+1(全部旧 token 失效,客户端需重新登录)

解绑(登录态)

POST /api/auth/email/unbind   # 无请求体 → 删除 EMAIL identity;仅剩 DEVICE 且无密码时响应提示绑定
POST /api/auth/phone/unbind   # 无请求体 → 删除 PHONE identity;同上

set-username / set-password 契约(重构版)

PUT /api/users/me/username(登录态,设置用户名,独立入口)
Request: { username }
校验顺序:
  1. username 非空
  2. 当前 username 非空 → 400「用户名已设置,不可修改」
  3. existsByUsername 拒绝「该用户名已注册,请直接登录」
成功后:username 赋值(密码不动)

POST /api/auth/password/set(登录态,设置密码,独立入口)
Request: { password }
校验顺序:
  1. 当前 password 非空 → 400「已设置密码,请使用修改密码」(已设置走 /password/change)
  2. 密码 ≥6 位
成功后:password 加密赋值;不强制登出(与 change-password 的 tokenVersion+1 区分)

绑定端点补强(最终版)

  • email-bind / phone-bind / verify-mobile:绑定前唯一性检查(排除自身,换绑=覆盖旧值);成功后 verified=true + recalculateIdentity
  • 发送侧(sms/send-code、sms/bind-code、email/send-code、email/bind-code):凭证先归一化(normalizePhone/normalizeEmail)
  • register:密码 ≥6 位校验(补)

RBAC 权限接口(新增)

方法路径权限说明
GET/api/rbac/my-permissions登录即可当前用户权限点集合(APP + PLATFORM + 当前组织 ORG)
GET/api/rbac/permissions?domain=PLATFORM rbac_permission:read权限点列表(可按域过滤)
POST/api/rbac/permissionsPLATFORM rbac_permission:create新增权限点(domain/resource/action 唯一)
PUT/api/rbac/permissions/{id}PLATFORM rbac_permission:update编辑权限点(启停/描述;无物理删除)
GET/api/rbac/roles?domain=&scopeId=PLATFORM rbac_role:read角色列表(PLATFORM/APP 域)
POST/api/rbac/roles?domain=PLATFORM rbac_role:create创建角色 + 权限搭配
PUT/api/rbac/roles/{id}PLATFORM rbac_role:update更新角色名称/权限(全量替换)
DELETE/api/rbac/roles/{id}PLATFORM rbac_role:delete删除角色(系统角色不可删)
GET/api/rbac/users/{userId}/rolesPLATFORM rbac_user_role:read用户已授权角色
POST/api/rbac/users/{userId}/rolesPLATFORM rbac_user_role:grant授予用户角色(初始 admin 保护)
DELETE/api/rbac/users/{userId}/roles/{roleId}PLATFORM rbac_user_role:revoke撤销用户角色

响应模型变更(§6.6,不再返回 role 编码)

  • OrgResponserolepermissions: List<String> + roleName: String?
  • OrgMemberDto/api/orgs/{orgId}/members):roleroleName + isOwner
  • OrgMemberSummary(后台组织详情):orgRoleroleName
  • LoginResponse / UserInfoResponse:新增 permissionsUserInfoResponseroleroleName
  • switchOrg 响应:role 键 → permissions + roleName
  • OrgShareDtoentityIdsourceId + copyId;分享创建 body 用 sourceId(原件 id)

组织分享(§1.2.9 复制副本)

  • POST /api/orgs/{orgId}/shares(ORG share:create):body {entityType: QR_CODE|ALBUM_PHOTO, sourceId} → 服务端复制副本(qr/album 加 org_id,文件共用 file_id)→ 返回映射记录
  • GET /api/orgs/{orgId}/shares(ORG share:read):分享映射列表
  • DELETE /api/orgs/{orgId}/shares/{shareId}(ORG share:delete,OWNER/ADMIN):物理删除副本 + 映射
  • 组织副本列表:GET /api/qr-codes?orgId=(ORG qrcode:read)/ GET /api/album/org/{orgId}(ORG album:read)

权限判定行为:所有端点逐方法 @RequirePermission;双域接口(asset/activity/qrcode/album)orgId 为空降级 APP 域;未命中返回 403 {"code":403,"message":"无权限执行该操作"}


联系人聊天(IM)接口(新增)

完整契约见专用文档 /designs/messaging/contacts-chat.md(§6.1-6.3 端点、§6.7 DTO 字段级定义)。此处仅列端点索引。

联系人(/api/contacts):申请(POST requests / GET incoming·outgoing·pending-count / POST {id}/accept·reject)、列表(GET / GET {contactId} / PUT {contactId}/remark·tags / DELETE {contactId})、黑名单(POST {contactId}/block·unblock)、搜索与名片码(GET search / my-qrcode / by-qr-code/{code},POST my-qrcode/refresh)、隐私设置(GET/PUT settings)

会话(/api/chats/conversations):列表/详情(GET)、置顶(POST {id}/pin)、免打扰(PUT {id}/mute)、草稿(PUT {id}/draft)、删除会话(DELETE {id})、清空记录(DELETE {id}/messages)、历史(GET {id}/messages?beforeId=&limit=)、已读(POST {id}/read)

消息(/api/chats/messages):发送(POST,client_msg_id 幂等 + attachments 多图拆条)、撤回(POST {id}/recall,2 分钟)、转发(POST forward,多联系人)、增量同步(GET /api/chats/sync?afterId=)

管理后台(/api/admin/chat):设置(GET/PUT settings,chat_setting:read/update)、统计(GET stats)

WebSocket/ws/chat?token= 多设备长连接,事件协议见专用文档 §3.3;NPM /ws/ 反代已支持。

业务错误码:4011 对方开启了朋友验证 / 4012 消息被拒收 / 4014 撤回超时 / 4015 会话无权限 / 4020 未知消息类型 / 4021 content 校验失败 / 4022 配额或限流。