在线教育项目学习day2

项目第二天内容介绍:

​ 1、前后端分离开发概念

​ 2、讲师管理模块(后端)crud

1、创建application.properties配置文件

2、编写controller service mpper代码内容

mp提供代码生成器,生成相关代码

一、前后端分离开发

前端:html、css、js、jq 主要作用:数据显示

后端:controller、service、mapper 主要作用:返回数据或者操作数据

二、搭建项目环境

1)、创建数据库,创建讲师数据库表

在这里插入图片描述

2)、数据库设计规约

以下规约只针对本模块,更全面的文档参考《阿里巴巴Java开发手册》:五、MySQL数据库

1、库名与应用名称尽量一致

2、表名、字段名必须使用小写字母或数字,禁止出现数字开头,

3、表名不使用复数名词

4、表的命名最好是加上“业务名称_表的作用”。如,edu_teacher

5、表必备三字段:id, gmt_create, gmt_modified

说明:

其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。

(如果使用分库分表集群部署,则id类型为verchar,非自增,业务中使用分布式id生成器)

gmt_create, gmt_modified 的类型均为 datetime 类型,前者现在时表示主动创建,后者过去分词表示被 动更新。

6、单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

7、表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint (1 表示是,0 表示否)。

说明:任何字段如果为非负数,必须是 unsigned。

注意:POJO 类中的任何布尔类型的变量,都不要加 is 前缀。数据库表示是与否的值,使用 tinyint 类型,坚持 is_xxx 的 命名方式是为了明确其取值含义与取值范围。

正例:表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除。

8、小数类型为 decimal,禁止使用 float 和 double。 说明:float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不 正确的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数分开存储。

9、如果存储的字符串长度几乎相等,使用 char 定长字符串类型。

10、varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。

11、唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。

说明:uk_ 即 unique key;idx_ 即 index 的简称

12、不得使用外键与级联,一切外键概念必须在应用层解决。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

3)、创建项目结构

创建父工程 (pom类型 管理依赖版本和放公共依赖)

子模块一

​ 子子模块一讲师管理模块

​ 子子模块二数据分析模块

子模块二

​ 。 。 。

在线教育项目学习day2_第1张图片

模块说明

guli-parent:在线教学根目录(父工程),管理四个子模块:

canal-client:canal数据库表同步模块(统计同步数据)

common:公共模块父节点

common-util:工具类模块,所有模块都可以依赖于它

service-base:service服务的base包,包含service服务的公共配置类,所有service模块依赖于它

spring-security:认证与授权模块,需要认证授权的service服务依赖于它

infrastructure:基础服务模块父节点

api-gateway:api网关服务

service:api接口服务父节点

service-acl:用户权限管理api接口服务(用户管理、角色管理和权限管理等)

service-cms:cms api接口服务

service-edu:教学相关api接口服务

service-msm:短信api接口服务

service-order:订单相关api接口服务

service-oss:阿里云oss api接口服务

service-statistics:统计报表api接口服务

service-ucenter:会员api接口服务

service-vod:视频点播api接口服务

4)、创建父工程

1、创建springboot工程guli-parent

在线教育项目学习day2_第2张图片

2、删除src目录

在线教育项目学习day2_第3张图片

3、配置pom文件

<groupId>com.atguigugroupId>
<artifactId>guli_parentartifactId>
<packaging>pompackaging>//添加
<version>0.0.1-SNAPSHOTversion>
<name>guli_parentname>
<description>Demo project for Spring Bootdescription>

4、在pom.xml中添加依赖的版本
首先先删除
在线教育项目学习day2_第4张图片

添加确定的版本

