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


     背景

    若依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

    1. <dependency>
    2. <groupId>com.baomidou</groupId>
    3. <artifactId>mybatis-plus-boot-starter</artifactId>
    4. <version>3.4.2</version>
    5. </dependency>

    1.2 修改配置类

    增加 MybatisPlusConfig.java,并注释掉 MyBatisConfig

    内容如下:

    1. package com.ruoyi.framework.config;
    2. import com.baomidou.mybatisplus.annotation.DbType;
    3. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    4. import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
    5. import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
    6. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    7. import org.springframework.context.annotation.Bean;
    8. import org.springframework.context.annotation.Configuration;
    9. import org.springframework.transaction.annotation.EnableTransactionManagement;
    10. /**
    11. * Mybatis Plus 配置
    12. */
    13. @EnableTransactionManagement(proxyTargetClass = true)
    14. @Configuration
    15. public class MybatisPlusConfig
    16. {
    17. @Bean
    18. public MybatisPlusInterceptor mybatisPlusInterceptor()
    19. {
    20. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    21. // 分页插件
    22. interceptor.addInnerInterceptor(paginationInnerInterceptor());
    23. // 乐观锁插件
    24. interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
    25. // 阻断插件
    26. interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
    27. return interceptor;
    28. }
    29. /**
    30. * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
    31. */
    32. public PaginationInnerInterceptor paginationInnerInterceptor()
    33. {
    34. PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
    35. // 设置数据库类型为mysql
    36. paginationInnerInterceptor.setDbType(DbType.MYSQL);
    37. // 设置最大单页限制数量,默认 500 条,-1 不受限制
    38. paginationInnerInterceptor.setMaxLimit(-1L);
    39. return paginationInnerInterceptor;
    40. }
    41. /**
    42. * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
    43. */
    44. public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor()
    45. {
    46. return new OptimisticLockerInnerInterceptor();
    47. }
    48. /**
    49. * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
    50. */
    51. public BlockAttackInnerInterceptor blockAttackInnerInterceptor()
    52. {
    53. return new BlockAttackInnerInterceptor();
    54. }
    55. }

     1.3 修改配置文件

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

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

     至此,mybatis-plus改造完成

    2.增加 lombok

    pom文件内容如下:

    1. org.projectlombok
    2. lombok
    3. 1.18.24

    3.mysql版本调整

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

    1.     mysql
    2.     mysql-connector-java
    3.     5.1.16
    4.     runtime

    4.增加Knife4j

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

    4.1 修改pom

    1. com.github.xiaoymin
    2. knife4j-spring-boot-starter
    3. 3.0.3

    4.2 修改配置 

    在SwaggerConfig中修改内容

    1. /**
    2. * 创建API
    3. */
    4. @Bean
    5. public Docket createRestApi()
    6. {
    7. return new Docket(DocumentationType.OAS_30)
    8. // 是否启用Swagger
    9. .enable(enabled)
    10. // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
    11. .apiInfo(apiInfo())
    12. // 设置哪些接口暴露给Swagger展示
    13. .select()
    14. // 扫描所有有注解的api,用这种方式更灵活
    15. //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
    16. // 扫描指定包中的swagger注解
    17. // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
    18. // 扫描所有
    19. .apis(RequestHandlerSelectors.any())
    20. .paths(PathSelectors.any())
    21. .build()
    22. /* 设置安全模式,swagger可以设置访问token */
    23. .securitySchemes(securitySchemes())
    24. .securityContexts(securityContexts())
    25. .pathMapping(pathMapping);
    26. }

     4.3 前端改法

     来看效果:

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

    对比一下:

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

    二、开发说明

    1.XxxController

    1. /**
    2. * @Author
    3. * @Description
    4. * @Version 1.0
    5. */
    6. @RestController
    7. @RequestMapping("/freight/freight")
    8. public class FreightBillController extends BaseController {
    9. @Autowired
    10. private FreightBillService freightBillService;
    11. @PostMapping("/selectFreightBillList")
    12. public TableDataInfo selectFreightBillList(@RequestBody FreightBillDTO freightBill)
    13. {
    14. startPage();
    15. List areaList = freightBillService.selectFreightBillList(freightBill);
    16. return getDataTable(areaList);
    17. }
    18. @GetMapping("/selectFreightBillById/{id}")
    19. public AjaxResult selectFreightBillById(@PathVariable("id") Long id)
    20. {
    21. FreightBill freightBill = freightBillService.selectFreightBillById(id);
    22. return AjaxResult.success(freightBill);
    23. }
    24. /**
    25. * 导出【请填写功能名称】列表
    26. */
    27. @Log(title = "导出", businessType = BusinessType.EXPORT)
    28. @PostMapping("/export")
    29. @ResponseBody
    30. public AjaxResult export(@RequestBody FreightBillDTO freightBill)
    31. {
    32. List list = freightBillService.selectFreightBillList(freightBill);
    33. ExcelUtil util = new ExcelUtil(FreightBill.class);
    34. return util.exportExcel(list, "XX数据");
    35. }
    36. /**
    37. * 新增保存
    38. */
    39. @Log(title = "XX新增", businessType = BusinessType.INSERT)
    40. @PostMapping("/add")
    41. @ResponseBody
    42. public AjaxResult addSave(@RequestBody FreightBillDTO freightBill)
    43. {
    44. freightBillService.insertFreightBill(freightBill);
    45. return success();
    46. }
    47. /**
    48. * 修改保存
    49. */
    50. @Log(title = "修改XX", businessType = BusinessType.UPDATE)
    51. @PostMapping("/updateFreightBill")
    52. @ResponseBody
    53. public AjaxResult updateFreightBill(@RequestBody FreightBillDTO freightBill)
    54. {
    55. freightBillService.updateFreightBill(freightBill);
    56. return success();
    57. }
    58. /**
    59. * 删除
    60. */
    61. @Log(title = "删除XX", businessType = BusinessType.DELETE)
    62. @PostMapping( "/deleteFreightBillByIds")
    63. @ResponseBody
    64. public AjaxResult deleteFreightBillByIds(String ids)
    65. {
    66. freightBillService.deleteFreightBillByIds(ids);
    67. return success();
    68. }
    69. /**
    70. * 删除
    71. */
    72. @Log(title = "删除XX", businessType = BusinessType.DELETE)
    73. @PostMapping( "/deleteFreightBillById")
    74. @ResponseBody
    75. public AjaxResult deleteFreightBillById(Long id)
    76. {
    77. freightBillService.deleteFreightBillById(id);
    78. return success();
    79. }
    80. }

    2.XxService

    1. /**
    2. * @Author
    3. * @Description TODO
    4. * @Version 1.0
    5. */
    6. public interface FreightBillService extends IService {
    7. /**
    8. * 根据id查询数据
    9. *
    10. * @param id
    11. * @return
    12. */
    13. public FreightBill selectFreightBillById(Long id);
    14. /**
    15. * 查询接口
    16. * @param freightBill
    17. * @return
    18. */
    19. List selectFreightBillList(FreightBillDTO freightBill);
    20. /**
    21. * 新增【请填写功能名称】
    22. *
    23. * @param freightBill 【请填写功能名称】
    24. * @return 结果
    25. */
    26. void insertFreightBill(FreightBillDTO freightBill);
    27. /**
    28. * 修改【请填写功能名称】
    29. *
    30. * @param freightBill 【请填写功能名称】
    31. * @return 结果
    32. */
    33. void updateFreightBill(FreightBillDTO freightBill);
    34. /**
    35. * 批量删除【请填写功能名称】
    36. *
    37. * @param ids 需要删除的【请填写功能名称】主键集合
    38. * @return 结果
    39. */
    40. void deleteFreightBillByIds(String ids);
    41. /**
    42. * 删除【请填写功能名称】信息
    43. *
    44. * @param id 【请填写功能名称】主键
    45. * @return 结果
    46. */
    47. boolean deleteFreightBillById(Long id);
    48. }

    3.XxServiceImpl

    1. @Service
    2. public class FreightBillServiceImpl extends ServiceImpl implements FreightBillService {
    3. /**
    4. * 查询接口
    5. *
    6. * @param freightBill
    7. * @return
    8. */
    9. @Override
    10. public List selectFreightBillList(FreightBillDTO freightBill) {
    11. //根据条件查询数据信息
    12. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    13. queryWrapper.eq(FreightBill::getEnableFlag, "0");
    14. List freightBillList = this.list(queryWrapper);
    15. return freightBillList;
    16. }
    17. /**
    18. * 查询
    19. */
    20. @Override
    21. public FreightBill selectFreightBillById(Long id) {
    22. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    23. queryWrapper.eq(FreightBill::getEnableFlag, "0");
    24. queryWrapper.eq(FreightBill::getId, id);
    25. FreightBill freightBill = this.getOne(queryWrapper);
    26. return freightBill;
    27. }
    28. /**
    29. * 新增
    30. *
    31. * @return 结果
    32. */
    33. @Override
    34. @Transactional(rollbackFor = Exception.class)
    35. public void insertFreightBill(FreightBillDTO freightBillDTO) {
    36. FreightBill freightBill = new FreightBill();
    37. BeanUtils.copyProperties(freightBillDTO, freightBill);
    38. freightBill.setEnableFlag("0");
    39. //将当前用户插入表中
    40. SysUser useId = ShiroUtils.getSysUser();
    41. freightBill.setUserId(useId.getUserId());
    42. freightBill.setUserName(useId.getUserName());
    43. this.save(freightBill);
    44. }
    45. /**
    46. * 修改
    47. *
    48. * @return 结果
    49. */
    50. @Override
    51. @Transactional(rollbackFor = Exception.class)
    52. public void updateFreightBill(FreightBillDTO freightBillDTO) {
    53. Long id = freightBillDTO.getId();
    54. FreightBill freightBill = this.selectFreightBillById(id);
    55. if (!ObjectUtils.isEmpty(freightBill)) {
    56. BeanUtils.copyProperties(freightBillDTO, freightBill);
    57. updateById(freightBill);
    58. } else {
    59. throw new ServiceException("数据不存在!");
    60. }
    61. }
    62. /**
    63. * 批量删除
    64. *
    65. * @return 结果
    66. */
    67. @Override
    68. @Transactional(rollbackFor = Exception.class)
    69. public void deleteFreightBillByIds(String ids) {
    70. Long[] freightBillids = Convert.toLongArray(ids);
    71. for (Long freightBillid : freightBillids) {
    72. this.deleteFreightBillById(freightBillid);
    73. }
    74. }
    75. /**
    76. * 删除
    77. *
    78. * @return 结果
    79. */
    80. @Override
    81. @Transactional(rollbackFor = Exception.class)
    82. public boolean deleteFreightBillById(Long id) {
    83. boolean deleteFlag = false;
    84. FreightBill freightBill = this.selectFreightBillById(id);
    85. if (!ObjectUtils.isEmpty(freightBill)) {
    86. freightBill.setEnableFlag("2");
    87. deleteFlag = updateById(freightBill);
    88. } else {
    89. throw new ServiceException("数据不存在!");
    90. }
    91. return deleteFlag;
    92. }
    93. }

    4. XxMapper

    1. /**
    2. * @Author
    3. * @Description TODO
    4. * @Version 1.0
    5. */
    6. public interface FreightBillMapper extends BaseMapper {
    7. }

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

    5.XxVO

    1. /**
    2. * @Author
    3. * @Description TODO
    4. * @Version 1.0
    5. */
    6. @Data
    7. @TableName("freight_bill")
    8. public class FreightBill {
    9. private static final long serialVersionUID = 1L;
    10. /** 主键 */
    11. @TableField("id")
    12. @TableId(type= IdType.AUTO)
    13. private Long id;
    14. /** XX */
    15. @Excel(name = "车辆类型")
    16. @TableField("cartype")
    17. private String cartype;
    18. }

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

    三、PostMan调用示例

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

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

     

     调用完成!

  • 相关阅读:
    SAP Business One二次开发:解锁潜力,实现定制化需求
    【LangChain学习之旅】—(11) 记忆:通过Memory记住用户上次的对话细节
    springboot基于微信小程序的宿舍管理系统毕业设计源码
    ffmpeg转YUV打死都不行
    淘宝/天猫API接口,item_sku - 淘宝商品SKU详细信息查询,淘宝/天猫获取sku详细信息 API 返回值说明
    qt 使用qt_material库打包报错 ImportError: cannot import name ‘uic‘ from ‘PyQt5‘
    kuangbin专题一 简单搜索
    UT_hash实现增删改查
    10 个鲜为人知的 Python 可视化概念和技巧
    问道管理:历史市净率在哪看?
  • 原文地址:https://blog.csdn.net/Alex_81D/article/details/132090289