SaaS平台开发实战(四):让基础模块和用户模块运行起来
在前面的章节我们创建了基础模块和用户模块, 从这一章开始,我们需要让这两个模块都运行起来。
如果您在本章发布之前跟着前面的章节实操,请从git重新拉取项目。
在运行前, 我们修改了第二章中的部分配置内容
bootstrap.yml
spring.application.name: saasdemo-master
删除spring.cloud.nacos.config.extension-configs[3] (vue-code-generator.yml)
这是用于vue代码生成的,在后面的章节会有详细描述。
启动MasterApplication, 出现以下输出表示启动成功!

打开数据库我们可以看到自动在数据库中生成了这些表, 由于这些表在基础库中已生成代码,此处我们就不再生成代码了。
接下来我们调试用户模块
启动UserApplication,出现以下内容表示成功

我们发现缺少了undo_log表,添加V1.0.1__create_undo_ddl.sql,再重新启动
上一章中saasdemo-user-dev.yml配置文件需要做如下调整,用于创建租户

在postman中进行测试,注意headers中增加
X-APP-ID表示应用类型,可查看ApplicationType
租户已入库,我们复制tenant_id,用于后面的测试
我们查看日志表,已正常保存日志,接下来我们需要为用户模块生成代码
调用生成代码接口,成功生成代码