<properties>
    <java.version>1.8java.version>
    <guli.version>0.0.1-SNAPSHOTguli.version>
    <mybatis-plus.version>3.0.5mybatis-plus.version>
    <velocity.version>2.0velocity.version>
    <swagger.version>2.7.0swagger.version>
    <aliyun.oss.version>2.8.3aliyun.oss.version>
    <jodatime.version>2.10.1jodatime.version>
    <poi.version>3.17poi.version>
    <commons-fileupload.version>1.3.1commons-fileupload.version>
    <commons-io.version>2.6commons-io.version>
    <httpclient.version>4.5.1httpclient.version>
    <jwt.version>0.7.0jwt.version>
    <aliyun-java-sdk-core.version>4.3.3aliyun-java-sdk-core.version>
    <aliyun-sdk-oss.version>3.1.0aliyun-sdk-oss.version>
    <aliyun-java-sdk-vod.version>2.15.2aliyun-java-sdk-vod.version>
    <aliyun-java-vod-upload.version>1.4.11aliyun-java-vod-upload.version>
    <aliyun-sdk-vod-upload.version>1.4.11aliyun-sdk-vod-upload.version>
    <fastjson.version>1.2.28fastjson.version>
    <gson.version>2.8.2gson.version>
    <json.version>20170516json.version>
    <commons-dbutils.version>1.7commons-dbutils.version>
    <canal.client.version>1.1.0canal.client.version>
    <docker.image.prefix>zxdocker.image.prefix>
    <cloud-alibaba.version>0.2.2.RELEASEcloud-alibaba.version>
properties>

配置依赖的版本

<dependencyManagement>
    <dependencies>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-dependenciesartifactId>
            <version>Hoxton.RELEASEversion>
            <type>pomtype>
            <scope>importscope>

        dependency>

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-alibaba-dependenciesartifactId>
            <version>${cloud-alibaba.version}version>
            <type>pomtype>
            <scope>importscope>
        dependency>
        
        <dependency>
            <groupId>com.baomidougroupId>
            <artifactId>mybatis-plus-boot-starterartifactId>
            <version>${mybatis-plus.version}version>
        dependency>
        
        <dependency>
            <groupId>org.apache.velocitygroupId>
            <artifactId>velocity-engine-coreartifactId>
            <version>${velocity.version}version>
        dependency>


        
        <dependency>
            <groupId>io.springfoxgroupId>
            <artifactId>springfox-swagger2artifactId>
            <version>${swagger.version}version>
        dependency>
        
        <dependency>
            <groupId>io.springfoxgroupId>
            <artifactId>springfox-swagger-uiartifactId>
            <version>${swagger.version}version>
        dependency>
        

        <dependency>
            <groupId>com.aliyun.ossgroupId>
            <artifactId>aliyun-sdk-ossartifactId>
            <version>${aliyun.oss.version}version>
        dependency>
        
        <dependency>
            <groupId>joda-timegroupId>
            <artifactId>joda-timeartifactId>
            <version>${jodatime.version}version>
        dependency>

        

        <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poiartifactId>
            <version>${poi.version}version>
        dependency>
        
        <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poi-ooxmlartifactId>
            <version>${poi.version}version>
        dependency>

        
        <dependency>
            <groupId>commons-fileuploadgroupId>
            <artifactId>commons-fileuploadartifactId>
            <version>${commons-fileupload.version}version>
        dependency>
        
        <dependency>
            <groupId>commons-iogroupId>
            <artifactId>commons-ioartifactId>
            <version>${commons-io.version}version>
        dependency>
        
        <dependency>
            <groupId>org.apache.httpcomponentsgroupId>
            <artifactId>httpclientartifactId>
            <version>${httpclient.version}version>
        dependency>
        <dependency>
            <groupId>com.google.code.gsongroupId>
            <artifactId>gsonartifactId>
            <version>${gson.version}version>
        dependency>
        
        <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwtartifactId>
            <version>${jwt.version}version>
        dependency>
        
        <dependency>
            <groupId>com.aliyungroupId>
            <artifactId>aliyun-java-sdk-coreartifactId>
            <version>${aliyun-java-sdk-core.version}version>
        dependency>
        <dependency>
            <groupId>com.aliyun.ossgroupId>
            <artifactId>aliyun-sdk-ossartifactId>
            <version>${aliyun-sdk-oss.version}version>
        dependency>
        <dependency>
            <groupId>com.aliyungroupId>
            <artifactId>aliyun-java-sdk-vodartifactId>
            <version>${aliyun-java-sdk-vod.version}version>
        dependency>
        <dependency>
            <groupId>com.aliyungroupId>
            <artifactId>aliyun-java-vod-uploadartifactId>
            <version>${aliyun-java-vod-upload.version}version>
        dependency>
        <dependency>
            <groupId>com.aliyungroupId>
            <artifactId>aliyun-sdk-vod-uploadartifactId>
            <version>${aliyun-sdk-vod-upload.version}version>
        dependency>
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>fastjsonartifactId>
            <version>${fastjson.version}version>
        dependency>
        <dependency>
            <groupId>org.jsongroupId>
            <artifactId>jsonartifactId>
            <version>${json.version}version>
        dependency>
        <dependency>
            <groupId>commons-dbutilsgroupId>
            <artifactId>commons-dbutilsartifactId>
            <version>${commons-dbutils.version}version>
        dependency>
        <dependency>
            <groupId>com.alibaba.ottergroupId>
            <artifactId>canal.clientartifactId>
            <version>${canal.client.version}version>
        dependency>
    dependencies>
