feat: 新增第三方登录认证和管理
This commit is contained in:
@@ -1,22 +1,3 @@
|
|||||||
/*
|
|
||||||
Navicat Premium Data Transfer
|
|
||||||
|
|
||||||
Source Server : local_mariadb
|
|
||||||
Source Server Type : MariaDB
|
|
||||||
Source Server Version : 100338 (10.3.38-MariaDB)
|
|
||||||
Source Host : localhost:33066
|
|
||||||
Source Schema : omc_db
|
|
||||||
|
|
||||||
Target Server Type : MariaDB
|
|
||||||
Target Server Version : 100338 (10.3.38-MariaDB)
|
|
||||||
File Encoding : 65001
|
|
||||||
|
|
||||||
Date: 14/05/2024 11:55:53
|
|
||||||
*/
|
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
|
||||||
SET FOREIGN_KEY_CHECKS = 0;
|
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for mml_command
|
-- Table structure for mml_command
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@@ -31,9 +12,8 @@ CREATE TABLE `mml_command` (
|
|||||||
`mml_display` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
`mml_display` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
||||||
`param_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
|
`param_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
|
||||||
`status` enum('Active','Inactive') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'Active' COMMENT '激活: Active 未激活: Inactive',
|
`status` enum('Active','Inactive') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'Active' COMMENT '激活: Active 未激活: Inactive',
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
INDEX `id`(`id`) USING BTREE
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 1626 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of mml_command
|
-- Records of mml_command
|
||||||
@@ -71,5 +51,3 @@ INSERT INTO `mml_command` VALUES (1622, 'OMC', 'logManagement', 'Log Management'
|
|||||||
INSERT INTO `mml_command` VALUES (1623, 'OMC', 'logManagement', 'Log Management', 'lst', 'eventlog', 'List NE Event Log', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"log_time\\u003e\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Log time(\\u003e=)\",\"filter\":\"\",\"name\":\"starttime\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"log_time\\u003c\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Log time(\\u003c=)\",\"filter\":\"\",\"name\":\"endtime\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active');
|
INSERT INTO `mml_command` VALUES (1623, 'OMC', 'logManagement', 'Log Management', 'lst', 'eventlog', 'List NE Event Log', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"ne_id\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"loc\":\"true\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"log_time\\u003e\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Log time(\\u003e=)\",\"filter\":\"\",\"name\":\"starttime\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"log_time\\u003c\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Log time(\\u003c=)\",\"filter\":\"\",\"name\":\"endtime\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active');
|
||||||
INSERT INTO `mml_command` VALUES (1624, 'OMC', 'mmlManagement', 'MML Management', 'lst', 'mmlcmd', 'List MML Command', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Category\",\"filter\":\"\",\"name\":\"category\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"operation\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Operation\",\"filter\":\"\",\"name\":\"operation\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"object\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Object\",\"filter\":\"\",\"name\":\"object\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active');
|
INSERT INTO `mml_command` VALUES (1624, 'OMC', 'mmlManagement', 'MML Management', 'lst', 'mmlcmd', 'List MML Command', '[{\"alias\":\"ne_type\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Category\",\"filter\":\"\",\"name\":\"category\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"operation\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Operation\",\"filter\":\"\",\"name\":\"operation\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"object\",\"apostr\":\"true\",\"comment\":\"\",\"display\":\"Object\",\"filter\":\"\",\"name\":\"object\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active');
|
||||||
INSERT INTO `mml_command` VALUES (1625, 'OMC', 'systemManagement', 'System Management', 'dsp', 'sysinfo', 'Display NE System Information', '[{\"alias\":\"neType\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"neId\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active');
|
INSERT INTO `mml_command` VALUES (1625, 'OMC', 'systemManagement', 'System Management', 'dsp', 'sysinfo', 'Display NE System Information', '[{\"alias\":\"neType\",\"apostr\":\"false\",\"comment\":\"\",\"display\":\"NE type\",\"filter\":\"\",\"name\":\"netype\",\"optional\":\"true\",\"type\":\"string\"},{\"alias\":\"neId\",\"comment\":\"\",\"display\":\"NE ID\",\"filter\":\"\",\"name\":\"neid\",\"optional\":\"true\",\"type\":\"string\"}]', 'Active');
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
|
||||||
|
|||||||
@@ -189,6 +189,10 @@ INSERT INTO `sys_dict_data` VALUES (161, 22, 'dictData.trace_interfaces.22', 'N2
|
|||||||
INSERT INTO `sys_dict_data` VALUES (162, 40, 'dictData.trace_interfaces.40', 'N40', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (162, 40, 'dictData.trace_interfaces.40', 'N40', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (163, 14, 'dictData.trace_interfaces.14', 'N14', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (163, 14, 'dictData.trace_interfaces.14', 'N14', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (164, 5, 'dictData.trace_interfaces.5', 'N5', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (164, 5, 'dictData.trace_interfaces.5', 'N5', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (165, 1, 'dictData.sys_user_type.system', 'System', 'sys_user_type', '', 'default', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (166, 2, 'dictData.sys_user_type.ldap', 'LDAP', 'sys_user_type', '', 'lime', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (167, 3, 'dictData.sys_user_type.smtp', 'SMTP', 'sys_user_type', '', 'magenta', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (168, 4, 'dictData.sys_user_type.oauth2', 'OAuth2', 'sys_user_type', '', 'gold', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
|
||||||
-- 多租户
|
-- 多租户
|
||||||
INSERT INTO `sys_dict_data` VALUES (10000, 10000, 'dictData.tenancy.imsi', 'IMSI', 'tenancy_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL);
|
INSERT INTO `sys_dict_data` VALUES (10000, 10000, 'dictData.tenancy.imsi', 'IMSI', 'tenancy_type', NULL, NULL, '1', 'supervisor', 1699350000000, NULL, 0, NULL);
|
||||||
|
|||||||
@@ -747,6 +747,14 @@ INSERT INTO `sys_dict_data` VALUES (2236, 2236, 'job.backup_export_cdr', '备份
|
|||||||
INSERT INTO `sys_dict_data` VALUES (2237, 2237, 'job.backup_export_cdr_remark', 'dataType: 类型支持 ims/smf/sgwc/smsc\nfileType: 文件类型 csv/xlsx\nhour: 数据时间从任务执行时间前的小时数', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (2237, 2237, 'job.backup_export_cdr_remark', 'dataType: 类型支持 ims/smf/sgwc/smsc\nfileType: 文件类型 csv/xlsx\nhour: 数据时间从任务执行时间前的小时数', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (2238, 2238, 'dictData.trace_interfaces.14', 'N14', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (2238, 2238, 'dictData.trace_interfaces.14', 'N14', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (2239, 2239, 'dictData.trace_interfaces.5', 'N5', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (2239, 2239, 'dictData.trace_interfaces.5', 'N5', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2240, 2240, "dictType.sys_user_type", "用户类型", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2241, 2241, "dictData.sys_user_type.system", "系统", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2242, 2242, "dictData.sys_user_type.ldap", "LDAP", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2243, 2243, "dictData.sys_user_type.smtp", "SMTP", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2244, 2244, "dictData.sys_user_type.oauth2", "OAuth2", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2245, 2245, "user.export.userType", "用户类型", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2246, 2246, "menu.system.loginSource", "第三方登录认证", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (2247, 2247, "log.operate.title.sysLoginSource", "认证源", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
|
||||||
-- multi-tenancy
|
-- multi-tenancy
|
||||||
INSERT INTO `sys_dict_data` VALUES (11000, 11000, 'menu.security.tenant', '租户管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
|
INSERT INTO `sys_dict_data` VALUES (11000, 11000, 'menu.security.tenant', '租户管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
|
|||||||
@@ -747,6 +747,14 @@ INSERT INTO `sys_dict_data` VALUES (4236, 4236, 'job.backup_export_cdr', 'Backup
|
|||||||
INSERT INTO `sys_dict_data` VALUES (4237, 4237, 'job.backup_export_cdr_remark', 'Backup-Periodic export of dataType: type support ims/smf/sgwc/smsc\nfileType: file type csv/xlsx\nhour: data time from the hour before the task execution time', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (4237, 4237, 'job.backup_export_cdr_remark', 'Backup-Periodic export of dataType: type support ims/smf/sgwc/smsc\nfileType: file type csv/xlsx\nhour: data time from the hour before the task execution time', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (4238, 4238, 'dictData.trace_interfaces.14', 'N14', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (4238, 4238, 'dictData.trace_interfaces.14', 'N14', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
INSERT INTO `sys_dict_data` VALUES (4239, 4239, 'dictData.trace_interfaces.5', 'N5', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (4239, 4239, 'dictData.trace_interfaces.5', 'N5', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4240, 4240, "dictType.sys_user_type", "User Type", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4241, 4241, "dictData.sys_user_type.system", "System", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4242, 4242, "dictData.sys_user_type.ldap", "LDAP", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4243, 4243, "dictData.sys_user_type.smtp", "SMTP", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4244, 4244, "dictData.sys_user_type.oauth2", "OAuth2", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4245, 4245, "user.export.userType", "User Type", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4246, 4246, "menu.system.loginSource", "Third Party Login Source", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
INSERT INTO `sys_dict_data` VALUES (4247, 4247, "log.operate.title.sysLoginSource", "Login Source", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
|
||||||
-- 多租户
|
-- 多租户
|
||||||
INSERT INTO `sys_dict_data` VALUES (14000, 14000, 'menu.security.tenant', 'Tenant Management', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
INSERT INTO `sys_dict_data` VALUES (14000, 14000, 'menu.security.tenant', 'Tenant Management', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ INSERT INTO `sys_dict_type` VALUES (5, 'dictType.sys_job_group', 'sys_job_group'
|
|||||||
INSERT INTO `sys_dict_type` VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_yes_no_remark');
|
INSERT INTO `sys_dict_type` VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_yes_no_remark');
|
||||||
INSERT INTO `sys_dict_type` VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_oper_type_remark');
|
INSERT INTO `sys_dict_type` VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_oper_type_remark');
|
||||||
INSERT INTO `sys_dict_type` VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_common_status_remark');
|
INSERT INTO `sys_dict_type` VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_common_status_remark');
|
||||||
|
INSERT INTO `sys_dict_type` VALUES (11, 'dictType.sys_user_type', 'sys_user_type', '1', 'supervisor', 1699350000000, NULL, 0, '');
|
||||||
INSERT INTO `sys_dict_type` VALUES (100, 'dictType.trace_type', 'trace_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.trace_type_remark');
|
INSERT INTO `sys_dict_type` VALUES (100, 'dictType.trace_type', 'trace_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.trace_type_remark');
|
||||||
-- INSERT INTO `sys_dict_type` VALUES (101, 'dictType.operation_log_type', 'operation_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.operation_log_type_remark');
|
-- INSERT INTO `sys_dict_type` VALUES (101, 'dictType.operation_log_type', 'operation_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.operation_log_type_remark');
|
||||||
INSERT INTO `sys_dict_type` VALUES (102, 'dictType.alarm_status', 'alarm_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.alarm_status_remark');
|
INSERT INTO `sys_dict_type` VALUES (102, 'dictType.alarm_status', 'alarm_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.alarm_status_remark');
|
||||||
|
|||||||
24
database/install/sys_login_source.sql
Normal file
24
database/install/sys_login_source.sql
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
--
|
||||||
|
-- Table structure for table `sys_login_source`
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `sys_login_source`;
|
||||||
|
CREATE TABLE `sys_login_source` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||||
|
`uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UID 16位长度字符串',
|
||||||
|
`type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证类型 LDAP SMTP OAuth2',
|
||||||
|
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证名称',
|
||||||
|
`icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '图标',
|
||||||
|
`active_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '激活标记(0未激活 1激活)',
|
||||||
|
`sync_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '同步标记(0未同步 1同步)',
|
||||||
|
`config` text COLLATE utf8mb4_general_ci COMMENT '认证配置',
|
||||||
|
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` bigint NULL DEFAULT 0 COMMENT '创建时间',
|
||||||
|
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` bigint NULL DEFAULT 0 COMMENT '更新时间',
|
||||||
|
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
KEY `idx_ls_type_name` (`type`,`name`) USING BTREE COMMENT '认证类型_认证名称'
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统_认证源表';
|
||||||
|
|
||||||
|
-- Dump completed on 2025-08-05 16:20:56
|
||||||
@@ -66,6 +66,7 @@ INSERT INTO `sys_menu` VALUES (105, 'menu.security.post', 2113, 6, 'post', 'syst
|
|||||||
INSERT INTO `sys_menu` VALUES (106, 'menu.system.dictType', 1, 7, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', 'supervisor', 1700000000000, NULL, 0, 'menu.system.dictTypeRemark');
|
INSERT INTO `sys_menu` VALUES (106, 'menu.system.dictType', 1, 7, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', 'supervisor', 1700000000000, NULL, 0, 'menu.system.dictTypeRemark');
|
||||||
INSERT INTO `sys_menu` VALUES (107, 'menu.system.dictData', 1, 8, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', 'supervisor', 1700000000000, NULL, 0, 'menu.system.dictDataRemark');
|
INSERT INTO `sys_menu` VALUES (107, 'menu.system.dictData', 1, 8, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', 'supervisor', 1700000000000, NULL, 0, 'menu.system.dictDataRemark');
|
||||||
INSERT INTO `sys_menu` VALUES (108, 'menu.system.paramSet', 1, 9, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', 'supervisor', 1700000000000, NULL, 0, 'menu.system.paramSetRemark');
|
INSERT INTO `sys_menu` VALUES (108, 'menu.system.paramSet', 1, 9, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', 'supervisor', 1700000000000, NULL, 0, 'menu.system.paramSetRemark');
|
||||||
|
INSERT INTO `sys_menu` VALUES (109, 'menu.system.loginSource', 2113, 12, 'login-source', 'system/login-source/index', '1', '1', 'M', '1', '1', 'system:loginSource:list', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, '');
|
||||||
INSERT INTO `sys_menu` VALUES (111, 'menu.system.systemLog', 1, 11, 'log', NULL, '1', '1', 'D', '0', '0', NULL, '#', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemLogRemark');
|
INSERT INTO `sys_menu` VALUES (111, 'menu.system.systemLog', 1, 11, 'log', NULL, '1', '1', 'D', '0', '0', NULL, '#', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemLogRemark');
|
||||||
INSERT INTO `sys_menu` VALUES (112, 'menu.system.systemInfo', 1, 5, 'system-info', 'monitor/system/info', '1', '1', 'M', '1', '1', 'monitor:system:info', 'icon-fuzhidaima', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemInfoRemark');
|
INSERT INTO `sys_menu` VALUES (112, 'menu.system.systemInfo', 1, 5, 'system-info', 'monitor/system/info', '1', '1', 'M', '1', '1', 'monitor:system:info', 'icon-fuzhidaima', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemInfoRemark');
|
||||||
INSERT INTO `sys_menu` VALUES (113, 'menu.system.cacheInfo', 1, 8, 'cache-info', 'monitor/cache/info', '1', '1', 'M', '1', '1', 'monitor:cache:info', 'icon-gongnengjieshao', 'supervisor', 1700000000000, NULL, 0, 'menu.system.cacheInfoRemark');
|
INSERT INTO `sys_menu` VALUES (113, 'menu.system.cacheInfo', 1, 8, 'cache-info', 'monitor/cache/info', '1', '1', 'M', '1', '1', 'monitor:cache:info', 'icon-gongnengjieshao', 'supervisor', 1700000000000, NULL, 0, 'menu.system.cacheInfoRemark');
|
||||||
@@ -128,6 +129,10 @@ INSERT INTO `sys_menu` VALUES (1053, 'menu.common.edit', 116, 3, '#', NULL, '1',
|
|||||||
INSERT INTO `sys_menu` VALUES (1054, 'menu.common.delete', 116, 4, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
INSERT INTO `sys_menu` VALUES (1054, 'menu.common.delete', 116, 4, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
INSERT INTO `sys_menu` VALUES (1055, 'menu.common.edit', 116, 5, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
INSERT INTO `sys_menu` VALUES (1055, 'menu.common.edit', 116, 5, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
INSERT INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:export', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
INSERT INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:export', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
|
INSERT INTO `sys_menu` VALUES (1057, 'menu.common.query', 109, 1, NULL, NULL, '1', '1', 'B', '1', '1', 'system:loginSource:query', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
|
INSERT INTO `sys_menu` VALUES (1058, 'menu.common.add', 109, 2, NULL, NULL, '1', '1', 'B', '1', '1', 'system:loginSource:add', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
|
INSERT INTO `sys_menu` VALUES (1059, 'menu.common.edit', 109, 3, NULL, NULL, '1', '1', 'B', '1', '1', 'system:loginSource:edit', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
|
INSERT INTO `sys_menu` VALUES (1060, 'menu.common.delete', 109, 4, NULL, NULL, '1', '1', 'B', '1', '1', 'system:loginSource:remove', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
INSERT INTO `sys_menu` VALUES (2009, 'menu.ueUser.authUDM', 5, 1, 'auth', 'neUser/auth/index', '1', '1', 'M', '1', '1', 'neUser:auth:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.authUDMRemark');
|
INSERT INTO `sys_menu` VALUES (2009, 'menu.ueUser.authUDM', 5, 1, 'auth', 'neUser/auth/index', '1', '1', 'M', '1', '1', 'neUser:auth:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.authUDMRemark');
|
||||||
INSERT INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 5, 2, 'sub', 'neUser/sub/index', '1', '1', 'M', '1', '1', 'neUser:sub:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.subUDMRemark');
|
INSERT INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 5, 2, 'sub', 'neUser/sub/index', '1', '1', 'M', '1', '1', 'neUser:sub:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.subUDMRemark');
|
||||||
INSERT INTO `sys_menu` VALUES (2011, 'menu.ueUser.voipUDM', 5, 3, 'voip', 'neUser/voip/index', '1', '1', 'M', '1', '1', 'neUser:voip:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.voipUDMRemark');
|
INSERT INTO `sys_menu` VALUES (2011, 'menu.ueUser.voipUDM', 5, 3, 'voip', 'neUser/voip/index', '1', '1', 'M', '1', '1', 'neUser:voip:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.voipUDMRemark');
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
SET NAMES utf8mb4;
|
|
||||||
SET FOREIGN_KEY_CHECKS = 0;
|
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for sys_role_menu
|
-- Table structure for sys_role_menu
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@@ -27,6 +24,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 101);
|
|||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 102);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 102);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 103);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 103);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 108);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 108);
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 109);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 115);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 115);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 116);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 116);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 117);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 117);
|
||||||
@@ -62,6 +60,10 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1050);
|
|||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1051);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1051);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1053);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1053);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1055);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1055);
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1057);
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1058);
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1059);
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1060);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2010);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2010);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2011);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2011);
|
||||||
@@ -270,5 +272,3 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10019);
|
|||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10020);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10020);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10021);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10021);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10022);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10022);
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ CREATE TABLE `sys_user` (
|
|||||||
`tenant_id` bigint(20) NULL DEFAULT NULL COMMENT 'Tenant ID',
|
`tenant_id` bigint(20) NULL DEFAULT NULL COMMENT 'Tenant ID',
|
||||||
`user_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户账号',
|
`user_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户账号',
|
||||||
`nick_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称',
|
`nick_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称',
|
||||||
`user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'sys' COMMENT '用户类型(sys系统用户)',
|
`user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'System' COMMENT '用户类型(System系统用户)',
|
||||||
|
`user_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '#' COMMENT '用户来源UID(#系统)',
|
||||||
`email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱',
|
`email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱',
|
||||||
`phonenumber` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码',
|
`phonenumber` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码',
|
||||||
`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '用户性别(0未知 1男 2女)',
|
`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '用户性别(0未知 1男 2女)',
|
||||||
@@ -51,10 +52,10 @@ CREATE TABLE `sys_user` (
|
|||||||
|
|
||||||
LOCK TABLES `sys_user` WRITE;
|
LOCK TABLES `sys_user` WRITE;
|
||||||
/*!40000 ALTER TABLE `sys_user` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `sys_user` DISABLE KEYS */;
|
||||||
INSERT INTO `sys_user` VALUES (1, 100, null, 'supervisor', 'supervisor', 'sys', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, '');
|
INSERT INTO `sys_user` VALUES (1, 100, null, 'supervisor', 'supervisor', 'System', '#', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, '');
|
||||||
INSERT INTO `sys_user` VALUES (2, 100, null, 'admin', 'admin', 'sys', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, '');
|
INSERT INTO `sys_user` VALUES (2, 100, null, 'admin', 'admin', 'System', '#', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, '');
|
||||||
INSERT INTO `sys_user` VALUES (3, 100, null, 'manager', 'manager', 'sys', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, '');
|
INSERT INTO `sys_user` VALUES (3, 100, null, 'manager', 'manager', 'System', '#', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, '');
|
||||||
INSERT INTO `sys_user` VALUES (4, 100, null, 'monitor', 'monitor', 'sys', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, '');
|
INSERT INTO `sys_user` VALUES (4, 100, null, 'monitor', 'monitor', 'System', '#', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', '1', '0', '127.0.0.1', 0, 'system', 0, '', 0, '');
|
||||||
|
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
|||||||
@@ -189,6 +189,10 @@ REPLACE INTO `sys_dict_data` VALUES (161, 22, 'dictData.trace_interfaces.22', 'N
|
|||||||
REPLACE INTO `sys_dict_data` VALUES (162, 40, 'dictData.trace_interfaces.40', 'N40', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (162, 40, 'dictData.trace_interfaces.40', 'N40', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (163, 14, 'dictData.trace_interfaces.14', 'N14', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (163, 14, 'dictData.trace_interfaces.14', 'N14', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (164, 5, 'dictData.trace_interfaces.5', 'N5', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (164, 5, 'dictData.trace_interfaces.5', 'N5', 'trace_interfaces', '', '', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (165, 1, 'dictData.sys_user_type.system', 'System', 'sys_user_type', '', 'default', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (166, 2, 'dictData.sys_user_type.ldap', 'LDAP', 'sys_user_type', '', 'lime', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (167, 3, 'dictData.sys_user_type.smtp', 'SMTP', 'sys_user_type', '', 'magenta', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (168, 4, 'dictData.sys_user_type.oauth2', 'OAuth2', 'sys_user_type', '', 'gold', '1', 'supervisor', 1712720201349, '', 0, '');
|
||||||
|
|
||||||
|
|
||||||
-- 指定记录条件更新
|
-- 指定记录条件更新
|
||||||
|
|||||||
@@ -754,6 +754,14 @@ REPLACE INTO `sys_dict_data` VALUES (2236, 2236, 'job.backup_export_cdr', '备
|
|||||||
REPLACE INTO `sys_dict_data` VALUES (2237, 2237, 'job.backup_export_cdr_remark', 'dataType: 类型支持 ims/smf/sgwc/smsc\nfileType: 文件类型 csv/xlsx\nhour: 数据时间从任务执行时间前的小时数', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (2237, 2237, 'job.backup_export_cdr_remark', 'dataType: 类型支持 ims/smf/sgwc/smsc\nfileType: 文件类型 csv/xlsx\nhour: 数据时间从任务执行时间前的小时数', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (2238, 2238, 'dictData.trace_interfaces.14', 'N14', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (2238, 2238, 'dictData.trace_interfaces.14', 'N14', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (2239, 2239, 'dictData.trace_interfaces.5', 'N5', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (2239, 2239, 'dictData.trace_interfaces.5', 'N5', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2240, 2240, "dictType.sys_user_type", "用户类型", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2241, 2241, "dictData.sys_user_type.system", "系统", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2242, 2242, "dictData.sys_user_type.ldap", "LDAP", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2243, 2243, "dictData.sys_user_type.smtp", "SMTP", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2244, 2244, "dictData.sys_user_type.oauth2", "OAuth2", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2245, 2245, "user.export.userType", "用户类型", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2246, 2246, "menu.system.loginSource", "第三方登录认证", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (2247, 2247, "log.operate.title.sysLoginSource", "认证源", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
|
||||||
-- multi-tenancy
|
-- multi-tenancy
|
||||||
REPLACE INTO `sys_dict_data` VALUES (11000, 11000, 'menu.security.tenant', '租户管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
|
REPLACE INTO `sys_dict_data` VALUES (11000, 11000, 'menu.security.tenant', '租户管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
|
|||||||
@@ -755,6 +755,14 @@ REPLACE INTO `sys_dict_data` VALUES (4236, 4236, 'job.backup_export_cdr', 'Backu
|
|||||||
REPLACE INTO `sys_dict_data` VALUES (4237, 4237, 'job.backup_export_cdr_remark', 'Backup-Periodic export of dataType: type support ims/smf/sgwc/smsc\nfileType: file type csv/xlsx\nhour: data time from the hour before the task execution time', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (4237, 4237, 'job.backup_export_cdr_remark', 'Backup-Periodic export of dataType: type support ims/smf/sgwc/smsc\nfileType: file type csv/xlsx\nhour: data time from the hour before the task execution time', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (4238, 4238, 'dictData.trace_interfaces.14', 'N14', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (4238, 4238, 'dictData.trace_interfaces.14', 'N14', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
REPLACE INTO `sys_dict_data` VALUES (4239, 4239, 'dictData.trace_interfaces.5', 'N5', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (4239, 4239, 'dictData.trace_interfaces.5', 'N5', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4240, 4240, "dictType.sys_user_type", "User Type", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4241, 4241, "dictData.sys_user_type.system", "System", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4242, 4242, "dictData.sys_user_type.ldap", "LDAP", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4243, 4243, "dictData.sys_user_type.smtp", "SMTP", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4244, 4244, "dictData.sys_user_type.oauth2", "OAuth2", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4245, 4245, "user.export.userType", "User Type", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4246, 4246, "menu.system.loginSource", "Third Party Login Source", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
REPLACE INTO `sys_dict_data` VALUES (4247, 4247, "log.operate.title.sysLoginSource", "Login Source", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, '');
|
||||||
|
|
||||||
-- 多租户
|
-- 多租户
|
||||||
REPLACE INTO `sys_dict_data` VALUES (14000, 14000, 'menu.security.tenant', 'Tenant Management', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
REPLACE INTO `sys_dict_data` VALUES (14000, 14000, 'menu.security.tenant', 'Tenant Management', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, '');
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ REPLACE INTO `sys_dict_type` VALUES (5, 'dictType.sys_job_group', 'sys_job_group
|
|||||||
REPLACE INTO `sys_dict_type` VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_yes_no_remark');
|
REPLACE INTO `sys_dict_type` VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_yes_no_remark');
|
||||||
REPLACE INTO `sys_dict_type` VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_oper_type_remark');
|
REPLACE INTO `sys_dict_type` VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_oper_type_remark');
|
||||||
REPLACE INTO `sys_dict_type` VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_common_status_remark');
|
REPLACE INTO `sys_dict_type` VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.sys_common_status_remark');
|
||||||
|
REPLACE INTO `sys_dict_type` VALUES (11, 'dictType.sys_user_type', 'sys_user_type', '1', 'supervisor', 1699350000000, NULL, 0, '');
|
||||||
REPLACE INTO `sys_dict_type` VALUES (100, 'dictType.trace_type', 'trace_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.trace_type_remark');
|
REPLACE INTO `sys_dict_type` VALUES (100, 'dictType.trace_type', 'trace_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.trace_type_remark');
|
||||||
-- REPLACE INTO `sys_dict_type` VALUES (101, 'dictType.operation_log_type', 'operation_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.operation_log_type_remark');
|
-- REPLACE INTO `sys_dict_type` VALUES (101, 'dictType.operation_log_type', 'operation_log_type', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.operation_log_type_remark');
|
||||||
REPLACE INTO `sys_dict_type` VALUES (102, 'dictType.alarm_status', 'alarm_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.alarm_status_remark');
|
REPLACE INTO `sys_dict_type` VALUES (102, 'dictType.alarm_status', 'alarm_status', '1', 'supervisor', 1699350000000, NULL, 0, 'dictType.alarm_status_remark');
|
||||||
|
|||||||
23
database/upgrade/upg_sys_login_source.sql
Normal file
23
database/upgrade/upg_sys_login_source.sql
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
--
|
||||||
|
-- Table structure for table `sys_login_source`
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `sys_login_source` (
|
||||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||||
|
`uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UID 16位长度字符串',
|
||||||
|
`type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证类型 LDAP SMTP OAuth2',
|
||||||
|
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '认证名称',
|
||||||
|
`icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '图标',
|
||||||
|
`active_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '激活标记(0未激活 1激活)',
|
||||||
|
`sync_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '同步标记(0未同步 1同步)',
|
||||||
|
`config` text COLLATE utf8mb4_general_ci COMMENT '认证配置',
|
||||||
|
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者',
|
||||||
|
`create_time` bigint NULL DEFAULT 0 COMMENT '创建时间',
|
||||||
|
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
|
||||||
|
`update_time` bigint NULL DEFAULT 0 COMMENT '更新时间',
|
||||||
|
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
KEY `idx_ls_type_name` (`type`,`name`) USING BTREE COMMENT '认证类型_认证名称'
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统_认证源表';
|
||||||
|
|
||||||
|
-- Dump completed on 2025-08-05 16:20:56
|
||||||
@@ -49,6 +49,7 @@ REPLACE INTO `sys_menu` VALUES (105, 'menu.security.post', 2113, 6, 'post', 'sys
|
|||||||
REPLACE INTO `sys_menu` VALUES (106, 'menu.system.dictType', 1, 7, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', 'supervisor', 1700000000000, NULL, 0, 'menu.system.dictTypeRemark');
|
REPLACE INTO `sys_menu` VALUES (106, 'menu.system.dictType', 1, 7, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', 'supervisor', 1700000000000, NULL, 0, 'menu.system.dictTypeRemark');
|
||||||
REPLACE INTO `sys_menu` VALUES (107, 'menu.system.dictData', 1, 8, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', 'supervisor', 1700000000000, NULL, 0, 'menu.system.dictDataRemark');
|
REPLACE INTO `sys_menu` VALUES (107, 'menu.system.dictData', 1, 8, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', 'supervisor', 1700000000000, NULL, 0, 'menu.system.dictDataRemark');
|
||||||
REPLACE INTO `sys_menu` VALUES (108, 'menu.system.paramSet', 1, 9, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', 'supervisor', 1700000000000, NULL, 0, 'menu.system.paramSetRemark');
|
REPLACE INTO `sys_menu` VALUES (108, 'menu.system.paramSet', 1, 9, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', 'supervisor', 1700000000000, NULL, 0, 'menu.system.paramSetRemark');
|
||||||
|
REPLACE INTO `sys_menu` VALUES (109, 'menu.system.loginSource', 2113, 12, 'login-source', 'system/login-source/index', '1', '1', 'M', '1', '1', 'system:loginSource:list', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, '');
|
||||||
REPLACE INTO `sys_menu` VALUES (111, 'menu.system.systemLog', 1, 11, 'log', NULL, '1', '1', 'D', '0', '0', NULL, '#', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemLogRemark');
|
REPLACE INTO `sys_menu` VALUES (111, 'menu.system.systemLog', 1, 11, 'log', NULL, '1', '1', 'D', '0', '0', NULL, '#', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemLogRemark');
|
||||||
REPLACE INTO `sys_menu` VALUES (112, 'menu.system.systemInfo', 1, 5, 'system-info', 'monitor/system/info', '1', '1', 'M', '1', '1', 'monitor:system:info', 'icon-fuzhidaima', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemInfoRemark');
|
REPLACE INTO `sys_menu` VALUES (112, 'menu.system.systemInfo', 1, 5, 'system-info', 'monitor/system/info', '1', '1', 'M', '1', '1', 'monitor:system:info', 'icon-fuzhidaima', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemInfoRemark');
|
||||||
REPLACE INTO `sys_menu` VALUES (113, 'menu.system.cacheInfo', 1, 8, 'cache-info', 'monitor/cache/info', '1', '1', 'M', '1', '1', 'monitor:cache:info', 'icon-gongnengjieshao', 'supervisor', 1700000000000, NULL, 0, 'menu.system.cacheInfoRemark');
|
REPLACE INTO `sys_menu` VALUES (113, 'menu.system.cacheInfo', 1, 8, 'cache-info', 'monitor/cache/info', '1', '1', 'M', '1', '1', 'monitor:cache:info', 'icon-gongnengjieshao', 'supervisor', 1700000000000, NULL, 0, 'menu.system.cacheInfoRemark');
|
||||||
@@ -111,6 +112,10 @@ REPLACE INTO `sys_menu` VALUES (1053, 'menu.common.edit', 116, 3, '#', NULL, '1'
|
|||||||
REPLACE INTO `sys_menu` VALUES (1054, 'menu.common.delete', 116, 4, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
REPLACE INTO `sys_menu` VALUES (1054, 'menu.common.delete', 116, 4, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
REPLACE INTO `sys_menu` VALUES (1055, 'menu.common.edit', 116, 5, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
REPLACE INTO `sys_menu` VALUES (1055, 'menu.common.edit', 116, 5, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
REPLACE INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:export', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
REPLACE INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', NULL, '1', '1', 'B', '1', '1', 'monitor:job:export', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
|
REPLACE INTO `sys_menu` VALUES (1057, 'menu.common.query', 109, 1, NULL, NULL, '1', '1', 'B', '1', '1', 'system:loginSource:query', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
|
REPLACE INTO `sys_menu` VALUES (1058, 'menu.common.add', 109, 2, NULL, NULL, '1', '1', 'B', '1', '1', 'system:loginSource:add', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
|
REPLACE INTO `sys_menu` VALUES (1059, 'menu.common.edit', 109, 3, NULL, NULL, '1', '1', 'B', '1', '1', 'system:loginSource:edit', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
|
REPLACE INTO `sys_menu` VALUES (1060, 'menu.common.delete', 109, 4, NULL, NULL, '1', '1', 'B', '1', '1', 'system:loginSource:remove', '#', 'supervisor', 1700000000000, NULL, 0, NULL);
|
||||||
REPLACE INTO `sys_menu` VALUES (2009, 'menu.ueUser.authUDM', 5, 1, 'auth', 'neUser/auth/index', '1', '1', 'M', '1', '1', 'neUser:auth:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.authUDMRemark');
|
REPLACE INTO `sys_menu` VALUES (2009, 'menu.ueUser.authUDM', 5, 1, 'auth', 'neUser/auth/index', '1', '1', 'M', '1', '1', 'neUser:auth:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.authUDMRemark');
|
||||||
REPLACE INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 5, 2, 'sub', 'neUser/sub/index', '1', '1', 'M', '1', '1', 'neUser:sub:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.subUDMRemark');
|
REPLACE INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 5, 2, 'sub', 'neUser/sub/index', '1', '1', 'M', '1', '1', 'neUser:sub:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.subUDMRemark');
|
||||||
REPLACE INTO `sys_menu` VALUES (2011, 'menu.ueUser.voipUDM', 5, 3, 'voip', 'neUser/voip/index', '1', '1', 'M', '1', '1', 'neUser:voip:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.voipUDMRemark');
|
REPLACE INTO `sys_menu` VALUES (2011, 'menu.ueUser.voipUDM', 5, 3, 'voip', 'neUser/voip/index', '1', '1', 'M', '1', '1', 'neUser:voip:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.voipUDMRemark');
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
SET NAMES utf8mb4;
|
|
||||||
SET FOREIGN_KEY_CHECKS = 0;
|
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for sys_role_menu
|
-- Table structure for sys_role_menu
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@@ -11,6 +8,7 @@ CREATE TABLE IF NOT EXISTS `sys_role_menu` (
|
|||||||
PRIMARY KEY (`role_id`, `menu_id`) USING BTREE
|
PRIMARY KEY (`role_id`, `menu_id`) USING BTREE
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = Dynamic;
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
DELETE FROM `sys_role_menu` WHERE `role_id` IN (2,3,4,5);
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of sys_role_menu
|
-- Records of sys_role_menu
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@@ -28,6 +26,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 101);
|
|||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 102);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 102);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 103);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 103);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 108);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 108);
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 109);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 115);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 115);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 116);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 116);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 117);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 117);
|
||||||
@@ -63,6 +62,10 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1050);
|
|||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1051);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1051);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1053);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1053);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1055);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1055);
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1057);
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1058);
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1059);
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1060);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2010);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2010);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2011);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2011);
|
||||||
@@ -271,5 +274,3 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10019);
|
|||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10020);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10020);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10021);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10021);
|
||||||
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10022);
|
INSERT IGNORE INTO `sys_role_menu` VALUES (100, 10022);
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ CREATE TABLE IF NOT EXISTS `sys_user` (
|
|||||||
`dept_id` bigint DEFAULT '0' COMMENT '部门ID',
|
`dept_id` bigint DEFAULT '0' COMMENT '部门ID',
|
||||||
`user_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户账号',
|
`user_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户账号',
|
||||||
`nick_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称',
|
`nick_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称',
|
||||||
`user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'sys' COMMENT '用户类型(sys系统用户)',
|
`user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'System' COMMENT '用户类型(System系统用户)',
|
||||||
|
`user_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '#' COMMENT '用户来源UID (系统#)',
|
||||||
`email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱',
|
`email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱',
|
||||||
`phonenumber` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码',
|
`phonenumber` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码',
|
||||||
`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '用户性别(0未知 1男 2女)',
|
`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '用户性别(0未知 1男 2女)',
|
||||||
@@ -25,5 +26,8 @@ CREATE TABLE IF NOT EXISTS `sys_user` (
|
|||||||
|
|
||||||
-- multi-tenancy
|
-- multi-tenancy
|
||||||
ALTER TABLE `sys_user` ADD COLUMN IF NOT EXISTS `tenant_id` bigint(20) NULL DEFAULT NULL DEFAULT NULL COMMENT 'Tenant ID' AFTER `dept_id`;
|
ALTER TABLE `sys_user` ADD COLUMN IF NOT EXISTS `tenant_id` bigint(20) NULL DEFAULT NULL DEFAULT NULL COMMENT 'Tenant ID' AFTER `dept_id`;
|
||||||
|
ALTER TABLE `sys_user` ADD COLUMN IF NOT EXISTS `user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'System' COMMENT '用户类型(System系统用户)' AFTER `password`;
|
||||||
|
ALTER TABLE `sys_user` ADD COLUMN IF NOT EXISTS `user_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '#' COMMENT '用户来源UID (系统#)' AFTER `user_type`;
|
||||||
|
UPDATE `sys_user` SET `status` = '1', `user_type` = 'System', `user_source` = '#' WHERE `user_id` in (1,2,3,4);
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS=1;
|
SET FOREIGN_KEY_CHECKS=1;
|
||||||
32
go.mod
32
go.mod
@@ -1,13 +1,14 @@
|
|||||||
module be.ems
|
module be.ems
|
||||||
|
|
||||||
go 1.22.0
|
go 1.24
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/dlclark/regexp2 v1.11.4
|
github.com/dlclark/regexp2 v1.11.4
|
||||||
github.com/gin-gonic/gin v1.10.0
|
github.com/gin-gonic/gin v1.10.1
|
||||||
|
github.com/go-ldap/ldap/v3 v3.4.11
|
||||||
github.com/go-resty/resty/v2 v2.14.0
|
github.com/go-resty/resty/v2 v2.14.0
|
||||||
github.com/go-sql-driver/mysql v1.8.1
|
github.com/go-sql-driver/mysql v1.8.1
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1
|
github.com/golang-jwt/jwt/v5 v5.3.0
|
||||||
github.com/gopacket/gopacket v1.2.0
|
github.com/gopacket/gopacket v1.2.0
|
||||||
github.com/gorilla/mux v1.8.1
|
github.com/gorilla/mux v1.8.1
|
||||||
github.com/gorilla/websocket v1.5.3
|
github.com/gorilla/websocket v1.5.3
|
||||||
@@ -19,9 +20,9 @@ require (
|
|||||||
github.com/mojocn/base64Captcha v1.3.6
|
github.com/mojocn/base64Captcha v1.3.6
|
||||||
github.com/mssola/useragent v1.0.0
|
github.com/mssola/useragent v1.0.0
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible
|
github.com/patrickmn/go-cache v2.1.0+incompatible
|
||||||
github.com/pkg/sftp v1.13.6
|
github.com/pkg/sftp v1.13.9
|
||||||
github.com/prometheus-community/pro-bing v0.5.0
|
github.com/prometheus-community/pro-bing v0.7.0
|
||||||
github.com/redis/go-redis/v9 v9.7.0
|
github.com/redis/go-redis/v9 v9.12.0
|
||||||
github.com/robfig/cron/v3 v3.0.1
|
github.com/robfig/cron/v3 v3.0.1
|
||||||
github.com/shirou/gopsutil/v4 v4.24.12
|
github.com/shirou/gopsutil/v4 v4.24.12
|
||||||
github.com/slayercat/GoSNMPServer v0.5.2
|
github.com/slayercat/GoSNMPServer v0.5.2
|
||||||
@@ -30,11 +31,13 @@ require (
|
|||||||
github.com/swaggo/files v1.0.1
|
github.com/swaggo/files v1.0.1
|
||||||
github.com/swaggo/gin-swagger v1.6.0
|
github.com/swaggo/gin-swagger v1.6.0
|
||||||
github.com/swaggo/swag v1.16.4
|
github.com/swaggo/swag v1.16.4
|
||||||
|
github.com/wneessen/go-mail v0.6.2
|
||||||
github.com/xuri/excelize/v2 v2.9.0
|
github.com/xuri/excelize/v2 v2.9.0
|
||||||
github.com/xuri/xgen v0.0.0-20240722131518-d0691b701898
|
github.com/xuri/xgen v0.0.0-20240722131518-d0691b701898
|
||||||
golang.org/x/crypto v0.31.0
|
golang.org/x/crypto v0.36.0
|
||||||
golang.org/x/term v0.28.0
|
golang.org/x/oauth2 v0.30.0
|
||||||
golang.org/x/text v0.21.0
|
golang.org/x/term v0.30.0
|
||||||
|
golang.org/x/text v0.23.0
|
||||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
gorm.io/driver/mysql v1.5.7
|
gorm.io/driver/mysql v1.5.7
|
||||||
@@ -42,10 +45,9 @@ require (
|
|||||||
xorm.io/xorm v1.3.9
|
xorm.io/xorm v1.3.9
|
||||||
)
|
)
|
||||||
|
|
||||||
require golang.org/x/net v0.33.0 // indirect
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
filippo.io/edwards25519 v1.1.0 // indirect
|
filippo.io/edwards25519 v1.1.0 // indirect
|
||||||
|
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
|
||||||
github.com/KyleBanks/depth v1.2.1 // indirect
|
github.com/KyleBanks/depth v1.2.1 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect; indirect // indirect
|
github.com/beorn7/perks v1.0.1 // indirect; indirect // indirect
|
||||||
github.com/bytedance/sonic v1.12.1 // indirect; indirect // indirect
|
github.com/bytedance/sonic v1.12.1 // indirect; indirect // indirect
|
||||||
@@ -60,6 +62,7 @@ require (
|
|||||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||||
github.com/gabriel-vasile/mimetype v1.4.5 // indirect
|
github.com/gabriel-vasile/mimetype v1.4.5 // indirect
|
||||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||||
|
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect
|
||||||
github.com/go-forks/fsnotify v1.4.7 // indirect
|
github.com/go-forks/fsnotify v1.4.7 // indirect
|
||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
||||||
@@ -83,7 +86,7 @@ require (
|
|||||||
github.com/klauspost/compress v1.17.9 // indirect; indirect // indirect
|
github.com/klauspost/compress v1.17.9 // indirect; indirect // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.8 // indirect; indirect // indirect
|
github.com/klauspost/cpuid/v2 v2.2.8 // indirect; indirect // indirect
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 // indirect
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1 // indirect
|
||||||
github.com/kr/fs v0.1.0 // indirect; indirect // indirect
|
github.com/kr/fs v0.1.0 // indirect
|
||||||
github.com/leodido/go-urn v1.4.0 // indirect; indirect // indirect
|
github.com/leodido/go-urn v1.4.0 // indirect; indirect // indirect
|
||||||
github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 // indirect
|
github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 // indirect
|
||||||
github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 // indirect
|
github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 // indirect
|
||||||
@@ -131,8 +134,9 @@ require (
|
|||||||
golang.org/x/arch v0.9.0 // indirect
|
golang.org/x/arch v0.9.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect
|
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect
|
||||||
golang.org/x/image v0.19.0 // indirect
|
golang.org/x/image v0.19.0 // indirect
|
||||||
golang.org/x/sync v0.10.0 // indirect
|
golang.org/x/net v0.38.0 // indirect
|
||||||
golang.org/x/sys v0.29.0 // indirect
|
golang.org/x/sync v0.13.0 // indirect
|
||||||
|
golang.org/x/sys v0.31.0 // indirect
|
||||||
golang.org/x/tools v0.28.0 // indirect
|
golang.org/x/tools v0.28.0 // indirect
|
||||||
golang.org/x/tools/cmd/guru v0.1.1-deprecated // indirect
|
golang.org/x/tools/cmd/guru v0.1.1-deprecated // indirect
|
||||||
google.golang.org/protobuf v1.34.2 // indirect
|
google.golang.org/protobuf v1.34.2 // indirect
|
||||||
|
|||||||
78
go.sum
78
go.sum
@@ -2,9 +2,13 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
|||||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||||
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
|
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
|
||||||
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
|
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
|
||||||
|
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
|
||||||
|
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
|
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
|
||||||
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
|
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
|
||||||
|
github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7VVbI0o4wBRNQIgn917usHWOd6VAffYI=
|
||||||
|
github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
|
||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
||||||
@@ -51,10 +55,14 @@ github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d
|
|||||||
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
|
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
|
||||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||||
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
|
github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ=
|
||||||
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
||||||
|
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo=
|
||||||
|
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
|
||||||
github.com/go-forks/fsnotify v1.4.7 h1:lyiU2Wqd4fNGCQDn9dZ4UxSiSFgeU1rM6yIfahk8haY=
|
github.com/go-forks/fsnotify v1.4.7 h1:lyiU2Wqd4fNGCQDn9dZ4UxSiSFgeU1rM6yIfahk8haY=
|
||||||
github.com/go-forks/fsnotify v1.4.7/go.mod h1:AU8mot+GznW5+B4jRJHxKg/2EeO+jMORGRkKSxs0biw=
|
github.com/go-forks/fsnotify v1.4.7/go.mod h1:AU8mot+GznW5+B4jRJHxKg/2EeO+jMORGRkKSxs0biw=
|
||||||
|
github.com/go-ldap/ldap/v3 v3.4.11 h1:4k0Yxweg+a3OyBLjdYn5OKglv18JNvfDykSoI8bW0gU=
|
||||||
|
github.com/go-ldap/ldap/v3 v3.4.11/go.mod h1:bY7t0FLK8OAVpp/vV6sSlpz3EQDGcQwc8pF0ujLgKvM=
|
||||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
||||||
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
||||||
@@ -82,8 +90,8 @@ github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqw
|
|||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||||
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
|
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
|
||||||
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
|
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||||
@@ -117,9 +125,23 @@ github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
|
|||||||
github.com/gosnmp/gosnmp v1.36.2-0.20231009064202-d306ed5aa998/go.mod h1:O938QjIS4vpSag1UTcnnBq9MfNmimuOGtvQsT1NbErc=
|
github.com/gosnmp/gosnmp v1.36.2-0.20231009064202-d306ed5aa998/go.mod h1:O938QjIS4vpSag1UTcnnBq9MfNmimuOGtvQsT1NbErc=
|
||||||
github.com/gosnmp/gosnmp v1.38.0 h1:I5ZOMR8kb0DXAFg/88ACurnuwGwYkXWq3eLpJPHMEYc=
|
github.com/gosnmp/gosnmp v1.38.0 h1:I5ZOMR8kb0DXAFg/88ACurnuwGwYkXWq3eLpJPHMEYc=
|
||||||
github.com/gosnmp/gosnmp v1.38.0/go.mod h1:FE+PEZvKrFz9afP9ii1W3cprXuVZ17ypCcyyfYuu5LY=
|
github.com/gosnmp/gosnmp v1.38.0/go.mod h1:FE+PEZvKrFz9afP9ii1W3cprXuVZ17ypCcyyfYuu5LY=
|
||||||
|
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
|
||||||
|
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
|
github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=
|
||||||
|
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
|
||||||
|
github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=
|
||||||
|
github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
|
||||||
|
github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg=
|
||||||
|
github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo=
|
||||||
|
github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o=
|
||||||
|
github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
|
||||||
|
github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8=
|
||||||
|
github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs=
|
||||||
|
github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=
|
||||||
|
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
|
||||||
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4=
|
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4=
|
||||||
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag=
|
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag=
|
||||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||||
@@ -213,16 +235,16 @@ github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6
|
|||||||
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo=
|
github.com/pkg/sftp v1.13.9 h1:4NGkvGudBL7GteO3m6qnaQ4pC0Kvf0onSVc9gR3EWBw=
|
||||||
github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk=
|
github.com/pkg/sftp v1.13.9/go.mod h1:OBN7bVXdstkFFN/gdnHPUb5TE8eb8G1Rp9wCItqjkkA=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||||
github.com/prometheus-community/pro-bing v0.5.0 h1:Fq+4BUXKIvsPtXUY8K+04ud9dkAuFozqGmRAyNUpffY=
|
github.com/prometheus-community/pro-bing v0.7.0 h1:KFYFbxC2f2Fp6c+TyxbCOEarf7rbnzr9Gw8eIb0RfZA=
|
||||||
github.com/prometheus-community/pro-bing v0.5.0/go.mod h1:1joR9oXdMEAcAJJvhs+8vNDvTg5thfAZcRFhcUozG2g=
|
github.com/prometheus-community/pro-bing v0.7.0/go.mod h1:Moob9dvlY50Bfq6i88xIwfyw7xLFHH69LUgx9n5zqCE=
|
||||||
github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI=
|
github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI=
|
||||||
github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
||||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||||
@@ -232,8 +254,8 @@ github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65
|
|||||||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||||
github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
|
github.com/redis/go-redis/v9 v9.12.0 h1:XlVPGlflh4nxfhsNXPA8Qp6EmEfTo0rp8oaBzPipXnU=
|
||||||
github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
|
github.com/redis/go-redis/v9 v9.12.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
|
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
||||||
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
|
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
|
||||||
@@ -316,6 +338,8 @@ github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJ
|
|||||||
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
|
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
|
||||||
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg=
|
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg=
|
||||||
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
||||||
|
github.com/wneessen/go-mail v0.6.2 h1:c6V7c8D2mz868z9WJ+8zDKtUyLfZ1++uAZmo2GRFji8=
|
||||||
|
github.com/wneessen/go-mail v0.6.2/go.mod h1:L/PYjPK3/2ZlNb2/FjEBIn9n1rUWjW+Toy531oVmeb4=
|
||||||
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY=
|
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY=
|
||||||
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
|
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
|
||||||
github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQE=
|
github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQE=
|
||||||
@@ -338,13 +362,14 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
|
|||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
|
|
||||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
||||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||||
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
|
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
|
||||||
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
|
||||||
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
||||||
|
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
|
||||||
|
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
|
||||||
|
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
|
||||||
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI=
|
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI=
|
||||||
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
||||||
golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk=
|
golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk=
|
||||||
@@ -369,7 +394,6 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
|
|||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
|
||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||||
@@ -377,8 +401,10 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
|||||||
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
||||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||||
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
|
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
|
||||||
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
|
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
|
||||||
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||||
|
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
|
||||||
|
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -389,8 +415,10 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|||||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||||
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
|
||||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
|
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
|
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
|
||||||
|
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@@ -420,32 +448,36 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|||||||
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
|
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
|
||||||
|
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
|
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||||
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||||
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
||||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||||
golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
|
golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
|
||||||
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
|
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
|
||||||
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
|
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
|
||||||
|
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
|
||||||
|
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
|
||||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
||||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
|
||||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||||
|
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
|
||||||
|
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
|
||||||
|
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
|
||||||
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
|
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
|
||||||
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
|||||||
@@ -46,25 +46,31 @@ func LogOperate(options collectlogs.Options) func(http.Handler) http.Handler {
|
|||||||
lastDotIndex := strings.LastIndex(funcName, "/")
|
lastDotIndex := strings.LastIndex(funcName, "/")
|
||||||
funcName = funcName[lastDotIndex+1:]
|
funcName = funcName[lastDotIndex+1:]
|
||||||
|
|
||||||
// 用户名
|
// 获取登录用户信息
|
||||||
username := ctx.LoginUserToUserName(r)
|
loginUser, err := ctx.LoginUser(r)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "unauthorized", http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
// 解析ip地址
|
// 解析ip地址
|
||||||
ip := strings.Split(r.RemoteAddr, ":")[0]
|
ip := strings.Split(r.RemoteAddr, ":")[0]
|
||||||
ipaddr := ip2region.ClientIP(ip)
|
ipaddr := ip2region.ClientIP(ip)
|
||||||
location := ip2region.RealAddressByIp(ipaddr)
|
location := ip2region.RealAddressByIp(ipaddr)
|
||||||
|
|
||||||
// 操作日志记录
|
// 操作日志记录
|
||||||
operLog := model.SysLogOperate{
|
operLog := model.SysLogOperate{
|
||||||
Title: options.Title,
|
Title: options.Title,
|
||||||
BusinessType: options.BusinessType,
|
BusinessType: options.BusinessType,
|
||||||
OperatorType: collectlogs.OPERATOR_TYPE_MANAGE,
|
OperatorType: loginUser.User.UserType,
|
||||||
Method: funcName,
|
Method: funcName,
|
||||||
OperURL: r.RequestURI,
|
OperURL: r.RequestURI,
|
||||||
RequestMethod: r.Method,
|
RequestMethod: r.Method,
|
||||||
OperIP: ipaddr,
|
OperIP: ipaddr,
|
||||||
OperLocation: location,
|
OperLocation: location,
|
||||||
OperName: username,
|
OperName: loginUser.User.UserName,
|
||||||
DeptName: "",
|
DeptName: loginUser.User.Dept.DeptName,
|
||||||
|
TenantName: loginUser.User.Tenant.TenantName,
|
||||||
|
TenantID: loginUser.User.Tenant.TenantID,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 是否需要保存request,参数和值
|
// 是否需要保存request,参数和值
|
||||||
@@ -120,8 +126,15 @@ func LogOperate(options collectlogs.Options) func(http.Handler) http.Handler {
|
|||||||
contentDisposition := w.Header().Get("Content-Disposition")
|
contentDisposition := w.Header().Get("Content-Disposition")
|
||||||
contentType := w.Header().Get("Content-Type")
|
contentType := w.Header().Get("Content-Type")
|
||||||
content := contentType + contentDisposition
|
content := contentType + contentDisposition
|
||||||
msg := fmt.Sprintf(`{"status":"%s","size":"%s","content-type":"%s"}`, status, size, content)
|
msgByte, err := json.Marshal(map[string]any{
|
||||||
operLog.OperMsg = msg
|
"status": status,
|
||||||
|
"size": size,
|
||||||
|
"content-type": content,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
operLog.OperMsg = ""
|
||||||
|
}
|
||||||
|
operLog.OperMsg = string(msgByte)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 日志记录时间
|
// 日志记录时间
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ func ImportSQL() {
|
|||||||
processSQLFile(db, sqlPath)
|
processSQLFile(db, sqlPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println("process success")
|
// log.Println("process success")
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,8 +93,36 @@ func processSQLFile(db *gorm.DB, filePath string) {
|
|||||||
if strings.HasSuffix(line, ";") {
|
if strings.HasSuffix(line, ";") {
|
||||||
// 执行 SQL 语句
|
// 执行 SQL 语句
|
||||||
if err := db.Exec(sqlBuilder.String()).Error; err != nil {
|
if err := db.Exec(sqlBuilder.String()).Error; err != nil {
|
||||||
log.Fatalln(err.Error())
|
errorStr := strings.ToLower(err.Error())
|
||||||
return
|
// log.Printf("Exec SQL: %s\n", line)
|
||||||
|
// log.Println(err.Error())
|
||||||
|
if strings.Contains(errorStr, "duplicate column") {
|
||||||
|
// 忽略重复字段错误
|
||||||
|
// Error 1060 (42S21): Duplicate column name 'field_name'
|
||||||
|
// SQL logic error: duplicate column name: title (1)
|
||||||
|
} else if strings.Contains(errorStr, "duplicate key") {
|
||||||
|
// 忽略重复索引错误
|
||||||
|
// Error 1061 (42000): Duplicate key name 'key_name'
|
||||||
|
} else if strings.Contains(errorStr, "duplicate entry") {
|
||||||
|
// 忽略重复记录错误
|
||||||
|
// Error 1062 (23000): Duplicate entry 'value' for key 'key_name'
|
||||||
|
log.Println(err.Error())
|
||||||
|
} else if strings.Contains(errorStr, "unknown column") {
|
||||||
|
// 忽略未知字段错误
|
||||||
|
// Error 1054 (42S22): Unknown column 'field_name' in 'table'
|
||||||
|
} else if strings.Contains(errorStr, "can't drop") {
|
||||||
|
// 忽略删除字段或索引错误
|
||||||
|
// Error 1091 (42000): Can't DROP COLUMN `field_name`; check that it exists
|
||||||
|
// Error 1091 (42000): Can't DROP 'idx_ne_type_id'; check that column/key exists
|
||||||
|
} else if strings.Contains(errorStr, "doesn't match") {
|
||||||
|
// 忽略列数不匹配错误
|
||||||
|
// Error 1136 (21S01): Column count doesn't match value count at row 1
|
||||||
|
log.Println(err.Error())
|
||||||
|
} else {
|
||||||
|
// 其他错误终止程序
|
||||||
|
log.Fatalln(errorStr)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sqlBuilder.Reset()
|
sqlBuilder.Reset()
|
||||||
|
|||||||
@@ -15,8 +15,14 @@ type localeItem struct {
|
|||||||
Code string `json:"code"`
|
Code string `json:"code"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var dataCache map[string][]localeItem = make(map[string][]localeItem)
|
||||||
|
|
||||||
// LoadLocaleData 加载国际化数据
|
// LoadLocaleData 加载国际化数据
|
||||||
func LoadLocaleData(language string) []localeItem {
|
func LoadLocaleData(language string) []localeItem {
|
||||||
|
if data, ok := dataCache[language]; ok {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
dictType := fmt.Sprintf("i18n_%s", language)
|
dictType := fmt.Sprintf("i18n_%s", language)
|
||||||
dictTypeList := systemService.NewSysDictType.DictDataCache(dictType)
|
dictTypeList := systemService.NewSysDictType.DictDataCache(dictType)
|
||||||
localeData := []localeItem{}
|
localeData := []localeItem{}
|
||||||
@@ -27,6 +33,7 @@ func LoadLocaleData(language string) []localeItem {
|
|||||||
Code: v.DictCode,
|
Code: v.DictCode,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
dataCache[language] = localeData
|
||||||
return localeData
|
return localeData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package collectlogs
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -48,22 +47,11 @@ const (
|
|||||||
BUSINESS_TYPE_CLEAN = "8"
|
BUSINESS_TYPE_CLEAN = "8"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
// 操作人类别-其它
|
|
||||||
OPERATOR_TYPE_OTHER = "0"
|
|
||||||
|
|
||||||
// 操作人类别-后台用户
|
|
||||||
OPERATOR_TYPE_MANAGE = "1"
|
|
||||||
|
|
||||||
// 操作人类别-手机端用户
|
|
||||||
OPERATOR_TYPE_MOBILE = "2"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Option 操作日志参数
|
// Option 操作日志参数
|
||||||
type Options struct {
|
type Options struct {
|
||||||
Title string `json:"title"` // 标题
|
Title string `json:"title"` // 标题
|
||||||
BusinessType string `json:"businessType"` // 类型,默认常量 BUSINESS_TYPE_OTHER
|
BusinessType string `json:"businessType"` // 类型,默认常量 BUSINESS_TYPE_OTHER
|
||||||
OperatorType string `json:"operatorType"` // 操作人类别,默认常量 OPERATOR_TYPE_OTHER
|
OperatorType string `json:"operatorType"` // 操作人类别
|
||||||
IsSaveRequestData bool `json:"isSaveRequestData"` // 是否保存请求的参数
|
IsSaveRequestData bool `json:"isSaveRequestData"` // 是否保存请求的参数
|
||||||
IsSaveResponseData bool `json:"isSaveResponseData"` // 是否保存响应的参数
|
IsSaveResponseData bool `json:"isSaveResponseData"` // 是否保存响应的参数
|
||||||
}
|
}
|
||||||
@@ -79,7 +67,6 @@ func OptionNew(title, businessType string) Options {
|
|||||||
return Options{
|
return Options{
|
||||||
Title: title,
|
Title: title,
|
||||||
BusinessType: businessType,
|
BusinessType: businessType,
|
||||||
OperatorType: OPERATOR_TYPE_OTHER,
|
|
||||||
IsSaveRequestData: true,
|
IsSaveRequestData: true,
|
||||||
IsSaveResponseData: true,
|
IsSaveResponseData: true,
|
||||||
}
|
}
|
||||||
@@ -113,7 +100,7 @@ func OperateLog(options Options) gin.HandlerFunc {
|
|||||||
operLog := model.SysLogOperate{
|
operLog := model.SysLogOperate{
|
||||||
Title: options.Title,
|
Title: options.Title,
|
||||||
BusinessType: options.BusinessType,
|
BusinessType: options.BusinessType,
|
||||||
OperatorType: options.OperatorType,
|
OperatorType: loginUser.User.UserType,
|
||||||
Method: funcName,
|
Method: funcName,
|
||||||
OperURL: c.Request.URL.Path,
|
OperURL: c.Request.URL.Path,
|
||||||
RequestMethod: c.Request.Method,
|
RequestMethod: c.Request.Method,
|
||||||
@@ -125,10 +112,6 @@ func OperateLog(options Options) gin.HandlerFunc {
|
|||||||
TenantID: loginUser.User.Tenant.TenantID,
|
TenantID: loginUser.User.Tenant.TenantID,
|
||||||
}
|
}
|
||||||
|
|
||||||
if loginUser.User.UserType == "sys" {
|
|
||||||
operLog.OperatorType = OPERATOR_TYPE_MANAGE
|
|
||||||
}
|
|
||||||
|
|
||||||
// 是否需要保存request,参数和值
|
// 是否需要保存request,参数和值
|
||||||
if options.IsSaveRequestData {
|
if options.IsSaveRequestData {
|
||||||
params := ctx.RequestParamsMap(c)
|
params := ctx.RequestParamsMap(c)
|
||||||
@@ -158,8 +141,15 @@ func OperateLog(options Options) gin.HandlerFunc {
|
|||||||
contentDisposition := c.Writer.Header().Get("Content-Disposition")
|
contentDisposition := c.Writer.Header().Get("Content-Disposition")
|
||||||
contentType := c.Writer.Header().Get("Content-Type")
|
contentType := c.Writer.Header().Get("Content-Type")
|
||||||
content := contentType + contentDisposition
|
content := contentType + contentDisposition
|
||||||
msg := fmt.Sprintf(`{"status":"%d","size":"%d","content-type":"%s"}`, status, c.Writer.Size(), content)
|
msgByte, err := json.Marshal(map[string]any{
|
||||||
operLog.OperMsg = msg
|
"status": status,
|
||||||
|
"size": c.Writer.Size(),
|
||||||
|
"content-type": content,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
operLog.OperMsg = ""
|
||||||
|
}
|
||||||
|
operLog.OperMsg = string(msgByte)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 日志记录时间
|
// 日志记录时间
|
||||||
|
|||||||
@@ -67,6 +67,52 @@ func Setup(router *gin.Engine) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 登录认证源
|
||||||
|
account := controller.NewAccount
|
||||||
|
accountGroup := router.Group("/auth")
|
||||||
|
{
|
||||||
|
accountGroup.GET("/login/source",
|
||||||
|
middleware.RateLimit(middleware.LimitOption{
|
||||||
|
Time: 300,
|
||||||
|
Count: 60,
|
||||||
|
Type: middleware.LIMIT_IP,
|
||||||
|
}),
|
||||||
|
account.LoginSource,
|
||||||
|
)
|
||||||
|
accountGroup.POST("/login/ldap",
|
||||||
|
middleware.RateLimit(middleware.LimitOption{
|
||||||
|
Time: 180,
|
||||||
|
Count: 15,
|
||||||
|
Type: middleware.LIMIT_IP,
|
||||||
|
}),
|
||||||
|
account.LDAP,
|
||||||
|
)
|
||||||
|
accountGroup.POST("/login/smtp",
|
||||||
|
middleware.RateLimit(middleware.LimitOption{
|
||||||
|
Time: 180,
|
||||||
|
Count: 15,
|
||||||
|
Type: middleware.LIMIT_IP,
|
||||||
|
}),
|
||||||
|
account.SMTP,
|
||||||
|
)
|
||||||
|
accountGroup.GET("/login/oauth2/authorize",
|
||||||
|
middleware.RateLimit(middleware.LimitOption{
|
||||||
|
Time: 180,
|
||||||
|
Count: 15,
|
||||||
|
Type: middleware.LIMIT_IP,
|
||||||
|
}),
|
||||||
|
account.OAuth2CodeURL,
|
||||||
|
)
|
||||||
|
accountGroup.POST("/login/oauth2/token",
|
||||||
|
middleware.RateLimit(middleware.LimitOption{
|
||||||
|
Time: 180,
|
||||||
|
Count: 15,
|
||||||
|
Type: middleware.LIMIT_IP,
|
||||||
|
}),
|
||||||
|
account.OAuth2Token,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// 账号注册操作处理
|
// 账号注册操作处理
|
||||||
{
|
{
|
||||||
indexGroup.POST("/register",
|
indexGroup.POST("/register",
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
commonConstants "be.ems/src/framework/constants/common"
|
commonConstants "be.ems/src/framework/constants/common"
|
||||||
tokenConstants "be.ems/src/framework/constants/token"
|
tokenConstants "be.ems/src/framework/constants/token"
|
||||||
"be.ems/src/framework/i18n"
|
"be.ems/src/framework/i18n"
|
||||||
|
"be.ems/src/framework/resp"
|
||||||
"be.ems/src/framework/utils/ctx"
|
"be.ems/src/framework/utils/ctx"
|
||||||
tokenUtils "be.ems/src/framework/utils/token"
|
tokenUtils "be.ems/src/framework/utils/token"
|
||||||
"be.ems/src/framework/vo"
|
"be.ems/src/framework/vo"
|
||||||
@@ -201,3 +202,11 @@ func (s *AccountController) Logout(c *gin.Context) {
|
|||||||
|
|
||||||
c.JSON(200, result.OkMsg(i18n.TKey(language, "app.common.logoutSuccess")))
|
c.JSON(200, result.OkMsg(i18n.TKey(language, "app.common.logoutSuccess")))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoginSource 登录认证源
|
||||||
|
//
|
||||||
|
// GET /auth/login/source
|
||||||
|
func (s AccountController) LoginSource(c *gin.Context) {
|
||||||
|
data := s.accountService.LoginSource()
|
||||||
|
c.JSON(200, resp.OkData(data))
|
||||||
|
}
|
||||||
|
|||||||
67
src/modules/common/controller/account_ldap.go
Normal file
67
src/modules/common/controller/account_ldap.go
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
commonConstants "be.ems/src/framework/constants/common"
|
||||||
|
tokenConstants "be.ems/src/framework/constants/token"
|
||||||
|
"be.ems/src/framework/i18n"
|
||||||
|
"be.ems/src/framework/reqctx"
|
||||||
|
"be.ems/src/framework/resp"
|
||||||
|
tokenUtils "be.ems/src/framework/utils/token"
|
||||||
|
"be.ems/src/framework/vo/result"
|
||||||
|
"be.ems/src/modules/common/model"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LDAP LDAP认证登录
|
||||||
|
//
|
||||||
|
// POST /auth/ldap
|
||||||
|
//
|
||||||
|
// @Tags common/authorization
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Param data body object true "Request Param"
|
||||||
|
// @Success 200 {object} object "Response Results"
|
||||||
|
// @Summary System Login
|
||||||
|
// @Description System Login
|
||||||
|
// @Router /auth/ldap [post]
|
||||||
|
func (s AccountController) LDAP(c *gin.Context) {
|
||||||
|
language := reqctx.AcceptLanguage(c)
|
||||||
|
var body model.LoginSourceBody
|
||||||
|
if err := c.ShouldBindJSON(&body); err != nil {
|
||||||
|
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
|
||||||
|
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 当前请求信息
|
||||||
|
ipaddr, location := reqctx.IPAddrLocation(c)
|
||||||
|
os, browser := reqctx.UaOsBrowser(c)
|
||||||
|
|
||||||
|
// 登录用户信息
|
||||||
|
loginUser, err := s.accountService.ByLDAP(body)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error())))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成令牌,创建系统访问记录
|
||||||
|
tokenStr := tokenUtils.Create(&loginUser, ipaddr, location, os, browser)
|
||||||
|
if tokenStr == "" {
|
||||||
|
c.JSON(200, result.Err(nil))
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
s.accountService.UpdateLoginDateAndIP(&loginUser)
|
||||||
|
// 登录成功
|
||||||
|
s.sysLogLoginService.CreateSysLogLogin(
|
||||||
|
body.Username, commonConstants.STATUS_YES, "app.common.loginSuccess",
|
||||||
|
ipaddr, location, os, browser,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, result.OkData(map[string]any{
|
||||||
|
tokenConstants.RESPONSE_FIELD: tokenStr,
|
||||||
|
}))
|
||||||
|
}
|
||||||
94
src/modules/common/controller/account_oauth2.go
Normal file
94
src/modules/common/controller/account_oauth2.go
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
commonConstants "be.ems/src/framework/constants/common"
|
||||||
|
tokenConstants "be.ems/src/framework/constants/token"
|
||||||
|
"be.ems/src/framework/i18n"
|
||||||
|
"be.ems/src/framework/reqctx"
|
||||||
|
"be.ems/src/framework/resp"
|
||||||
|
tokenUtils "be.ems/src/framework/utils/token"
|
||||||
|
"be.ems/src/framework/vo/result"
|
||||||
|
"be.ems/src/modules/common/model"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// OAuth2CodeURL OAuth2认证跳转登录URL
|
||||||
|
//
|
||||||
|
// GET /auth/login/oauth2/authorize
|
||||||
|
//
|
||||||
|
// @Tags common/authorization
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Param data body object true "Request Param"
|
||||||
|
// @Success 200 {object} object "Response Results"
|
||||||
|
// @Summary System Login
|
||||||
|
// @Description System Login
|
||||||
|
// @Router /auth/login/oauth2/authorize [get]
|
||||||
|
func (s AccountController) OAuth2CodeURL(c *gin.Context) {
|
||||||
|
state := c.Query("state")
|
||||||
|
if state == "" {
|
||||||
|
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: state is empty"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
redirectURL, err := s.accountService.ByOAuth2CodeURL(state)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(200, resp.ErrMsg(err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Redirect(302, redirectURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OAuth2 OAuth2认证登录
|
||||||
|
//
|
||||||
|
// POST /auth/login/oauth2/token
|
||||||
|
//
|
||||||
|
// @Tags common/authorization
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Param data body object true "Request Param"
|
||||||
|
// @Success 200 {object} object "Response Results"
|
||||||
|
// @Summary System Login
|
||||||
|
// @Description System Login
|
||||||
|
// @Router /auth/login/oauth2/token [post]
|
||||||
|
func (s AccountController) OAuth2Token(c *gin.Context) {
|
||||||
|
language := reqctx.AcceptLanguage(c)
|
||||||
|
var body model.LoginSourceOauth2Body
|
||||||
|
if err := c.ShouldBindJSON(&body); err != nil {
|
||||||
|
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
|
||||||
|
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 当前请求信息
|
||||||
|
ipaddr, location := reqctx.IPAddrLocation(c)
|
||||||
|
os, browser := reqctx.UaOsBrowser(c)
|
||||||
|
|
||||||
|
// 登录用户信息
|
||||||
|
loginUser, err := s.accountService.ByOAuth2(body)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error())))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成令牌,创建系统访问记录
|
||||||
|
tokenStr := tokenUtils.Create(&loginUser, ipaddr, location, os, browser)
|
||||||
|
if tokenStr == "" {
|
||||||
|
c.JSON(200, result.Err(nil))
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
s.accountService.UpdateLoginDateAndIP(&loginUser)
|
||||||
|
// 登录成功
|
||||||
|
s.sysLogLoginService.CreateSysLogLogin(
|
||||||
|
body.State, commonConstants.STATUS_YES, "app.common.loginSuccess",
|
||||||
|
ipaddr, location, os, browser,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, result.OkData(map[string]any{
|
||||||
|
tokenConstants.RESPONSE_FIELD: tokenStr,
|
||||||
|
}))
|
||||||
|
}
|
||||||
67
src/modules/common/controller/account_smtp.go
Normal file
67
src/modules/common/controller/account_smtp.go
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
commonConstants "be.ems/src/framework/constants/common"
|
||||||
|
tokenConstants "be.ems/src/framework/constants/token"
|
||||||
|
"be.ems/src/framework/i18n"
|
||||||
|
"be.ems/src/framework/reqctx"
|
||||||
|
"be.ems/src/framework/resp"
|
||||||
|
tokenUtils "be.ems/src/framework/utils/token"
|
||||||
|
"be.ems/src/framework/vo/result"
|
||||||
|
"be.ems/src/modules/common/model"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SMTP SMTP认证登录
|
||||||
|
//
|
||||||
|
// POST /auth/smtp
|
||||||
|
//
|
||||||
|
// @Tags common/authorization
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Param data body object true "Request Param"
|
||||||
|
// @Success 200 {object} object "Response Results"
|
||||||
|
// @Summary System Login
|
||||||
|
// @Description System Login
|
||||||
|
// @Router /auth/smtp [post]
|
||||||
|
func (s AccountController) SMTP(c *gin.Context) {
|
||||||
|
language := reqctx.AcceptLanguage(c)
|
||||||
|
var body model.LoginSourceBody
|
||||||
|
if err := c.ShouldBindJSON(&body); err != nil {
|
||||||
|
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
|
||||||
|
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 当前请求信息
|
||||||
|
ipaddr, location := reqctx.IPAddrLocation(c)
|
||||||
|
os, browser := reqctx.UaOsBrowser(c)
|
||||||
|
|
||||||
|
// 登录用户信息
|
||||||
|
loginUser, err := s.accountService.BySMTP(body)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error())))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成令牌,创建系统访问记录
|
||||||
|
tokenStr := tokenUtils.Create(&loginUser, ipaddr, location, os, browser)
|
||||||
|
if tokenStr == "" {
|
||||||
|
c.JSON(200, result.Err(nil))
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
s.accountService.UpdateLoginDateAndIP(&loginUser)
|
||||||
|
// 登录成功
|
||||||
|
s.sysLogLoginService.CreateSysLogLogin(
|
||||||
|
body.Username, commonConstants.STATUS_YES, "app.common.loginSuccess",
|
||||||
|
ipaddr, location, os, browser,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, result.OkData(map[string]any{
|
||||||
|
tokenConstants.RESPONSE_FIELD: tokenStr,
|
||||||
|
}))
|
||||||
|
}
|
||||||
22
src/modules/common/model/login_source_vo.go
Normal file
22
src/modules/common/model/login_source_vo.go
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
// LoginSourceVo 认证源登录对象
|
||||||
|
type LoginSourceVo struct {
|
||||||
|
UID string `json:"uid"` // UID 认证源UID
|
||||||
|
Name string `json:"name"` // Name 认证源名称
|
||||||
|
Type string `json:"type"` // Type 认证源类型
|
||||||
|
Icon string `json:"icon"` // Icon 认证源图标
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoginSourceBody 认证源用户登录对象
|
||||||
|
type LoginSourceBody struct {
|
||||||
|
Username string `json:"username" binding:"required"` // Username 用户名
|
||||||
|
Password string `json:"password" binding:"required"` // Password 用户密码
|
||||||
|
UID string `json:"uid" binding:"required"` // UID 认证源唯一标识
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoginSourceOauth2Body 认证源OAuth2用户登录对象
|
||||||
|
type LoginSourceOauth2Body struct {
|
||||||
|
Code string `json:"code" binding:"required"` // Code 授权码
|
||||||
|
State string `json:"state" binding:"required"` // State 状态-认证源唯一标识
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"be.ems/src/framework/config"
|
"be.ems/src/framework/config"
|
||||||
|
"be.ems/src/framework/constants"
|
||||||
adminConstants "be.ems/src/framework/constants/admin"
|
adminConstants "be.ems/src/framework/constants/admin"
|
||||||
"be.ems/src/framework/constants/cachekey"
|
"be.ems/src/framework/constants/cachekey"
|
||||||
"be.ems/src/framework/constants/common"
|
"be.ems/src/framework/constants/common"
|
||||||
@@ -12,16 +13,18 @@ import (
|
|||||||
"be.ems/src/framework/utils/crypto"
|
"be.ems/src/framework/utils/crypto"
|
||||||
"be.ems/src/framework/utils/parse"
|
"be.ems/src/framework/utils/parse"
|
||||||
"be.ems/src/framework/vo"
|
"be.ems/src/framework/vo"
|
||||||
"be.ems/src/modules/system/model"
|
"be.ems/src/modules/common/model"
|
||||||
|
systemModel "be.ems/src/modules/system/model"
|
||||||
systemService "be.ems/src/modules/system/service"
|
systemService "be.ems/src/modules/system/service"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 实例化服务层 Account 结构体
|
// 实例化服务层 Account 结构体
|
||||||
var NewAccount = &Account{
|
var NewAccount = &Account{
|
||||||
sysUserService: systemService.NewSysUserImpl,
|
sysUserService: systemService.NewSysUserImpl,
|
||||||
sysConfigService: systemService.NewSysConfigImpl,
|
sysConfigService: systemService.NewSysConfigImpl,
|
||||||
sysRoleService: systemService.NewSysRoleImpl,
|
sysRoleService: systemService.NewSysRoleImpl,
|
||||||
sysMenuService: systemService.NewSysMenuImpl,
|
sysMenuService: systemService.NewSysMenuImpl,
|
||||||
|
sysLogSourceService: systemService.NewSysLoginSource,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 账号身份操作服务 服务层处理
|
// 账号身份操作服务 服务层处理
|
||||||
@@ -33,7 +36,8 @@ type Account struct {
|
|||||||
// 角色服务
|
// 角色服务
|
||||||
sysRoleService systemService.ISysRole
|
sysRoleService systemService.ISysRole
|
||||||
// 菜单服务
|
// 菜单服务
|
||||||
sysMenuService systemService.ISysMenu
|
sysMenuService systemService.ISysMenu
|
||||||
|
sysLogSourceService *systemService.SysLoginSource // 认证源
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidateCaptcha 校验验证码
|
// ValidateCaptcha 校验验证码
|
||||||
@@ -72,7 +76,7 @@ func (s *Account) LoginByUsername(username, password string) (vo.LoginUser, erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查询用户登录账号
|
// 查询用户登录账号
|
||||||
sysUser := s.sysUserService.SelectUserByUserName(username)
|
sysUser := s.sysUserService.FindByUserName(username, "System", "#")
|
||||||
if sysUser.UserName != username {
|
if sysUser.UserName != username {
|
||||||
return loginUser, fmt.Errorf("login.errNameOrPasswd")
|
return loginUser, fmt.Errorf("login.errNameOrPasswd")
|
||||||
}
|
}
|
||||||
@@ -113,7 +117,7 @@ func (s *Account) LoginByUsername(username, password string) (vo.LoginUser, erro
|
|||||||
// UpdateLoginDateAndIP 更新登录时间和IP
|
// UpdateLoginDateAndIP 更新登录时间和IP
|
||||||
func (s *Account) UpdateLoginDateAndIP(loginUser *vo.LoginUser) bool {
|
func (s *Account) UpdateLoginDateAndIP(loginUser *vo.LoginUser) bool {
|
||||||
sysUser := loginUser.User
|
sysUser := loginUser.User
|
||||||
userInfo := model.SysUser{
|
userInfo := systemModel.SysUser{
|
||||||
UserID: sysUser.UserID,
|
UserID: sysUser.UserID,
|
||||||
LoginIP: sysUser.LoginIP,
|
LoginIP: sysUser.LoginIP,
|
||||||
LoginDate: sysUser.LoginDate,
|
LoginDate: sysUser.LoginDate,
|
||||||
@@ -192,3 +196,44 @@ func (s *Account) RouteMenus(userId string, isAdmin bool) []vo.Router {
|
|||||||
}
|
}
|
||||||
return buildMenus
|
return buildMenus
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LoginSource 登录认证源
|
||||||
|
func (s Account) LoginSource() []model.LoginSourceVo {
|
||||||
|
rows := s.sysLogSourceService.FindByActive("")
|
||||||
|
data := make([]model.LoginSourceVo, 0)
|
||||||
|
for _, v := range rows {
|
||||||
|
data = append(data, model.LoginSourceVo{
|
||||||
|
UID: v.UID,
|
||||||
|
Name: v.Name,
|
||||||
|
Type: v.Type,
|
||||||
|
Icon: v.Icon,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
// initLoginSourceUser 初始化登录源用户
|
||||||
|
func (s *Account) initLoginSourceUser(uid, sType, username, password string) systemModel.SysUser {
|
||||||
|
sysUser := systemModel.SysUser{
|
||||||
|
UserName: username,
|
||||||
|
NickName: username, // 昵称使用名称账号
|
||||||
|
Password: password, // 原始密码
|
||||||
|
UserType: sType,
|
||||||
|
UserSource: uid,
|
||||||
|
Sex: "0", // 性别未选择
|
||||||
|
Status: constants.STATUS_YES, // 账号状态激活
|
||||||
|
DeptID: "101", // 归属部门为根节点
|
||||||
|
CreateBy: sType, // 创建来源
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增用户的角色管理
|
||||||
|
sysUser.RoleIDs = []string{"5"}
|
||||||
|
// 新增用户的岗位管理
|
||||||
|
sysUser.PostIDs = []string{}
|
||||||
|
|
||||||
|
insertId := s.sysUserService.InsertUser(sysUser)
|
||||||
|
if insertId != "" {
|
||||||
|
sysUser.UserID = insertId
|
||||||
|
}
|
||||||
|
return s.sysUserService.FindByUserName(username, sType, uid)
|
||||||
|
}
|
||||||
|
|||||||
111
src/modules/common/service/account_ldap.go
Normal file
111
src/modules/common/service/account_ldap.go
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/go-ldap/ldap/v3"
|
||||||
|
|
||||||
|
"be.ems/src/framework/config"
|
||||||
|
adminConstants "be.ems/src/framework/constants/admin"
|
||||||
|
"be.ems/src/framework/constants/common"
|
||||||
|
"be.ems/src/framework/utils/parse"
|
||||||
|
"be.ems/src/framework/vo"
|
||||||
|
"be.ems/src/modules/common/model"
|
||||||
|
systemModelVo "be.ems/src/modules/system/model/vo"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ByLDAP 登录创建用户信息
|
||||||
|
func (s *Account) ByLDAP(body model.LoginSourceBody) (vo.LoginUser, error) {
|
||||||
|
loginUser := vo.LoginUser{}
|
||||||
|
rows := s.sysLogSourceService.FindByActive(body.UID)
|
||||||
|
if len(rows) != 1 {
|
||||||
|
return loginUser, fmt.Errorf("ldap auth source not exist")
|
||||||
|
}
|
||||||
|
item := rows[0]
|
||||||
|
if item.Config == "" {
|
||||||
|
return loginUser, fmt.Errorf("ldap auth source config is empty")
|
||||||
|
}
|
||||||
|
var source systemModelVo.SysLoginSourceLDAP
|
||||||
|
if err := json.Unmarshal([]byte(item.Config), &source); err != nil {
|
||||||
|
return loginUser, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验LDAP用户
|
||||||
|
err := ldapAuth(source, body.Username, body.Password)
|
||||||
|
if err != nil {
|
||||||
|
return loginUser, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询用户登录账号
|
||||||
|
sysUser := s.sysUserService.FindByUserName(body.Username, item.Type, item.UID)
|
||||||
|
if sysUser.UserID == "" || sysUser.UserName == "" {
|
||||||
|
sysUser = s.initLoginSourceUser(item.UID, item.Type, body.Username, body.Password)
|
||||||
|
}
|
||||||
|
if sysUser.UserID == "" || sysUser.UserName != body.Username {
|
||||||
|
return loginUser, fmt.Errorf("login.errNameOrPasswd")
|
||||||
|
}
|
||||||
|
if sysUser.DelFlag == common.STATUS_YES {
|
||||||
|
// 对不起,您的账号已被删除
|
||||||
|
return loginUser, fmt.Errorf("login.errDelFlag")
|
||||||
|
}
|
||||||
|
if sysUser.Status == common.STATUS_NO {
|
||||||
|
return loginUser, fmt.Errorf("login.errStatus")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 登录用户信息
|
||||||
|
loginUser.UserID = sysUser.UserID
|
||||||
|
loginUser.DeptID = sysUser.DeptID
|
||||||
|
loginUser.User = sysUser
|
||||||
|
// 用户权限组标识
|
||||||
|
isAdmin := config.IsAdmin(sysUser.UserID)
|
||||||
|
if isAdmin {
|
||||||
|
loginUser.Permissions = []string{adminConstants.PERMISSION}
|
||||||
|
} else {
|
||||||
|
perms := s.sysMenuService.SelectMenuPermsByUserId(sysUser.UserID)
|
||||||
|
loginUser.Permissions = parse.RemoveDuplicates(perms)
|
||||||
|
}
|
||||||
|
return loginUser, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ldapAuth 校验LDAP用户
|
||||||
|
func ldapAuth(source systemModelVo.SysLoginSourceLDAP, username, password string) error {
|
||||||
|
// 连接LDAP
|
||||||
|
l, err := ldap.DialURL(source.URL)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer l.Close()
|
||||||
|
|
||||||
|
// 绑定DN校验
|
||||||
|
if source.BindDN != "" && source.BindPassword != "" {
|
||||||
|
if err := l.Bind(source.BindDN, source.BindPassword); err != nil {
|
||||||
|
return fmt.Errorf("ldap user bind %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 搜索用户
|
||||||
|
searchRequest := ldap.NewSearchRequest(
|
||||||
|
source.BaseDN,
|
||||||
|
ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
|
||||||
|
fmt.Sprintf(source.UserFilter, ldap.EscapeFilter(username)),
|
||||||
|
[]string{"dn", "uid"},
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
sr, err := l.Search(searchRequest)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("ldap user search %s", err)
|
||||||
|
}
|
||||||
|
// for _, entry := range sr.Entries {
|
||||||
|
// fmt.Printf("%s ==== %v\n", entry.DN, entry.GetAttributeValue("uid"))
|
||||||
|
// }
|
||||||
|
if len(sr.Entries) != 1 {
|
||||||
|
return fmt.Errorf("ldap user does not exist or too many entries returned")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验密码
|
||||||
|
if err = l.Bind(sr.Entries[0].DN, password); err != nil {
|
||||||
|
return fmt.Errorf("ldap user bind %s", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
171
src/modules/common/service/account_oauth2.go
Normal file
171
src/modules/common/service/account_oauth2.go
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/oauth2"
|
||||||
|
|
||||||
|
"be.ems/src/framework/config"
|
||||||
|
adminConstants "be.ems/src/framework/constants/admin"
|
||||||
|
"be.ems/src/framework/constants/common"
|
||||||
|
"be.ems/src/framework/utils/parse"
|
||||||
|
"be.ems/src/framework/vo"
|
||||||
|
"be.ems/src/modules/common/model"
|
||||||
|
systemModelVo "be.ems/src/modules/system/model/vo"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ByOAuth2CodeURL 获取OAuth2登录URL
|
||||||
|
func (s *Account) ByOAuth2CodeURL(state string) (string, error) {
|
||||||
|
rows := s.sysLogSourceService.FindByActive(state)
|
||||||
|
if len(rows) != 1 {
|
||||||
|
return "", fmt.Errorf("oauth2 auth source not exist")
|
||||||
|
}
|
||||||
|
item := rows[0]
|
||||||
|
if item.Config == "" {
|
||||||
|
return "", fmt.Errorf("oauth2 auth source config is empty")
|
||||||
|
}
|
||||||
|
var source systemModelVo.SysLoginSourceOAuth2
|
||||||
|
json.Unmarshal([]byte(item.Config), &source)
|
||||||
|
|
||||||
|
conf := oauth2.Config{
|
||||||
|
ClientID: source.ClientID,
|
||||||
|
ClientSecret: source.ClientSecret,
|
||||||
|
RedirectURL: source.RedirectURL,
|
||||||
|
Scopes: source.Scopes,
|
||||||
|
Endpoint: oauth2.Endpoint{
|
||||||
|
AuthURL: source.AuthURL,
|
||||||
|
TokenURL: source.TokenURL,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return conf.AuthCodeURL(state, oauth2.AccessTypeOffline), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ByOAuth2 登录创建用户信息
|
||||||
|
func (s *Account) ByOAuth2(body model.LoginSourceOauth2Body) (vo.LoginUser, error) {
|
||||||
|
loginUser := vo.LoginUser{}
|
||||||
|
rows := s.sysLogSourceService.FindByActive(body.State)
|
||||||
|
if len(rows) != 1 {
|
||||||
|
return loginUser, fmt.Errorf("oauth2 auth source not exist")
|
||||||
|
}
|
||||||
|
item := rows[0]
|
||||||
|
if item.Config == "" {
|
||||||
|
return loginUser, fmt.Errorf("oauth2 auth source config is empty")
|
||||||
|
}
|
||||||
|
var source systemModelVo.SysLoginSourceOAuth2
|
||||||
|
if err := json.Unmarshal([]byte(item.Config), &source); err != nil {
|
||||||
|
return loginUser, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验OAuth2用户
|
||||||
|
account, err := oauth2Auth(source, body.Code)
|
||||||
|
if err != nil {
|
||||||
|
return loginUser, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询用户登录账号
|
||||||
|
sysUser := s.sysUserService.FindByUserName(account, item.Type, item.UID)
|
||||||
|
if sysUser.UserID == "" || sysUser.UserName == "" {
|
||||||
|
sysUser = s.initLoginSourceUser(item.UID, item.Type, account, account)
|
||||||
|
}
|
||||||
|
if sysUser.UserID == "" || sysUser.UserName != account {
|
||||||
|
return loginUser, fmt.Errorf("login.errNameOrPasswd")
|
||||||
|
}
|
||||||
|
if sysUser.DelFlag == common.STATUS_YES {
|
||||||
|
// 对不起,您的账号已被删除
|
||||||
|
return loginUser, fmt.Errorf("login.errDelFlag")
|
||||||
|
}
|
||||||
|
if sysUser.Status == common.STATUS_NO {
|
||||||
|
return loginUser, fmt.Errorf("login.errStatus")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 登录用户信息
|
||||||
|
loginUser.UserID = sysUser.UserID
|
||||||
|
loginUser.DeptID = sysUser.DeptID
|
||||||
|
loginUser.User = sysUser
|
||||||
|
// 用户权限组标识
|
||||||
|
isAdmin := config.IsAdmin(sysUser.UserID)
|
||||||
|
if isAdmin {
|
||||||
|
loginUser.Permissions = []string{adminConstants.PERMISSION}
|
||||||
|
} else {
|
||||||
|
perms := s.sysMenuService.SelectMenuPermsByUserId(sysUser.UserID)
|
||||||
|
loginUser.Permissions = parse.RemoveDuplicates(perms)
|
||||||
|
}
|
||||||
|
return loginUser, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// oauth2Auth 校验OAuth2用户
|
||||||
|
func oauth2Auth(source systemModelVo.SysLoginSourceOAuth2, code string) (string, error) {
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
conf := oauth2.Config{
|
||||||
|
ClientID: source.ClientID,
|
||||||
|
ClientSecret: source.ClientSecret,
|
||||||
|
RedirectURL: source.RedirectURL,
|
||||||
|
Scopes: source.Scopes,
|
||||||
|
Endpoint: oauth2.Endpoint{
|
||||||
|
AuthURL: source.AuthURL,
|
||||||
|
TokenURL: source.TokenURL,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
token, err := conf.Exchange(ctx, code)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
// 使用token创建HTTP客户端 请求用户信息
|
||||||
|
resp, err := conf.Client(ctx, token).Get(source.UserURL)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
// 解析用户信息
|
||||||
|
var userInfo map[string]any
|
||||||
|
if err := json.NewDecoder(resp.Body).Decode(&userInfo); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取嵌套数据
|
||||||
|
value, found := getValueByPath(userInfo, source.AccountField)
|
||||||
|
if !found {
|
||||||
|
return "", fmt.Errorf("oauth2 auth source account field not exist")
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%v", value), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getValueByPath 从嵌套的 map[string]any 获取嵌套键对应的值
|
||||||
|
func getValueByPath(data map[string]any, path string) (any, bool) {
|
||||||
|
keys := strings.Split(path, ".") // 按照 "." 拆分路径
|
||||||
|
return getValue(data, keys)
|
||||||
|
}
|
||||||
|
|
||||||
|
// getValue 是递归查找嵌套 map 的函数
|
||||||
|
func getValue(data map[string]any, keys []string) (any, bool) {
|
||||||
|
if len(keys) == 0 {
|
||||||
|
return data, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取当前键
|
||||||
|
key := keys[0]
|
||||||
|
|
||||||
|
// 获取当前键的值
|
||||||
|
val, ok := data[key]
|
||||||
|
if !ok {
|
||||||
|
return nil, false // 找不到键,返回 false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果还有嵌套键,继续查找
|
||||||
|
if len(keys) > 1 {
|
||||||
|
// 递归查找嵌套 map
|
||||||
|
if reflect.TypeOf(val).Kind() == reflect.Map {
|
||||||
|
// 将 `any` 转换为 `map[string]any` 类型
|
||||||
|
if nestedMap, ok := val.(map[string]any); ok {
|
||||||
|
return getValue(nestedMap, keys[1:])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val, true
|
||||||
|
}
|
||||||
91
src/modules/common/service/account_smtp.go
Normal file
91
src/modules/common/service/account_smtp.go
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"crypto/tls"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/wneessen/go-mail"
|
||||||
|
|
||||||
|
"be.ems/src/framework/config"
|
||||||
|
adminConstants "be.ems/src/framework/constants/admin"
|
||||||
|
"be.ems/src/framework/constants/common"
|
||||||
|
"be.ems/src/framework/utils/parse"
|
||||||
|
"be.ems/src/framework/vo"
|
||||||
|
"be.ems/src/modules/common/model"
|
||||||
|
systemModelVo "be.ems/src/modules/system/model/vo"
|
||||||
|
)
|
||||||
|
|
||||||
|
// BySMTP 登录创建用户信息
|
||||||
|
func (s *Account) BySMTP(body model.LoginSourceBody) (vo.LoginUser, error) {
|
||||||
|
loginUser := vo.LoginUser{}
|
||||||
|
rows := s.sysLogSourceService.FindByActive(body.UID)
|
||||||
|
if len(rows) != 1 {
|
||||||
|
return loginUser, fmt.Errorf("smtp auth source not exist")
|
||||||
|
}
|
||||||
|
item := rows[0]
|
||||||
|
if item.Config == "" {
|
||||||
|
return loginUser, fmt.Errorf("smtp auth source config is empty")
|
||||||
|
}
|
||||||
|
var source systemModelVo.SysLoginSourceSMTP
|
||||||
|
if err := json.Unmarshal([]byte(item.Config), &source); err != nil {
|
||||||
|
return loginUser, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验SMTP用户
|
||||||
|
err := smtpAuth(source, body.Username, body.Password)
|
||||||
|
if err != nil {
|
||||||
|
return loginUser, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询用户登录账号
|
||||||
|
sysUser := s.sysUserService.FindByUserName(body.Username, item.Type, item.UID)
|
||||||
|
if sysUser.UserID == "" || sysUser.UserName == "" {
|
||||||
|
sysUser = s.initLoginSourceUser(item.UID, item.Type, body.Username, body.Password)
|
||||||
|
}
|
||||||
|
if sysUser.UserID == "" || sysUser.UserName != body.Username {
|
||||||
|
return loginUser, fmt.Errorf("login.errNameOrPasswd")
|
||||||
|
}
|
||||||
|
if sysUser.DelFlag == common.STATUS_YES {
|
||||||
|
// 对不起,您的账号已被删除
|
||||||
|
return loginUser, fmt.Errorf("login.errDelFlag")
|
||||||
|
}
|
||||||
|
if sysUser.Status == common.STATUS_NO {
|
||||||
|
return loginUser, fmt.Errorf("login.errStatus")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 登录用户信息
|
||||||
|
loginUser.UserID = sysUser.UserID
|
||||||
|
loginUser.DeptID = sysUser.DeptID
|
||||||
|
loginUser.User = sysUser
|
||||||
|
// 用户权限组标识
|
||||||
|
isAdmin := config.IsAdmin(sysUser.UserID)
|
||||||
|
if isAdmin {
|
||||||
|
loginUser.Permissions = []string{adminConstants.PERMISSION}
|
||||||
|
} else {
|
||||||
|
perms := s.sysMenuService.SelectMenuPermsByUserId(sysUser.UserID)
|
||||||
|
loginUser.Permissions = parse.RemoveDuplicates(perms)
|
||||||
|
}
|
||||||
|
return loginUser, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// smtpAuth 校验SMTP用户
|
||||||
|
func smtpAuth(source systemModelVo.SysLoginSourceSMTP, username, password string) error {
|
||||||
|
client, err := mail.NewClient(source.Host,
|
||||||
|
mail.WithSMTPAuth(mail.SMTPAuthAutoDiscover),
|
||||||
|
mail.WithUsername(username),
|
||||||
|
mail.WithPort(source.Port),
|
||||||
|
mail.WithPassword(password),
|
||||||
|
mail.WithTLSConfig(&tls.Config{InsecureSkipVerify: true}),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to create mail client %s", err)
|
||||||
|
}
|
||||||
|
// 连接到邮件SMTP服务器
|
||||||
|
if err = client.DialWithContext(context.Background()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer client.Close()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
163
src/modules/system/controller/sys_login_source.go
Normal file
163
src/modules/system/controller/sys_login_source.go
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
|
||||||
|
"be.ems/src/framework/i18n"
|
||||||
|
"be.ems/src/framework/reqctx"
|
||||||
|
"be.ems/src/framework/resp"
|
||||||
|
"be.ems/src/framework/utils/parse"
|
||||||
|
"be.ems/src/modules/system/model"
|
||||||
|
"be.ems/src/modules/system/service"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewLoginSource 实例化控制层
|
||||||
|
var NewSysLoginSource = &SysLoginSourceController{
|
||||||
|
sysLoginSourceService: service.NewSysLoginSource,
|
||||||
|
}
|
||||||
|
|
||||||
|
// SysLoginSourceController 认证源管理 控制层处理
|
||||||
|
//
|
||||||
|
// PATH /sys/login-source
|
||||||
|
type SysLoginSourceController struct {
|
||||||
|
sysLoginSourceService *service.SysLoginSource // 认证源信息服务
|
||||||
|
}
|
||||||
|
|
||||||
|
// List 列表
|
||||||
|
//
|
||||||
|
// GET /list
|
||||||
|
func (s SysLoginSourceController) List(c *gin.Context) {
|
||||||
|
query := reqctx.QueryMap(c)
|
||||||
|
rows, total := s.sysLoginSourceService.FindByPage(query)
|
||||||
|
c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Info 信息
|
||||||
|
//
|
||||||
|
// GET /:id
|
||||||
|
func (s SysLoginSourceController) Info(c *gin.Context) {
|
||||||
|
id := c.Param("id")
|
||||||
|
if id == "" {
|
||||||
|
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id is empty"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
info := s.sysLoginSourceService.FindById(parse.Number(id))
|
||||||
|
if info.Id == parse.Number(id) {
|
||||||
|
c.JSON(200, resp.OkData(info))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(200, resp.ErrMsg("id does not exist"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add 新增
|
||||||
|
//
|
||||||
|
// POST /
|
||||||
|
func (s SysLoginSourceController) Add(c *gin.Context) {
|
||||||
|
var body model.SysLoginSource
|
||||||
|
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
|
||||||
|
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
|
||||||
|
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if body.Id > 0 {
|
||||||
|
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id not is empty"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(body.Config) < 7 || !json.Valid([]byte(body.Config)) {
|
||||||
|
c.JSON(200, resp.ErrMsg("config json format error"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
configStr, err := s.sysLoginSourceService.CheckConfigJSON(body.Type, body.Config)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(200, resp.ErrMsg(err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
body.Config = configStr
|
||||||
|
|
||||||
|
body.CreateBy = reqctx.LoginUserToUserName(c)
|
||||||
|
insertId := s.sysLoginSourceService.Insert(body)
|
||||||
|
if insertId > 0 {
|
||||||
|
c.JSON(200, resp.OkData(insertId))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(200, resp.Err(nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Edit 更新
|
||||||
|
//
|
||||||
|
// PUT /
|
||||||
|
func (s SysLoginSourceController) Edit(c *gin.Context) {
|
||||||
|
var body model.SysLoginSource
|
||||||
|
if err := c.ShouldBindBodyWithJSON(&body); err != nil {
|
||||||
|
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
|
||||||
|
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if body.Id <= 0 {
|
||||||
|
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id is empty"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(body.Config) < 7 || !json.Valid([]byte(body.Config)) {
|
||||||
|
c.JSON(200, resp.ErrMsg("config json format error"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
configStr, err := s.sysLoginSourceService.CheckConfigJSON(body.Type, body.Config)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(200, resp.ErrMsg(err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
body.Config = configStr
|
||||||
|
|
||||||
|
// 查询信息
|
||||||
|
info := s.sysLoginSourceService.FindById(body.Id)
|
||||||
|
if info.Id != body.Id {
|
||||||
|
c.JSON(200, resp.ErrMsg("modification failed, data not exist"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
info.Type = body.Type
|
||||||
|
info.Name = body.Name
|
||||||
|
info.Icon = body.Icon
|
||||||
|
info.Config = body.Config
|
||||||
|
info.ActiveFlag = body.ActiveFlag
|
||||||
|
info.Remark = body.Remark
|
||||||
|
info.UpdateBy = reqctx.LoginUserToUserName(c)
|
||||||
|
rowsAffected := s.sysLoginSourceService.Update(info)
|
||||||
|
if rowsAffected > 0 {
|
||||||
|
c.JSON(200, resp.Ok(nil))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(200, resp.Err(nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove 删除
|
||||||
|
//
|
||||||
|
// DELETE /:id
|
||||||
|
func (s SysLoginSourceController) Remove(c *gin.Context) {
|
||||||
|
language := reqctx.AcceptLanguage(c)
|
||||||
|
id := c.Param("id")
|
||||||
|
if id == "" {
|
||||||
|
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id is empty"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理字符转id数组后去重
|
||||||
|
uniqueIDs := parse.RemoveDuplicatesToArray(id, ",")
|
||||||
|
// 转换成int64数组类型
|
||||||
|
ids := make([]int64, 0)
|
||||||
|
for _, v := range uniqueIDs {
|
||||||
|
ids = append(ids, parse.Number(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
rows, err := s.sysLoginSourceService.DeleteByIds(ids)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(200, resp.ErrMsg(err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows})
|
||||||
|
c.JSON(200, resp.OkMsg(msg))
|
||||||
|
}
|
||||||
@@ -181,7 +181,7 @@ func (s *SysProfileController) UpdateProfile(c *gin.Context) {
|
|||||||
rows := s.sysUserService.UpdateUser(sysUser)
|
rows := s.sysUserService.UpdateUser(sysUser)
|
||||||
if rows > 0 {
|
if rows > 0 {
|
||||||
// 更新缓存用户信息
|
// 更新缓存用户信息
|
||||||
loginUser.User = s.sysUserService.SelectUserByUserName(userName)
|
loginUser.User = s.sysUserService.FindByUserName(userName, "System", "#")
|
||||||
// 用户权限组标识
|
// 用户权限组标识
|
||||||
isAdmin := config.IsAdmin(sysUser.UserID)
|
isAdmin := config.IsAdmin(sysUser.UserID)
|
||||||
if isAdmin {
|
if isAdmin {
|
||||||
@@ -323,7 +323,7 @@ func (s *SysProfileController) Avatar(c *gin.Context) {
|
|||||||
rows := s.sysUserService.UpdateUser(sysUser)
|
rows := s.sysUserService.UpdateUser(sysUser)
|
||||||
if rows > 0 {
|
if rows > 0 {
|
||||||
// 更新缓存用户信息
|
// 更新缓存用户信息
|
||||||
loginUser.User = s.sysUserService.SelectUserByUserName(loginUser.User.UserName)
|
loginUser.User = s.sysUserService.FindByUserName(loginUser.User.UserName, "System", "#")
|
||||||
// 用户权限组标识
|
// 用户权限组标识
|
||||||
isAdmin := config.IsAdmin(sysUser.UserID)
|
isAdmin := config.IsAdmin(sysUser.UserID)
|
||||||
if isAdmin {
|
if isAdmin {
|
||||||
|
|||||||
@@ -526,9 +526,10 @@ func (s *SysUserController) Export(c *gin.Context) {
|
|||||||
"C1": i18n.TKey(language, "user.export.nick"),
|
"C1": i18n.TKey(language, "user.export.nick"),
|
||||||
"D1": i18n.TKey(language, "user.export.role"),
|
"D1": i18n.TKey(language, "user.export.role"),
|
||||||
"E1": i18n.TKey(language, "user.export.deptName"),
|
"E1": i18n.TKey(language, "user.export.deptName"),
|
||||||
"F1": i18n.TKey(language, "user.export.loginIP"),
|
"F1": i18n.TKey(language, "user.export.userType"),
|
||||||
"G1": i18n.TKey(language, "user.export.loginDate"),
|
"G1": i18n.TKey(language, "user.export.loginIP"),
|
||||||
"H1": i18n.TKey(language, "user.export.status"),
|
"H1": i18n.TKey(language, "user.export.loginDate"),
|
||||||
|
"I1": i18n.TKey(language, "user.export.status"),
|
||||||
// "F1": i18n.TKey(language, "user.export.sex"),
|
// "F1": i18n.TKey(language, "user.export.sex"),
|
||||||
// "E1": i18n.TKey(language, "user.export.phone"),
|
// "E1": i18n.TKey(language, "user.export.phone"),
|
||||||
// "D1": i18n.TKey(language, "user.export.email"),
|
// "D1": i18n.TKey(language, "user.export.email"),
|
||||||
@@ -536,6 +537,8 @@ func (s *SysUserController) Export(c *gin.Context) {
|
|||||||
// "K1": i18n.TKey(language, "user.export.deptLeader"),
|
// "K1": i18n.TKey(language, "user.export.deptLeader"),
|
||||||
}
|
}
|
||||||
// 读取用户性别字典数据
|
// 读取用户性别字典数据
|
||||||
|
dictSysUserType := s.sysDictDataService.SelectDictDataByType("sys_user_type")
|
||||||
|
// 读取用户性别字典数据
|
||||||
// dictSysUserSex := s.sysDictDataService.SelectDictDataByType("sys_user_sex")
|
// dictSysUserSex := s.sysDictDataService.SelectDictDataByType("sys_user_sex")
|
||||||
// 从第二行开始的数据
|
// 从第二行开始的数据
|
||||||
dataCells := make([]map[string]any, 0)
|
dataCells := make([]map[string]any, 0)
|
||||||
@@ -549,6 +552,14 @@ func (s *SysUserController) Export(c *gin.Context) {
|
|||||||
// break
|
// break
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
// 用户类型
|
||||||
|
userType := row.UserType
|
||||||
|
for _, v := range dictSysUserType {
|
||||||
|
if row.UserType == v.DictValue && row.UserSource != "#" {
|
||||||
|
userType = i18n.TKey(language, v.DictLabel) + " " + row.UserSource
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
// 帐号状态
|
// 帐号状态
|
||||||
statusValue := i18n.TKey(language, "dictData.disable")
|
statusValue := i18n.TKey(language, "dictData.disable")
|
||||||
if row.Status == "1" {
|
if row.Status == "1" {
|
||||||
@@ -557,7 +568,11 @@ func (s *SysUserController) Export(c *gin.Context) {
|
|||||||
// 用户角色, 默认导出首个
|
// 用户角色, 默认导出首个
|
||||||
userRole := ""
|
userRole := ""
|
||||||
if len(row.Roles) > 0 {
|
if len(row.Roles) > 0 {
|
||||||
userRole = i18n.TKey(language, row.Roles[0].RoleName)
|
arr := make([]string, 0)
|
||||||
|
for _, v := range row.Roles {
|
||||||
|
arr = append(arr, i18n.TKey(language, v.RoleName))
|
||||||
|
}
|
||||||
|
userRole = strings.Join(arr, ",")
|
||||||
}
|
}
|
||||||
dataCells = append(dataCells, map[string]any{
|
dataCells = append(dataCells, map[string]any{
|
||||||
"A" + idx: row.UserID,
|
"A" + idx: row.UserID,
|
||||||
@@ -565,9 +580,10 @@ func (s *SysUserController) Export(c *gin.Context) {
|
|||||||
"C" + idx: row.NickName,
|
"C" + idx: row.NickName,
|
||||||
"D" + idx: userRole,
|
"D" + idx: userRole,
|
||||||
"E" + idx: row.Dept.DeptName,
|
"E" + idx: row.Dept.DeptName,
|
||||||
"F" + idx: row.LoginIP,
|
"F" + idx: userType,
|
||||||
"G" + idx: date.ParseDateToStr(row.LoginDate, date.YYYY_MM_DD_HH_MM_SS),
|
"G" + idx: row.LoginIP,
|
||||||
"H" + idx: statusValue,
|
"H" + idx: date.ParseDateToStr(row.LoginDate, date.YYYY_MM_DD_HH_MM_SS),
|
||||||
|
"I" + idx: statusValue,
|
||||||
// "E" + idx: row.PhoneNumber,
|
// "E" + idx: row.PhoneNumber,
|
||||||
// "F" + idx: sysUserSex,
|
// "F" + idx: sysUserSex,
|
||||||
// "D" + idx: row.Email,
|
// "D" + idx: row.Email,
|
||||||
@@ -752,7 +768,7 @@ func (s *SysUserController) ImportData(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 验证是否存在这个用户
|
// 验证是否存在这个用户
|
||||||
userInfo := s.sysUserService.SelectUserByUserName(newSysUser.UserName)
|
userInfo := s.sysUserService.FindByUserName(newSysUser.UserName, "System", "#")
|
||||||
if userInfo.UserName != newSysUser.UserName {
|
if userInfo.UserName != newSysUser.UserName {
|
||||||
newSysUser.CreateBy = operName
|
newSysUser.CreateBy = operName
|
||||||
insertId := s.sysUserService.InsertUser(newSysUser)
|
insertId := s.sysUserService.InsertUser(newSysUser)
|
||||||
|
|||||||
22
src/modules/system/model/sys_login_source.go
Normal file
22
src/modules/system/model/sys_login_source.go
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
// SysLoginSource 系统第三方认证源 sys_login_source
|
||||||
|
type SysLoginSource struct {
|
||||||
|
Id int64 `gorm:"column:id;primaryKey;autoIncrement" json:"id"` // ID
|
||||||
|
UID string `gorm:"column:uid" json:"uid"` // UID 16位长度字符串
|
||||||
|
Type string `gorm:"column:type" json:"type" binding:"required,oneof=LDAP SMTP OAuth2"` // 认证类型 LDAP SMTP OAuth2
|
||||||
|
Name string `gorm:"column:name" json:"name" binding:"required"` // 认证名称
|
||||||
|
Icon string `gorm:"column:icon" json:"icon"` // 图标
|
||||||
|
ActiveFlag string `gorm:"column:active_flag" json:"activeFlag"` // 激活标记(0未激活 1激活)
|
||||||
|
SyncFlag string `gorm:"column:sync_flag" json:"syncFlag"` // 同步标记(0未同步 1同步)
|
||||||
|
Config string `gorm:"column:config" json:"config" binding:"required"` // 配置JSON字符串
|
||||||
|
CreateBy string `gorm:"column:create_by" json:"createBy"` // 创建者
|
||||||
|
CreateTime int64 `gorm:"column:create_time" json:"createTime"` // 创建时间
|
||||||
|
UpdateBy string `gorm:"column:update_by" json:"updateBy"` // 更新者
|
||||||
|
UpdateTime int64 `gorm:"column:update_time" json:"updateTime"` // 更新时间
|
||||||
|
Remark string `gorm:"column:remark" json:"remark"` // 备注
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*SysLoginSource) TableName() string {
|
||||||
|
return "sys_login_source"
|
||||||
|
}
|
||||||
@@ -3,58 +3,64 @@ package model
|
|||||||
// SysUser 用户对象 sys_user
|
// SysUser 用户对象 sys_user
|
||||||
type SysUser struct {
|
type SysUser struct {
|
||||||
// 用户ID
|
// 用户ID
|
||||||
UserID string `json:"userId"`
|
UserID string `json:"userId" gorm:"column:user_id;type:bigint;primaryKey"`
|
||||||
// 部门ID
|
// 部门ID
|
||||||
DeptID string `json:"deptId"`
|
DeptID string `json:"deptId" gorm:"column:dept_id"`
|
||||||
// 租户ID
|
// 租户ID
|
||||||
TenantID string `json:"tenantId"`
|
TenantID string `json:"tenantId" gorm:"column:tenant_id"`
|
||||||
// 用户账号
|
// 用户账号
|
||||||
UserName string `json:"userName" binding:"required"`
|
UserName string `json:"userName" binding:"required" gorm:"column:user_name"`
|
||||||
// 用户昵称
|
// 用户昵称
|
||||||
NickName string `json:"nickName" binding:"required"`
|
NickName string `json:"nickName" binding:"required" gorm:"column:nick_name"`
|
||||||
// 用户类型(sys系统用户)
|
// 用户类型(System系统用户)
|
||||||
UserType string `json:"userType"`
|
UserType string `json:"userType" gorm:"column:user_type"`
|
||||||
|
UserSource string `json:"userSource" gorm:"column:user_source"` // 用户来源UID (系统#))
|
||||||
// 用户邮箱
|
// 用户邮箱
|
||||||
Email string `json:"email"`
|
Email string `json:"email" gorm:"column:email"`
|
||||||
// 手机号码
|
// 手机号码
|
||||||
PhoneNumber string `json:"phonenumber"`
|
PhoneNumber string `json:"phonenumber" gorm:"column:phonenumber"`
|
||||||
// 用户性别(0未知 1男 2女)
|
// 用户性别(0未知 1男 2女)
|
||||||
Sex string `json:"sex"`
|
Sex string `json:"sex" gorm:"column:sex"`
|
||||||
// 头像地址
|
// 头像地址
|
||||||
Avatar string `json:"avatar"`
|
Avatar string `json:"avatar" gorm:"column:avatar"`
|
||||||
// 密码
|
// 密码
|
||||||
Password string `json:"-"`
|
Password string `json:"-" gorm:"column:password"`
|
||||||
// 帐号状态(0停用 1正常)
|
// 帐号状态(0停用 1正常)
|
||||||
Status string `json:"status"`
|
Status string `json:"status" gorm:"column:status"`
|
||||||
// 删除标志(0代表存在 1代表删除)
|
// 删除标志(0代表存在 1代表删除)
|
||||||
DelFlag string `json:"delFlag"`
|
DelFlag string `json:"delFlag" gorm:"column:del_flag"`
|
||||||
// 最后登录IP
|
// 最后登录IP
|
||||||
LoginIP string `json:"loginIp"`
|
LoginIP string `json:"loginIp" gorm:"column:login_ip"`
|
||||||
// 最后登录时间
|
// 最后登录时间
|
||||||
LoginDate int64 `json:"loginDate"`
|
LoginDate int64 `json:"loginDate" gorm:"column:login_date"`
|
||||||
// 创建者
|
// 创建者
|
||||||
CreateBy string `json:"createBy"`
|
CreateBy string `json:"createBy" gorm:"column:create_by"`
|
||||||
// 创建时间
|
// 创建时间
|
||||||
CreateTime int64 `json:"createTime"`
|
CreateTime int64 `json:"createTime" gorm:"column:create_time"`
|
||||||
// 更新者
|
// 更新者
|
||||||
UpdateBy string `json:"updateBy"`
|
UpdateBy string `json:"updateBy" gorm:"column:update_by"`
|
||||||
// 更新时间
|
// 更新时间
|
||||||
UpdateTime int64 `json:"updateTime"`
|
UpdateTime int64 `json:"updateTime" gorm:"column:update_time"`
|
||||||
// 备注
|
// 备注
|
||||||
Remark string `json:"remark"`
|
Remark string `json:"remark" gorm:"column:remark"`
|
||||||
|
|
||||||
// ====== 非数据库字段属性 ======
|
// ====== 非数据库字段属性 ======
|
||||||
|
|
||||||
// 部门对象
|
// 部门对象
|
||||||
Dept SysDept `json:"dept,omitempty" binding:"structonly"`
|
Dept SysDept `json:"dept,omitempty" binding:"structonly" gorm:"-"`
|
||||||
// 租户对象
|
// 租户对象
|
||||||
Tenant SysTenant `json:"tenant,omitempty" binding:"structonly"`
|
Tenant SysTenant `json:"tenant,omitempty" binding:"structonly" gorm:"-"`
|
||||||
// 角色对象组
|
// 角色对象组
|
||||||
Roles []SysRole `json:"roles"`
|
Roles []SysRole `json:"roles" gorm:"-"`
|
||||||
// 角色ID
|
// 角色ID
|
||||||
RoleID string `json:"roleId,omitempty"`
|
RoleID string `json:"roleId,omitempty" gorm:"-"`
|
||||||
// 角色组
|
// 角色组
|
||||||
RoleIDs []string `json:"roleIds,omitempty"`
|
RoleIDs []string `json:"roleIds,omitempty" gorm:"-"`
|
||||||
// 岗位组
|
// 岗位组
|
||||||
PostIDs []string `json:"postIds,omitempty"`
|
PostIDs []string `json:"postIds,omitempty" gorm:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TableName 表名称
|
||||||
|
func (*SysUser) TableName() string {
|
||||||
|
return "sys_user"
|
||||||
}
|
}
|
||||||
|
|||||||
28
src/modules/system/model/vo/login_source.go
Normal file
28
src/modules/system/model/vo/login_source.go
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package vo
|
||||||
|
|
||||||
|
// SysLoginSourceLDAP LDAP认证源
|
||||||
|
type SysLoginSourceLDAP struct {
|
||||||
|
URL string `json:"url"` // LDAP 服务器(ldap://192.168.9.58:11389)
|
||||||
|
BaseDN string `json:"baseDN"` // base DN(dc=example,dc=org)
|
||||||
|
UserFilter string `json:"userFilter"` // 用户过滤规则((&(objectClass=organizationalPerson)(uid=%s)))
|
||||||
|
BindDN string `json:"bindDN"` // 绑定 DN(cn=admin,dc=example,dc=org)
|
||||||
|
BindPassword string `json:"bindPassword"` // 绑定密码(adminpassword)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SysLoginSourceSMTP SMTP认证源
|
||||||
|
type SysLoginSourceSMTP struct {
|
||||||
|
Host string `json:"host"` // SMTP 服务器(smtp.gmail.com)
|
||||||
|
Port int `json:"port"` // SMTP 端口(587)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SysLoginSourceOAuth2 OAuth2认证源
|
||||||
|
type SysLoginSourceOAuth2 struct {
|
||||||
|
ClientID string `json:"clientID"` // 客户端ID
|
||||||
|
ClientSecret string `json:"clientSecret"` // 客户端密钥
|
||||||
|
AuthURL string `json:"authURL"` // 认证URL
|
||||||
|
TokenURL string `json:"tokenURL"` // 令牌URL
|
||||||
|
Scopes []string `json:"scopes"` // 授权范围
|
||||||
|
RedirectURL string `json:"redirectURL"` // 重定向URL
|
||||||
|
UserURL string `json:"userURL"` // 用户信息URL
|
||||||
|
AccountField string `json:"accountField"` // 账号字段从用户信息中获取
|
||||||
|
}
|
||||||
@@ -39,4 +39,7 @@ type ISysDept interface {
|
|||||||
|
|
||||||
// DeleteDeptById 删除部门管理信息
|
// DeleteDeptById 删除部门管理信息
|
||||||
DeleteDeptById(deptId string) int64
|
DeleteDeptById(deptId string) int64
|
||||||
|
|
||||||
|
// SelectById 通过ID查询信息
|
||||||
|
SelectById(deptId string) model.SysDept
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -391,3 +391,25 @@ func (r *SysDeptImpl) DeleteDeptById(deptId string) int64 {
|
|||||||
}
|
}
|
||||||
return results
|
return results
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SelectById 通过ID查询信息
|
||||||
|
func (r *SysDeptImpl) SelectById(deptId string) model.SysDept {
|
||||||
|
if deptId == "" {
|
||||||
|
return model.SysDept{}
|
||||||
|
}
|
||||||
|
querySql := `select d.dept_id, d.parent_id, d.ancestors,
|
||||||
|
d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status,
|
||||||
|
(select dept_name from sys_dept where dept_id = d.parent_id) parent_name
|
||||||
|
from sys_dept d where d.dept_id = ?`
|
||||||
|
results, err := datasource.RawDB("", querySql, []any{deptId})
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("query err => %v", err)
|
||||||
|
return model.SysDept{}
|
||||||
|
}
|
||||||
|
// 转换实体
|
||||||
|
rows := r.convertResultRows(results)
|
||||||
|
if len(rows) > 0 {
|
||||||
|
return rows[0]
|
||||||
|
}
|
||||||
|
return model.SysDept{}
|
||||||
|
}
|
||||||
|
|||||||
150
src/modules/system/repository/sys_login_source.go
Normal file
150
src/modules/system/repository/sys_login_source.go
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"be.ems/src/framework/database/db"
|
||||||
|
"be.ems/src/framework/logger"
|
||||||
|
"be.ems/src/modules/system/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewSysLoginSource 实例化数据层
|
||||||
|
var NewSysLoginSource = &SysLoginSource{}
|
||||||
|
|
||||||
|
// SysLoginSource 认证源数据层处理
|
||||||
|
type SysLoginSource struct{}
|
||||||
|
|
||||||
|
// SelectByPage 分页查询集合
|
||||||
|
func (r SysLoginSource) SelectByPage(query map[string]string) ([]model.SysLoginSource, int64) {
|
||||||
|
tx := db.DB("").Model(&model.SysLoginSource{})
|
||||||
|
// 查询条件拼接
|
||||||
|
if v, ok := query["name"]; ok && v != "" {
|
||||||
|
tx = tx.Where("name like ?", v+"%")
|
||||||
|
}
|
||||||
|
if v, ok := query["type"]; ok && v != "" {
|
||||||
|
tx = tx.Where("type = ?", v)
|
||||||
|
}
|
||||||
|
if v, ok := query["beginTime"]; ok && v != "" {
|
||||||
|
if len(v) == 10 {
|
||||||
|
v = fmt.Sprintf("%s000", v)
|
||||||
|
}
|
||||||
|
tx = tx.Where("create_time >= ?", v)
|
||||||
|
}
|
||||||
|
if v, ok := query["endTime"]; ok && v != "" {
|
||||||
|
if len(v) == 10 {
|
||||||
|
v = fmt.Sprintf("%s999", v)
|
||||||
|
}
|
||||||
|
tx = tx.Where("create_time <= ?", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询结果
|
||||||
|
var total int64 = 0
|
||||||
|
rows := []model.SysLoginSource{}
|
||||||
|
|
||||||
|
// 查询数量为0直接返回
|
||||||
|
if err := tx.Count(&total).Error; err != nil || total <= 0 {
|
||||||
|
return rows, total
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询数据分页
|
||||||
|
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
|
||||||
|
tx = tx.Limit(pageSize).Offset(pageSize * pageNum)
|
||||||
|
err := tx.Find(&rows).Error
|
||||||
|
if err != nil {
|
||||||
|
return rows, total
|
||||||
|
}
|
||||||
|
return rows, total
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select 查询集合
|
||||||
|
func (r SysLoginSource) Select(param model.SysLoginSource) []model.SysLoginSource {
|
||||||
|
tx := db.DB("").Model(&model.SysLoginSource{})
|
||||||
|
// 查询条件拼接
|
||||||
|
if param.UID != "" {
|
||||||
|
tx = tx.Where("uid = ?", param.UID)
|
||||||
|
}
|
||||||
|
if param.Type != "" {
|
||||||
|
tx = tx.Where("type = ?", param.Type)
|
||||||
|
}
|
||||||
|
if param.Name != "" {
|
||||||
|
tx = tx.Where("name = ?", param.Name)
|
||||||
|
}
|
||||||
|
if param.ActiveFlag != "" {
|
||||||
|
tx = tx.Where("active_flag = ?", param.ActiveFlag)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询数据
|
||||||
|
rows := []model.SysLoginSource{}
|
||||||
|
if err := tx.Find(&rows).Error; err != nil {
|
||||||
|
return rows
|
||||||
|
}
|
||||||
|
return rows
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelectByIds 通过ID查询信息
|
||||||
|
func (r SysLoginSource) SelectByIds(ids []int64) []model.SysLoginSource {
|
||||||
|
rows := []model.SysLoginSource{}
|
||||||
|
if len(ids) <= 0 {
|
||||||
|
return rows
|
||||||
|
}
|
||||||
|
tx := db.DB("").Model(&model.SysLoginSource{})
|
||||||
|
// 构建查询条件
|
||||||
|
tx = tx.Where("id in ?", ids)
|
||||||
|
// 查询数据
|
||||||
|
if err := tx.Find(&rows).Error; err != nil {
|
||||||
|
logger.Errorf("query find err => %v", err.Error())
|
||||||
|
return rows
|
||||||
|
}
|
||||||
|
return rows
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert 新增信息 返回新增数据ID
|
||||||
|
func (r SysLoginSource) Insert(param model.SysLoginSource) int64 {
|
||||||
|
if param.CreateBy != "" {
|
||||||
|
ms := time.Now().UnixMilli()
|
||||||
|
param.UpdateBy = param.CreateBy
|
||||||
|
param.UpdateTime = ms
|
||||||
|
param.CreateTime = ms
|
||||||
|
}
|
||||||
|
// 执行插入
|
||||||
|
if err := db.DB("").Create(¶m).Error; err != nil {
|
||||||
|
logger.Errorf("insert err => %v", err.Error())
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return param.Id
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update 修改信息 返回受影响行数
|
||||||
|
func (r SysLoginSource) Update(param model.SysLoginSource) int64 {
|
||||||
|
if param.Id <= 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if param.UpdateBy != "" {
|
||||||
|
param.UpdateTime = time.Now().UnixMilli()
|
||||||
|
}
|
||||||
|
tx := db.DB("").Model(&model.SysLoginSource{})
|
||||||
|
// 构建查询条件
|
||||||
|
tx = tx.Where("id = ?", param.Id)
|
||||||
|
tx = tx.Omit("id", "create_by", "create_time")
|
||||||
|
// 执行更新
|
||||||
|
if err := tx.Updates(param).Error; err != nil {
|
||||||
|
logger.Errorf("update err => %v", err.Error())
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return tx.RowsAffected
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteByIds 批量删除信息 返回受影响行数
|
||||||
|
func (r SysLoginSource) DeleteByIds(ids []int64) int64 {
|
||||||
|
if len(ids) <= 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
tx := db.DB("").Where("id in ?", ids)
|
||||||
|
// 执行删除
|
||||||
|
if err := tx.Delete(&model.SysLoginSource{}).Error; err != nil {
|
||||||
|
logger.Errorf("delete err => %v", err.Error())
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return tx.RowsAffected
|
||||||
|
}
|
||||||
@@ -27,4 +27,7 @@ type ISysRole interface {
|
|||||||
|
|
||||||
// CheckUniqueRole 校验角色是否唯一
|
// CheckUniqueRole 校验角色是否唯一
|
||||||
CheckUniqueRole(sysRole model.SysRole) string
|
CheckUniqueRole(sysRole model.SysRole) string
|
||||||
|
|
||||||
|
// SelectByUserId 根据用户ID获取角色信息
|
||||||
|
SelectByUserId(userId string) []model.SysRole
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -373,3 +373,14 @@ func (r *SysRoleImpl) CheckUniqueRole(sysRole model.SysRole) string {
|
|||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SelectByUserId 根据用户ID获取角色信息
|
||||||
|
func (r *SysRoleImpl) SelectByUserId(userId string) []model.SysRole {
|
||||||
|
querySql := r.selectSql + " where r.del_flag = '0' and ur.user_id = ?"
|
||||||
|
results, err := datasource.RawDB("", querySql, []any{userId})
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("query err => %v", err)
|
||||||
|
return []model.SysRole{}
|
||||||
|
}
|
||||||
|
return r.convertResultRows(results)
|
||||||
|
}
|
||||||
|
|||||||
@@ -30,4 +30,7 @@ type ISysUser interface {
|
|||||||
|
|
||||||
// CheckUniqueUser 校验用户信息是否唯一
|
// CheckUniqueUser 校验用户信息是否唯一
|
||||||
CheckUniqueUser(sysUser model.SysUser) string
|
CheckUniqueUser(sysUser model.SysUser) string
|
||||||
|
|
||||||
|
// SelectByUserName 通过登录账号查询信息
|
||||||
|
SelectByUserName(userName, userType, userSource string) model.SysUser
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import (
|
|||||||
// 实例化数据层 SysUserImpl 结构体
|
// 实例化数据层 SysUserImpl 结构体
|
||||||
var NewSysUserImpl = &SysUserImpl{
|
var NewSysUserImpl = &SysUserImpl{
|
||||||
selectSql: `select
|
selectSql: `select
|
||||||
u.user_id, u.dept_id, u.tenant_id, u.user_name, u.nick_name, u.user_type, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
|
u.user_id, u.dept_id, u.tenant_id, u.user_name, u.nick_name, u.user_type, u.user_source, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
|
||||||
d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
|
d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
|
||||||
t.tenant_id, t.parent_id, t.ancestors, t.tenant_name, t.order_num, t.tenancy_type, t.tenancy_key, t.status as tenant_status,
|
t.tenant_id, t.parent_id, t.ancestors, t.tenant_name, t.order_num, t.tenancy_type, t.tenancy_key, t.status as tenant_status,
|
||||||
r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
|
r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
|
||||||
@@ -33,6 +33,7 @@ var NewSysUserImpl = &SysUserImpl{
|
|||||||
"user_name": "UserName",
|
"user_name": "UserName",
|
||||||
"nick_name": "NickName",
|
"nick_name": "NickName",
|
||||||
"user_type": "UserType",
|
"user_type": "UserType",
|
||||||
|
"user_source": "UserSource",
|
||||||
"email": "Email",
|
"email": "Email",
|
||||||
"phonenumber": "PhoneNumber",
|
"phonenumber": "PhoneNumber",
|
||||||
"sex": "Sex",
|
"sex": "Sex",
|
||||||
@@ -171,6 +172,14 @@ func (r *SysUserImpl) SelectUserPage(query map[string]any, dataScopeSQL string)
|
|||||||
conditions = append(conditions, "u.phonenumber like concat(?, '%')")
|
conditions = append(conditions, "u.phonenumber like concat(?, '%')")
|
||||||
params = append(params, v)
|
params = append(params, v)
|
||||||
}
|
}
|
||||||
|
if v, ok := query["userType"]; ok && v != "" {
|
||||||
|
conditions = append(conditions, "u.user_type = ?")
|
||||||
|
params = append(params, v)
|
||||||
|
}
|
||||||
|
if v, ok := query["userSource"]; ok && v != "" {
|
||||||
|
conditions = append(conditions, "u.user_source = ?")
|
||||||
|
params = append(params, v)
|
||||||
|
}
|
||||||
beginTime, ok := query["beginTime"]
|
beginTime, ok := query["beginTime"]
|
||||||
if !ok {
|
if !ok {
|
||||||
beginTime, ok = query["params[beginTime]"]
|
beginTime, ok = query["params[beginTime]"]
|
||||||
@@ -398,6 +407,32 @@ func (r *SysUserImpl) SelectUserByIds(userIds []string) []model.SysUser {
|
|||||||
return r.convertResultRows(results)
|
return r.convertResultRows(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SelectByUserName 通过登录账号查询信息
|
||||||
|
func (r *SysUserImpl) SelectByUserName(userName, userType, userSource string) model.SysUser {
|
||||||
|
item := model.SysUser{}
|
||||||
|
if userName == "" {
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
if userType == "" {
|
||||||
|
userType = "System"
|
||||||
|
}
|
||||||
|
if userSource == "" {
|
||||||
|
userSource = "#"
|
||||||
|
}
|
||||||
|
querySql := r.selectSql + " where u.del_flag = '0' and u.user_name = ? and u.user_type = ? and u.user_source = ?"
|
||||||
|
results, err := datasource.RawDB("", querySql, []any{userName, userType, userSource})
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("query err => %v", err)
|
||||||
|
return model.SysUser{}
|
||||||
|
}
|
||||||
|
// 转换实体
|
||||||
|
rows := r.convertResultRows(results)
|
||||||
|
if len(rows) > 0 {
|
||||||
|
return rows[0]
|
||||||
|
}
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
|
||||||
// SelectUserByUserName 通过用户登录账号查询用户
|
// SelectUserByUserName 通过用户登录账号查询用户
|
||||||
func (r *SysUserImpl) SelectUserByUserName(userName string) model.SysUser {
|
func (r *SysUserImpl) SelectUserByUserName(userName string) model.SysUser {
|
||||||
querySql := r.selectSql + " where u.del_flag = '0' and u.user_name = ?"
|
querySql := r.selectSql + " where u.del_flag = '0' and u.user_name = ?"
|
||||||
@@ -436,6 +471,9 @@ func (r *SysUserImpl) InsertUser(sysUser model.SysUser) string {
|
|||||||
if sysUser.UserType != "" {
|
if sysUser.UserType != "" {
|
||||||
params["user_type"] = sysUser.UserType
|
params["user_type"] = sysUser.UserType
|
||||||
}
|
}
|
||||||
|
if sysUser.UserSource != "" {
|
||||||
|
params["user_source"] = sysUser.UserSource
|
||||||
|
}
|
||||||
if sysUser.Avatar != "" {
|
if sysUser.Avatar != "" {
|
||||||
params["avatar"] = sysUser.Avatar
|
params["avatar"] = sysUser.Avatar
|
||||||
}
|
}
|
||||||
@@ -509,6 +547,9 @@ func (r *SysUserImpl) UpdateUser(sysUser model.SysUser) int64 {
|
|||||||
if sysUser.UserType != "" {
|
if sysUser.UserType != "" {
|
||||||
params["user_type"] = sysUser.UserType
|
params["user_type"] = sysUser.UserType
|
||||||
}
|
}
|
||||||
|
if sysUser.UserSource != "" {
|
||||||
|
params["user_source"] = sysUser.UserSource
|
||||||
|
}
|
||||||
if sysUser.Avatar != "" {
|
if sysUser.Avatar != "" {
|
||||||
params["avatar"] = sysUser.Avatar
|
params["avatar"] = sysUser.Avatar
|
||||||
}
|
}
|
||||||
@@ -582,6 +623,14 @@ func (r *SysUserImpl) CheckUniqueUser(sysUser model.SysUser) string {
|
|||||||
conditions = append(conditions, "email = ?")
|
conditions = append(conditions, "email = ?")
|
||||||
params = append(params, sysUser.Email)
|
params = append(params, sysUser.Email)
|
||||||
}
|
}
|
||||||
|
if sysUser.UserType != "" {
|
||||||
|
conditions = append(conditions, "user_type = ?")
|
||||||
|
params = append(params, sysUser.UserType)
|
||||||
|
}
|
||||||
|
if sysUser.UserSource != "" {
|
||||||
|
conditions = append(conditions, "user_source = ?")
|
||||||
|
params = append(params, sysUser.UserSource)
|
||||||
|
}
|
||||||
|
|
||||||
// 构建查询条件语句
|
// 构建查询条件语句
|
||||||
whereSql := ""
|
whereSql := ""
|
||||||
|
|||||||
95
src/modules/system/service/sys_login_source.go
Normal file
95
src/modules/system/service/sys_login_source.go
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"be.ems/src/framework/utils/generate"
|
||||||
|
"be.ems/src/modules/system/model"
|
||||||
|
"be.ems/src/modules/system/model/vo"
|
||||||
|
"be.ems/src/modules/system/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewSysLoginSource 实例化服务层
|
||||||
|
var NewSysLoginSource = &SysLoginSource{
|
||||||
|
sysLoginSourceRepository: repository.NewSysLoginSource,
|
||||||
|
}
|
||||||
|
|
||||||
|
// SysLoginSource 认证源 服务层处理
|
||||||
|
type SysLoginSource struct {
|
||||||
|
sysLoginSourceRepository *repository.SysLoginSource // 认证源表
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindByPage 分页查询
|
||||||
|
func (s SysLoginSource) FindByPage(query map[string]string) ([]model.SysLoginSource, int64) {
|
||||||
|
return s.sysLoginSourceRepository.SelectByPage(query)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindById 查询ID
|
||||||
|
func (s SysLoginSource) FindById(id int64) model.SysLoginSource {
|
||||||
|
rows := s.sysLoginSourceRepository.SelectByIds([]int64{id})
|
||||||
|
if len(rows) > 0 {
|
||||||
|
return rows[0]
|
||||||
|
}
|
||||||
|
return model.SysLoginSource{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert 新增
|
||||||
|
func (s SysLoginSource) Insert(param model.SysLoginSource) int64 {
|
||||||
|
param.UID = generate.Code(8)
|
||||||
|
return s.sysLoginSourceRepository.Insert(param)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update 更新
|
||||||
|
func (s SysLoginSource) Update(param model.SysLoginSource) int64 {
|
||||||
|
return s.sysLoginSourceRepository.Update(param)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteByIds 批量删除
|
||||||
|
func (s SysLoginSource) DeleteByIds(ids []int64) (int64, error) {
|
||||||
|
// 检查是否存在
|
||||||
|
arr := s.sysLoginSourceRepository.SelectByIds(ids)
|
||||||
|
if len(arr) <= 0 {
|
||||||
|
// return 0, fmt.Errorf("没有权限访问认证源数据!")
|
||||||
|
return 0, fmt.Errorf("no permission to access authentication source data")
|
||||||
|
}
|
||||||
|
if len(arr) == len(ids) {
|
||||||
|
return s.sysLoginSourceRepository.DeleteByIds(ids), nil
|
||||||
|
}
|
||||||
|
// return 0, fmt.Errorf("删除认证源信息失败!")
|
||||||
|
return 0, fmt.Errorf("failed to delete authentication source information")
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindByActive 查询激活
|
||||||
|
func (s SysLoginSource) FindByActive(uid string) []model.SysLoginSource {
|
||||||
|
param := model.SysLoginSource{
|
||||||
|
ActiveFlag: "1",
|
||||||
|
}
|
||||||
|
if uid != "" {
|
||||||
|
param.UID = uid
|
||||||
|
}
|
||||||
|
return s.sysLoginSourceRepository.Select(param)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CheckConfigJSON 检查配置JSON
|
||||||
|
func (s SysLoginSource) CheckConfigJSON(sType, sConfig string) (string, error) {
|
||||||
|
var source any
|
||||||
|
switch sType {
|
||||||
|
case "LDAP":
|
||||||
|
source = new(vo.SysLoginSourceLDAP)
|
||||||
|
case "SMTP":
|
||||||
|
source = new(vo.SysLoginSourceSMTP)
|
||||||
|
case "OAuth2":
|
||||||
|
source = new(vo.SysLoginSourceOAuth2)
|
||||||
|
default:
|
||||||
|
return "", fmt.Errorf("unsupported login source type: %s", sType)
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal([]byte(sConfig), &source); err != nil {
|
||||||
|
return "", fmt.Errorf("config json format error for %s type: %s", sType, err.Error())
|
||||||
|
}
|
||||||
|
configByte, err := json.Marshal(source)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("config json format error")
|
||||||
|
}
|
||||||
|
return string(configByte), nil
|
||||||
|
}
|
||||||
@@ -13,6 +13,11 @@ type ISysUser interface {
|
|||||||
// SelectAllocatedPage 根据条件分页查询分配用户角色列表
|
// SelectAllocatedPage 根据条件分页查询分配用户角色列表
|
||||||
SelectAllocatedPage(query map[string]any, dataScopeSQL string) map[string]any
|
SelectAllocatedPage(query map[string]any, dataScopeSQL string) map[string]any
|
||||||
|
|
||||||
|
// FindByUserName 通过用户名查询用户信息
|
||||||
|
// userType 系统sys
|
||||||
|
// userSource 系统#
|
||||||
|
FindByUserName(userName, userType, userSource string) model.SysUser
|
||||||
|
|
||||||
// SelectUserByUserName 通过用户名查询用户
|
// SelectUserByUserName 通过用户名查询用户
|
||||||
SelectUserByUserName(userName string) model.SysUser
|
SelectUserByUserName(userName string) model.SysUser
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ var NewSysUserImpl = &SysUserImpl{
|
|||||||
sysUserRepository: repository.NewSysUserImpl,
|
sysUserRepository: repository.NewSysUserImpl,
|
||||||
sysUserRoleRepository: repository.NewSysUserRoleImpl,
|
sysUserRoleRepository: repository.NewSysUserRoleImpl,
|
||||||
sysUserPostRepository: repository.NewSysUserPostImpl,
|
sysUserPostRepository: repository.NewSysUserPostImpl,
|
||||||
|
sysDeptRepository: repository.NewSysDeptImpl,
|
||||||
|
sysRoleRepository: repository.NewSysRoleImpl,
|
||||||
}
|
}
|
||||||
|
|
||||||
// SysUserImpl 用户 服务层处理
|
// SysUserImpl 用户 服务层处理
|
||||||
@@ -23,6 +25,10 @@ type SysUserImpl struct {
|
|||||||
sysUserRoleRepository repository.ISysUserRole
|
sysUserRoleRepository repository.ISysUserRole
|
||||||
// 用户与岗位服务
|
// 用户与岗位服务
|
||||||
sysUserPostRepository repository.ISysUserPost
|
sysUserPostRepository repository.ISysUserPost
|
||||||
|
// 部门服务
|
||||||
|
sysDeptRepository repository.ISysDept
|
||||||
|
// 角色服务
|
||||||
|
sysRoleRepository repository.ISysRole
|
||||||
}
|
}
|
||||||
|
|
||||||
// SelectUserPage 根据条件分页查询用户列表
|
// SelectUserPage 根据条件分页查询用户列表
|
||||||
@@ -40,6 +46,30 @@ func (r *SysUserImpl) SelectAllocatedPage(query map[string]any, dataScopeSQL str
|
|||||||
return r.sysUserRepository.SelectAllocatedPage(query, dataScopeSQL)
|
return r.sysUserRepository.SelectAllocatedPage(query, dataScopeSQL)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FindByUserName 通过用户名查询用户信息
|
||||||
|
// userType 系统sys
|
||||||
|
// userSource 系统#
|
||||||
|
func (s SysUserImpl) FindByUserName(userName, userType, userSource string) model.SysUser {
|
||||||
|
userinfo := s.sysUserRepository.SelectByUserName(userName, userType, userSource)
|
||||||
|
if userinfo.UserName != userName {
|
||||||
|
return userinfo
|
||||||
|
}
|
||||||
|
// 部门
|
||||||
|
deptInfo := s.sysDeptRepository.SelectById(userinfo.DeptID)
|
||||||
|
userinfo.Dept = deptInfo
|
||||||
|
// 角色
|
||||||
|
roleArr := s.sysRoleRepository.SelectByUserId(userinfo.UserID)
|
||||||
|
roles := make([]model.SysRole, 0)
|
||||||
|
roleIds := make([]string, 0)
|
||||||
|
for _, role := range roleArr {
|
||||||
|
roles = append(roles, role)
|
||||||
|
roleIds = append(roleIds, role.RoleID)
|
||||||
|
}
|
||||||
|
userinfo.Roles = roles
|
||||||
|
userinfo.RoleIDs = roleIds
|
||||||
|
return userinfo
|
||||||
|
}
|
||||||
|
|
||||||
// SelectUserByUserName 通过用户名查询用户
|
// SelectUserByUserName 通过用户名查询用户
|
||||||
func (r *SysUserImpl) SelectUserByUserName(userName string) model.SysUser {
|
func (r *SysUserImpl) SelectUserByUserName(userName string) model.SysUser {
|
||||||
return r.sysUserRepository.SelectUserByUserName(userName)
|
return r.sysUserRepository.SelectUserByUserName(userName)
|
||||||
@@ -147,7 +177,9 @@ func (r *SysUserImpl) DeleteUserByIds(userIds []string) (int64, error) {
|
|||||||
// CheckUniqueUserName 校验用户名称是否唯一
|
// CheckUniqueUserName 校验用户名称是否唯一
|
||||||
func (r *SysUserImpl) CheckUniqueUserName(userName, userId string) bool {
|
func (r *SysUserImpl) CheckUniqueUserName(userName, userId string) bool {
|
||||||
uniqueId := r.sysUserRepository.CheckUniqueUser(model.SysUser{
|
uniqueId := r.sysUserRepository.CheckUniqueUser(model.SysUser{
|
||||||
UserName: userName,
|
UserName: userName,
|
||||||
|
UserType: "System",
|
||||||
|
UserSource: "#",
|
||||||
})
|
})
|
||||||
if uniqueId == userId {
|
if uniqueId == userId {
|
||||||
return true
|
return true
|
||||||
@@ -159,6 +191,8 @@ func (r *SysUserImpl) CheckUniqueUserName(userName, userId string) bool {
|
|||||||
func (r *SysUserImpl) CheckUniquePhone(phonenumber, userId string) bool {
|
func (r *SysUserImpl) CheckUniquePhone(phonenumber, userId string) bool {
|
||||||
uniqueId := r.sysUserRepository.CheckUniqueUser(model.SysUser{
|
uniqueId := r.sysUserRepository.CheckUniqueUser(model.SysUser{
|
||||||
PhoneNumber: phonenumber,
|
PhoneNumber: phonenumber,
|
||||||
|
UserType: "System",
|
||||||
|
UserSource: "#",
|
||||||
})
|
})
|
||||||
if uniqueId == userId {
|
if uniqueId == userId {
|
||||||
return true
|
return true
|
||||||
@@ -169,7 +203,9 @@ func (r *SysUserImpl) CheckUniquePhone(phonenumber, userId string) bool {
|
|||||||
// CheckUniqueEmail 校验email是否唯一
|
// CheckUniqueEmail 校验email是否唯一
|
||||||
func (r *SysUserImpl) CheckUniqueEmail(email, userId string) bool {
|
func (r *SysUserImpl) CheckUniqueEmail(email, userId string) bool {
|
||||||
uniqueId := r.sysUserRepository.CheckUniqueUser(model.SysUser{
|
uniqueId := r.sysUserRepository.CheckUniqueUser(model.SysUser{
|
||||||
Email: email,
|
Email: email,
|
||||||
|
UserType: "System",
|
||||||
|
UserSource: "#",
|
||||||
})
|
})
|
||||||
if uniqueId == userId {
|
if uniqueId == userId {
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -472,6 +472,35 @@ func Setup(router *gin.Engine) {
|
|||||||
controller.NewSysLogLogin.Export,
|
controller.NewSysLogLogin.Export,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 第三方认证-配置认证源
|
||||||
|
sysLoginSource := controller.NewSysLoginSource
|
||||||
|
sysLoginSourceGroup := router.Group("/system/login-source")
|
||||||
|
{
|
||||||
|
sysLoginSourceGroup.GET("/list",
|
||||||
|
middleware.PreAuthorize(map[string][]string{"hasRoles": {"admin"}, "hasPerms": {"system:loginSource:list"}}),
|
||||||
|
sysLoginSource.List,
|
||||||
|
)
|
||||||
|
sysLoginSourceGroup.GET("/:id",
|
||||||
|
middleware.PreAuthorize(map[string][]string{"hasRoles": {"admin"}, "hasPerms": {"system:loginSource:query"}}),
|
||||||
|
sysLoginSource.Info,
|
||||||
|
)
|
||||||
|
sysLoginSourceGroup.POST("",
|
||||||
|
middleware.PreAuthorize(map[string][]string{"hasRoles": {"admin"}, "hasPerms": {"system:loginSource:add"}}),
|
||||||
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysLoginSource", collectlogs.BUSINESS_TYPE_INSERT)),
|
||||||
|
sysLoginSource.Add,
|
||||||
|
)
|
||||||
|
sysLoginSourceGroup.PUT("",
|
||||||
|
middleware.PreAuthorize(map[string][]string{"hasRoles": {"admin"}, "hasPerms": {"system:loginSource:edit"}}),
|
||||||
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysLoginSource", collectlogs.BUSINESS_TYPE_UPDATE)),
|
||||||
|
sysLoginSource.Edit,
|
||||||
|
)
|
||||||
|
sysLoginSourceGroup.DELETE("/:id",
|
||||||
|
middleware.PreAuthorize(map[string][]string{"hasRoles": {"admin"}, "hasPerms": {"system:loginSource:remove"}}),
|
||||||
|
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.sysLoginSource", collectlogs.BUSINESS_TYPE_DELETE)),
|
||||||
|
sysLoginSource.Remove,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitLoad 初始参数
|
// InitLoad 初始参数
|
||||||
|
|||||||
Reference in New Issue
Block a user