芋道源码快速入门【新手篇】
学习目标:
- 快速了解框架结构
- 快速开发crud简单项目【单表】
- 快速开发crud复杂项目【多表】
- 了解掌握框架中的注解
学习内容:
- 同步芋道项目,并安装项目涉及工具(redis)
- 快速上手crud简单项目【单表】
- 快速上手crud复杂项目【多表】
- 分析源码,了解并使用相关注解
学习时间:
- 周一至周五晚上 1小时
- 周六上午 9 点-下午 18 点
- 周日上午 9 点-下午 18 点
学习产出:
一、同步项目
从芋道官网同步项目:芋道源码: 为开源继绝学,我辈义不容辞!
https://gitee.com/yudaocode 这边同步的是 yudao-boot-mini 这个项目,因为是初学者,我这边选了个简单的,方便入门。

idea同步代码时注意,需要先在本地下载git

同步下来的代码如下【其中yudao-ui 是前端项目,其余项目模块均是后台】

二、项目分析
同步完项目,简单分析一下项目结构(这边只对一些我们目前用到的模块进行说明)
核心如下:
yudao-dependencies
|
| Maven 依赖版本管理 |
管理整个项目的依赖版本

yudao-framework
|
| Java 框架拓展(包含工具类、以及一些组件) |

举例:
1、yudao-common模块
通用工具类,包含各种校验方法、固定的枚举值封装、通用返回封装、异常方法封装、分页/导出方法等,如下图所示:

2、yudao-spring-boot-starter-biz-data-permission 模块
通过注解(@DataPermission)实现数据权限控制:
例如:
@DataPermission(enable = true) // 启用数据权限
public class UserController {
// ...
}
3、yudao-spring-boot-starter-excel 模块
通过注解(@ExcelProperty)实现数据导出:
@Excel(name = "用户列表")
public class UserExcelVO {
@ExcelProperty("用户编号")
private Long id;
@ExcelProperty("用户名称")
private String name;
@ExcelProperty(value = "性别", converter = DictConvert.class)
@DictFormat("sys_user_sex") // 数据字典转换
private Integer sex;
}
4、yudao-spring-boot-starter-mybatis 模块
通过深度整合 MyBatis-Plus,提供了更加强大和便捷的数据库操作能力,同时保持了良好的扩展性,是 Yudao Framework 数据持久层的核心组件。
例如:
比如说下面这个查询方法,这边就直接调用了该模块封装的公共方法,来实现数据的查询(包括条件的like、between、order排序,直接从对象中获取参数进行数据及逻辑组装,无需写任何sql,比较方便)

yudao-module-system
yudao-module-system | 系统功能的 Module 模块 |

我们的主要实现业务逻辑 都是放在这块 yudao-module-system-biz, 所以着重讲解一下这边目前用到的
yudao-module-system-biz ├── api (接口定义层) ├── controller (Web接口层) ├── service (业务服务层) └── dal (数据访问层)
yudao-server
yudao-server | 管理后台的服务端 |

yudao-server 是 Yudao Framework 的主启动模块,负责整合所有子模块(如 system、bpm、pay 等),提供统一的启动入口和全局配置。其核心作用包括:
-
应用装配:通过 Spring Boot 的自动配置机制组装各模块【通过@SpringBootApplication(scanBasePackages = **-server) 扫描相关模块,并进行启动】。

-
全局依赖管理:定义父 POM 统一管理依赖版本。
-
部署单元:生成可执行的 Spring Boot Jar 包。
-
生产级配置:集成监控、健康检查、性能优化等生产环境所需的组件。
三、项目部署启动
先启动redis,保证redis已启动。


点击启动



四、crud简单项目【单表】
代码结构(主要是后台代码结构)
yudao-module-system
├── controller (接口定义层)
├──admin
├──group
├──vo()
├── GroupPageReqVO(分页查询请求参数 实体类)
├── GroupRespVO(返回内容 实体类)
├── GroupSaveReqVO(保存/修改 请求参数 实体类)
├── GroupController(接口调用)
├── service (业务服务层)
├── Group
├── GroupServiceImpl.java(Service 方法实现 具体逻辑)
├── GroupService.java(Service接口)
├── dal (数据访问层)
├── Group
├── GroupDO.java(实体类)
├── GroupMapper.java(继承mabatis模块中的方法,实现业务逻辑,比如说分页查询)
└── config (配置类) —— GroupMapper.xml
(XML配置用于复杂查询sql实现,一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可 。无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL)
首先要在前台配置菜单:
先配置菜单

再配置按钮,配置相关权限

