SaaS平台开发实战(三):用户服务模块

在上一章我们创建了基础服务模块,为其他模块提供基础支撑,包括日志、标签、租户、系统设置、数据字典等基础服务。

这一章我们将创建用户服务模块,主要提供客户、平台管理账户、商户等服务。

创建saasdemo-user模块

创建saasdemo-user模块

修改user模块pom.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion><parent><groupId>org.example</groupId><artifactId>SaasDemo</artifactId><version>1.0-SNAPSHOT</version></parent>
 6 
 7     <artifactId>saasdemo-user</artifactId>
 8 
 9     <properties>
10         <maven.compiler.source>8</maven.compiler.source>
11         <maven.compiler.target>8</maven.compiler.target>
12         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
13     </properties>
14     <dependencies>
15         <dependency>
16             <groupId>org.example</groupId>
17             <artifactId>saasdemo-core</artifactId>
18             <version>${project.version}</version>
19         </dependency>
20     </dependencies>
21     <build>
22         <pluginManagement>
23             <plugins>
24                 <plugin>
25                     <groupId>org.springframework.boot</groupId>
26                     <artifactId>spring-boot-maven-plugin</artifactId>
27                     <configuration>
28                         <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
29                     </configuration>
30                 </plugin>
31             </plugins>
32         </pluginManagement>
33     </build>
34 </project>
View Code

创建namespace

创建user模块namespace

创建应用入口

package org.example.saas.user;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan(value = {
        "com.chia.multienty.core",
        "org.example.saas.core",
        "org.example.saas.user",
})
@EnableDubbo
@MapperScan(value={"com.chia.multienty.core.mapper","org.example.saas.core.mapper"})
public class UserApplication {
    public static void main(String[] args) {
        System.setProperty("dubbo.application.logger","slf4j");
        ConfigurableApplicationContext context = SpringApplication.run(UserApplication.class, args);

    }
}

 

创建dubbo配置

首先在saasdemo-core中增加如下空接口,后面再填充

创建DubboReferenceConfiguration
package org.example.saas.user.config;

import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.spring.ReferenceBean;
import org.example.saas.core.dubbo.service.DubboMasterService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnProperty(prefix = "dubbo", name = "enabled", havingValue = "true")
public class DubboReferenceConfiguration {

    @Bean
    @DubboReference(timeout = 5000)
    public ReferenceBean<DubboMasterService> dubboMasterServiceReferenceBean() {
        return new ReferenceBean<>();
    }

    @Bean
    public DubboMasterService dubboMasterService(ReferenceBean<DubboMasterService> dubboMasterServiceReferenceBean) {
        DubboMasterService dubboMasterService = dubboMasterServiceReferenceBean.getObject();
        return dubboMasterService;
    }
}

 

在saasdemo-master模块中实现dubboMasterService接口

实现DubboMasterServiceImpl
package org.example.saas.master.dubbo.service.impl;

import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.example.saas.core.dubbo.service.DubboMasterService;


@DubboService
@RequiredArgsConstructor
public class DubboMasterServiceImpl implements DubboMasterService {

}

 

Ok, 现在用户模块构造完成,开始添加配置


切换到nacos后台

