lixuliang
2024-09-10 92786e22bbc0c6d99fac274bfa67d09c6772597a
Merge branch 'master' of http://192.168.11.205:9000/r/se-cloud
已添加4个文件
已修改32个文件
已删除1个文件
1639 ■■■■■ 文件已修改
docker-compose/auth/bootstrap.yml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/docker-compose.yml 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/file/bootstrap.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/gateway/bootstrap.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/mysql/initdb/se_cloud_20240629.sql 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/mysql/initdb/se_config_20231204.sql 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/mysql/initdb/wgcloud-MySQL.sql 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/nacos/conf/application.properties 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/nginx/conf/nginx.conf 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/system/bootstrap.yml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/wgcloud/application.yml 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/pom.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/se-auth.iml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/java/com/se/auth/controller/TokenController.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/java/com/se/auth/service/AsyncService.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-auth/src/main/resources/bootstrap.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-common/se-common-core/src/main/java/com/se/common/core/utils/AesUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-gateway/src/main/resources/bootstrap.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-file/src/main/resources/bootstrap.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-job/src/main/resources/bootstrap.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/controller/SysMenuController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/controller/SysProfileController.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/controller/SysUserController.java 136 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/domain/SysMenu.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/mapper/SysMenuMapper.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/mapper/SysUserMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/ISysConfigService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/ISysMenuService.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/IsimUserService.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/SyncUserService.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/SysMenuServiceImpl.java 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/SysUserServiceImpl.java 277 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/bootstrap.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/logback.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/mapper/system/SysMenuMapper.xml 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/resources/mapper/system/SysUserMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docker-compose/auth/bootstrap.yml
@@ -12,6 +12,8 @@
    active: dev
  cloud:
    nacos:
      username: nacos
      password: nAcos_!9#_admIn
      discovery:
        # æœåŠ¡æ³¨å†Œåœ°å€
        server-addr: se-nacos:8848
@@ -23,3 +25,4 @@
        # å…±äº«é…ç½®
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
enableEncrypt: false
docker-compose/docker-compose.yml
@@ -35,15 +35,16 @@
      - ./nacos/logs/:/home/nacos/logs
      - ./nacos/conf/application.properties:/home/nacos/conf/application.properties
    ports:
#      - 7848:7848
      - 8848:8848
#      - 9848:9848
      - 9848:9848
#      - 9849:9849
    depends_on:
      - se-mysql
    networks:
      - network-se
    restart: always
  # redis,Redis_s!E_6.2.6
  # redis
  se-redis:
    image: redis:latest
    ports:
@@ -52,6 +53,7 @@
      - ./redis/data/redis.conf:/data/redis.conf
      - ./redis/data:/data
    command: redis-server /data/redis.conf
#    command: redis-server --requirepass Redis_s!E_6.2.6
    networks:
      - network-se
    restart: always
@@ -61,16 +63,17 @@
#    ports:
#      - 9204:8080
    volumes:
      - ./gateway/logs:/logs
      - ./gateway:/data
    environment:
      TZ: Asia/Shanghai
    entrypoint: java -jar /data/se-gateway.jar --spring.config.location=file:/data/
    depends_on:
      - se-redis
      - se-mysql
      - se-nacos
    links:
      - se-redis
      - se-nacos
#    links:
#      - se-redis
    networks:
      - network-se
    restart: always
@@ -80,12 +83,14 @@
#    ports:
#      - 9200:9200
    volumes:
      - ./auth/logs:/logs
      - ./auth:/data
    environment:
      TZ: Asia/Shanghai
    entrypoint: java -jar /data/se-auth.jar --spring.config.location=file:/data/
    depends_on:
      - se-redis
      - se-mysql
      - se-nacos
    networks:
      - network-se
@@ -96,14 +101,15 @@
#    ports:
#      - 9201:9201
    volumes:
      - ./system/logs:/logs
      - ./system:/data
    environment:
      TZ: Asia/Shanghai
    entrypoint: java -jar /data/se-modules-system.jar --spring.config.location=file:/data/
    depends_on:
      - se-redis
      - se-nacos
      - se-mysql
      - se-nacos
    networks:
      - network-se
    restart: always
@@ -113,15 +119,33 @@
#    ports:
#      - 9300:9300
    volumes:
      - ./file/logs:/logs
      - ./file:/data
    environment:
      TZ: Asia/Shanghai
    entrypoint: java -jar /data/se-modules-file.jar --spring.config.location=file:/data/
    depends_on:
      - se-mysql
      - se-nacos
    networks:
      - network-se
    restart: always
  # se-wgcloud
  se-wgcloud:
    image: openjdk:8-jre
    ports:
      - 9999:9999
    volumes:
      - ./wgcloud/logs:/log
      - ./wgcloud:/data
    environment:
      TZ: Asia/Shanghai
    entrypoint: java -jar /data/wgcloud-server-release.jar --spring.config.location=file:/data/
    depends_on:
      - se-mysql
    networks:
      - network-se
    restart: always
  # nginx
  se-nginx:
    image: nginx:latest
docker-compose/file/bootstrap.yml
@@ -12,6 +12,8 @@
    active: dev
  cloud:
    nacos:
      username: nacos
      password: nAcos_!9#_admIn
      discovery:
        # æœåŠ¡æ³¨å†Œåœ°å€
        server-addr: se-nacos:8848
docker-compose/gateway/bootstrap.yml
@@ -12,6 +12,8 @@
    active: dev
  cloud:
    nacos:
      username: nacos
      password: nAcos_!9#_admIn
      discovery:
        # æœåŠ¡æ³¨å†Œåœ°å€
        server-addr: se-nacos:8848
