多租户app (多租户管理系统设计架构)

记账有助于自己:1、消费限制、2、智能账单、3、消费计划4、重点消费。

不少人对于自己的消费没有节制,以致于即使不在自己消费能力之内也去过度消费,从而导致了生活压力的不断增加,严重影响了正常的生活方式。

因此市场上的记账类APP应用如雨后春笋般出现。那么如果要自己开发一款记账类APP的话,需要如何进行数据库存储方案及接口的设计呢?

接下来作者将带着你实操多租户记账类APP数据接口的设计方案

一、数据库表设计(四个库表)

订单表

CREATE TABLE `ngs_bill` (
  `BILL_ID` varchar(64) NOT NULL DEFAULT 'UUID()' COMMENT '订单ID',
  `BILL_COST` decimal(32,2) DEFAULT NULL COMMENT '花费金额',
  `BILL_CONTENT` varchar(32) DEFAULT NULL COMMENT '备注',
  `USER_ID` varchar(32) DEFAULT NULL COMMENT '用户ID',
  `BILL_TYPE` varchar(32) DEFAULT NULL COMMENT '类型(1:收入,2:支出)',
  `BUS_TYPE` varchar(32) DEFAULT NULL COMMENT '用途类型,数据字典BUS_TYPE',
  `PAY_TYPE` varchar(32) DEFAULT NULL COMMENT '支付方式,数据字典PAY_TYPE',
  `TENANT_ID` varchar(64) DEFAULT NULL COMMENT '所属住户',
  `CREATED_BY` varchar(32) DEFAULT NULL COMMENT '创建人',
  `CREATED_TIME` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人',
  `UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新时间',
  `IS_DELETE` varchar(10) DEFAULT '0' COMMENT '是否删除,1:删除',
  PRIMARY KEY (`BILL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表 '

字典表

CREATE TABLE `ngs_dict` (
  `DICT_ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典主键',
  `DICT_NAME` varchar(64) DEFAULT NULL COMMENT '字典名称',
  `DICT_TYPE` varchar(32) DEFAULT NULL COMMENT '字典编码',
  `DICT_STATUS` varchar(32) DEFAULT '0' COMMENT '状态(0正常 1停用)',
  `TENANT_ID` varchar(64) DEFAULT NULL COMMENT '所属租户',
  `SORT_ID` int(11) DEFAULT NULL COMMENT '排序',
  `CREATED_BY` varchar(32) DEFAULT NULL COMMENT '创建人',
  `CREATED_TIME` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人',
  `UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`DICT_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='数据字典

字典子项表

CREATE TABLE `ngs_dict_data` (
  `DICT_DATA_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '字典子项主键',
  `DICT_DATA_LABEL` varchar(32) DEFAULT NULL COMMENT '字典标签',
  `DICT_DATA_VALUE` varchar(32) DEFAULT NULL COMMENT '字典键值',
  `DICT_TYPE` varchar(255) DEFAULT NULL COMMENT '字典类型',
  `DICT_DATA_STATUS` varchar(32) DEFAULT '0' COMMENT '状态(0正常 ,1停用)',
  `SORT_ID` int(11) DEFAULT NULL COMMENT '排序',
  `TENANT_ID` varchar(64) DEFAULT NULL COMMENT '所属租户',
  `CREATED_BY` varchar(32) DEFAULT NULL COMMENT '创建人',
  `CREATED_TIME` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人',
  `UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新时间',
  `DICT_DATA_IMG` varchar(255) DEFAULT NULL COMMENT '字典子项图片',
  `IN_OR_OUT` varchar(10) DEFAULT NULL COMMENT '默认全部,收入:IN,支出:out',
  PRIMARY KEY (`DICT_DATA_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COMMENT='数据字典子项 '

用户表

CREATE TABLE `ngs_user` (
  `USER_ID` varchar(128) NOT NULL DEFAULT 'UUID()' COMMENT '用户ID',
  `USER_NAME` varchar(128) DEFAULT NULL COMMENT '名称',
  `LOGIN_ID` varchar(128) DEFAULT NULL COMMENT '登录账号',
  `PASS_WORD` varchar(128) DEFAULT NULL COMMENT '密码',
  `USER_EMAIL` varchar(32) DEFAULT NULL COMMENT '用户邮箱',
  `MOBILE_PHONE` varchar(32) DEFAULT NULL COMMENT '用户电话',
  `USER_SEX` varchar(32) DEFAULT NULL COMMENT '用户性别(男,女)',
  `BIRTHDAY` date DEFAULT NULL COMMENT '用户生日',
  `USER_STATUS` varchar(32) DEFAULT '1' COMMENT '用户状态(1:启用,2:停用)',
  `TENANT_ID` varchar(64) DEFAULT NULL COMMENT '所属租户',
  `USER_PHOTO` varchar(1024) DEFAULT NULL COMMENT '用户头像',
  `CREATED_BY` varchar(32) DEFAULT NULL COMMENT '创建人',
  `CREATED_TIME` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人',
  `UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`USER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表 '

二、初始化数据

#一、数据库表
#1、用户表
#NGS_USER

INSERT INTO NGS_USER(USER_ID,USER_NAME,LOGIN_ID,PASS_WORD,USER_EMAIL,MOBILE_PHONE,USER_SEX,BIRTHDAY,TENANT_ID,USER_PHOTO) 
VALUES('dijia','迪迦','dijia','dijia','dijia@qq.com','1376087997','男','1992-10-10','e32734cdbad84e3c8d9aca99e39eb836','dijia.jpg');

#2、字典表
#NGS_DICT
INSERT INTO `ngs_dict`(DICT_NAME,DICT_TYPE,TENANT_ID,SORT_ID) VALUES('记账类型','BILL_TYPE','e32734cdbad84e3c8d9aca99e39eb836',1);
INSERT INTO `ngs_dict`(DICT_NAME,DICT_TYPE,TENANT_ID,SORT_ID) VALUES('用途类型','BUS_TYPE','e32734cdbad84e3c8d9aca99e39eb836',2);
INSERT INTO `ngs_dict`(DICT_NAME,DICT_TYPE,TENANT_ID,SORT_ID) VALUES('支付方式','PAY_TYPE','e32734cdbad84e3c8d9aca99e39eb836',3);
#NGS_DICT_DATA


INSERT INTO `ngs_dict_data`(DICT_DATA_LABEL,DICT_DATA_VALUE,DICT_TYPE,SORT_ID,TENANT_ID,DICT_DATA_IMG) VALUES('收入','IN','BILL_TYPE',1,'e32734cdbad84e3c8d9aca99e39eb836','IN.png');
INSERT INTO `ngs_dict_data`(DICT_DATA_LABEL,DICT_DATA_VALUE,DICT_TYPE,SORT_ID,TENANT_ID,DICT_DATA_IMG) VALUES('支出','OUT','BILL_TYPE',2,'e32734cdbad84e3c8d9aca99e39eb836','OUT.png');


INSERT INTO `ngs_dict_data`(DICT_DATA_LABEL,DICT_DATA_VALUE,DICT_TYPE,SORT_ID,TENANT_ID,DICT_DATA_IMG) VALUES('微信','WX','PAY_TYPE',1,'e32734cdbad84e3c8d9aca99e39eb836','wx.png');
INSERT INTO `ngs_dict_data`(DICT_DATA_LABEL,DICT_DATA_VALUE,DICT_TYPE,SORT_ID,TENANT_ID,DICT_DATA_IMG) VALUES('支付宝','ZFB','PAY_TYPE',2,'e32734cdbad84e3c8d9aca99e39eb836','zfb.png');
INSERT INTO `ngs_dict_data`(DICT_DATA_LABEL,DICT_DATA_VALUE,DICT_TYPE,SORT_ID,TENANT_ID,DICT_DATA_IMG) VALUES('银行卡','YHK','PAY_TYPE',1,'e32734cdbad84e3c8d9aca99e39eb836','YHK.png');

INSERT INTO `ngs_dict_data`(DICT_DATA_LABEL,DICT_DATA_VALUE,DICT_TYPE,SORT_ID,TENANT_ID,DICT_DATA_IMG,IN_OR_OUT) VALUES('吃饭','CF','BUS_TYPE',1,'e32734cdbad84e3c8d9aca99e39eb836','wx.png','OUT');
INSERT INTO `ngs_dict_data`(DICT_DATA_LABEL,DICT_DATA_VALUE,DICT_TYPE,SORT_ID,TENANT_ID,DICT_DATA_IMG,IN_OR_OUT) VALUES('兼职','JZ','BUS_TYPE',2,'e32734cdbad84e3c8d9aca99e39eb836','zfb.png','IN');
INSERT INTO `ngs_dict_data`(DICT_DATA_LABEL,DICT_DATA_VALUE,DICT_TYPE,SORT_ID,TENANT_ID,DICT_DATA_IMG)           VALUES('其他','QT','BUS_TYPE',1,'e32734cdbad84e3c8d9aca99e39eb836','YHK.png');

#3、账单表 NGS_BILL
INSERT INTO NGS_BILL(BILL_COST,BILL_CONTENT,USER_ID,BILL_TYPE,BUS_TYPE,PAY_TYPE,TENANT_ID) 
VALUES(100,'吃饭请客','dijia','支出','吃饭','微信','e32734cdbad84e3c8d9aca99e39eb836');

三、接口设计(18个接口)

多租户架构开发平台,多租户架构微服务平台

接口明细

一、低代码平台接口开发规则
如果是=判断,则需要用对应的:字段=#param#,前端传入参数需要拼接单引号
如果是in方式,则需要用:字段 in($param$),前端入参时,需要在每个参数的两边拼接上单引号。
对于能确定的参数是必传的,则需要把该参数两边的大括号“}”去掉
#select * from dual l where {l.type =#type#} and status in($data1$)


#二、接口
#1、用户(3个)
#注册接口
INSERT INTO NGS_USER(USER_ID,USER_NAME,LOGIN_ID,PASS_WORD,USER_EMAIL,MOBILE_PHONE,USER_SEX,BIRTHDAY,TENANT_ID,USER_PHOTO) VALUES(
#USER_ID#,#USER_NAME#,#LOGIN_ID#,#PASS_WORD#,#USER_EMAIL#,#MOBILE_PHONE#,#USER_SEX#,#BIRTHDAY#,#TENANT_ID#,#USER_PHOTO#)

#登录接口/获取用户信息接口
SELECT * FROM NGS_USER R WHERE R.USER_ID=#USER_ID# AND R.PASS_WORD=#PASS_WORD#


#修改用户信息接口
UPDATE NGS_USER SET
USER_NAME=#USER_NAME#,USER_EMAIL=#USER_EMAIL#,USER_SEX=#USER_SEX#,BIRTHDAY=#BIRTHDAY#,USER_PHOTO=#USER_PHOTO# WHERE TENANT_ID=#TENANT_ID# AND USER_ID=#USER_ID#


#2、数据字典(6个)
#新增数据字典接口
INSERT INTO ngs_dict(DICT_NAME,DICT_TYPE,TENANT_ID,SORT_ID) VALUES(#DICT_NAME#,#DICT_TYPE#,#TENANT_ID#,#SORT_ID#)
#修改数据字典接口
UPDATE ngs_dict SET DICT_NAME=#DICT_NAME# ,SORT_ID=#SORT_ID# WHERE DICT_ID=#DICT_ID#
#查询数据字典接口
SELECT * FROM ngs_dict D WHERE D.TENANT_ID =#TENANT_ID#

#新增数据字典子项接口
INSERT INTO ngs_dict_data(DICT_DATA_LABEL,DICT_DATA_VALUE,DICT_TYPE,SORT_ID,TENANT_ID,DICT_DATA_IMG) VALUES(
#DICT_DATA_LABEL#,#DICT_DATA_VALUE#,#DICT_TYPE#,#SORT_ID#,#TENANT_ID#,#DICT_DATA_IMG#)

#修改数据字典子项接口
UPDATE ngs_dict_data SET DICT_DATA_LABEL=#DICT_DATA_LABEL# , DICT_DATA_VALUE=#DICT_DATA_VALUE#,SORT_ID=#SORT_ID#,DICT_DATA_IMG=#DICT_DATA_IMG# WHERE TENANT_ID=#TENANT_ID# AND DICT_DATA_ID=#DICT_DATA_ID#

#查询数据字典子项列表接口
SELECT * FROM ngs_dict_data D WHERE D.TENANT_ID=#TENANT_ID# AND D.DICT_TYPE=#DICT_TYPE#


#3、支付方式数据字典(4个)
#查询支付方式接口
SELECT * FROM ngs_dict_data WHERE TENANT_ID=#TENANT_ID# AND DICT_TYPE='PAY_TYPE'

#查询支出用途接口
SELECT * FROM ngs_dict_data WHERE TENANT_ID=#TENANT_ID# AND DICT_TYPE='BILL_TYPE' AND (IN_OR_OUT IS NULL OR IN_OR_OUT='OUT')

#查询收入用途接口
SELECT * FROM ngs_dict_data WHERE TENANT_ID=#TENANT_ID# AND DICT_TYPE='BILL_TYPE' AND (IN_OR_OUT IS NULL OR IN_OR_OUT='IN')

#查询用途接口
SELECT * FROM ngs_dict_data WHERE TENANT_ID=#TENANT_ID# AND DICT_TYPE='BUS_TYPE'


#4、账单(4个)
#新增账单接口
INSERT INTO NGS_BILL(BILL_COST,BILL_CONTENT,USER_ID,BILL_TYPE,BUS_TYPE,PAY_TYPE,TENANT_ID)
VALUES(#BILL_COST#,#BILL_CONTENT#,#USER_ID#,#BILL_TYPE#,#BUS_TYPE#,#PAY_TYPE#,#TENANT_ID#)

#修改账单接口
UPDATE NGS_BILL SET BILL_COST=#BILL_COST#,BILL_CONTENT=#BILL_CONTENT#,USER_ID=#USER_ID#BILL_TYPE=#BILL_TYPE#,BUS_TYPE=#BUS_TYPE#,PAY_TYPE=#PAY_TYPE#
WHERE TENANT_ID=#TENANT_ID# AND BILL_ID=#BILL_ID#

#查询账单接口
SELECT * FROM NGS_BILL WHERE TENANT_ID=#TENANT_ID# { AND BILL_ID=#BILL_ID# }

#删除账单接口
DELETE FROM NGS_BILL WHERE TENANT_ID=#TENANT_ID# AND BILL_ID=#BILL_ID# 


下一篇文章将以视频实操的方式给大家介绍一下如何在不写代码,只通过写SQL来快速开发一套多租户记账工具的数据接口服务。