Files
K12Study/docs/plan/architecture.md
2026-04-14 18:14:41 +08:00

207 lines
8.3 KiB
Markdown
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.

# K12Study 首版项目框架规划
## Progress
- [x] 根目录骨架已创建:`backend``frontend``app``init/pg`
- [x] `backend` Maven 多模块目录与基础 POM 已落地
- [x] `gateway``auth``upms``boot-dev``python-ai` 首版占位代码已创建
- [x] `init/pg` 已按模块拆分,并接入根目录 `sys_area.sql`
- [x] 学校租户表命名已修正为 `tb_sys_tenant`
- [x] 跨包 DTO、Enums 已收口到对应 `api-*` 模块
- [x] Web 端已从 workspace 收敛为单一 React 项目
- [x] Web 端请求层已切换为原生 `fetch` 封装
- [x] 根目录已新增独立 `app` 微信小程序骨架
- [x] VS Code `docker-dev` 双模式已补齐:`external` 直连外部 PG/Redis`internal` 内置 PG/Redis
- [x] `backend` Maven 聚合编译、`frontend` 构建、`python-ai` 语法校验已通过
- [x] `boot-dev` 本地模式烟测已通过,`/api/auth/login``/api/upms/routes``/api/actuator/health` 可访问
- [ ] 下一步继续补真实持久化、分片路由封装与更完整联调
## Summary
- 根目录固定为:
- `backend`
- `frontend`
- `app`
- 参考 `Tik / urbanLifeline` 的模块拆分和基础层组织,但不复用 `Dubbo``Vue` 和旧业务实现。
- 首版目标是“可运行骨架”:
- 后端:`Spring Boot + Spring Cloud Gateway + Spring RESTful + JWT + RBAC + MyBatis-Plus + PostgreSQL + Redis`
- Web单一 `React` 项目,只保留 `api / types / utils / components / dynamic layout / dynamic route`
- App独立微信小程序骨架
- AI独立 `Python` 服务占位
- 本地开发采用双模式:
- 分布式目录与服务边界长期保留
- `boot-dev` 聚合模块一键启动主要 Java 能力
- `/api` 只属于 `gateway``boot-dev` 的外层上下文,不属于子服务自身前缀。
## Key Changes
- `backend` 采用 Maven 多模块,固定为:
- `backend/common``common-core``common-web``common-security``common-mybatis``common-redis``common-api`
- `backend/apis``api-auth``api-upms``api-ai`
- `backend/gateway`统一入口、鉴权、路由、跨域、trace 透传
- `backend/auth`登录、token、当前用户
- `backend/upms`:用户、角色、权限、菜单、动态路由元数据、组织与区域基座
- `backend/ai-client`Java 调 Python 的适配层
- `backend/boot-dev`:本地聚合启动模块
- `backend/python-ai`:独立 Python AI 服务占位
- 服务通信固定为 `REST`,不使用 `Dubbo`
- 认证固定为 `JWT + RBAC`
- `gateway` 统一验签
- 下游服务走网关信任模式
- 数据访问固定为 `MyBatis-Plus + PostgreSQL + Redis`
- PostgreSQL 预留分库分表、分区、读写分离扩展位
- Redis 负责 token、权限缓存、动态路由缓存、热点数据
- `frontend` 固定为单一 React 项目:
- `frontend/src/api`
- `frontend/src/types`
- `frontend/src/utils`
- `frontend/src/components`
- `frontend/src/layouts`
- `frontend/src/router`
- 只保留基础壳与底层能力,不做业务页面堆砌
- `app` 固定为根目录独立微信小程序工程:
- `app/src/app.*`
- `app/src/pages/*`
- `app/src/api`
- `app/src/utils`
- `boot-dev` 本地模式固定策略:
- 保持和分布式服务同样的模块结构与接口边界
- 本地可单进程启动
- 可用一个 PostgreSQL 实例承载所有逻辑分片,但字段、路由键、表结构必须与未来分布式模式一致
## Region / Tenant Model
- 系统是“总校 -> 省级分校 -> 市区分校”的多层级租户结构
- 每个校区下再有部门,当前部门维度至少支持“年级、学科”等业务组织
- 区域是分库分表的核心路由维度:
- 以“省份区域”作为首要分片依据
- 业务表设计时必须显式保留区域路由字段
- `sys_area.sql` 视为区域基础数据来源约束:
- 首版必须预留 `sys_area` 基础表和初始化脚本接入位
- 区域编码、层级、父子关系以 `sys_area.sql` 为准
- 首版数据模型明确区分两棵树:
- 区域树:省 / 市 / 区县
- 组织树:总校 / 分校 / 校区 / 部门
- 首版 `upms` 基础对象固定包含:
- `SysArea`
- `SysTenant`
- `SysDept`
- `SysUser`
- `SysRole`
- `SysPermission`
- 所有租户级业务主表统一预留字段:
- `adcode`
- `tenant_id``school_id`
- `tenant_path`
- `dept_id`
- `dept_path`
- 路由与隔离规则固定:
- 区域字段负责数据库路由与物理分片
- `tenant_path` / `dept_path` 负责组织级数据隔离
- 不允许只靠 `dept_path` 承担全部多租户职责
## Database Init Layout
- PostgreSQL 初始化脚本固定放在 `init` 目录下,且按模块独立管理
- 目录结构固定为类似:
- `init/pg/00_create_db.sql`
- `init/pg/01_create_schema.sql`
- `init/pg/sys/sys_area.sql`
- `init/pg/auth/*.sql`
- `init/pg/upms/*.sql`
- `init/pg/ai/*.sql`
- 原则固定:
- 每个模块维护自己的建表 SQL、索引 SQL、初始化数据 SQL
- 不把所有表混在一个超大 SQL 文件中
- 公共基础表单独归 `sys``common` 目录
- `sys_area.sql` 固定归属:
- 放在 `init/pg/sys/`
- 作为区域基础数据的首批初始化脚本
- 模块 SQL 的职责边界固定:
- `auth`登录、token、认证相关表
- `upms`:用户、角色、权限、菜单、学校租户、部门、区域引用关系
- `ai`AI 调用记录、任务记录、模型配置占位
- 初始化脚本执行规则固定:
- 先执行库 / Schema 基础脚本
- 再执行 `sys`
- 再执行各业务模块
- 各模块内部按 `create table -> index -> init data` 顺序组织
- 本地开发模式固定:
- `boot-dev` 使用同一套 `init/pg` 脚本
- 即使单库启动,也不能做一套“临时简化 SQL”绕过正式字段设计
## Public APIs / Interfaces
- 外部访问前缀固定为:
- `/api/auth/**`
- `/api/upms/**`
- `/api/actuator/health``/actuator/**`
- 子服务内部前缀固定为:
- `auth``/auth/**`
- `upms``/upms/**`
- 路由映射固定为:
- `gateway: /api/auth/** -> auth: /auth/**`
- `gateway: /api/upms/** -> upms: /upms/**`
- `boot-dev` 本地聚合模式下同样暴露 `/api/auth/**``/api/upms/**`
- 统一响应结构固定为:
- `code`
- `message`
- `data`
- `traceId`
- `upms` 首版接口能力必须覆盖:
- 当前用户信息
- 用户 / 角色 / 权限基座
- 区域树查询
- 学校租户树查询
- 部门树查询
- 动态路由元数据查询
- React 动态路由元数据至少包含:
- `id`
- `path`
- `name`
- `component`
- `layout`
- `children`
- `meta`
- Python AI 服务首版只固定:
- `GET /health`
## VS Code Docker Dev
- 支持两种开发模式:
- `external`PG、Redis 等直连外部数据库
- `internal`:开发容器内部创建 PG、Redis
- 代码同步方式为 bind mount
- 宿主机目录直接挂载到容器工作目录
- 本地修改会实时反映到容器内
- 不依赖额外“同步脚本”复制代码
## Test Plan
- `backend` 根级 Maven 聚合可编译通过
- `backend/boot-dev` 可单进程启动,并对外暴露 `/api/auth/**``/api/upms/**`
- `backend/gateway` 可独立启动并完成到 `auth``upms` 的路由转发
- JWT 鉴权链路可烟测通过
- `frontend` 单项目可完成 `install``dev``build`
- React 端可基于 `upms` 返回的动态路由元数据完成路由挂载
- `app` 可用微信开发者工具直接打开骨架工程
- `backend/python-ai` 可独立启动并通过 `/health`
- PostgreSQL 与 Redis 本地联调配置可跑通
- SQL 初始化验证必须覆盖:
- `init/pg` 下脚本可按顺序执行
- `sys_area.sql` 可独立导入
- `auth``upms` 模块脚本可独立维护且组合执行无冲突
- 区域与租户模型最小验证必须覆盖:
- 区域树可查询
- 学校租户树可查询
- 部门树可挂接到学校租户下
- 带不同 `adcode` 的数据写入与查询能走统一路由键封装
## Assumptions
- 不使用 `Dubbo`
- 首版不做真实业务页面、不做学生端真实业务、不做真实 AI 推理
- `upms` 继续承担首版系统管理中心职责
- `sys_area.sql` 是必须接入的区域基础数据脚本,且归档在 `init/pg/sys/`
- 部门当前先按“年级、学科等组织维度”建模,不在首版细化更复杂教学组织规则