Files
Web_BAI_Manage_ApiServer/pocket-base/spec/openapi.yaml
XuJiacheng 6490fc427f feat: 增强 PocketBase hooks 认证功能
- 更新微信登录、平台注册/登录、资料更新、token 刷新、认证落库等功能,统一使用 openid 作为全平台身份锚点。
- 新增平台用户注册和登录接口,支持手机号和密码认证。
- 实现系统级 token 刷新接口,支持通过微信 code 重新签发 token。
- 新增用户总数查询接口,返回 tbl_auth_users 表中的用户总数。
- 更新 OpenAPI 文档,反映新的接口和数据结构。
- 修改数据库结构,调整字段名称和索引。
- 新增页面示例,展示基本的 HTML 页面结构。
2026-03-25 20:03:46 +08:00

477 lines
15 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
openapi: 3.1.0
info:
title: BAI PocketBase Hooks API
description: |
基于 PocketBase `bai_api_pb_hooks` 的对外接口文档,可直接导入 Postman。
当前 `tbl_auth_users.openid` 已被定义为全平台统一身份锚点:
- 微信用户:`openid = 微信 openid`
- 平台用户:`openid = 服务端生成的 GUID`
version: 1.0.0
servers:
- url: https://bai-api.blv-oa.com/pb
description: 生产环境
- url: http://localhost:8090
description: PocketBase 本地环境
tags:
- name: 系统
description: 基础检查接口
- name: 微信认证
description: 面向微信用户的认证接口;认证成功后仍统一使用全平台 `openid` 与 PocketBase 原生 token。
- name: 平台认证
description: 面向平台用户的认证接口;平台用户会生成 GUID 并写入统一 `openid` 字段。
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: PocketBaseAuthToken
schemas:
ApiResponse:
type: object
required: [code, msg, data]
properties:
code:
type: integer
example: 200
msg:
type: string
example: 操作成功
data:
type: object
additionalProperties: true
HealthData:
type: object
properties:
status:
type: string
example: healthy
timestamp:
type: string
format: date-time
UsersCountData:
type: object
properties:
total_users:
type: integer
description: tbl_auth_users 表中的用户总数
example: 128
HelloWorldData:
type: object
properties:
message:
type: string
example: Hello, World!
timestamp:
type: string
format: date-time
status:
type: string
example: success
build_time:
type: string
nullable: true
format: date-time
CompanyInfo:
type: object
nullable: true
additionalProperties: true
UserInfo:
type: object
description: |
统一用户视图。
其中 `openid` 为全平台统一身份标识:微信用户使用微信 openid平台用户使用服务端生成 GUID。
properties:
pb_id:
type: string
users_convers_id:
type: string
users_id:
type: string
users_idtype:
type: string
description: 用户身份来源类型
enum: [WeChat, ManagePlatform]
users_id_number:
type: string
users_status:
type: number
users_rank_level:
type: number
users_auth_type:
type: number
users_type:
type: string
enum: [游客, 注册用户]
users_name:
type: string
users_phone:
type: string
users_phone_masked:
type: string
users_level:
type: string
users_picture:
type: string
openid:
type: string
description: 全平台统一身份标识;微信用户为微信 openid平台用户为服务端生成的 GUID
company_id:
type: string
users_parent_id:
type: string
users_promo_code:
type: string
usergroups_id:
type: string
company:
$ref: '#/components/schemas/CompanyInfo'
created:
type: string
updated:
type: string
PocketBaseAuthResponse:
type: object
description: |
PocketBase 原生认证响应。
客户端可直接使用返回的 `token` 与 PocketBase SDK 或当前 hooks 接口交互。
properties:
token:
type: string
description: PocketBase 原生 auth token
record:
type: object
description: PocketBase auth record 原始对象
meta:
type: object
properties:
code:
type: integer
example: 200
msg:
type: string
example: 登录成功
data:
type: object
properties:
status:
type: string
enum: [register_success, login_success]
is_info_complete:
type: boolean
user:
$ref: '#/components/schemas/UserInfo'
WechatLoginRequest:
type: object
required: [users_wx_code]
description: 微信小程序登录/注册请求体。
properties:
users_wx_code:
type: string
description: 微信小程序登录临时凭证 code
example: 0a1b2c3d4e5f6g
WechatProfileRequest:
type: object
required: [users_name, users_phone_code, users_picture]
description: 微信用户资料完善请求体。
properties:
users_name:
type: string
example: 张三
users_phone_code:
type: string
example: 2b7d9f2e3c4a5b6d7e8f
users_picture:
type: string
example: https://example.com/avatar.png
WechatProfileResponseData:
type: object
properties:
status:
type: string
enum: [update_success]
user:
$ref: '#/components/schemas/UserInfo'
PlatformRegisterRequest:
type: object
required: [users_name, users_phone, password, passwordConfirm, users_picture]
description: 平台用户注册请求体;注册成功后将生成 GUID 并写入统一 `openid` 字段。
properties:
users_name:
type: string
example: 张三
users_phone:
type: string
example: 13800138000
password:
type: string
example: 12345678
passwordConfirm:
type: string
example: 12345678
users_picture:
type: string
example: https://example.com/avatar.png
users_id_number:
type: string
users_level:
type: string
users_type:
type: string
company_id:
type: string
users_parent_id:
type: string
users_promo_code:
type: string
usergroups_id:
type: string
PlatformLoginRequest:
type: object
required: [users_phone, password]
description: 平台用户登录请求体;前端使用手机号+密码提交,服务端内部转换为 PocketBase 原生 password auth。
properties:
users_phone:
type: string
example: 13800138000
password:
type: string
example: 12345678
SystemRefreshTokenRequest:
type: object
description: |
系统刷新 token 请求体。
`users_wx_code` 允许为空。
当 `Authorization` 对应 token 有效时,可不传或传空;
当 token 失效时,需提供 `users_wx_code` 走微信 code 重新签发流程。
properties:
users_wx_code:
type: string
nullable: true
description: 微信小程序登录临时凭证 code
example: 0a1b2c3d4e5f6g
RefreshTokenData:
type: object
properties:
token:
type: string
description: 新签发的 PocketBase 原生 auth token
paths:
/api/system/test-helloworld:
post:
tags: [系统]
summary: HelloWorld 测试接口
responses:
'200':
description: 成功
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/ApiResponse'
- type: object
properties:
data:
$ref: '#/components/schemas/HelloWorldData'
/api/system/health:
post:
tags: [系统]
summary: 健康检查
responses:
'200':
description: 成功
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/ApiResponse'
- type: object
properties:
data:
$ref: '#/components/schemas/HealthData'
/api/system/users-count:
post:
tags: [系统]
summary: 查询用户总数
description: 统计 `tbl_auth_users` 集合中的记录总数,并返回一个数值。
responses:
'200':
description: 成功
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/ApiResponse'
- type: object
properties:
data:
$ref: '#/components/schemas/UsersCountData'
/api/system/refresh-token:
post:
tags: [系统]
summary: 刷新系统认证 token
description: |
当前实现支持两种刷新路径:
1) 若 `Authorization` 对应 token 仍有效:直接按当前 auth record 续签(不调用微信接口)。
2) 若 token 已过期:仅在 body 提供 `users_wx_code` 时才走微信 code 重新签发。
返回体仅包含新的 `token`,不返回完整登录用户信息。
parameters:
- in: header
name: Authorization
required: false
schema:
type: string
description: 可选。建议传入旧 token`Bearer <token>`)以优先走有效 token 续签路径。
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/SystemRefreshTokenRequest'
responses:
'200':
description: 刷新成功(返回精简 token
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/ApiResponse'
- type: object
properties:
data:
$ref: '#/components/schemas/RefreshTokenData'
'400':
description: 参数错误或微信侧身份换取失败
'401':
description: token 无效/已过期,且未提供 users_wx_code
'404':
description: 用户不存在
'415':
description: 请求体必须为 application/json
'429':
description: 重复请求过于频繁
/api/wechat/login:
post:
tags: [微信认证]
summary: 微信登录/注册合一
description: |
使用微信 code 换取微信侧 openid并写入统一身份字段 `tbl_auth_users.openid`。
若 `tbl_auth_users` 中不存在对应用户则自动创建 auth record随后返回 PocketBase 原生 auth token。
首次注册创建时会写入 `users_idtype = WeChat`。
返回的 `token` 可直接用于 PocketBase SDK 与当前 hooks 接口调用。
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WechatLoginRequest'
responses:
'200':
description: 登录或注册成功
content:
application/json:
schema:
$ref: '#/components/schemas/PocketBaseAuthResponse'
'400':
description: 参数错误或微信侧身份换取失败
'401':
description: PocketBase 原生认证失败
'415':
description: 请求体必须为 application/json
'429':
description: 重复请求过于频繁
'500':
description: 保存 auth 用户失败或服务端内部错误
/api/platform/register:
post:
tags: [平台认证]
summary: 平台用户注册
description: |
创建平台用户 auth record。
服务端会自动生成 GUID 并写入统一身份字段 `openid`,同时写入 `users_idtype = ManagePlatform`。
前端以 `users_phone + password/passwordConfirm` 注册,但服务端仍会创建 PocketBase 原生 auth 用户。
注册成功后直接返回 PocketBase 原生 auth token。
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PlatformRegisterRequest'
responses:
'200':
description: 注册成功
content:
application/json:
schema:
$ref: '#/components/schemas/PocketBaseAuthResponse'
'400':
description: 参数错误或手机号已存在
'500':
description: GUID 生成失败、auth identity 缺失或保存用户失败
'415':
description: 请求体必须为 application/json
'429':
description: 重复请求过于频繁
/api/platform/login:
post:
tags: [平台认证]
summary: 平台用户登录
description: |
前端使用平台注册时保存的 `users_phone + password` 登录。
仅允许 `users_idtype = ManagePlatform` 的用户通过该接口登录。
服务端会先按手机号定位平台用户,再使用该用户的 PocketBase 原生 identity当前为 `email`)执行原生 password auth。
登录成功后直接返回 PocketBase 原生 auth token。
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PlatformLoginRequest'
responses:
'200':
description: 登录成功
content:
application/json:
schema:
$ref: '#/components/schemas/PocketBaseAuthResponse'
'400':
description: 参数错误、密码错误或用户类型不匹配
'404':
description: 平台用户不存在
'500':
description: 平台用户缺少原生登录 identity 或服务端内部错误
'415':
description: 请求体必须为 application/json
'429':
description: 重复请求过于频繁
/api/wechat/profile:
post:
tags: [微信认证]
summary: 更新微信用户资料
description: |
基于当前 `Authorization` 对应 auth record 中的统一 `openid` 定位当前微信用户。
当前接口仍用于微信资料完善场景。
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WechatProfileRequest'
responses:
'200':
description: 更新成功
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/ApiResponse'
- type: object
properties:
data:
$ref: '#/components/schemas/WechatProfileResponseData'
'401':
description: token 无效或当前 auth record 缺少统一身份字段 openid
'400':
description: 参数错误、手机号已被注册或资料更新失败