Files
xiaoqu_mcp_service/xiaoqu-franchisee/AGENTS.md
xiaoqu b6d4bf6126 导入三个参考项目: xiaoqu-franchisee / xiaoqu-publicbeanandmap / elasticsearchpublic
作为 xiaoqu-agent-service(MCP 服务) 的开发参考。新系统与旧系统零代码耦合,
仅照搬其行级数据权限规则与数据源结构。设计方案见 xiaoqu-franchisee/doc/agent-mcp-service-design.md
2026-09-01 23:00:47 +08:00

376 lines
15 KiB
Markdown
Raw Permalink 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.
# AGENTS.md — xiaoqu-franchisee
> 本文件面向 AI 编程助手。阅读本文档前,默认你对本项目一无所知。文中信息全部来自仓库实际内容,不做任何假设或泛化。
---
## 1. 项目概览
`xiaoqu-franchisee`(artifactId: `xiaoqu-franchisee`,groupId: `me.iiv.xiaoqu`)是北京小趣智品后台体系中的一环,聚焦代理商/加盟商业务。它是一套基于 **Java 8 + Spring MVC + MyBatis-Plus** 的后端服务,打包为 `ROOT.war`,部署到外部 Tomcat 运行。
项目与另外两个仓库协同工作:
- `xiaoqu-publicbeanandmap`:提供公共 Bean、Mapper、Service 接口( beans/b0、b1、b2 / mapper/m0、m1、m2 / service/s0、s1、s2 )。
- `vue-manage-system`:后台管理前端(Vue 2 + Vite/Webpack)。
本仓库只包含 Controller 层、少量本地 Service/Util/AOP/Job/Redis 实现,以及 Spring 配置。
### 1.1 核心定位
- 面向 PC 后台管理端提供 REST 风格接口。
- 负责代理商、客户、仓库、工单、资产、财务、营销等业务域。
- 通过数据库表 `webpage` / `page_field` / `button` / `webpage_authority` 等实现菜单、字段、按钮级权限,前端表格/搜索区由后端元数据驱动。
---
## 2. 技术栈
| 层级 | 技术 |
|------|------|
| 语言 | Java 8 |
| 构建工具 | Apache Maven 3.x |
| Web 容器 | 外部 Tomcat 7+(`tomcat7-maven-plugin:2.2`) |
| IOC / MVC | Spring Framework 5.0.0.RELEASE |
| ORM | MyBatis-Plus 3.4.0 |
| 数据库连接池 | Alibaba Druid 1.2.6 |
| 数据库 | MySQL 5.7+(驱动 `mysql-connector-java:5.1.49`) |
| 缓存 | Redis(Jedis + Spring Data Redis 2.1.0),多 db(3/4/5/6/7/13) |
| 分布式锁 | Redisson 3.12.5 |
| 定时任务 | XXL-Job 2.2.0(执行器配置在 `xxl-job-executor.properties`) |
| 文档/测试 | Swagger 2 / swagger-bootstrap-ui 1.9.6(生产环境关闭) |
| 日志 | Log4j 1.2.17 + SLF4J 1.7.7 |
| JSON | Jackson 2.10、Fastjson(历史代码混用) |
| 工具库 | Lombok 1.18.18、Hutool、Apache Commons、HttpClient 4.5.2、EasyPOI 4.3.0 等 |
| 本地 JAR | `lib/cnap-sdk-1.0.0.jar`(菜鸟物流 SDK,pom 中已注释依赖) |
### 2.1 关键外部依赖
- `me.iiv.xiaoqu:xiaoqu-public:1.0-SNAPSHOT`
- `me.iiv.iivframework:xiaoqu-PublicBeanAndMap:1.0-SNAPSHOT`
- `me.iiv.xiaoqu:ElasticsearchPublic:0.0.1-SNAPSHOT`
修改 `xiaoqu-publicbeanandmap` 后必须先执行 `mvn clean install`,否则 `xiaoqu-franchisee` 会沿用旧 jar。
---
## 3. 项目结构
```
xiaoqu-franchisee/
├── pom.xml # Maven 主配置、多环境 profile
├── src/main/java/me/iiv/iivframework/
│ ├── Constants/ # 常量、错误码、硬件故障枚举
│ ├── aop/ # AOP 切面(防重复提交、日志切面等)
│ ├── controller/ # Spring MVC Controller,按业务域分包
│ │ ├── account/ # 账户/财务相关
│ │ ├── customer/ # 客户/代理商
│ │ ├── warehouse/ # 仓库出入库
│ │ ├── installOrder/、deliveryOrder/、workOrder/ ...
│ │ ├── input/、output/ # 部分公共入参/出参 DTO
│ │ ├── export/ # Excel 导出 DTO(@Excel 注解)
│ │ └── excelModel/ # Excel 模板模型
│ ├── core/ # 拦截器、CORS、Swagger 配置、启动监听
│ ├── downTask/、downTask/impl/ # 下载任务抽象与实现
│ ├── exception/ # 全局异常处理
│ ├── jobhandler/ # XXL-Job 任务处理器
│ ├── redis/、redis/impl/ # Redis 业务封装
│ ├── service/ # 本仓库本地 Service(公共 Service 在 xiaoqu-publicbeanandmap)
│ ├── service/es/ # ES 相关封装
│ ├── task/、task/entity/ # 本地定时任务
│ └── utils/、utils/excel/、utils/poi/、utils/text/ # 工具类
├── src/main/resources/
│ ├── app-db.xml # 3 个 Druid 数据源 + 3 个 SqlSessionFactory + 事务配置
│ ├── beans.xml # Spring 根容器:扫描、MapperScanner、导入 redis/job 配置
│ ├── springmvc.xml # Spring MVC 子容器:Controller 扫描、拦截器、视图解析器
│ ├── myBatis-base.xml # MyBatis-Plus 配置(分页插件、日志实现)
│ ├── redis-context.xml # Redis/Redisson 多库连接工厂与 Template
│ ├── applicationcontext-xxl-job.xml # XXL-Job 执行器扫描与注册
│ ├── config.properties # 占位符化配置,打包时由 Maven profile 注入
│ ├── xxl-job-executor.properties # XXL-Job 执行器配置
│ └── log4j.properties # 日志配置
├── src/main/webapp/
│ ├── WEB-INF/web.xml # Servlet 3.1、Spring ContextLoaderListener、DispatcherServlet
│ ├── WEB-INF/views/ # JSP 视图
│ ├── QrCode/、tempFile/、template/ # 静态/临时/模板文件
├── src/test/resources/webdefault.xml # Jetty 本地运行默认描述符
├── doc/ # 开发文档与设计方案
│ ├── development-conventions.md # 当前仓库核心开发规范
│ ├── agent-message-notice-dev.md
│ ├── customer-product-list-dev.md
│ └── out-certificate-dev.md
├── lib/ # 本地 jar
└── logs/ # 运行日志(.gitignore 忽略)
```
### 3.1 与公共模块的边界
- **本仓库**:`me.iiv.iivframework.controller.*`、少量本地 service/utils/jobhandler。
- **xiaoqu-publicbeanandmap**:`me.iiv.iivframework.beans.b*`、`mapper.m*`、`service.s*`。
- 新增业务表时,Entity / Mapper / Service 接口应优先放在 `xiaoqu-publicbeanandmap`,本仓库只写 Controller + input/output/export DTO。
### 3.2 Controller 分包约定
```
controller/<业务域>/
├── XxxController.java # @Controller + @RequestMapping + @Api
├── input/XxxInput.java # 入参(@RequestBody)
├── output/XxxOutput.java # 列表/详情出参
└── entity/(部分历史代码) # 业务相关 POJO
```
导出类统一放 `controller/export/XxxExport.java`,使用 `@Excel` 注解。
---
## 4. 构建与运行
### 4.1 环境要求
- JDK 1.8
- Maven 3.x
- MySQL 5.7+
- Redis
- Tomcat 7+(部署目标)
### 4.2 Maven 构建
```bash
# 1. 先安装公共模块(若 xiaoqu-publicbeanandmap 有改动)
cd ../xiaoqu-publicbeanandmap && mvn clean install -DskipTests
# 2. 打包本仓库
cd ../xiaoqu-franchisee && mvn clean package -DskipTests
```
产物:`target/ROOT.war`,部署到 Tomcat 的 `webapps/ROOT.war`。`pom.xml` 中 `finalName` 固定为 `ROOT`。
### 4.3 本地开发运行
可以用 Jetty 插件(已在 pom 配置):
```bash
mvn jetty:run
```
默认端口由 profile 中的 `webserver.port` 决定(dev 为 `8091`)。Jetty 默认描述符使用 `src/test/resources/webdefault.xml`。
### 4.4 自动化部署
pom 中配置了 `tomcat7-maven-plugin`:
```bash
mvn tomcat7:redeploy -P dev
```
- 配置项 `tomcatUrl`、`username`、密码在 `pom.xml` 的 plugin 配置中写死。
- 实际部署时通常通过 Jenkins(Linux 构建机)执行,**严格区分大小写**。
### 4.5 多环境 profile
pom.xml 中定义了 4 个 profile:
| profile | 默认 | 说明 |
|---------|------|------|
| `dev` | ✅ | 本地/开发环境,端口 `8091` |
| `test182` | ❌ | 测试环境,端口 `8090` |
| `prd` | ❌ | 生产环境,端口 `6080` |
| `pre` | ❌ | 预生产环境,端口 `6080` |
profile 中通过 Maven 属性注入到 `config.properties`/`xxl-job-executor.properties`/`log4j.properties`。切换环境时只需加 `-P <profileId>`。
### 4.6 数据库环境
| 数据源 | schema(dev) | schema(test) | schema(prd) | 用途 |
|--------|---------------|---------------|---------------|------|
| dataSource0 / m0 | `xiaoqu_comples_d` | `test` | `xiaoqu_comples_p` | 权限/菜单/用户 |
| dataSource1 / m1 | `xiaoqu_mall_d` | `xiaoqu_mall_d` | `xiaoqu_mall` | 商城 |
| dataSource2 / m2 | `xiaoqu_franchisee_d` | `xiaoqu_franchisee_d` | `xiaoqu_franchisee` | 业务数据 |
- dev/test 数据库均在 `192.168.1.181:3306`。
- prd/pre 使用阿里云 RDS。
---
## 5. 开发规范
项目主要遵循 `doc/development-conventions.md` 中总结的规范,下面提取与本仓库后端开发强相关的部分。
### 5.1 新增页面/菜单的数据库变更规范
新增后台页面必须修改权限库(dev: `xiaoqu_comples_d`,test: `test`,prd: `xiaoqu_comples_p`)中的 4 张表:
1. `webpage`:菜单本体。
2. `webpage_authority`:菜单与权限组关系。
3. `page_field`:页面字段定义(搜索区、列表列、详情字段)。
4. `field_webpage_authority`:字段级权限。
5. 如有按钮,补充 `button` + `button_webpage_authority`。
#### 权限 SQL 铁律
- **不要硬编码 `authority_id`**(除 PM 明确说“只给系统管理员”)。应动态复用同 `parent_id` 下兄弟菜单的授权并集。
- **不要硬编码自增主键**。使用 `LAST_INSERT_ID()` 获取 `webpage.id`、`button.id` 等,再用于后续关联。
- SQL 必须有 `START TRANSACTION; ... COMMIT;` + 校验段。
- 上线前必须在 prod 做 sanity check:确认 `parent_id`、确认无重复 path/button_en_name。
### 5.2 `page_field.class_name` 一致性
`page_field.class_name` 必须与后端 DTO 的全限定类名**严格一致**(包括包名)。后台“权限组管理 → 配置页面内容权限”会通过反射加载这个类,路径不一致会直接报错。
示例(来自 `customer-product-list-dev.md`):
```
me.iiv.iivframework.controller.customerProduct.output.CustomerProductListOutput
```
### 5.3 Controller 编码风格
- 使用字段级 `@Autowired`,默认包可见(不加 `private`),与历史代码保持一致。
- 不要混用 `@Resource`,除非需要按 name 注入(如 RedisTemplate)。
- 获取当前用户:
```java
User user = UserUtils.getUser(request);
Long userId = user == null ? 0L : user.getId();
```
- 软删字段统一为 `soft_delete`(0=正常,1=删除),查询默认 `WHERE soft_delete = 0`。
- 更新必须设置 `modify_time` 和 `modify_id`。
### 5.4 查询构造
- 优先使用 MyBatis-Plus 的 `LambdaQueryWrapper` / `QueryWrapper`。
- 通用查询可用 `WrapperUtils.getWrapper(false)`(自带 `soft_delete = 0`)和 `WrapperUtils.beanToWrapper(wrapper, input)` 自动把 input 转成查询条件。
- 排序字段注意 SQL 注入风险,只接受白名单字段。
### 5.5 文件上传
- 通用上传接口:`POST /uploadFile/warehouseCertificate`。
- 不要在通用接口里硬编码 `aggregate_id / file_type / in_out_allocation_type`;业务提交时再 UPDATE 这三个字段。
- 用户取消未提交的图片会留在 DB 中 `aggregate_id = 0`,由定时任务清理。
### 5.6 导出
导出 DTO 放 `controller/export/`,使用 `@Excel` 注解。参考现有 `WarehouseOutExport`、`CustomerProductListExport` 等。
---
## 6. 测试
### 6.1 单元测试
- 测试框架:JUnit 4.12(scope=test)。
- 当前仓库没有大量单元测试覆盖,主要依赖接口冒烟测试和人工回归。
- 运行方式:
```bash
mvn test
```
### 6.2 接口测试
- 本地启动后访问 Swagger UI:`http://localhost:<port>/doc.html`(生产环境关闭)。
- 调用需要登录的接口时,header 中必须携带 `uuid`、`timeStamp`、`signature`。
- Swagger 全局参数已配置 `uuid` header。
### 6.3 冒烟 checklist(新增页面)
1. 管理员登录后左侧菜单正常显示。
2. 列表接口返回数据正常。
3. 后台“权限组管理 → 配置页面内容权限”能看到页面字段。
4. 各搜索条件逐一验证。
5. 导出功能正常。
6. 跨环境(dev → test → prd)重新执行 SQL 并校验。
---
## 7. 部署流程
### 7.1 后端上线步骤
```bash
# 1. 公共模块如有改动先 install
cd xiaoqu-publicbeanandmap && mvn clean install -DskipTests
# 2. 打包 WAR
cd xiaoqu-franchisee && mvn clean package -DskipTests -P <profile>
# 3. 部署到 Tomcat( war 名 ROOT.war )
```
### 7.2 前端配合
前端仓库 `vue-manage-system` 构建命令:
```bash
yarn dev # 本地开发,端口 8079
yarn build-test # test 包
yarn build-pre # 预生产
yarn build # 生产
```
### 7.3 CI 注意事项
Jenkins 构建机是 Linux,**严格区分大小写**。常见失败原因:
- import 路径大小写不一致。
- 文件名大小写不一致。
- 前端 deep import element-ui 内部模块(如 `element-ui/lib/image-viewer`)。
---
## 8. 安全与敏感信息
### 8.1 已有敏感信息(代码中已存在)
pom.xml 的各 profile 中直接写入了内网 IP、数据库密码、阿里云 OSS AccessKey、Redis 密码、ES 密码、短信账户、邮箱密码等。这些信息已通过版本控制流传,修改时注意不要泄露到公开仓库。
### 8.2 认证机制
- PC 端通过 `uuid` + `timeStamp` + `signature` 进行请求鉴权。
- `SystemInterceptor` 会校验 uuid 是否有效、时间戳是否过期、签名是否正确。
- 部分开放接口(登录、短信、Swagger、部分 `/open/*`、部分 `/warehouseHardStock/*`)在白名单中跳过校验。
- `PermissionInterceptor` 负责按钮/接口级权限校验。
### 8.3 CORS
- `MyCORSFilter` 在 `web.xml` 中全局配置,并读取 `AllowOrigin` 属性。
- `allowIp` 用于防盗链校验(当前代码中部分被注释)。
---
## 9. 常见业务域速查
| 业务域 | Controller 包 | 典型前缀 |
|--------|--------------|----------|
| 账户/财务 | `controller/account/` | `/account*`、`/messageNotice` |
| 客户/代理商 | `controller/customer/` | `/agent*`、`/property*` |
| 仓库 | `controller/warehouse/` | `/myWarehouse*`、`/warehouse*` |
| 工单 | `controller/installOrder/`、`controller/deliveryOrder/`、`controller/workOrder/` 等 | `/install*`、`/delivery*`、`/workOrder*` |
| 资产 | `controller/asset/` | `/asset*` |
| 营销 | `controller/marketing/` | `/marketing*` |
| 统计 | `controller/statistics/` | `/statistics*` |
---
## 10. 如何开始修改
1. 确认需求涉及的数据库(权限库 + 业务库)。
2. 如果涉及新增业务表,Entity/Mapper/Service 应放在 `xiaoqu-publicbeanandmap`(先 install 到本地 Maven)。
3. 在本仓库 `controller/<业务域>/` 下新增 Controller、input/output/export DTO。
4. 新增页面时按 §5.1 写权限库 SQL,并在 `doc/<feature>-dev.md` 记录。
5. 本地 Jetty 或 Tomcat 运行验证。
6. 提交前确保 `mvn clean package -DskipTests` 通过。
---
## 11. 参考文档
- `doc/development-conventions.md`:开发规范、Git 约定、前后端协作、CI 注意事项。
- `doc/agent-message-notice-dev.md`:新增菜单+字段+权限 SQL 的完整示例(含动态授权)。
- `doc/customer-product-list-dev.md`:列表查询+导出 Controller 的完整示例。
- `doc/out-certificate-dev.md`:仓库凭证上传相关需求示例。
---
版本:基于仓库 2026-06-17 快照整理。