以导出功能,代码为例,
@Operation(summary = "导出系统组 Excel") : 接口的简短摘要(必填)
@PreAuthorize("@ss.hasPermission('system:group:export')") : 权限校验,根据按钮配置的权限标识来,必须一致
@ApiAccessLog(operateType = EXPORT) :用于记录 API 访问日志的自定义注解
@GetMapping("/export-excel")
@Operation(summary = "导出系统组 Excel")
@PreAuthorize("@ss.hasPermission('system:group:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportGroupExcel(@Valid GroupPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<GroupDO> list = groupService.getGroupPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "系统组.xls", "数据", GroupRespVO.class,
BeanUtils.toBean(list, GroupRespVO.class));
}
配置完成后,重启服务,即可使用。
最终效果图:

在充分理解上述代码结构,如何运行的基础上。
就可以 用 yudao 自带的单表crud代码生成功能(无需人工写这类单一代码了):
第一步:先创建表:
CREATE TABLE `system_group` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '组ID,主键',
`group_name` varchar(50) NOT NULL COMMENT '组名称',
`group_code` varchar(30) NOT NULL COMMENT '组编码,唯一标识',
`description` varchar(255) DEFAULT NULL COMMENT '组描述',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除:0-未删除,1-已删除',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
`creator` varchar(255) DEFAULT NULL,
`updater` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_code` (`group_code`),
KEY `idx_group_name` (`group_name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='系统组表';
第二步:导入

第三步::编辑+生成代码

配置CRUD的字段条件


点击预览,可以预览一下,自动生成的代码 有没有问题:

没有问题的话,点击生成代码,到本地即可。
sql直接运行--->不需要手工建菜单。


注:code编码 需 +1000 递增、
例如
五、crud复杂项目【多表】
yudao-module-system
├── controller (接口定义层)
├──admin
├──student
├──vo()
├── StudentPageReqVO(分页查询请求参数 实体类)
├── StudentRespVO(返回内容 实体类)
├── StudentSaveReqVO(保存/修改 请求参数 实体类)
├── StudentController(接口调用)├── service (业务服务层)
├── student
├── StudentServiceImpl.java(Service 方法实现 具体逻辑)
├── StudentService.java(Service接口)
├── dal (数据访问层)
├── student
├── StudentDO.java(学生表实体类)
├── StudentCourseDO.java(学生课程表实体类)
├── StudentGradeDO.java(学生班级表实体类)
├── StudentMapper.java(继承mabatis模块中的方法,实现业务逻辑,比如说分页查询)
├── StudentCourseMapper.java(继承mabatis模块中的方法,实现业务逻辑,比如说查询、删除)
├── StudentGradeMapper.java(继承mabatis模块中的方法,实现业务逻辑,比如说查询、删除)
└── config (配置类) —— StudentMapper.xml
(XML配置用于复杂查询sql实现,一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可 。无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL)
先配置菜单,再配置权限,同上单表。
最终效果图:

多表 同样可以使用 yudao 自带的代码生成功能:
注意点:
1、先导入3个表

2、设定好主表,子表即可


最终选择主表生成代码,拷贝进项目即可。
拓展--->分页实现多表关联查询(查询学生时,自动查询出班级信息、课程信息):
1、先在student 实体类加入 两个 关联表的字段===>
@TableField(exist = false) 该注解强调非数据库字段,是关联出来的(这边是直接加到主表上的,实际场景中 可以新增个关联实体类 专门存放这些 多表关联后查询出来的字段)
courseName 课程名称
gradeName 班级名称

2、StudentMapper 新增加多表关联查询方法(有多种方法:例如注解实现复杂查询、XML配置实现复杂查询)
这边用的是芋道 结合 MyBatis Plus 封装的公共方法; MPJBaseMapper 为 MyBatis Plus Join 的基础接口,提供连表 Join 能力。
这个的例子 复杂查询, 实现的是 左关联是
SELECT a.*, b.`name` as gradeName , c.`name` courseName
FROM system_student a
LEFT JOIN system_student_grade b ON a.id = b.student_id
LEFT JOIN system_student_course c ON a.id = c.student_id
注意事项
-
关联方向:确保
leftJoin的关联方向正确leftJoin(关联表.class, 关联表.外键, 主表.主键) -
字段映射:使用
selectAs而不是select来处理不同类型间的字段映射 -
分页参数:确保
StudentPageReqVO包含pageNo和pageSize字段
-
实际使用的时候,支持多种联表方式:
leftJoin(),rightJoin(),innerJoin(),满足一些复杂场景
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)