# LZ-RuoYi **Repository Path**: SpringSunYY/LZ-RuoYi ## Basic Information - **Project Name**: LZ-RuoYi - **Description**: 若依框架集成mybatisPlus、lombok、数据批量插入、优化前端代码生成 - **Primary Language**: Java - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-08-23 - **Last Updated**: 2025-08-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

logo

RuoYi v3.8.9

基于SpringBoot+Vue前后端分离的Java快速开发框架

## 介绍地址 B站 https://www.bilibili.com/video/BV15V9AYgEvL/?share_source=copy_web&vd_source=a4c1f9a58f1a8dd2e581c0f88e037fca 抖音 https://v.douyin.com/i5jgjvss/ ![1](assets/1.png) ![2](assets/2.png) ## 增加功能 在不影响若依原本功能基础上,集成mybatisPlus、lombok、数据批量插入、优化前端代码生成 1. 集成mybatisPlus 3.5.9 2. 集成lombok 1.18.24 3. 根据lombok、mybatisPlus与业务生成对应的dto和vo 4. 生成lombok和mybatisPlus的代码 5. 优化web前端生成,如果是文件类型生成的代码列表可以直接下载,动态显隐列,长文本内容可以隐藏 6. 批量生成数据 ### 集成mybatisPlus 3.5.9与lombok 1.18.24 ```xml 1.18.24 3.5.9 ``` ```xml org.projectlombok lombok ${lombok.version} true com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} ``` ### 根据lombok、mybatisPlus与业务生成对应的dto和vo ![image-20250227112112873](assets/image-20250227112112873.png) **实体** ```java package com.ruoyi.test.model.domain; import java.io.Serializable; import java.util.Map; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import com.ruoyi.common.annotation.Excel; import com.fasterxml.jackson.annotation.JsonInclude; /** * 位置信息对象 tb_address_info * * @author ruoyi * @date 2025-02-27 */ @TableName("tb_address_info") @Data public class AddressInfo implements Serializable { private static final long serialVersionUID = 1L; /** 编号 */ @Excel(name = "编号") @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; /** 父级编号 */ @Excel(name = "父级编号") private Long parentId; /** 位置名称 */ @Excel(name = "位置名称") private String name; /** 类型 */ @Excel(name = "类型") private String addressType; /** 图片 */ @Excel(name = "图片") private String imageInfo; /** 文件 */ @Excel(name = "文件") private String fileInfo; /** 备注 */ @Excel(name = "备注") private String remark; /** 状态 */ @Excel(name = "状态") private String status; /** 创建人 */ @Excel(name = "创建人") private Long userId; /** 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") private Date createTime; /** 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") private Date updateTime; /** 请求参数 */ @JsonInclude(JsonInclude.Include.NON_EMPTY) @TableField(exist = false) private Map params; } ``` **VO** ```java package com.ruoyi.test.model.vo.addressInfo; import java.io.Serializable; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import com.ruoyi.common.annotation.Excel; import org.springframework.beans.BeanUtils; import com.ruoyi.test.model.domain.AddressInfo; /** * 位置信息Vo对象 tb_address_info * * @author ruoyi * @date 2025-02-27 */ @Data public class AddressInfoVo implements Serializable { private static final long serialVersionUID = 1L; /** 编号 */ @Excel(name = "编号") private Long id; /** 父级编号 */ @Excel(name = "父级编号") private Long parentId; /** 位置名称 */ @Excel(name = "位置名称") private String name; /** 类型 */ @Excel(name = "类型") private String addressType; /** 图片 */ @Excel(name = "图片") private String imageInfo; /** 文件 */ @Excel(name = "文件") private String fileInfo; /** 备注 */ @Excel(name = "备注") private String remark; /** 状态 */ @Excel(name = "状态") private String status; /** 创建人 */ @Excel(name = "创建人") private Long userId; /** 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") private Date createTime; /** 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd") private Date updateTime; /** * 对象转封装类 * * @param addressInfo AddressInfo实体对象 * @return AddressInfoVo */ public static AddressInfoVo objToVo(AddressInfo addressInfo) { if (addressInfo == null) { return null; } AddressInfoVo addressInfoVo = new AddressInfoVo(); BeanUtils.copyProperties(addressInfo, addressInfoVo); return addressInfoVo; } } ``` **编辑DTO** ```java package com.ruoyi.test.model.dto.addressInfo; import java.io.Serializable; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.beans.BeanUtils; import com.ruoyi.test.model.domain.AddressInfo; /** * 位置信息Vo对象 tb_address_info * * @author ruoyi * @date 2025-02-27 */ @Data public class AddressInfoEdit implements Serializable { private static final long serialVersionUID = 1L; /** 编号 */ private Long id; /** 父级编号 */ private Long parentId; /** 位置名称 */ private String name; /** 类型 */ private String addressType; /** 图片 */ private String imageInfo; /** 文件 */ private String fileInfo; /** 备注 */ private String remark; /** 状态 */ private String status; /** 创建人 */ private Long userId; /** * 对象转封装类 * * @param addressInfoEdit 编辑对象 * @return AddressInfo */ public static AddressInfo editToObj(AddressInfoEdit addressInfoEdit) { if (addressInfoEdit == null) { return null; } AddressInfo addressInfo = new AddressInfo(); BeanUtils.copyProperties(addressInfoEdit, addressInfo); return addressInfo; } } ``` **插入DTO** ```java package com.ruoyi.test.model.dto.addressInfo; import java.io.Serializable; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.beans.BeanUtils; import com.ruoyi.test.model.domain.AddressInfo; /** * 位置信息Vo对象 tb_address_info * * @author ruoyi * @date 2025-02-27 */ @Data public class AddressInfoInsert implements Serializable { private static final long serialVersionUID = 1L; /** 编号 */ private Long id; /** 父级编号 */ private Long parentId; /** 位置名称 */ private String name; /** 类型 */ private String addressType; /** 图片 */ private String imageInfo; /** 文件 */ private String fileInfo; /** 备注 */ private String remark; /** 状态 */ private String status; /** 创建人 */ private Long userId; /** * 对象转封装类 * * @param addressInfoInsert 插入对象 * @return AddressInfoInsert */ public static AddressInfo insertToObj(AddressInfoInsert addressInfoInsert) { if (addressInfoInsert == null) { return null; } AddressInfo addressInfo = new AddressInfo(); BeanUtils.copyProperties(addressInfoInsert, addressInfo); return addressInfo; } } ``` **查询DTO** ```java package com.ruoyi.test.model.dto.addressInfo; import java.util.Map; import java.io.Serializable; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import com.fasterxml.jackson.annotation.JsonInclude; import org.springframework.beans.BeanUtils; import com.fasterxml.jackson.annotation.JsonFormat; import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.test.model.domain.AddressInfo; /** * 位置信息Query对象 tb_address_info * * @author ruoyi * @date 2025-02-27 */ @Data public class AddressInfoQuery implements Serializable { private static final long serialVersionUID = 1L; /** 父级编号 */ private Long parentId; /** 位置名称 */ private String name; /** 类型 */ private String addressType; /** 状态 */ private String status; /** 创建人 */ private Long userId; /** 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd") private Date createTime; /** 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd") private Date updateTime; /** 请求参数 */ @JsonInclude(JsonInclude.Include.NON_EMPTY) @TableField(exist = false) private Map params; /** * 对象转封装类 * * @param addressInfoQuery 查询对象 * @return AddressInfo */ public static AddressInfo queryToObj(AddressInfoQuery addressInfoQuery) { if (addressInfoQuery == null) { return null; } AddressInfo addressInfo = new AddressInfo(); BeanUtils.copyProperties(addressInfoQuery, addressInfo); return addressInfo; } } ``` ### 前端页面优化展示 ![image-20250227112620456](assets/image-20250227112620456.png) ### 批量插入 ![image-20250227112750064](assets/image-20250227112750064.png) ## 公共功能 ### 1.自定义缓存 #### 1.缓存注解 ```java /** * 自定义缓存注解,父类字段无法拿到 * 坚持是前行的舟 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface CustomCacheable { String keyPrefix(); // 缓存 key 的前缀,你要设置的key的前缀 String keyField() default ""; // 从方法入参中提取 key 的字段路径(支持嵌套字段) long expireTime() default 3600L; // 缓存时间(秒) boolean paginate() default false; // 是否启用分页缓存 String pageNumberField() default ""; // 页码字段(如果 paginate 为 true,则使用该字段) String pageSizeField() default ""; // 每页大小字段(如果 paginate 为 true,则使用该字段) boolean useQueryParamsAsKey() default false; // 是否将整个查询对象转换为 JSON 字符串作为缓存 key 的一部分 } ``` #### 2. 删除缓存 ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CustomCacheEvict { String[] keyPrefixes(); //你定义的缓存前缀 String[] keyFields() default {}; // 支持嵌套,如 "request.userId" boolean useQueryParamsAsKey() default false; // 如果true,加上参数JSON串模糊删除 } ``` ### 2.自定义排序 1. 注解 ```java /** * 自定义排序注解 * 首先我希望我变好,也希望你 * * @Author: YY */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CustomSort { /* createTime-create_time,这样一一对应,对应数据库字段 */ String[] sortFields() default {}; //排序字段,就是你前端传过来的字段,一一对应 String[] sortMappingFields() default {}; //映射字段,前端只需要传过来字段名,如果多表查询设置映射字段,映射字段为查询时所需字段 } ``` 2. 查询mapper ```sql ${params.sortSql} order by create_time desc ``` 3. 使用 ```java @CustomSort( sortFields = {"usageCount", "lookCount", "downloadCount", "createTime", "updateTime", "orderNum"}, sortMappingFields = { "usage_count", "look_count", "download_count", "create_time", "update_time", "order_num" }) @Override public List selectPictureCategoryInfoList(PictureCategoryInfo pictureCategoryInfo) { return pictureCategoryInfoMapper.selectPictureCategoryInfoList(pictureCategoryInfo); } ``` 4. 前端使用,此注解当前主要使用在管理端,目前演示的是vue3,如果vue2也可以参考这个,具体实现需要自己去实现 5. 在el-table加上@sort-change="customSort"自定义排序方法和ref ```js ``` 2. 在字段加上自定义排序标志 ```js ``` 5. 排序字段 ```js const isAsc = ref(); const orderByColumn = ref(''); ``` 6. 新增方法 ```js //自定义排序 function customSort({column, prop, order}) { if (prop !== undefined && prop !== '' && order !== null && order !== '') { orderByColumn.value = prop; isAsc.value = order === "ascending"; } else { orderByColumn.value = null; isAsc.value = null; } queryParams.value.pageNum = 1; getList(); } ``` 7. 在getList添加 ```js if (orderByColumn.value != null && isAsc.value !== null) { queryParams.value.params["orderByColumn"] = orderByColumn.value; queryParams.value.params["isAsc"] = isAsc.value; } ``` 8. 在重置按钮更新ref ```js /** 重置按钮操作 */ function resetQuery() { daterangeCreateTime.value = []; daterangeUpdateTime.value = []; orderByColumn.value = null isAsc.value = null; proxy.resetForm("queryRef"); proxy.$refs.tableRef.clearSort(); handleQuery(); } ``` ### 3.异常抛出工具类 ```java /** * 异常处理工具类 * * @Author YY */ public class ThrowUtils { /** * 条件成立则抛异常 * * @param condition 条件 * @param runtimeException 异常 */ public static void throwIf(boolean condition, RuntimeException runtimeException) { if (condition) { throw runtimeException; } } /** * 条件成立则抛异常 * * @param condition 条件 * @param message 错误信息 */ public static void throwIf(boolean condition, String message) { throwIf(condition, new ServiceException(message)); } /** * 条件成立则抛异常 * * @param condition 条件 * @param errorCode 错误码 * @param message 错误信息 */ public static void throwIf(boolean condition, Integer errorCode, String message) { throwIf(condition, new ServiceException(message, errorCode)); } } ``` ## 平台简介 若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 * 前端采用Vue、Element UI。 * 后端采用Spring Boot、Spring Security、Redis & Jwt。 * 权限认证使用Jwt,支持多终端认证系统。 * 支持加载动态权限菜单,多方式轻松权限控制。 * 高效率开发,使用代码生成器可以一键生成前后端代码。 * 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://gitcode.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。 * 提供了单应用版本[RuoYi-Vue-fast](https://gitcode.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://gitcode.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。 * 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) * 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)   ## 内置功能 1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 3. 岗位管理:配置系统用户所属担任职务。 4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 7. 参数管理:对系统动态配置常用参数。 8. 通知公告:系统通知公告信息发布维护。 9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 10. 登录日志:系统登录日志记录查询包含登录异常。 11. 在线用户:当前系统中活跃用户状态监控。 12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 14. 系统接口:根据业务代码自动生成相关的api接口文档。 15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 16. 缓存监控:对系统的缓存信息查询,命令统计等。 17. 在线构建器:拖动表单元素生成相应的HTML代码。 18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 ## 在线体验 - admin/admin123 - 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 演示地址:http://vue.ruoyi.vip 文档地址:http://doc.ruoyi.vip ## 演示图
## 若依前后端分离交流群 QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/已满-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![加入QQ群](https://img.shields.io/badge/已满-143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [![加入QQ群](https://img.shields.io/badge/已满-174951577-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [![加入QQ群](https://img.shields.io/badge/已满-161281055-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [![加入QQ群](https://img.shields.io/badge/已满-138988063-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [![加入QQ群](https://img.shields.io/badge/已满-151450850-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [![加入QQ群](https://img.shields.io/badge/已满-224622315-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [![加入QQ群](https://img.shields.io/badge/已满-287842588-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [![加入QQ群](https://img.shields.io/badge/187944233-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) 点击按钮入群。