This commit is contained in:
2023-06-07 17:41:53 +08:00
parent 7f9c2a64c1
commit e91cd14f6f
38 changed files with 720 additions and 73 deletions

View File

@ -11,7 +11,7 @@
Target Server Version : 80032
File Encoding : 65001
Date: 06/06/2023 17:51:05
Date: 07/06/2023 17:41:14
*/
SET NAMES utf8mb4;
@ -34,7 +34,7 @@ CREATE TABLE `sys_config` (
`remark` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint NULL DEFAULT NULL,
PRIMARY KEY (`config_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1665985595258265601 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '参数配置表' ROW_FORMAT = DYNAMIC;
) ENGINE = InnoDB AUTO_INCREMENT = 1666019098658177025 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '参数配置表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sys_config
@ -212,9 +212,14 @@ INSERT INTO `sys_menu` VALUES (1046, '在线查询', 109, 1, '#', '', '', 0, 0,
INSERT INTO `sys_menu` VALUES (1047, '批量强退', 109, 2, '#', '', '', 0, 0, 'F', '1', 'monitor:online:batchLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1048, '单条强退', 109, 3, '#', '', '', 0, 0, 'F', '1', 'monitor:online:forceLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1663431933531869185, '租户管理', 0, 3, 'tenant', 'tenant/index', NULL, 0, 0, 'C', '1', 'tenant:list', 'logininfor', 'admin', '2023-05-30 14:27:33', 'admin', '2023-05-30 14:44:25', '', 1);
INSERT INTO `sys_menu` VALUES (1663432090671468545, '新建租户', 1663431933531869185, 2, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:add', '#', 'admin', '2023-05-30 14:28:10', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1663432193243172865, '修改租户', 1663431933531869185, 3, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:edit', '#', 'admin', '2023-05-30 14:28:35', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1663446141111689218, '查询详情', 1663431933531869185, 4, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:query', '#', 'admin', '2023-05-30 15:24:00', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1663432090671468545, '新建租户', 1663431933531869185, 1, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:add', '#', 'admin', '2023-05-30 14:28:10', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1663432193243172865, '修改租户', 1663431933531869185, 2, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:edit', '#', 'admin', '2023-05-30 14:28:35', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1663446141111689218, '查询详情', 1663431933531869185, 3, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:query', '#', 'admin', '2023-05-30 15:24:00', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1666365593968984065, '新增数据源', 1663431933531869185, 5, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:datasource:add', '#', 'admin', '2023-06-07 16:44:52', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1666365690861600770, '修改数据源', 1663431933531869185, 6, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:datasource:edit', '#', 'admin', '2023-06-07 16:45:15', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1666365815403069442, '删除数据源', 1663431933531869185, 7, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:datasource:remove', '#', 'admin', '2023-06-07 16:45:45', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1666365996601196545, '数据源列表', 1663431933531869185, 8, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:datasource:list', '#', 'admin', '2023-06-07 16:46:28', '', NULL, '', 1);
INSERT INTO `sys_menu` VALUES (1666366412382552066, '删除租户', 1663431933531869185, 4, '', NULL, NULL, 0, 0, 'F', '1', 'tenant:remove', '#', 'admin', '2023-06-07 16:48:07', '', NULL, '', 1);
-- ----------------------------
-- Table structure for sys_post
@ -266,7 +271,7 @@ CREATE TABLE `sys_role` (
-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, '4', '1', 'admin', '2023-04-23 14:35:29', 'admin', '2023-05-31 11:05:52', '超级管理员', 1);
INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, '1', '1', 'admin', '2023-04-23 14:35:29', 'admin', '2023-06-07 16:48:29', '超级管理员', 1);
INSERT INTO `sys_role` VALUES (1660535591067213826, '测试', 'test', 1, '1', '1', 'admin', '2023-05-22 14:38:31', '', NULL, NULL, 1);
-- ----------------------------
@ -349,6 +354,11 @@ INSERT INTO `sys_role_menu` VALUES (1, 1663431933531869185, 1);
INSERT INTO `sys_role_menu` VALUES (1, 1663432090671468545, 1);
INSERT INTO `sys_role_menu` VALUES (1, 1663432193243172865, 1);
INSERT INTO `sys_role_menu` VALUES (1, 1663446141111689218, 1);
INSERT INTO `sys_role_menu` VALUES (1, 1666365593968984065, 1);
INSERT INTO `sys_role_menu` VALUES (1, 1666365690861600770, 1);
INSERT INTO `sys_role_menu` VALUES (1, 1666365815403069442, 1);
INSERT INTO `sys_role_menu` VALUES (1, 1666365996601196545, 1);
INSERT INTO `sys_role_menu` VALUES (1, 1666366412382552066, 1);
-- ----------------------------
-- Table structure for sys_tenant
@ -366,6 +376,7 @@ CREATE TABLE `sys_tenant` (
`expire_time` datetime NULL DEFAULT NULL COMMENT '过期时间',
`account_count` bigint NULL DEFAULT NULL COMMENT '用户数量',
`status` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '状态',
`mode` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '模式',
`create_user` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '更新者',
@ -377,8 +388,40 @@ CREATE TABLE `sys_tenant` (
-- ----------------------------
-- Records of sys_tenant
-- ----------------------------
INSERT INTO `sys_tenant` VALUES (1, '主系统', '111', '111', '11', '11122', '111', NULL, '2099-05-30 23:59:59', 111, '1', 'admin', '2023-05-30 15:18:04', '', NULL, '111');
INSERT INTO `sys_tenant` VALUES (2, '副系统', '111', '111', '11', '11122', '111', NULL, '2099-05-29 15:27:02', 111, '1', 'admin', '2023-05-30 15:18:04', '', NULL, '111');
INSERT INTO `sys_tenant` VALUES (1, '主系统', '111', '111', '11', '11122', '111', NULL, '2099-05-30 23:59:59', 111, '1', NULL, 'admin', '2023-05-30 15:18:04', '', NULL, '111');
INSERT INTO `sys_tenant` VALUES (2, '副系统', '111', '111', '11', '11122', '111', NULL, '2099-05-29 15:27:02', 111, '1', '3', 'admin', '2023-05-30 15:18:04', '', NULL, '111');
-- ----------------------------
-- Table structure for sys_tenant_datasource
-- ----------------------------
DROP TABLE IF EXISTS `sys_tenant_datasource`;
CREATE TABLE `sys_tenant_datasource` (
`id` bigint NOT NULL,
`type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '类型',
`ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'IP',
`port` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '端口',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名称',
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '账号',
`password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码',
`init_count` int NULL DEFAULT NULL COMMENT '初始连接数',
`min_count` int NULL DEFAULT NULL COMMENT '最小空闲数',
`max_count` int NULL DEFAULT NULL COMMENT '最大连接数',
`weight` int NULL DEFAULT NULL COMMENT '权重',
`is_master` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否主库',
`is_use` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否使用',
`create_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '租户数据源' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sys_tenant_datasource
-- ----------------------------
INSERT INTO `sys_tenant_datasource` VALUES (166160396877907999, 'MySQL', '127.0.0.1', '3306', 'test123', 'root', 'root', 5, 10, 20, NULL, '1', '1', 'admin', '2023-06-07 14:36:11', '', NULL, NULL, 2);
-- ----------------------------
-- Table structure for sys_user
@ -407,7 +450,7 @@ CREATE TABLE `sys_user` (
-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (1650123803828019202, 1659443064624918529, 'admin', '小王', '4567@163.com', '18800001124', '1', '/resource/2023/05/19/blob/37f932d6ae4541d7b9688de6ab0b9f50.blob', '$2a$10$otwytPwmUHPy04dCf8S6I.Za7D.xGQ5MJOdEQk8fWTHCWDJCayur.', '1', 'admin', '2023-05-08 15:16:53', 'admin', '2023-05-23 10:11:24', NULL, 1);
INSERT INTO `sys_user` VALUES (1, 1659443064624918529, 'admin', '小王', '4567@163.com', '18800001124', '1', '/resource/2023/05/19/blob/37f932d6ae4541d7b9688de6ab0b9f50.blob', '$2a$10$otwytPwmUHPy04dCf8S6I.Za7D.xGQ5MJOdEQk8fWTHCWDJCayur.', '1', 'admin', '2023-05-08 15:16:53', 'admin', '2023-05-23 10:11:24', NULL, 1);
INSERT INTO `sys_user` VALUES (1660830718629277697, 1659443256656932865, 'admin1', 'qq', '', '', '0', '', '$2a$10$mDfrzPMZuxvKeKmqUPA4hOgNC2Zdgb8vOgVL8hP8IIdT6fAWpe0Bm', '1', 'admin', '2023-05-23 10:11:15', '', NULL, NULL, 1);
-- ----------------------------
@ -442,7 +485,7 @@ CREATE TABLE `sys_user_role` (
-- ----------------------------
-- Records of sys_user_role
-- ----------------------------
INSERT INTO `sys_user_role` VALUES (1660830718629277697, 1, 1);
INSERT INTO `sys_user_role` VALUES (1, 1, 1);
INSERT INTO `sys_user_role` VALUES (1660830718629277697, 1660535591067213826, 1);
SET FOREIGN_KEY_CHECKS = 1;

View File

@ -3,7 +3,7 @@ qiaoba:
datasource:
master:
driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/qiaoba-boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
url: jdbc:mysql://localhost:3306/${spring.application.name}?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
username: root
password: root
pool:

View File

@ -1,6 +1,7 @@
package com.qiaoba.common.base.enums;
import cn.hutool.core.util.StrUtil;
import com.qiaoba.common.base.exceptions.ServiceException;
import lombok.AllArgsConstructor;
import lombok.Getter;
@ -15,11 +16,13 @@ import lombok.Getter;
@AllArgsConstructor
public enum DataBaseEnum {
// ip/port/database
/**
* MySQL
*/
MY_SQL("MySQL",
"jdbc:mysql://localhost:3306/{}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true",
"jdbc:mysql://{}:{}/{}?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true",
"com.mysql.cj.jdbc.Driver"),
/**
@ -59,4 +62,21 @@ public enum DataBaseEnum {
return null;
}
public static String getDriver(String type) {
for (DataBaseEnum dataBaseEnum : values()) {
if (dataBaseEnum.getType().equals(type)) {
return dataBaseEnum.driver;
}
}
throw new ServiceException(StrUtil.format("未找到数据库驱动, Type: {}", type));
}
public static String getUrl(String type, String ip, String port, String database) {
for (DataBaseEnum dataBaseEnum : values()) {
if (dataBaseEnum.getType().equals(type)) {
return StrUtil.format(dataBaseEnum.url, ip, port, database);
}
}
throw new ServiceException(StrUtil.format("未找到数据库Url, Type: {}", type));
}
}

View File

@ -1,5 +1,6 @@
package com.qiaoba.common.database.config;
import cn.hutool.core.collection.ListUtil;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
@ -10,6 +11,8 @@ import net.sf.jsqlparser.expression.StringValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
/**
* MybatisPlusConfig
*
@ -20,6 +23,11 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
/**
* 不需要拼接租户ID的表 租户表/租户数据源表
*/
private static final List<String> IGNORE_TABLES = ListUtil.toList("sys_tenant", "sys_tenant_datasource");
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
@ -29,10 +37,10 @@ public class MybatisPlusConfig {
return new StringValue(BaseContext.getTenantId());
}
// sys_tenant 不需要拼接租户ID
// 拼接租户ID
@Override
public boolean ignoreTable(String tableName) {
return "sys_tenant".equals(tableName);
return IGNORE_TABLES.contains(tableName);
}
}));
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());

View File

@ -23,7 +23,7 @@ public class PoolInfo {
private Integer min;
/**
* 最大空闲
* 最大连接
*/
private Integer max;
}

View File

@ -1,5 +1,9 @@
package com.qiaoba.common.database.utils;
import cn.hutool.core.util.StrUtil;
import com.qiaoba.common.base.exceptions.ServiceException;
import com.qiaoba.common.web.advice.ExceptionAdvice;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
@ -52,9 +56,9 @@ public class JdbcUtil {
Class.forName(driver);
//建立连接
conn = DriverManager.getConnection(url, username, password);
return conn;
} catch (Exception e) {
e.printStackTrace();
throw new ServiceException(StrUtil.format("数据源连接失败,错误: {}", e.getMessage()));
}
return conn;
}
}

View File

@ -1,5 +1,6 @@
package com.qiaoba.module.tenant.controller;
import cn.hutool.core.bean.BeanUtil;
import com.qiaoba.common.base.enums.BaseEnum;
import com.qiaoba.common.base.result.AjaxResult;
import com.qiaoba.common.base.validate.AddGroup;
@ -7,7 +8,9 @@ import com.qiaoba.common.base.validate.EditGroup;
import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.module.tenant.entity.SysTenant;
import com.qiaoba.module.tenant.entity.dto.TenantSettingDto;
import com.qiaoba.module.tenant.entity.param.SysTenantParam;
import com.qiaoba.module.tenant.handle.MysqlHandler;
import com.qiaoba.module.tenant.service.SysTenantService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -32,6 +35,8 @@ import java.util.Date;
public class SysTenantController {
private final SysTenantService sysTenantService;
private final MysqlHandler mysqlHandler;
@PreAuthorize("hasAuthority('tenant:add')")
@PostMapping
@ -70,4 +75,19 @@ public class SysTenantController {
param.setIsLogin(true);
return sysTenantService.selectPageList(param, pageQuery);
}
@GetMapping("/getSetting/{tenantId}")
@Operation(summary = "查看设置信息")
@PreAuthorize("hasAuthority('tenant:query')")
public AjaxResult getSetting(@PathVariable String tenantId) {
return AjaxResult.success(sysTenantService.getSetting(tenantId));
}
@PreAuthorize("hasAuthority('tenant:edit')")
@PutMapping("/setting")
@Operation(summary = "修改设置信息")
public AjaxResult setting(TenantSettingDto dto) {
return AjaxResult.success(sysTenantService.update(BeanUtil.copyProperties(dto, SysTenant.class)));
}
}

View File

@ -0,0 +1,59 @@
package com.qiaoba.module.tenant.controller;
import com.qiaoba.common.base.result.AjaxResult;
import com.qiaoba.common.base.validate.AddGroup;
import com.qiaoba.common.base.validate.EditGroup;
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 租户数据源管理 Web层
*
* @author ailanyin
* @version 1.0
* @since 2023/5/30 10:52
*/
@RestController
@RequestMapping("/tenant/datasource")
@RequiredArgsConstructor
@Tag(name = "租户数据源管理")
public class SysTenantDatasourceController {
private final SysTenantDatasourceService sysTenantDatasourceService;
@PreAuthorize("hasAuthority('tenant:datasource:add')")
@PostMapping
@Operation(summary = "新增数据源")
public AjaxResult add(@Validated(AddGroup.class) @RequestBody SysTenantDatasource sysTenantDatasource) {
return AjaxResult.toAjax(sysTenantDatasourceService.insert(sysTenantDatasource));
}
@PreAuthorize("hasAuthority('tenant:datasource:edit')")
@PutMapping
@Operation(summary = "修改数据源")
public AjaxResult edit(@Validated(EditGroup.class) @RequestBody SysTenantDatasource sysTenantDatasource) {
return AjaxResult.toAjax(sysTenantDatasourceService.updateById(sysTenantDatasource));
}
@DeleteMapping("/{ids}")
@PreAuthorize("hasAuthority('tenant:datasource:remove')")
@Operation(summary = "删除数据源")
public AjaxResult remove(@PathVariable List<String> ids) {
return AjaxResult.toAjax(sysTenantDatasourceService.deleteByIds(ids));
}
@PreAuthorize("hasAuthority('tenant:datasource:list')")
@GetMapping("/list")
@Operation(summary = "获取列表")
public AjaxResult list(@RequestParam String tenantId) {
return AjaxResult.success(sysTenantDatasourceService.selectList(tenantId));
}
}

View File

@ -27,6 +27,21 @@ public class SysTenant extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 字段模式
*/
public static final String COLUMN_MODE = "1";
/**
* 数据库模式
*/
public static final String DATABASE_MODE = "2";
/**
* 数据源模式
*/
public static final String DATASOURCE_MODE = "3";
@TableId
@NotNull(message = "id不能为空", groups = {EditGroup.class})
private String tenantId;
@ -68,4 +83,6 @@ public class SysTenant extends BaseEntity {
@Schema(description = "状态")
private String status;
private String mode;
}

View File

@ -0,0 +1,71 @@
package com.qiaoba.module.tenant.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.qiaoba.common.base.entity.BaseEntity;
import com.qiaoba.common.base.validate.AddGroup;
import com.qiaoba.common.base.validate.EditGroup;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 租户数据源
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 14:38
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("sys_tenant_datasource")
public class SysTenantDatasource extends BaseEntity {
private static final long serialVersionUID = 1L;
@TableId
@NotNull(message = "id不能为空", groups = {EditGroup.class})
private String id;
@NotBlank(message = "数据源类型不能为空", groups = {AddGroup.class, EditGroup.class})
@Schema(description = "数据源类型")
private String type;
@NotBlank(message = "数据库IP不能为空", groups = {AddGroup.class, EditGroup.class})
@Schema(description = "数据库IP")
private String ip;
@NotBlank(message = "数据库端口不能为空", groups = {AddGroup.class, EditGroup.class})
@Schema(description = "数据库端口")
private String port;
@NotBlank(message = "数据库名称不能为空", groups = {AddGroup.class, EditGroup.class})
@Schema(description = "数据库名称")
private String name;
@NotBlank(message = "数据库账号不能为空", groups = {AddGroup.class, EditGroup.class})
@Schema(description = "数据库账号")
private String username;
@NotBlank(message = "数据库密码不能为空", groups = {AddGroup.class, EditGroup.class})
@Schema(description = "数据库密码")
private String password;
private Integer initCount;
private Integer minCount;
private Integer maxCount;
private Integer weight;
private String isMaster = "1";
private String isUse;
@NotBlank(message = "租户ID", groups = {AddGroup.class, EditGroup.class})
@Schema(description = "租户ID")
private String tenantId;
}

View File

@ -0,0 +1,22 @@
package com.qiaoba.module.tenant.entity.dto;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 租户设置
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 17:13
*/
@Getter
@Setter
public class TenantSettingDto implements Serializable {
private String tenantId;
private String mode;
}

View File

@ -0,0 +1,29 @@
package com.qiaoba.module.tenant.entity.vo;
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* 租户设置
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 17:13
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TenantSettingVo implements Serializable {
private String tenantId;
private String mode;
private List<SysTenantDatasource> datasourceList;
}

View File

@ -5,9 +5,10 @@ import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.DbUtil;
import cn.hutool.db.sql.SqlExecutor;
import com.qiaoba.common.database.utils.JdbcUtil;
import com.qiaoba.module.tenant.service.SysTenantService;
import com.qiaoba.module.tenant.utils.MenuUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
@ -24,16 +25,10 @@ import java.util.List;
*/
@Component
@Slf4j
@RequiredArgsConstructor
public class MysqlHandler {
@Value("${qiaoba.datasource.master.driver}")
private String driver;
@Value("${qiaoba.datasource.master.url}")
private String url;
@Value("${qiaoba.datasource.master.username}")
private String username;
@Value("${qiaoba.datasource.master.password}")
private String password;
private final SysTenantService sysTenantService;
/**
* 角色-超管ID
@ -45,15 +40,13 @@ public class MysqlHandler {
*/
private static final ThreadLocal<Long> USER_SUPER_ADMIN_ID = new ThreadLocal<>();
/**
* 处理字段模式
*/
public void handleColumnType(String tenantId) {
public void handle(String tenantId) {
log.info("Mysql-Column-Start");
Connection conn = null;
Connection conn = sysTenantService.getConnection(tenantId);
try {
conn = JdbcUtil.getConnection(driver, url, username, password);
// 处理 sys_config
handleSysConfig(conn, tenantId);
// 处理 sys_post
@ -64,6 +57,11 @@ public class MysqlHandler {
handleSysUser(conn, tenantId);
// 处理 sys_user_role
bindUserAndRole(conn, tenantId);
// 处理 sys_menu
MenuUtil.handleMenu(conn, tenantId);
// 处理 sys_role_menu
bindRoleAndMenu(conn, tenantId);
} catch (Exception e) {
e.printStackTrace();
} finally {
@ -74,21 +72,6 @@ public class MysqlHandler {
log.info("Mysql-Column-End");
}
/**
* 处理数据库模式
*/
private void handleDatabaseType() {
}
/**
* 处理数据源模式
*/
private void handleDatasourceType() {
}
private void handleSysConfig(Connection conn, String tenantId) throws Exception {
handleSql(conn, tenantId, "data/sys_config_data");
@ -158,4 +141,16 @@ public class MysqlHandler {
ROLE_SUPER_ADMIN_ID.get(), tenantId);
SqlExecutor.execute(conn, sql);
}
private void bindRoleAndMenu(Connection conn, String tenantId) throws Exception {
String sql = "INSERT INTO `sys_role_menu` VALUES ({}, {}, {});";
StringBuilder sb = new StringBuilder();
List<String> menuIds = MenuUtil.getAllMenuIdsByTenantId(conn, tenantId);
for (String menuId : menuIds) {
sb.append(StrUtil.format(sql, ROLE_SUPER_ADMIN_ID.get(), menuId, tenantId));
}
if (StrUtil.isNotBlank(sb.toString())) {
SqlExecutor.execute(conn, sb.toString());
}
}
}

View File

@ -0,0 +1,14 @@
package com.qiaoba.module.tenant.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
/**
* 租户数据源 数据层
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 14:47
*/
public interface SysTenantDatasourceMapper extends BaseMapper<SysTenantDatasource> {
}

View File

@ -1,24 +0,0 @@
package com.qiaoba.module.tenant.runner;
import com.qiaoba.module.tenant.handle.MysqlHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* @author ailanyin
* @version 1.0
* @since 2023/6/6 15:23
*/
//@Component
@RequiredArgsConstructor
public class TestRunner implements ApplicationRunner {
private final MysqlHandler mysqlHandler;
@Override
public void run(ApplicationArguments args) throws Exception {
mysqlHandler.handleColumnType("2");
}
}

View File

@ -0,0 +1,55 @@
package com.qiaoba.module.tenant.service;
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
import java.util.List;
/**
* 租户数据源 服务层
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 14:48
*/
public interface SysTenantDatasourceService {
/**
* 查询租户的主库
*
* @param tenantId 租户ID
* @return 数据源
*/
SysTenantDatasource selectMaster(String tenantId);
/**
* 新增
*
* @param sysTenantDatasource sysTenantDatasource
* @return 结果
*/
int insert(SysTenantDatasource sysTenantDatasource);
/**
* 修改
*
* @param sysTenantDatasource sysTenantDatasource
* @return 结果
*/
int updateById(SysTenantDatasource sysTenantDatasource);
/**
* 批量删除
*
* @param ids ids
* @return 结果
*/
int deleteByIds(List<String> ids);
/**
* 查询租户的所有数据源
*
* @param tenantId tenantId
* @return list
*/
List<SysTenantDatasource> selectList(String tenantId);
}

View File

@ -3,8 +3,11 @@ package com.qiaoba.module.tenant.service;
import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.module.tenant.entity.SysTenant;
import com.qiaoba.module.tenant.entity.vo.TenantSettingVo;
import com.qiaoba.module.tenant.entity.param.SysTenantParam;
import java.sql.Connection;
/**
* 租户管理 服务层
*
@ -46,4 +49,20 @@ public interface SysTenantService {
* @return info
*/
SysTenant selectById(String tenantId);
/**
* 获取租户数据库连接
*
* @param tenantId tenantId
* @return Connection
*/
Connection getConnection(String tenantId);
/**
* 获取设置信息
*
* @param tenantId tenantId
* @return setting
*/
TenantSettingVo getSetting(String tenantId);
}

View File

@ -0,0 +1,57 @@
package com.qiaoba.module.tenant.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qiaoba.common.base.enums.BaseEnum;
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
import com.qiaoba.module.tenant.mapper.SysTenantDatasourceMapper;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 租户数据源 服务层实现
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 14:49
*/
@Service
@RequiredArgsConstructor
public class SysTenantDatasourceServiceImpl implements SysTenantDatasourceService {
private final SysTenantDatasourceMapper sysTenantDatasourceMapper;
@Override
public SysTenantDatasource selectMaster(String tenantId) {
QueryWrapper<SysTenantDatasource> wrapper = new QueryWrapper<>();
wrapper.lambda()
.eq(SysTenantDatasource::getTenantId, tenantId)
.eq(SysTenantDatasource::getIsMaster, BaseEnum.YES.getCode());
return sysTenantDatasourceMapper.selectOne(wrapper);
}
@Override
public int insert(SysTenantDatasource sysTenantDatasource) {
return sysTenantDatasourceMapper.insert(sysTenantDatasource);
}
@Override
public int updateById(SysTenantDatasource sysTenantDatasource) {
return sysTenantDatasourceMapper.updateById(sysTenantDatasource);
}
@Override
public int deleteByIds(List<String> ids) {
return sysTenantDatasourceMapper.deleteBatchIds(ids);
}
@Override
public List<SysTenantDatasource> selectList(String tenantId) {
QueryWrapper<SysTenantDatasource> wrapper = new QueryWrapper<>();
wrapper.lambda()
.eq(SysTenantDatasource::getTenantId, tenantId);
return sysTenantDatasourceMapper.selectList(wrapper);
}
}

View File

@ -4,16 +4,25 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qiaoba.auth.utils.SecurityUtil;
import com.qiaoba.common.base.enums.BaseEnum;
import com.qiaoba.common.base.enums.DataBaseEnum;
import com.qiaoba.common.base.exceptions.ServiceException;
import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.common.database.utils.JdbcUtil;
import com.qiaoba.module.tenant.entity.SysTenant;
import com.qiaoba.module.tenant.entity.SysTenantDatasource;
import com.qiaoba.module.tenant.entity.vo.TenantSettingVo;
import com.qiaoba.module.tenant.entity.param.SysTenantParam;
import com.qiaoba.module.tenant.mapper.SysTenantMapper;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import com.qiaoba.module.tenant.service.SysTenantService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.sql.Connection;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
@ -27,7 +36,19 @@ import java.util.Objects;
@RequiredArgsConstructor
public class SysTenantServiceImpl implements SysTenantService {
@Value("${qiaoba.datasource.master.driver}")
private String driver;
@Value("${qiaoba.datasource.master.url}")
private String url;
@Value("${qiaoba.datasource.master.username}")
private String username;
@Value("${qiaoba.datasource.master.password}")
private String password;
@Value("${spring.application.name}")
private String baseDatabase;
private final SysTenantMapper sysTenantMapper;
private final SysTenantDatasourceService sysTenantDatasourceService;
@Override
public int insert(SysTenant sysTenant) {
@ -54,6 +75,36 @@ public class SysTenantServiceImpl implements SysTenantService {
return sysTenantMapper.selectById(tenantId);
}
@Override
public Connection getConnection(String tenantId) {
SysTenant sysTenant = selectById(tenantId);
if (Objects.isNull(sysTenant)) {
throw new ServiceException("租户不存在");
}
if (SysTenant.COLUMN_MODE.equals(sysTenant.getMode())) {
return column();
}
if (SysTenant.DATABASE_MODE.equals(sysTenant.getMode())) {
return database(tenantId);
}
if (SysTenant.DATASOURCE_MODE.equals(sysTenant.getMode())) {
return datasource(tenantId);
}
throw new ServiceException("未找到租户设置的数据源模式");
}
@Override
public TenantSettingVo getSetting(String tenantId) {
SysTenant sysTenant = selectById(tenantId);
if (Objects.isNull(sysTenant)) {
throw new ServiceException("租户不存在");
}
List<SysTenantDatasource> datasourceList = sysTenantDatasourceService.selectList(tenantId);
return new TenantSettingVo(tenantId, sysTenant.getMode(), datasourceList);
}
private QueryWrapper<SysTenant> param2Wrapper(SysTenantParam param) {
QueryWrapper<SysTenant> wrapper = new QueryWrapper<>();
wrapper.lambda()
@ -77,4 +128,30 @@ public class SysTenantServiceImpl implements SysTenantService {
}
return wrapper;
}
/**
* 处理字段模式
*/
private Connection column() {
return JdbcUtil.getConnection(driver, url, username, password);
}
/**
* 处理数据库模式
*/
private Connection database(String tenantId) {
String realUrl = this.url.replaceFirst(baseDatabase, baseDatabase + "-" + tenantId);
return JdbcUtil.getConnection(driver, realUrl, username, password);
}
/**
* 处理数据源模式
*/
private Connection datasource(String tenantId) {
SysTenantDatasource master = sysTenantDatasourceService.selectMaster(tenantId);
if (Objects.isNull(master)) {
throw new ServiceException("未找到租户数据源信息");
}
return JdbcUtil.getConnection(DataBaseEnum.getDriver(master.getType()), DataBaseEnum.getUrl(master.getType(), master.getIp(), master.getPort(), master.getName()), master.getUsername(), master.getPassword());
}
}

View File

@ -0,0 +1,115 @@
package com.qiaoba.module.tenant.utils;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.sql.SqlExecutor;
import org.springframework.core.io.ClassPathResource;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
/**
* 处理菜单工具类
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 11:01
*/
public class MenuUtil {
private MenuUtil() {
}
public static void handleMenu(Connection conn, String tenantId) throws Exception {
handleSystemMenu(conn, tenantId);
handleMonitorMenu(conn, tenantId);
}
private static void handleMonitorMenu(Connection conn, String tenantId) throws Exception {
long monitorId = new Snowflake().nextId();
String sql = "INSERT INTO `sys_menu` VALUES ({}, '系统监控', 0, 2, 'monitor', NULL, '', 0, 0, 'M', '1', '', 'monitor', 'admin', '2023-05-27 22:25:03', '', NULL, '系统监控目录', {});";
sql = StrUtil.format(sql, monitorId, tenantId);
SqlExecutor.execute(conn, sql);
// 登录用户
Long onlineUserId = handleMenu(conn, monitorId, tenantId, "data/sys_menu/monitor/online_user/menu");
handleButton(conn, tenantId, onlineUserId, "data/sys_menu/monitor/online_user/button");
}
private static void handleSystemMenu(Connection conn, String tenantId) throws Exception {
long systemId = new Snowflake().nextId();
String sql = "INSERT INTO `sys_menu` VALUES ({}, '系统管理', 0, 1, 'system', NULL, '', 0, 0, 'M', '1', '', 'system', 'admin', '2023-04-23 14:35:29', '', NULL, '系统管理目录', {});";
sql = StrUtil.format(sql, systemId, tenantId);
SqlExecutor.execute(conn, sql);
// 用户管理
Long userId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/user/menu");
handleButton(conn, tenantId, userId, "data/sys_menu/system/user/button");
// 角色管理
Long roleId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/role/menu");
handleButton(conn, tenantId, roleId, "data/sys_menu/system/role/button");
// 菜单管理
Long menuId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/menu/menu");
handleButton(conn, tenantId, menuId, "data/sys_menu/system/menu/button");
// 部门管理
Long deptId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/dept/menu");
handleButton(conn, tenantId, deptId, "data/sys_menu/system/dept/button");
// 岗位管理
Long postId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/post/menu");
handleButton(conn, tenantId, postId, "data/sys_menu/system/post/button");
// 字典管理
Long dictId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/dict/menu");
handleButton(conn, tenantId, dictId, "data/sys_menu/system/dict/button");
// 参数管理
Long configId = handleMenu(conn, systemId, tenantId, "data/sys_menu/system/config/menu");
handleButton(conn, tenantId, configId, "data/sys_menu/system/config/button");
}
private static Long handleMenu(Connection conn, Long systemId, String tenantId, String fileName) throws Exception {
long tempId = new Snowflake().nextId();
ClassPathResource resource = new ClassPathResource(fileName);
List<String> lines = FileUtil.readLines(resource.getFile(), Charset.defaultCharset());
StringBuilder sb = new StringBuilder();
for (String line : lines) {
if (StrUtil.isNotBlank(line)) {
line = StrUtil.format(line, tempId, systemId, tenantId);
sb.append(line);
}
}
if (StrUtil.isNotBlank(sb.toString())) {
SqlExecutor.execute(conn, sb.toString());
}
return tempId;
}
private static void handleButton(Connection conn, String tenantId, Long parentId, String fileName) throws Exception {
ClassPathResource resource = new ClassPathResource(fileName);
List<String> lines = FileUtil.readLines(resource.getFile(), Charset.defaultCharset());
StringBuilder sb = new StringBuilder();
for (String line : lines) {
if (StrUtil.isNotBlank(line)) {
line = StrUtil.format(line, new Snowflake().nextId(), parentId, tenantId);
sb.append(line);
}
}
if (StrUtil.isNotBlank(sb.toString())) {
SqlExecutor.execute(conn, sb.toString());
}
}
public static List<String> getAllMenuIdsByTenantId(Connection conn, String tenantId) throws Exception {
List<String> menuIds = new ArrayList<>();
ResultSet resultSet = conn.createStatement().executeQuery(StrUtil.format("SELECT menu_id FROM `sys_menu` where tenant_id = '{}'", tenantId));
while (resultSet.next()) {
String menuId = resultSet.getString("menu_id");
if (StrUtil.isNotBlank(menuId)) {
menuIds.add(menuId);
}
}
return menuIds;
}
}

View File

@ -0,0 +1,3 @@
INSERT INTO `sys_menu` VALUES ({}, '在线查询', {}, 1, '#', '', '', 0, 0, 'F', '1', 'monitor:online:query', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '批量强退', {}, 2, '#', '', '', 0, 0, 'F', '1', 'monitor:online:batchLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '单条强退', {}, 3, '#', '', '', 0, 0, 'F', '1', 'monitor:online:forceLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', {});

View File

@ -0,0 +1 @@
INSERT INTO `sys_menu` VALUES ({}, '登录用户', {}, 1, 'online', 'monitor/online/index', '', 0, 0, 'C', '1', 'monitor:online:list', 'online', 'admin', '2023-05-27 22:22:18', 'admin', '2023-05-30 09:49:35', '在线用户菜单', {});

View File

@ -0,0 +1,4 @@
INSERT INTO `sys_menu` VALUES ({}, '参数查询', {}, 1, '#', '', '', 0, 0, 'F', '1', 'system:config:query', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '参数新增', {}, 2, '#', '', '', 0, 0, 'F', '1', 'system:config:add', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '参数修改', {}, 3, '#', '', '', 0, 0, 'F', '1', 'system:config:edit', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '参数删除', {}, 4, '#', '', '', 0, 0, 'F', '1', 'system:config:remove', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});

View File

@ -0,0 +1 @@
INSERT INTO `sys_menu` VALUES ({}, '参数设置', {}, 7, 'config', 'system/config/index', '', 0, 0, 'C', '1', 'system:config:list', 'edit', 'admin', '2022-08-15 18:01:28', 'admin', '2023-05-24 21:13:11', '参数设置菜单', {});

View File

@ -0,0 +1,4 @@
INSERT INTO `sys_menu` VALUES ({}, '部门查询', {}, 1, '', '', '', 0, 0, 'F', '1', 'system:dept:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '部门新增', {}, 2, '', '', '', 0, 0, 'F', '1', 'system:dept:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '部门修改', {}, 3, '', '', '', 0, 0, 'F', '1', 'system:dept:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '部门删除', {}, 4, '', '', '', 0, 0, 'F', '1', 'system:dept:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});

View File

@ -0,0 +1 @@
INSERT INTO `sys_menu` VALUES ({}, '部门管理', {}, 4, 'dept', 'system/dept/index', '', 0, 0, 'C', '1', 'system:dept:list', 'tree', 'admin', '2023-04-23 14:35:29', '', NULL, '部门管理菜单', {});

View File

@ -0,0 +1,5 @@
INSERT INTO `sys_menu` VALUES ({}, '字典查询', {}, 1, '#', '', '', 0, 0, 'F', '1', 'system:dict:query', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '字典新增', {}, 2, '#', '', '', 0, 0, 'F', '1', 'system:dict:add', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '字典修改', {}, 3, '#', '', '', 0, 0, 'F', '1', 'system:dict:edit', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '字典删除', {}, 4, '#', '', '', 0, 0, 'F', '1', 'system:dict:remove', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '字典导出', {}, 5, '#', '', '', 0, 0, 'F', '1', 'system:dict:export', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', {});

View File

@ -0,0 +1 @@
INSERT INTO `sys_menu` VALUES ({}, '字典管理', {}, 6, 'dict', 'system/dict/index', '', 0, 0, 'C', '1', 'system:dict:list', 'documentation', 'admin', '2022-08-15 18:01:28', 'admin', '2023-05-31 11:15:14', '字典管理菜单', {});

View File

@ -0,0 +1,4 @@
INSERT INTO `sys_menu` VALUES ({}, '菜单查询', {}, 1, '', '', '', 0, 0, 'F', '1', 'system:menu:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '菜单新增', {}, 2, '', '', '', 0, 0, 'F', '1', 'system:menu:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '菜单修改', {}, 3, '', '', '', 0, 0, 'F', '1', 'system:menu:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '菜单删除', {}, 4, '', '', '', 0, 0, 'F', '1', 'system:menu:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});

View File

@ -0,0 +1 @@
INSERT INTO `sys_menu` VALUES ({}, '菜单管理', {}, 3, 'menu', 'system/menu/index', '', 0, 0, 'C', '1', 'system:menu:list', 'tree-table', 'admin', '2023-04-23 14:35:29', '', NULL, '菜单管理菜单', {});

View File

@ -0,0 +1,5 @@
INSERT INTO `sys_menu` VALUES ({}, '岗位查询', {}, 1, '', '', '', 0, 0, 'F', '1', 'system:post:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '岗位新增', {}, 2, '', '', '', 0, 0, 'F', '1', 'system:post:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '岗位修改', {}, 3, '', '', '', 0, 0, 'F', '1', 'system:post:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '岗位删除', {}, 4, '', '', '', 0, 0, 'F', '1', 'system:post:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '岗位导出', {}, 5, '', '', '', 0, 0, 'F', '1', 'system:post:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});

View File

@ -0,0 +1 @@
INSERT INTO `sys_menu` VALUES ({}, '岗位管理', {}, 5, 'post', 'system/post/index', '', 0, 0, 'C', '1', 'system:post:list', 'post', 'admin', '2023-04-23 14:35:29', '', NULL, '岗位管理菜单', {});

View File

@ -0,0 +1,5 @@
INSERT INTO `sys_menu` VALUES ({}, '角色查询', {}, 1, '', '', '', 0, 0, 'F', '1', 'system:role:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '角色新增', {}, 2, '', '', '', 0, 0, 'F', '1', 'system:role:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '角色修改', {}, 3, '', '', '', 0, 0, 'F', '1', 'system:role:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '角色删除', {}, 4, '', '', '', 0, 0, 'F', '1', 'system:role:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '角色导出', {}, 5, '', '', '', 0, 0, 'F', '1', 'system:role:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});

View File

@ -0,0 +1 @@
INSERT INTO `sys_menu` VALUES ({}, '角色管理', {}, 2, 'role', 'system/role/index', '', 0, 0, 'C', '1', 'system:role:list', 'peoples', 'admin', '2023-04-23 14:35:29', '', NULL, '角色管理菜单', {});

View File

@ -0,0 +1,7 @@
INSERT INTO `sys_menu` VALUES ({}, '用户查询', {}, 1, '', '', '', 0, 0, 'F', '1', 'system:user:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '用户新增', {}, 2, '', '', '', 0, 0, 'F', '1', 'system:user:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '用户修改', {}, 3, '', '', '', 0, 0, 'F', '1', 'system:user:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '用户删除', {}, 4, '', '', '', 0, 0, 'F', '1', 'system:user:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '用户导出', {}, 5, '', '', '', 0, 0, 'F', '1', 'system:user:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '用户导入', {}, 6, '', '', '', 0, 0, 'F', '1', 'system:user:import', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});
INSERT INTO `sys_menu` VALUES ({}, '重置密码', {}, 7, '', '', '', 0, 0, 'F', '1', 'system:user:resetPwd', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', {});

View File

@ -0,0 +1 @@
INSERT INTO `sys_menu` VALUES ({}, '用户管理', {}, 1, 'user', 'system/user/index', '', 0, 0, 'C', '1', 'system:user:list', 'user', 'admin', '2023-04-23 14:35:29', '', NULL, '用户管理菜单', {});

View File

@ -1,2 +1,2 @@
INSERT INTO `sys_role` VALUES ({}, '超级管理员', 'admin', 1, '4', '1', 'admin', '2023-04-23 14:35:29', 'admin', '2023-05-31 11:05:52', '超级管理员', {});
INSERT INTO `sys_role` VALUES ({}, '超级管理员', 'admin', 1, '1', '1', 'admin', '2023-04-23 14:35:29', 'admin', '2023-05-31 11:05:52', '超级管理员', {});
INSERT INTO `sys_role` VALUES ({}, '测试', 'test', 1, '1', '1', 'admin', '2023-05-22 14:38:31', '', NULL, NULL, {});