若依代码生成教程及生成代码详解


title: 若依代码生成教程及生成代码详解
author: 红豆刨冰

若依官方代码生成的文档–> https://doc.ruoyi.vip/ruoyi/document/htsc.html#%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90

官方文档太过简略,对新手不友好

单表增删改查

1.表生成

设计表

表的设计一定要详细完善,考虑周到,这样不用返工

image-20240813153637400

插入示例数据

image-20240815111701734

2.目录生成

2.1菜单生成

image-20240813154024960

路由地址–>我也不知道干啥用

2.2编辑代码生成配置

在系统工具代码生成中,点击导入,导入对应的数据表,进入编辑页面

image-20240813162141875

image-20240813162206292

字段信息这边,如果在创建数据表就已经完善,这边便无需修改

image-20240813162423865

生成模板–>单表的增删改查

生成包路径–>对应自己写的代码的包路径

生成模块名–>前端的模块名,与后端无关

生成业务名–>后端controller类上@RequestMapping 请求路径

生成功能名–>用作类描述

上级菜单–>选生图管理

2.3代码导入执行

生成的文件

image-20240813163849233

sql脚本在sys_menu中添加菜单和按钮

将这些代码粘贴到对应位置,重启前端和后端服务,并执行sql语句.

执行会报错

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)

是mapper层没有加注解@Mapper,加上即可

最后运行代码看到效果

image-20240813164909408

2.4前端优化

在自动生成代码的基础上,可以做一些自己的修改

这里我对显示url不满意

image-20240813165149476

使用el-image组件,将图片url预览出来
image-20240813165521321

3.代码详解

3.1后端代码

@RestController
@RequestMapping("/models")
public class SdModelsController extends BaseController
{
    @Autowired
    private ISdModelsService sdModelsService;

    /**
     * 查询SD模型库列表
     */
    @RequiresPermissions("mj:models:list")
    @GetMapping("/list")
    public TableDataInfo list(SdModels sdModels)
    {
        startPage();
        List<SdModels> list = sdModelsService.selectSdModelsList(sdModels);
        return getDataTable(list);
    }
  ...
}

@RequestMapping(“/models”)

models便是上文提到过的模块业务名

SdModelsController继承了BaseController–>web层通用数据处理

方法上有@RequiresPermissions进行权限认

startPage() 设置请求分页数据

查询和搜索用了同一个方法,请求都是list,携带参数不同

SdModels sdModels是由Spring自动创建并填充的,它从HTTP请求中获取数据,并通过Spring的自动数据绑定机制将这些数据注入到SdModels对象中

3.2 sql脚本

-- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库', '1081', '1', 'models', 'mj/models/index', 1, 0, 'C', '0', '0', 'mj:models:list', '#', 'admin', sysdate(), '', null, 'SD模型库菜单');

-- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID();

-- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库查询', @parentId, '1',  '#', '', 1, 0, 'F', '0', '0', 'mj:models:query',        '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库新增', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', 'mj:models:add',          '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库修改', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', 'mj:models:edit',         '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库删除', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', 'mj:models:remove',       '#', 'admin', sysdate(), '', null, '');

insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
values('SD模型库导出', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', 'mj:models:export',       '#', 'admin', sysdate(), '', null, '');

建立菜单用的

3.3前端代码

image-20240815144513145

image-20240815144557044

image-20240815144621388

树表增删改查

1.表生成

image-20240816110251110

2.目录生成

2.1编辑代码生成配置

image-20240816110457013

image-20240816110507599

image-20240816110808655

2.2代码导入执行

image-20240816110953585

代码导入步骤同单表.

效果如下

image-20240816111138154

2.3前端优化

可见,树形的下拉分类已经实现,但是第一列显示父类id

修改index.vue

image-20240816111311687

修改后效果如上

3.代码详解

查询list方法

image-20240816114228885

image-20240816141945758

handleTree 函数的作用是将平面结构的树形数组数据转换为嵌套的树形结构,写在/utils/ruoyi.js中

/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 */
export function handleTree(data, id, parentId, children) {
  let config = {
    id: id || 'id',
    parentId: parentId || 'parentId',
    childrenList: children || 'children'
  };

  var childrenListMap = {};
  var nodeIds = {};
  var tree = [];

  // 构建 childrenListMap 和 nodeIds
  for (let d of data) {
    let parentId = d[config.parentId];
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = [];
    }
    nodeIds[d[config.id]] = d;
    childrenListMap[parentId].push(d);
  }

  // 构建根节点
  for (let d of data) {
    let parentId = d[config.parentId];
    if (nodeIds[parentId] == null) {
      //如果节点的父节点为null即为根节点
      tree.push(d);
    }
  }

  // 递归构建子节点
  for (let t of tree) {
    adaptToChildrenList(t);
  }

  function adaptToChildrenList(o) {
    //如果有子节点,添加进去
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]];
    }
    //如果子节点不为null,则遍历子节点,再递归调用adaptToChildrenList
    if (o[config.childrenList]) {
      for (let c of o[config.childrenList]) {
        adaptToChildrenList(c);
      }
    }
  }
  return tree;
}

变量解释

  • config: 用来存储函数内部使用的字段名称配置。

  • childrenListMap: 用来存储每个节点的子节点列表,键是父节点的 id,值是一个数组,包含了所有该父节点的直接子节点。

  • nodeIds: 用来存储所有节点的映射,键是节点的 id,值是节点对象。

  • tree: 用来存储最终的树结构根节点

原本使用父类id进行查询,只会返回儿子

修改查询的service层实现

 /**
     * 查询分类列表
     *
     * @param categories 分类信息,包含查询条件
     * @return 所有符合条件的分类列表,包括所有子分类
     */
    @Override
    public List<Categories> selectCategoriesList(Categories categories) {
        if (categories.getParentId() == null) {
            return categoriesMapper.selectCategoriesList(categories);
        }
        // 首先获取顶层分类列表
        List<Categories> topCategories = categoriesMapper.selectCategoriesList(categories);

        // 创建一个列表用于存储所有分类,包括子分类
        List<Categories> allCategories = new ArrayList<>();

        // 对每个顶层分类进行递归查询
        for (Categories category : topCategories) {
            allCategories.add(category);
            // 递归查找子分类并加入到列表中
            allCategories.addAll(getAllSubCategories(category));
        }

        return allCategories;
    }

    /**
     * 递归获取所有子分类
     *
     * @param parentCategory 父分类
     * @return 所有子分类列表
     */
    private List<Categories> getAllSubCategories(Categories parentCategory) {
        // 创建一个列表用于存储子分类
        List<Categories> subCategories = new ArrayList<>();

        // 创建查询条件,查找该父分类的所有子分类
        Categories query = new Categories();
        query.setParentId(parentCategory.getId());
        List<Categories> childCategories = categoriesMapper.selectCategoriesList(query);

        // 对每个子分类进行递归查询
        for (Categories childCategory : childCategories) {
            subCategories.add(childCategory);
            subCategories.addAll(getAllSubCategories(childCategory));
        }

        return subCategories;
    }

image-20240816155331461

实体类Categories

public class Categories extends TreeEntity

Categories继承了TreeEntity,TreeEntity中有parentId属性

主子表增删改查

TODO

遇到了再说

个人博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值