博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用SpringCloud Alibaba搭建属于自己的微服务(三十二)~业务开发~扣款接口开发
阅读量:4203 次
发布时间:2019-05-26

本文共 3924 字,大约阅读时间需要 13 分钟。

一.准备工作

1.user.user_info表增加account_money(账户金额)字段(真是的业务场景一般是建一张user_account的表,这里为了简单,博客都是以技术讲解为主,业务简单化做支撑).

在这里插入图片描述

2.user.user_info表实体映射也增加accountMoney字段.

package com.ccm.server.user.dao.mysql.domain;import lombok.Data;import java.util.Date;/** *  @Description user_info表实体类映射 *  @Author ccm *  @CreateTime 2020/08/05 15:19 */@Datapublic class UserInfo {
private Long userId; private String username; private String password; private BigDecimal accountMoney; private Date updateTime; private Date createTime;}

二.server-user服务中开发用户扣款接口

1.控制层

(1).AccountController
package com.ccm.server.user.controller;import com.ccm.common.exception.result.ResultSet;import com.ccm.server.user.service.AccountService;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import io.swagger.annotations.ApiParam;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.*;@Validated@Api(tags = "账户")@RestController@RequestMapping(value = "account")public class AccountController {
@Autowired private AccountService accountService; @ApiOperation(value = "扣款") @PutMapping(value = "deduction") public ResultSet deduction(@ApiParam(hidden = true) @RequestHeader(name = "ccm-userId") Long userId, @ApiParam(value = "金额") @RequestParam BigDecimal amountOfMoney) {
accountService.deduction(userId,amountOfMoney); return ResultSet.success(); }}

2.业务层

(1).AccountService
package com.ccm.server.user.service;/** *  @Description 账户业务层 *  @Author ccm *  @CreateTime 2020/08/19 11:51 */public interface AccountService {
/** * @Description 扣款 * @Author zhouzhiwu * @CreateTime 2020/8/19 13:32 * @Params [userId, amountOfMoney] * @Return void */ void deduction(Long userId, BigDecimal amountOfMoney);}
(2).AccountServiceImpl
package com.ccm.server.user.service.impl;import com.ccm.common.exception.CustomerException;import com.ccm.server.user.dao.mysql.domain.UserInfo;import com.ccm.server.user.dao.mysql.mapper.UserInfoMapper;import com.ccm.server.user.service.AccountService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;/** *  @Description 账户业务层实现 *  @Author ccm *  @CreateTime 2020/08/19 11:52 */@Servicepublic class AccountServiceImpl implements AccountService {
@Autowired private UserInfoMapper userInfoMapper; @Override @Transactional(rollbackFor = Exception.class) public void deduction(Long userId, BigDecimal amountOfMoney) {
//查看账户余额是否满足扣款 UserInfo userInfo = userInfoMapper.selectByUserIdForUpdate(userId); if(userInfo == null) {
throw new CustomerException("用户不存在"); } if(amountOfMoney.doubleValue() > userInfo.getAccountMoney().doubleValue()) {
throw new CustomerException("账户余额不足"); } //扣款 userInfoMapper.deductionByUserId(userId,amountOfMoney); }}

3.持久层

(1).UserInfoMapper
package com.ccm.server.user.dao.mysql.mapper;import com.ccm.server.user.dao.mysql.domain.UserInfo;import org.apache.ibatis.annotations.Param;/** *  @Description user_info表mapper *  @Author ccm *  @CreateTime 2020/08/05 15:20 */public interface UserInfoMapper {
UserInfo selectByUserIdForUpdate(@Param("userId")Long userId); int deductionByUserId(@Param("userId") Long userId, @Param("amountOfMoney")BigDecimal amountOfMoney);}
(2).UserInfoMapper.xml
update user_info set account_money = (account_money - #{amountOfMoney}) where user_id = #{userId}

三.接口测试

1.启动gateway网关和server-user微服务.

在这里插入图片描述

2.打开gateway网关的swagger界面.

在这里插入图片描述

3.接口测试.

在这里插入图片描述

在这里插入图片描述查看数据库,扣款成功

在这里插入图片描述

您的点赞、收藏、转发和关注是我持续创作的动力!

源码地址:

转载地址:http://wutli.baihongyu.com/

你可能感兴趣的文章
C++中const的用法:使代码更加健壮
查看>>
C++ 11:delete关键词和一条《Effective C++》的过时条款
查看>>
Google C++ 风格指南 :尽可能用 sizeof(varname) 代替 sizeof(type).
查看>>
C++中的委托构造
查看>>
RTP/RTCP 和 SRTP/SRTCP协议
查看>>
AES加密算法(Rijndael算法)
查看>>
WebRTC简介与代码架构
查看>>
WebRTC in the real world: STUN, TURN and signaling
查看>>
C++11的enum class 、enum struct 和 enum
查看>>
【转载】 webrtc中的网络反馈与控制
查看>>
C++11中的“万能引用”
查看>>
C++11:尽量使用std::array来代替数组
查看>>
通宵怒肝,保姆级Spring Cloud Alibaba从应用到源码解析学习路线,直线起飞!
查看>>
看了阿里P7粉丝的工资单:懂点算法,就这么香?附上他的数据结构与算法学习笔记!
查看>>
Android地图Key
查看>>
Android Application Task Activities的关系
查看>>
Android 的消息队列模型
查看>>
Android Binder IPC分析
查看>>
android IPC通信中的UID和PID识别 -》 clearCallingIdentity 的作用
查看>>
Android软Watchdog源码分析
查看>>