尚医通项目仿写部分技术点总结

前言

此篇文章是本人刚仿写完尚医通项目,将总结的word文档编写到博客上,这篇文章会记录一下做项目时,我用到的并且会用的技术点。

技术点汇总

1.MybatisPlus

技术介绍

Mybatis是spring提供的持久层的框架,它的出现使java语言调用数据库变得非常简单。然后MybatisPlus是Mybatis的升级版,在原有的基础上,Plus封装了Mybatis常用的语句,比如简单的增删改查。每当写一个调用数据库数据的接口方法时,都要在xml文件中写下对应的sql语句。如果是简单的sql语句,使用MybatisPlus就没有必要写了。极大的节约了时间和精力。

使用步骤

首先加入相关的依赖
在这里插入图片描述
之后在配置文件中添加数据库等信息
在这里插入图片描述
创建实体类,并且在实体类上添加TableName注解,用来对应数据库中的表,在属性上添加TableField注解,对应数据库中的字段
在这里插入图片描述

在mapper层的接口中继承接口BaseMapper,此接口有一个泛型,在泛型中写下对应的实体类,这样就可以操作实体类相应的数据库了
在这里插入图片描述

MyBatis-Plus在业务层也提供了类似的功能,service的接口继承IService,泛型中填入实体类。其实现类继承相应的类ServiceImpl,泛型中填入mapper接口和实体类,这样就能省略很多简单的代码,mapper层的接口,会以baseMapper的名字自动注入到业务层中,不需要@Autowired
在这里插入图片描述
在这里插入图片描述
使用Pages与wrapper进行条件分页查询
在这里插入图片描述
在这里插入图片描述

2.Excel表格的导入与导出

技术介绍

使用java语言导出数据字典的Excel表格,这样就可以在表格中查看信息,比较方便。

使用步骤

加入依赖
在这里插入图片描述
从数据库中导出数据字典,主要过程为,查询数据库,得到list,调用EasyExcel.write的方法,通过response传到前端
在这里插入图片描述
在这里插入图片描述

将读取的Excel文件导入到数据库中,需要先注册一个AnalysisEventListener的子类DictListener,controller层先传入一个文件,之后在业务层调用EasyExcel.read方法。之后在DictListener的invoke方法中一行行读取excel表中的数据,保存在数据库中
创建DictListener
在这里插入图片描述
controller接收前端的文件
在这里插入图片描述
业务层调用方法导入
在这里插入图片描述

3.redis以注解的方式对数据字典进行缓存

技术介绍

redis是一种能够将数据缓存到内存中的数据库,在查找数据时,redis会优先从内存中查找,如果找不到就会在硬盘中查找。访问内存的速度比访问硬盘的速度快得多。因此可以将一些经常访问并且不轻易改变的数据存储到redis当中,提高访问速度。
在使用数据字典查找时,可以将数据字典放入缓存中,下次再查找时就可以先去缓存中查找,找不到的话再到mysql中寻找,找到之后,放入缓存。
使用注解进行缓存,减少了代码的编写,不需要特意的编写调用redis数据库的方法。

使用步骤

现在service_util模块下加入相关依赖,redis注解相关的配置类在此模块下。
在这里插入图片描述
复制老师课件中的redis配置类,配置类中定义了redis中的各种规则
在这里插入图片描述
在数据字典模块的主类中扫描包,这个注解也可以扫描添加的依赖的包,这样service_util模块下的RedisConfig配置类就装配到了bean容器中。并且在配置文件中加入redis配置
在这里插入图片描述
在这里插入图片描述

在查找方法上添加@Cacheable注解,这样每次查找mysql的时候,就会先查找一下redis中有没有需要的数据,如果查找到了相同的key,就可以直接返回,不需要查找mysql。如果在redis中没有查找到,那么查找mysql,返回时将查找到的数据放入redis中,方便下次查找。
在这里插入图片描述
当导入数据字典时,改变了mysql中的数据字典数据,需要将缓存清空
在这里插入图片描述
运行结果,一个查询1的子元素,一个查询99100的子元素,都加入了缓存
在这里插入图片描述

4.Nginx—负载均衡,反向代理

技术介绍

