SaaS平台开发实战(三):用户服务模块
在上一章我们创建了基础服务模块,为其他模块提供基础支撑,包括日志、标签、租户、系统设置、数据字典等基础服务。
这一章我们将创建用户服务模块,主要提供客户、平台管理账户、商户等服务。
创建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>
创建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中增加如下空接口,后面再填充

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接口

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
创建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
在前期我们并未开启调试,所以有一些公用配置并未配置,现在我们将这些公用配置都配置一下
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
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
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,创建以下文件和目录

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

浙公网安备 33010602011771号