Browse Source

增加,系统启动后,权限点初始化

wanggaokun 1 month ago
parent
commit
5e4077dcd2
21 changed files with 516 additions and 36 deletions
  1. 34 0
      eco-common/com-core/src/main/java/org/eco/vip/orm/utils/BeanUtils.java
  2. 17 0
      eco-common/com-core/src/main/java/org/eco/vip/orm/utils/CollUtils.java
  3. 17 0
      eco-common/com-security/src/main/java/org/eco/vip/security/annotation/PermissionsResource.java
  4. 1 1
      eco-common/com-security/src/main/java/org/eco/vip/security/config/SaTokenConfig.java
  5. 1 0
      eco-common/com-security/src/main/java/org/eco/vip/security/config/SecurityConfig.java
  6. 36 0
      eco-common/com-security/src/main/java/org/eco/vip/security/core/domain/SecurityPermissionBO.java
  7. 30 0
      eco-common/com-security/src/main/java/org/eco/vip/security/core/domain/SecurityPermissionVO.java
  8. 24 0
      eco-common/com-security/src/main/java/org/eco/vip/security/core/service/ISecurityPermissionService.java
  9. 1 2
      eco-common/com-security/src/main/java/org/eco/vip/security/core/service/SaPermissionImpl.java
  10. 85 0
      eco-common/com-security/src/main/java/org/eco/vip/security/handler/PermissionHandler.java
  11. 2 1
      eco-common/com-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  12. 5 6
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/client/ClientController.java
  13. 7 6
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/org/OrgController.java
  14. 40 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/permission/PermissionController.java
  15. 38 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/permission/Permission.java
  16. 38 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/permission/pojo/PermissionVO.java
  17. 20 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/mapper/PermissionMapper.java
  18. 27 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/permission/IPermissionService.java
  19. 62 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/permission/PermissionService.java
  20. 1 1
      eco-start/src/main/resources/application.yml
  21. 30 19
      eco-start/src/main/resources/db/mysql/V1_0_0_1__sys-init-ddl.sql

+ 34 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/utils/BeanUtils.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.orm.utils;
+
+
+import cn.hutool.core.bean.BeanUtil;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @description BeanUtils
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 01:01
+ */
+public class BeanUtils extends BeanUtil {
+
+    /**
+     * 通用 List 转换方法(基于 Hutool BeanUtil.copyProperties)
+     * @param sourceList 源对象列表
+     * @param targetClass 目标类
+     * @return 转换后的对象列表
+     * @param <S> 源对象类型
+     * @param <T> 目标对象类型
+     */
+    public static <S, T> List<T> convertList(List<S> sourceList, Class<T> targetClass) {
+        return sourceList.stream()
+                .map(source -> BeanUtil.copyProperties(source, targetClass))
+                .collect(Collectors.toList());
+    }
+}

+ 17 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/utils/CollUtils.java

@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.orm.utils;
+
+
+import cn.hutool.core.collection.CollUtil;
+
+/**
+ * @description CollUtils
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 00:41
+ */
+public class CollUtils extends CollUtil {
+}

+ 17 - 0
eco-common/com-security/src/main/java/org/eco/vip/security/annotation/PermissionsResource.java

@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.security.annotation;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface PermissionsResource {
+    String value();
+}

+ 1 - 1
eco-common/com-security/src/main/java/org/eco/vip/security/config/SaTokenConfig.java

@@ -11,7 +11,7 @@ import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
 import cn.dev33.satoken.stp.StpInterface;
 import cn.dev33.satoken.stp.StpLogic;
 import org.eco.vip.orm.factory.YmlPropertySourceFactory;
-import org.eco.vip.security.core.SaPermissionImpl;
+import org.eco.vip.security.core.service.SaPermissionImpl;
 import org.eco.vip.security.core.dao.SaTokenDaoForCaffeine;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.context.annotation.Bean;

+ 1 - 0
eco-common/com-security/src/main/java/org/eco/vip/security/config/SecurityConfig.java

