SaaS平台开发实战(四):让基础模块和用户模块运行起来

目录

导读

构建环境

Master服务模块

自动生成数据表

用户服务模块

自动生成数据表

增加undo_log

增加master数据源

Postman调试

自动生成代码

总结


导读

在前面的章节我们创建了基础模块和用户模块, 从这一章开始,我们需要让这两个模块都运行起来。

如果您在本章发布之前跟着前面的章节实操,请从git重新拉取项目。

在运行前, 我们修改了第二章中的部分配置内容

bootstrap.yml

spring.application.name: saasdemo-master

删除spring.cloud.nacos.config.extension-configs[3] (vue-code-generator.yml)

这是用于vue代码生成的,在后面的章节会有详细描述。

构建环境

Master服务模块

启动MasterApplication, 出现以下输出表示启动成功!

自动生成数据表

打开数据库我们可以看到自动在数据库中生成了这些表, 由于这些表在基础库中已生成代码,此处我们就不再生成代码了。

用户服务模块

接下来我们调试用户模块

启动UserApplication,出现以下内容表示成功

自动生成数据表

saas_user数据库自动建表

增加undo_log

我们发现缺少了undo_log表,添加V1.0.1__create_undo_ddl.sql,再重新启动

--
-- Table structure for table `undo_log`
--
DROP TABLE IF EXISTS `undo_log`;
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

增加master数据源

上一章中saasdemo-user-dev.yml配置文件需要做如下调整,用于创建租户

因tenant表(租户表)是在master数据库中,所以用户服务模块增加master数据库源

Postman调试

在postman中进行测试,注意headers中增加X-APP-ID表示应用类型,可查看ApplicationType

租户已入库,我们复制tenant_id,用于后面的测试

我们查看日志表,已正常保存日志,接下来我们需要为用户模块生成代码

自动生成代码

调用生成代码接口,成功生成代码

Entity

package org.example.saas.core.pojo;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 * 余额账单
 * </p>
 *
 * @author Multi Tenant Auto Generator
 * @since 2024-02-24
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("saas_balance_bill")
@ApiModel(value="BalanceBill对象", description="余额账单")
public class BalanceBill implements Serializable {


    /**
     * 余额变更记录编号
     */
    @ApiModelProperty(value = "余额变更记录编号")
    @TableId(value = "bill_id", type = IdType.INPUT)
    private Long billId;

    /**
     * 客户编号
     */
    @ApiModelProperty(value = "客户编号")
    @TableField("`customer_id`")
    private Long customerId;

    /**
     * 租户编号
     */
    @ApiModelProperty(value = "租户编号")
    @TableField("`tenant_id`")
    private Long tenantId;

    /**
     * 变动金额
     */
    @ApiModelProperty(value = "变动金额")
    @TableField("`amount`")
    private BigDecimal amount;

    /**
     * 操作者
     */
    @ApiModelProperty(value = "操作者")
    @TableField("`operator`")
    private Long operator;

    /**
     * 原因
     */
    @ApiModelProperty(value = "原因")
    @TableField("`reason`")
    private String reason;

    /**
     * 备注
     */
    @ApiModelProperty(value = "备注")
    @TableField("`remark`")
    private String remark;

    /**
     * 触发应用编号
     */
    @ApiModelProperty(value = "触发应用编号")
    @TableField("`trigger`")
    private Byte trigger;

    /**
     * 交易编号
     */
    @ApiModelProperty(value = "交易编号")
    @TableField("`trade_id`")
    private Long tradeId;

    /**
     * 变动前余额
     */
    @ApiModelProperty(value = "变动前余额")
    @TableField("`before`")
    private BigDecimal before;

    /**
     * 变动后余额
     */
    @ApiModelProperty(value = "变动后余额")
    @TableField("`after`")
    private BigDecimal after;

    /**
     * 创建时间
     */
    @ApiModelProperty(value = "创建时间")
    @TableField(value = "`create_time`", fill = FieldFill.INSERT)
    private LocalDateTime createTime;


}

DTO

package org.example.saas.core.domain.dto;

import org.example.saas.core.pojo.BalanceBill;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 * 余额账单 DTO对象
 * </p>
 *
 * @author Multi Tenant Auto Generator
 * @since 2024-02-24
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="BalanceBillDTO", description="余额账单DTO对象")
public class BalanceBillDTO extends BalanceBill {
}

Mapper

package org.example.saas.core.mapper;

import org.example.saas.core.pojo.BalanceBill;
import com.chia.multienty.core.mybatis.KutaBaseMapper;

/**
 * <p>
 * 余额账单 Mapper 接口
 * </p>
 *
 * @author Multi Tenant Auto Generator
 * @since 2024-02-24
 */
public interface BalanceBillMapper extends KutaBaseMapper<BalanceBill> {

}

Parameter

package org.example.saas.core.parameter.user;

