You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

519 lines
28 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Repository Guidelines
## 文档定位
本文件聚焦“写代码时需要的架构与模块提示信息”,不包含 Git 流程、编译或测试命令。
## 系统架构总览
- 工程形态Maven 多模块单体应用,前后端分离(官网展示端 `portal_website` + 官网编辑端 `portal_website_edit` + Spring Boot 后端)。
- 前端职责分工:
- `portal_website`:官网展示界面(展示消费端,非代码重点)。
- `portal_website_edit`:官网内容编辑后台(当前前端改造重点)。
- 当前实现重点:`portal_website_edit`(前端编辑)+ `ruoyi-portal`(后端内容接口)。
- 模块分层:
- `ruoyi-admin`应用入口、Controller 暴露层。
- `ruoyi-framework`安全认证、AOP、拦截器、数据权限与限流实现层。
- `ruoyi-system`:系统业务域(用户/角色/菜单/字典等)服务层。
- `ruoyi-common`:跨模块基础设施与通用契约层。
- `ruoyi-quartz`:任务调度能力层。
- `ruoyi-generator`:代码生成能力层。
- `ruoyi-portal`:官网内容与菜单相关后端业务模块(`/portal/**`)。
- `portal_website`官网展示前端Vue2 + Element UI + 菜单/JSON 驱动页面引擎)。
- `portal_website_edit`官网内容编辑后台前端Vue2 + Element UI + JSON 区块模板编辑器)。
- 关键依赖方向:`admin -> framework -> system -> common``quartz/generator -> common``portal_website/portal_website_edit -> /portal/** -> ruoyi-portal`。
## 官网编辑后台 `portal_website_edit` 深度分析
### 模块定位与边界
- `portal_website_edit` 是官网内容编辑后台,不负责官网最终展示页面渲染。
- 主要职责:维护官网页面 `webJsonString`、产品中心结构、产品详情模板块、下载文档与密钥。
- 数据写入目标:
- `hwWeb`:通用页面 JSON如首页 `webCode=-1`、产品中心配置 `webCode=7`)。
- `hwWeb1`:产品详情 JSON`webCode + typeId + deviceId` 三元键)。
- `hwWebDocument`:下载文档地址、密钥与删除。
- 页面入口非常聚焦:仅 `/editor``/productCenter/edit` 两条核心路由。
### 前端技术栈(来自 `portal_website_edit/package.json`
| 技术 | 版本 | 说明 |
|---|---:|---|
| Vue | 2.5.2 | 编辑后台框架基线 |
| Vue Router | 3.0.1 | 路由管理(默认 hash 模式) |
| Element UI | 2.15.14 | 表单、表格、弹窗、上传等编辑控件 |
| Axios | 1.7.9 | HTTP 请求 |
| js-cookie | 3.0.5 | 读取 `Admin-Token` |
| Less | 4.2.0 | 样式预处理 |
| Swiper | 11.1.15 | 轮播样式依赖 |
| Quill | 2.0.3 | 富文本样式依赖 |
| AMap JS API Loader | 1.0.1 | 地图 SDK当前编辑页面使用较少 |
| ECharts | 6.0.0 | 图表依赖(当前编辑页使用较少) |
| uuid | 11.0.5 | 文档上传生成 UUID |
| Vue CLI Service | ~5.0.0 | 主构建工具 |
| Webpack | 3.6.0 | 遗留构建链(`dev/dev1/start` 脚本) |
### 规模与目录画像(快照统计)
- `src` 总计:`33` 文件,约 `4611` 行。
- 关键目录:
- `views``3` 文件,约 `1098` 行(编辑器入口与产品中心编辑页)。
- `components/editEl``21` 文件,约 `3199` 行(核心模板编辑组件)。
- `api``4` 文件,约 `186` 行。
- `router``1` 文件,约 `17` 行。
- `utils``1` 文件,约 `32` 行。
- 大文件:
- `src/views/editPage/index.vue``639` 行(主编辑器)。
- `src/components/editEl/editEl16.vue``325` 行(多设备参数表 + 粘贴导入解析)。
- `src/components/editEl/classicCase.vue``301` 行。
- `src/views/productCenter/edit/produceModel.vue``285` 行。
### 运行与构建链路
- 入口:`src/main.js`,注册 `ElementUI`、全局样式依赖,并加载高德地图 SDK含明文 key/securityJsCode
- 壳层:`src/App.vue` 仅保留 `<router-view/>`,并在 `mounted` 设置页面标题。
- 路由:`src/router/index.js` 将 `/` 重定向到 `/editor`,另有 `/productCenter/edit`
- 请求层:`src/utils/request.js` 固定 `baseURL='/prod-api'`,请求头从 Cookie 注入 `Authorization: Bearer <Admin-Token>`,响应统一返回 `res.data`
- 上传链路:
- 图片上传:`uploadEl.vue` 直传 `/prod-api/file/upload`,写回 `icon/url/banner...` 字段。
- 文件上传:`uploadFile.vue` 上传后调用 `addHwWebDocument` 持久化文档地址。
- 构建链路存在双轨:`serve/build` 走 Vue CLI`dev/dev1/start` 走 legacy webpack-dev-server。
### 路由与页面职责(当前实现)
- `/editor``views/editPage/index.vue`
- `type='1'`:行业方案/菜单页编辑。菜单来源 `selectMenuTree()``webMenuId===4` 子树,加载/保存走 `getHwWeb`/`updateHwWeb`。
- `type='2'`:产品详情页编辑。菜单来源 `getHwWeb(7)``productList`,加载/保存走 `listHwWeb1`/`updateHwWeb1`。
- `type='3'`:首页区块编辑。加载/保存 `getHwWeb(-1)`/`updateHwWeb(webCode='-1')`,编辑 `ClassicCase``ProductCenter` 两类组件。
- 提供区块增删、上下移动、组件模板选择与保存上传。
- `/productCenter/edit``views/productCenter/edit/index.vue`
- 编辑 `webCode=7` 的产品中心聚合配置banner + 一级产品 tabs + 机型卡片)。
- tabs 菜单来源 `selectMenuTree()``webMenuId===7` 子树。
- 子组件 `produceModel.vue` 提供“二级分类 + 设备卡片”编辑,并跳转到 `/editor?type=2&id=...` 编辑详情模板。
### 核心机制:三种编辑模式 + JSON 模板池
- `componentsM` 是主编辑器的模板池,定义 `carousel``type=1..16` 的默认 JSON 结构。
- 渲染映射:
- `type='carousel'` -> `components/editEl/carousel.vue`
- `type=1..16` -> `components/editEl/editEl1.vue` ... `editEl16.vue`
- 组件编辑方式:
- 文本:以 `contenteditable + blur` 直接写回 `this.$props.data`
- 集合:`push/splice` 原地增删。
- 排序:`moveUp/moveDown` 通过数组重排。
- 保存方式:统一 `JSON.stringify(components)` 写入后端 `webJsonString`
### `components/editEl` 数据契约(高频)
| 类型/组件 | 主要字段结构(`value` | 说明 |
|---|---|---|
| `carousel` | `list[{icon,title,value}]` | 首页/详情轮播编辑 |
| `editEl1` | `title,subTitle,list[{icon,title,value}]` | 图标卡片4列栅格 |
| `editEl2` | `title,subTitle,contentSubTitle,contentTitle,contentInfo,icon` | 左文右图 |
| `editEl3` | `title,subTitle,list[{icon,itemTitle,itemInfo}]` | 双列图标信息 |
| `editEl4` | `icon,list[{title,value}]` | 左大图右四格最多4项 |
| `editEl5` | `title,subTitle,icon` | 标题 + 大图 |
| `editEl6` | `title,subTitle,info,icon` | 标题说明 + 大图 |
| `editEl7` | `title,subTitle,list[{icon,title,value}]` | 3列图标块 |
| `editEl8` | `title,subTitle,list[{title,leftTitle,leftInfo,icon,infos[{title,info}]}]` | Tab + 左图右参数列表 |
| `editEl9` | `title,subTitle,list[{icon,value}]` | 上图下文卡片 |
| `editEl10` | `title,subTitle,list[{icon,...}]` | 三列图集(当前只展示图片) |
| `editEl11` | `title,subTitle,list[{icon,title,value}]` | 大图标三列 |
| `editEl12` | `imgList[{url}],features[{name}]` | 产品图册 + 特点清单 |
| `editEl13` | `params[{title,list[{name,value}]}]` | 简单参数表 |
| `editEl14` | `fileList[{name,value,url,fileName,uuid}]` | 资料下载 + 上传 + 密钥设置 |
| `editEl15` | `banner,banner1,bannerTitle,bannerValue` | 产品 banner 双图文 |
| `editEl16` | `params[{title,columns[],rows[{name,values[],merge}]}]` | 多设备对比参数表,支持“粘贴导入表格” |
- 首页专用编辑组件:
- `classicCase.vue`:编辑 `classicCaseData[{homeConfigTypeName,caseInfoTitle,caseInfoDesc,caseInfoPic,configTypeId}]`
- `productCenter.vue`:编辑 `productCenterData[{homeConfigTypePic,configTypeDesc,homeConfigTypeName,linkData}]`
- `views/productCenter/edit/produceModel.vue`:编辑产品分类及设备卡片,并路由到详情模板编辑。
- 公共上传组件:
- `uploadEl.vue`:图片上传 + 字段回填(默认 `icon`)。
- `uploadFile.vue`:文件上传 + UUID 建档(`addHwWebDocument`)。
### API 域与后端契约
- `src/api/hwWeb.js`
- `/portal/hwWeb/*`:页面 JSON CRUD。
- `/portal/hwWeb1/*`:产品详情 JSON 查询/更新。
- `src/api/hwWebMenu.js``/portal/hwWebMenu/*` 与 `selectMenuTree`
- `src/api/hwWebDocument.js``/portal/hwWebDocument/*` + `getSecureDocumentAddress`
- `src/api/productCenter.js``/portal/portal/*` 产品中心聚合接口 + 菜单树查询。
- 约定:页面层统一走 `utils/request.js`,不要直接使用裸 `axios`
### `hw_web.sql` 核心表结构与数据快照(重点)
- 数据来源:根目录 `hw_web.sql`(当前使用中的 MySQL 结构与种子数据,后续会继续演进)。
- 关注重点表:`hw_web_menu`、`hw_web`、`hw_web1`、`hw_web_document`。
- 其余 `hw_*` 表可能存在历史保留/阶段性未使用场景,排查问题时优先从上述 4 表入手。
- 快照插入行数(按 dump 中 `INSERT INTO` 统计):
- `hw_web``38`
- `hw_web1``31`
- `hw_web_menu``28`
- `hw_web_document``11`
#### 表职责与关键字段(按当前实现)
| 表名 | 主要用途 | 主键 | 关键字段(高频) | 说明 |
|---|---|---|---|---|
| `hw_web_menu` | 官网一级/多级菜单树 | `web_menu_id` | `parent`,`ancestors`,`web_menu_name`,`web_menu_type`,`is_delete` | 前后端主菜单树来源(`/portal/hwWebMenu/selectMenuTree` |
| `hw_web` | 通用页面 JSON菜单页/首页/产品中心聚合) | `web_id` | `web_code`,`web_json_string`,`is_delete`,`web_json_english` | `web_code` 常与菜单 id 对齐;首页常用 `-1`,产品中心聚合常用 `7` |
| `hw_web1` | 产品详情 JSON设备维度 | `web_id` | `web_code`,`typeId`,`device_id`,`web_json_string`,`is_delete` | `portal_website_edit` 的详情编辑核心落表 |
| `hw_web_document` | 下载文件地址与密钥 | `document_id`(varchar/UUID) | `document_address`,`secretKey`,`web_code`,`type`,`is_delete` | `editEl14` 上传资料与密钥校验依赖该表 |
#### 字段层面注意点(基于 DDL
- `hw_web_menu.web_menu__pic` 列名带双下划线,属历史命名,代码中已按该列映射。
- `hw_web1` 存在 `secret_ket`(疑似 typo字段当前 `HwWeb1` 领域对象与 `Mapper` 未使用该列。
- `hw_web_document.secretKey` 列名采用驼峰,`Mapper XML` 也按驼峰字段写 SQL。
- 4 张表均采用 `is_delete` 逻辑删除;`Mapper` 查询统一过滤 `is_delete = '0'`
- 目前这些表仅主键索引,无 `web_code``(web_code,typeId,device_id)` 唯一索引。
#### 与 `ruoyi-portal` / `portal_website_edit` 的映射关系
- `hw_web_menu`
- 后端:`HwWebMenuController(/portal/hwWebMenu)` + `selectMenuTree`
- 前端:`portal_website_edit/src/api/hwWebMenu.js` 与 `src/api/productCenter.js` 均调用菜单树。
- 关键耦合:编辑端硬编码依赖 `webMenuId===4/7`
- `hw_web`
- 后端:`HwWebController(/portal/hwWeb)`。
- 前端:`getHwWeb / updateHwWeb`。
- 典型约定:`getHwWeb(-1)` 首页配置,`getHwWeb(7)` 产品中心聚合配置。
- `hw_web1`
- 后端:`HwWebController1(/portal/hwWeb1)`。
- 前端:`listHwWeb1({ webCode, typeId, deviceId })` 与 `updateHwWeb1(...)`
- 业务键约定:`web_code + typeId + device_id`。
- `hw_web_document`
- 后端:`HwWebDocumentController(/portal/hwWebDocument)` + `/getSecureDocumentAddress`
- 前端:`uploadFile.vue` 上传后写入 `document_id(document uuid) + document_address``editEl14` 支持密钥设置/删除。
#### 当前实现行为与风险(改动前必读)
- `hw_web` / `hw_web1` 在 Service 层采用“版本化写入”:
- 先按业务键查旧记录并逻辑删除;
- 再插入新记录(新 `web_id`)。
- 这会导致同一业务键在库内积累多条历史记录(`is_delete='1'`),属于预期行为。
- 由于无唯一索引,业务键唯一性由应用层保证;批量并发写入时需注意竞态。
- `hw_web_document` 密钥逻辑:
- 查询列表/详情时会隐藏 `secretKey`,并在有密钥时隐藏 `documentAddress`
- `/getSecureDocumentAddress` 通过 `document_id + providedKey` 校验后返回真实地址。
### 样式与组件组织约定
- 全局 Less 变量:`src/style.less`(当前仅 `@top-height/@standard-color`)。
- 样式单位以 `vw` 为主,默认面向 PC 可视化编辑场景。
- 组件样式普遍采用 `scoped + /deep/` 覆盖 Element UI。
- 模板组件集中放在 `src/components/editEl`,页面编排在 `src/views`
### 已识别实现特征与风险(修改前先知晓)
- 环境与请求基址双轨:
- `.env.development``VUE_APP_BASE_API=/dev-api`
-`request.js`/上传组件都固定 `/prod-api`,且 `vue.config.js` 仅代理 `/prod-api`
- 强耦合硬编码:
- `getHwWeb(7)`(产品中心配置)、`getHwWeb(-1)`(首页配置)。
- `selectMenuTree` 中写死 `webMenuId===4/7`
- 鉴权依赖 Cookie所有请求默认拼接 `Admin-Token`,无 token 刷新或兜底逻辑。
- 地图安全配置明文:`main.js` 暴露 `key/securityJsCode`
- 编辑方式是“直接改对象”:
- 大量 `contenteditable + blur + this.$props.data` 原地改值,缺少 schema 校验与输入过滤。
- 局部实现细节需注意:
- `editEl8.vue` 子项删除使用 `splice(k, 1)`(应关注内层索引 `kk` 语义)。
- `productCenter.vue``pageChange` 同时写 `this.$props.data.productCenterData.linkData`,语义上是数组级字段。
- 构建链路老旧混用Vue CLI 5 与 Webpack 3 脚本并存,升级依赖时需同时验证。
### 写 `portal_website_edit` 代码时的实用提示
- 新增区块模板时必须同步修改:
- `src/views/editPage/index.vue`:注册组件、`componentsM` 模板、弹窗入口。
- `src/components/editEl/`:新增模板实现文件。
- (若依赖产品详情链路)验证 `type=2``listHwWeb1/updateHwWeb1` 的入参与保存。
- 保持 JSON 契约稳定:优先在现有字段上演进,避免随意变更 `webJsonString` 结构。
- 涉及资料下载能力时优先复用 `editEl14 + uploadFile + hwWebDocument`,避免页面内重复上传逻辑。
- 导航/菜单改造时至少联动验证三处:
- `/editor``typeChange/pageChange`
- `/productCenter/edit` 的 tabs 与 `produceModel` 跳转参数。
- `classicCase/productCenter` 两个首页编辑组件的菜单绑定行为。
- 若要补充展示端能力,优先先确认消费端(已脱离本仓库)是否支持新增 `type` 与字段结构。
## 官网前端 `portal_website` 模块说明(恢复)
> 定位说明:`portal_website` 主要用于官网展示界面,不是当前代码改造重点;实际开发优先关注 `portal_website_edit` 与 `ruoyi-portal`。
### 模块定位与边界
- `portal_website` 是独立官网展示前端,不复用后台管理逻辑。
- 主要职责:官网内容展示、产品/方案详情渲染、资料下载、联系信息提交、导航与客服浮窗。
- 数据来源:后端 `/portal/**` 系列接口(重点是 `hwWebMenu` 菜单树 + `hwWeb/hwWeb1` JSON 页面数据)。
### 前端技术栈(来自 `portal_website/package.json`
| 技术 | 版本 | 说明 |
|---|---:|---|
| Vue | 2.5.2 | 官网框架基线 |
| Vue Router | 3.0.1 | 路由管理history 未开启,默认 hash 模式) |
| Element UI | 2.15.14 | UI 组件库 |
| Axios | 1.7.9 | HTTP 请求 |
| Less | 4.2.0 | 样式预处理 |
| Swiper | 11.1.15 | 轮播/滑动 |
| Quill | 2.0.3 | 富文本样式依赖 |
| AMap JS API Loader | 1.0.1 | 地图加载 |
| ECharts | 6.0.0 | 图表能力(当前业务页使用较少) |
| Vue CLI Service | ~5.0.0 | 主构建工具 |
| Webpack | 3.6.0 | 遗留构建依赖(用于 `dev/dev1` 脚本链路) |
### 路由与页面职责(现有约定)
- `/index`:首页聚合(轮播、典型案例、产品中心、联系区块)。
- `/productCenter`:产品聚合页(顶部 banner + 一级产品 tab
- `/productCenter/detail`:基于 JSON 区块(`el1`~`el16`)动态渲染产品详情。
- `/industrySolutions`:方案列表卡片页(跳转 `/test?id=xx`)。
- `/contactUs`:关于海威聚合页(公司概况/合作伙伴/媒体中心/资质)。
- `/contactUs/MediaCenterDetail`:媒体详情静态内容页。
- `/serviceSupport`:服务支持聚合(售前/问答/下载等)。
- `/test`:菜单驱动动态页渲染(`getHwWeb(id)`)。
### 核心机制:菜单树 + JSON 区块渲染
- 顶部导航来源:`selectMenuTree()``webMenuId` 驱动路由跳转。
- 动态页面来源:
- `/test` 页面:`getHwWeb(id)` 读取 `webJsonString`,按 `type` 映射到 `components/el/*`
- 产品详情页:`listHwWeb1({ webCode, typeId, deviceId })` 读取 JSON 同样映射区块。
- 区块映射:`type === 1..16` -> `el1..el16``type === 'carousel'` -> `components/el/carousel.vue`
### `components/el` 数据契约(高频)
- 通用字段:大量区块约定 `title/subTitle/list/icon/value`
- 典型结构:
- `el1/el3/el7/el11`:图标 + 文本列表。
- `el2/el4`:左右分栏图文。
- `el5/el6/el10`:大图/图集展示。
- `el8`Tab + 左侧主图 + 右侧参数列表。
- `el12`:产品图册 + 特点列表。
- `el13/el16`:参数表(支持 `columns/rows`,含合并行策略)。
- `el14`:资料下载(含密钥弹窗与 `getSecureDocumentAddress`)。
- `el15`Banner 双图文。
- 新增区块类型时,需同步修改:
- `src/views/page/index.vue`
- `src/views/productCenter/detail.vue`
- `src/components/el/` 新增实现文件
### API 域与后端契约
- 门户聚合接口:`/portal/portal/*`(首页、案例、联系、关于等)。
- 菜单接口:`/portal/hwWebMenu/*`(导航树与菜单管理)。
- JSON 页面接口:`/portal/hwWeb*`(页面区块 JSON 存储与查询)。
- 资料接口:`/portal/hwWebDocument/*`(文档列表、密钥校验、下载地址)。
- 前端调用统一以 `request.js` 为入口,业务层不要直接使用裸 `axios`
### 已识别实现特征与风险(展示端)
- 环境变量与请求基址可能存在双轨:`.env` 与 `request.js` 固定 `baseURL` 需联动核对。
- 菜单跳转较依赖硬编码 `webMenuId`;后台菜单 ID 变化会影响导航。
- 展示页历史上存在静态兜底数据;新增接口时优先替换静态块而非叠加分支。
- `main.js` 的地图 `key/securityJsCode` 曾采用明文硬编码,建议统一收敛到环境变量。
### 写展示端代码时的实用提示(聚焦 `portal_website`
- 新增官网内容优先走“菜单树 + JSON 区块”机制,避免继续堆叠 hardcode 页面。
- 需要可复用展示块时,优先扩展 `components/el`,并保持 `data` 契约稳定。
- API 返回统一按 `res.code/res.data/res.rows` 结构处理,避免页面层自行兼容多形态。
- 处理路由参数时复用既有约定:`id`(菜单/设备)、`type`(产品线)、`typeId`(子分类)。
## Backend Tech Stack (With Versions)
版本来源:根 `pom.xml``properties``dependencyManagement`
| 技术 | 版本 | 说明 |
|---|---:|---|
| Java | 17 | 语言与运行时基线 |
| Spring Boot BOM | 3.5.8 | Spring 生态版本管理 |
| MyBatis Spring Boot Starter | 3.0.5 | ORM/Mapper |
| Druid Spring Boot 3 Starter | 1.2.27 | 数据源与连接池 |
| PageHelper Starter | 2.1.1 | 分页 |
| MySQL Connector/J | 8.2.0 | MySQL 驱动 |
| SpringDoc OpenAPI | 2.8.14 | API 文档 |
| Spring Security | 由 Boot 3.5.8 管理 | 认证鉴权 |
| Spring Data Redis | 由 Boot 3.5.8 管理 | 缓存/会话 |
| JJWT | 0.9.1 | JWT |
| Quartz | 2.5.2 | 定时任务 |
| Fastjson2 | 2.0.60 | JSON |
| Apache POI | 4.1.2 | Excel 导入导出 |
| Velocity | 2.3 | 代码生成模板 |
| Kaptcha | 2.3.3 | 验证码 |
| YAUAA | 7.32.0 | User-Agent 解析 |
| OSHI | 6.9.1 | 主机监控信息 |
| Commons IO | 2.21.0 | IO 工具 |
| Jakarta Servlet API | 6.0.0 | Servlet 规范 |
## ruoyi-common 模块深度分析
### 模块定位与边界
- `ruoyi-common` 是后端基础设施层,提供统一契约、基类、工具和安全过滤,不承载业务流程。
- 当前约 `109` 个 Java 类,属于项目复用中心模块。
### 包结构概览(一级包)
- `utils`36通用工具主集合。
- `core`22Controller/Domain/Page/Redis/Text 基础抽象。
- `exception`18统一异常体系。
- `annotation`9横切能力注解契约。
- `constant`6/`enums`8常量与策略枚举。
- `filter`6/`xss`2请求过滤与输入安全。
- `config`2通用配置与序列化器。
### 架构中心性(跨模块复用)
- `ruoyi-framework`: 148 次 `import com.ruoyi.common.*`
- `ruoyi-admin`: 138 次
- `ruoyi-system`: 86 次
- `ruoyi-quartz`: 40 次
- `ruoyi-generator`: 25 次
- 高频类:`StringUtils`、`AjaxResult`、`Constants`、`BaseController`、`SecurityUtils`、`ExcelUtil`。
### 设计机制(写代码时重点)
- 契约与实现分离:`@DataScope/@RateLimiter/@RepeatSubmit/@Log` 定义在 common实现放在 framework 的 Aspect/Interceptor。
- 统一返回规范Controller 继承 `BaseController`,统一输出 `AjaxResult`/`TableDataInfo`。
- 统一实体扩展位:`BaseEntity.params` 用于数据权限 SQL 片段等横切参数传递。
- 统一安全输入链路:`SqlUtil`、`XssFilter`、`XssValidator`、`RepeatableFilter` 负责请求与参数安全治理。
## ruoyi-common 类级别索引清单(按包)
### `annotation`
| 类 | 使用场景 |
|---|---|
| `Anonymous` | 标记匿名可访问接口 |
| `DataScope` | 服务查询方法注入数据权限条件 |
| `DataSource` | 动态切换主从数据源 |
| `Excel`/`Excels` | 实体字段导入导出映射 |
| `Log` | 业务操作日志切面采集 |
| `RateLimiter` | 接口限流(全局或按 IP |
| `RepeatSubmit` | 防重复提交 |
| `Sensitive` | 返回字段脱敏 |
### `config`
| 类 | 使用场景 |
|---|---|
| `RuoYiConfig` | 读取 `ruoyi.*` 业务基础配置(上传路径、验证码类型等) |
| `SensitiveJsonSerializer` | 配合 `@Sensitive` 做序列化脱敏 |
### `constant`
| 类 | 使用场景 |
|---|---|
| `Constants` | 全局常量JWT 字段、权限标识、资源前缀等) |
| `CacheConstants` | Redis key 前缀统一管理 |
| `HttpStatus` | 返回状态码常量 |
| `GenConstants` | 代码生成器常量 |
| `ScheduleConstants` | 调度任务常量 |
| `UserConstants` | 用户/角色状态常量 |
### `core.controller`
| 类 | 使用场景 |
|---|---|
| `BaseController` | 分页、排序、安全用户获取、统一响应快捷方法 |
### `core.domain`
| 类 | 使用场景 |
|---|---|
| `AjaxResult` | 标准接口返回体Map 风格) |
| `R<T>` | 泛型响应体(类型化返回) |
| `BaseEntity` | 审计字段与 `params` 扩展参数 |
| `TreeEntity`/`TreeSelect` | 树结构实体与前端下拉树数据 |
### `core.domain.entity`
| 类 | 使用场景 |
|---|---|
| `SysUser` | 用户领域共享实体含校验、Excel 注解) |
| `SysRole` | 角色与数据权限范围 |
| `SysDept` | 部门树领域实体 |
| `SysMenu` | 菜单与权限节点 |
| `SysDictType`/`SysDictData` | 字典类型与字典项 |
### `core.domain.model`
| 类 | 使用场景 |
|---|---|
| `LoginBody` | 登录请求体 |
| `RegisterBody` | 注册请求体 |
| `LoginUser` | 安全上下文主体token、权限、登录态 |
### `core.page`
| 类 | 使用场景 |
|---|---|
| `PageDomain` | 分页参数承载 |
| `TableSupport` | 从请求提取分页参数 |
| `TableDataInfo` | 表格分页响应结构 |
### `core.redis`
| 类 | 使用场景 |
|---|---|
| `RedisCache` | 对 `RedisTemplate` 的统一封装(对象/列表/集合/Map/过期) |
### `core.text`
| 类 | 使用场景 |
|---|---|
| `Convert` | 安全类型转换 |
| `StrFormatter` | `{}` 占位符格式化 |
| `CharsetKit` | 字符集处理 |
### `enums`
| 类 | 使用场景 |
|---|---|
| `BusinessType`/`OperatorType` | 操作日志分类 |
| `DataSourceType` | 主从数据源策略 |
| `LimitType` | 限流维度(默认/IP |
| `HttpMethod` | 请求方法匹配 |
| `UserStatus`/`BusinessStatus` | 状态语义统一 |
| `DesensitizedType` | 脱敏策略函数集合 |
### `exception`
| 类 | 使用场景 |
|---|---|
| `BaseException` | 业务基础异常(支持国际化 code |
| `ServiceException` | 服务层运行时异常(可带状态码) |
| `UtilException` | 工具类异常 |
| `DemoModeException`/`GlobalException` | 演示模式与全局业务异常 |
| `file.*` | 文件上传、大小、扩展名异常 |
| `user.*` | 登录、验证码、密码重试、黑名单异常 |
| `job.TaskException` | 定时任务执行异常 |
### `filter`
| 类 | 使用场景 |
|---|---|
| `RepeatableFilter`/`RepeatedlyRequestWrapper` | JSON 请求体可重复读取 |
| `XssFilter`/`XssHttpServletRequestWrapper` | 请求参数与 JSON 体 XSS 清洗 |
| `RefererFilter` | 防盗链 Referer 校验 |
| `PropertyPreExcludeFilter` | JSON 属性排除辅助 |
### `utils`(重点工具类补充)
| 类 | 使用场景 |
|---|---|
| `StringUtils` | 字符串/集合空判断、模板格式化、命名转换 |
| `DateUtils` | 日期解析与格式化 |
| `SecurityUtils` | 获取当前用户、权限匹配、密码加密 |
| `ServletUtils` | request/response/session 获取与渲染 |
| `PageUtils` | 分页启动与清理 |
| `DictUtils` | 字典缓存读写与标签值转换 |
| `FileUploadUtils` | 统一上传路径、命名、扩展名校验 |
| `FileUtils`/`ImageUtils`/`MimeTypeUtils` | 文件读写、图片处理、类型识别 |
| `ExcelUtil` | Excel 导入导出核心工具 |
| `SqlUtil` | orderBy 白名单校验与关键字过滤 |
| `IpUtils`/`AddressUtils` | IP 解析与归属地查询 |
| `HttpUtils`/`HttpHelper`/`UserAgentUtils` | HTTP 调用、请求体读取、UA 解析 |
| `SpringUtils` | 非托管代码获取 Bean/环境信息 |
| `BeanUtils`/`BeanValidators`/`ReflectUtils` | Bean 复制、校验、反射访问 |
| `IdUtils`/`UUID`/`Seq` | 唯一 ID 与序列号 |
| `Md5Utils`/`Base64` | 摘要与编码 |
### `xss`
| 类 | 使用场景 |
|---|---|
| `Xss` | 字段级 XSS 校验注解 |
| `XssValidator` | XSS 校验实现 |
## 写代码时的实用提示(聚焦 common
- 返回值统一:优先使用 `AjaxResult`/`TableDataInfo`,避免模块间返回结构不一致。
- 分页与排序安全:动态排序字段必须走 `SqlUtil.escapeOrderBySql` 逻辑。
- Redis key 必须使用 `CacheConstants` 前缀,避免不同模块 key 冲突。
- 上传逻辑优先复用 `FileUploadUtils`,不要在业务层重复拼接文件路径。
- 涉及脱敏字段优先用 `@Sensitive`,不要在 Controller 手工字符串处理。
- 新增通用能力时,先判断是否应放在 `ruoyi-common`(跨模块复用)还是业务模块(仅单域使用)。
## 项目记忆规则(私人助理模式)
**重要:每次完成任务后,必须将任务记录追加到项目记忆文件 `{项目根目录名称}_memory.md`** ,内容集中于三方面:我们在解决什么问题、找到了哪些相关文件(精确到行号)、当前的理解是什么
**记录格式**
```markdown
## {YYYY-MM-DD}(北京时间)
### 1、执行清单 (Execution)
- **任务目标**{描述具体需求,描述本次解决了什么业务问题}
- **关键产出**{列出新增/修改的核心文件路径、API 路径或组件名称}
### 2、技术洞察与复盘 (Tech Insights)
- **核心逻辑模式**{说明本次采用了什么设计模式或架构思路策略模式实现多工厂算法、MPJ 实现多表关联等}
- **为什么这样写 (The Why)**{对比普通写法,解释当前方案在可维护性或扩展性上的优势}
- **潜在风险提醒**{记录 AI 在实现过程中发现的风险点,如:大表关联性能、并发冲突风险等}
### 3、专属学习区 (Learning Log)
- **今日新见识**{从本次代码中抽取 1 个用户可能不熟悉的知识点,如:某个 TS 特性、Java 17 新语法或 MPJ 高级用法}
- **1分钟本质理解**{用最通俗的话解释这个知识点的本质,帮用户快速建立直觉}
### 4、下一步建议 (Next Steps)
- **遗留问题**{如有}
- **进阶方向**{建议用户接下来可以深入阅读哪方面的文档或优化哪个模块}
---
```