广州白云学校网站建设,上海传媒公司排行榜,客户为什么要做网站,qq是腾讯旗下的吗前后端分离开发
前端 html, css, js, jq 主要作用#xff1a;数据显示 ajax后端 controller service mapper 主要作用#xff1a;返回数据或操作数据 接口
讲师管理模块#xff08;后端#xff09;
准备工作
创建数据库#xff0c;创建讲师数据库表
CREATE TABLE edu…前后端分离开发
前端 html, css, js, jq 主要作用数据显示 ajax后端 controller service mapper 主要作用返回数据或操作数据 接口
讲师管理模块后端
准备工作
创建数据库创建讲师数据库表
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 逻辑删除 1true已删除 0false未删除,gmt_create datetime NOT NULL COMMENT 创建时间,gmt_modified datetime NOT NULL COMMENT 更新时间,PRIMARY KEY (id),UNIQUE KEY uk_name (name)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT讲师;创建父工程 pom类型管理版本依赖和公共依赖 springboot工程 子模块1 maven工程 子子模块1 maven工程子子模块2 子模块2
创建项目结构
创建父工程在pom.xml里面加上一个标签将它修改成pom工程 把dependiences删掉放在子模块中父工程只管理版本 添加下面的标签确定依赖版本
propertiesjava.version1.8/java.versionguli.version0.0.1-SNAPSHOT/guli.versionmybatis-plus.version3.0.5/mybatis-plus.versionvelocity.version2.0/velocity.versionswagger.version2.7.0/swagger.versionaliyun.oss.version2.8.3/aliyun.oss.versionjodatime.version2.10.1/jodatime.versionpoi.version3.17/poi.versioncommons-fileupload.version1.3.3/commons-fileupload.versioncommons-io.version2.6/commons-io.versionhttpclient.version4.5.1/httpclient.versionjwt.version0.7.0/jwt.versionaliyun-java-sdk-core.version4.3.3/aliyun-java-sdk-core.versionaliyun-sdk-oss.version3.1.0/aliyun-sdk-oss.versionaliyun-java-sdk-vod.version2.15.2/aliyun-java-sdk-vod.versionaliyun-java-vod-upload.version1.4.11/aliyun-java-vod-upload.versionaliyun-sdk-vod-upload.version1.4.11/aliyun-sdk-vod-upload.versionfastjson.version1.2.28/fastjson.versiongson.version2.8.2/gson.versionjson.version20170516/json.versioncommons-dbutils.version1.7/commons-dbutils.versioncanal.client.version1.1.0/canal.client.versiondocker.image.prefixzx/docker.image.prefixcloud-alibaba.version0.2.2.RELEASE/cloud-alibaba.versionswagger-version2.0.1/swagger-versionproject-version0.0.1-SNAPSHOT/project-version
/properties配置dependencyManagement锁定依赖的版本
dependencyManagementdependencies!--Spring Cloud--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversionHoxton.RELEASE/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency!--mybatis-plus 持久层--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion${mybatis-plus.version}/version/dependency!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 --dependencygroupIdorg.apache.velocity/groupIdartifactIdvelocity-engine-core/artifactIdversion${velocity.version}/version/dependency!--swagger--dependencygroupIdio.springfox/groupIdartifactIdspringfox-swagger2/artifactIdversion${swagger.version}/version/dependency!--swagger ui--dependencygroupIdio.springfox/groupIdartifactIdspringfox-swagger-ui/artifactIdversion${swagger.version}/version/dependency!--aliyunOSS--dependencygroupIdcom.aliyun.oss/groupIdartifactIdaliyun-sdk-oss/artifactIdversion${aliyun.oss.version}/version/dependency!--日期时间工具--dependencygroupIdjoda-time/groupIdartifactIdjoda-time/artifactIdversion${jodatime.version}/version/dependency!--xls--dependencygroupIdorg.apache.poi/groupIdartifactIdpoi/artifactIdversion${poi.version}/version/dependency!--xlsx--dependencygroupIdorg.apache.poi/groupIdartifactIdpoi-ooxml/artifactIdversion${poi.version}/version/dependency!--文件上传--dependencygroupIdcommons-fileupload/groupIdartifactIdcommons-fileupload/artifactIdversion${commons-fileupload.version}/version/dependency!--commons-io--dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion${commons-io.version}/version/dependency!--httpclient--dependencygroupIdorg.apache.httpcomponents/groupIdartifactIdhttpclient/artifactIdversion${httpclient.version}/version/dependencydependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion${gson.version}/version/dependency!-- JWT --dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion${jwt.version}/version/dependency!--aliyun--dependencygroupIdcom.aliyun/groupIdartifactIdaliyun-java-sdk-core/artifactIdversion${aliyun-java-sdk-core.version}/version/dependencydependencygroupIdcom.aliyun.oss/groupIdartifactIdaliyun-sdk-oss/artifactIdversion${aliyun-sdk-oss.version}/version/dependencydependencygroupIdcom.aliyun/groupIdartifactIdaliyun-java-sdk-vod/artifactIdversion${aliyun-java-sdk-vod.version}/version/dependencydependencygroupIdcom.aliyun/groupIdartifactIdaliyun-java-vod-upload/artifactIdversion${aliyun-java-vod-upload.version}/version/dependencydependencygroupIdcom.aliyun/groupIdartifactIdaliyun-sdk-vod-upload/artifactIdversion${aliyun-sdk-vod-upload.version}/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion${fastjson.version}/version/dependencydependencygroupIdorg.json/groupIdartifactIdjson/artifactIdversion${json.version}/version/dependencydependencygroupIdcommons-dbutils/groupIdartifactIdcommons-dbutils/artifactIdversion${commons-dbutils.version}/version/dependencydependencygroupIdcom.alibaba.otter/groupIdartifactIdcanal.client/artifactIdversion${canal.client.version}/version/dependencydependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-spring-boot-starter/artifactIdversion${swagger-version}/version/dependencydependencygroupIdcom.jack/groupIdartifactIdservice/artifactIdversion${project-version}/version/dependencydependencygroupIdcom.liuscoding/groupIdartifactIdcommon_utils/artifactIdversion${project-version}/version/dependency/dependencies
/dependencyManagement创建子模块 同样创建之后添加packing标签导入依赖
dependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-ribbon/artifactId/dependency!--hystrix依赖主要是用 HystrixCommand --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-hystrix/artifactId/dependency!--服务注册--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency!--服务调用--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--mybatis-plus--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactId/dependency!--mysql--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 --dependencygroupIdorg.apache.velocity/groupIdartifactIdvelocity-engine-core/artifactId/dependency!--swagger--dependencygroupIdio.springfox/groupIdartifactIdspringfox-swagger2/artifactId/dependencydependencygroupIdio.springfox/groupIdartifactIdspringfox-swagger-ui/artifactId/dependency!--lombok用来简化实体类需要安装lombok插件--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!--xls--dependencygroupIdorg.apache.poi/groupIdartifactIdpoi/artifactId/dependencydependencygroupIdorg.apache.poi/groupIdartifactIdpoi-ooxml/artifactId/dependencydependencygroupIdcommons-fileupload/groupIdartifactIdcommons-fileupload/artifactId/dependency!--httpclient--dependencygroupIdorg.apache.httpcomponents/groupIdartifactIdhttpclient/artifactId/dependency!--commons-io--dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactId/dependency!--gson--dependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactId/dependencydependencygroupIdcom.jack/groupIdartifactIdservice/artifactId/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependency
/dependencies创建子子模块 讲师管理模块配置 创建application.properties
# 服务端口
server.port8001# 服务名
spring.application.nameservice_edu# 环境配置: dev, test, prod
spring.profiles.activedev# mysql数据库连接
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver
spring.datasource.urljdbc:mysql://localhost:3306/guli?serverTimezoneGMT%2B8
spring.datasource.usernameroot
spring.datasource.passwordxxxxx# mybatis日志
mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl编写controller service mapper代码内容
mp提供了代码生成器生成相关代码
public class CodeGenerator {Testpublic 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接口的首字母Igc.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?serverTimezoneGMT%2B8);dsc.setDriverName(com.mysql.cj.jdbc.Driver);dsc.setUsername(root);dsc.setPassword(020406);dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);// 4、包配置PackageConfig pc new PackageConfig();pc.setParent(com.jack);pc.setModuleName(eduservice); //模块名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();}
}生成出来的结果 测试一下
编写Controller
RestController
RequestMapping(/eduservice/teacher)
public class EduTeacherController {AutowiredEduTeacherService eduTeacherService;// 1. 查询讲师表所有数据GetMapping(findAll)public ListEduTeacher findAllTeacher() {// 调用service的方法实现查询所有的操作ListEduTeacher list eduTeacherService.list(null);return list;}
}创建启动类 SpringBootApplication
public class EduApplication {public static void main(String[] args) {SpringApplication.run(EduApplication.class, args);}
}新建配置类添加mapperscan注解 Configuration
MapperScan(com.jack.eduservice.mapper)
public class EduConfig {
}给Mapper加上Mapper注解 设置日期格式 # 设置日期格式
spring.jackson.date-formatyyyy-MM-dd HH:mm:ss
spring.jackson.time-zoneGMT8测试
讲师逻辑删除功能 在配置类里配置逻辑删除插件 Bean
public ISqlInjector sqlInjector() {return new LogicSqlInjector();
}在实体类属性上加上注解 ApiModelProperty(value 逻辑删除 1true已删除 0false未删除)
TableLogic
private Integer isDeleted;编写Controller方法 DeleteMapping({id})
public boolean removeTeacher(PathVariable Integer id) {return eduTeacherService.removeById(id);
}如何测试 delete提交没有办法通过浏览器直接提交 借助一些工具进行测试: 1. swagger测试重点 2. postman了解
整合swagger 生成在线接口文档方便接口测试
创建一个公共模块
整合swagger为了所有模块都能用
创建子模块common再创建service_base模块新建配置类
Configuration
EnableSwagger2
public class SwaggerConfig {Beanpublic 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(java, http://atguigu.com, 1123qq.com)).build();}
}具体使用
在service_edu中引入service_base依赖 还需要在启动类配置扫描组件以便Swagger的配置类生效
SpringBootApplication
ComponentScan(basePackages {com.jack})
public class EduApplication {public static void main(String[] args) {SpringApplication.run(EduApplication.class, args);}
}访问swagger
http://localhost:8001/swagger-ui.html
可以在Controller上添加注解增强swagger文档的可读性 统一返回数据格式 在common模块创建子模块 common_utils 创建interface定义数据返回状态码 成功 20000失败 20001 public interface ResultCode {public static Integer SUCCESS 20000;public static Integer ERROR 20001;
}创建结果类 package com.jack.commonutils;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.util.HashMap;
import java.util.Map;// 统一返回结果的类
Data
public class R {ApiModelProperty(value 是否成功)private Boolean success;ApiModelProperty(value 返回码)private Integer code;ApiModelProperty(value 返回消息)private String message;ApiModelProperty(value 返回数据)private MapString, Object data new HashMap();// 把构造方法私有化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(false);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(MapString, Object map) {this.setData(map);return this;}
}使用统一结果 先在Service模块引入依赖 dependencygroupIdcom.jack/groupIdartifactIdcommon_utils/artifactId
/dependency将Controller中的返回值都改为R类型 Api(description 讲师管理)
RestController
RequestMapping(/eduservice/teacher)
public class EduTeacherController {AutowiredEduTeacherService eduTeacherService;// 1. 查询讲师表所有数据ApiOperation(value 所有讲师列表)GetMapping(findAll)public R findAllTeacher() {// 调用service的方法实现查询所有的操作ListEduTeacher list eduTeacherService.list(null);return R.ok().data(list, list);}ApiOperation(value 根据ID删除讲师)DeleteMapping({id})public R removeTeacher(PathVariable String id) {boolean flag eduTeacherService.removeById(id);if(flag) {return R.ok();} else {return R.error();}}}讲师分页功能 配置分页插件 Bean
public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();
}编写讲师分页查询方法 // 分页查询讲师方法
GetMapping(pageTeacher/{current}/{limit})
public R pageListTeacher(PathVariable(current)Long current,PathVariable(limit) Long limit) {// 创建page对象PageEduTeacher page new Page(current, limit);// 调用方法实现分页// 调用方法的时候底层封装把分页的数据封装到page对象里面eduTeacherService.page(page, null);long total page.getTotal(); // 总记录数ListEduTeacher records page.getRecords();
/*Map map new HashMap();map.put(total, total);map.put(rows, records);return R.ok().data(map);*/return R.ok().data(total, total).data(rows, records);
}多条件组合分页查询 把条件值传递到接口里面 把条件值封装到对象里面把对象传递到接口里面 VO对象 创建VO类 Data
ApiModel(教师查询对象)
public class TeacherQuery {ApiModelProperty(教师名称模糊查询)private String name;ApiModelProperty(头衔 1 高级讲师 2 首席讲师)private Integer level;ApiModelProperty(value 查询开始时间,example 2020-01-01 10:10:10)/*** 注意这里使用的是String类型前端传过来的数据无需进行类型转换。*/private String begin;ApiModelProperty(value 查询结束时间,example 2020-04-01 10:10:10)private String end;
}根据条件值进行判断拼接条件 ApiOperation(多条件组合查询带分页)
GetMapping(pageTeacherCondition/{current}/{limit})
public R pageTeacherCondition(PathVariable long current, PathVariable long limit,TeacherQuery teacherQuery) {PageEduTeacher page new Page(current, limit);// 构建条件QueryWrapperEduTeacher queryWrapper new QueryWrapper();String name teacherQuery.getName();Integer level teacherQuery.getLevel();String begin teacherQuery.getBegin();String end teacherQuery.getEnd();// 判断条件是否为空加上不为空的条件if(!StringUtils.isEmpty(name)) {queryWrapper.like(name, name);}if(!StringUtils.isEmpty(level)) {queryWrapper.eq(level, level);}if(!StringUtils.isEmpty(begin)) {queryWrapper.ge(gmt_create, begin);}if(!StringUtils.isEmpty(end)) {queryWrapper.le(gmt_create, end);}eduTeacherService.page(page, queryWrapper);long total page.getTotal(); // 总记录数ListEduTeacher records page.getRecords(); // listreturn R.ok().data(total, total).data(rows, records);
}讲师添加 配置字段自动填充 编写Controller ApiOperation(添加讲师)
PostMapping(addTeacher)
public R addTeacher(RequestBody EduTeacher eduTeacher) {boolean save eduTeacherService.save(eduTeacher);if(save) {return R.ok();} else {return R.error();}
}讲师修改功能 根据讲师id进行查询用于回显 ApiOperation(根据讲师id进行查询)
GetMapping(getTeacher/{id})
public R getTeacher(PathVariable String id) {EduTeacher teacher eduTeacherService.getById(id);return R.ok().data(teacher, teacher);
}讲师修改 ApiOperation(讲师修改)
PostMapping(updateTeacher)
public R updateTeacher(RequestBody EduTeacher teacher) {boolean b eduTeacherService.updateById(teacher);return b ? R.ok() : R.error();
}统一异常处理
统一异常处理类
ControllerAdvice
public class GlobalExceptionHandler {ExceptionHandler(Exception.class) // 指定出现什么异常会被处理ResponseBody // 为了能够返回数据public R error(Exception e) {e.printStackTrace();return R.error().message(执行了全局异常处理);}
}