Files
smartClean/backend/ARCHITECTURE.md
2026-04-21 17:25:41 +09:30

399 lines
18 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.
# 智慧清洁后台架构文档
> 本文档记录小趣智慧清洁系统全部后端项目的架构现状,包括 Web 后台和 App 后台。
> 维护人Tony | 创建时间2026-04-21 | 关联需求REQ-20260421-0011
---
## 1. 系统全景
```
┌─────────────────────────────────────────┐
│ xiaoqu-intellectual-public (jar) │
│ 唯一持续维护的数据访问层 │
│ MyBatis-Plus · db1/db2 │
└────┬──────────────┬──────────────┬───────┘
│ │ │
┌──────────────┘ │ └──────────────┐
▼ ▼ ▼
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ Web 后台 (SaaS) │ │ App 后台 (冻结) │ │ 新项目 (规划中) │
│ Spring Boot 2.4 │ │ Spring 5.0 + XML │ │ Spring Boot 2.4 │
│ 6 个模块 │ │ 4 个模块(冻结) │ │ 仅依赖 │
│ 端口: 8095/8097 │ │ 端口: 8091/8086 │ │ intellectual-public │
└──────────────────────┘ └──────────────────────┘ └──────────────────────┘
```
### 数据库
| 数据库 | 用途 | 使用方 |
|--------|------|--------|
| `xiaoqu_complex` (`xiaoqu_comples_d`) | 核心业务数据(用户/区域/设备/考勤等) | Web 后台 + App 后台 + 新项目 |
| `xiaoqu_intellectual` (`xiaoqu_intellectual_d`) | 保洁任务/巡检/计划/场景等 | Web 后台 + App 后台 + 新项目 |
| `xiaoqu_mall` (`xiaoqu_mall_d`) | 商城/订单 | App 后台 xiaoqu-mall |
| `xiaoqu_franchisee` (`xiaoqu_franchisee_d`) | 加盟商 | App 后台 xiaoqu-mall |
---
## 2. Web 后台架构
### 2.1 模块概览
| 模块 | 打包 | 说明 | 端口 |
|------|------|------|------|
| `xiaoqu-intellectual-public` | jar | 公共数据访问层Entity + Mapper + Service | — |
| `xiaoqu-intellectual-base` | jar | 基础信息管理(网格/对象/场景/事项/技能/标签/工具/设备) | — |
| `xiaoqu-intellectual-task-mgmt` | jar | 任务调度管理(计划/任务/巡检/参数配置/用户上报/工资) | — |
| `xiaoqu-intellectual-attendance` | jar | 考勤打卡(打卡记录/考勤/人效/班组) | — |
| `xiaoqu-intellectual-web` | war (ROOT.war) | Web API 主服务,聚合上述所有模块 | 8095 |
| `xiaoqu-intellectual-task` | jar | 定时任务服务XXL-Job + MQTT + 个推) | 8097 |
### 2.2 依赖关系
```
backend/pom.xml (Web 后台父 POM, Spring Boot 2.4.8)
├── xiaoqu-intellectual-public (jar) ← 公共数据层,被所有模块依赖
├── xiaoqu-intellectual-base (jar) → public
├── xiaoqu-intellectual-task-mgmt (jar) → public
├── xiaoqu-intellectual-attendance (jar) → public
├── xiaoqu-intellectual-web (war) → public + base + task-mgmt + attendance
└── xiaoqu-intellectual-task (jar) → public
```
### 2.3 技术栈
| 层级 | 技术 |
|------|------|
| 框架 | Spring Boot 2.4.8 + Java 8 |
| ORM | MyBatis-Plus 3.4 + Druid 连接池 |
| 缓存 | Redis (Lettuce) |
| 搜索 | Elasticsearch (BBoss 6.3,已配置未启用) |
| 定时任务 | XXL-Job 2.3 |
| 消息 | MQTT (Eclipse Pahotask 模块) |
| 推送 | 个推 SDKtask 模块) |
| 日志 | Log4j排除 Spring Boot 默认 Logback |
| 文档 | Swagger 2.9.2 + swagger-bootstrap-ui |
| 工具 | Lombok + Hutool 5.8 + FastJSON + EasyPOI |
### 2.4 数据访问层
Web 后台统一使用 MyBatis-Plus通过 intellectual-public 的双数据源:
| 数据源 | 连接数据库 | Mapper 包 |
|--------|-----------|-----------|
| db1 | `xiaoqu_complex` | `xiaoqu.home.open.mapper.db1` |
| db2 | `xiaoqu_intellectual` | `xiaoqu.home.open.mapper.db2` |
### 2.5 Web 服务 (intellectual-web)
- **启动类**`xiaoqu.home.open.XiaoquIntellectualWebApplication` (extends SpringBootServletInitializer)
- **打包**WAR (warName=ROOT),排除内嵌 Tomcat部署到外部 Tomcat
- **核心功能**REST API、权限管理、数据导出、Swagger 文档
- **配置**`application-{profile}.yml`,支持 test/docker/prod 多环境
### 2.6 Task 服务 (intellectual-task)
- **启动类**`xiaoqu.home.open.XiaoquIntellectualTaskApplication` (@EnableScheduling)
- **打包**:可执行 JAR (Spring Boot repackage)
- **核心功能**
- XXL-Job 执行器(分布式定时任务)
- MQTT 监听设备通信tcp://host:1883
- 个推推送(移动端消息)
### 2.7 构建命令
```bash
cd backend
# 构建全部 Web 后台模块
mvn clean package -DskipTests
# 仅构建 web 服务
mvn clean package -pl xiaoqu-intellectual-web -am -DskipTests
# 仅构建 task 服务
mvn clean package -pl xiaoqu-intellectual-task -am -DskipTests
# 本地运行
mvn spring-boot:run -pl xiaoqu-intellectual-web
mvn spring-boot:run -pl xiaoqu-intellectual-task
```
---
## 3. App 后台架构
### 3.1 模块概览
| 模块 | Java 文件数 | groupId | 框架 | 打包 | 状态 |
|------|-----------|---------|------|------|------|
| `xiaoqu-public` | 147 | me.iiv.xiaoqu | 纯 Java | jar | 冻结 |
| `elasticsearchpublic` | 21 | me.iiv.xiaoqu | Spring 5.0 | jar | 冻结 |
| `xiaoqu-complex` | 1,176 | me.iiv.xiaoqu | Spring 5.0 + 原生 MVC | war | 冻结 |
| `xiaoqu-mall` | 1,007 | me.iiv.xiaoqu | Spring 5.0 + 原生 MVC | war | 冻结 |
### 3.2 依赖关系
```
xiaoqu-app-parent (pom, 统一版本管理) [冻结]
├── xiaoqu-public (jar) [冻结]
├── ElasticsearchPublic (jar) [冻结] ── 依赖 xiaoqu-public
├── xiaoqu-complex (war) [冻结] ── 依赖 xiaoqu-public + ElasticsearchPublic + intellectual-public
└── xiaoqu-mall (war) [冻结] ── 依赖 xiaoqu-public
```
### 3.3 xiaoqu-complex 三套并行数据访问层
xiaoqu-complex 内部存在三套独立的数据访问机制,连接两个数据库:
```
xiaoqu-complex (App 主服务)
┌──────────────────────────────────────────────────────────────────────┐
│ Controller Layer │
│ (me.iiv.iivframework.controller.*) │
└──────┬───────────────────────┬───────────────────────┬───────────────┘
│ │ │
▼ ▼ ▼
┌──────────────────┐ ┌────────────────────────┐ ┌──────────────────┐
│ ① 自有 DAO 层 │ │ ② intellectual-public │ │ ③ org.home.open │
│ (MyBatis) │ │ (MyBatis-Plus) │ │ (JdbcTemplate) │
│ │ │ │ │ │
│ me.iiv.*.dao │ │ mapper.db1 → 同库 │ │ org.home.open.* │
│ me.iiv.*.entity │ │ mapper.db2 → 跨库 │ │ ~48 个文件 │
│ 41 DAO + 151 XML │ │ 51+61 Service │ │ │
│ │ │ │ │ │
│ sqlSessionFactory│ │ sqlSessionFactory2(db1) │ │ jdbcTemplate │
│ → dataSource │ │ → dataSource (同库) │ │ → dataSource │
│ │ │ sqlSessionFactory1(db2) │ │ │
│ │ │ → dataSource1 (跨库) │ │ │
└────────┬─────────┘ └─────────┬──────┬───────┘ └────────┬─────────┘
│ │ │ │
▼ ▼ ▼ ▼
xiaoqu_complex xiaoqu_ xiaoqu_ xiaoqu_complex
库 complex intellectual 库
库 库
```
**数据库连接配置beans.xml + app-db.xml**
| 数据源 | 连接数据库 | 使用方 |
|--------|-----------|--------|
| `dataSource``${servers.jdbc.jdbcUrl}` | `xiaoqu_complex` | ① 自有 DAO + ② db1 + ③ JdbcTemplate |
| `dataSource1``${servers.jdbc.jdbcUrl1}` | `xiaoqu_intellectual` | ② db2保洁任务 |
**SqlSessionFactory 映射:**
| SqlSessionFactory | 数据源 | ORM | 扫描包 |
|-------------------|--------|-----|--------|
| `sqlSessionFactory` | dataSource | MyBatis + PageHelper | `mappers/*.xml` |
| `sqlSessionFactory1` | dataSource1 | MyBatis-Plus | `xiaoqu.home.open.mapper.db2` |
| `sqlSessionFactory2` | dataSource | MyBatis-Plus | `xiaoqu.home.open.mapper.db1` |
**文件统计:**
| 层 | 包名 | 文件数 | ORM | 数据库 | 状态 |
|----|------|--------|-----|--------|------|
| ① 自有 DAO | `me.iiv.iivframework.dao` + `mappers/*.xml` | 41 DAO + 151 XML | MyBatis + PageHelper | xiaoqu_complex | 冻结 |
| ② intellectual db1 | `xiaoqu.home.open.*.db1` | 51×3 (mapper/service/model) | MyBatis-Plus | xiaoqu_complex同库 | 由 intellectual-public 维护 |
| ② intellectual db2 | `xiaoqu.home.open.*.db2` | 61×3 (mapper/service/model) | MyBatis-Plus | xiaoqu_intellectual | 由 intellectual-public 维护 |
| ③ JdbcTemplate | `org.home.open.dao` | ~48 | JdbcTemplate | xiaoqu_complex | 冻结 |
### 3.4 Spring 组件扫描隔离机制
xiaoqu-complex 使用 Spring XML 配置,组件扫描是**显式声明**的,精确控制只扫描以下 4 个包:
**beans.xml:**
```xml
<context:component-scan base-package="me.iiv.*"/> <!-- ① 自有层 -->
<context:component-scan base-package="xiaoqu.home.open.service.db1.*"/> <!-- ② db1 Service -->
<context:component-scan base-package="xiaoqu.home.open.service.db2.*"/> <!-- ② db2 Service -->
<context:component-scan base-package="org.home.open.*"/> <!-- ③ JdbcTemplate 层 -->
```
**springmvc.xml:**
```xml
<context:component-scan base-package="me.iiv.iivframework.controller"/>
<context:component-scan base-package="me.iiv.iivframework.aop.*"/>
<mvc:interceptors>
<bean class="me.iiv.iivframework.core.SystemInterceptor"/>
<bean class="me.iiv.iivframework.core.PermissionInterceptor"/>
</mvc:interceptors>
```
### 3.5 同名 @Component 类的运行时隔离
xiaoqu-complex 与 intellectual-public 存在 10 个同名基础设施类。**当前不存在运行时冲突**
| 文件 | intellectual-public 包 | complex 包 | 有 @Component? | 被 complex 扫描? |
|------|----------------------|-----------|---------------|-----------------|
| SystemInterceptor | xiaoqu.home.open.config | me.iiv.iivframework.core | 是 | **否** |
| RepeatSubmitAspect | xiaoqu.home.open.aop | me.iiv.iivframework.aop | 是 | **否** |
| RedisDistributedLock | xiaoqu.home.open.redis | me.iiv.iivframework.redis | 是 | **否** |
| RedisService5 | xiaoqu.home.open.service | me.iiv.iivframework.redis | 是 | **否** |
| AvoidRepeatSubmit | xiaoqu.home.open.aop | me.iiv.iivframework.aop | 注解类 | 否 |
| Constants | xiaoqu.home.open.constant | me.iiv.iivframework.Constants | 无 | 否 |
| XxlJobInfo | xiaoqu.home.open.config | me.iiv.iivframework.entity | 无 | 否 |
| IpUtils | xiaoqu.home.open.utils | me.iiv.iivframework.utils | 无 | 否 |
| FileUtil | xiaoqu.home.open.utils | me.iiv.iivframework.utils | 无 | 否 |
| UserUtils | xiaoqu.home.open.utils | me.iiv.iivframework.utils | 无 | 否 |
> **重要警告**:旧项目已冻结,不做框架升级。如果升级到 Spring Boot 使用 `@SpringBootApplication` 默认扫描,上述 4 个 @Component 类会导致 Bean 名冲突。
### 3.6 同名文件108 个)
xiaoqu-complex 与 intellectual-public 有 108 个同名 Java 文件。根本原因:**同一张数据库表有两套 ORM 映射**。
示例:
- `me.iiv.iivframework.entity.User`complex 自有MyBatis
- `xiaoqu.home.open.model.db1.User`intellectual-publicMyBatis-Plus
**处置方式:冻结原样,不做收敛。**
### 3.7 包名空间
xiaoqu-complex 内部存在三套包名(冻结后不做统一):
| 包名 | 来源 | 用途 |
|------|------|------|
| `me.iiv.iivframework.*` | complex 自有 | Controller、DAO、Entity、AOP、拦截器 |
| `xiaoqu.home.open.*` | intellectual-public | MyBatis-Plus Service/Mapper/Model (db1/db2) |
| `org.home.open.*` | complex 内 JdbcTemplate 层 | JDBC 直写 DAO |
### 3.8 构建命令
```bash
# 先安装 intellectual-publicApp 模块依赖它)
cd backend && mvn clean install -pl xiaoqu-intellectual-public -DskipTests
# 构建全部 App 模块
cd backend/xiaoqu-app-parent && mvn clean package -DskipTests
# Docker 环境构建(数据库指向 host.docker.internal
cd backend/xiaoqu-app-parent && mvn clean package -P docker -DskipTests
```
---
## 4. intellectual-public 共享层
### 4.1 定位
`xiaoqu-intellectual-public` 是整个系统的**唯一持续维护的数据访问层**,同时被 Web 后台、旧 App 和新项目依赖。
### 4.2 包结构
| 包 | 文件数 | 使用方 |
|----|--------|--------|
| model/db1 | 51 | App + Web + 新项目 |
| model/db2 | 61 | App + Web + 新项目 |
| mapper/db1 | 51 | App + Web + 新项目 |
| mapper/db2 | 61 | App + Web + 新项目 |
| service/db1 + impl | 102 | App + Web + 新项目 |
| service/db2 + impl | 122 | App + Web + 新项目 |
| service父包 | 3 | 仅 WebRedisService4/5, PublicService |
| publicBean | 25 | App + Web |
| utils | 17 | App + Web |
| controller/* | ~30 | 仅 Web |
| aop | 3 | 仅 Web |
| config | 4 | 仅 Web |
| redis | 1 | 仅 Web |
| task | 2 | 仅 Web |
### 4.3 变更原则
- 新增 Entity/Mapper/Service → 安全,不影响已有代码
- 修改已有 Entity 字段 → 需评估 Web 后台影响
- 修改已有 Service 方法签名 → 高风险,需评估所有依赖方
- 删除任何内容 → 禁止(除非确认所有依赖方已移除引用)
### 4.4 数据库变更维护规则
| 变更类型 | 操作位置 | 说明 |
|---------|---------|------|
| 新增表 | intellectual-public新增 Entity + Mapper + Service | 新表只在此建 ORM 映射 |
| 修改已有表(加字段) | intellectual-public修改 Entity | 旧项目 complex 的同名 Entity 不改 |
| 删除表/字段 | intellectual-public | 旧项目对应代码冻结不删 |
---
## 5. 旧项目冻结规范
Phase 1Maven 治理完成后App 后台 4 个模块进入冻结状态。
### 允许的变更
- Bug 修复
- 安全补丁(如依赖版本升级修复 CVE
### 禁止的变更
- 新增功能、新增接口
- 重构代码、统一包名
- 框架升级Spring Boot 等)
- 新增 DAO/Mapper/Entity
- 收敛同名文件
### 冻结代码变更流程
1. 确认是 bug 修复(非新功能)
2. 评估是否可在新项目中通过新接口绕过
3. 如必须改旧代码:最小化改动,不做"顺手重构"
4. 代码评审时标注"冻结项目 bug 修复"
---
## 6. 新项目开发规范
### 技术栈
| 层级 | 技术 |
|------|------|
| 框架 | Spring Boot 2.4.8 + Java 8 |
| ORM | MyBatis-Plus 3.4(通过 intellectual-public |
| 数据访问 | **仅使用 intellectual-public 的 DAO 层** |
| 数据库 | xiaoqu_complex + xiaoqu_intellectual通过 db1/db2 |
### 依赖关系
```
新项目 (Spring Boot 2.4 + Java 8)
└── xiaoqu-intellectual-public (jar)
├── mapper/service/model.db1 → xiaoqu_complex 库
└── mapper/service/model.db2 → xiaoqu_intellectual 库
```
**不依赖**xiaoqu-complex、xiaoqu-mall、xiaoqu-public、elasticsearchpublic。
---
## 7. 环境配置
### 数据库连接
| 数据源 | 测试环境 | 生产环境 |
|--------|---------|---------|
| xiaoqu_complex | `192.168.1.181:3306/xiaoqu_comples_d` | Aliyun RDS |
| xiaoqu_intellectual | `192.168.1.181:3306/xiaoqu_intellectual_d` | Aliyun RDS |
| xiaoqu_mall | `192.168.1.181:3306/xiaoqu_mall_d` | Aliyun RDS |
### 服务端口
| 服务 | 测试环境端口 | Docker 端口 |
|------|------------|------------|
| Web 后台 (intellectual-web) | 8095 | 18095 |
| Task 服务 (intellectual-task) | 8097 | 18097 |
| App 主服务 (xiaoqu-complex) | 8091 | 18091 |
| App 商城 (xiaoqu-mall) | 8086 | 18086 |
| 前端 (Vue SPA) | 8079 (dev) | 8280 |
### Maven 构建体系
| 父 POM | 管理范围 | 路径 |
|--------|---------|------|
| `backend/pom.xml` | Web 后台 6 模块 (Spring Boot 2.4.8) | xiaoqu-intellectual-* |
| `backend/xiaoqu-app-parent/pom.xml` | App 后台 4 模块 (Spring 5.0) | xiaoqu-public/complex/mall + ElasticsearchPublic |
两套父 POM 互不干扰,`xiaoqu-intellectual-public` 是唯一交叉点。
> 必须使用 Java 8 编译和运行。