创建saasdemo-user-dev.yml

  1 spring:
  2     shardingSphere:
  3         # 开启分片
  4         enabled: true
  5     rabbitmq:
  6         # 禁用rabbitmq, 后面章节需要用到的时候再开放
  7         enabled: false
  8     datasource:
  9         type: com.alibaba.druid.pool.DruidDataSource
 10         dynamic:
 11             enabled: true
 12             # 设置默认数据源为分片数据源
 13             primary: ds_master
 14             datasource:
 15                 ds_master:
 16                     driver-class-name: com.mysql.cj.jdbc.Driver
 17                     url: jdbc:mysql://xxx.cn:3301/saas_master?autoReconnect=true&useUnicode=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
 18                     username: saas_master
 19                     password: xxxxx
 20                 # root帐号主要用于flyway进行数据迁移时自动授权,也可以不配置,但是需要先手动授权,否则会报错
 21                 ds_root:
 22                     driver-class-name: com.mysql.cj.jdbc.Driver
 23                     url: jdbc:mysql://xxxx.com:3333/mysql?autoReconnect=true&useUnicode=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
 24                     username: root
 25                     password: xxxxxxx
 26 
 27 
 28     kuta:
 29         multi-tenant:
 30             user-module-enabled: true
 31             domain: user.xxx.com
 32             security:
 33                 auth:
 34                     header: X-TOKEN
 35                     token-prefix: USER
 36                     base64-secret: 5LmQ6IGa5oOg5piv5LiA5Liq5aW9563667uf5ZWK5aW957O757uf6K+35rOf7zSP5LiN6KaB5Zyo5LiK6Z2i5Y+R5biD6L+d5rOV5L+h5oGv6L+Z5qC3566h55CG5ZGY5Lmf5LiN5aW95aSE55CG55qE
 37                     # 令牌持有时间(秒)
 38                     token-holding-time: 86400
 39                     # 客户持有令牌时间,-1永久
 40                     customer-token-time: 86400
 41                     # 续期时长
 42                     renew-time: 86400
 43                     # 是否支持多点登陆
 44                     multipoint-login-enabled: true
 45                     ignore-paths:
 46                         - /file/upload
 47                 rsa:
 48                     # 请根据自身情况设置
 49                     private-key: xxxxxx
 50                     public-key: xxxx==
 51             file:
 52                 # 大写
 53                 storage-mode: LOCAL
 54                 custom:
 55                     custom-file-upload-service-impl-class: org.example.saas.core.strategy.file.impl.QNYFileUploadServiceImpl
 56                 local:
 57                     path-prefix: C:\projects\multienty\store
 58                     url-prefix: https://${spring.kuta.multi-tenant.domain}/local/
 59 
 60         code-generator:
 61             author: "Multi Tenant Auto Generator"
 62             root-package: org.example.saas
 63             common-module-name: saasdemo-core
 64             table-prefix: saas_
 65             # 设置controller类放置模块名称
 66             controller-module-name: saasdemo-user
 67             # controller save path=project-path(user.dir) + "/" + controller-module-name + controller-file-path-suffix
 68             controller-file-path-suffix: /src/main/java/org/example/saas/user/controller
 69             dto-file-path-suffix: /src/main/java/org/example/saas
 70             # AUTO, NONE, INPUT, ASSIGN_ID, ASSIGN_UUID
 71             id-type: INPUT
 72             logic-delete-column-name: deleted
 73             dto-full-package-name: org.example.saas.core.domain.dto
 74             table-fills:
 75                 version: INSERT
 76                 create_time: INSERT
 77                 update_time: UPDATE
 78                 deleted: INSERT
 79                 status: INSERT
 80             packages:
 81                 controller: user.controller
 82                 entity: core.pojo
 83                 service: core.service.user
 84                 mapper: core.mapper
 85                 service-impl: core.service.user.impl
 86                 dto: core.domain.dto
 87                 parameter: core.parameter
 88             formatter:
 89                 controller: "%sController"
 90                 entity: "%s"
 91                 service: "%sService"
 92                 service-impl: "%sServiceImpl"
 93                 mapper: "%sMapper"
 94                 xml: "%sMapper"
 95             database:
 96                 host: xxxx.com
 97                 port: 3333
 98                 db-name: saas_user_1
 99                 username: saas_user_1
100                 password: xxxxx
101             package-merge-mapping:
102                 Customer: user
103                 CustomerWx:user
104                 CustomerAddress:user
105                 CustomerBalance:user
106                 BalanceBill:user
107              tables:                
108                  - saas_customer                
109                  - saas_customer_wx                
110                  - saas_customer_address                
111                  - saas_customer_balance           
112                  - saas_balance_bill
View Code

创建shardingsphere-saasdemo-user.yml

 1 spring:
 2     shardingsphere:
 3         enabled: true
 4         dataSource:
 5             common:
 6                 type: com.alibaba.druid.pool.DruidDataSource
 7                 validationQuery: SELECT 1 FROM DUAL
 8             names:
 9                 ds_user_1, ds_user_2