Entity
1 package org.example.saas.core.pojo; 2 3 import com.baomidou.mybatisplus.annotation.FieldFill; 4 import com.baomidou.mybatisplus.annotation.IdType; 5 import com.baomidou.mybatisplus.annotation.TableField; 6 import com.baomidou.mybatisplus.annotation.TableId; 7 import com.baomidou.mybatisplus.annotation.TableName; 8 import java.math.BigDecimal; 9 import java.time.LocalDateTime; 10 import java.io.Serializable; 11 import io.swagger.annotations.ApiModel; 12 import io.swagger.annotations.ApiModelProperty; 13 import lombok.Data; 14 import lombok.EqualsAndHashCode; 15 import lombok.experimental.Accessors; 16 17 /** 18 * <p> 19 * 余额账单 20 * </p> 21 * 22 * @author Multi Tenant Auto Generator 23 * @since 2024-02-24 24 */ 25 @Data 26 @EqualsAndHashCode(callSuper = false) 27 @Accessors(chain = true) 28 @TableName("saas_balance_bill") 29 @ApiModel(value="BalanceBill对象", description="余额账单") 30 public class BalanceBill implements Serializable { 31 32 33 /** 34 * 余额变更记录编号 35 */ 36 @ApiModelProperty(value = "余额变更记录编号") 37 @TableId(value = "bill_id", type = IdType.INPUT) 38 private Long billId; 39 40 /** 41 * 客户编号 42 */ 43 @ApiModelProperty(value = "客户编号") 44 @TableField("`customer_id`") 45 private Long customerId; 46 47 /** 48 * 租户编号 49 */ 50 @ApiModelProperty(value = "租户编号") 51 @TableField("`tenant_id`") 52 private Long tenantId; 53 54 /** 55 * 变动金额 56 */ 57 @ApiModelProperty(value = "变动金额") 58 @TableField("`amount`") 59 private BigDecimal amount; 60 61 /** 62 * 操作者 63 */ 64 @ApiModelProperty(value = "操作者") 65 @TableField("`operator`") 66 private Long operator; 67 68 /** 69 * 原因 70 */ 71 @ApiModelProperty(value = "原因") 72 @TableField("`reason`") 73 private String reason; 74 75 /** 76 * 备注 77 */ 78 @ApiModelProperty(value = "备注") 79 @TableField("`remark`") 80 private String remark; 81 82 /** 83 * 触发应用编号 84 */ 85 @ApiModelProperty(value = "触发应用编号") 86 @TableField("`trigger`") 87 private Byte trigger; 88 89 /** 90 * 交易编号 91 */ 92 @ApiModelProperty(value = "交易编号") 93 @TableField("`trade_id`") 94 private Long tradeId; 95 96 /** 97 * 变动前余额 98 */ 99 @ApiModelProperty(value = "变动前余额") 100 @TableField("`before`") 101 private BigDecimal before; 102 103 /** 104 * 变动后余额 105 */ 106 @ApiModelProperty(value = "变动后余额") 107 @TableField("`after`") 108 private BigDecimal after; 109 110 /** 111 * 创建时间 112 */ 113 @ApiModelProperty(value = "创建时间") 114 @TableField(value = "`create_time`", fill = FieldFill.INSERT) 115 private LocalDateTime createTime; 116 117 118 }
DTO
1 package org.example.saas.core.domain.dto; 2 3 import org.example.saas.core.pojo.BalanceBill; 4 import io.swagger.annotations.ApiModel; 5 import io.swagger.annotations.ApiModelProperty; 6 import lombok.Data; 7 import lombok.EqualsAndHashCode; 8 /** 9 * <p> 10 * 余额账单 DTO对象 11 * </p> 12 * 13 * @author Multi Tenant Auto Generator 14 * @since 2024-02-24 15 */ 16 @Data 17 @EqualsAndHashCode(callSuper = true) 18 @ApiModel(value="BalanceBillDTO", description="余额账单DTO对象") 19 public class BalanceBillDTO extends BalanceBill { 20 }
Mapper
1 package org.example.saas.core.mapper; 2 3 import org.example.saas.core.pojo.BalanceBill; 4 import com.chia.multienty.core.mybatis.KutaBaseMapper; 5 6 /** 7 * <p> 8 * 余额账单 Mapper 接口 9 * </p> 10 * 11 * @author Multi Tenant Auto Generator 12 * @since 2024-02-24 13 */ 14 public interface BalanceBillMapper extends KutaBaseMapper<BalanceBill> { 15 16 }
Parameter
1 package org.example.saas.core.parameter.user; 2 3 import lombok.Data; 4 import com.chia.multienty.core.annotation.LogMetaId; 5 import javax.validation.constraints.NotNull; 6 import java.math.BigDecimal; 7 import java.time.LocalDateTime; 8 import io.swagger.annotations.ApiModel; 9 import io.swagger.annotations.ApiModelProperty; 10 import lombok.experimental.Accessors; 11 /** 12 * <p> 13 * 余额账单删除请求 14 * </p> 15 * 16 * @author Multi Tenant Auto Generator 17 * @since 2024-02-24 18 */ 19 20 @Data 21 @ApiModel(value = "BalanceBillDeleteParameter",description = "余额账单删除请求") 22 @Accessors(chain = true) 23 public class BalanceBillDeleteParameter { 24 25 /** 26 * 余额变更记录编号 27 */ 28 @ApiModelProperty(value = "余额变更记录编号") 29 @LogMetaId 30 private Long billId; 31 /** 32 * 租户编号 33 */ 34 @ApiModelProperty(value = "租户编号") 35 @NotNull 36 private Long tenantId; 37 38 }
Service
1 package org.example.saas.core.service.user; 2 3 import org.example.saas.core.pojo.BalanceBill; 4 import com.chia.multienty.core.mybatis.service.KutaBaseService; 5 import com.baomidou.mybatisplus.core.metadata.IPage; 6 import org.example.saas.core.domain.dto.BalanceBillDTO; 7 import org.example.saas.core.parameter.user.BalanceBillDetailGetParameter; 8 import org.example.saas.core.parameter.user.BalanceBillPageGetParameter; 9 import org.example.saas.core.parameter.user.BalanceBillDeleteParameter; 10 import org.example.saas.core.parameter.user.BalanceBillSaveParameter; 11 import org.example.saas.core.parameter.user.BalanceBillUpdateParameter; 12 /** 13 * <p> 14 * 余额账单 服务类 15 * </p> 16 * 17 * @author Multi Tenant Auto Generator 18 * @since 2024-02-24 19 */ 20 public interface BalanceBillService extends KutaBaseService<BalanceBill> { 21 22 BalanceBillDTO getDetail(BalanceBillDetailGetParameter parameter); 23 24 void delete(BalanceBillDeleteParameter parameter); 25 26 IPage<BalanceBillDTO> getPage(BalanceBillPageGetParameter parameter); 27 28 void save(BalanceBillSaveParameter parameter); 29 30 void update(BalanceBillUpdateParameter parameter); 31 32 }
Controller
1 package org.example.saas.user.controller; 2 3 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.example.saas.core.service.user.BalanceBillService; 6 import org.example.saas.core.domain.dto.BalanceBillDTO; 7 import org.example.saas.core.pojo.BalanceBill; 8 import org.example.saas.core.parameter.user.BalanceBillDetailGetParameter; 9 import org.example.saas.core.parameter.user.BalanceBillPageGetParameter; 10 import org.example.saas.core.parameter.user.BalanceBillDeleteParameter; 11 import org.example.saas.core.parameter.user.BalanceBillSaveParameter; 12 import org.example.saas.core.parameter.user.BalanceBillUpdateParameter; 13 import com.baomidou.mybatisplus.core.metadata.IPage; 14 import org.springframework.validation.annotation.Validated; 15 import org.springframework.web.bind.annotation.*; 16 import com.chia.multienty.core.annotation.WebLog; 17 import com.chia.multienty.core.domain.basic.Result; 18 import org.springframework.web.bind.annotation.RestController; 19 import lombok.RequiredArgsConstructor; 20 import io.swagger.annotations.Api; 21 import io.swagger.annotations.ApiOperation; 22 /** 23 * <p> 24 * 余额账单 服务 25 * </p> 26 * 27 * @author Multi Tenant Auto Generator 28 * @since 2024-02-24 29 */ 30 @RestController 31 @Validated 32 @RequestMapping("/balance-bill") 33 @RequiredArgsConstructor 34 @Api(tags = "余额账单") 35 public class BalanceBillController { 36 private final BalanceBillService balanceBillService; 37 38 @PostMapping("/detail") 39 @ApiOperation("获取余额账单详情") 40 public Result<BalanceBillDTO> getDetail(@Validated @RequestBody BalanceBillDetailGetParameter parameter) { 41 BalanceBillDTO detail = balanceBillService.getDetail(parameter); 42 return new Result<>(detail); 43 } 44 45 @PostMapping("/page") 46 @ApiOperation("获取余额账单分页列表") 47 public Result<IPage<BalanceBillDTO>> getPage(@Validated @RequestBody BalanceBillPageGetParameter parameter) { 48 IPage<BalanceBillDTO> page = balanceBillService.getPage(parameter); 49 return new Result<>(page); 50 } 51 52 @PostMapping("/update") 53 @ApiOperation("更新余额账单") 54 @WebLog 55 public Result<Boolean> update(@Validated @RequestBody BalanceBillUpdateParameter parameter) { 56 balanceBillService.update(parameter); 57 return new Result<>(true); 58 } 59 60 @PostMapping("/save") 61 @ApiOperation("保存余额账单") 62 @WebLog 63 public Result<Boolean> save(@Validated @RequestBody BalanceBillSaveParameter parameter) { 64 balanceBillService.save(parameter); 65 return new Result<>(true); 66 } 67 68 69 @DeleteMapping("/delete") 70 @ApiOperation("删除余额账单") 71 @WebLog 72 public Result<Boolean> delete(@Validated @RequestBody BalanceBillDeleteParameter parameter) { 73 balanceBillService.delete(parameter); 74 return new Result<>(true); 75 } 76 77 }
代码生成器会根据shardingsphere的配置生成不同的代码,用户模块仅分库,会加入tenant_id,后续订单模块会有分表,到时候可以看到更多的变化。
本章已构造完毕基础数据,下一章将开始创建客户,加入订单模块

浙公网安备 33010602011771号