当多个模块使用不同端口号时,比如hosp使用8201端口,cmn使用8202端口。当前端访问这些地址时,无法直接访问两个端口号。当使用nginx的时候,就可以解决这个问题。前端直接访问nginx,nginx根据访问的地址路径,将按照配置文件的规则进行转发,比如nginx的访问路径为http://localhost:9001 ,当前端访问9001时,前端的路径为http://localhost:9001/admin/hosp/hospitalSet时,因为路径中带有hosp路径,那么nginx就会根据配置文件中配置的路径,代替前端去访问http://localhost:8201/admin/hosp/hospitalSe。

使用步骤

首先下载nginx,之后修改nginx中的配置文件
nginx的访问路径为9001
当路径中有/hosp/时,访问8201端口
当路径中有/cmn/时,访问8202端口
在这里插入图片描述
之后在cmd命令窗口中打开nginx,然后前端设置访问nginx的路径
在这里插入图片描述

4.MongoDB数据库—NoSQL

技术介绍

MongoDB是一种非关系型数据库,也就是NoSQL。在存储和访问时非常方便。根据老师的文档。
NoSQL的优点:
1.对数据库高并发读写
2.对海量科技的高效率存储和访问
3.对数据库的高扩展性和高可用性
缺点:
1.数据库事务一致性需求
2.数据库的写实时性和读实时性
3.对复杂的sql查询,特别是多表关联查询的需求
在使用java语言调用MongoDB时,编写起来也比较方便。

使用步骤

先加入mongdb依赖
在这里插入图片描述
在配置文件中添加mongodb配置
在这里插入图片描述
在相关的实体类上添加@Document注解,来表示在mongodb的集合名。在主键上添加@Id,表示主键,mongdb会自动生成主键。在属性上添加@Indexed注解,表示该字段添加索引。
在这里插入图片描述
在这里插入图片描述

创建一个与mapper包差不多功能的包repository,专门保存操纵mongdb数据库的接口的包,在包中创建相关的接口,继承MongoRepository接口
在这里插入图片描述
在service的类中装配此接口就可以进行使用了,它的使用与mybatisplus很相似,一些简单的语句,比如findAll(),findById,deleteById等,都可以直接使用,不需要我们单独写。如果要根据我们自己的需要写sql语句的话,也可以根据mongdb规定的规范写相关的sql语句。
比如:
getScheduleByHoscodeAndHosScheduleId(schedule.getHoscode(),schedule.getHosScheduleId());
get+类名+By+Hoscode(医院编号字段首字母大写)+And+HosScheduleId(医院排班id字段首字母大写)
之后传入相关的参数。在接口中创建这样的命名方法,就能实现相应功能的sql语句。
在这里插入图片描述
在这里插入图片描述

另外关于MongoTemplate,这个接口也能查询mongodb数据库,并且能够进行分组查询并排序等复杂的功能。需要借助Criteria类来当作匹配条件,与 Aggregation类来进行数据处理,之后使用此接口调用aggregate方法进行查询。
在这里插入图片描述

5.Nacos—微服务注册中心

技术介绍

Nacos是经常用到的微服务注册中心,刚开始学习分布式(dubbo)时,使用的是Zoopeeper注册中心。之后在动力节点学习dubbo时,使用的是Eureka注册中心,SpringCloud整合了Eureka,使用起来更加简便,不需要再配置非常麻烦的xml文件了。本次尚医通项目使用的是Nacos,感觉应该是Eureka的上位替代。
当我们想要在医院模块使用查询数据字典中省市区来显示医院所在的地区等功能时,这时候我们不能直接在医院模块下创建调用数据字典库的接口,这样的话,医院这个模块的职责就不仅仅是调用医院了。在后续的编程以及维护中不是很方便。类型分的不是很清楚。那么为了让医院模块能够查询到省市区或者医院等级等功能,我们需要借用数据字典cmn模块中的功能,在数据字典cmn模块中创建对医院模块的服务,这样医院模块只专注医院,数据字典模块只专注数据字典,医院也能实现查询数据字典的功能。也就是医院模块实现了远程调用数据字典模块,通过微服务可以实现。

使用步骤

