title: 若依代码生成教程及生成代码详解
author: 红豆刨冰
若依官方代码生成的文档–> https://doc.ruoyi.vip/ruoyi/document/htsc.html#%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90
官方文档太过简略,对新手不友好
单表增删改查
1.表生成
设计表
表的设计一定要详细完善,考虑周到,这样不用返工
插入示例数据
2.目录生成
2.1菜单生成
路由地址–>我也不知道干啥用
2.2编辑代码生成配置
在系统工具代码生成中,点击导入,导入对应的数据表,进入编辑页面
字段信息这边,如果在创建数据表就已经完善,这边便无需修改
生成模板–>单表的增删改查
生成包路径–>对应自己写的代码的包路径
生成模块名–>前端的模块名,与后端无关
生成业务名–>后端controller类上@RequestMapping 请求路径
生成功能名–>用作类描述
上级菜单–>选生图管理
2.3代码导入执行
生成的文件
sql脚本在sys_menu中添加菜单和按钮
将这些代码粘贴到对应位置,重启前端和后端服务,并执行sql语句.
执行会报错
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
是mapper层没有加注解@Mapper,加上即可
最后运行代码看到效果
2.4前端优化
在自动生成代码的基础上,可以做一些自己的修改
这里我对显示url不满意
使用el-image组件,将图片url预览出来
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前端代码
树表增删改查
1.表生成
2.目录生成
2.1编辑代码生成配置
2.2代码导入执行
代码导入步骤同单表.
效果如下
2.3前端优化
可见,树形的下拉分类已经实现,但是第一列显示父类id
修改index.vue
修改后效果如上
3.代码详解
查询list方法
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;
}
实体类Categories
public class Categories extends TreeEntity
Categories继承了TreeEntity,TreeEntity中有parentId属性
主子表增删改查
TODO
遇到了再说