dependencyManagement>

5)创建maven子工程service

1、 节点后面添加 pom类型

<artifactId>serviceartifactId>
<packaging>pompackaging>

2、添加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-ribbonartifactId>
    dependency>
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
    dependency>
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
    
    <dependency>
        <groupId>com.baomidougroupId>
        <artifactId>mybatis-plus-boot-starterartifactId>
    dependency>
    
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
    dependency>
    

    <dependency>
        <groupId>org.apache.velocitygroupId>
        <artifactId>velocity-engine-coreartifactId>
    dependency>

    
    <dependency>
        <groupId>io.springfoxgroupId>
        <artifactId>springfox-swagger2artifactId>
    dependency>
    <dependency>
        <groupId>io.springfoxgroupId>
        <artifactId>springfox-swagger-uiartifactId>
    dependency>
    
    <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
    dependency>

    
    <dependency>
        <groupId>org.apache.poigroupId>
        <artifactId>poiartifactId>
    dependency>

    <dependency>
        <groupId>org.apache.poigroupId>
        <artifactId>poi-ooxmlartifactId>
    dependency>
    <dependency>
        <groupId>commons-fileuploadgroupId>
        <artifactId>commons-fileuploadartifactId>
    dependency>
    
    <dependency>
        <groupId>org.apache.httpcomponentsgroupId>
        <artifactId>httpclientartifactId>
    dependency>
    
    <dependency>
        <groupId>commons-iogroupId>
        <artifactId>commons-ioartifactId>
    dependency>
    
    <dependency>
        <groupId>com.google.code.gsongroupId>
        <artifactId>gsonartifactId>
    dependency>
    <dependency>
        <groupId>junitgroupId>
        <artifactId>junitartifactId>
        <version>4.12version>
    dependency>
dependencies>

刚开始要先注释掉这些依赖,暂时用不到,不然会报错


6)创建maven项目service_edu子子模块

在线教育项目学习day2_第5张图片

1、在resource中新建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/guli?serverTimezone=GMT%2B8

spring.datasource.username=root

spring.datasource.password=root


#mybatis日志

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

2、创建mp代码生成器(放在test中即可)

不要求会写,会改即可

package com.atguitu.test;

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 2018/12/13
 */
public class CodeGenerator {

    @Test
    public void run() {

        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("testjava");
        gc.setOpen(false); //生成后是否打开资源管理器
        gc.setFileOverride(false); //重新生成时文件是否覆盖
        gc.setServiceName("%sService");    //去掉Service接口的首字母I
        gc.setIdType(IdType.ID_WORKER); //主键策略
        gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
        gc.setSwagger2(true);//开启Swagger2模式

        mpg.setGlobalConfig(gc);

        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/guli");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("edu"); //模块名
        pc.setParent("com.example.demo");
        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();
    }
}

修改:

gc.setOutputDir("E:\\ideaworkspace\\guli_parent\\service\\service_edu" + "/src/main/java");//输出目录
dsc.setUrl("jdbc:mysql://localhost:3306/guli?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
//会生成com.atguigu.eduservice的包
pc.setModuleName("eduservice"); //模块名
pc.setParent("com.atguigu");

运行之后

在线教育项目学习day2_第6张图片

1、创建controller

//把service注入
@Autowired
private EduTeacherService eduTeacherService;
//查询讲师表所有数据
 // rest风格
 @GetMapping("findAll")
public List<EduTeacher> findAll(){
     //通过调用service的方法实现查询的所有操作
     List<EduTeacher> list = eduTeacherService.list(null);
     return list;
 }

2、创建启动类

@SpringBootApplication
public class EduApplication {
    public static void main(String[] args) {
        SpringApplication.run(EduApplication.class,args);
    }
}

3、创建配置类config

@Configuration
@MapperScan("com.atguigu.eduservice.mapper")
public class EduConfig {
}

4、最终测试

启动主类

在线教育项目学习day2_第7张图片

返回时间格式需要修改

在这里插入图片描述

在application.properties中添加

#返回json的全局时间格式

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

三、讲师逻辑删除功能

1、配置逻辑删除插件

/**

逻辑删除插件
*/
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}

