基于若依框架进行二次开发优化指南

 背景

若依(RuoYi)开源框架是一个功能强大的Java开发框架,专注于快速构建企业级后台管理系统。它提供了一套丰富的功能和模块,可以帮助开发人员快速搭建稳定、高效的管理系统。本篇博客将大家了解若依框架的基本概念和使用方法,帮助您快速上手。

系统需求

  • JDK >= 1.8
    MySQL >= 5.7
    Maven >= 3.0
    Node >= 12
    Redis >= 3

这里是若依官网,还有在线演示 

具体的若依介绍,大家可以看官网或者这篇文章:

https://blog.csdn.net/weixin_49185262/article/details/131448994

我主要说一下基于若依快速二次开发的方法,给自己做个记录,若有不对的地方欢迎指出批评,过程中的相关的代码都是示例代码,大家仅供参考!

想基于若依快速开发,但是若依有一些能力规范还不够全面,所以需要稍微处理一下,接下来把需要修改的几点罗列一下

一、修改配置

1、mybatis-plus 适配

关于Mybatis-plus的使用,大家可以参考我的这篇文章:

使用Mybatis-plus清空表数据_mybatisplus删除表所有内容_Alex_81D的博客-CSDN博客

1.1 添加pom

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version>
</dependency>

1.2 修改配置类

增加 MybatisPlusConfig.java,并注释掉 MyBatisConfig

内容如下:

package com.ruoyi.framework.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;/*** Mybatis Plus 配置*/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig
{@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 分页插件interceptor.addInnerInterceptor(paginationInnerInterceptor());// 乐观锁插件interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());// 阻断插件interceptor.addInnerInterceptor(blockAttackInnerInterceptor());return interceptor;}/*** 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html*/public PaginationInnerInterceptor paginationInnerInterceptor(){PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();// 设置数据库类型为mysqlpaginationInnerInterceptor.setDbType(DbType.MYSQL);// 设置最大单页限制数量,默认 500 条,-1 不受限制paginationInnerInterceptor.setMaxLimit(-1L);return paginationInnerInterceptor;}/*** 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html*/public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor(){return new OptimisticLockerInnerInterceptor();}/*** 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html*/public BlockAttackInnerInterceptor blockAttackInnerInterceptor(){return new BlockAttackInnerInterceptor();}
}

 1.3 修改配置文件

增加如下配置,并注释掉原来的mybatis的配置信息

# MyBatis Plus配置
mybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 搜索指定包别名typeAliasesPackage: com.ruoyi.**.domain# 配置mapper的扫描,找到所有的mapper.xml映射文件mapperLocations: classpath*:mapper/**/*Mapper.xml

 至此,mybatis-plus改造完成

2.增加 lombok

pom文件内容如下:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version>
</dependency>

3.mysql版本调整

这步有需要调整,没需要可以不调整:在ruoyi-admin/pom.xml
 

<!-- Mysql驱动包 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.16</version><scope>runtime</scope>
</dependency>

4.增加Knife4j

Knife4j的前身是swagger-bootstrap-ui,可以让swagger显示更加优美

4.1 修改pom

<!-- knife4j -->
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>

4.2 修改配置 

在SwaggerConfig中修改内容

/*** 创建API*/
@Bean
public Docket createRestApi()
{return new Docket(DocumentationType.OAS_30)// 是否启用Swagger.enable(enabled)// 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息).apiInfo(apiInfo())// 设置哪些接口暴露给Swagger展示.select()// 扫描所有有注解的api,用这种方式更灵活//.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))// 扫描指定包中的swagger注解// .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))// 扫描所有.apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build()/* 设置安全模式,swagger可以设置访问token */.securitySchemes(securitySchemes()).securityContexts(securityContexts()).pathMapping(pathMapping);
}

 4.3 前端改法

 来看效果:

 是不是比一开始的时候好一点

对比一下:

修改的先写这么多,基本上够用了

二、开发说明

1.XxxController

