Files
saas-mbr/docs/architecture.md
T

82 lines
4.8 KiB
Markdown
Raw Normal View History

# 架构总览(abacus 动静分离微服务)
> 权威来源:`docs/architecture.md` · 编码约束见 `docs/coding-standards.md` · AI 工作流见 `docs/agent-guide.md`
## 1. 总体形态:前后端分离 + 动静同包发布
两个仓库协作,**共享一份 docs/ 文档中心**(本目录):
```
D:\workBuddySpace\member\
├── docs/ ← 团队文档单一权威(本目录)
├── abacus-static-framework/ ← Vue 3 前端底座(src/framework 只读 / src/subsystem 业务可写)
└── abacus.springboot.example/ ← Spring Boot Maven 微服务模板(业务写在 src/main/java 与 resources/sql
```
交付链路(动静分离):
```
前端源码 ──npm run build:prod──► 产物输出到后端 resources/html/vue/<应用名>/
后端 mvn packageassembly.xml
*-bin.zip = jar + doc + sql + html ← 一个发布单元,一起发版
```
- 前端产物**不打进 jar**,随 zip 的 `html/` 目录部署(Nginx/容器托管静态资源,Java 进程提供 API)。
- 开发期前端 `vite.config.ts server.proxy` 反代后端,替代 Nginx 联调。
## 2. 前端底座(abacus-static-framework
| 项 | 选型 |
|---|---|
| 框架 | Vue 3.5 + TypeScript 5 + Vite 6 |
| UI | Element Plus(通用)+ vxe-table(仅表格) |
| 状态 | Pinia |
| 代码生成 | unplugin-auto-import / unplugin-vue-components(自动引入,无需手写常见 import) |
关键机制:
- **只读/可写分区**`src/framework/**` 只读共享;业务只写 `src/subsystem/**`api / router / views / extend 及自建 components / hooks / store / styles / types / utils)。
- **请求管线**`framework/utils/request.ts`):统一响应体解包、服务别名映射、token 自动刷新、commonParam 审计头——业务无感,详见 `coding-standards.md §6`
- **动态菜单权限**`permissionStore.filterAsyncRoutes``url === path` 匹配后端菜单与 `subsystem/router/dynamicRouter.ts`,过滤后 `addRoute`
- **运行时配置**`window.frameBaseConfig`(含 `backendServices` 服务别名映射)由宿主注入,`public/data/data.js` 声明当前子系统(`currentSubsystem` / `currentSubsystemName`)。
## 3. 后端模板(abacus.springboot.example
| 项 | 选型 |
|---|---|
| 构建 | Maven,父工程 `abacus.framework:abacus.springcloud.pom:1.5.0`artifactId `abacus.springboot.<应用名>` |
| 框架 | Spring Boot + abacus 系列(config 2.1.0 / commons 1.6.5 / fundation 3.4.4 / business.service / asyncTool 1.0.0 |
| 注册/配置中心 | Nacosbootstrap.ymlextension-configs 引入 abacus-database / discovery / acas / redis / actuator / xxljob 公共配置) |
| 数据库 | MySQL / SQL Server(jtds+mssql) / Oracle / 达梦,Druid + JPA;多数据源由 Nacos `abacus-database.yml` 提供 |
| 定时任务 | XXL-JOB 2.3.0application-xxljob.yml |
| 消息队列 | Kafka(配置经 Nacos 公共配置) |
| 接口文档 | springdoc`springdoc.packages-to-scan` |
| 监控 | Actuator + Prometheusbase-path `/services/actuator` |
分层(包前缀 `abacus.springboot.<应用名>.`):`api(+api/view) / controller / dao / esb / pi / impl / repository / wsi / config / util / vo`,职责与扫描配置见 `coding-standards.md §5.1`
统一响应体 `{status, message, data, errorCode}``abacus.commons``ResultResponseBodyWrapper` 包装(`Application.java` 注册 `@Bean``abacus.responseExcludePath` 排除白名单 URI)。
## 4. 关键一致性:APP_NAME 四处
应用名(APP_NAME)必须同时一致于:① `bootstrap.yml spring.application.name`Nacos 注册)② `application.yml` 扫描包前缀(`abacus.controllerPackages` / `abacus.entitypackages` / `springdoc.packages-to-scan`)③ 前端 `api/<别名>/*.ts` 的 URL 首段 ④ `vite.config.ts build.outDir` 目录名。漏配任一处将**静默失败**,排查见 `coding-standards.md §3`
## 5. 接口契约速览
| 契约项 | 约定 |
|---|---|
| 响应体 | `{status, message, data, errorCode}``status===200` 前端自动解包 data |
| 异常码 | 业务首位 `9`、系统首位 `5` |
| URL | 首段=服务别名 → `backendServices` 映射真实服务名 |
| 分页 | 响应 `{data, total}`vxe-grid 的 result/total |
| Excel | ArrayBuffer 响应不解包 |
| 鉴权 | Bearer token<10min 自动刷新 + 并发队列 |
## 6. 治理体系
- 前端仓库:`.project.agents/`CLAUDE.md / AGENTS.md / SELF_CONSTRAINTS.md / VIBECODING_GUIDE.md / docs/context/{PRD,ARCHITECTURE,ROADMAP,CONVENTIONS,UIUX}.md
- 后端仓库:`.project.agents/`(同构,无 UIUX.md
- 单源化:共享约束只存在于 `docs/`,仓库内 CONVENTIONS 用指针引用,禁止复制正文。