import lombok.Data;
import com.chia.multienty.core.annotation.LogMetaId;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.experimental.Accessors;
/**
 * <p>
 * 余额账单删除请求
 * </p>
 *
 * @author Multi Tenant Auto Generator
 * @since 2024-02-24
 */

@Data
@ApiModel(value = "BalanceBillDeleteParameter",description = "余额账单删除请求")
@Accessors(chain = true)
public class BalanceBillDeleteParameter {

    /**
     * 余额变更记录编号
     */
    @ApiModelProperty(value = "余额变更记录编号")
    @LogMetaId
    private Long billId;
    /**
     * 租户编号
     */
    @ApiModelProperty(value = "租户编号")
    @NotNull
    private Long tenantId;

}

Service

package org.example.saas.core.service.user;

import org.example.saas.core.pojo.BalanceBill;
import com.chia.multienty.core.mybatis.service.KutaBaseService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.example.saas.core.domain.dto.BalanceBillDTO;
import org.example.saas.core.parameter.user.BalanceBillDetailGetParameter;
import org.example.saas.core.parameter.user.BalanceBillPageGetParameter;
import org.example.saas.core.parameter.user.BalanceBillDeleteParameter;
import org.example.saas.core.parameter.user.BalanceBillSaveParameter;
import org.example.saas.core.parameter.user.BalanceBillUpdateParameter;
/**
 * <p>
 * 余额账单 服务类
 * </p>
 *
 * @author Multi Tenant Auto Generator
 * @since 2024-02-24
 */
public interface BalanceBillService extends KutaBaseService<BalanceBill> {

    BalanceBillDTO getDetail(BalanceBillDetailGetParameter parameter);

    void delete(BalanceBillDeleteParameter parameter);

    IPage<BalanceBillDTO> getPage(BalanceBillPageGetParameter parameter);

    void save(BalanceBillSaveParameter parameter);

    void update(BalanceBillUpdateParameter parameter);

}

Controller

package org.example.saas.user.controller;


import org.springframework.web.bind.annotation.RequestMapping;
import org.example.saas.core.service.user.BalanceBillService;
import org.example.saas.core.domain.dto.BalanceBillDTO;
import org.example.saas.core.pojo.BalanceBill;
import org.example.saas.core.parameter.user.BalanceBillDetailGetParameter;
import org.example.saas.core.parameter.user.BalanceBillPageGetParameter;
import org.example.saas.core.parameter.user.BalanceBillDeleteParameter;
import org.example.saas.core.parameter.user.BalanceBillSaveParameter;
import org.example.saas.core.parameter.user.BalanceBillUpdateParameter;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.chia.multienty.core.annotation.WebLog;
import com.chia.multienty.core.domain.basic.Result;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
 * <p>
 * 余额账单 服务
 * </p>
 *
 * @author Multi Tenant Auto Generator
 * @since 2024-02-24
 */
@RestController
@Validated
@RequestMapping("/balance-bill")
@RequiredArgsConstructor
@Api(tags = "余额账单")
public class BalanceBillController {
    private final BalanceBillService balanceBillService;

    @PostMapping("/detail")
    @ApiOperation("获取余额账单详情")
    public Result<BalanceBillDTO> getDetail(@Validated @RequestBody BalanceBillDetailGetParameter parameter) {
        BalanceBillDTO detail = balanceBillService.getDetail(parameter);
        return new Result<>(detail);
    }

    @PostMapping("/page")
    @ApiOperation("获取余额账单分页列表")
    public Result<IPage<BalanceBillDTO>> getPage(@Validated @RequestBody BalanceBillPageGetParameter parameter) {
        IPage<BalanceBillDTO> page = balanceBillService.getPage(parameter);
        return new Result<>(page);
    }

    @PostMapping("/update")
    @ApiOperation("更新余额账单")
    @WebLog
    public Result<Boolean> update(@Validated @RequestBody BalanceBillUpdateParameter parameter) {
        balanceBillService.update(parameter);
        return new Result<>(true);
    }

    @PostMapping("/save")
    @ApiOperation("保存余额账单")
    @WebLog
    public Result<Boolean> save(@Validated @RequestBody BalanceBillSaveParameter parameter) {
        balanceBillService.save(parameter);
        return new Result<>(true);
    }


    @DeleteMapping("/delete")
    @ApiOperation("删除余额账单")
    @WebLog
    public Result<Boolean> delete(@Validated @RequestBody BalanceBillDeleteParameter parameter) {
        balanceBillService.delete(parameter);
        return new Result<>(true);
    }

}

总结

代码生成器会根据shardingsphere的配置生成不同的代码,用户模块仅分库,会加入tenant_id,后续订单模块会有分表,到时候可以看到更多的变化。

本章已构造完毕基础数据,下一章将开始创建客户,加入订单模块

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Multienty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值