启动nacos,访问端口号,密码和用户名都是nacos
在这里插入图片描述
在这里插入图片描述
引入nacos依赖,配置文件,参与微服务的模块都要添加这些,所以直接再service这个父模块的pom上添加依赖
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
启动类添加注解,将此模块注册到微服务中
@EnableDiscoveryClient 让微服务发现此模块
@EnableFeignClients(basePackages = “com.atguigu”) 发现此包以及子包下能够进行微服务调用的feign客户端,即拥有@FeignClient注解的接口
在这里插入图片描述
在service_cmn模块中,先写好服务所需要的地址方法,数据字典中有service_hosp所需要的医院等级名称以及省市区名称,因为在service_hosp的数据库中,只有省市区的编号以及医院等级的编号,所以需要使用service_cmn的方法来查询数据字典中的数据库,获取医院等级名称以及省市区名称。那么就先在service_cmn写下查询的方法以及url
在这里插入图片描述
创建一个微服务转发的工具模块,引用springcloud中的feign相关的依赖
在这里插入图片描述
创建转发的接口,使用@FeignClient(“service-cmn”)注解来根据服务名转发到相应的地址,与nacos中的服务名相对应,之后下面的接口方法上,写入完整的地址,注意@PathVariable注解内一定要加入参数的名称,否则会出现错误
在这里插入图片描述
在service_hosp模块中引入依赖,也就是需要服务的一方引入这个工具模块依赖
service_hosp模块需要service_cmn中的服务,查询到省市区名称和医院等级名称来给service_hosp模块,那么它就需要feign这个接口来转发他的请求,通过nacos
在这里插入图片描述
在需要的类中装配这个接口
在这里插入图片描述
直接调用这个接口的方法就可以使用service_cmn中的服务了
在这里插入图片描述

6.网关gateway

技术介绍

在此项目中,前端访问后端,原来使用的是nginx,通过9001入口,之后通过配置文件访问相应的端口号。现在使用gateway网关,端口号设为8000。网关需要配合微服务的nacos一起使用。
nginx做网关,主要用来流量入口,反向代理,负载均衡等
gateway网关不仅可以反向代理,还具备其他功能,比如统一处理跨域问题,过滤器等。

使用步骤

先创建一个网关模块,加入相关的依赖
在这里插入图片描述
在application.properties中配置相关的信息
在这里插入图片描述
在这里插入图片描述
创建启动类
在这里插入图片描述
处理跨域问题,
原本前端访问后端时,不同协议(比如http与https之间),不同主机,不同端口,这三个只要有一个不同,那么就会产生跨域问题,前端访问不了后端。因为前端的启动端口为9796和3000,与后端的端口不同,因此为了能让前端跨域访问后端的服务地址,后端在controller层中每个类上面都要加一个@CrossOrigin注解,表示这个类的网址支持跨域访问。当我们使用gateway作为网关时,我们可以通过创建一个配置类来统一处理跨域问题,这样就不需要很麻烦的在每个类中加入注解了。
在这里插入图片描述
在这里插入图片描述
创建过滤器
第一个过滤为内部服务器接口,当带有/inner/访问路径时,会无条件拦截,当外部想要访问这个路径时,会直接禁止,一般这种路径为微服务的路径,也就是模块与模块之间调用的路径,不需要通过网关,直接通过nacos调用,也就是微服务之间的服务只允许模块与模块之间的访问。
第二个则是用户登陆时判断用户登录是否合法,主要使用JWT鉴权
在这里插入图片描述
在这里插入图片描述

7.阿里云短信----手机登录认证

技术介绍

用户可以使用手机登录该预约挂号网站,如果使用手机的话,需要发送手机验证码,那么就需要使用到阿里云的短信服务。通过阿里云短信发送验证码,然后验证。

使用步骤

