用SpringCloud Alibaba搭建属于自己的微服务(三十二)~业务开发~扣款接口开发

一.准备工作

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
 */
@Data
public 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
 */
@Service
public 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
<?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.ccm.server.user.dao.mysql.mapper.UserInfoMapper" >
   
    <update id="deductionByUserId">
        update user_info set account_money = (account_money - #{amountOfMoney}) where user_id = #{userId}
    </update>
    <select id="selectByUserIdForUpdate" resultType="com.ccm.server.user.dao.mysql.domain.UserInfo">
        select * from user_info where user_id = #{userId}
    </select>
</mapper>

三.接口测试

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

在这里插入图片描述

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

在这里插入图片描述

3.接口测试.

在这里插入图片描述

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

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

源码地址:https://gitee.com/chouchimoo/ccm-mall.git(本章节代码分支:zj-32)

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴回答你关于使用Spring Cloud Alibaba搭建微服务项目的问题!下面是从零开始搭建的步骤: 1. 创建父项目:首先,在你的IDE中创建一个空的Maven父项目作为整个微服务项目的容器。 2. 添加依赖:在父项目的pom.xml文件中添加Spring Cloud Alibaba的依赖,包括spring-cloud-starter-alibaba-dependencies和spring-cloud-starter-alibaba-nacos-discovery等。 3. 创建子模块:在父项目下创建子模块,每个子模块代表一个微服务。可以使用Maven的模块化管理。 4. 配置子模块:在每个子模块的pom.xml文件中添加Spring Boot的依赖,并配置相应的插件和属性。 5. 编写业务代码:在每个子模块中编写业务逻辑代码,包括控制器、服务、数据访问等。 6. 配置文件:在每个子模块中添加相应的配置文件,包括数据库配置、Nacos注册中心配置、Feign客户端配置等。 7. 注册中心:在Nacos注册中心中注册微服务,确保微服务能够被其他微服务或客户端发现和调用。 8. 服务调用:使用Spring Cloud Alibaba中的Feign或RestTemplate等方式进行微服务之间的调用,通过Nacos注册中心进行服务发现。 9. 启动微服务:分别启动各个子模块,可以使用IDE的Run或Debug功能,或者使用Maven命令进行启动。 10. 测试和部署:通过Postman或其他方式进行接口测试,确保微服务的正常运行。最后,根据实际需求选择合适的部署方式,如Docker、Kubernetes等。 以上是使用Spring Cloud Alibaba从零开始搭建微服务项目的基本步骤。当然,具体的实施细节会根据项目需求和实际情况有所差异,希望对你有所帮助!如果有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值