/*** @Author* @Description * @Version 1.0*/
@RestController
@RequestMapping("/freight/freight")
public class FreightBillController extends BaseController {@Autowiredprivate FreightBillService freightBillService;@PostMapping("/selectFreightBillList")public TableDataInfo selectFreightBillList(@RequestBody FreightBillDTO freightBill){startPage();List<FreightBill> areaList = freightBillService.selectFreightBillList(freightBill);return getDataTable(areaList);}@GetMapping("/selectFreightBillById/{id}")public AjaxResult selectFreightBillById(@PathVariable("id") Long id){FreightBill freightBill = freightBillService.selectFreightBillById(id);return AjaxResult.success(freightBill);}/*** 导出【请填写功能名称】列表*/@Log(title = "导出", businessType = BusinessType.EXPORT)@PostMapping("/export")@ResponseBodypublic AjaxResult export(@RequestBody FreightBillDTO freightBill){List<FreightBill> list = freightBillService.selectFreightBillList(freightBill);ExcelUtil<FreightBill> util = new ExcelUtil<FreightBill>(FreightBill.class);return util.exportExcel(list, "XX数据");}/*** 新增保存*/@Log(title = "XX新增", businessType = BusinessType.INSERT)@PostMapping("/add")@ResponseBodypublic AjaxResult addSave(@RequestBody FreightBillDTO freightBill){freightBillService.insertFreightBill(freightBill);return success();}/*** 修改保存*/@Log(title = "修改XX", businessType = BusinessType.UPDATE)@PostMapping("/updateFreightBill")@ResponseBodypublic AjaxResult updateFreightBill(@RequestBody FreightBillDTO freightBill){freightBillService.updateFreightBill(freightBill);return success();}/*** 删除*/@Log(title = "删除XX", businessType = BusinessType.DELETE)@PostMapping( "/deleteFreightBillByIds")@ResponseBodypublic AjaxResult deleteFreightBillByIds(String ids){freightBillService.deleteFreightBillByIds(ids);return success();}/*** 删除*/@Log(title = "删除XX", businessType = BusinessType.DELETE)@PostMapping( "/deleteFreightBillById")@ResponseBodypublic AjaxResult deleteFreightBillById(Long id){freightBillService.deleteFreightBillById(id);return success();}}

2.XxService

/*** @Author * @Description TODO* @Version 1.0*/
public interface FreightBillService extends IService<FreightBill> {/*** 根据id查询数据** @param id* @return*/public FreightBill selectFreightBillById(Long id);/*** 查询接口* @param freightBill* @return*/List<FreightBill> selectFreightBillList(FreightBillDTO freightBill);/*** 新增【请填写功能名称】** @param freightBill 【请填写功能名称】* @return 结果*/void insertFreightBill(FreightBillDTO freightBill);/*** 修改【请填写功能名称】** @param freightBill 【请填写功能名称】* @return 结果*/void updateFreightBill(FreightBillDTO freightBill);/*** 批量删除【请填写功能名称】** @param ids 需要删除的【请填写功能名称】主键集合* @return 结果*/void deleteFreightBillByIds(String ids);/*** 删除【请填写功能名称】信息** @param id 【请填写功能名称】主键* @return 结果*/boolean deleteFreightBillById(Long id);
}

3.XxServiceImpl

@Service
public class FreightBillServiceImpl extends ServiceImpl<FreightBillMapper, FreightBill> implements FreightBillService {/*** 查询接口** @param freightBill* @return*/@Overridepublic List<FreightBill> selectFreightBillList(FreightBillDTO freightBill) {//根据条件查询数据信息LambdaQueryWrapper<FreightBill> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(FreightBill::getEnableFlag, "0");List<FreightBill> freightBillList = this.list(queryWrapper);return freightBillList;}/*** 查询*/@Overridepublic FreightBill selectFreightBillById(Long id) {LambdaQueryWrapper<FreightBill> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(FreightBill::getEnableFlag, "0");queryWrapper.eq(FreightBill::getId, id);FreightBill freightBill = this.getOne(queryWrapper);return freightBill;}/*** 新增** @return 结果*/@Override@Transactional(rollbackFor = Exception.class)public void insertFreightBill(FreightBillDTO freightBillDTO) {FreightBill freightBill = new FreightBill();BeanUtils.copyProperties(freightBillDTO, freightBill);freightBill.setEnableFlag("0");//将当前用户插入表中SysUser useId = ShiroUtils.getSysUser();freightBill.setUserId(useId.getUserId());freightBill.setUserName(useId.getUserName());this.save(freightBill);}/*** 修改** @return 结果*/@Override@Transactional(rollbackFor = Exception.class)public void updateFreightBill(FreightBillDTO freightBillDTO) {Long id = freightBillDTO.getId();FreightBill freightBill = this.selectFreightBillById(id);if (!ObjectUtils.isEmpty(freightBill)) {BeanUtils.copyProperties(freightBillDTO, freightBill);updateById(freightBill);} else {throw new ServiceException("数据不存在!");}}/*** 批量删除** @return 结果*/@Override@Transactional(rollbackFor = Exception.class)public void deleteFreightBillByIds(String ids) {Long[] freightBillids = Convert.toLongArray(ids);for (Long freightBillid : freightBillids) {this.deleteFreightBillById(freightBillid);}}/*** 删除** @return 结果*/@Override@Transactional(rollbackFor = Exception.class)public boolean deleteFreightBillById(Long id) {boolean deleteFlag = false;FreightBill freightBill = this.selectFreightBillById(id);if (!ObjectUtils.isEmpty(freightBill)) {freightBill.setEnableFlag("2");deleteFlag = updateById(freightBill);} else {throw new ServiceException("数据不存在!");}return deleteFlag;}
}

4. XxMapper

/*** @Author * @Description TODO* @Version 1.0*/
public interface FreightBillMapper extends BaseMapper<FreightBill> {
}

这里有需要复杂sql操作了,可以在这里写,然后service中引用,我这里给的是极简的示例,仅供参考!

5.XxVO

/*** @Author * @Description TODO* @Version 1.0*/
@Data
@TableName("freight_bill")
public class FreightBill {private static final long serialVersionUID = 1L;/** 主键 */@TableField("id")@TableId(type= IdType.AUTO)private Long id;/** XX */@Excel(name = "车辆类型")@TableField("cartype")private String cartype;}

基本上就是这么用的,仅供参考啊

三、PostMan调用示例

备注:我用的单机版做的示例,按照自己的版本进行调整

把页面上的cookie拿过来放到headers中通过权限校验

 

