讲师模块
1.数据库设计
#
# Structure for table "edu_teacher"
#
CREATE TABLE `edu_teacher` (
`id` char(19) NOT NULL COMMENT '讲师ID',
`name` varchar(20) NOT NULL COMMENT '讲师姓名',
`intro` varchar(500) NOT NULL DEFAULT '' COMMENT '讲师简介',
`career` varchar(500) DEFAULT NULL COMMENT '讲师资历,一句话说明讲师',
`level` int(10) unsigned NOT NULL COMMENT '头衔 1高级讲师 2首席讲师',
`avatar` varchar(255) DEFAULT NULL COMMENT '讲师头像',
`sort` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
`is_deleted` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '逻辑删除 1(true)已删除, 0(false)未删除',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
`gmt_modified` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='讲师';
#
# Data for table "edu_teacher"
#
INSERT INTO `edu_teacher` VALUES ('1','张三','近年主持国家自然科学基金(6项)、江苏省重大科技成果转化项目(5项)、江苏省产学研前瞻性联合研究项目(3项)、省工业科技支撑、省高技术、省自然科学基金等省部级及其企业的主要科研项目40多个,多个项目在企业成功转化,产生了较好的经济、社会和环境效益。积极开展产学研科技合作,并与省内16家企业建立了江苏省研究生工作站,其中6家为江苏省优秀研究生工作站','高级',1,'https://guli-file-190513.oss-cn-beijing.aliyuncs.com/avatar/default.jpg',0,0,'2019-10-30 14:18:46','2019-11-12 13:36:36'),('1189389726308478977','晴天','高级讲师简介','高级讲师资历',2,'https://online-teach-file.oss-cn-beijing.aliyuncs.com/teacher/2019/10/30/de47ee9b-7fec-43c5-8173-13c5f7f689b2.png',1,0,'2019-10-30 11:53:03','2019-10-30 11:53:03'),('1189390295668469762','李刚','高级讲师简介','高级讲师',2,'https://online-teach-file.oss-cn-beijing.aliyuncs.com/teacher/2019/10/30/b8aa36a2-db50-4eca-a6e3-cc6e608355e0.png',2,0,'2019-10-30 11:55:19','2019-11-12 13:37:52'),('1189426437876985857','王二','高级讲师简介','高级讲师',1,'https://online-teach-file.oss-cn-beijing.aliyuncs.com/teacher/2019/11/08/e44a2e92-2421-4ea3-bb49-46f2ec96ef88.png',0,0,'2019-10-30 14:18:56','2019-11-12 13:37:35'),('1189426464967995393','王五','高级讲师简介','高级讲师',1,'https://online-teach-file.oss-cn-beijing.aliyuncs.com/teacher/2019/10/30/65423f14-49a9-4092-baf5-6d0ef9686a85.png',0,0,'2019-10-30 14:19:02','2019-11-12 13:37:18'),('1192249914833055746','李四','高级讲师简介','高级讲师',1,'https://online-teach-file.oss-cn-beijing.aliyuncs.com/teacher/2019/11/07/91871e25-fd83-4af6-845f-ea8d471d825d.png',0,0,'2019-11-07 09:18:25','2019-11-12 13:37:01'),('1192327476087115778','1222-12-12','1111','11',1,'https://online-teach-file.oss-cn-beijing.aliyuncs.com/teacher/2019/11/08/5805c6cd-c8ad-4a77-aafd-d2e083bfd8a4.png',0,1,'2019-11-07 14:26:37','2019-11-11 16:26:26'),('1195337453429129218','test','sdfsdf','sdfdf',1,'https://guli-file-190513.oss-cn-beijing.aliyuncs.com/avatar/default.jpg',0,1,'2019-11-15 21:47:12','2019-11-15 21:47:27');
2.项目中配置数据源信息
application.properties文件
# 服务端口
server.port=8001
# 服务名
spring.application.name=service-edu
# 环境设置:dev、test、prod
spring.profiles.active=dev
# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/onlineducation?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
3.配置Mybatis-Plus代码生成器
MyBatis_Plus_Util
文件
package com.atguigu.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;
/**
* @author
* @since
*/
public class MyBatis_Plus_Util {
@Test
public void run() {
// 1、创建代码生成器
AutoGenerator mpg = new AutoGenerator();
// 2、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir("C:\\Users\\lenovo\\Desktop\\项目源码\\day02\\guli_parent\\service\\service_edu" + "/src/main/java");
gc.setAuthor("taotao");
gc.setOpen(false); //生成后是否打开资源管理器
gc.setFileOverride(false); //重新生成时文件是否覆盖
//UserServie
gc.setServiceName("%sService"); //去掉Service接口的首字母I
gc.setIdType(IdType.ID_WORKER_STR); //主键策略
gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
gc.setSwagger2(true);//开启Swagger2模式
mpg.setGlobalConfig(gc);
// 3、数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/onlineeducation?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 4、包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("eduservice"); //模块名
//包 com.drj.eduservice
pc.setParent("com.drj");
//包 com.drj.eduservice.controller
pc.setController("controller");
pc.setEntity("entity");
pc.setService("service");
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
// 5、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("edu_teacher");
strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
strategy.setRestControllerStyle(true); //restful api风格控制器
strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
mpg.setStrategy(strategy);
// 6、执行
mpg.execute();
}
}
4.项目结构
5.创建启动类
package com.drj.eduservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Program: guli_parent
* @Description
* @Author: 涛涛 * ^ *
* @Create: 2021-01-14 23:40
**/
@SpringBootApplication
public class EduApplication {
public static void main(String[] args) {
SpringApplication.run(EduApplication.class, args);
}
}
6.创建Mapper扫描工具类
package com.drj.eduservice.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
/**
* @Program: guli_parent
* @Description
* @Author: 涛涛 * ^ *
* @Create: 2021-01-14 23:43
**/
@Configuration
@MapperScan("com.drj.eduservice.mapper")
public class EduConfig {
}
7.查删操作
RESTFUL风格
方法 | 注解 | 方法名 | 请求方式 |
---|---|---|---|
查全部 | @GetMapping | getAllXXX | GET |
查单个 | @GetMapping | getOne{} | GET{ID} |
删除 | @DeleteMapping | removeById{} | DELETE{ID} |
添加 | @PostMapping | insert | POST |
修改 | @PutMapping | update{} | PUT{ID} |
package com.drj.eduservice.controller;
import com.drj.commonutils.R;
import com.drj.eduservice.entity.EduTeacher;
import com.drj.eduservice.service.EduTeacherService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* 讲师 前端控制器
* </p>
*
* @author taotao
* @since 2021-01-14
*/
@Api(description = "讲师模块")
@RestController
@RequestMapping("/eduservice/edu-teacher")
public class EduTeacherController {
@Autowired
EduTeacherService eduTeacherService;
/**
* 获取全部的讲师信息
*
* @return 讲师信息的List集合
*/
@ApiOperation(value = "获取全部")
@GetMapping("/getAllTeacher")
public R getAllTeacher() {
return R.ok()
.data("teacherList", eduTeacherService.list(null))
.data("total",eduTeacherService.list(null).size());
}
/**
* 获取单个的讲师信息
*
* @param id 主键
* @return 讲师信息
*/
@ApiOperation(value = "获取单个")
@GetMapping("{id}")
public R getOneTeacher(
@ApiParam(name = "ID", value = "讲师ID", required = true)
@PathVariable String id) {
return R.ok().data("teacherOne", eduTeacherService.getById(id));
}
/**
* 删除单个
* 步骤:
* 1.添加逻辑删除的配置
* 2.实体类中的逻辑删除的isDeleted属性添加@TableLogic注解
*
* @param id 主键
* @return 是否删除成功
*/
@ApiOperation(value = "L删除单个")
@DeleteMapping("{id}")
public R removeById(
@ApiParam(name = "ID", value = "讲师ID", required = true)
@PathVariable String id) {
if (eduTeacherService.removeById(id)) {
return R.ok();
}
return R.error();
}
}
讲师模块呢整体来说是很简单的,这里用来测试环境,以及配置一些别的集成测试使用
8.分页查
1.分页插件
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
2.分页
@ApiOperation(value = "分页讲师列表")
@GetMapping("{page}/{limit}")
public R pageList(
@ApiParam(name = "page", value = "当前页码", required = true)
@PathVariable Long page,
@ApiParam(name = "limit", value = "每页记录数", required = true)
@PathVariable Long limit){
Page<EduTeacher> pageParam = new Page<>(page, limit);
eduTeacherService.page(pageParam, null);
List<EduTeacher> records = pageParam.getRecords();
long total = pageParam.getTotal();
return R.ok().data("total", total).data("rows", records);
}
3.测试
9.分页条件查
@ApiOperation(value = "分页条件讲师列表")
@PostMapping("/PaginationCondition/{page}/{limit}")
public R pageQuery(
@ApiParam(name = "page", value = "当前页码", required = true)
@PathVariable Long page,
@ApiParam(name = "limit", value = "每页记录数", required = true)
@PathVariable Long limit,
@ApiParam(name = "eduTeacherVO", value = "查询对象", required = false)
@RequestBody(required = false) EduTeacherVO eduTeacherVO) {
//创建Page对象
Page<EduTeacher> eduTeacherPage = new Page<>(page, limit);
System.out.println(page);
System.out.println(limit);
//构建条件
QueryWrapper<EduTeacher> eduTeacherQueryWrapper = new QueryWrapper<>();
//获取结果
String begin = eduTeacherVO.getBegin();
String end = eduTeacherVO.getEnd();
Integer level = eduTeacherVO.getLevel();
String name = eduTeacherVO.getName();
//判断非空
if(!StringUtils.isEmpty(name)){
eduTeacherQueryWrapper.like("name",name);
}
if(!StringUtils.isEmpty(level)){
eduTeacherQueryWrapper.eq("level",level);
}
if(!StringUtils.isEmpty(begin)){
eduTeacherQueryWrapper.ge("gmt_create",begin);
}
if(!StringUtils.isEmpty(end)){
eduTeacherQueryWrapper.le("gmt_modified",end);
}
eduTeacherService.page(eduTeacherPage, eduTeacherQueryWrapper);
long total = eduTeacherPage.getTotal();
List<EduTeacher> records = eduTeacherPage.getRecords();
return R.ok()
.data("total", total)
.data("items", records);
}
10.新增
10.1.自动填充
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
10.2.自动填充配置类
package com.drj.servicebase.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 自动填充配置类
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//属性名称,不是字段名称
this.setFieldValByName("gmtCreate", new Date(), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
}
controller的新增方法
/**
* 添加讲师
* @param eduTeacher
* @return
*/
@ApiOperation(value = "新增讲师")
@PostMapping()
public R insertTeacher(
@ApiParam(name = "eduTeacher", value = "讲师对象", required = false)
@RequestBody EduTeacher eduTeacher) {
if (eduTeacherService.save(eduTeacher)) {
return R.ok();
}
return R.error();
}
测试数据
{
"avatar": "https://online-teach-file.oss-cn-beijing.aliyuncs.com/teacher/2019/11/08/5805c6cd-c8ad-4a77-aafd-d2e083bfd8a4.png",
"career": "高级讲师",
"intro": "高级讲师简介",
"isDeleted": 0,
"level": 0,
"name": "清流02",
"sort": 0
}
11.修改
11.1.先根据讲师ID进行查询
/**
* 获取单个的讲师信息
*
* @param id 主键
* @return 讲师信息
*/
@ApiOperation(value = "获取单个")
@GetMapping("{id}")
public R getOneTeacher(
@ApiParam(name = "ID", value = "讲师ID", required = true)
@PathVariable String id) {
return R.ok().data("teacherOne", eduTeacherService.getById(id));
}
11.2.根据讲师ID进行修改
/**
* 修改讲师信息
*
* @param eduTeacher
* @return
*/
@ApiOperation(value = "ID修改讲师")
@PutMapping("{id}")
public R updateTeacher(
@ApiParam(name = "id", value = "讲师ID", required = false)
@PathVariable String id,
@ApiParam(name = "eduTeacher", value = "讲师对象", required = false)
@RequestBody EduTeacher eduTeacher) {
eduTeacher.setId(id);
if (eduTeacherService.updateById(eduTeacher)) {
return R.ok();
}
return R.error();
}
测试
讲师模块呢,整体的一个模块内的功能是一下的内容