10             ds_user_1:
11                 type: com.alibaba.druid.pool.DruidDataSource
12                 driverClassName: com.mysql.cj.jdbc.Driver
13                 url: jdbc:mysql://xxxx:3333/saas_user_1?autoReconnect=true&useUnicode=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
14                 username: saas_user_1
15                 password: xxxxx
16             ds_user_2:
17                 type: com.alibaba.druid.pool.DruidDataSource
18                 driverClassName: com.mysql.cj.jdbc.Driver
19                 url: jdbc:mysql://xxxx:3333/saas_user_2?autoReconnect=true&useUnicode=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
20                 username: saas_user_2
21                 password: xxxxx
22         rules:
23             sharding:
24                 tables:
25                     saas_customer:
26                         actualDataNodes: ds_user_${1..2}.saas_customer
27                     saas_balance_bill:
28                         actualDataNodes: ds_user_${1..2}.saas_balance_bill
29                     saas_customer_address:
30                         actualDataNodes: ds_user_${1..2}.saas_customer_address
31                     saas_customer_balance:
32                         actualDataNodes: ds_user_${1..2}.saas_customer_balance
33                     saas_customer_wx:
34                         actualDataNodes: ds_user_${1..2}.saas_customer_wx
35                 shardingAlgorithms:
36                     user-db-inline:
37                         type: INLINE
38                         props: 
39                             algorithm-expression: ds_user_${tenant_id % 2 + 1 }
40 
41                 defaultDatabaseStrategy:
42                     standard:
43                         shardingColumn: tenant_id
44                         shardingAlgorithmName: user-db-inline
45                 bindingTables:
46                     - saas_customer, saas_customer_address, saas_customer_balance, saas_customer_wx
47         props:
48             sql-show: true
View Code

在前期我们并未开启调试,所以有一些公用配置并未配置,现在我们将这些公用配置都配置一下

sms.yml

 1 spring:
 2     sms:
 3         enabled: true
 4         active: aliyun
 5         #阿里云短信
 6         aliyun:
 7             #区域id,参考 https://help.aliyun.com/document_detail/40654.html?spm=a2c6h.13066369.0.0.c85c7eecnh6fH6
 8             region-id: cn-chengdu
 9             #产品名称:云通信短信API产品,开发者无需替换
10             name: Dysmsapi
11             #产品域名,开发者无需替换
12             domain: dysmsapi.aliyuncs.com
13             #产品keyid
14             key-id: XXXXX
15             #产品keysecret
16             key-secret: XXXXX
17             #短信签名
18             sign-name: 百灵鸟
19             #读取超时时间
20             read-timeout: 10000
21             #连接超时时间
22             connect-timeout: 10000
23             #运行模式 debug:调试模式(返回9999),release:发布模式,将实际发送短信
24             running-mode: release
25             #短信模板编号
26             templates:
27                 #登陆验证码
28                 verification-code: SMS_26700XXXX
View Code

rabbitmq.yml

 1   spring:
 2     rabbitmq:
 3       host: xxx.xxx.xxx.xxx
 4       port: 10086
 5       username: xxxx
 6       password: xxxxx
 7       virtual-host: /
 8       publisher-confirm-type: correlated
 9       publisher-returns: true
10       retry-execute-cron: "0 0/1 * * * ? "
11       # 每三分钟从数据库加载需要发送的Rabbit消息
12       reload-from-db-interval: 180000
13       retry-running: true
14       # 每超过1分钟重发一次
15       resubmit-threshold: 60000
16       # 重试的时候从缓存中删除阈值,超过(N * retry-threshold)则从缓存中删除
17       retry-remove-threshold: 5
18       #虚拟主机,使用server默认host
19       #virtual-host: JCcccHost
20       listener:
21         simple:
22           # 并行消费数量 格式:N/M-N
23           concurrency: 1
24           #手动确认模式
25           acknowledge-mode: manual
26           retry:
27             enabled: true
28             #最大重试次数
29             max-attempts: 10
30             # 重试最大间隔时间
31             max-interval: 10000
32             # 重试初始间隔时间
33             initial-interval: 2000
34             # 间隔时间乘子,间隔时间*乘子=下一次的间隔时间,最大不能超过设置的最大间隔时间
35             multiplier: 2
View Code