2、在isdeleted属性上面添加注解

@TableLogic

3、编写controller

 //逻辑删除讲师的方法
@DeleteMapping("{id}")//id值需要通过路径传
public boolean removeTeacher(@PathVariable String id){
    boolean flag = eduTeacherService.removeById(id);
    return flag;
}

4、测试删除

两种方法测试:

​ 1)、swagger2

​ 2)、postman

四、swagger2

前后端分离开发模式中,api文档是最好的沟通方式。

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。

​ 及时性 (接口变更后,能够及时准确地通知相关前后端开发人员)

​ 规范性 (并且保证接口的规范性,如接口的地址,请求方式,参数及响应格式和错误信息)

​ 一致性 (接口信息一致,不会出现因开发人员拿到的文档版本不一致,而出现分歧)

​ 可测性 (直接在接口文档上进行测试,以方便理解业务)

1、创建公共模块

在线教育项目学习day2_第8张图片

2、依赖

<artifactId>commonartifactId>
<packaging>pompackaging>
<dependencies>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
        <scope>provided scope>
    dependency>
    
    <dependency>
        <groupId>com.baomidougroupId>
        <artifactId>mybatis-plus-boot-starterartifactId>
        <scope>provided scope>
    dependency>
    
    <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
        <scope>provided scope>
    dependency>
    
    <dependency>
        <groupId>io.springfoxgroupId>
        <artifactId>springfox-swagger2artifactId>
        <scope>provided scope>
    dependency>
    <dependency>
        <groupId>io.springfoxgroupId>
        <artifactId>springfox-swagger-uiartifactId>
        <scope>provided scope>
    dependency>
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-redisartifactId>
    dependency>
    
dependencies>

4、删除src

5、在common下创建service_base

在线教育项目学习day2_第9张图片

6、创建swagger的配置类

创建包com.atguigu.servicebase.config,创建类SwaggerConfig

@Configuration//配置类
@EnableSwagger2//swagger注解
public class SwaggerConfig {
    @Bean
    public Docket webApiConfig(){
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("webApi")
                .apiInfo(webApiInfo())
                .select()
                .paths(Predicates.not(PathSelectors.regex("/admin/.*")))
                .paths(Predicates.not(PathSelectors.regex("/error.*")))
                .build();
    }

    
    private ApiInfo webApiInfo(){
        return new ApiInfoBuilder()
                .title("网站-课程中心API文档")
                .description("本文档描述了课程中心微服务接口定义")
                .version("1.0")
                .contact(new Contact("Helen", "http://atguigu.com", "[email protected]"))
                .build();
    }
}

具体使用:

1、在service的pom.xml中添加

<dependency>
    <groupId>com.atguigugroupId>
    <artifactId>service_baseartifactId>
    <version>0.0.1-SNAPSHOTversion>
dependency>

2、在主类中添加注解

@ComponentScan(basePackages = {"com.atguigu"})

3、启动主类

启动eduapplication后访问localhost:8001/swagger-ui.html
4、api提示

@Api(description="讲师管理")
@RestController
@RequestMapping("/serviceedu/edu-teacher")
public class EduTeacherController {
    @Autowired
    private EduTeacherService eduTeacherService;

    //查询所有讲师
    @ApiOperation(value = "所有讲师列表")
    @GetMapping("findAll")
    public List<EduTeacher> list(){
        List<EduTeacher> list = eduTeacherService.list(null);
        return list;
    }

    //逻辑删除讲师的方法
    @ApiOperation(value = "逻辑删除讲师")
    @DeleteMapping("{id}")//id值需要通过路径传
    public boolean removeTeacher(@ApiParam(name="id",value = "讲师ID",required = true) @PathVariable String id){
        boolean flag = eduTeacherService.removeById(id);
        return flag;
    }

}

五、统一返回数据格式

项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致、轻松。

一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码、返回消息、数据这几部分内容

例如,我们的系统要求返回的基本数据格式如下:

列表:

{

  "success": true,

  "code": 20000,

  "message": "成功",

  "data": {

    "items": [

      {

        "id": "1",

        "name": "刘德华",

      "intro": "毕业于师范大学数学系,热爱教育事业,执教数学思维6年有余"

     }

    ]

  }
}

