# db/zqyy_app — 业务数据库 `zqyy_app` 是 NeoZQYY 的业务数据库,存储用户认证、任务队列、调度配置、执行日志等数据。 测试库:`test_zqyy_app`(开发和测试环境默认连接)。 ## Schema 架构 | Schema | 用途 | 状态 | |--------|------|------| | `auth` | 用户认证与权限(微信用户、角色、权限、申请、绑定) | 已建表 | | `biz` | 业务数据(预留,未来存储门店业务数据) | 已创建,待建表 | | `public` | 管理后台(admin_users、task_queue、scheduled_tasks、task_execution_log) | 已建表 | ## auth Schema — 认证系统(8 张表) ### auth.users — 微信用户主表 | 字段 | 类型 | 说明 | |------|------|------| | id | SERIAL PK | 自增主键 | | wx_openid | VARCHAR(128) UNIQUE | 微信 OpenID | | wx_union_id | VARCHAR(128) | 微信 UnionID | | wx_avatar_url | VARCHAR(512) | 头像 URL | | nickname | VARCHAR(50) | 昵称 | | phone | VARCHAR(20) | 手机号 | | status | VARCHAR(20) | 状态:pending / approved / rejected / disabled | | created_at | TIMESTAMPTZ | 创建时间 | | updated_at | TIMESTAMPTZ | 更新时间 | ### auth.site_code_mapping — 球房ID与门店映射 | 字段 | 类型 | 说明 | |------|------|------| | id | SERIAL PK | 自增主键 | | site_code | VARCHAR(10) UNIQUE | 球房ID(格式:2字母+3数字,如 AB123) | | site_id | BIGINT UNIQUE | 门店 ID(对应 ETL 库的 site_id) | | site_name | VARCHAR(100) | 门店名称 | | tenant_id | INT | 租户 ID | ### auth.roles — 角色定义 | 字段 | 类型 | 说明 | |------|------|------| | id | SERIAL PK | 自增主键 | | code | VARCHAR(50) UNIQUE | 角色编码 | | name | VARCHAR(100) | 角色名称 | | description | TEXT | 描述 | 预置角色: | code | name | 权限 | |------|------|------| | `coach` | 助教 | view_tasks, view_board_coach | | `staff` | 员工 | view_tasks, view_board | | `site_admin` | 店铺管理员 | 全部 5 个权限 | | `tenant_admin` | 租户管理员 | 全部 5 个权限 | ### auth.permissions — 权限定义 | 字段 | 类型 | 说明 | |------|------|------| | id | SERIAL PK | 自增主键 | | code | VARCHAR(50) UNIQUE | 权限编码 | | name | VARCHAR(100) | 权限名称 | | description | TEXT | 描述 | 预置权限: | code | name | |------|------| | `view_tasks` | 查看任务 | | `view_board` | 查看看板 | | `view_board_finance` | 查看财务看板 | | `view_board_customer` | 查看客户看板 | | `view_board_coach` | 查看助教看板 | ### auth.role_permissions — 角色-权限关联 联合主键 `(role_id, permission_id)`,外键级联删除。 ### auth.user_applications — 用户入驻申请 | 字段 | 类型 | 说明 | |------|------|------| | id | SERIAL PK | 自增主键 | | user_id | INT FK | 关联 auth.users | | site_code | VARCHAR(10) | 球房ID | | site_id | BIGINT | 门店 ID(后端自动填充) | | applied_role_text | VARCHAR(100) | 申请身份文本 | | employee_number | VARCHAR(50) | 员工编号 | | phone | VARCHAR(20) | 手机号 | | status | VARCHAR(20) | pending / approved / rejected | | reviewer_id | INT | 审核人 | | review_note | TEXT | 审核备注 | | created_at | TIMESTAMPTZ | 申请时间 | | reviewed_at | TIMESTAMPTZ | 审核时间 | ### auth.user_site_roles — 用户-门店-角色关联 | 字段 | 类型 | 说明 | |------|------|------| | id | SERIAL PK | 自增主键 | | user_id | INT FK | 关联 auth.users | | site_id | BIGINT | 门店 ID | | role_id | INT FK | 关联 auth.roles | 唯一约束:`(user_id, site_id, role_id)` — 同一用户在同一门店下不能重复分配同一角色。 ### auth.user_assistant_binding — 用户-人员绑定 | 字段 | 类型 | 说明 | |------|------|------| | id | SERIAL PK | 自增主键 | | user_id | INT FK | 关联 auth.users | | site_id | BIGINT | 门店 ID | | assistant_id | BIGINT | 助教 ID(ETL 库) | | staff_id | BIGINT | 员工 ID(ETL 库) | | binding_type | VARCHAR(20) | 绑定类型 | ## public Schema — 管理后台 ### admin_users — 管理后台用户 用于管理后台(`apps/admin-web/`)的用户名密码登录。 默认种子数据:`admin / admin123`(生产环境部署后务必修改)。 ### task_queue — 任务执行队列 存储待执行和执行中的 ETL 任务,按 `site_id` 隔离。 ### scheduled_tasks — 调度任务配置 存储定时调度规则,由后端 `Scheduler` 服务消费。 ### task_execution_log — 任务执行日志 记录每次 ETL 任务执行的状态、耗时、日志输出。 ## FDW 跨库访问 `zqyy_app` 通过 Foreign Data Wrapper(FDW)只读访问 `etl_feiqiu` 数据库: - 迁移脚本:`2026-02-24__p1_setup_fdw_etl.sql` - 用途:小程序认证时的人员匹配(查询 ETL 库中的助教/员工记录) - 安全:FDW 连接使用只读用户 ## 目录结构 ``` db/zqyy_app/ ├── migrations/ # 迁移脚本(日期前缀) │ ├── 2026-02-24__p1_create_auth_biz_schemas.sql # 创建 auth + biz Schema │ ├── 2026-02-24__p1_setup_fdw_etl.sql # 设置 FDW 跨库访问 │ ├── 2026-02-25__p3_create_auth_tables.sql # 创建 auth 8 张表 │ └── 2026-02-25__p3_seed_roles_permissions.sql # 预置角色和权限 ├── schemas/ # Schema DDL(待补充) ├── seeds/ │ └── admin_web_seed.sql # 管理后台默认管理员 ├── scripts/ │ └── create_test_db.sql # 创建测试库脚本 └── README.md ``` ## 迁移执行顺序 1. `p1_create_auth_biz_schemas.sql` — 创建 Schema 2. `p1_setup_fdw_etl.sql` — 设置 FDW 3. `p3_create_auth_tables.sql` — 创建认证表 4. `p3_seed_roles_permissions.sql` — 插入种子数据 所有迁移脚本使用 `IF NOT EXISTS` / `ON CONFLICT DO NOTHING` 幂等语法,可重复执行。 ## 与其他模块的关系 - `apps/backend/` — 通过 `get_connection()` 读写此库 - `apps/miniprogram/` — 通过后端 API 间接访问 - `apps/admin-web/` — 通过后端 API 间接访问 - `db/etl_feiqiu/` — 通过 FDW 被此库只读引用