学生的话,一般使用快速学习即可,一般发送短信需要使用签名认证,但是个人一般无法认证成功,那么使用快速学习,绑定自己的手机号,模拟给自己的手机号发短信也可以。
在这里插入图片描述
可以使用阿里给出的代码进行测试
先申请AccessKey,申请密钥,之后用密钥就可以使用阿里云的短信服务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
开始搭建短信发送模块,首先创建service_msm模块,之后在网关中的配置文件中配置上该模块的访问路径
在这里插入图片描述
在模块中加入阿里云的依赖
在这里插入图片描述
配置文件,端口号,服务名,redis(验证码存储功能,放入到缓存中,然后规定过期时间),将服务注册到nacos中,配置服务id和密钥
在这里插入图片描述
在主类中取消JDBC功能,因为短信发送不需要JDBC,如果没有配置数据库的话,一般会报错,添加这个属性,可以跳过配置数据库运行springboot
在这里插入图片描述
创建两个配置类,一个存储密钥信息,一个随机生成验证码
在这里插入图片描述
前端输入手机号,点击发送验证码,之后msm模块中的controller接收到手机信息,controller先调用redis判断验证码是否存在,不存在那么就会生成验证码并且发送,先调用工具类生成验证码,之后调用业务层的方法,通过业务层的方法发送阿里云短信,如果业务层返回true,发送成功,那么就将验证码存入到redis中,设置成2分钟过期,key为手机号。
在这里插入图片描述
业务层调用阿里云短信服务,写法比较固定,只需要改变不一样的参数即可。
发送成功,则为true,失败则为false
在这里插入图片描述
在这里插入图片描述
阿里云模块业务结束,之后是用户模块的判定,在前端页面,用户输入完验证码之后会点击登录或注册,就会发送到用户模块
具体流程如下
controller层接收到请求
在这里插入图片描述
将数据传入到业务层进行判断,根据手机号在redis中取出验证码,之后就是信息录入等操作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.关于JWT与token

技术介绍

参考文章:https://www.zhihu.com/question/485758060/answer/2257869896
使用JWT鉴权进行用户认证。
一开始用户登陆完之后,登录的信息保存在session中,但是问题很多,用户端需要用一个cookie当作sessionId去服务器中寻找session。分布式部署的话,服务器之间的session就不共享了,很难扩展。
token认证,将用户登陆后的信息存储在redis中,给前端用户分配一个token作为key,每次用户访问网站,都会使用token作为key寻找是否存在用户信息,验证用户是否登录。容易扩展,解决了多台服务器之间不共享问题,但是还是要依赖后端。
JWT:将用户信息加密保存在前端中,后端只需要将前端传过来的token进行解析,然后验证合法性就可以对用户的登录进行认证。这种用户登录认证的方式,不需要把信息保存在后端,减轻了后端的压力,也不担心不共享问题。只需要用同一套加密解密规则就可以实现对用户登录的认证。

使用步骤

在老师课件中,创建了一个JWT的工具类
导入jjwt包
在这里插入图片描述
创建工具包,里面写入生成token和根据token获取id与姓名的方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.微信登录认证 ------- OAuth2

技术介绍

微信扫码登录,也是用户常用的登录方式。通过OAuth2这种方式,微信给第三方应用授权登录,是一种非常方便的登录方式

使用步骤

在微信开放平台注册一个小程序资格
差不多的流程(具体流程我没实现,使用的尚硅谷老师的app_id和app_secret)
会获得id和密钥,也是通过这两个来传递参数

在这里插入图片描述
现在配置文件中写下相应的参数,将对应的参数配置到工具类中
在这里插入图片描述
在这里插入图片描述
微信给前端做了一个可以生成二维码的js,需要填写相应的参数,当我们在用户界面点击微信登录时,前端会生成一个二维码,此时程序运行的流程是:
点击微信登录 --> 后端服务器准备参数发送给前端 --> 前端依据参数生成二维码
appid: 在微信社区中申请的appid,与阿里云的id用法相似
scope:应用授权作用域,网页应用等之类的授权,一般都是固定的
redirect_uri: 用户扫描完二维码后,会发送给微信处理数据,这个参数是微信处理完数据后将数据转发到哪个地方。
state: 此数据会原样返回给上面的网站地址,防止csrf攻击(跨站请求伪造攻击)
在这里插入图片描述
当用户扫描完二维码后,微信处理完数据,会将code与state返回给redirect_uri指定的网址,code相当于微信给第三方的临时票据。在服务端中,将临时票据+appid+密钥再发送给微信,微信就会返回给服务器一个json格式的字符串。
在这个json字符串中,有两个参数
openid: 微信用户的唯一标识符
access_token: 调用接口凭证(授权),如果我们做的网站服务器想获得微信用户的基本信息的话,可以用此凭证加上用户的openid来再次访问微信的接口获取用户的基本信息。
访问流程
用户扫描二维码 --> 数据传入到微信中 --> 微信返回code与state传给服务器 --> 服务器将code和appid和密钥传给微信指定的接口 --> 微信返回给openid(用户唯一标识)和access_token(接口调用凭证)
在这里插入图片描述
在这里插入图片描述
另外发送请求的工具类HttpClientUtils,为老师课件中的工具类,,目前并没有好好看一看代码。
在这里插入图片描述