分页:

{

 "success": true,

  "code": 20000,

  "message": "成功",

  "data": {"total": 17,"rows": [{"id": "1","name": "刘德华","intro": "毕业于师范大学数学系,热爱教育事业,执教数学思维6年有余"}]

  }

}

没有返回数据:

{

  "success": true,

  "code": 20000,

  "message": "成功",

  "data": {}

}

失败:

{

 "success": false,

  "code": 20001,

  "message": "失败",

  "data": {}

}

因此,我们定义统一结果

{

  "success": 布尔, //响应是否成功

  "code": 数字, //响应码

  "message": 字符串, //返回消息

  "data": HashMap //返回数据,放在键值对中

}

第一步:在common模块中创建子模块 common_utils
在线教育项目学习day2_第10张图片
第二步:创建interface,定义数据返回状态码
成功 20000

失败 20001
新建一个包
在线教育项目学习day2_第11张图片

public static Integer SUCCESS = 20000;//成功
public static Integer ERROR = 20001;//失败

第三步:定义返回数据格式

新建一个类

@Data
public class R {

    @ApiModelProperty(value = "是否成功")
    private Boolean success;

    @ApiModelProperty(value = "返回码")
    private Integer code;

    @ApiModelProperty(value = "返回消息")
    private String message;

    @ApiModelProperty(value = "返回数据")

    private Map<String, Object> data = new HashMap<String, Object>();
    //把构造方法私有化
    private R(){}
        //成功静态方法
        public static  R ok(){
            R r=new R();
            r.setSuccess(true);
            r.setCode(ResultCode.SUCCESS);
            r.setMessage("成功");
            return r;
        }
        //失败
    public static  R error(){
        R r=new R();
        r.setSuccess(true);
        r.setCode(ResultCode.ERROR);
        r.setMessage("失败");
        return r;
    }
    public R success(Boolean success){
        this.setSuccess(success);
        return this;
    }
    
    public R message(String message){
        this.setMessage(message);
        return this;
    }
    
    public R code(Integer code){
        this.setCode(code);
        return this;
    }
    
    public R data(String key, Object value){
        this.data.put(key, value);
        return this;
    }
    
    public R data(Map<String, Object> map){
        this.setData(map);
        return this;
    }
}

六、统一返回数据使用

1、在service的pom.xml中添加依赖

dependency>
    <groupId>com.examplegroupId>
    <artifactId>common_utilsartifactId>
    <version>0.0.1-SNAPSHOTversion>
dependency>

2、修改Controller中的返回结果

//查询所有讲师
@ApiOperation(value = "所有讲师列表")
@GetMapping("findAll")
public R list(){
    List<EduTeacher> list = eduTeacherService.list(null);
    return R.ok().data("items",list);
}

//逻辑删除讲师的方法
@ApiOperation(value = "逻辑删除讲师")
@DeleteMapping("{id}")//id值需要通过路径传
public R removeTeacher(@ApiParam(name="id",value = "讲师ID",required = true) @PathVariable String id){
    boolean flag = eduTeacherService.removeById(id);
   if(flag){
       return R.ok();
   }else {
       return R.error();
   }
}

七、后台讲师模块-分页查询

1、配置mp分页查询

/**

*分页插件
   */
@Bean
 public PaginationInterceptor paginationInterceptor() {
 return new PaginationInterceptor();
 }

2、编写分页查询的代码

//分页查询讲师的方法
//current代表当前页,limit代表每页记录数
@GetMapping("pageTeacher/{current}/{limit}")
public R pageListTeacher(@PathVariable long current,
                         @PathVariable long limit){
    //创建page对象
    Page<EduTeacher> pageTeacher=new Page<>(current,limit);
    //调用方法实现分页
    //调用方法底层会做封装,把分页数据封装到pageTeacher中
    eduTeacherService.page(pageTeacher,null);
    long total = pageTeacher.getTotal();//总记录数
    List<EduTeacher> records = pageTeacher.getRecords();//数据list集合

    return R.ok().data("total",total).data("rows",records);
}

八、条件查询分页

第一步:

把条件值传递到接口里面

把条件值封装到对象里面,把对象传递到接口里面

在实体类中新建TeacherQuery
在线教育项目学习day2_第12张图片