redis.yml

 1 spring:
 2     redis:
 3         enabled: true
 4         host: xxx.xxx.xxx.xxx
 5         port: 8165
 6         password: xxxxx
 7         database: 0
 8         timeout: 10000
 9         runningRedisInitialize: false
10         pingConnectionInterval: 1000
11         globalPrefix: KS-
12         jedis:
13             pool:
14                 max-active: 6000
15                 max-wait: 1000
16                 max-idle: 400
17                 min-idle: 0

 

以上公用配置的host、port、username 、password等均替换成您自己的配置即可

现在回到idea,创建以下文件和目录

saasdemo-user配置文件

application.yml

1 spring:
2   profiles:
3     active: dev
4 
5 dubbo.application.logger: slf4j

 

bootstrap.yml

  1 server:
  2   port: 8881
  3 
  4 spring:
  5   application:
  6     name: saasdemo-user
  7   cloud:
  8     nacos:
  9       discovery:
 10         server-addr: nacos.xxx.com:xxxx
 11         namespace: xxxxx
 12         username: xxxx
 13         password: xxxx
 14       config:
 15         server-addr: nacos.xxxx.cn:xxxx
 16         namespace: xxxxx
 17         username: xxxx
 18         password: xxxx
 19         file-extension: yml
 20         extension-configs[0]:
 21           data-id: shardingsphere-saasdemo-user.yml
 22           group: DEFAULT_GROUP
 23           refresh: true
 24         extension-configs[1]:
 25           data-id: kuta-multi-tenant.yml
 26           group: DEFAULT_GROUP
 27           refresh: true
 28         extension-configs[2]:
 29           data-id: redis.yml
 30           group: DEFAULT_GROUP
 31           refresh: true
 32         extension-configs[3]:
 33           data-id: rabbitmq.yml
 34           group: DEFAULT_GROUP
 35           refresh: true
 36 seata:
 37   enabled: true
 38   application-id: seata-server
 39   # 客户端和服务端在同一个事务组; Seata 事务组编号,用于 TC 集群名, 一定要和 config.tx(nacos) 中配置的相同
 40   tx-service-group: tx_user_group
 41   # 自动数据源代理
 42   enable-auto-data-source-proxy: false
 43   # 数据源代理模式(分布式事务方案)
 44   data-source-proxy-mode: AT
 45   service:
 46     vgroup-mapping:
 47       tx_user_group: default
 48   config:
 49     # support: nacos, consul, apollo, zk, etcd3, file
 50     type: nacos
 51     nacos:
 52       server-addr: xxxx
 53       namespace: xxxx
 54       group: SEATA_GROUP
 55       username: xxxx
 56       password: xxxxx
 57       data-id: seata-server.properties
 58       cluster: default
 59   registry:
 60     # support: nacos, eureka, redis, zk, consul, etcd3, sofa
 61     type: nacos
 62     nacos:
 63       server-addr: nacos.xxxx.cn:xxxx
 64       namespace: xxxx
 65       group: SEATA_GROUP
 66       username: xxxx
 67       password: xxxxx
 68       # 默认TC集群名
 69       cluster: default
 70       # 服务名,与服务端中registry.conf配置要一致
 71       application: seata-server
 72       context-path:
 73 
 74 dubbo:
 75   enabled: true
 76   metadata-report:
 77     address: nacos://xxxx.cn:xxxx?username=${dubbo.metadata-report.username}&password=${dubbo.metadata-report.password}
 78     username: xxxx
 79     password: xxxx
 80     parameters:
 81       namespace: xxxxx
 82     retry-times: 30  #重试次数,默认100
 83     cycle-report: false #关闭定时刷新
 84   application:
 85     name: user-provider
 86     # 禁用QOS同一台机器可能会有端口冲突现象
 87     qos-enable: false
 88     qos-accept-foreign-ip: false
 89     service-discovery:
 90       migration: FORCE_APPLICATION # FORCE_APPLICATION,只消费应用级地址,如无地址则报错,单订阅 3.x 地址
 91   protocol:
 92     name: dubbo
 93     port: -1
 94   scan:
 95     base-packages: org.example.saas.user.dubbo.service.impl
 96   cloud:
 97     subscribed-services: saasdemo-master
 98 
 99   registry:
100     address: nacos://xxxx.cn:xxxx?username=${dubbo.metadata-report.username}&password=${dubbo.metadata-report.password}
101     parameters:
102       namespace: xxxxxx
103   consumer:
104     check: false
View Code

 

logback-spring.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <configuration>
 3     <!-- 日志文件存放路径 -->
 4     <property name="log.path" value="./logs"/>
 5     <!-- 日志文件输出格式 -->
 6     <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger - [%method,%line] - %msg%n"/>
 7 
 8     <!-- 控制台输出 -->
 9     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
10         <encoder>
11             <pattern>${log.pattern}</pattern>
12         </encoder>
13     </appender>
14 
15     <!-- 系统日志输出 -->
16     <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
17         <file>${log.path}/sys-info.log</file>
18         <!-- 循环政策:基于时间创建日志文件 -->
19         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
20             <!-- 日志文件名格式 -->
21             <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
22             <!-- 日志最大的历史 30天 -->
23             <maxHistory>30</maxHistory>
24         </rollingPolicy>
25         <encoder>
26             <pattern>${log.pattern}</pattern>
27         </encoder>
28         <filter class="ch.qos.logback.classic.filter.LevelFilter">
29             <!-- 过滤的级别 -->
30             <level>INFO</level>
31             <!-- 匹配时的操作:接收(记录) -->
32             <onMatch>ACCEPT</onMatch>
33             <!-- 不匹配时的操作:拒绝(不记录) -->
34             <onMismatch>DENY</onMismatch>
35         </filter>
36     </appender>
37 
38     <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
39         <file>${log.path}/sys-error.log</file>
40         <!-- 循环政策:基于时间创建日志文件 -->
41         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
42             <!-- 日志文件名格式 -->
43             <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
44             <!-- 日志最大的历史 30天 -->
45             <maxHistory>30</maxHistory>
46         </rollingPolicy>
47         <encoder>
48             <pattern>${log.pattern}</pattern>
49         </encoder>
50         <filter class="ch.qos.logback.classic.filter.LevelFilter">
51             <!-- 过滤的级别 -->
52             <level>ERROR</level>
53             <!-- 匹配时的操作:接收(记录) -->
54             <onMatch>ACCEPT</onMatch>
55             <!-- 不匹配时的操作:拒绝(不记录) -->
56             <onMismatch>DENY</onMismatch>
57         </filter>
58     </appender>
59 
60     <!-- 用户访问日志输出  -->
61     <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
62         <file>${log.path}/sys-user.log</file>
63         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
64             <!-- 按天回滚 daily -->
65             <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
66             <!-- 日志最大的历史 30天 -->
67             <maxHistory>30</maxHistory>
68         </rollingPolicy>
69         <encoder>
70             <pattern>${log.pattern}</pattern>
71         </encoder>
72     </appender>
73 
74     <!-- 系统模块日志级别控制  -->
75     <logger name="com.chia.multienty.core" level="debug"/>
76     <!-- Spring日志级别控制  -->
77     <logger name="org.springframework" level="warn" />
78     <!-- mybatis-plus控制日志级别 -->
79     <logger name="com.baomidou.mybatisplus" level="error" />
80 
81     <root level="info">
82         <appender-ref ref="console"/>
83     </root>
84 
85     <!--系统操作日志-->
86     <root level="info">
87         <appender-ref ref="file_info"/>
88         <appender-ref ref="file_error"/>
89     </root>
90 
91     <!--系统用户操作日志-->
92     <logger name="sys-user" level="info">
93         <appender-ref ref="sys-user"/>
94     </logger>
95 </configuration>
View Code

 

