feat: 更新用户类型逻辑,优化微信用户资料更新接口;移除不必要的安全配置,简化 API 文档

This commit is contained in:
2026-03-30 12:04:02 +08:00
parent 50c09d855b
commit 6f7efbc799
5 changed files with 63 additions and 54 deletions

View File

@@ -439,7 +439,7 @@ function registerPlatformUser(payload) {
record.set('users_phone', payload.users_phone) record.set('users_phone', payload.users_phone)
record.set('users_id_number', payload.users_id_number || '') record.set('users_id_number', payload.users_id_number || '')
record.set('users_level', payload.users_level || '') record.set('users_level', payload.users_level || '')
record.set('users_type', payload.users_type || REGISTERED_USER_TYPE) record.set('users_type', payload.users_type || GUEST_USER_TYPE)
record.set('users_tag', payload.users_tag || '') record.set('users_tag', payload.users_tag || '')
record.set('company_id', payload.company_id || '') record.set('company_id', payload.company_id || '')
record.set('users_parent_id', payload.users_parent_id || '') record.set('users_parent_id', payload.users_parent_id || '')
@@ -572,6 +572,8 @@ function updateWechatUserProfile(usersWxOpenid, payload) {
throw createAppError(404, '未找到待编辑的用户') throw createAppError(404, '未找到待编辑的用户')
} }
const currentUserTypeBefore = currentUser.getString('users_type') || GUEST_USER_TYPE
let usersPhone = '' let usersPhone = ''
if (payload.users_phone_code) { if (payload.users_phone_code) {
usersPhone = wechatService.getWxPhoneNumber(payload.users_phone_code) usersPhone = wechatService.getWxPhoneNumber(payload.users_phone_code)
@@ -596,8 +598,13 @@ function updateWechatUserProfile(usersWxOpenid, payload) {
if (usersPhone) { if (usersPhone) {
currentUser.set('users_phone', usersPhone) currentUser.set('users_phone', usersPhone)
} }
let hasExplicitUserType = false
if (typeof payload.users_type !== 'undefined' && payload.users_type) { if (typeof payload.users_type !== 'undefined' && payload.users_type) {
currentUser.set('users_type', payload.users_type) const requestedUserType = String(payload.users_type || '').trim()
if (requestedUserType) {
currentUser.set('users_type', requestedUserType)
hasExplicitUserType = true
}
} }
if (typeof payload.company_id !== 'undefined' && payload.company_id) { if (typeof payload.company_id !== 'undefined' && payload.company_id) {
currentUser.set('company_id', payload.company_id) currentUser.set('company_id', payload.company_id)
@@ -607,9 +614,8 @@ function updateWechatUserProfile(usersWxOpenid, payload) {
} }
applyUserAttachmentFields(currentUser, payload) applyUserAttachmentFields(currentUser, payload)
const shouldPromote = ((currentUser.getString('users_type') || GUEST_USER_TYPE) === GUEST_USER_TYPE) const shouldPromote = (currentUserTypeBefore === GUEST_USER_TYPE)
&& typeof payload.users_type === 'undefined' && !hasExplicitUserType
&& isInfoComplete(currentUser)
if (shouldPromote) { if (shouldPromote) {
currentUser.set('users_type', REGISTERED_USER_TYPE) currentUser.set('users_type', REGISTERED_USER_TYPE)
} }

View File

@@ -29,14 +29,7 @@ tags:
description: "面向 ManagePlatform 用户的文档新增、查询、修改、删除接口;查询时会自动返回关联附件的 PocketBase 文件流链接。" description: "面向 ManagePlatform 用户的文档新增、查询、修改、删除接口;查询时会自动返回关联附件的 PocketBase 文件流链接。"
- name: 文档历史 - name: 文档历史
description: "面向 ManagePlatform 用户的文档操作历史查询接口。" description: "面向 ManagePlatform 用户的文档操作历史查询接口。"
security:
- bearerAuth: []
components: components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
schemas: schemas:
ApiResponse: ApiResponse:
type: object type: object
@@ -1325,7 +1318,6 @@ paths:
post: post:
tags: [字典管理] tags: [字典管理]
summary: 查询字典列表 summary: 查询字典列表
security: []
description: | description: |
公开读接口,无需 token。 公开读接口,无需 token。
支持按 `dict_name` 模糊搜索,返回字典全量信息,并将三个聚合字段组装为 `items`。 支持按 `dict_name` 模糊搜索,返回字典全量信息,并将三个聚合字段组装为 `items`。
@@ -1354,7 +1346,6 @@ paths:
post: post:
tags: [字典管理] tags: [字典管理]
summary: 查询指定字典 summary: 查询指定字典
security: []
description: | description: |
公开读接口,无需 token。 公开读接口,无需 token。
按唯一键 `dict_name` 查询单条字典,并返回组装后的 `items`。 按唯一键 `dict_name` 查询单条字典,并返回组装后的 `items`。

View File

@@ -18,8 +18,6 @@ servers:
tags: tags:
- name: Company - name: Company
description: tbl_company 公司信息基础 CRUD description: tbl_company 公司信息基础 CRUD
security:
- pocketbaseAuth: []
paths: paths:
/api/collections/tbl_company/records: /api/collections/tbl_company/records:
get: get:
@@ -293,12 +291,6 @@ paths:
schema: schema:
$ref: '#/components/schemas/PocketBaseError' $ref: '#/components/schemas/PocketBaseError'
components: components:
securitySchemes:
pocketbaseAuth:
type: apiKey
in: header
name: Authorization
description: PocketBase 认证 token。使用 JS SDK 时通常由 `pb.authStore` 自动附带。
parameters: parameters:
Page: Page:
name: page name: page

View File

@@ -28,7 +28,6 @@ paths:
/pb/api/system/users-count: /pb/api/system/users-count:
post: post:
operationId: postSystemUsersCount operationId: postSystemUsersCount
security: []
tags: tags:
- 系统 - 系统
summary: 查询用户总数 summary: 查询用户总数
@@ -55,9 +54,6 @@ paths:
/pb/api/system/refresh-token: /pb/api/system/refresh-token:
post: post:
operationId: postSystemRefreshToken operationId: postSystemRefreshToken
security:
- bearerAuth: []
- {}
tags: tags:
- 系统 - 系统
summary: 刷新认证 token summary: 刷新认证 token
@@ -116,7 +112,6 @@ paths:
/pb/api/wechat/login: /pb/api/wechat/login:
post: post:
operationId: postWechatLogin operationId: postWechatLogin
security: []
tags: tags:
- 微信认证 - 微信认证
summary: 微信登录或首次注册 summary: 微信登录或首次注册
@@ -169,8 +164,6 @@ paths:
/pb/api/wechat/profile: /pb/api/wechat/profile:
post: post:
operationId: postWechatProfile operationId: postWechatProfile
security:
- bearerAuth: []
tags: tags:
- 微信认证 - 微信认证
summary: 更新微信用户资料 summary: 更新微信用户资料
@@ -181,6 +174,8 @@ paths:
- 所有字段都不是必填 - 所有字段都不是必填
- 如果传了 `users_phone_code`,服务端优先调用微信接口换取真实手机号并写入 `users_phone` - 如果传了 `users_phone_code`,服务端优先调用微信接口换取真实手机号并写入 `users_phone`
- 如果没传 `users_phone_code`,但传了 `users_phone`,则直接将该手机号写入数据库 - 如果没传 `users_phone_code`,但传了 `users_phone`,则直接将该手机号写入数据库
- 如果上传了 `users_picture`、`users_id_pic_a`、`users_id_pic_b`、`users_title_picture`,会按附件 ID 进行关联校验并更新
- 若当前用户类型为 `游客`,且本次未显式传 `users_type`,服务端会自动升级为 `注册用户`
- 如果某个字段未传或传空,则不会清空数据库中的已有值 - 如果某个字段未传或传空,则不会清空数据库中的已有值
- 只有请求体里非空的字段才会更新到数据库 - 只有请求体里非空的字段才会更新到数据库
requestBody: requestBody:
@@ -197,7 +192,7 @@ paths:
schema: schema:
$ref: '#/components/schemas/WechatProfileResponse' $ref: '#/components/schemas/WechatProfileResponse'
'400': '400':
description: 参数错误、手机号已被占用、微信手机号换取失败或资料更新失败 description: 参数错误、手机号已被占用、附件 ID 无效、微信手机号换取失败或资料更新失败
content: content:
application/json: application/json:
schema: schema:
@@ -229,7 +224,6 @@ paths:
/pb/api/collections/tbl_company/records: /pb/api/collections/tbl_company/records:
post: post:
operationId: postPocketBaseCompanyRecord operationId: postPocketBaseCompanyRecord
security: []
tags: tags:
- 企业信息 - 企业信息
summary: 创建公司 summary: 创建公司
@@ -298,7 +292,6 @@ paths:
$ref: '#/components/schemas/PocketBaseNativeError' $ref: '#/components/schemas/PocketBaseNativeError'
get: get:
operationId: getPocketBaseCompanyRecords operationId: getPocketBaseCompanyRecords
security: []
tags: tags:
- 企业信息 - 企业信息
summary: 查询整个 tbl_company 列表 / 根据 company_id 查询对应公司信息 summary: 查询整个 tbl_company 列表 / 根据 company_id 查询对应公司信息
@@ -448,8 +441,6 @@ paths:
/pb/api/collections/tbl_company/records/{recordId}: /pb/api/collections/tbl_company/records/{recordId}:
patch: patch:
operationId: patchPocketBaseCompanyRecordByRecordId operationId: patchPocketBaseCompanyRecordByRecordId
security:
- bearerAuth: []
tags: tags:
- 企业信息 - 企业信息
summary: 通过 company_id 定位后修改公司信息 summary: 通过 company_id 定位后修改公司信息
@@ -522,10 +513,9 @@ paths:
/pb/api/collections/tbl_attachments/records: /pb/api/collections/tbl_attachments/records:
get: get:
operationId: getPocketBaseAttachmentRecords operationId: getPocketBaseAttachmentRecords
security: []
tags: tags:
- 附件信息 - 附件信息
summary: 根据 attachments_id 查询附件信息 summary: 根据 attachments_id 查询单条或多条附件信息
description: | description: |
使用 PocketBase 原生 records list 接口查询 `tbl_attachments`。 使用 PocketBase 原生 records list 接口查询 `tbl_attachments`。
@@ -533,10 +523,15 @@ paths:
- `listRule = ""`,因此任何客户端都可直接读取 - `listRule = ""`,因此任何客户端都可直接读取
- 原生 `create/update/delete` 仍仅管理员或管理后台用户允许 - 原生 `create/update/delete` 仍仅管理员或管理后台用户允许
标准调用方式: 标准调用方式有两种
1. 按 `attachments_id` 查询单条:
- `filter=attachments_id="ATT-1774599142438-8n1UcU"` - `filter=attachments_id="ATT-1774599142438-8n1UcU"`
- `perPage=1` - `perPage=1`
- `page=1` - `page=1`
2. 按多个 `attachments_id` 批量查询:
- 使用 `||` 组合多个等值条件
- 例如:`filter=attachments_id="ATT-1774599142438-8n1UcU" || attachments_id="ATT-1774599143999-7pQkLm"`
- 传 `perPage` 为预期返回条数,`page=1`
注意: 注意:
- 这是 PocketBase 原生返回结构,不是 hooks 统一 `{ statusCode, errMsg, data }` 包装 - 这是 PocketBase 原生返回结构,不是 hooks 统一 `{ statusCode, errMsg, data }` 包装
@@ -545,12 +540,13 @@ paths:
parameters: parameters:
- name: filter - name: filter
in: query in: query
required: true required: false
description: | description: |
PocketBase 标准过滤表达式。 PocketBase 标准过滤表达式。
按 `attachments_id` 精确查询时固定写法为: - 按 `attachments_id` 精确查询单条:`attachments_id="ATT-1774599142438-8n1UcU"`
- `attachments_id="ATT-1774599142438-8n1UcU"` - 按多个 `attachments_id` 批量查询:`attachments_id="ATT-1774599142438-8n1UcU" || attachments_id="ATT-1774599143999-7pQkLm"`
- 不传该参数时,返回分页列表
schema: schema:
type: string type: string
example: attachments_id="ATT-1774599142438-8n1UcU" example: attachments_id="ATT-1774599142438-8n1UcU"
@@ -565,11 +561,11 @@ paths:
- name: perPage - name: perPage
in: query in: query
required: false required: false
description: 每页条数;按 `attachments_id` 单查建议固定为 `1` description: 每页条数;单查建议为 `1`,批量查询建议设置为预期条数
schema: schema:
type: integer type: integer
minimum: 1 minimum: 1
default: 1 default: 20
responses: responses:
'200': '200':
description: 查询成功 description: 查询成功
@@ -598,6 +594,39 @@ paths:
attachments_ocr: OCR识别结果 | string attachments_ocr: OCR识别结果 | string
attachments_status: 附件状态 | string attachments_status: 附件状态 | string
attachments_remark: 备注 | string attachments_remark: 备注 | string
byAttachmentsIds:
value:
page: 页码 | integer
perPage: 每页条数 | integer
totalItems: 总记录数 | integer
totalPages: 总页数 | integer
items:
- id: PocketBase记录主键 | string
collectionId: 集合ID | string
collectionName: 集合名称 | string
attachments_id: ATT-1774599142438-8n1UcU
attachments_link: PocketBase文件字段值可拼接文件流地址 | string
attachments_filename: 原始文件名 | string
attachments_filetype: 文件类型或MIME | string
attachments_size: 文件大小 | number
attachments_owner: 上传者业务标识 | string
attachments_md5: 文件MD5 | string
attachments_ocr: OCR识别结果 | string
attachments_status: 附件状态 | string
attachments_remark: 备注 | string
- id: PocketBase记录主键 | string
collectionId: 集合ID | string
collectionName: 集合名称 | string
attachments_id: ATT-1774599143999-7pQkLm
attachments_link: PocketBase文件字段值可拼接文件流地址 | string
attachments_filename: 原始文件名 | string
attachments_filetype: 文件类型或MIME | string
attachments_size: 文件大小 | number
attachments_owner: 上传者业务标识 | string
attachments_md5: 文件MD5 | string
attachments_ocr: OCR识别结果 | string
attachments_status: 附件状态 | string
attachments_remark: 备注 | string
'400': '400':
description: 查询参数错误 description: 查询参数错误
content: content:
@@ -619,7 +648,6 @@ paths:
/pb/api/collections/tbl_document/records: /pb/api/collections/tbl_document/records:
get: get:
operationId: getPocketBaseDocumentRecords operationId: getPocketBaseDocumentRecords
security: []
tags: tags:
- 文档信息 - 文档信息
summary: 分页查询文档列表 / 按 system_dict_id 与 enum 双条件分页筛选文档 summary: 分页查询文档列表 / 按 system_dict_id 与 enum 双条件分页筛选文档
@@ -777,11 +805,6 @@ paths:
schema: schema:
$ref: '#/components/schemas/PocketBaseNativeError' $ref: '#/components/schemas/PocketBaseNativeError'
components: components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
schemas: schemas:
ApiResponseBase: ApiResponseBase:
type: object type: object

View File

@@ -13,7 +13,6 @@ servers:
description: 生产环境 description: 生产环境
- url: http://localhost:8090 - url: http://localhost:8090
description: PocketBase 本地环境 description: PocketBase 本地环境
security: []
tags: tags:
- name: 系统 - name: 系统
description: 基础检查接口 description: 基础检查接口
@@ -1398,7 +1397,6 @@ paths:
post: post:
tags: [字典管理] tags: [字典管理]
summary: 查询字典列表 summary: 查询字典列表
security: []
description: | description: |
公开读接口,无需 token。 公开读接口,无需 token。
支持按 `dict_name` 模糊搜索,返回字典全量信息,并将三个聚合字段组装为 `items`。 支持按 `dict_name` 模糊搜索,返回字典全量信息,并将三个聚合字段组装为 `items`。
@@ -1427,7 +1425,6 @@ paths:
post: post:
tags: [字典管理] tags: [字典管理]
summary: 查询指定字典 summary: 查询指定字典
security: []
description: | description: |
公开读接口,无需 token。 公开读接口,无需 token。
按唯一键 `dict_name` 查询单条字典,并返回组装后的 `items`。 按唯一键 `dict_name` 查询单条字典,并返回组装后的 `items`。