废话不多说,直接上图
工程目录结构
yygh-parent根目录 common公共模块父节点 common-util公共工具类 rabbit-util业务封装RabbitMQ service-util服务工具类 hospital-manage医院接口模拟端(已开发,直接使用) model实体类 service接口服务父节点 service-hosp医院api接口服务 service-cmn公共api接口服务 service-user用户api接口服务 service-order订单api接口服务 service-oss文件api接口服务 service-msm短信api接口服务 service-statistics统计api接口服务 service-client服务调用feign父节点 service-cmn-client公共api接口 service-hosp-client医院api接口 service-order-client订单api接口 service-user-client用户api接口 service-gateway服务网关1、common公共模块
common-util公共的工具类模块
工具类模块,所有模块都可以依赖于它
从课程资料文件夹直接粘贴工具类到project中
总共 5个工具类 包括:
YyghException 【自定义全局异常 】
Result 【API统一返回结果封装类】
ResultCodeEnum API统一返回结果状态信息
BeanUtils 实体bean copy工具类
MD5 MD5加密工具类
service-util service服务的工具类模块
service服务的工具类模块,包含service服务的公共配置类,所有service模块依赖于它
总共2个工具类 包括:
MybatisPlusConfig MybatisPlus配置类
CommonmetaObjectHandler Mybatis plus Handler配置类
其中MybatisPlusConfig.java配置了MybatisPlus的分页插件和乐观锁
package com.atguigu.yygh.common.config;
@EnableTransactionManagement //事务处理
@Configuration
@MapperScan("com.atguigu.yygh.*.mapper")
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// paginationInterceptor.setLimit(你的最大单页限制数量,默认 500 条,小于 0 如 -1 不受限制);
return paginationInterceptor;
}
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
【CommonmetaObjectHandler配置了创建时间和修改时间字段的自动插入】
@Component
public class CommonmetaObjectHandler implements metaObjectHandler {
@Override
public void insertFill(metaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(metaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
2、model实体类模块
从课程资料文件夹直接复制到project中
3、service接口服务父模块service-hosp医院服务接口模块
医院设置接口
需求:医院设置主要是用来保存开通医院的一些基本信息,每个医院一条信息,保存了医院编号(平台分配,全局唯一)和接口调用相关的签名key等信息,是整个流程的第一步,只有开通了医院设置信息,才可以上传医院相关信息。
我们所开发的功能就是基于单表的一个CRUD、锁定/解锁和发送签名信息这些基本功能。
表结构:
hosname:医院名称
hoscode:医院编号(平台分配,全局唯一,api接口必填信息)
api_url:医院回调的基础url(如:预约下单,我们要调用该地址去医院下单)
sign_key:双方api接口调用的签名key,有平台生成
contacts_name:医院联系人姓名
contacts_phone:医院联系人手机
status:状态(锁定/解锁)
【实际上为Mybatis Plus CRUD接口】
Mybatis的CRUD步骤为:
1、 添加配置文件application.properties
# 服务端口 server.port=8201 # 服务名 spring.application.name=service-hosp # 环境设置:dev、test、prod (开发、测试、生产环境) spring.profiles.active=dev # mysql数据库连接 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://192.168.44.163:3306/yygh_hosp?characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=root #返回json的全局时间格式 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8 #配置mapper xml文件的路径 mybatis-plus.mapper-locations=classpath:com/atguigu/yygh/mapper/xml/ *.xml #nacos服务地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 #开启sentinel feign.sentinel.enabled=true #设置sentinel地址 spring.cloud.sentinel.transport.dashboard=http://127.0.0.1:8858 #mongodb地址 spring.data.mongodb.host=192.168.44.163 spring.data.mongodb.port=27017 spring.data.mongodb.database=yygh_hosp #rabbitmq地址 spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
2、添加启动类:ServiceHospApplication
3、使用model:HospitalSet
@Data
@ApiModel(description = "医院设置")
@TableName("hospital_set") //表名
public class HospitalSet extends baseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "医院名称")
@TableField("hosname") //字段名
private String hosname;
@ApiModelProperty(value = "医院编号")
@TableField("hoscode")
private String hoscode;
@ApiModelProperty(value = "api基础路径")
@TableField("api_url")
private String apiUrl;
@ApiModelProperty(value = "签名秘钥")
@TableField("sign_key")
private String signKey;
@ApiModelProperty(value = "联系人姓名")
@TableField("contacts_name")
private String contactsName;
@ApiModelProperty(value = "联系人手机")
@TableField("contacts_phone")
private String contactsPhone;
@ApiModelProperty(value = "状态")
@TableField("status")
private Integer status;
}
【baseEntity:在此entity存储一些通用的字段,节省子类代码量】
@Data
public class baseEntity implements Serializable {
@ApiModelProperty(value = "id")
@TableId(type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField("create_time")
private Date createTime;
@ApiModelProperty(value = "更新时间")
@TableField("update_time")
private Date updateTime;
@ApiModelProperty(value = "逻辑删除(1:已删除,0:未删除)")
@TableLogic
@TableField("is_deleted")
private Integer isDeleted;
@ApiModelProperty(value = "其他参数")
@TableField(exist = false)
private Map param = new HashMap<>();
}
4、添加mapper:
@Mapper
public interface HospitalSetMapper extends baseMapper
5、在mapper/xml下添加HospitalSetMapper.xml------->【说明一下:这里集成了Mybatis-Plus作为ORM框架,一般情况下是否创建xml文件都是可以的】
6、添加service接口及实现类
接口 com.atguigu.yygh.hosp.service.HospitalSetService public interface HospitalSetService extends IService{ } 实现类 com.atguigu.yygh.hosp.service.impl.HospitalSetServiceImpl @Service public class HospitalSetServiceImpl extends ServiceImpl implements HospitalSetService { @Autowired private HospitalSetMapper hospitalSetMapper; }
7、添加controller------->【说明一下:原项目中老师这样写是不符合规范的,业务逻辑代码应该尽量都放在Service层,不要放在Controller层,最好尽可能的把代码放在Service层,然后在Controller层调用Service层的方法实现功能】
Controller com.atguigu.yygh.hosp.controller.HospitalSetController
@Api(tags = "医院设置管理") //【Swagger2的注解】
@RestController //【相当于@Controller + @ResponseBody】
@RequestMapping("/admin/hosp/hospitalSet") //【用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径】
public class HospitalSetController {
//注入service
@Autowired
private HospitalSetService hospitalSetService;
//1 查询医院设置表所有信息
@ApiOperation(value = "获取所有医院设置")
@GetMapping("findAll")
public Result findAllHospitalSet() {
//调用service的方法
List list = hospitalSetService.list();
return Result.ok(list);
}
//2 逻辑删除医院设置
@ApiOperation(value = "逻辑删除医院设置")
@DeleteMapping("{id}")
public Result removeHospSet(@PathVariable Long id) {
boolean flag = hospitalSetService.removeById(id);
if(flag) {
return Result.ok();
} else {
return Result.fail();
}
}
//3 条件查询带分页
@PostMapping("findPageHospSet/{current}/{limit}")
public Result findPageHospSet(@PathVariable long current,
@PathVariable long limit,
@RequestBody
(required = false) HospitalSetQueryVo hospitalSetQueryVo) {
//创建page对象,传递当前页,每页记录数
Page page = new Page<>(current,limit);
//构建条件
QueryWrapper wrapper = new QueryWrapper<>();
String hosname = hospitalSetQueryVo.getHosname();//医院名称
String hoscode = hospitalSetQueryVo.getHoscode();//医院编号
if(!StringUtils.isEmpty(hosname)) {
wrapper.like("hosname",hospitalSetQueryVo.getHosname());
}
if(!StringUtils.isEmpty(hoscode)) {
wrapper.eq("hoscode",hospitalSetQueryVo.getHoscode());
}
//调用方法实现分页查询
Page pageHospitalSet = hospitalSetService.page(page, wrapper);
//返回结果
return Result.ok(pageHospitalSet);
}
//4 添加医院设置
@PostMapping("saveHospitalSet")
public Result saveHospitalSet(@RequestBody HospitalSet hospitalSet) {
//设置状态 1 使用 0 不能使用
hospitalSet.setStatus(1);
//签名秘钥
Random random = new Random();
hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis()+""+random.nextInt(1000)));
//调用service
boolean save = hospitalSetService.save(hospitalSet);
if(save) {
return Result.ok();
} else {
return Result.fail();
}
}
//5 根据id获取医院设置
@GetMapping("getHospSet/{id}")
public Result getHospSet(@PathVariable Long id) {
HospitalSet hospitalSet = hospitalSetService.getById(id);
return Result.ok(hospitalSet);
}
//6 修改医院设置
@PostMapping("updateHospitalSet")
public Result updateHospitalSet(@RequestBody HospitalSet hospitalSet) {
boolean flag = hospitalSetService.updateById(hospitalSet);
if(flag) {
return Result.ok();
} else {
return Result.fail();
}
}
//7 批量删除医院设置
@DeleteMapping("batchRemove")
public Result batchRemoveHospitalSet(@RequestBody List idList) {
hospitalSetService.removeByIds(idList);
return Result.ok();
}
}
项目集成Swagger2
Swagger2可以帮助我们编写和维护的API接口文档
常用注解
swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiModelProperty:用对象接收参数时,描述对象的一个字段
@ApiImplicitParam:一个请求参数
@ApiImplicitParams:多个请求参数
1、引入依赖
在common公共模块pom.xml引入依赖
io.springfox springfox-swagger2 io.springfox springfox-swagger-ui
2、添加配置类
在service-util服务工具模块添加配置类:
com.atguigu.yygh.common.config.Swagger2Config类
@Configuration //【Spring的配置类注释】
@EnableSwagger2 //【启用Swagger2】
public class Swagger2Config { //【Swagger2Config配置类】
@Bean
public Docket webApiConfig(){
return new Docket(documentationType.SWAGGER_2)
.groupName("webApi")
.apiInfo(webApiInfo())
.select()
//只显示api路径下的页面
.paths(Predicates.and(PathSelectors.regex("/api/.*")))
.build();
}
@Bean
public Docket adminApiConfig(){
return new Docket(documentationType.SWAGGER_2)
.groupName("adminApi")
.apiInfo(adminApiInfo())
.select()
//只显示admin路径下的页面
.paths(Predicates.and(PathSelectors.regex("/admin/.*")))
.build();
}
private ApiInfo webApiInfo(){
return new ApiInfoBuilder()
.title("网站-API文档")
.description("本文档描述了网站微服务接口定义")
.version("1.0")
.contact(new Contact("atguigu", "http://atguigu.com", "493211102@qq.com"))
.build();
}
private ApiInfo adminApiInfo(){
return new ApiInfoBuilder()
.title("后台管理系统-API文档")
.description("本文档描述了后台管理系统微服务接口定义")
.version("1.0")
.contact(new Contact("atguigu", "http://atguigu.com", "49321112@qq.com"))
.build();
}
}
参考资料:B站-尚硅谷-尚医通项目 https://www.bilibili.com/video/BV1V5411K7rT?p=1