V1.0.0__init_ddl.sql

  1 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  2 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  3 /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  4 /*!50503 SET NAMES utf8 */;
  5 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
  6 /*!40103 SET TIME_ZONE='+00:00' */;
  7 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
  8 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
  9 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
 10 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 11 
 12 --
 13 -- Table structure for table `saas_customer`
 14 --
 15 DROP TABLE IF EXISTS `saas_customer`;
 16 /*!40101 SET @saved_cs_client     = @@character_set_client */;
 17 /*!50503 SET character_set_client = utf8mb4 */;
 18 CREATE TABLE `saas_customer` (
 19   `customer_id` bigint NOT NULL COMMENT '客户编号',
 20   `tenant_id` bigint NOT NULL COMMENT '租户编号',
 21   `nick_name` varchar(32) NOT NULL COMMENT '昵称',
 22   `sex` tinyint(4) DEFAULT NULL COMMENT '性别',
 23   `birthday` DATETIME DEFAULT NULL COMMENT '生日',
 24   `phone_number` varchar(11) DEFAULT NULL COMMENT '电话号码',
 25   `avatar_url` varchar(256) DEFAULT NULL COMMENT '头像地址',
 26   `in_black_list` bit(1) NOT NULL COMMENT '是否已被拉黑',
 27   `is_member` bit(1) NOT NULL COMMENT '是否会员',
 28   `member_source_type` tinyint(4) NOT NULL COMMENT '会员来源类型',
 29   `member_id` bigint DEFAULT NULL COMMENT '会员编号',
 30   `growth` int NOT NULL COMMENT '成长值',
 31   `credit` int NOT NULL COMMENT '积分',
 32   `status` varchar(32) DEFAULT NULL COMMENT '状态',
 33   `version` bigint NOT NULL COMMENT '乐观锁版本号',
 34   `create_time` datetime NOT NULL COMMENT '创建时间',
 35   `update_time` datetime DEFAULT NULL COMMENT '更新时间',
 36   PRIMARY KEY (`customer_id`)
 37 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='客户';
 38 /*!40101 SET character_set_client = @saved_cs_client */;
 39 
 40 
 41 
 42 
 43 --
 44 -- Table structure for table `saas_customer_wx`
 45 --
 46 DROP TABLE IF EXISTS `saas_customer_wx`;
 47 /*!40101 SET @saved_cs_client     = @@character_set_client */;
 48 /*!50503 SET character_set_client = utf8mb4 */;
 49 CREATE TABLE `saas_customer_wx` (
 50   `customer_id` bigint NOT NULL COMMENT '客户编号',
 51   `tenant_id` bigint NOT NULL COMMENT '租户编号',
 52   `wx_open_id` varchar(64) DEFAULT NULL COMMENT '微信openid',
 53   `wx_union_id` varchar(64) DEFAULT NULL COMMENT '微信unionid',
 54   `wx_nick_name` varchar(32) DEFAULT NULL COMMENT '微信昵称',
 55   `wx_id` varchar(48) DEFAULT NULL COMMENT '微信id',
 56   `access_token` varchar(128) DEFAULT NULL COMMENT '执行令牌',
 57   `refresh_token` varchar(128) DEFAULT NULL COMMENT '刷新令牌',
 58   `status` varchar(32) NOT NULL COMMENT '状态',
 59   `version` bigint NOT NULL COMMENT '乐观锁版本号',
 60   `create_time` datetime NOT NULL COMMENT '创建时间',
 61   `update_time` datetime DEFAULT NULL COMMENT '更新时间',
 62   PRIMARY KEY (`customer_id`)
 63 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='客户微信';
 64 /*!40101 SET character_set_client = @saved_cs_client */;
 65 
 66 
 67 --
 68 -- Table structure for table `saas_customer_address`
 69 --
 70 DROP TABLE IF EXISTS `saas_customer_address`;
 71 /*!40101 SET @saved_cs_client     = @@character_set_client */;
 72 /*!50503 SET character_set_client = utf8mb4 */;
 73 CREATE TABLE `saas_customer_address` (
 74   `address_id` bigint NOT NULL COMMENT '客户地址编号',
 75   `customer_id` bigint NOT NULL COMMENT '客户编号',
 76   `tenant_id` bigint NOT NULL COMMENT '租户编号',
 77   `name` varchar(32) NOT NULL COMMENT '收货人姓名',
 78   `phone_number` varchar(11) NOT NULL COMMENT '收货人电话',
 79   `region` varchar(64) NOT NULL COMMENT '地域',
 80   `province` varchar(64) NOT NULL COMMENT '省份',
 81   `city` varchar(64) NOT NULL COMMENT '城市',
 82   `district` varchar(64) NOT NULL COMMENT '区县',
 83   `street` varchar(64) DEFAULT NULL COMMENT '街道',
 84   `house_number` varchar(64) NOT NULL COMMENT '门牌号',
 85   `status` varchar(32) NOT NULL COMMENT '状态',
 86   `version` bigint NOT NULL COMMENT '乐观锁版本号',
 87   `create_time` datetime NOT NULL COMMENT '创建时间',
 88   `update_time` datetime DEFAULT NULL COMMENT '更新时间',
 89   PRIMARY KEY (`address_id`)
 90 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='客户地址';
 91 /*!40101 SET character_set_client = @saved_cs_client */;
 92 
 93 
 94 --
 95 -- Table structure for table `saas_customer_balance`
 96 --
 97 DROP TABLE IF EXISTS `saas_customer_balance`;
 98 /*!40101 SET @saved_cs_client     = @@character_set_client */;
 99 /*!50503 SET character_set_client = utf8mb4 */;
100 CREATE TABLE `saas_customer_balance` (
101   `customer_id` bigint NOT NULL COMMENT '客户编号',
102   `tenant_id` bigint NOT NULL COMMENT '租户编号',
103   `total` decimal(12,2) NOT NULL COMMENT '总余额',
104   `usable` decimal(12,2) NOT NULL COMMENT '可用的余额',
105   `frozen` decimal(12,2) NOT NULL COMMENT '冻结的余额',
106   `hidden` bit(1) NOT NULL COMMENT '是否隐藏余额',
107   `status` varchar(32) NOT NULL COMMENT '状态',
108   `version` bigint NOT NULL COMMENT '乐观锁版本号',
109   `create_time` datetime NOT NULL COMMENT '创建时间',
110   `update_time` datetime DEFAULT NULL COMMENT '更新时间',
111   PRIMARY KEY (`customer_id`)
112 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='客户余额';
113 /*!40101 SET character_set_client = @saved_cs_client */;
114 
115 
116 
117 --
118 -- Table structure for table `saas_balance_bill`
119 --
120 DROP TABLE IF EXISTS `saas_balance_bill`;
121 /*!40101 SET @saved_cs_client     = @@character_set_client */;
122 /*!50503 SET character_set_client = utf8mb4 */;
123 CREATE TABLE `saas_balance_bill` (
124   `bill_id` bigint NOT NULL COMMENT '余额变更记录编号',
125   `customer_id` bigint NOT NULL COMMENT '客户编号',
126   `tenant_id` bigint DEFAULT NULL COMMENT '租户编号',
127   `amount` decimal(12,2) DEFAULT NULL COMMENT '变动金额',
128   `operator` bigint DEFAULT NULL COMMENT '操作者',
129   `reason` varchar(50) DEFAULT NULL COMMENT '原因',
130   `remark` varchar(255) DEFAULT NULL COMMENT '备注',
131   `trigger` tinyint(4) DEFAULT NULL COMMENT '触发应用编号',
132   `trade_id` bigint DEFAULT NULL COMMENT '交易编号',
133   `before` decimal(12,2) DEFAULT NULL COMMENT '变动前余额',
134   `after` decimal(12,2) DEFAULT NULL COMMENT '变动后余额',
135   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
136   PRIMARY KEY (`bill_id`)
137 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='余额账单';
138 /*!40101 SET character_set_client = @saved_cs_client */;
139 
140 
141 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
142 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
143 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
144 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
145 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
146 /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
147 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
148 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
View Code

 

OK, 用户模块配置完成, 由于篇幅原因,这一章就不再加入调试部分章节,可能会有部分错误,下一章我们将开始自动生成用户模块的表,自动生成代码,使用postman调试接口, 敬请关注!

posted @ 2024-02-24 23:24  kutasms  阅读(33)  评论(0)    收藏  举报