学习目标:

  • 快速了解框架结构
  • 快速开发crud简单项目【单表】
  • 快速开发crud复杂项目【多表】
  • 了解掌握框架中的注解

学习内容:

  1. 同步芋道项目,并安装项目涉及工具(redis)
  2. 快速上手crud简单项目【单表】
  3. 快速上手crud复杂项目【多表】
  4. 分析源码,了解并使用相关注解

学习时间:

  • 周一至周五晚上  1小时
  • 周六上午 9 点-下午 18 点
  • 周日上午 9 点-下午 18 点

学习产出:

一、同步项目

      从芋道官网同步项目:芋道源码: 为开源继绝学,我辈义不容辞!https://gitee.com/yudaocode  这边同步的是 yudao-boot-mini 这个项目,因为是初学者,我这边选了个简单的,方便入门。

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

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

二、项目分析

同步完项目,简单分析一下项目结构(这边只对一些我们目前用到的模块进行说明)

核心如下:

yudao-dependencies

yudao-dependencies

Maven 依赖版本管理
管理整个项目的依赖版本

yudao-framework

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 的主启动模块,负责整合所有子模块(如 systembpmpay 等),提供统一的启动入口和全局配置。其核心作用包括:

  1. 应用装配:通过 Spring Boot 的自动配置机制组装各模块【通过@SpringBootApplication(scanBasePackages = **-server)  扫描相关模块,并进行启动】。

  2. 全局依赖管理:定义父 POM 统一管理依赖版本。

  3. 部署单元:生成可执行的 Spring Boot Jar 包。

  4. 生产级配置:集成监控、健康检查、性能优化等生产环境所需的组件。

三、项目部署启动

先启动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


注意事项

  1. 关联方向:确保 leftJoin 的关联方向正确

    leftJoin(关联表.class, 关联表.外键, 主表.主键)
  2. 字段映射:使用 selectAs 而不是 select 来处理不同类型间的字段映射

  3. 分页参数:确保 StudentPageReqVO 包含 pageNo 和 pageSize 字段

  • 实际使用的时候,支持多种联表方式:leftJoin()rightJoin()innerJoin(),满足一些复杂场景

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