当我们获取到openid时,可以判断该用户受否已经用微信进行过注册(第一次登陆时会将用户的openid保存到数据库中,相当与完成注册),如果该用户第一次登录的话,服务器会再一次给微信接口发送请求,这次带着access_token和openid发送给微信,微信会返回给服务器该用户的基本信息,比如用户昵称,用户头像地址之类的。将用户信息保存在数据库中,微信接口的功能完成。
访问流程
服务器根据openid查询数据库判断用户是否以注册 --> 未注册则通过Http带着openid和access_token向微信的接口发送请求 --> 接收到用户的基本信息 --> 将用户信息注册到数据库中
在这里插入图片描述
在这里插入图片描述
之后只需要将用户的id和name利用JWT装到token中,传给前端就可以登录注册成功了。接下来还有一个点,绑定用户手机号。如果要微信登陆完绑定手机号的话,需要将openid传到前端,根据情况设置openid的值是否为空。
openid有两个作用
前端判断是否需要绑定手机号: 如果用户已经绑定手机号,那么将openid设置为空,前端进行判断,如果openid为空,那么前端不需要弹出手机验证码窗口。如果openid不为空,那么前端弹出输入手机号验证码窗口。
在另外一个接口中判断是否需要绑定手机号,查询用户信息: 前端手机号验证码输入完成后还会跳转到手机号验证码验证阶段。如果前端传入方法的openid为空,则不需要查询该用户,就直接注册,如果不为空,需要根据openid查询用户数据,将手机号绑定到用户信息中。也就是说,将手机号绑定到该用户账号上,需要上一个阶段阿里云短信服务加验证码验证。需要在接口中判断一下。
在这里插入图片描述
在这里插入图片描述

10.阿里云存储服务-----OSS

技术介绍

OSS相当于一个在阿里云里面申请一个存储空间,可以使用这个空间来存储图片等信息。
我们需要在阿里云中申请OSS服务,然后在这里面创建一个Bucket库,在这个库中可以保存文件。在这个库中保存的图片等,都有相应的下载地址url。如果要下载这些图片的话,就直接访问地址即可,前提是这个库要对外读取开放。

使用步骤

创建了一个yygh-atguigu456的库
在这里插入图片描述
这是在这个库中存的图片的地址,通过地址可以直接下载这个图片
在这里插入图片描述
接下来是使用代码对阿里云的库进行写入图片
首先创建一个叫OSS的模块,加入依赖和设置配置
在这里插入图片描述
在这里插入图片描述
将配置中的数据取出来,包装到静态工具类中
在这里插入图片描述
直接编写相关的代码,首先是controller层,当用户从前端传入图片时,controller层直接使用MultipartFile类来接收图片,然后直接将图片传到业务层处理,业务层返回取图片的地址url,controller向前端返回图片地址,这样图片在业务层保存到了阿里云,图片在阿里云的地址通过controller传到了前端。
在这里插入图片描述
业务层中主要功能就是将图片进行保存。首先将静态类中的阿里云地址以及id和密钥取出,通过这三个创建一个阿里云依赖中自带的OSS实例对象
在这里插入图片描述
通过file获取到该文件的输入流和文件名,这个时候需要对文件名进行加工,首先生成一个uuid,当作文件名,之后使用String将文件类型取出,之后将uuid与文件类型进行拼接,合成一个新的文件名。
重新拼接文件名的作用
一是为了防止用户上传同名文件,导致文件进行替换
二是为了将用户原有文件的不合法文件名进行替换。当用代码上传文件时,一些特殊字符会被转码,导致我上传的文件名与阿里云里面存储的文件名不一致,后面拼接的url就会访问不到存储的图片。

