Files
saas-mbr/docs/architecture.md
T

82 lines
4.8 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.
# 架构总览(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 用指针引用,禁止复制正文。