feat: 增强 PocketBase hooks 认证功能

- 更新微信登录、平台注册/登录、资料更新、token 刷新、认证落库等功能,统一使用 openid 作为全平台身份锚点。
- 新增平台用户注册和登录接口,支持手机号和密码认证。
- 实现系统级 token 刷新接口,支持通过微信 code 重新签发 token。
- 新增用户总数查询接口,返回 tbl_auth_users 表中的用户总数。
- 更新 OpenAPI 文档,反映新的接口和数据结构。
- 修改数据库结构,调整字段名称和索引。
- 新增页面示例,展示基本的 HTML 页面结构。
This commit is contained in:
2026-03-25 20:03:46 +08:00
parent 02d5686c7b
commit 6490fc427f
20 changed files with 971 additions and 90 deletions

View File

@@ -11,13 +11,13 @@
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| **user_id** | BigInt (PK) | 内部全局唯一 ID |
| **users_convers_id** | String | 会话/对话侧用户标识,允许为空 |
| **openid** | String (Unique) | **全局身份锚点**,微信唯一标识 |
| **user_name** | String | 姓名/昵称 |
| **users_name** | String | 姓名/昵称 |
| **org_id** | Int | 所属组织/部门 ID影响行级权限的关键属性 |
| **rank_level** | Int | 职级/等级(影响动态权限矩阵的关键属性) |
| **status** | Int | 账户状态 (1: 正常, 0: 禁用) |
| **user_type** | Int | 账户类型 (0: 微信小程序1: 管理平台2: 其他) |
| **users_rank_level** | Int | 职级/等级(影响动态权限矩阵的关键属性) |
| **users_status** | Int | 账户状态 (1: 正常, 0: 禁用) |
| **users_auth_type** | Int | 账户类型 (0: 微信小程序1: 管理平台2: 其他) |
---
@@ -47,7 +47,7 @@
| 字段名 | 类型 | 说明 |
| :--- | :--- | :--- |
| **id** | BigInt (PK) | 自增 ID |
| **user_id** | BigInt | 用户 ID(关联 `tbl_auth_users` |
| **users_convers_id** | String | 用户会话标识(关联 `tbl_auth_users.users_convers_id` |
| **res_id** | Int | 资源 ID关联 `tbl_auth_resources` |
| **access_level** | Int | 权限值 (0: 无权, 1: 只读, 2: 读写) |
| **priority** | Int | 优先级(当角色权限与个人设置冲突时,以此为准) |
@@ -63,7 +63,7 @@
| **target_type** | Enum | 目标:`USER``ROLE` |
| **target_id** | BigInt | 对应的 UserID 或 RoleID |
| **table_name** | String | 作用的表名 |
| **filter_sql** | String | 过滤逻辑。例如:`dept_id = {user.org_id}``creator_id = {user.user_id}` |
| **filter_sql** | String | 过滤逻辑。例如:`dept_id = {user.org_id}``creator_id = {user.users_convers_id}` |
---
@@ -73,13 +73,13 @@
#### 1. 权限计算路径 (Effective Permissions)
当用户访问某个数据时,系统按照以下顺序合并权限:
1. **取基础属性**:获取用户的 `org_id``rank_level`
1. **取基础属性**:获取用户的 `org_id``users_rank_level`
2. **取角色权限**:获取该用户所属角色对应的资源权限列表。
3. **应用个性化覆盖**:查询 `tbl_auth_user_overrides`。如果该表中有记录,则**覆盖**(或叠加)角色权限。
4. **注入行级过滤**:如果是查询操作,解析 `tbl_auth_row_scopes` 中的 `filter_sql`,将 `{user.xxx}` 变量替换为当前用户的真实值。
#### 2. 动态更新机制
* **组织/等级变更**:当 `tbl_auth_users` 中的 `org_id``rank_level` 变化时,由于行级过滤表(`tbl_auth_row_scopes`)引用的是动态变量,**权限会自动生效**,无需重新授权。
* **组织/等级变更**:当 `tbl_auth_users` 中的 `org_id``users_rank_level` 变化时,由于行级过滤表(`tbl_auth_row_scopes`)引用的是动态变量,**权限会自动生效**,无需重新授权。
* **缓存策略**:建议将计算后的“最终权限清单”缓存到 Redis。当用户在后台矩阵页面修改权限或者发生组织架构调整时通过 `wx_openid` **主动失效Purge** 该用户的 Redis 缓存。
#### 3. 字段级权限实现 (Field-Level)

190
docs/tbl_auth_tables.md Normal file
View File

@@ -0,0 +1,190 @@
# tbl_auth 系列表结构说明
> 数据来源:`script/pocketbase.newpb.js`
>
> 说明:以下为当前脚本中定义的 `tbl_auth_` 系列 PocketBase 集合结构,不含 PocketBase `auth` 集合的系统内置字段,仅列出脚本中显式声明的自定义字段与索引。
---
## 1. `tbl_auth_users`
- 集合类型:`auth`
- 说明:认证用户主表,业务身份锚点为 `openid`
### 字段
| 字段名 | 类型 | 必填 | 备注 |
| :--- | :--- | :---: | :--- |
| `users_convers_id` | `text` | 否 | 会话/对话侧用户 ID |
| `openid` | `text` | 是 | 微信身份锚点,唯一索引 |
| `org_id` | `number` | 否 | 组织/部门 ID |
| `users_rank_level` | `number` | 否 | 等级 |
| `users_status` | `number` | 否 | 状态 |
| `users_auth_type` | `number` | 否 | 账户类型 |
| `users_id` | `text` | 否 | 自定义用户 ID |
| `users_name` | `text` | 否 | 用户姓名 |
| `users_idtype` | `text` | 否 | 证件类型 |
| `users_id_number` | `text` | 否 | 证件号 |
| `users_phone` | `text` | 否 | 手机号 |
| `users_level` | `text` | 否 | 用户等级 |
| `users_type` | `text` | 否 | 用户类型 |
| `users_status` | `text` | 否 | 用户状态 |
| `company_id` | `text` | 否 | 公司 ID |
| `users_parent_id` | `text` | 否 | 上级用户 ID |
| `users_promo_code` | `text` | 否 | 推广码 |
| `users_id_pic_a` | `file` | 否 | 证件照正面,`maxSelect: 1`,允许 `jpeg/png/webp` |
| `users_id_pic_b` | `file` | 否 | 证件照反面,`maxSelect: 1`,允许 `jpeg/png/webp` |
| `users_title_picture` | `file` | 否 | 资质照片,`maxSelect: 1`,允许 `jpeg/png/webp` |
| `users_picture` | `text` | 否 | 用户头像 |
| `usergroups_id` | `text` | 否 | 用户组 ID |
### 索引
| 索引名 | 类型 | 字段 |
| :--- | :--- | :--- |
| `idx_tbl_auth_users_users_convers_id` | UNIQUE INDEX | `users_convers_id` |
| `idx_tbl_auth_users_openid` | UNIQUE INDEX | `openid` |
| `idx_tbl_auth_users_org_id` | INDEX | `org_id` |
| `idx_tbl_auth_users_users_rank_level` | INDEX | `users_rank_level` |
| `idx_tbl_auth_users_users_status` | INDEX | `users_status` |
| `idx_tbl_auth_users_users_auth_type` | INDEX | `users_auth_type` |
| `idx_tbl_auth_users_users_phone` | INDEX | `users_phone` |
| `idx_tbl_auth_users_company_id` | INDEX | `company_id` |
| `idx_tbl_auth_users_usergroups_id` | INDEX | `usergroups_id` |
| `idx_tbl_auth_users_users_parent_id` | INDEX | `users_parent_id` |
---
## 2. `tbl_auth_resources`
- 集合类型:`base`
- 说明:受控资源定义表
### 字段
| 字段名 | 类型 | 必填 | 备注 |
| :--- | :--- | :---: | :--- |
| `res_id` | `text` | 是 | 资源 ID |
| `table_name` | `text` | 是 | 表名 |
| `column_name` | `text` | 否 | 字段名 |
| `res_type` | `text` | 是 | 资源类型 |
### 索引
| 索引名 | 类型 | 字段 |
| :--- | :--- | :--- |
| `idx_tbl_auth_resources_res_id` | UNIQUE INDEX | `res_id` |
| `idx_tbl_auth_resources_table_name` | INDEX | `table_name` |
| `idx_tbl_auth_resources_res_type` | INDEX | `res_type` |
| `idx_tbl_auth_resources_unique_res` | UNIQUE INDEX | `table_name, column_name, res_type` |
---
## 3. `tbl_auth_roles`
- 集合类型:`base`
- 说明:角色定义表
### 字段
| 字段名 | 类型 | 必填 | 备注 |
| :--- | :--- | :---: | :--- |
| `role_id` | `text` | 是 | 角色 ID |
| `role_name` | `text` | 是 | 角色名称 |
| `role_code` | `text` | 否 | 角色编码 |
| `role_status` | `number` | 否 | 角色状态 |
| `role_remark` | `text` | 否 | 备注 |
### 索引
| 索引名 | 类型 | 字段 |
| :--- | :--- | :--- |
| `idx_tbl_auth_roles_role_id` | UNIQUE INDEX | `role_id` |
| `idx_tbl_auth_roles_role_name` | UNIQUE INDEX | `role_name` |
| `idx_tbl_auth_roles_role_code` | UNIQUE INDEX | `role_code` |
---
## 4. `tbl_auth_role_perms`
- 集合类型:`base`
- 说明:角色权限映射表
### 字段
| 字段名 | 类型 | 必填 | 备注 |
| :--- | :--- | :---: | :--- |
| `role_perm_id` | `text` | 是 | 角色权限记录 ID |
| `role_id` | `text` | 是 | 角色 ID |
| `res_id` | `text` | 是 | 资源 ID |
| `access_level` | `number` | 是 | 权限级别 |
| `priority` | `number` | 否 | 优先级 |
### 索引
| 索引名 | 类型 | 字段 |
| :--- | :--- | :--- |
| `idx_tbl_auth_role_perms_role_perm_id` | UNIQUE INDEX | `role_perm_id` |
| `idx_tbl_auth_role_perms_role_id` | INDEX | `role_id` |
| `idx_tbl_auth_role_perms_res_id` | INDEX | `res_id` |
| `idx_tbl_auth_role_perms_unique_map` | UNIQUE INDEX | `role_id, res_id` |
---
## 5. `tbl_auth_user_overrides`
- 集合类型:`base`
- 说明:用户个性化权限覆盖表
### 字段
| 字段名 | 类型 | 必填 | 备注 |
| :--- | :--- | :---: | :--- |
| `override_id` | `text` | 是 | 覆盖记录 ID |
| `users_convers_id` | `text` | 是 | 用户会话标识 |
| `res_id` | `text` | 是 | 资源 ID |
| `access_level` | `number` | 是 | 权限级别 |
| `priority` | `number` | 否 | 优先级 |
### 索引
| 索引名 | 类型 | 字段 |
| :--- | :--- | :--- |
| `idx_tbl_auth_user_overrides_override_id` | UNIQUE INDEX | `override_id` |
| `idx_tbl_auth_user_overrides_users_convers_id` | INDEX | `users_convers_id` |
| `idx_tbl_auth_user_overrides_res_id` | INDEX | `res_id` |
| `idx_tbl_auth_user_overrides_unique_map` | UNIQUE INDEX | `users_convers_id, res_id` |
---
## 6. `tbl_auth_row_scopes`
- 集合类型:`base`
- 说明:行级权限范围表
### 字段
| 字段名 | 类型 | 必填 | 备注 |
| :--- | :--- | :---: | :--- |
| `scope_id` | `text` | 是 | 范围记录 ID |
| `target_type` | `text` | 是 | 目标类型 |
| `target_id` | `text` | 是 | 目标 ID |
| `table_name` | `text` | 是 | 作用表名 |
| `filter_sql` | `editor` | 是 | 行级过滤表达式 |
### 索引
| 索引名 | 类型 | 字段 |
| :--- | :--- | :--- |
| `idx_tbl_auth_row_scopes_scope_id` | UNIQUE INDEX | `scope_id` |
| `idx_tbl_auth_row_scopes_target_type` | INDEX | `target_type` |
| `idx_tbl_auth_row_scopes_target_id` | INDEX | `target_id` |
| `idx_tbl_auth_row_scopes_table_name` | INDEX | `table_name` |
---
## 备注
1. `tbl_auth_users``auth` 集合,除上表字段外,还会受 PocketBase auth 系统字段与认证配置影响。
2. 当前文档仅以 `script/pocketbase.newpb.js` 为准,不代表线上数据库已经 100% 同步成功。
3. 若你需要,我可以继续帮你再生成一份“更像数据库设计说明书”的版本,增加字段含义、业务用途、关联关系三列。