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.
28 KiB
28 KiB
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.vuetype=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:38hw_web1:31hw_web_menu:28hw_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/hwWeb1JSON 页面数据)。
前端技术栈(来自 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.vuesrc/views/productCenter/detail.vuesrc/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(22):Controller/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 ,内容集中于三方面:我们在解决什么问题、找到了哪些相关文件(精确到行号)、当前的理解是什么
记录格式:
## {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)
- **遗留问题**:{如有}
- **进阶方向**:{建议用户接下来可以深入阅读哪方面的文档或优化哪个模块}
---