docker-compose/mysql/initdb/se_cloud_20240629.sql
@@ -270,6 +270,10 @@
-- insert into sys_menu values('1059', '预览代码', '115', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview',           '#', 'admin', sysdate(), '', null, '');
-- insert into sys_menu values('1060', '生成代码', '115', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code',              '#', 'admin', sysdate(), '', null, '');
alter table sys_menu add column mark varchar(20) comment '菜单标识';
update sys_menu set mark = 'sys' where menu_id < 1070;
-- select * from sys_menu;
-- ----------------------------
-- 6、用户和角色关联表  ç”¨æˆ·N-1角色
@@ -385,6 +389,7 @@
-- insert into sys_role_menu values ('2', '1058');
-- insert into sys_role_menu values ('2', '1059');
-- insert into sys_role_menu values ('2', '1060');
-- select * from sys_role_menu;
-- ----------------------------
-- 8、角色和部门关联表  è§’色1-N部门
docker-compose/mysql/initdb/se_config_20231204.sql
@@ -214,6 +214,8 @@
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
-- nAcos_!9#_admIn
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$LnJDlPeP.XbQnr6iabc65OI6kM4LLS/BRLwPHEtRSERErvnmlKkBu', TRUE);
-- INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
docker-compose/mysql/initdb/wgcloud-MySQL.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,307 @@
-- DROP DATABASE IF EXISTS `wgcloud`;
CREATE DATABASE IF NOT EXISTS  `wgcloud` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
USE `wgcloud`;
/*
Navicat MySQL Data Transfer
Source Server         : 127.0.0.1
Source Server Version : 50717
Source Host           : localhost:3306
Source Database       : wgcloud
Target Server Type    : MYSQL
Target Server Version : 50717
File Encoding         : 65001
Date: 2021-11-26 20:01:46
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for app_info
-- ----------------------------
DROP TABLE IF EXISTS `APP_INFO`;
CREATE TABLE `APP_INFO` (
  `ID` char(32) NOT NULL,
  `HOST_NAME` char(30) DEFAULT NULL,
  `APP_PID` char(200) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  `APP_NAME` varchar(50) DEFAULT NULL,
  `CPU_PER` double(8,2) DEFAULT NULL,
  `MEM_PER` double(10,2) DEFAULT NULL,
  `APP_TYPE` char(1) DEFAULT NULL,
  `STATE` char(1) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for app_state
-- ----------------------------
DROP TABLE IF EXISTS `APP_STATE`;
CREATE TABLE `APP_STATE` (
  `ID` char(32) NOT NULL,
  `APP_INFO_ID` char(32) DEFAULT NULL,
  `CPU_PER` double(8,2) DEFAULT NULL,
  `MEM_PER` double(10,2) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `APP_STAT_INDEX` (`APP_INFO_ID`,`CREATE_TIME`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for cpu_state
-- ----------------------------
DROP TABLE IF EXISTS `CPU_STATE`;
CREATE TABLE `CPU_STATE` (
  `ID` char(32) NOT NULL,
  `HOST_NAME` char(30) DEFAULT NULL,
  `USER` char(30) DEFAULT NULL,
  `SYS` double(8,2) DEFAULT NULL,
  `IDLE` double(8,2) DEFAULT NULL,
  `IOWAIT` double(8,2) DEFAULT NULL,
  `IRQ` char(30) DEFAULT NULL,
  `SOFT` char(30) DEFAULT NULL,
  `DATE_STR` char(30) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `CPU_ACC_HOST_INDEX` (`HOST_NAME`,`CREATE_TIME`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for db_info
-- ----------------------------
DROP TABLE IF EXISTS `DB_INFO`;
CREATE TABLE `DB_INFO` (
  `ID` char(32) NOT NULL,
  `DBTYPE` char(32) DEFAULT NULL,
  `USER` varchar(50) DEFAULT NULL,
  `PASSWD` varchar(50) DEFAULT NULL,
  `IP` char(20) DEFAULT NULL,
  `PORT` char(10) DEFAULT NULL,
--   `CREATE_TIME` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `CREATE_TIME` timestamp DEFAULT CURRENT_TIMESTAMP,
  `DBNAME` char(50) DEFAULT NULL,
  `DB_STATE` char(1) DEFAULT NULL,
  `ALIAS_NAME` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for db_table
-- ----------------------------
DROP TABLE IF EXISTS `DB_TABLE`;
CREATE TABLE `DB_TABLE` (
  `ID` char(32) NOT NULL,
  `TABLE_NAME` varchar(50) DEFAULT NULL,
  `WHERE_VAL` varchar(200) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `REMARK` varchar(50) DEFAULT NULL,
  `TABLE_COUNT` bigint(20) DEFAULT NULL,
  `DATE_STR` char(30) DEFAULT NULL,
  `DBINFO_ID` char(32) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for db_table_count
-- ----------------------------
DROP TABLE IF EXISTS `DB_TABLE_COUNT`;
CREATE TABLE `DB_TABLE_COUNT` (
  `ID` char(32) NOT NULL,
  `DB_TABLE_ID` char(32) DEFAULT NULL,
  `TABLE_COUNT` bigint(20) DEFAULT NULL,
  `DATE_STR` char(30) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for desk_state
-- ----------------------------
DROP TABLE IF EXISTS `DESK_STATE`;
CREATE TABLE `DESK_STATE` (
  `ID` char(32) NOT NULL,
  `HOST_NAME` char(30) DEFAULT NULL,
  `FILE_STSTEM` char(50) DEFAULT NULL,
  `SIZE` char(30) DEFAULT NULL,
  `USED` char(30) DEFAULT NULL,
  `AVAIL` char(30) DEFAULT NULL,
  `USE_PER` char(10) DEFAULT NULL,
  `DATE_STR` char(30) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `DESK_ACC_HOST_INDEX` (`HOST_NAME`,`CREATE_TIME`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for heath_monitor
-- ----------------------------
DROP TABLE IF EXISTS `HEATH_MONITOR`;
CREATE TABLE `HEATH_MONITOR` (
  `ID` char(32) NOT NULL,
  `APP_NAME` char(50) DEFAULT NULL,
  `HEATH_URL` varchar(255) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `HEATH_STATUS` char(10) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for host_info
-- ----------------------------
DROP TABLE IF EXISTS `HOST_INFO`;
CREATE TABLE `HOST_INFO` (
  `ID` char(32) NOT NULL,
  `IP` char(30) DEFAULT NULL,
  `PORT` char(20) DEFAULT NULL,
  `ROOT` char(50) DEFAULT NULL,
  `PASSWD` char(50) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `REMARK` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for intrusion_info
-- ----------------------------
DROP TABLE IF EXISTS `INTRUSION_INFO`;
CREATE TABLE `INTRUSION_INFO` (
  `ID` char(32) NOT NULL,
  `HOST_NAME` char(30) DEFAULT NULL,
  `LSMOD` text,
  `PASSWD_INFO` varchar(100) DEFAULT NULL,
  `CRONTAB` text,
  `PROMISC` varchar(100) DEFAULT NULL,
  `RPCINFO` text,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for log_info
-- ----------------------------
DROP TABLE IF EXISTS `LOG_INFO`;
CREATE TABLE `LOG_INFO` (
  `ID` char(32) NOT NULL,
  `HOST_NAME` char(50) DEFAULT NULL,
  `INFO_CONTENT` text,
  `STATE` char(1) DEFAULT NULL,
  `CREATE_TIME` timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for mail_set
-- ----------------------------
DROP TABLE IF EXISTS `MAIL_SET`;
CREATE TABLE `MAIL_SET` (
  `ID` char(32) COLLATE utf8_unicode_ci NOT NULL,
  `SEND_MAIL` char(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `FROM_MAIL_NAME` char(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `FROM_PWD` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SMTP_HOST` char(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SMTP_PORT` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SMTP_SSL` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `TO_MAIL` char(200) COLLATE utf8_unicode_ci DEFAULT NULL,
  `CPU_PER` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  `MEM_PER` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `HEATH_PER` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Table structure for mem_state
-- ----------------------------
DROP TABLE IF EXISTS `MEM_STATE`;
CREATE TABLE `MEM_STATE` (
  `ID` char(32) NOT NULL,
  `HOST_NAME` char(30) DEFAULT NULL,
  `TOTAL` char(30) DEFAULT NULL,
  `USED` char(30) DEFAULT NULL,
  `FREE` char(30) DEFAULT NULL,
  `USE_PER` double(8,2) DEFAULT NULL,
  `DATE_STR` char(30) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `MEM_ACC_HOST_INDEX` (`HOST_NAME`,`CREATE_TIME`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for netio_state
-- ----------------------------
DROP TABLE IF EXISTS `NETIO_STATE`;
CREATE TABLE `NETIO_STATE` (
  `ID` char(32) NOT NULL,
  `HOST_NAME` char(30) DEFAULT NULL,
  `RXPCK` char(30) DEFAULT NULL,
  `TXPCK` char(30) DEFAULT NULL,
  `RXBYT` char(30) DEFAULT NULL,
  `TXBYT` char(30) DEFAULT NULL,
  `RXCMP` char(30) DEFAULT NULL,
  `TXCMP` char(30) DEFAULT NULL,
  `RXMCST` char(30) DEFAULT NULL,
  `DATE_STR` char(30) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `NETIO_ACC_HOST_INDEX` (`HOST_NAME`,`CREATE_TIME`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for system_info
-- ----------------------------
DROP TABLE IF EXISTS `SYSTEM_INFO`;
CREATE TABLE `SYSTEM_INFO` (
  `ID` char(32) NOT NULL,
  `HOST_NAME` char(30) DEFAULT NULL,
  `VERSION` char(100) DEFAULT NULL,
  `VERSION_DETAIL` char(200) DEFAULT NULL,
  `CPU_PER` double(8,2) DEFAULT NULL,
  `MEM_PER` double(8,2) DEFAULT NULL,
  `CPU_CORE_NUM` char(10) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  `CPU_XH` char(150) DEFAULT NULL,
  `STATE` char(1) DEFAULT NULL,
  `REMARK` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for sys_load_state
-- ----------------------------
DROP TABLE IF EXISTS `SYS_LOAD_STATE`;
CREATE TABLE `SYS_LOAD_STATE` (
  `ID` char(32) NOT NULL,
  `HOST_NAME` char(30) DEFAULT NULL,
  `ONE_LOAD` double(8,2) DEFAULT NULL,
  `FIVE_LOAD` double(8,2) DEFAULT NULL,
  `FIFTEEN_LOAD` double(8,2) DEFAULT NULL,
  `USERS` char(10) DEFAULT NULL,
  `DATE_STR` char(30) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `LOAD_ACC_HOST_INDEX` (`HOST_NAME`,`CREATE_TIME`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for tcp_state
-- ----------------------------
DROP TABLE IF EXISTS `TCP_STATE`;
CREATE TABLE `TCP_STATE` (
  `ID` char(32) NOT NULL,
  `HOST_NAME` char(30) DEFAULT NULL,
  `ACTIVE` char(30) DEFAULT NULL,
  `PASSIVE` char(30) DEFAULT NULL,
  `RETRANS` char(30) DEFAULT NULL,
  `DATE_STR` char(30) DEFAULT NULL,
  `CREATE_TIME` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `TCP_ACC_HOST_INDEX` (`HOST_NAME`,`CREATE_TIME`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
docker-compose/nacos/conf/application.properties
@@ -149,25 +149,25 @@
nacos.core.auth.system.type=nacos
### If turn on auth system:
nacos.core.auth.enabled=false
nacos.core.auth.enabled=true
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=true
### Since 1.4.1, Turn on/off white auth for user-agent: nacos-server, only for upgrade from old version.
nacos.core.auth.enable.userAgentAuthWhite=true
nacos.core.auth.enable.userAgentAuthWhite=false
### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.
nacos.core.auth.server.identity.key=
nacos.core.auth.server.identity.value=
nacos.core.auth.server.identity.key=admin
nacos.core.auth.server.identity.value=nAcos_!9#_admIn
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.cache.enable=false
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
### The default token (Base64 String):
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
### The default token (Base64 String): https://base64.us/
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXljVXN0b21TZWNyZXRLZTkwMTIzNDU2Nzg=
### worked when nacos.core.auth.system.type=ldap,{0} is Placeholder,replace login username
#nacos.core.auth.ldap.url=ldap://localhost:389
docker-compose/nginx/conf/nginx.conf
@@ -50,6 +50,15 @@
            proxy_pass http://se-gateway:8080/;
        }
        location /wgcloud {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://se-wgcloud:9999/wgcloud;
        }
        # actuator
        if ($request_uri ~ "/actuator") {
            return 403;
docker-compose/system/bootstrap.yml
@@ -12,6 +12,8 @@
    active: dev
  cloud:
    nacos:
      username: nacos
      password: nAcos_!9#_admIn
      discovery:
        # æœåŠ¡æ³¨å†Œåœ°å€
        server-addr: se-nacos:8848
@@ -23,3 +25,4 @@
        # å…±äº«é…ç½®
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
enableEncrypt: false
docker-compose/wgcloud/application.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
server:
  port: 9999
  servlet:
    session:
      timeout: 120m
    context-path: /wgcloud
#日志文件输出路径
logging:
  file:
    path: ./log
# æ•°æ®åº“ ç›¸å…³è®¾ç½®
spring:
  application:
    name: wgcloud-server
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://se-mysql:3306/wgcloud?characterEncoding=utf-8&characterSetResults=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true
    username: root
    password: My_Sql_s!E_v5.7
    # hikari连接池的参数 ç›¸å…³è®¾ç½®
    hikari:
      # ç”Ÿæ•ˆè¶…æ—¶
      validationTimeout: 3000
      # å®šä¹‰èŽ·å–è¿žæŽ¥çš„è¶…æ—¶æ—¶é—´ã€‚æœ€å°250ms,默认30s
      connectionTimeout: 60000
      # å®šä¹‰è¿žæŽ¥ç©ºé—²æ—¶é—´ã€‚最小10s,默认10m
      idleTimeout: 60000
      # å®šä¹‰æœ€å°çš„空闲连接数。推荐不设置。或与最大连接数一致;保持固定的连接数目
      minimumIdle: 10
      # å®šä¹‰æœ€å¤§çš„连接数。默认10
      maximumPoolSize: 10
      # å®šä¹‰è¿žæŽ¥çš„æœ€å¤§ç”Ÿå‘½å‘¨æœŸã€‚推荐设置该属性。最小30s,默认30m
      maxLifeTime: 60000
      # ä»Žè¿žæŽ¥æ± èŽ·å–åˆ°è¿žæŽ¥åŽï¼Œè¿›è¡Œæ£€æŸ¥çš„æŸ¥è¯¢è¯­å¥ã€‚æŽ¨èè®¾ç½®è¯¥å±žæ€§ã€‚é»˜è®¤å€¼ä¸ºnone
      connectionTestQuery: select 1
  mvc:
    static-path-pattern: /static/**
  thymeleaf:
    cache: false
#Mybatis配置
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
#自定义配置参数
base:
  #登陆账号admin的密码
  admindPwd: 111111
  #通信token,agent端和此保持一致
  wgToken: wgcloud
  #是否开启公众看板,yes开启,no关闭,公众看板页面无需登陆
  dashView: yes
  # åˆå§‹åŒ–操作
  initTaskTimes: 10000
  # æ£€æµ‹ä¸»æœºæ˜¯å¦å·²ç»ä¸‹çº¿
  hostDownCheckTimes: 10000
  #服务接口监控间隔,单位毫秒
  heathTimes: 10000
  #数据库监控间隔,单位毫秒
  dbInfoTimes: 10000
  #数据表监控间隔,单位毫秒
  dbTableTimes: 10000
  # æ‰¹é‡æäº¤æ•°æ®
  commitTaskTimes: 10000
#告警配置
mail:
  #告警邮件总开关,yes开启,no关闭
  allWarnMail: yes
  #监控主机内存使用率%报警值,超过此值即发送邮件报警
  memWarnVal: 98
  #监控主机cpu使用率%报警值,超过此值即发送邮件报警
  cpuWarnVal: 98
  #内存告警邮件开关,yes开启,no关闭。总开关开启后,此处设置才会生效。以下开关均遵循此规则。
  memWarnMail: yes
  #CPU告警邮件开关,yes开启,no关闭
  cpuWarnMail: yes
  #主机下线告警邮件开关,yes开启,no关闭
  hostDownWarnMail: yes
  #进程下线告警邮件开关,yes开启,no关闭
  appDownWarnMail: yes
  #服务接口告警邮件开关,yes开启,no关闭
  heathWarnMail: yes
se-auth/pom.xml
@@ -51,14 +51,6 @@
            <groupId>com.se</groupId>
            <artifactId>se-common-security</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
    
    <build>
se-auth/se-auth.iml
@@ -163,7 +163,6 @@
    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:6.1.10.RELEASE" level="project" />
    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.4.34" level="project" />
    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.4" level="project" />
    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.30" level="project" />
    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-bootstrap:3.1.7" level="project" />
    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter:3.1.7" level="project" />
    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.11.RELEASE" level="project" />
se-auth/src/main/java/com/se/auth/controller/TokenController.java
@@ -5,7 +5,9 @@
import com.se.auth.form.LoginBody;
import com.se.auth.form.RegisterBody;
import com.se.auth.service.SysLoginService;
import com.se.common.core.utils.AesUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import com.se.common.core.domain.R;
import com.se.common.core.utils.JwtUtils;
@@ -21,17 +23,21 @@
 * @author admin
 */
@RestController
public class TokenController
{
public class TokenController {
    @Autowired
    private TokenService tokenService;
    @Autowired
    private SysLoginService sysLoginService;
    @Value("${enableEncrypt}")
    boolean enableEncrypt;
    @PostMapping("login")
    public R<?> login(@RequestBody LoginBody form)
    {
    public R<?> login(@RequestBody LoginBody form) throws Exception {
        if (enableEncrypt && !StringUtils.isEmpty(form.getPassword())) {
            form.setPassword(AesUtils.decrypt(form.getPassword()));
        }
        // ç”¨æˆ·ç™»å½•
        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
        // èŽ·å–ç™»å½•token
@@ -56,11 +62,9 @@
    }
    @DeleteMapping("logout")
    public R<?> logout(HttpServletRequest request)
    {
    public R<?> logout(HttpServletRequest request) {
        String token = SecurityUtils.getToken(request);
        if (StringUtils.isNotEmpty(token))
        {
        if (StringUtils.isNotEmpty(token)) {
            String username = JwtUtils.getUserName(token);
            // åˆ é™¤ç”¨æˆ·ç¼“存记录
            AuthUtil.logoutByToken(token);
@@ -71,11 +75,9 @@
    }
    @PostMapping("refresh")
    public R<?> refresh(HttpServletRequest request)
    {
    public R<?> refresh(HttpServletRequest request) {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser))
        {
        if (StringUtils.isNotNull(loginUser)) {
            // åˆ·æ–°ä»¤ç‰Œæœ‰æ•ˆæœŸ
            tokenService.refreshToken(loginUser);
            return R.ok();
@@ -83,11 +85,11 @@
        return R.ok();
    }
    @PostMapping("register")
    /*@PostMapping("register")
    public R<?> register(@RequestBody RegisterBody registerBody)
    {
        // ç”¨æˆ·æ³¨å†Œ
        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword());
        return R.ok();
    }
    }*/
}
se-auth/src/main/java/com/se/auth/service/AsyncService.java
ÎļþÒÑɾ³ý
se-auth/src/main/resources/bootstrap.yml
@@ -12,16 +12,17 @@
    active: dev
  cloud:
    nacos:
      username: nacos
      password: nAcos_!9#_admIn
      discovery:
        # æœåŠ¡æ³¨å†Œåœ°å€
        #server-addr: 192.168.11.203:8848
        server-addr: 127.0.0.1:8848
      config:
        # é…ç½®ä¸­å¿ƒåœ°å€
        #server-addr: 192.168.11.203:8848
        server-addr: 127.0.0.1:8848
        # é…ç½®æ–‡ä»¶æ ¼å¼
        file-extension: yml
        # å…±äº«é…ç½®
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
enableEncrypt: false
se-common/se-common-core/src/main/java/com/se/common/core/utils/AesUtils.java
@@ -15,7 +15,7 @@
    /**
     * å¯†é’¥é•¿åº¦å¿…须是16
     */
    private static final String DEFAULT_KEY = "A#s_zZ_sErve_k.y";
    private static final String DEFAULT_KEY = "A#s_zZ3seRve_k.y";
    private static final String KEY_ALGORITHM = "AES";
se-gateway/src/main/resources/bootstrap.yml
@@ -12,13 +12,13 @@
    active: dev
  cloud:
    nacos:
      username: nacos
      password: nAcos_!9#_admIn
      discovery:
        # æœåŠ¡æ³¨å†Œåœ°å€
        #server-addr: 192.168.11.203:8848
        server-addr: 127.0.0.1:8848
      config:
        # é…ç½®ä¸­å¿ƒåœ°å€
        #server-addr: 192.168.11.203:8848
        server-addr: 127.0.0.1:8848
        # é…ç½®æ–‡ä»¶æ ¼å¼
        file-extension: yml
@@ -35,7 +35,6 @@
      datasource:
        ds1:
          nacos:
            #server-addr: 192.168.11.203:8848
            server-addr: 127.0.0.1:8848
            dataId: sentinel-se-gateway
            groupId: DEFAULT_GROUP
se-modules/se-file/src/main/resources/bootstrap.yml
@@ -12,6 +12,8 @@
    active: dev
  cloud:
    nacos:
      username: nacos
      password: nAcos_!9#_admIn
      discovery:
        # æœåŠ¡æ³¨å†Œåœ°å€
        server-addr: 127.0.0.1:8848
se-modules/se-job/src/main/resources/bootstrap.yml
@@ -12,6 +12,8 @@
    active: dev
  cloud:
    nacos:
      username: nacos
      password: nAcos_!9#_admIn
      discovery:
        # æœåŠ¡æ³¨å†Œåœ°å€
        server-addr: 127.0.0.1:8848
se-modules/se-system/pom.xml
@@ -78,6 +78,13 @@
            <artifactId>se-common-swagger</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <build>
se-modules/se-system/src/main/java/com/se/system/controller/SysMenuController.java
@@ -151,10 +151,30 @@
     * @return è·¯ç”±ä¿¡æ¯
     */
    @GetMapping("getRouters")
    public AjaxResult getRouters()
    public AjaxResult getRouters(String mark) {
        Long userId = SecurityUtils.getUserId();
        if (StringUtils.isEmpty(mark)) {
            mark = "sys";
        }
        if ("all".equals(mark)) {
            mark = null;
        }
        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId, mark);
        return success(menuService.buildMenus(menus));
    }
    /**
     * æ ¹æ®æ ‡è¯†èŽ·å–èœå•
     *
     * @return èœå•
     */
    @GetMapping("getMenusByMark")
    public AjaxResult getMenusByMark(String mark)
    {
        Long userId = SecurityUtils.getUserId();
        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
        return success(menuService.buildMenus(menus));
        List<SysMenu> menus = menuService.selectMenusByUserIdAndMark(userId, mark);
        return success(menus);
    }
}
se-modules/se-system/src/main/java/com/se/system/controller/SysProfileController.java
@@ -1,7 +1,10 @@
package com.se.system.controller;
import java.util.Arrays;
import com.se.common.core.utils.AesUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
@@ -33,25 +36,30 @@
 */
@RestController
@RequestMapping("/user/profile")
public class SysProfileController extends BaseController
{
public class SysProfileController extends BaseController {
    @Autowired
    private ISysUserService userService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private RemoteFileService remoteFileService;
    @Value("${enableEncrypt}")
    boolean enableEncrypt;
    /**
     * ä¸ªäººä¿¡æ¯
     */
    @GetMapping
    public AjaxResult profile()
    {
    public AjaxResult profile() {
        String username = SecurityUtils.getUsername();
        SysUser user = userService.selectUserByUserName(username);
        if (null != user) {
            // è®¾ç½®å¯†ç ä¸ºç©º
            user.setPassword(null);
        }
        AjaxResult ajax = AjaxResult.success(user);
        ajax.put("roleGroup", userService.selectUserRoleGroup(username));
        ajax.put("postGroup", userService.selectUserPostGroup(username));
@@ -63,24 +71,20 @@
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult updateProfile(@RequestBody SysUser user)
    {
    public AjaxResult updateProfile(@RequestBody SysUser user) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        SysUser currentUser = loginUser.getSysUser();
        currentUser.setNickName(user.getNickName());
        currentUser.setEmail(user.getEmail());
        currentUser.setPhonenumber(user.getPhonenumber());
        currentUser.setSex(user.getSex());
        if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
        {
        if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser)) {
            return error("修改用户'" + loginUser.getUsername() + "'失败,手机号码已存在");
        }
        if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
        {
        if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser)) {
            return error("修改用户'" + loginUser.getUsername() + "'失败,邮箱账号已存在");
        }
        if (userService.updateUserProfile(currentUser))
        {
        if (userService.updateUserProfile(currentUser)) {
            // æ›´æ–°ç¼“存用户信息
            tokenService.setLoginUser(loginUser);
            return success();
@@ -93,22 +97,21 @@
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PutMapping("/updatePwd")
    public AjaxResult updatePwd(String oldPassword, String newPassword)
    {
    public AjaxResult updatePwd(String oldPassword, String newPassword) throws Exception {
        String username = SecurityUtils.getUsername();
        SysUser user = userService.selectUserByUserName(username);
        if (enableEncrypt && !StringUtils.isEmpty(user.getPassword())) {
            user.setPassword(AesUtils.decrypt(user.getPassword()));
        }
        String password = user.getPassword();
        if (!SecurityUtils.matchesPassword(oldPassword, password))
        {
        if (!SecurityUtils.matchesPassword(oldPassword, password)) {
            return error("修改密码失败,旧密码错误");
        }
        if (SecurityUtils.matchesPassword(newPassword, password))
        {
        if (SecurityUtils.matchesPassword(newPassword, password)) {
            return error("新密码不能与旧密码相同");
        }
        newPassword = SecurityUtils.encryptPassword(newPassword);
        if (userService.resetUserPwd(username, newPassword) > 0)
        {
        if (userService.resetUserPwd(username, newPassword) > 0) {
            // æ›´æ–°ç¼“存用户密码
            LoginUser loginUser = SecurityUtils.getLoginUser();
            loginUser.getSysUser().setPassword(newPassword);
@@ -117,30 +120,25 @@
        }
        return error("修改密码异常,请联系管理员");
    }
    /**
     * å¤´åƒä¸Šä¼ 
     */
    @Log(title = "用户头像", businessType = BusinessType.UPDATE)
    @PostMapping("/avatar")
    public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file)
    {
        if (!file.isEmpty())
        {
    public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) {
        if (!file.isEmpty()) {
            LoginUser loginUser = SecurityUtils.getLoginUser();
            String extension = FileTypeUtils.getExtension(file);
            if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION))
            {
            if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) {
                return error("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式");
            }
            R<SysFile> fileResult = remoteFileService.upload(file);
            if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData()))
            {
            if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData())) {
                return error("文件服务异常,请联系管理员");
            }
            String url = fileResult.getData().getUrl();
            if (userService.updateUserAvatar(loginUser.getUsername(), url))
            {
            if (userService.updateUserAvatar(loginUser.getUsername(), url)) {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("imgUrl", url);
                // æ›´æ–°ç¼“存用户头像
se-modules/se-system/src/main/java/com/se/system/controller/SysUserController.java
@@ -5,8 +5,12 @@
import java.util.Set;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import com.se.common.core.utils.AesUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
@@ -32,12 +36,7 @@
import com.se.system.api.domain.SysRole;
import com.se.system.api.domain.SysUser;
import com.se.system.api.model.LoginUser;
import com.se.system.service.ISysConfigService;
import com.se.system.service.ISysDeptService;
import com.se.system.service.ISysPermissionService;
import com.se.system.service.ISysPostService;
import com.se.system.service.ISysRoleService;
import com.se.system.service.ISysUserService;
import com.se.system.service.*;
/**
 * ç”¨æˆ·ä¿¡æ¯
@@ -46,8 +45,7 @@
 */
@RestController
@RequestMapping("/user")
public class SysUserController extends BaseController
{
public class SysUserController extends BaseController {
    @Autowired
    private ISysUserService userService;
@@ -66,24 +64,37 @@
    @Autowired
    private ISysConfigService configService;
    @Value("${enableEncrypt}")
    boolean enableEncrypt;
    /**
     * èŽ·å–ç”¨æˆ·åˆ—è¡¨
     */
    @RequiresPermissions("system:user:list")
    @GetMapping("/list")
    public TableDataInfo list(SysUser user)
    {
    public TableDataInfo list(SysUser user) {
        startPage();
        List<SysUser> list = userService.selectUserList(user);
        if (!CollectionUtils.isEmpty(list)) {
            for (SysUser sysUser : list) {
                // è®¾ç½®å¯†ç ä¸ºç©º
                sysUser.setPassword(null);
            }
        }
        return getDataTable(list);
    }
    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
    @RequiresPermissions("system:user:export")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysUser user)
    {
    public void export(HttpServletResponse response, SysUser user) {
        List<SysUser> list = userService.selectUserList(user);
        if (!CollectionUtils.isEmpty(list)) {
            for (SysUser sysUser : list) {
                // è®¾ç½®å¯†ç ä¸ºç©º
                sysUser.setPassword(null);
            }
        }
        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
        util.exportExcel(response, list, "用户数据");
    }
@@ -91,8 +102,7 @@
    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
    @RequiresPermissions("system:user:import")
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
    {
    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
        List<SysUser> userList = util.importExcel(file.getInputStream());
        String operName = SecurityUtils.getUsername();
@@ -101,8 +111,7 @@
    }
    @PostMapping("/importTemplate")
    public void importTemplate(HttpServletResponse response) throws IOException
    {
    public void importTemplate(HttpServletResponse response) throws IOException {
        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
        util.importTemplateExcel(response, "用户数据");
    }
@@ -112,13 +121,13 @@
     */
    @InnerAuth
    @GetMapping("/info/{username}")
    public R<LoginUser> info(@PathVariable("username") String username)
    {
    public R<LoginUser> info(@PathVariable("username") String username) {
        SysUser sysUser = userService.selectUserByUserName(username);
        if (StringUtils.isNull(sysUser))
        {
        if (StringUtils.isNull(sysUser)) {
            return R.fail("用户名或密码错误");
        }
        // è®¾ç½®å¯†ç ä¸ºç©º
        //sysUser.setPassword(null);
        // è§’色集合
        Set<String> roles = permissionService.getRolePermission(sysUser);
        // æƒé™é›†åˆ
@@ -135,38 +144,38 @@
     */
    @InnerAuth
    @PostMapping("/register")
    public R<Boolean> register(@RequestBody SysUser sysUser)
    {
    public R<Boolean> register(@RequestBody SysUser sysUser) {
        String username = sysUser.getUserName();
        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
        {
        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) {
            return R.fail("当前系统没有开启注册功能!");
        }
        if (!userService.checkUserNameUnique(sysUser))
        {
        if (!userService.checkUserNameUnique(sysUser)) {
            return R.fail("保存用户'" + username + "'失败,注册账号已存在");
        }
        return R.ok(userService.registerUser(sysUser));
    }
    /**
     *记录用户登录IP地址和登录时间
     * è®°å½•用户登录IP地址和登录时间
     */
    @InnerAuth
    @PutMapping("/recordlogin")
    public R<Boolean> recordlogin(@RequestBody SysUser sysUser)
    {
    public R<Boolean> recordlogin(@RequestBody SysUser sysUser) {
        return R.ok(userService.updateUserProfile(sysUser));
    }
    /**
     * èŽ·å–ç”¨æˆ·ä¿¡æ¯
     *
     *
     * @return ç”¨æˆ·ä¿¡æ¯
     */
    @GetMapping("getInfo")
    public AjaxResult getInfo() {
        SysUser user = userService.selectUserById(SecurityUtils.getUserId());
        if (null != user) {
            // è®¾ç½®å¯†ç ä¸ºç©º
            user.setPassword(null);
        }
        // è§’色集合
        Set<String> roles = permissionService.getRolePermission(user);
        // æƒé™é›†åˆ
@@ -185,17 +194,19 @@
     * æ ¹æ®ç”¨æˆ·ç¼–号获取详细信息
     */
    @RequiresPermissions("system:user:query")
    @GetMapping(value = { "/", "/{userId}" })
    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
    {
    @GetMapping(value = {"/", "/{userId}"})
    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) {
        userService.checkUserDataScope(userId);
        AjaxResult ajax = AjaxResult.success();
        List<SysRole> roles = roleService.selectRoleAll();
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        ajax.put("posts", postService.selectPostAll());
        if (StringUtils.isNotNull(userId))
        {
        if (StringUtils.isNotNull(userId)) {
            SysUser sysUser = userService.selectUserById(userId);
            if (null != sysUser) {
                // è®¾ç½®å¯†ç ä¸ºç©º
                sysUser.setPassword(null);
            }
            ajax.put(AjaxResult.DATA_TAG, sysUser);
            ajax.put("postIds", postService.selectPostListByUserId(userId));
            ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
@@ -209,21 +220,18 @@
    @RequiresPermissions("system:user:add")
    @Log(title = "用户管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysUser user)
    {
    public AjaxResult add(@Validated @RequestBody SysUser user) throws Exception {
        deptService.checkDeptDataScope(user.getDeptId());
        roleService.checkRoleDataScope(user.getRoleIds());
        if (!userService.checkUserNameUnique(user))
        {
        if (!userService.checkUserNameUnique(user)) {
            return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
        }
        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
        {
        } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
            return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
        {
        } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
        if (enableEncrypt && !StringUtils.isEmpty(user.getPassword())) {
            user.setPassword(AesUtils.decrypt(user.getPassword()));
        }
        user.setCreateBy(SecurityUtils.getUsername());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@@ -236,22 +244,16 @@
    @RequiresPermissions("system:user:edit")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysUser user)
    {
    public AjaxResult edit(@Validated @RequestBody SysUser user) {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        deptService.checkDeptDataScope(user.getDeptId());
        roleService.checkRoleDataScope(user.getRoleIds());
        if (!userService.checkUserNameUnique(user))
        {
        if (!userService.checkUserNameUnique(user)) {
            return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
        }
        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
        {
        } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
            return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
        {
        } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
        user.setUpdateBy(SecurityUtils.getUsername());
@@ -264,10 +266,8 @@
    @RequiresPermissions("system:user:remove")
    @Log(title = "用户管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{userIds}")
    public AjaxResult remove(@PathVariable Long[] userIds)
    {
        if (ArrayUtils.contains(userIds, SecurityUtils.getUserId()))
        {
    public AjaxResult remove(@PathVariable Long[] userIds) {
        if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) {
            return error("当前用户不能删除");
        }
        return toAjax(userService.deleteUserByIds(userIds));
@@ -279,10 +279,12 @@
    @RequiresPermissions("system:user:edit")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/resetPwd")
    public AjaxResult resetPwd(@RequestBody SysUser user)
    {
    public AjaxResult resetPwd(@RequestBody SysUser user) throws Exception {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        if (enableEncrypt && !StringUtils.isEmpty(user.getPassword())) {
            user.setPassword(AesUtils.decrypt(user.getPassword()));
        }
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        user.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(userService.resetPwd(user));
@@ -294,8 +296,7 @@
    @RequiresPermissions("system:user:edit")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysUser user)
    {
    public AjaxResult changeStatus(@RequestBody SysUser user) {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        user.setUpdateBy(SecurityUtils.getUsername());
@@ -307,8 +308,7 @@
     */
    @RequiresPermissions("system:user:query")
    @GetMapping("/authRole/{userId}")
    public AjaxResult authRole(@PathVariable("userId") Long userId)
    {
    public AjaxResult authRole(@PathVariable("userId") Long userId) {
        AjaxResult ajax = AjaxResult.success();
        SysUser user = userService.selectUserById(userId);
        List<SysRole> roles = roleService.selectRolesByUserId(userId);
@@ -323,8 +323,7 @@
    @RequiresPermissions("system:user:edit")
    @Log(title = "用户管理", businessType = BusinessType.GRANT)
    @PutMapping("/authRole")
    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
    {
    public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
        userService.checkUserDataScope(userId);
        roleService.checkRoleDataScope(roleIds);
        userService.insertUserAuth(userId, roleIds);
@@ -336,8 +335,7 @@
     */
    @RequiresPermissions("system:user:list")
    @GetMapping("/deptTree")
    public AjaxResult deptTree(SysDept dept)
    {
    public AjaxResult deptTree(SysDept dept) {
        return success(deptService.selectDeptTreeList(dept));
    }
}
se-modules/se-system/src/main/java/com/se/system/domain/SysMenu.java
@@ -66,6 +66,9 @@
    /** èœå•图标 */
    private String icon;
    /** èœå•标识 */
    private String mark;
    /** å­èœå• */
    private List<SysMenu> children = new ArrayList<SysMenu>();
@@ -246,6 +249,14 @@
        this.children = children;
    }
    public String getMark() {
        return mark;
    }
    public void setMark(String mark) {
        this.mark = mark;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -269,6 +280,7 @@
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .append("mark", getMark())
            .toString();
    }
}
se-modules/se-system/src/main/java/com/se/system/mapper/SysMenuMapper.java
@@ -10,11 +10,10 @@
 * 
 * @author admin
 */
public interface SysMenuMapper
{
public interface SysMenuMapper {
    /**
     * æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     *
     * @param menu èœå•信息
     * @return èœå•列表
     */
@@ -22,14 +21,14 @@
    /**
     * æ ¹æ®ç”¨æˆ·æ‰€æœ‰æƒé™
     *
     *
     * @return æƒé™åˆ—表
     */
    public List<String> selectMenuPerms();
    /**
     * æ ¹æ®ç”¨æˆ·æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     *
     * @param menu èœå•信息
     * @return èœå•列表
     */
@@ -37,7 +36,7 @@
    /**
     * æ ¹æ®è§’色ID查询权限
     *
     *
     * @param roleId è§’色ID
     * @return æƒé™åˆ—表
     */
@@ -45,7 +44,7 @@
    /**
     * æ ¹æ®ç”¨æˆ·ID查询权限
     *
     *
     * @param userId ç”¨æˆ·ID
     * @return æƒé™åˆ—表
     */
@@ -53,23 +52,24 @@
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单
     *
     *
     * @return èœå•列表
     */
    public List<SysMenu> selectMenuTreeAll();
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单
     *
     *
     * @param userId ç”¨æˆ·ID
     * @param mark   æ ‡è¯†
     * @return èœå•列表
     */
    public List<SysMenu> selectMenuTreeByUserId(Long userId);
    public List<SysMenu> selectMenuTreeByUserId(@Param("userId") Long userId, @Param("mark") String mark);
    /**
     * æ ¹æ®è§’色ID查询菜单树信息
     *
     * @param roleId è§’色ID
     *
     * @param roleId            è§’色ID
     * @param menuCheckStrictly èœå•树选择项是否关联显示
     * @return é€‰ä¸­èœå•列表
     */
@@ -77,7 +77,7 @@
    /**
     * æ ¹æ®èœå•ID查询信息
     *
     *
     * @param menuId èœå•ID
     * @return èœå•信息
     */
@@ -85,7 +85,7 @@
    /**
     * æ˜¯å¦å­˜åœ¨èœå•子节点
     *
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
@@ -93,7 +93,7 @@
    /**
     * æ–°å¢žèœå•信息
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
@@ -101,7 +101,7 @@
    /**
     * ä¿®æ”¹èœå•信息
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
@@ -109,7 +109,7 @@
    /**
     * åˆ é™¤èœå•管理信息
     *
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
@@ -117,10 +117,19 @@
    /**
     * æ ¡éªŒèœå•名称是否唯一
     *
     *
     * @param menuName èœå•名称
     * @param parentId çˆ¶èœå•ID
     * @return ç»“æžœ
     */
    public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId);
    /**
     * æ ¹æ®ç”¨æˆ·ID和标识查询菜单
     *
     * @param userId ç”¨æˆ·ID
     * @param mark   æ ‡è¯†
     * @return èœå•集合
     */
    List<SysMenu> selectMenusByUserIdAndMark(@Param("userId") Long userId, @Param("mark") String mark);
}
se-modules/se-system/src/main/java/com/se/system/mapper/SysUserMapper.java
@@ -52,6 +52,14 @@
    public SysUser selectUserById(Long userId);
    /**
     * é€šè¿‡ids查询用户
     *
     * @param ids
     * @return
     */
    public List<SysUser> selectUserByIds(@Param("ids") String ids);
    /**
     * æ–°å¢žç”¨æˆ·ä¿¡æ¯
     * 
     * @param user ç”¨æˆ·ä¿¡æ¯
se-modules/se-system/src/main/java/com/se/system/service/ISysConfigService.java
@@ -1,7 +1,7 @@
package com.se.system.service;
import java.util.List;
import com.se.system.domain.SysConfig;
import com.se.system.domain.*;
/**
 * å‚数配置 æœåС层
se-modules/se-system/src/main/java/com/se/system/service/ISysMenuService.java
@@ -11,11 +11,10 @@
 * 
 * @author admin
 */
public interface ISysMenuService
{
public interface ISysMenuService {
    /**
     * æ ¹æ®ç”¨æˆ·æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     *
     * @param userId ç”¨æˆ·ID
     * @return èœå•列表
     */
@@ -23,8 +22,8 @@
    /**
     * æ ¹æ®ç”¨æˆ·æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     * @param menu èœå•信息
     *
     * @param menu   èœå•信息
     * @param userId ç”¨æˆ·ID
     * @return èœå•列表
     */
@@ -32,7 +31,7 @@
    /**
     * æ ¹æ®ç”¨æˆ·ID查询权限
     *
     *
     * @param userId ç”¨æˆ·ID
     * @return æƒé™åˆ—表
     */
@@ -40,7 +39,7 @@
    /**
     * æ ¹æ®è§’色ID查询权限
     *
     *
     * @param roleId è§’色ID
     * @return æƒé™åˆ—表
     */
@@ -48,15 +47,16 @@
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单树信息
     *
     *
     * @param userId ç”¨æˆ·ID
     * @param mark   æ ‡è¯†
     * @return èœå•列表
     */
    public List<SysMenu> selectMenuTreeByUserId(Long userId);
    public List<SysMenu> selectMenuTreeByUserId(Long userId, String mark);
    /**
     * æ ¹æ®è§’色ID查询菜单树信息
     *
     *
     * @param roleId è§’色ID
     * @return é€‰ä¸­èœå•列表
     */
@@ -64,7 +64,7 @@
    /**
     * æž„建前端路由所需要的菜单
     *
     *
     * @param menus èœå•列表
     * @return è·¯ç”±åˆ—表
     */
@@ -72,7 +72,7 @@
    /**
     * æž„建前端所需要树结构
     *
     *
     * @param menus èœå•列表
     * @return æ ‘结构列表
     */
@@ -80,7 +80,7 @@
    /**
     * æž„建前端所需要下拉树结构
     *
     *
     * @param menus èœå•列表
     * @return ä¸‹æ‹‰æ ‘结构列表
     */
@@ -88,7 +88,7 @@
    /**
     * æ ¹æ®èœå•ID查询信息
     *
     *
     * @param menuId èœå•ID
     * @return èœå•信息
     */
@@ -96,7 +96,7 @@
    /**
     * æ˜¯å¦å­˜åœ¨èœå•子节点
     *
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ true å­˜åœ¨ false ä¸å­˜åœ¨
     */
@@ -104,7 +104,7 @@
    /**
     * æŸ¥è¯¢èœå•是否存在角色
     *
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ true å­˜åœ¨ false ä¸å­˜åœ¨
     */
@@ -112,7 +112,7 @@
    /**
     * æ–°å¢žä¿å­˜èœå•信息
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
@@ -120,7 +120,7 @@
    /**
     * ä¿®æ”¹ä¿å­˜èœå•信息
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
@@ -128,7 +128,7 @@
    /**
     * åˆ é™¤èœå•管理信息
     *
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
@@ -136,9 +136,18 @@
    /**
     * æ ¡éªŒèœå•名称是否唯一
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public boolean checkMenuNameUnique(SysMenu menu);
    /**
     * æ ¹æ®ç”¨æˆ·ID和标识查询菜单
     *
     * @param userId ç”¨æˆ·ID
     * @param mark   æ ‡è¯†
     * @return èœå•集合
     */
    List<SysMenu> selectMenusByUserIdAndMark(Long userId, String mark);
}
se-modules/se-system/src/main/java/com/se/system/service/impl/IsimUserService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.se.system.service.impl;
import com.se.system.api.domain.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * ISIM用户服务
 *
 * @author WWW
 * @date 2024-08-30
 */
@Slf4j
@Service
@SuppressWarnings("ALL")
public class IsimUserService {
    public void insertUser(SysUser user) {
        try {
            System.out.println("insertUser");
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
    public void insertUsers(List<SysUser> list) {
        try {
            System.out.println("insertUsers");
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
    public void updateUser(SysUser user) {
        try {
            System.out.println("updateUser");
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
    public void updateUsers(List<SysUser> list) {
        try {
            System.out.println("updateUsers");
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
    public void deleteUser(SysUser user) {
        try {
            System.out.println("deleteUser");
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
    public void deleteUsers(List<SysUser> list) {
        try {
            System.out.println("deleteUsers");
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
}
se-modules/se-system/src/main/java/com/se/system/service/impl/SyncUserService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.se.system.service.impl;
import com.se.system.api.domain.SysUser;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * ç”¨æˆ·åŒæ­¥æœåŠ¡
 *
 * @author WWW
 * @date 2024-08-30
 */
@Slf4j
@Service
@SuppressWarnings("ALL")
public class SyncUserService {
    @Resource
    IsimUserService isimUserService;
    public void insertUser(SysUser user) {
        // supplyAsync-带返回值,runAsync-无返回值
        CompletableFuture.runAsync(() -> {
            isimUserService.insertUser(user);
        });
    }
    public void insertUsers(List<SysUser> list) {
        CompletableFuture.runAsync(() -> {
            isimUserService.insertUsers(list);
        });
    }
    public void updateUser(SysUser user) {
        CompletableFuture.runAsync(() -> {
            isimUserService.updateUser(user);
        });
    }
    public void updateUsers(List<SysUser> list) {
        CompletableFuture.runAsync(() -> {
            isimUserService.updateUsers(list);
        });
    }
    public void deleteUser(SysUser user) {
        CompletableFuture.runAsync(() -> {
            isimUserService.deleteUser(user);
        });
    }
    public void deleteUsers(List<SysUser> list) {
        CompletableFuture.runAsync(() -> {
            isimUserService.deleteUsers(list);
        });
    }
    private void asyncCall() {
        try {
            ExecutorService executor = Executors.newSingleThreadExecutor();
            executor.execute(new Runnable() {
                @Override
                @SneakyThrows
                public void run() {
                    //
                }
            });
            executor.shutdown();
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
}
se-modules/se-system/src/main/java/com/se/system/service/impl/SysMenuServiceImpl.java
@@ -10,7 +10,6 @@
import java.util.stream.Collectors;
import com.se.system.domain.SysMenu;
import com.se.system.domain.vo.MetaVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.se.common.core.constant.Constants;
@@ -19,11 +18,9 @@
import com.se.common.security.utils.SecurityUtils;
import com.se.system.api.domain.SysRole;
import com.se.system.api.domain.SysUser;
import com.se.system.domain.vo.RouterVo;
import com.se.system.domain.vo.TreeSelect;
import com.se.system.domain.vo.*;
import com.se.system.mapper.SysMenuMapper;
import com.se.system.mapper.SysRoleMapper;
import com.se.system.mapper.SysRoleMenuMapper;
import com.se.system.mapper.*;
import com.se.system.service.ISysMenuService;
/**
@@ -32,8 +29,7 @@
 * @author admin
 */
@Service
public class SysMenuServiceImpl implements ISysMenuService
{
public class SysMenuServiceImpl implements ISysMenuService {
    public static final String PREMISSION_STRING = "perms[\"{0}\"]";
    @Autowired
@@ -47,33 +43,28 @@
    /**
     * æ ¹æ®ç”¨æˆ·æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     *
     * @param userId ç”¨æˆ·ID
     * @return èœå•列表
     */
    @Override
    public List<SysMenu> selectMenuList(Long userId)
    {
    public List<SysMenu> selectMenuList(Long userId) {
        return selectMenuList(new SysMenu(), userId);
    }
    /**
     * æŸ¥è¯¢ç³»ç»Ÿèœå•列表
     *
     *
     * @param menu èœå•信息
     * @return èœå•列表
     */
    @Override
    public List<SysMenu> selectMenuList(SysMenu menu, Long userId)
    {
    public List<SysMenu> selectMenuList(SysMenu menu, Long userId) {
        List<SysMenu> menuList = null;
        // ç®¡ç†å‘˜æ˜¾ç¤ºæ‰€æœ‰èœå•信息
        if (SysUser.isAdmin(userId))
        {
        if (SysUser.isAdmin(userId)) {
            menuList = menuMapper.selectMenuList(menu);
        }
        else
        {
        } else {
            menu.getParams().put("userId", userId);
            menuList = menuMapper.selectMenuListByUserId(menu);
        }
@@ -82,19 +73,16 @@
    /**
     * æ ¹æ®ç”¨æˆ·ID查询权限
     *
     *
     * @param userId ç”¨æˆ·ID
     * @return æƒé™åˆ—表
     */
    @Override
    public Set<String> selectMenuPermsByUserId(Long userId)
    {
    public Set<String> selectMenuPermsByUserId(Long userId) {
        List<String> perms = menuMapper.selectMenuPermsByUserId(userId);
        Set<String> permsSet = new HashSet<>();
        for (String perm : perms)
        {
            if (StringUtils.isNotEmpty(perm))
            {
        for (String perm : perms) {
            if (StringUtils.isNotEmpty(perm)) {
                permsSet.addAll(Arrays.asList(perm.trim().split(",")));
            }
        }
@@ -103,19 +91,16 @@
    /**
     * æ ¹æ®è§’色ID查询权限
     *
     *
     * @param roleId è§’色ID
     * @return æƒé™åˆ—表
     */
    @Override
    public Set<String> selectMenuPermsByRoleId(Long roleId)
    {
    public Set<String> selectMenuPermsByRoleId(Long roleId) {
        List<String> perms = menuMapper.selectMenuPermsByRoleId(roleId);
        Set<String> permsSet = new HashSet<>();
        for (String perm : perms)
        {
            if (StringUtils.isNotEmpty(perm))
            {
        for (String perm : perms) {
            if (StringUtils.isNotEmpty(perm)) {
                permsSet.addAll(Arrays.asList(perm.trim().split(",")));
            }
        }
@@ -124,14 +109,14 @@
    /**
     * æ ¹æ®ç”¨æˆ·ID查询菜单
     *
     *
     * @param userId ç”¨æˆ·åç§°
     * @param mark   æ ‡è¯†
     * @return èœå•列表
     */
    @Override
    public List<SysMenu> selectMenuTreeByUserId(Long userId)
    {
        List<SysMenu> menus = null;
    public List<SysMenu> selectMenuTreeByUserId(Long userId, String mark) {
        /*List<SysMenu> menus = null;
        if (SecurityUtils.isAdmin(userId))
        {
            menus = menuMapper.selectMenuTreeAll();
@@ -139,35 +124,41 @@
        else
        {
            menus = menuMapper.selectMenuTreeByUserId(userId);
        }
        }*/
        List<SysMenu> menus = menuMapper.selectMenuTreeByUserId(SecurityUtils.isAdmin(userId) ? null : userId, mark);
        return getChildPerms(menus, 0);
    }
    @Override
    public List<SysMenu> selectMenusByUserIdAndMark(Long userId, String mark) {
        List<SysMenu> menus = menuMapper.selectMenusByUserIdAndMark(SecurityUtils.isAdmin(userId) ? null : userId, mark);
        return getChildPerms(menus, 0);
    }
    /**
     * æ ¹æ®è§’色ID查询菜单树信息
     *
     *
     * @param roleId è§’色ID
     * @return é€‰ä¸­èœå•列表
     */
    @Override
    public List<Long> selectMenuListByRoleId(Long roleId)
    {
    public List<Long> selectMenuListByRoleId(Long roleId) {
        SysRole role = roleMapper.selectRoleById(roleId);
        return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());
    }
    /**
     * æž„建前端路由所需要的菜单
     *
     *
     * @param menus èœå•列表
     * @return è·¯ç”±åˆ—表
     */
    @Override
    public List<RouterVo> buildMenus(List<SysMenu> menus)
    {
    public List<RouterVo> buildMenus(List<SysMenu> menus) {
        List<RouterVo> routers = new LinkedList<RouterVo>();
        for (SysMenu menu : menus)
        {
        for (SysMenu menu : menus) {
            RouterVo router = new RouterVo();
            router.setHidden("1".equals(menu.getVisible()));
            router.setName(getRouteName(menu));
@@ -176,14 +167,11 @@
            router.setQuery(menu.getQuery());
            router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()));
            List<SysMenu> cMenus = menu.getChildren();
            if (StringUtils.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType()))
            {
            if (StringUtils.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
                router.setAlwaysShow(true);
                router.setRedirect("noRedirect");
                router.setChildren(buildMenus(cMenus));
            }
            else if (isMenuFrame(menu))
            {
            } else if (isMenuFrame(menu)) {
                router.setMeta(null);
                List<RouterVo> childrenList = new ArrayList<RouterVo>();
                RouterVo children = new RouterVo();
@@ -194,9 +182,7 @@
                children.setQuery(menu.getQuery());
                childrenList.add(children);
                router.setChildren(childrenList);
            }
            else if (menu.getParentId().intValue() == 0 && isInnerLink(menu))
            {
            } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) {
                router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
                router.setPath("/");
                List<RouterVo> childrenList = new ArrayList<RouterVo>();
@@ -216,27 +202,23 @@
    /**
     * æž„建前端所需要树结构
     *
     *
     * @param menus èœå•列表
     * @return æ ‘结构列表
     */
    @Override
    public List<SysMenu> buildMenuTree(List<SysMenu> menus)
    {
    public List<SysMenu> buildMenuTree(List<SysMenu> menus) {
        List<SysMenu> returnList = new ArrayList<SysMenu>();
        List<Long> tempList = menus.stream().map(SysMenu::getMenuId).collect(Collectors.toList());
        for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext();)
        {
        for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext(); ) {
            SysMenu menu = (SysMenu) iterator.next();
            // å¦‚果是顶级节点, éåŽ†è¯¥çˆ¶èŠ‚ç‚¹çš„æ‰€æœ‰å­èŠ‚ç‚¹
            if (!tempList.contains(menu.getParentId()))
            {
            if (!tempList.contains(menu.getParentId())) {
                recursionFn(menus, menu);
                returnList.add(menu);
            }
        }
        if (returnList.isEmpty())
        {
        if (returnList.isEmpty()) {
            returnList = menus;
        }
        return returnList;
@@ -244,104 +226,95 @@
    /**
     * æž„建前端所需要下拉树结构
     *
     *
     * @param menus èœå•列表
     * @return ä¸‹æ‹‰æ ‘结构列表
     */
    @Override
    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus)
    {
    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus) {
        List<SysMenu> menuTrees = buildMenuTree(menus);
        return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
    }
    /**
     * æ ¹æ®èœå•ID查询信息
     *
     *
     * @param menuId èœå•ID
     * @return èœå•信息
     */
    @Override
    public SysMenu selectMenuById(Long menuId)
    {
    public SysMenu selectMenuById(Long menuId) {
        return menuMapper.selectMenuById(menuId);
    }
    /**
     * æ˜¯å¦å­˜åœ¨èœå•子节点
     *
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
    @Override
    public boolean hasChildByMenuId(Long menuId)
    {
    public boolean hasChildByMenuId(Long menuId) {
        int result = menuMapper.hasChildByMenuId(menuId);
        return result > 0;
    }
    /**
     * æŸ¥è¯¢èœå•使用数量
     *
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
    @Override
    public boolean checkMenuExistRole(Long menuId)
    {
    public boolean checkMenuExistRole(Long menuId) {
        int result = roleMenuMapper.checkMenuExistRole(menuId);
        return result > 0;
    }
    /**
     * æ–°å¢žä¿å­˜èœå•信息
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    @Override
    public int insertMenu(SysMenu menu)
    {
    public int insertMenu(SysMenu menu) {
        return menuMapper.insertMenu(menu);
    }
    /**
     * ä¿®æ”¹ä¿å­˜èœå•信息
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    @Override
    public int updateMenu(SysMenu menu)
    {
    public int updateMenu(SysMenu menu) {
        return menuMapper.updateMenu(menu);
    }
    /**
     * åˆ é™¤èœå•管理信息
     *
     *
     * @param menuId èœå•ID
     * @return ç»“æžœ
     */
    @Override
    public int deleteMenuById(Long menuId)
    {
    public int deleteMenuById(Long menuId) {
        return menuMapper.deleteMenuById(menuId);
    }
    /**
     * æ ¡éªŒèœå•名称是否唯一
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    @Override
    public boolean checkMenuNameUnique(SysMenu menu)
    {
    public boolean checkMenuNameUnique(SysMenu menu) {
        Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();
        SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId());
        if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue())
        {
        if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
@@ -349,15 +322,13 @@
    /**
     * èŽ·å–è·¯ç”±åç§°
     *
     *
     * @param menu èœå•信息
     * @return è·¯ç”±åç§°
     */
    public String getRouteName(SysMenu menu)
    {
    public String getRouteName(SysMenu menu) {
        // éžå¤–链并且是一级目录(类型为目录)
        if (isMenuFrame(menu))
        {
        if (isMenuFrame(menu)) {
            return StringUtils.EMPTY;
        }
        return getRouteName(menu.getRouteName(), menu.getPath());
@@ -365,40 +336,35 @@
    /**
     * èŽ·å–è·¯ç”±åç§°ï¼Œå¦‚æ²¡æœ‰é…ç½®è·¯ç”±åç§°åˆ™å–è·¯ç”±åœ°å€
     *
     *
     * @param routerName è·¯ç”±åç§°
     * @param path è·¯ç”±åœ°å€
     * @param path       è·¯ç”±åœ°å€
     * @return è·¯ç”±åç§°ï¼ˆé©¼å³°æ ¼å¼ï¼‰
     */
    public String getRouteName(String name, String path)
    {
    public String getRouteName(String name, String path) {
        String routerName = StringUtils.isNotEmpty(name) ? name : path;
        return StringUtils.capitalize(routerName);
    }
    /**
     * èŽ·å–è·¯ç”±åœ°å€
     *
     *
     * @param menu èœå•信息
     * @return è·¯ç”±åœ°å€
     */
    public String getRouterPath(SysMenu menu)
    {
    public String getRouterPath(SysMenu menu) {
        String routerPath = menu.getPath();
        // å†…链打开外网方式
        if (menu.getParentId().intValue() != 0 && isInnerLink(menu))
        {
        if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) {
            routerPath = innerLinkReplaceEach(routerPath);
        }
        // éžå¤–链并且是一级目录(类型为目录)
        if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType())
                && UserConstants.NO_FRAME.equals(menu.getIsFrame()))
        {
                && UserConstants.NO_FRAME.equals(menu.getIsFrame())) {
            routerPath = "/" + menu.getPath();
        }
        // éžå¤–链并且是一级目录(类型为菜单)
        else if (isMenuFrame(menu))
        {
        else if (isMenuFrame(menu)) {
            routerPath = "/";
        }
        return routerPath;
@@ -406,23 +372,17 @@
    /**
     * èŽ·å–ç»„ä»¶ä¿¡æ¯
     *
     *
     * @param menu èœå•信息
     * @return ç»„件信息
     */
    public String getComponent(SysMenu menu)
    {
    public String getComponent(SysMenu menu) {
        String component = UserConstants.LAYOUT;
        if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu))
        {
        if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) {
            component = menu.getComponent();
        }
        else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu))
        {
        } else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) {
            component = UserConstants.INNER_LINK;
        }
        else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu))
        {
        } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) {
            component = UserConstants.PARENT_VIEW;
        }
        return component;
@@ -430,54 +390,48 @@
    /**
     * æ˜¯å¦ä¸ºèœå•内部跳转
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public boolean isMenuFrame(SysMenu menu)
    {
    public boolean isMenuFrame(SysMenu menu) {
        return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType())
                && menu.getIsFrame().equals(UserConstants.NO_FRAME);
    }
    /**
     * æ˜¯å¦ä¸ºå†…链组件
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public boolean isInnerLink(SysMenu menu)
    {
    public boolean isInnerLink(SysMenu menu) {
        return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath());
    }
    /**
     * æ˜¯å¦ä¸ºparent_view组件
     *
     *
     * @param menu èœå•信息
     * @return ç»“æžœ
     */
    public boolean isParentView(SysMenu menu)
    {
    public boolean isParentView(SysMenu menu) {
        return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType());
    }
    /**
     * æ ¹æ®çˆ¶èŠ‚ç‚¹çš„ID获取所有子节点
     *
     * @param list åˆ†ç±»è¡¨
     *
     * @param list     åˆ†ç±»è¡¨
     * @param parentId ä¼ å…¥çš„父节点ID
     * @return String
     */
    public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId)
    {
    public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) {
        List<SysMenu> returnList = new ArrayList<SysMenu>();
        for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext();)
        {
        for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext(); ) {
            SysMenu t = (SysMenu) iterator.next();
            // ä¸€ã€æ ¹æ®ä¼ å…¥çš„æŸä¸ªçˆ¶èŠ‚ç‚¹ID,遍历该父节点的所有子节点
            if (t.getParentId() == parentId)
            {
            if (t.getParentId() == parentId) {
                recursionFn(list, t);
                returnList.add(t);
            }
@@ -487,19 +441,16 @@
    /**
     * é€’归列表
     *
     *
     * @param list åˆ†ç±»è¡¨
     * @param t å­èŠ‚ç‚¹
     * @param t    å­èŠ‚ç‚¹
     */
    private void recursionFn(List<SysMenu> list, SysMenu t)
    {
    private void recursionFn(List<SysMenu> list, SysMenu t) {
        // å¾—到子节点列表
        List<SysMenu> childList = getChildList(list, t);
        t.setChildren(childList);
        for (SysMenu tChild : childList)
        {
            if (hasChild(list, tChild))
            {
        for (SysMenu tChild : childList) {
            if (hasChild(list, tChild)) {
                recursionFn(list, tChild);
            }
        }
@@ -508,15 +459,12 @@
    /**
     * å¾—到子节点列表
     */
    private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t)
    {
    private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) {
        List<SysMenu> tlist = new ArrayList<SysMenu>();
        Iterator<SysMenu> it = list.iterator();
        while (it.hasNext())
        {
        while (it.hasNext()) {
            SysMenu n = (SysMenu) it.next();
            if (n.getParentId().longValue() == t.getMenuId().longValue())
            {
            if (n.getParentId().longValue() == t.getMenuId().longValue()) {
                tlist.add(n);
            }
        }
@@ -526,19 +474,17 @@
    /**
     * åˆ¤æ–­æ˜¯å¦æœ‰å­èŠ‚ç‚¹
     */
    private boolean hasChild(List<SysMenu> list, SysMenu t)
    {
    private boolean hasChild(List<SysMenu> list, SysMenu t) {
        return getChildList(list, t).size() > 0;
    }
    /**
     * å†…链域名特殊字符替换
     *
     *
     * @return æ›¿æ¢åŽçš„内链域名
     */
    public String innerLinkReplaceEach(String path)
    {
        return StringUtils.replaceEach(path, new String[] { Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":" },
                new String[] { "", "", "", "/", "/" });
    public String innerLinkReplaceEach(String path) {
        return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":"},
                new String[]{"", "", "", "/", "/"});
    }
}
se-modules/se-system/src/main/java/com/se/system/service/impl/SysUserServiceImpl.java
@@ -3,6 +3,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.validation.Validator;
import com.se.system.domain.SysPost;
@@ -38,8 +39,7 @@
 * @author admin
 */
@Service
public class SysUserServiceImpl implements ISysUserService
{
public class SysUserServiceImpl implements ISysUserService {
    private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
    @Autowired
@@ -66,81 +66,77 @@
    @Autowired
    protected Validator validator;
    @Resource
    SyncUserService syncUserService;
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢ç”¨æˆ·åˆ—表
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<SysUser> selectUserList(SysUser user)
    {
    public List<SysUser> selectUserList(SysUser user) {
        return userMapper.selectUserList(user);
    }
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢å·²åˆ†é…ç”¨æˆ·è§’色列表
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<SysUser> selectAllocatedList(SysUser user)
    {
    public List<SysUser> selectAllocatedList(SysUser user) {
        return userMapper.selectAllocatedList(user);
    }
    /**
     * æ ¹æ®æ¡ä»¶åˆ†é¡µæŸ¥è¯¢æœªåˆ†é…ç”¨æˆ·è§’色列表
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<SysUser> selectUnallocatedList(SysUser user)
    {
    public List<SysUser> selectUnallocatedList(SysUser user) {
        return userMapper.selectUnallocatedList(user);
    }
    /**
     * é€šè¿‡ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·
     *
     *
     * @param userName ç”¨æˆ·å
     * @return ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     */
    @Override
    public SysUser selectUserByUserName(String userName)
    {
    public SysUser selectUserByUserName(String userName) {
        return userMapper.selectUserByUserName(userName);
    }
    /**
     * é€šè¿‡ç”¨æˆ·ID查询用户
     *
     *
     * @param userId ç”¨æˆ·ID
     * @return ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     */
    @Override
    public SysUser selectUserById(Long userId)
    {
    public SysUser selectUserById(Long userId) {
        return userMapper.selectUserById(userId);
    }
    /**
     * æŸ¥è¯¢ç”¨æˆ·æ‰€å±žè§’色组
     *
     *
     * @param userName ç”¨æˆ·å
     * @return ç»“æžœ
     */
    @Override
    public String selectUserRoleGroup(String userName)
    {
    public String selectUserRoleGroup(String userName) {
        List<SysRole> list = roleMapper.selectRolesByUserName(userName);
        if (CollectionUtils.isEmpty(list))
        {
        if (CollectionUtils.isEmpty(list)) {
            return StringUtils.EMPTY;
        }
        return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(","));
@@ -148,16 +144,14 @@
    /**
     * æŸ¥è¯¢ç”¨æˆ·æ‰€å±žå²—位组
     *
     *
     * @param userName ç”¨æˆ·å
     * @return ç»“æžœ
     */
    @Override
    public String selectUserPostGroup(String userName)
    {
    public String selectUserPostGroup(String userName) {
        List<SysPost> list = postMapper.selectPostsByUserName(userName);
        if (CollectionUtils.isEmpty(list))
        {
        if (CollectionUtils.isEmpty(list)) {
            return StringUtils.EMPTY;
        }
        return list.stream().map(SysPost::getPostName).collect(Collectors.joining(","));
@@ -165,17 +159,15 @@
    /**
     * æ ¡éªŒç”¨æˆ·åç§°æ˜¯å¦å”¯ä¸€
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public boolean checkUserNameUnique(SysUser user)
    {
    public boolean checkUserNameUnique(SysUser user) {
        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
        SysUser info = userMapper.checkUserNameUnique(user.getUserName());
        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
        {
        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
@@ -188,12 +180,10 @@
     * @return
     */
    @Override
    public boolean checkPhoneUnique(SysUser user)
    {
    public boolean checkPhoneUnique(SysUser user) {
        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
        SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
        {
        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
@@ -206,12 +196,10 @@
     * @return
     */
    @Override
    public boolean checkEmailUnique(SysUser user)
    {
    public boolean checkEmailUnique(SysUser user) {
        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
        SysUser info = userMapper.checkEmailUnique(user.getEmail());
        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
        {
        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
@@ -219,33 +207,28 @@
    /**
     * æ ¡éªŒç”¨æˆ·æ˜¯å¦å…è®¸æ“ä½œ
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     */
    @Override
    public void checkUserAllowed(SysUser user)
    {
        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())
        {
    public void checkUserAllowed(SysUser user) {
        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) {
            throw new ServiceException("不允许操作超级管理员用户");
        }
    }
    /**
     * æ ¡éªŒç”¨æˆ·æ˜¯å¦æœ‰æ•°æ®æƒé™
     *
     *
     * @param userId ç”¨æˆ·id
     */
    @Override
    public void checkUserDataScope(Long userId)
    {
        if (!SysUser.isAdmin(SecurityUtils.getUserId()))
        {
    public void checkUserDataScope(Long userId) {
        if (!SysUser.isAdmin(SecurityUtils.getUserId())) {
            SysUser user = new SysUser();
            user.setUserId(userId);
            List<SysUser> users = SpringUtils.getAopProxy(this).selectUserList(user);
            if (StringUtils.isEmpty(users))
            {
            if (StringUtils.isEmpty(users)) {
                throw new ServiceException("没有权限访问用户数据!");
            }
        }
@@ -253,45 +236,49 @@
    /**
     * æ–°å¢žä¿å­˜ç”¨æˆ·ä¿¡æ¯
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertUser(SysUser user)
    {
    public int insertUser(SysUser user) {
        // æ–°å¢žç”¨æˆ·ä¿¡æ¯
        int rows = userMapper.insertUser(user);
        // æ–°å¢žç”¨æˆ·å²—位关联
        insertUserPost(user);
        // æ–°å¢žç”¨æˆ·ä¸Žè§’色管理
        insertUserRole(user);
        if (rows > 0) {
            syncUserService.insertUser(user);
        }
        return rows;
    }
    /**
     * æ³¨å†Œç”¨æˆ·ä¿¡æ¯
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public boolean registerUser(SysUser user)
    {
        return userMapper.insertUser(user) > 0;
    public boolean registerUser(SysUser user) {
        int rows = userMapper.insertUser(user);
        if (rows > 0) {
            syncUserService.insertUser(user);
        }
        return rows > 0;
    }
    /**
     * ä¿®æ”¹ä¿å­˜ç”¨æˆ·ä¿¡æ¯
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateUser(SysUser user)
    {
    public int updateUser(SysUser user) {
        Long userId = user.getUserId();
        // åˆ é™¤ç”¨æˆ·ä¸Žè§’色关联
        userRoleMapper.deleteUserRoleByUserId(userId);
@@ -301,109 +288,111 @@
        userPostMapper.deleteUserPostByUserId(userId);
        // æ–°å¢žç”¨æˆ·ä¸Žå²—位管理
        insertUserPost(user);
        return userMapper.updateUser(user);
        int rows = userMapper.updateUser(user);
        if (rows > 0) {
            syncUserService.updateUser(user);
        }
        return rows;
    }
    /**
     * ç”¨æˆ·æŽˆæƒè§’色
     *
     * @param userId ç”¨æˆ·ID
     *
     * @param userId  ç”¨æˆ·ID
     * @param roleIds è§’色组
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void insertUserAuth(Long userId, Long[] roleIds)
    {
    public void insertUserAuth(Long userId, Long[] roleIds) {
        userRoleMapper.deleteUserRoleByUserId(userId);
        insertUserRole(userId, roleIds);
    }
    /**
     * ä¿®æ”¹ç”¨æˆ·çŠ¶æ€
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int updateUserStatus(SysUser user)
    {
        return userMapper.updateUser(user);
    public int updateUserStatus(SysUser user) {
        int rows = userMapper.updateUser(user);
        if (rows > 0) {
            syncUserService.updateUser(user);
        }
        return rows;
    }
    /**
     * ä¿®æ”¹ç”¨æˆ·åŸºæœ¬ä¿¡æ¯
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public boolean updateUserProfile(SysUser user)
    {
        return userMapper.updateUser(user) > 0;
    public boolean updateUserProfile(SysUser user) {
        int rows = userMapper.updateUser(user);
        if (rows > 0) {
            syncUserService.updateUser(user);
        }
        return rows > 0;
    }
    /**
     * ä¿®æ”¹ç”¨æˆ·å¤´åƒ
     *
     *
     * @param userName ç”¨æˆ·å
     * @param avatar å¤´åƒåœ°å€
     * @param avatar   å¤´åƒåœ°å€
     * @return ç»“æžœ
     */
    @Override
    public boolean updateUserAvatar(String userName, String avatar)
    {
    public boolean updateUserAvatar(String userName, String avatar) {
        return userMapper.updateUserAvatar(userName, avatar) > 0;
    }
    /**
     * é‡ç½®ç”¨æˆ·å¯†ç 
     *
     *
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @Override
    public int resetPwd(SysUser user)
    {
    public int resetPwd(SysUser user) {
        return userMapper.updateUser(user);
    }
    /**
     * é‡ç½®ç”¨æˆ·å¯†ç 
     *
     *
     * @param userName ç”¨æˆ·å
     * @param password å¯†ç 
     * @return ç»“æžœ
     */
    @Override
    public int resetUserPwd(String userName, String password)
    {
    public int resetUserPwd(String userName, String password) {
        return userMapper.resetUserPwd(userName, password);
    }
    /**
     * æ–°å¢žç”¨æˆ·è§’色信息
     *
     *
     * @param user ç”¨æˆ·å¯¹è±¡
     */
    public void insertUserRole(SysUser user)
    {
    public void insertUserRole(SysUser user) {
        this.insertUserRole(user.getUserId(), user.getRoleIds());
    }
    /**
     * æ–°å¢žç”¨æˆ·å²—位信息
     *
     *
     * @param user ç”¨æˆ·å¯¹è±¡
     */
    public void insertUserPost(SysUser user)
    {
    public void insertUserPost(SysUser user) {
        Long[] posts = user.getPostIds();
        if (StringUtils.isNotEmpty(posts))
        {
        if (StringUtils.isNotEmpty(posts)) {
            // æ–°å¢žç”¨æˆ·ä¸Žå²—位管理
            List<SysUserPost> list = new ArrayList<SysUserPost>();
            for (Long postId : posts)
            {
            for (Long postId : posts) {
                SysUserPost up = new SysUserPost();
                up.setUserId(user.getUserId());
                up.setPostId(postId);
@@ -415,18 +404,15 @@
    /**
     * æ–°å¢žç”¨æˆ·è§’色信息
     *
     * @param userId ç”¨æˆ·ID
     *
     * @param userId  ç”¨æˆ·ID
     * @param roleIds è§’色组
     */
    public void insertUserRole(Long userId, Long[] roleIds)
    {
        if (StringUtils.isNotEmpty(roleIds))
        {
    public void insertUserRole(Long userId, Long[] roleIds) {
        if (StringUtils.isNotEmpty(roleIds)) {
            // æ–°å¢žç”¨æˆ·ä¸Žè§’色管理
            List<SysUserRole> list = new ArrayList<SysUserRole>();
            for (Long roleId : roleIds)
            {
            for (Long roleId : roleIds) {
                SysUserRole ur = new SysUserRole();
                ur.setUserId(userId);
                ur.setRoleId(roleId);
@@ -438,33 +424,35 @@
    /**
     * é€šè¿‡ç”¨æˆ·ID删除用户
     *
     *
     * @param userId ç”¨æˆ·ID
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteUserById(Long userId)
    {
    public int deleteUserById(Long userId) {
        // åˆ é™¤ç”¨æˆ·ä¸Žè§’色关联
        userRoleMapper.deleteUserRoleByUserId(userId);
        // åˆ é™¤ç”¨æˆ·ä¸Žå²—位表
        userPostMapper.deleteUserPostByUserId(userId);
        return userMapper.deleteUserById(userId);
        SysUser user = userMapper.selectUserById(userId);
        int rows = userMapper.deleteUserById(userId);
        if (rows > 0) {
            syncUserService.deleteUser(user);
        }
        return rows;
    }
    /**
     * æ‰¹é‡åˆ é™¤ç”¨æˆ·ä¿¡æ¯
     *
     *
     * @param userIds éœ€è¦åˆ é™¤çš„用户ID
     * @return ç»“æžœ
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteUserByIds(Long[] userIds)
    {
        for (Long userId : userIds)
        {
    public int deleteUserByIds(Long[] userIds) {
        for (Long userId : userIds) {
            checkUserAllowed(new SysUser(userId));
            checkUserDataScope(userId);
        }
@@ -472,81 +460,84 @@
        userRoleMapper.deleteUserRole(userIds);
        // åˆ é™¤ç”¨æˆ·ä¸Žå²—位关联
        userPostMapper.deleteUserPost(userIds);
        return userMapper.deleteUserByIds(userIds);
        List<SysUser> list = userMapper.selectUserByIds(StringUtils.joinWith(",", userIds));
        int rows = userMapper.deleteUserByIds(userIds);
        if (rows > 0 && !CollectionUtils.isEmpty(list)) {
            syncUserService.deleteUsers(list);
        }
        return rows;
    }
    /**
     * å¯¼å…¥ç”¨æˆ·æ•°æ®
     *
     * @param userList ç”¨æˆ·æ•°æ®åˆ—表
     *
     * @param userList        ç”¨æˆ·æ•°æ®åˆ—表
     * @param isUpdateSupport æ˜¯å¦æ›´æ–°æ”¯æŒï¼Œå¦‚果已存在,则进行更新数据
     * @param operName æ“ä½œç”¨æˆ·
     * @param operName        æ“ä½œç”¨æˆ·
     * @return ç»“æžœ
     */
    @Override
    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName)
    {
        if (StringUtils.isNull(userList) || userList.size() == 0)
        {
    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName) {
        if (StringUtils.isNull(userList) || userList.size() == 0) {
            throw new ServiceException("导入用户数据不能为空!");
        }
        int successNum = 0;
        int failureNum = 0;
        List<SysUser> insertList = new ArrayList<>();
        List<SysUser> updateList = new ArrayList<>();
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        for (SysUser user : userList)
        {
            try
            {
        for (SysUser user : userList) {
            try {
                // éªŒè¯æ˜¯å¦å­˜åœ¨è¿™ä¸ªç”¨æˆ·
                SysUser u = userMapper.selectUserByUserName(user.getUserName());
                if (StringUtils.isNull(u))
                {
                if (StringUtils.isNull(u)) {
                    BeanValidators.validateWithException(validator, user);
                    deptService.checkDeptDataScope(user.getDeptId());
                    String password = configService.selectConfigByKey("sys.user.initPassword");
                    user.setPassword(SecurityUtils.encryptPassword(password));
                    user.setCreateBy(operName);
                    userMapper.insertUser(user);
                    if (userMapper.insertUser(user) > 0) {
                        insertList.add(user);
                    }
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " å¯¼å…¥æˆåŠŸ");
                }
                else if (isUpdateSupport)
                {
                } else if (isUpdateSupport) {
                    BeanValidators.validateWithException(validator, user);
                    checkUserAllowed(u);
                    checkUserDataScope(u.getUserId());
                    deptService.checkDeptDataScope(user.getDeptId());
                    user.setUserId(u.getUserId());
                    user.setUpdateBy(operName);
                    userMapper.updateUser(user);
                    if (userMapper.updateUser(user) > 0) {
                        updateList.add(user);
                    }
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " æ›´æ–°æˆåŠŸ");
                }
                else
                {
                } else {
                    failureNum++;
                    failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " å·²å­˜åœ¨");
                }
            }
            catch (Exception e)
            {
            } catch (Exception e) {
                failureNum++;
                String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " å¯¼å…¥å¤±è´¥ï¼š";
                failureMsg.append(msg + e.getMessage());
                log.error(msg, e);
            }
        }
        if (failureNum > 0)
        {
        if (insertList.size() > 0) {
            syncUserService.insertUsers(insertList);
        }
        if (updateList.size() > 0) {
            syncUserService.updateUsers(updateList);
        }
        if (failureNum > 0) {
            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " æ¡æ•°æ®æ ¼å¼ä¸æ­£ç¡®ï¼Œé”™è¯¯å¦‚下:");
            throw new ServiceException(failureMsg.toString());
        }
        else
        {
        } else {
            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " æ¡ï¼Œæ•°æ®å¦‚下:");
        }
        return successMsg.toString();
    }
}
se-modules/se-system/src/main/resources/bootstrap.yml
@@ -12,16 +12,17 @@
    active: dev
  cloud:
    nacos:
      username: nacos
      password: nAcos_!9#_admIn
      discovery:
        # æœåŠ¡æ³¨å†Œåœ°å€
        #server-addr: 192.168.11.203:8848
        server-addr: 127.0.0.1:8848
      config:
        # é…ç½®ä¸­å¿ƒåœ°å€
        #server-addr: 192.168.11.203:8848
        server-addr: 127.0.0.1:8848
        # é…ç½®æ–‡ä»¶æ ¼å¼
        file-extension: yml
        # å…±äº«é…ç½®
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
enableEncrypt: false
se-modules/se-system/src/main/resources/logback.xml
@@ -57,7 +57,7 @@
        </filter>
    </appender>
    <!-- ç³»ç»Ÿæ¨¡å—日志级别控制  -->
    <!-- ç³»ç»Ÿæ¨¡å—日志级别控制:info,debug  -->
    <logger name="com.se" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />
se-modules/se-system/src/main/resources/mapper/system/SysMenuMapper.xml
@@ -26,10 +26,11 @@
        <result property="updateTime"     column="update_time"    />
        <result property="updateBy"       column="update_by"      />
        <result property="remark"         column="remark"         />
        <result property="mark"           column="mark"         />
    </resultMap>
    <sql id="selectMenuVo">
        select menu_id, menu_name, parent_id, order_num, path, component, `query`, route_name, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time
        select menu_id, menu_name, parent_id, order_num, path, component, `query`, route_name, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time, mark
        from sys_menu
    </sql>
    
@@ -50,13 +51,13 @@
    </select>
    
    <select id="selectMenuTreeAll" resultMap="SysMenuResult">
        select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
        select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time, m.mark
        from sys_menu m where m.menu_type in ('M', 'C') and m.status = 0
        order by m.parent_id, m.order_num
    </select>
    
    <select id="selectMenuListByUserId" parameterType="SysMenu" resultMap="SysMenuResult">
        select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
        select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time, m.mark
        from sys_menu m
        left join sys_role_menu rm on m.menu_id = rm.menu_id
        left join sys_user_role ur on rm.role_id = ur.role_id
@@ -73,18 +74,41 @@
        </if>
        order by m.parent_id, m.order_num
    </select>
    <select id="selectMenuTreeByUserId" parameterType="Long" resultMap="SysMenuResult">
        select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
    <select id="selectMenuTreeByUserId" resultMap="SysMenuResult">
        select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time, m.mark
        from sys_menu m
             left join sys_role_menu rm on m.menu_id = rm.menu_id
             left join sys_user_role ur on rm.role_id = ur.role_id
             left join sys_role ro on ur.role_id = ro.role_id
             left join sys_user u on ur.user_id = u.user_id
        where u.user_id = #{userId} and m.menu_type in ('M', 'C') and m.status = 0  AND ro.status = 0
        where m.menu_type in ('M', 'C') and m.status = 0 and ro.status = 0
            <if test="userId != null and userId != ''">
                and u.user_id = #{userId}
            </if>
            <if test="mark != null and mark != ''">
                and m.mark = #{mark}
            </if>
        order by m.parent_id, m.order_num
    </select>
    <select id="selectMenusByUserIdAndMark" resultMap="SysMenuResult">
        select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time, m.mark
        from sys_menu m
            left join sys_role_menu rm on m.menu_id = rm.menu_id
            left join sys_user_role ur on rm.role_id = ur.role_id
            left join sys_role ro on ur.role_id = ro.role_id
            left join sys_user u on ur.user_id = u.user_id
        where m.menu_type in ('M', 'C', 'F') and m.status = 0 and ro.status = 0
            <if test="userId != null and userId != ''">
                and u.user_id = #{userId}
            </if>
            <if test="mark != null and mark != ''">
                and m.mark = #{mark}
            </if>
        order by m.parent_id, m.order_num
    </select>
    <select id="selectMenuListByRoleId" resultType="Long">
        select m.menu_id
        from sys_menu m
@@ -152,6 +176,7 @@
            <if test="icon !=null and icon != ''">icon = #{icon},</if>
            <if test="remark != null and remark != ''">remark = #{remark},</if>
            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
            <if test="mark != null and mark != ''">mark = #{mark},</if>
            update_time = sysdate()
        </set>
        where menu_id = #{menuId}
@@ -176,6 +201,7 @@
        <if test="icon != null and icon != ''">icon,</if>
        <if test="remark != null and remark != ''">remark,</if>
        <if test="createBy != null and createBy != ''">create_by,</if>
        <if test="mark != null and mark != ''">mark,</if>
        create_time
        )values(
        <if test="menuId != null and menuId != 0">#{menuId},</if>
@@ -195,6 +221,7 @@
        <if test="icon != null and icon != ''">#{icon},</if>
        <if test="remark != null and remark != ''">#{remark},</if>
        <if test="createBy != null and createBy != ''">#{createBy},</if>
        <if test="mark != null and mark != ''">#{mark},</if>
        sysdate()
        )
    </insert>
se-modules/se-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -130,6 +130,11 @@
        <include refid="selectUserVo"/>
        where u.user_id = #{userId}
    </select>
    <select id="selectUserByIds" resultMap="SysUserResult">
        <include refid="selectUserVo"/>
        where u.user_id in (${ids})
    </select>
    
    <select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, user_name from sys_user where user_name = #{userName} and del_flag = '0' limit 1