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

若依官方代码生成的文档–> 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语句.

执行会报错

1
2
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后端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@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脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 菜单 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中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
* 构造树型结构数据
* @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层实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* 查询分类列表
*
* @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

1
public class Categories extends TreeEntity

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

主子表增删改查

TODO

遇到了再说

个人博客