 调用完成!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生Kubernetes:对外服务之 Ingress

目录 一、理论 1.Ingress 2.部署 nginx-ingress-controller(第一种方式) 3.部署 nginx-ingress-controller(第二种方式) 二、实验 1.部署 nginx-ingress-controller(第一种方式) 2.部署 nginx-ingress-controller(第二种方式) 三、问题 1.启动 nginx-ingress-controll…

Selenium Web自动化测试 —— 高级控件交互方法!

一、使用场景 使用场景对应事件复制粘贴键盘事件拖动元素到某个位置鼠标事件鼠标悬停鼠标事件滚动到某个元素滚动事件使用触控笔点击触控笔事件&#xff08;了解即可&#xff09; https://www.selenium.dev/documentation/webdriver/actions_api 二、ActionChains解析 实例…

iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程

文章目录 一、环境准备二、基础软件三、扩展&#xff1a;usb拓展插件 一、环境准备 1、下载VMware虚拟机的壳子&#xff0c;安装并注册软件(可以百度注册码)&#xff0c;最新版本&#xff1a;v17 2、下MacOS系统iOS镜像文件&#xff0c;用于vmware虚拟机安装&#xff0c;当前镜…

油猴(篡改猴)学习记录

第一个Hello World 注意点:默认只匹配了http网站,如果需要https网站,需要自己添加match https://*/*代码如下 这样子访问任意网站就可以输出Hello World // UserScript // name 第一个脚本 // namespace http://tampermonkey.net/ // version 0.1 // descri…

ElasticSearch(二)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;…

钢轨长度及允许偏差

声明 本文是学习GB-T 2585-2021 铁路用热轧钢轨. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了铁路用钢轨的订货内容、分类、尺寸、外形、质量及允许偏差、技术要求、试验方法、检 验规则、标志及质量证明书。 本标准适用于3…

MySQL ——多表连接查询

一、&#xff08;左、右和全&#xff09;连接概念 内连接&#xff1a; 假设A和B表进行连接&#xff0c;使用内连接的话&#xff0c;凡是A表和B表能够匹配上的记录查询出来。A和B两张表没有主付之分&#xff0c;两张表是平等的。 关键字&#xff1a;inner join on 语句&#xf…

css实现Chrome标签栏

如图这是一个特殊的带有圆角的导航栏&#xff0c;实现这种效果并不难 这是我实现的效果&#xff1a; 淡一点的就是鼠标悬停的样式 以下是代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><m…

分类预测 | MATLAB实现SSA-FS-SVM麻雀算法同步优化特征选择结合支持向量机分类预测

分类预测 | MATLAB实现SSA-FS-SVM麻雀算法同步优化特征选择结合支持向量机分类预测 目录 分类预测 | MATLAB实现SSA-FS-SVM麻雀算法同步优化特征选择结合支持向量机分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现SSA-FS-SVM麻雀算法同步优化特征选择结…

使用 PyTorch 的计算机视觉简介 (3/6)

一、说明 在本单元中&#xff0c;我们将了解卷积神经网络&#xff08;CNN&#xff09;&#xff0c;它是专门为计算机视觉设计的。 卷积层允许我们从图像中提取某些图像模式&#xff0c;以便最终分类器基于这些特征。 二、卷积神经网络 计算机视觉不同于通用分类&#xff0c;因…

echarts 地图 visualMap 图例点击事件监听

一、切换位置 二、切换监听 // 切换事件监听 this.myChart.off(datarangeselected); // 为了不触发两次 this.myChart.on(datarangeselected,(e) > {// visualMap change });// 配置如下 visualMap: {type: piecewise,showLabel: true,inverse: true,pieces: [{value: 1,…

为什么大力推行国密算法SSL证书

国密算法SSL证书是一种采用我国自主研发的SM2公钥算法体系&#xff0c;支持SM2、SM3、SM4等国产密码算法及国密SSL安全协议的数字证书。相比于普通SSL证书&#xff0c;国密SSL证书具有以下特点&#xff1a; 自主可控&#xff1a;国密SSL证书采用我国自主研发的SM2公钥算法体系&…

STM32实现PMBus从机程序

最近在野火的STM32F103VET6开发板上实现PMBus从机程序&#xff0c;这个程序参考了以下这篇博客的关于使用中断法实现I2C从机程序&#xff1a;STM32设置为I2C从机模式_iic从机_柒壹漆的博客-CSDN博客 &#xff0c;实测这个程序是可以正常运行的&#xff0c;感谢博主的分享&#…

对标8155体验,降本20%以上!这家企业用“量产”证明

智能座舱逐渐成为智能汽车标配。 根据高工智能汽车研究院监测的数据显示&#xff0c;2022年中国市场&#xff08;不含进出口&#xff09;乘用车搭载智能数字座舱&#xff08;大屏语音车联网OTA&#xff09;前装标配交付795.05万辆&#xff0c;同比增长40.59%&#xff0c;前装搭…

[python 刷题] 84 Largest Rectangle in Histogram

[python 刷题] 84 Largest Rectangle in Histogram 题目&#xff1a; Given an array of integers heights representing the histogram’s bar height where the width of each bar is 1, return the area of the largest rectangle in the histogram. 这题也是一个典型的 mo…

微调大型语言模型(一):为什么要微调(Why finetune)?

今天我们来学习Deeplearning.ai的在线课程 微调大型语言模型(一)的第一课&#xff1a;为什么要微调(Why finetune)。 我们知道像GPT-3.5这样的大型语言模型(LLM)它所学到的知识截止到2021年9月&#xff0c;那么如果我们向ChatGPT询问2022年以后发生的事情&#xff0c;它可能会…

diff算法面试题

面试题&#xff1a;请阐述vue的diff算法 参考回答&#xff1a; 当组件创建和更新时&#xff0c;vue均会执行内部的update函数&#xff0c;该函数使用render函数生成的虚拟dom树&#xff0c;将新旧两树进行对比&#xff0c;找到差异点&#xff0c;最终更新到真实dom 对比差异的过…

轻松上手Docker:学习如何创建和运行自己的Docker容器

文章目录 轻松上手Docker&#xff1a;学习如何创建和运行自己的Docker容器容器的介绍Docker的技术架构容器的工作机制&#xff08;Docker&#xff09;容器的关键技术 - NamespaceNamespace隔离说明 容器的关键技术 - CgroupDocker环境搭建1&#xff09;安装基础软件包2&#xf…

python安全工具开发笔记(四)——python网络编程

一、C/S架构 什么是C/S架构 C : Client S : Server。客户机和服务器结构。 Server 唯一的目的就是等待Client 的请求&#xff0c;Client 连上 Server 发送必要的数据&#xff0c;然后等待Server端完成请求的反馈。 C/S网络编程 Server端进行设置&#xff0c;首先创建一个通信…

【unity2023打包安卓工程】踩坑记录

这里写自定义目录标题 踩坑记录使用环境Unity的准备工作Windows10 SDKAndroidstudio第一个需要注意的地方第二个需要注意的地方第三个需要注意的地方第四个需要注意的地方第五个需要注意的地方第六个需要注意的 其他unity启动缓慢 更新更新一 2023.9.27 踩坑记录 踩了快一个星期…