尚医通项目笔记--包括每个接口对应页面的图片
Posted COCoDE.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚医通项目笔记--包括每个接口对应页面的图片相关的知识,希望对你有一定的参考价值。
废话不多说,直接上图
博客目录结构
工程目录结构
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服务网关
工程目录结构细分版:https://blog.csdn.net/tufhgddty/article/details/123523530
一、common公共模块
common-util公共的工具类模块
工具类模块,所有模块都可以依赖于它
从课程资料文件夹直接粘贴工具类到project中
总共 5个工具类 包括:
YyghException:自定义全局异常
GlobalExceptionHandler:全局异常处理Handler类
JwtHelper:Json Web Token,认证帮助类
Result:API统一返回结果封装类
ResultCodeEnum:API统一返回结果状态信息枚举类
AuthContextHolder:从header获取当前用户工具类
service-util service服务的工具类模块
service服务的工具类模块,包含service服务的公共配置类,所有service模块依赖于它
工具类 包括:
MybatisPlusConfig:MybatisPlus配置类
CommonMetaObjectHandler:Mybatis plus Handler配置类
RedisConfig:Redis配置类
Swagger2Config:Swagger2配置类
HttpRequestHelper【【【【【【【】】】】】】】
HttpUtil
MD5
其中MybatisPlusConfig.java配置了MybatisPlus的分页插件和乐观锁
package com.atguigu.yygh.common.config;
/**
* MybatisPlus配置类
*/
@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配置了创建时间和修改时间字段的自动插入
/**
* Mybatis plus Handler配置类
*/
@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);
rabbit-util service服务的工具类模块
MqConfig RabbitMQ的配置类
MqConst 【【【【【【【】】】】】】】
RabbitService
二、model实体类模块
从课程资料文件夹直接复制到project中
model实体类
enums
AuthStatusEnum
DictEnum
OrderStatusEnum
PaymentStatusEnum
PaymentTypeEnum
RefundStatusEnum
model
acl
Permission
Role
RolePermission
User
UserRole
base
BaseEntity
BaseMongoEntity
cmn
Dict
cms
Banner
hosp
BookingRule
Department
Hospital
HospitalSet
Schedule
order
OrderInfo
PaymentInfo
RefundInfo
user
Patient
UserInfo
RefundInfo
vo
acl
AssignVo
RoleQueryVo
UserQueryVo
cmn
DictEeVo
hosp
BookingScheduleRuleVo
DepartmentQueryVo
DepartmentVo
HospitalQueryVo
HospitalSetQueryVo
ScheduleOrderVo
ScheduleQueryVo
msm
MsmVo
order
OrderCountQueryVo
OrderCountVo
OrderMqVo
OrderQueryVo
SignInfoVo
user
LoginVo
RegisterVo
UserAuthVo
UserInfoQueryVo
三、 hospital-manage医院接口模拟端(已开发,直接使用)
四、service接口服务父模块
4.1service-hosp医院服务接口模块
配置文件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
系统管理后台–医院设置信息页面
页面效果:系统管理后台–医院设置信息页面
需求:医院基本信息接口主要是用来保存开通医院的一些基本信息,每个医院一条信息,保存了医院编号(平台分配,全局唯一)和接口调用相关的签名key等信息,是整个流程的第一步,只有开通了医院设置信息,才可以上传医院相关信息。
共需开发三个接口:①基于单表的医院CRUD接口②医院锁定/解锁接口③医院发送签名信息接口
表结构:
hosname:医院名称
hoscode:医院编号(平台分配,全局唯一,api接口必填信息)
api_url:医院回调的基础url(如:预约下单,我们要调用该地址去医院下单)
sign_key:双方api接口调用的签名key,有平台生成
contacts_name:医院联系人姓名
contacts_phone:医院联系人手机
status:状态(锁定/解锁)
①医院基本信息CRUD接口
实际上为Mybatis Plus CRUD接口
Mybatis Plus的CRUD步骤为:
1、 参考配置文件application.properties中的配置
# 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
2、添加启动类:ServiceHospApplication
package com.atguigu.yygh;
@SpringBootApplication
public class ServiceHospApplication
public static void main(String[] args)
SpringApplication.run(ServiceHospApplication.class, args);
3、使用model:HospitalSet
@Data
@ApiModel(description = "医院基本信息")
@TableName("hospital_set") 【表名】
public class HospitalSet extends BaseEntity
private static final long serialVersionUID = 1L; 【自定义序列版本用户标识符,详细看https://blog.csdn.net/tufhgddty/article/details/123063761】
@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) 【@TableId:主键 type=IdType.AUTO:主键策略为自增】
private Long id;
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 【@JsonFormat:Json格式 pattern:模板】
@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<String,Object> param = new HashMap<>();
4、添加mapper:
@Mapper
public interface HospitalSetMapper extends BaseMapper<HospitalSet>【Mybatis Plus的Mapper需要继承BaseMapper< XXX>,接口的泛型为要操作的实体类】
5、在mapper/xml下添加HospitalSetMapper.xml------->【说明一下:这里集成了Mybatis-Plus作为ORM框架,一般情况下是否创建xml文件都是可以的】
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.yygh.hosp.mapper.HospitalSetMapper">
</mapper>
6、添加service接口及实现类
接口 HospitalSetService
public interface HospitalSetService extends IService<HospitalSetService> 【Mybatis Plus的Service需要继承IService< XXX>接口,接口的泛型为要操作的实体类】
实现类 HospitalSetServiceImpl
@Service
public class HospitalSetServiceImpl extends ServiceImpl<HospitalSetMapper, HospitalSet> implements HospitalSetService【Mybatis Plus的ServiceImpl需要继承ServiceImpl< XXX,XXX>类,接口的泛型为对应的Mapper和实体类】
@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<HospitalSet> list = hospitalSetService.list();
return Result.ok(list); 【自定义结果返回类型】
//2 逻辑删除医院设置
@ApiOperation(value = "逻辑删除医院基本信息")
@DeleteMapping("id") 【/admin/hosp/hospitalSet/XXX XXX为id参数的值】
public Result removeHospSet(@PathVariable Long id) 【@PathVariable 路径变量,加此注解可以获取到路径变量的值作为入参】
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)【@RequestBody是PostMapping用来传递Json格式参数的注解,required=false表示此参数可为空】
//创建page对象,传递当前页,每页记录数
Page<HospitalSet> page = new Page<>(current,limit);
//构建条件
【Wrapper条件构造器,详细请看这里https://blog.csdn.net/tufhgddty/article/details/123332559?spm=1001.2014.3001.5501】
QueryWrapper<HospitalSet> 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());
//调用方法实现分页查询
【分页查询,详细请看这里https://blog.csdn.net/tufhgddty/article/details/123332559?spm=1001.2014.3001.5501】
Page<HospitalSet> 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)));【System.currentTimeMillis() 获取时间戳 MD5.encrypt() MD5工具类的加密方法,和MD4一样生成128位的哈希值,三大成熟哈希算法包括:MD SHA SM3】
//调用service
boolean save = hospitalSetService.save(hospitalSet);
if(save)
return Result.ok();
else
return Result.fail(); 【Result.ok()和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<Long> idList) 【@RequestBody也是可以传列表的】
hospitalSetService.removeByIds(idList);
r尚医通项目1.3
上传医院接口
整合服务网关
网关介绍
API网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:
(1)客户端会多次请求不同的微服务,增加了客户端的复杂性。
(2)存在跨域请求,在一定场景下处理相对复杂。
(3)认证复杂,每个服务都需要独立认证。
(4)难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
(5)某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。
以上这些问题可以借助 API 网关解决。API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过API 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性
Spring Cloud Gateway介绍
>Spring cloud gateway是spring官方基于Spring 5.0、Spring Boot2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供简单、有效和统一的API路由管理方式,Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filer链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等
搭建server-gateway模块
搭建server-gateway子模块
修改配置pom.xml
在resources下添加配置文件
添加启动类
跨域处理
跨域:浏览器对于javascript的同源策略的限制。
以下情况都属于跨域:
跨域原因说明
示例
域名不同
www.jd.com 与 www.taobao.com
域名相同,端口不同
www.jd.com:8080 与 www.jd.com:8081
二级域名不同
item.jd.com 与 miaosha.jd.com
如果域名和端口都相同,但是请求路径不同,不属于跨域,如:
www.jd.com/item
www.jd.com/goods
http和https也属于跨域
而我们刚才是从localhost:1000去访问localhost:8888,这属于端口不同,跨域了。
为什么有跨域问题?
跨域不一定都会有跨域问题。
因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是与当前页域名相同的路径,这能有效的阻止跨站攻击。
因此:跨域问题 是针对ajax的一种限制。
但是这却给我们的开发带来了不便,而且在实际生产环境中,肯定会有很多台服务器之间交互,地址和端口都可能不同,怎么办?
解决跨域问题
全局配置类实现
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
服务调整
目前我们已经在网关做了跨域处理,那么service服务就不需要再做跨域处理了,将之前在controller类上添加过@CrossOrigin标签的去掉,防止程序异常
以上是关于尚医通项目笔记--包括每个接口对应页面的图片的主要内容,如果未能解决你的问题,请参考以下文章