@Data
public class TeacherQuery {private static final long serialVersionUID = 1L;

@ApiModelProperty(value = "教师名称,模糊查询")
private String name;

@ApiModelProperty(value = "头衔 1高级讲师 2首席讲师")
private Integer level;

@ApiModelProperty(value = "查询开始时间", example = "2019-01-01 10:10:10")
private String begin;//注意,这里使用的是String类型,前端传过来的数据无需进行类型转换

@ApiModelProperty(value = "查询结束时间", example = "2019-12-01 10:10:10")
private String end;

}

第二步:

 	编写controller
 //条件查询带分页的方法
   @GetMapping("pageTeacherCondition/{current}/{limit}")
   public R pageTeacherCondition(@PathVariable long current,
                                 @PathVariable long limit,
                           @RequestBody(required=false) TeacherQuery teacherQuery){
       //创建page对象
       Page<EduTeacher> pageTeacher=new Page<>(current,limit );
       //构建条件
       QueryWrapper<EduTeacher> wrapper=new QueryWrapper<>();
       //多条件组合查询
       //mybatis学过动态sql
       String name=teacherQuery.getName();
       Integer level=teacherQuery.getLevel();
       String begin=teacherQuery.getBegin();
       String end=teacherQuery.getEnd();
       //判断条件值是否为空,如果不为空拼接条件
      if(!StringUtils.isEmpty(name)){
         //构建条件
         wrapper.like("name",name);
      }
       if(!StringUtils.isEmpty(level)){
           wrapper.eq("level",level);
       }
       if(!StringUtils.isEmpty(begin)){
         wrapper.ge("gmt_create",begin);//column与表中一致
       }
       if(!StringUtils.isEmpty(end)){
           wrapper.le("gmt_modified",end);
       }

       
       //调用方法实现分页查询
       eduTeacherService.page(pageTeacher,wrapper  );
       long total = pageTeacher.getTotal();//总记录数
       List<EduTeacher> records = pageTeacher.getRecords();//数据list集合

       return R.ok().data("total",total).data("rows",records);
   }

@requestbody(需要使用post提交方式)

使用json传递数据,把json数据封装到对应的对象里面

@responsebody

返回数据,返回json数据
在线教育项目学习day2_第13张图片

九、自动填充封装

添加讲师

1、先在实体类中添加注解

@ApiModelProperty(value = "创建时间")
@TableField(fill= FieldFill.INSERT)
private Date gmtCreate;


@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;

2、在service_base中添加

创建包handler,创建自动填充类MyMetaObjectHandler

@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);
    }
}

3、编写controller

 //添加讲师的接口
@PostMapping("addTeacher")
public R addTeacher(@RequestBody EduTeacher eduTeacher){
    boolean save = eduTeacherService.save(eduTeacher);
    if(save){
        return R.ok();
    }else {
        return R.error();
    }
}

十、修改讲师

1、根据讲师id进行查询

//根据讲师id进行查询
@GetMapping("getTeacher/{id}")
public R getTeacher(@PathVariable String id){
    EduTeacher eduTeacher = eduTeacherService.getById(id);
    return R.ok().data("teacher",eduTeacher);
    
}

2、讲师修改

//讲师修改
@PostMapping("updateTeacer")
public R updateTeacher(@RequestBody EduTeacher eduTeacher){
    boolean flag = eduTeacherService.updateById(eduTeacher);
    if(flag){
        return R.ok();
    }else {
        return R.error();
    }
}

3、在swagger中修改讲师

{
  "avatar": "string",
  "career": "string",

  "id": "1",
  "intro": "string",
  "isDeleted": false,
  "level": 0,
  "name": "玉藻前",
  "sort": 0
}

十一、统一异常处理

1、新建类

在线教育项目学习day2_第14张图片

2、编写代码

@ControllerAdvice
public class GlobalExceptionHandler {
    //指定出现什么异常执行这个方法
    @ExceptionHandler(Exception.class)
    //为了返回数据
    @ResponseBody
    public R error(Exception e){
        e.printStackTrace();
        return R.error().message("执行了全局异常处理");
    }
}

3、添加common的依赖


    
    com.example
    common_util
    0.0.1-SNAPSHOT


4、删除service_edu中的依赖

  
    com.example
    common_util
    0.0.1-SNAPSHOT

依赖传递

service_base引入common_utils的依赖

service_edu引入service_base的依赖

你可能感兴趣的:(在线教育项目)