文件名未替换版本:{ZD5(2W0{JQBE7U`]QUEH7W.png

文件名拼装的地址:
https://yygh-atguigu456.oss-cn-qingdao.aliyuncs.com/2022/08/06/{ZD5(2W0{JQBE7U`]QUEH7W.png
阿里云图片的地址:
https://yygh-atguigu456.oss-cn-qingdao.aliyuncs.com/2022/08/06/%7BZD5%282W0%7BJQBE7U%60%5DQUEH7W.png
并且在文件名替换的基础上,又加上日期分类,将每天的日期都作为一个文件夹存储文件。
在这里插入图片描述
在这里插入图片描述

调用OSS类,将文件上传到阿里云,关闭OSS类,之后使用字符串拼接,将文件的访问路径拼接出来,这样,阿里云文件存储功能就使用结束。
在这里插入图片描述

11.微信支付

技术介绍

微信支付首先需要在微信开通商家认证,开通之后会获得商户编号以及密钥等,通过appid与商户编号还有密钥,可以生成微信支付二维码。后端将二维码地址所封装到map中,之后,前端根据信息就可以显示二维码。
通过这个,可以让用户支付订单金额

使用步骤

首先加入依赖和配置文件
在这里插入图片描述
appid:账号唯一标识
partner: 商户编号
partnerkey: 商户密钥
在这里插入图片描述
前端点开预约订单,之后点开支付,前端会传给后端一个订单id,这是订单数据库中的主键,后端根据这个主键,来生成支付二维码,存储支付信息等。controller层接到订单id之后,调用service层的方法。
在这里插入图片描述
在service中,首先会在redis中查找是否已经存在该订单id相关的二维码信息,也就是二维码是否已经生成。如果找到了,就直接返回二维码信息就可以了。
在这里插入图片描述
如果用户第一次点开收款码,那么后端就会根据订单id生成微信收款码。首先需要更新收款信息表,先根据订单xid取出订单信息,根据订单信息保存收款信息,将微信支付所需要的参数都封装到map集合中
在这里插入图片描述
使用老师实现写好的HttpClient工具类向微信发送请求,在这个类中微信返回的数据会使用content参数接收(这个工具类的具体实现还没有看)
在这里插入图片描述
将微信返回的结果集封装到map中,其中包括订单id,订单金额,订单状态码,以及返回的二维码图片地址。如果微信能够返回状态码的话,说明生成支付二维码成功,将这些信息保存在redis数据库中两个小时,当用户关闭支付页面后,再次点开就不需要再次请求微信了。
在这里插入图片描述

微信支付状态判断,前端在生成二维码之后,会每隔一段时间申请后端的服务器方法,判断支付状态。前端传入订单id,后端根据订单id来申请微信,判断支付状态。
后端的controller根据前端传入的订单id,调用service层,接收到一个map集合,如果为null,那么说明二维码已过期,如果map中的支付状态显示SUCCESS,表示已经支付成功,那么就可以根据订单编号修改数据库中的支付状态,返回支付成功。其他情况就是支付中。
在这里插入图片描述
在service层中,依旧是封装信息,给微信发送请求,接收参数,返回map,在整个过程中,最主要的应该是发送请求的工具类,其他的步骤都是固定的,只不过改一改参数,工具类的作用也是固定的。但是作用比较大。
在这里插入图片描述
在这里插入图片描述

12.微信退款

技术介绍

当用户要取消预约时,除了修改数据库中的信息,如果已经付了款的话,还需要将已经付的款退还给用户,这时候需要用到微信退款功能,如果用到微信退款功能,则需要一个cert证书,这里直接复制的老师,一般学生搞不到这个(300元一年)。

使用步骤

前端访问服务器,在controller直接调用业务层,并没有其他的代码,业务层返回一个boolean类型的值,表示删除成功或失败。
在这里插入图片描述
在service层中,先根据订单id获取订单的全部信息,之后判断是否可以取消订单,如果订单超时会抛异常。
在这里插入图片描述
之后调用医院接口,将医院方的数据库的订单信息修改,医院方会返回一个状态码,如果为200表示医院方修改成功,那么就可以进行后续操作。

在这里插入图片描述

如果医院方删除成功,那么就直接调用WeixinService中的退款功能,以及更新订单状态,之后通过消息队列RabbitMQ发送短信。
在这里插入图片描述
微信退款功能,首先需要根据订单id与支付方式获取到支付相关的信息,之后添加到退款数据库中(这里的添加退款方法中,如果数据已存在,那么就不需要继续添加,返回存在的数据),已退款则直接返回true
在这里插入图片描述
未退款则封装数据,发送请求,接收参数等,返回信息,修改数据库
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值