@@ -41,6 +41,7 @@ public class SecurityConfig implements WebMvcConfigurer {
      */
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
+
         // 注册路由拦截器,自定义验证规则
         registry.addInterceptor(new SaInterceptor(handler -> {
                     AllUrlHandler allUrlHandler = SpringUtils.getBean(AllUrlHandler.class);

+ 36 - 0
eco-common/com-security/src/main/java/org/eco/vip/security/core/domain/SecurityPermissionBO.java

@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.security.core.domain;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @description PermissionBO
+ *
+ * @author GaoKunW
+ * @date 2025/7/3 23:58
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SecurityPermissionBO implements Serializable {
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 编码
+     */
+    private String code;
+}

+ 30 - 0
eco-common/com-security/src/main/java/org/eco/vip/security/core/domain/SecurityPermissionVO.java

@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.security.core.domain;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @description SecurityPermissionVO
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 00:44
+ */
+@Data
+public class SecurityPermissionVO implements Serializable {
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 编码
+     */
+    private String code;
+}

+ 24 - 0
eco-common/com-security/src/main/java/org/eco/vip/security/core/service/ISecurityPermissionService.java

@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.security.core.service;
+
+
+import org.eco.vip.security.core.domain.SecurityPermissionBO;
+import org.eco.vip.security.core.domain.SecurityPermissionVO;
+
+import java.util.List;
+
+/**
+ * @description ISecurityPermissionService
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 00:02
+ */
+public interface ISecurityPermissionService {
+    boolean addPermission(SecurityPermissionBO permissionBO);
+    boolean addPermissionBatch(List<SecurityPermissionBO> permissionBOList);
+
+    List<SecurityPermissionVO> selectListAll();
+}

+ 1 - 2
eco-common/com-security/src/main/java/org/eco/vip/security/core/SaPermissionImpl.java → eco-common/com-security/src/main/java/org/eco/vip/security/core/service/SaPermissionImpl.java

@@ -1,9 +1,8 @@
 /*
  * Copyright (c) 2025 GaoKunW
- *
  */
 
-package org.eco.vip.security.core;
+package org.eco.vip.security.core.service;
 
 
 import cn.dev33.satoken.stp.StpInterface;

+ 85 - 0
eco-common/com-security/src/main/java/org/eco/vip/security/handler/PermissionHandler.java

@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.security.handler;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.vip.orm.utils.CollUtils;
+import org.eco.vip.orm.utils.ObjUtils;
+import org.eco.vip.security.annotation.PermissionsResource;
+import org.eco.vip.security.core.domain.SecurityPermissionBO;
+import org.eco.vip.security.core.service.ISecurityPermissionService;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationListener;
+import org.springframework.core.annotation.AnnotationUtils;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description PermissionHandler 全局权限注解处理
+ *
+ * @author GaoKunW
+ * @date 2025/7/3 22:29
+ */
+@Slf4j
+public class PermissionHandler implements ApplicationListener<ApplicationReadyEvent> {
+
+    @Resource
+    private ApplicationContext applicationContext;
+
+    @Resource
+    private ISecurityPermissionService securityPermissionService;
+
+    @Override
+    public void onApplicationEvent(ApplicationReadyEvent event) {
+        log.info(event.getClass().getName());
+        log.info("权限加载......");
+        scanAndSavePermissions();
+    }
+
+    private void scanAndSavePermissions() {
+        // 获取所有PermissionsResource注解的Bean
+        Map<String, Object> controllers = applicationContext.getBeansWithAnnotation(PermissionsResource.class);
+        if (CollUtils.isEmpty(controllers)) {
+            log.info("无权限编码配置!");
+            return;
+        }
+        List<SecurityPermissionBO> permissionBoList = new ArrayList<>();
+        for (Object controller : controllers.values()) {
+            Class<?> clazz = controller.getClass();
+            // 获取类上的资源名称
+            String resourceName = getResourceName(clazz);
+            // 扫描方法上的@SaCheckPermission注解
+            Method[] methods = clazz.getDeclaredMethods();
+            for (Method method : methods) {
+                SaCheckPermission permission = AnnotationUtils.findAnnotation(method, SaCheckPermission.class);
+                if (ObjUtils.isNotNull(permission)) {
+                    String[] perms = permission.value();
+                    for (String perm : perms) {
+                        SecurityPermissionBO permissionBO = SecurityPermissionBO.builder().name(resourceName).code(perm).build();
+                        permissionBoList.add(permissionBO);
+                    }
+                }
+            }
+        }
+        boolean result = securityPermissionService.addPermissionBatch(permissionBoList);
+        if (!result) {
+            log.error("权限加载失败!");
+            return;
+        }
+        log.info("权限加载完成");
+    }
+
+    private String getResourceName(Class<?> clazz) {
+        // 这里可以自定义获取模块名的逻辑,比如通过自定义注解
+        PermissionsResource moduleAnnotation = AnnotationUtils.findAnnotation(clazz, PermissionsResource.class);
+        return ObjUtils.isNotNull(moduleAnnotation) ? moduleAnnotation.value() : "default";
+    }
+}

+ 2 - 1
eco-common/com-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -1,3 +1,4 @@
 org.eco.vip.security.config.SaTokenConfig
 org.eco.vip.security.config.SecurityConfig
-org.eco.vip.security.handler.AllUrlHandler
+org.eco.vip.security.handler.AllUrlHandler
+org.eco.vip.security.handler.PermissionHandler

+ 5 - 6
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/client/ClientController.java

@@ -6,6 +6,7 @@
 package org.eco.vip.auth.controller.client;
 
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotEmpty;
@@ -14,13 +15,9 @@ import org.eco.vip.auth.domain.client.pojo.ClientVO;
 import org.eco.vip.auth.service.client.IClientService;
 import org.eco.vip.orm.pojo.CommonResult;
 import org.eco.vip.orm.pojo.PageResult;
+import org.eco.vip.security.annotation.PermissionsResource;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -36,11 +33,13 @@ import static org.eco.vip.orm.pojo.CommonResult.success;
 @RestController
 @RequestMapping("/system/client")
 @Validated
+@PermissionsResource("客户端")
 public class ClientController {
     @Resource
     private IClientService clientService;
 
     @GetMapping("/page")
+    @SaCheckPermission("system:client:page")
     public CommonResult<PageResult<ClientVO>> page(ClientBO clientBO) {
         return success(clientService.selectPage(clientBO));
     }

+ 7 - 6
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/org/OrgController.java

@@ -6,6 +6,7 @@
 package org.eco.vip.auth.controller.org;
 
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotEmpty;
@@ -14,13 +15,9 @@ import org.eco.vip.auth.domain.org.pojo.OrgVO;
 import org.eco.vip.auth.service.org.IOrgService;
 import org.eco.vip.orm.pojo.CommonResult;
 import org.eco.vip.orm.pojo.PageResult;
+import org.eco.vip.security.annotation.PermissionsResource;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -36,6 +33,7 @@ import static org.eco.vip.orm.pojo.CommonResult.success;
 @RestController
 @RequestMapping("/system/org")
 @Validated
+@PermissionsResource("org")
 public class OrgController {
     @Resource
     private IOrgService orgService;
@@ -46,11 +44,13 @@ public class OrgController {
     }
 
     @GetMapping("/list")
+    @SaCheckPermission("system:org:list")
     public CommonResult<List<OrgVO>> list(OrgBO orgBO) {
         return success(orgService.selectList(orgBO));
     }
 
     @PostMapping("/add")
+    @SaCheckPermission("system:org:add")
     public CommonResult<String> add(@RequestBody @Valid OrgBO orgBO) {
         if (!orgService.checkNameUnique(orgBO)) {
             return fail("新增组织{}失败,组织名称已存在", orgBO.getName());
@@ -68,6 +68,7 @@ public class OrgController {
     }
 
     @PostMapping("/delete")
+    @SaCheckPermission("system:org:delete")
     public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") List<String> orgIds) {
         boolean result = orgService.delete(orgIds);
         if (!result) {

+ 40 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/permission/PermissionController.java

@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.auth.controller.permission;
+
+
+import jakarta.annotation.Resource;
+import org.eco.vip.auth.domain.permission.pojo.PermissionVO;
+import org.eco.vip.auth.service.permission.PermissionService;
+import org.eco.vip.orm.pojo.CommonResult;
+import org.eco.vip.security.annotation.PermissionsResource;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+import static org.eco.vip.orm.pojo.CommonResult.success;
+
+/**
+ * @description PermissionController
+ *
+ * @author GaoKunW
+ * @date 2025/7/3 23:55
+ */
+@RestController
+@RequestMapping("/auth/perm")
+@PermissionsResource("perm")
+public class PermissionController {
+
+    @Resource
+    private PermissionService permissionService;
+
+    @GetMapping("/list")
+    public CommonResult<List<PermissionVO>> list() {
+        return success(permissionService.selectList());
+    }
+
+}

+ 38 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/permission/Permission.java

@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.auth.domain.permission;
+
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @description Permission
+ *
+ * @author GaoKunW
+ * @date 2025/7/3 23:51
+ */
+@Data
+@Table("system_permission_t")
+public class Permission implements Serializable {
+    /**
+     * 唯一标识
+     */
+    @Id
+    private String id;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 编码
+     */
+    private String code;
+}

+ 38 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/permission/pojo/PermissionVO.java

@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.auth.domain.permission.pojo;
+
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.eco.vip.auth.domain.permission.Permission;
+
+import java.io.Serializable;
+
+/**
+ * @description PermissionVO
+ *
+ * @author GaoKunW
+ * @date 2025/7/3 23:51
+ */
+@Data
+@AutoMapper(target = Permission.class, reverseConvertGenerate = false)
+public class PermissionVO implements Serializable {
+
+    /**
+     * 唯一标识
+     */
+    private String id;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 编码
+     */
+    private String code;
+}

+ 20 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/mapper/PermissionMapper.java

@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.auth.mapper;
+
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.eco.vip.auth.domain.permission.Permission;
+
+/**
+ * @description PermissionMapper
+ *
+ * @author GaoKunW
+ * @date 2025/7/3 23:55
+ */
+@Mapper
+public interface PermissionMapper extends BaseMapper<Permission> {
+}

+ 27 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/permission/IPermissionService.java

@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.auth.service.permission;
+
+
+import org.eco.vip.auth.domain.permission.Permission;
+import org.eco.vip.auth.domain.permission.pojo.PermissionVO;
+import org.eco.vip.orm.service.IBaseService;
+
+import java.util.List;
+
+/**
+ * @description IPermissionService
+ *
+ * @author GaoKunW
+ * @date 2025/7/3 23:56
+ */
+public interface IPermissionService extends IBaseService<Permission> {
+
+    /**
+     * @description: 查询
+     * @return List<PermissionVO>
+     **/
+    List<PermissionVO> selectList();
+}

+ 62 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/permission/PermissionService.java

@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.auth.service.permission;
+
+
+import com.mybatisflex.core.query.QueryWrapper;
+import org.eco.vip.auth.domain.permission.Permission;
+import org.eco.vip.auth.domain.permission.pojo.PermissionVO;
+import org.eco.vip.auth.mapper.PermissionMapper;
+import org.eco.vip.orm.service.BaseService;
+import org.eco.vip.orm.utils.BeanUtils;
+import org.eco.vip.security.core.domain.SecurityPermissionBO;
+import org.eco.vip.security.core.domain.SecurityPermissionVO;
+import org.eco.vip.security.core.service.ISecurityPermissionService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @description PermissionService
+ *
+ * @author GaoKunW
+ * @date 2025/7/3 23:56
+ */
+@Service
+public class PermissionService extends BaseService<PermissionMapper, Permission> implements IPermissionService, ISecurityPermissionService {
+
+    @Override
+    public List<PermissionVO> selectList() {
+        QueryWrapper queryWrapper = new QueryWrapper();
+        return this.listAs(queryWrapper, PermissionVO.class);
+    }
+
+    @Override
+    public boolean addPermission(SecurityPermissionBO permissionBO) {
+        Permission permission = new Permission();
+        BeanUtils.copyProperties(permissionBO, permission);
+        return this.save(permission);
+    }
+
+    /**
+     * @description: 批量插入, 只用于系统启动权限初始化
+     * @param: permissionBOList 参数
+     * @return boolean
+     **/
+    @Override
+    public boolean addPermissionBatch(List<SecurityPermissionBO> permissionBOList) {
+        // 全量删除
+        QueryWrapper queryWrapper = new QueryWrapper().where("1=1");
+        this.remove(queryWrapper);
+        List<Permission> permissionList = BeanUtils.convertList(permissionBOList, Permission.class);
+        return this.saveBatch(permissionList, 100);
+    }
+
+    @Override
+    public List<SecurityPermissionVO> selectListAll() {
+        QueryWrapper queryWrapper = new QueryWrapper();
+        return this.listAs(queryWrapper, SecurityPermissionVO.class);
+    }
+}

+ 1 - 1
eco-start/src/main/resources/application.yml

@@ -83,7 +83,7 @@ security:
     - /actuator/**
     # 其它链接
     - /auth/login
-    - /system/**
+    - /**
 
 # MyBatisFlex公共配置
 mybatis-flex:

+ 30 - 19
eco-start/src/main/resources/db/mysql/V1_0_0_1__sys-init-ddl.sql

@@ -24,7 +24,7 @@ FOREIGN_KEY_CHECKS = 0;
 DROP TABLE IF EXISTS `system_org_t`;
 CREATE TABLE `system_org_t`
 (
-    `org_id`          varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '唯一标识',
+    `org_id`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '唯一标识',
     `parent_id`   varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '父组织ID',
     `name`        varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '组织名称',
     `code`        varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '组织编码',
@@ -53,7 +53,7 @@ CREATE TABLE `system_org_t`
 DROP TABLE IF EXISTS `system_role_t`;
 CREATE TABLE `system_role_t`
 (
-    `role_id`          varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+    `role_id`     varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
     `org_id`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织id',
     `name`        varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称',
     `code`        varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码',
@@ -78,7 +78,7 @@ CREATE TABLE `system_role_t`
 DROP TABLE IF EXISTS `system_user_t`;
 CREATE TABLE `system_user_t`
 (
-    `user_id`           varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '唯一标识',
+    `user_id`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '唯一标识',
     `org_id`       varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '组织ID',
     `account`      varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户账号',
     `user_name`    varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户姓名',
@@ -109,25 +109,36 @@ CREATE TABLE `system_user_t`
 DROP TABLE IF EXISTS `system_client_t`;
 CREATE TABLE `system_client_t`
 (
-    `client_id`        varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '客户端id',
-    `client_key`       varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '客户端key',
-    `client_secret`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '客户端秘钥',
-    `grant_type`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'password' COMMENT '授权类型',
-    `device_type`   varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '设备类型',
-    `active_timeout`   int NULL DEFAULT 1800 COMMENT 'token活跃超时时间',
-    `timeout`          int NULL DEFAULT 604800 COMMENT 'token固定超时',
-    `tenant_id`    varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '租户编号',
-    `status`       varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '状态(1正常 0停用)',
-    `version`      int NULL DEFAULT NULL COMMENT '乐观锁',
-    `del_flag`     varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '删除标志(1代表已删除 0代表存在)',
-    `create_by`    varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建者',
-    `create_time`  datetime NULL DEFAULT NULL COMMENT '创建时间',
-    `update_by`    varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新者',
-    `update_time`  datetime NULL DEFAULT NULL COMMENT '更新时间',
-    `remark`       varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注',
+    `client_id`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '客户端id',
+    `client_key`     varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '客户端key',
+    `client_secret`  varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '客户端秘钥',
+    `grant_type`     varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'password' COMMENT '授权类型',
+    `device_type`    varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '设备类型',
+    `active_timeout` int NULL DEFAULT 1800 COMMENT 'token活跃超时时间',
+    `timeout`        int NULL DEFAULT 604800 COMMENT 'token固定超时',
+    `tenant_id`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '租户编号',
+    `status`         varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '状态(1正常 0停用)',
+    `version`        int NULL DEFAULT NULL COMMENT '乐观锁',
+    `del_flag`       varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '删除标志(1代表已删除 0代表存在)',
+    `create_by`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '创建者',
+    `create_time`    datetime NULL DEFAULT NULL COMMENT '创建时间',
+    `update_by`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '更新者',
+    `update_time`    datetime NULL DEFAULT NULL COMMENT '更新时间',
+    `remark`         varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注',
     PRIMARY KEY (`client_id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '系统客户端授权表' ROW_FORMAT = DYNAMIC;
 
 
+-- ----------------------------
+-- Table structure for system_permission_t
+-- ----------------------------
+DROP TABLE IF EXISTS `system_permission_t`;
+CREATE TABLE `system_permission_t`
+(
+    `id`        varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '唯一标识',
+    `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',
+    `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编码',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
 SET
 FOREIGN_KEY_CHECKS = 1;