目录
导读
在前面的章节我们创建了基础模块和用户模块, 从这一章开始,我们需要让这两个模块都运行起来。
如果您在本章发布之前跟着前面的章节实操,请从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,后续订单模块会有分表,到时候可以看到更多的变化。
本章已构造完毕基础数据,下一章将开始创建客户,加入订单模块