From 9e57c145d1198ac539eff02e4aead063bc3bee59 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 12 Aug 2025 10:12:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E7=99=BB=E5=BD=95=E8=AE=A4=E8=AF=81=E5=92=8C=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/database/lite/common/mml_command.sql | 8 - build/database/lite/install/cbc_message.sql | 34 +-- build/database/lite/install/sys_dict_data.sql | 4 + build/database/lite/install/sys_dict_type.sql | 1 + build/database/lite/install/sys_i18n.sql | 44 ++-- .../lite/install/sys_login_source.sql | 33 +++ build/database/lite/install/sys_menu.sql | 5 + build/database/lite/install/sys_role_menu.sql | 44 ++-- build/database/lite/install/sys_user.sql | 10 +- .../database/lite/upgrade/upg_cbc_message.sql | 31 ++- .../lite/upgrade/upg_sys_dict_data.sql | 4 + .../lite/upgrade/upg_sys_dict_type.sql | 54 +++++ build/database/lite/upgrade/upg_sys_i18n.sql | 44 ++-- .../lite/upgrade/upg_sys_login_source.sql | 32 +++ build/database/lite/upgrade/upg_sys_menu.sql | 5 + .../lite/upgrade/upg_sys_role_menu.sql | 45 ++-- build/database/lite/upgrade/upg_sys_user.sql | 46 ++++ build/database/std/common/mml_command.sql | 26 +-- build/database/std/install/cbc_message.sql | 44 +--- build/database/std/install/sys_dict_data.sql | 4 + build/database/std/install/sys_dict_type.sql | 1 + build/database/std/install/sys_i18n.sql | 8 + .../database/std/install/sys_login_source.sql | 24 ++ build/database/std/install/sys_menu.sql | 5 + build/database/std/install/sys_role_menu.sql | 50 ++--- build/database/std/install/sys_user.sql | 18 +- .../database/std/upgrade/upg_cbc_message.sql | 44 +--- .../std/upgrade/upg_sys_dict_data.sql | 4 + .../std/upgrade/upg_sys_dict_type.sql | 1 + build/database/std/upgrade/upg_sys_i18n.sql | 8 + .../std/upgrade/upg_sys_login_source.sql | 23 ++ build/database/std/upgrade/upg_sys_menu.sql | 5 + .../std/upgrade/upg_sys_role_menu.sql | 51 ++--- build/database/std/upgrade/upg_sys_user.sql | 20 +- src/modules/auth/auth.go | 62 +++++- src/modules/auth/controller/account.go | 172 +-------------- src/modules/auth/controller/account_info.go | 93 ++++++++ src/modules/auth/controller/account_ldap.go | 80 +++++++ src/modules/auth/controller/account_oauth2.go | 107 +++++++++ src/modules/auth/controller/account_smtp.go | 80 +++++++ src/modules/auth/controller/account_system.go | 104 +++++++++ src/modules/auth/model/login_body.go | 15 +- src/modules/auth/model/login_source_vo.go | 22 ++ src/modules/auth/model/register_body.go | 23 +- src/modules/auth/service/account.go | 205 ++++-------------- src/modules/auth/service/account_info.go | 36 +++ src/modules/auth/service/account_ldap.go | 108 +++++++++ src/modules/auth/service/account_oauth2.go | 168 ++++++++++++++ src/modules/auth/service/account_smtp.go | 88 ++++++++ src/modules/auth/service/account_sysstem.go | 138 ++++++++++++ src/modules/auth/service/register.go | 10 +- .../controller/sys_login_source.go} | 107 +++++---- src/modules/system/controller/sys_user.go | 33 ++- src/modules/system/model/sys_login_source.go | 22 ++ src/modules/system/model/sys_user.go | 2 + src/modules/system/model/vo/login_source.go | 28 +++ .../system/repository/sys_login_source.go | 150 +++++++++++++ src/modules/system/repository/sys_menu.go | 10 +- src/modules/system/repository/sys_user.go | 22 +- .../system/service/sys_login_source.go | 95 ++++++++ src/modules/system/service/sys_user.go | 18 +- src/modules/system/system.go | 29 +++ 62 files changed, 2086 insertions(+), 721 deletions(-) create mode 100644 build/database/lite/install/sys_login_source.sql create mode 100644 build/database/lite/upgrade/upg_sys_dict_type.sql create mode 100644 build/database/lite/upgrade/upg_sys_login_source.sql create mode 100644 build/database/lite/upgrade/upg_sys_user.sql create mode 100644 build/database/std/install/sys_login_source.sql create mode 100644 build/database/std/upgrade/upg_sys_login_source.sql create mode 100644 src/modules/auth/controller/account_info.go create mode 100644 src/modules/auth/controller/account_ldap.go create mode 100644 src/modules/auth/controller/account_oauth2.go create mode 100644 src/modules/auth/controller/account_smtp.go create mode 100644 src/modules/auth/controller/account_system.go create mode 100644 src/modules/auth/model/login_source_vo.go create mode 100644 src/modules/auth/service/account_info.go create mode 100644 src/modules/auth/service/account_ldap.go create mode 100644 src/modules/auth/service/account_oauth2.go create mode 100644 src/modules/auth/service/account_smtp.go create mode 100644 src/modules/auth/service/account_sysstem.go rename src/modules/{oauth2/controller/oauth2_client.go => system/controller/sys_login_source.go} (51%) create mode 100644 src/modules/system/model/sys_login_source.go create mode 100644 src/modules/system/model/vo/login_source.go create mode 100644 src/modules/system/repository/sys_login_source.go create mode 100644 src/modules/system/service/sys_login_source.go diff --git a/build/database/lite/common/mml_command.sql b/build/database/lite/common/mml_command.sql index 0a21cf1e..c87dafd8 100644 --- a/build/database/lite/common/mml_command.sql +++ b/build/database/lite/common/mml_command.sql @@ -15,14 +15,6 @@ CREATE TABLE "mml_command" ( PRIMARY KEY ("id") ); --- ---------------------------- --- Indexes structure for table mml_command --- ---------------------------- -CREATE INDEX "id" -ON "mml_command" ( - "id" ASC -); - -- ---------------------------- -- Records of mml_command -- ---------------------------- diff --git a/build/database/lite/install/cbc_message.sql b/build/database/lite/install/cbc_message.sql index 4f6d38c6..956983db 100755 --- a/build/database/lite/install/cbc_message.sql +++ b/build/database/lite/install/cbc_message.sql @@ -1,21 +1,25 @@ -- ---------------------------- -- Table structure for cbc_message -- ---------------------------- --- ---------------------------- --- Table structure for cbc_message --- ---------------------------- DROP TABLE IF EXISTS `cbc_message`; -CREATE TABLE `cbc_message` ( - `id` INTEGER PRIMARY KEY AUTOINCREMENT, - `ne_type` TEXT, - `ne_id` TEXT, - `message_json` TEXT, - `status` TEXT DEFAULT 'INACTIVE' CHECK(`status` IN ('ACTIVE', 'INACTIVE')), - `detail` TEXT, - `created_at` INTEGER, - `updated_at` INTEGER +CREATE TABLE "cbc_message" ( + "id" integer NOT NULL, + "ne_type" text(32), + "ne_id" text(32), + "message_json" text(10240), + "status" text(32), + "detail" text(255), + "created_at" integer, + "updated_at" integer, + PRIMARY KEY ("id") ); --- Create indexes -CREATE INDEX `idx_id` ON `cbc_message`(`id`); -CREATE INDEX `idx_ne_time` ON `cbc_message`(`ne_type`, `ne_id`, `created_at`); +-- ---------------------------- +-- Indexes structure for table cbc_message +-- ---------------------------- +CREATE INDEX "idx_cbcm_ne_time" +ON "cbc_message" ( + "ne_type" ASC, + "ne_id" ASC, + "created_at" ASC +); diff --git a/build/database/lite/install/sys_dict_data.sql b/build/database/lite/install/sys_dict_data.sql index 6833a738..c879e3eb 100644 --- a/build/database/lite/install/sys_dict_data.sql +++ b/build/database/lite/install/sys_dict_data.sql @@ -192,4 +192,8 @@ INSERT INTO "sys_dict_data" VALUES (166, 'cdr_sip_code_cause', 'dictData.cdr_sip INSERT INTO "sys_dict_data" VALUES (167, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.606', '606', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (168, 'trace_interfaces', 'dictData.trace_interfaces.14', 'N14', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_data" VALUES (169, 'trace_interfaces', 'dictData.trace_interfaces.5', 'N5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (170, 'sys_user_type', 'dictData.sys_user_type.system', 'System', 1, '', 'default', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO "sys_dict_data" VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); diff --git a/build/database/lite/install/sys_dict_type.sql b/build/database/lite/install/sys_dict_type.sql index 30bb5f99..39b564de 100644 --- a/build/database/lite/install/sys_dict_type.sql +++ b/build/database/lite/install/sys_dict_type.sql @@ -27,6 +27,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', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_yes_no_remark'); INSERT INTO "sys_dict_type" VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_oper_type_remark'); INSERT INTO "sys_dict_type" VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_common_status_remark'); +INSERT INTO "sys_dict_type" VALUES (11, 'dictType.sys_user_type', 'sys_user_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO "sys_dict_type" VALUES (50, 'dictType.trace_type', 'trace_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.trace_type_remark'); INSERT INTO "sys_dict_type" VALUES (51, 'dictType.alarm_status', 'alarm_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.alarm_status_remark'); INSERT INTO "sys_dict_type" VALUES (52, 'dictType.ne_version_status', 'ne_version_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.ne_version_status_remark'); diff --git a/build/database/lite/install/sys_i18n.sql b/build/database/lite/install/sys_i18n.sql index 95ce5ffb..2e440a15 100644 --- a/build/database/lite/install/sys_i18n.sql +++ b/build/database/lite/install/sys_i18n.sql @@ -933,22 +933,30 @@ INSERT INTO "sys_i18n" VALUES (757, 'dictData.trace_interfaces.5', 'N5', 'N5'); INSERT INTO "sys_i18n" VALUES (758, "alarm.export.alarmCode", "告警编码", "Alarm Code"); INSERT INTO "sys_i18n" VALUES (759, "config.sys.user.fristPasswdChangeRemark", "关闭改为false 开启改为true, 建议同时设置密码有效期", "Off to false On to true, it is recommended to set the password expiration date at the same time."); INSERT INTO "sys_i18n" VALUES (760, "menu.perf.kpiIMSOverview", "语音数据概览", "Voice Data Overview"); +INSERT INTO "sys_i18n" VALUES (761, "dictType.sys_user_type", "用户类型", "User Type"); +INSERT INTO "sys_i18n" VALUES (762, "dictData.sys_user_type.system", "系统", "System"); +INSERT INTO "sys_i18n" VALUES (763, "dictData.sys_user_type.ldap", "LDAP", "LDAP"); +INSERT INTO "sys_i18n" VALUES (764, "dictData.sys_user_type.smtp", "SMTP", "SMTP"); +INSERT INTO "sys_i18n" VALUES (765, "dictData.sys_user_type.oauth2", "OAuth2", "OAuth2"); +INSERT INTO "sys_i18n" VALUES (766, "user.export.userType", "用户类型", "User Type"); +INSERT INTO "sys_i18n" VALUES (767, "menu.system.loginSource", "第三方登录认证", "Third Party Login Source"); +INSERT INTO "sys_i18n" VALUES (768, "log.operate.title.sysLoginSource", "认证源", "Login Source"); -INSERT INTO `sys_i18n` VALUES (2000, 'menu.psap.agent', '座席', 'Agent'); -INSERT INTO `sys_i18n` VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information'); -INSERT INTO `sys_i18n` VALUES (2002, 'menu.psap.agent.callback', '回拨管理', 'Callback Management'); -INSERT INTO `sys_i18n` VALUES (2003, 'callback.status.NEW', '新建', 'New'); -INSERT INTO `sys_i18n` VALUES (2004, 'callback.status.IN_PROGRESS', '处理中', 'In Progress'); -INSERT INTO `sys_i18n` VALUES (2005, 'callback.status.NO_ANSWER_1', '未应答1', 'No Answer 1'); -INSERT INTO `sys_i18n` VALUES (2006, 'callback.status.NO_ANSWER_2', '未应答2', 'No Answer 2'); -INSERT INTO `sys_i18n` VALUES (2007, 'callback.status.TIMEOUT', '超时', 'Timeout'); -INSERT INTO `sys_i18n` VALUES (2008, 'callback.status.PENDING', '挂起', 'Pending'); -INSERT INTO `sys_i18n` VALUES (2009, 'callback.status.CLOSED', '关闭', 'Closed'); -INSERT INTO `sys_i18n` VALUES (2010, 'job.export.cdr.mf', '定期导出MF话单', 'Periodic Export of MF Call Records'); -INSERT INTO `sys_i18n` VALUES (2011, 'job.psap.ticket.monitor', '回拨工单监控', 'Callback Ticket Monitoring'); -INSERT INTO `sys_i18n` VALUES (2012, 'menu.omc.cdr', '话单', 'Call Records'); -INSERT INTO `sys_i18n` VALUES (2013, 'menu.omc.cdr.mf', '紧急呼叫话单', 'Emergency Call Records'); -INSERT INTO `sys_i18n` VALUES (2014, 'menu.omc.cdr.crbt', '彩铃话单', 'Color Ring Back Tone Records'); -INSERT INTO `sys_i18n` VALUES (2015, 'menu.omc.cdr.mms', '彩信话单', 'Multimedia Message Service Records'); -INSERT INTO `sys_i18n` VALUES (2016, 'menu.ue.cbc.cbe', '预警广播', 'Early Warning Broadcast'); -INSERT INTO `sys_i18n` VALUES (2017, 'log.operate.title.cbcMessage', '预警广播', 'Early Warning Broadcast'); +INSERT INTO "sys_i18n" VALUES (2000, 'menu.psap.agent', '座席', 'Agent'); +INSERT INTO "sys_i18n" VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information'); +INSERT INTO "sys_i18n" VALUES (2002, 'menu.psap.agent.callback', '回拨管理', 'Callback Management'); +INSERT INTO "sys_i18n" VALUES (2003, 'callback.status.NEW', '新建', 'New'); +INSERT INTO "sys_i18n" VALUES (2004, 'callback.status.IN_PROGRESS', '处理中', 'In Progress'); +INSERT INTO "sys_i18n" VALUES (2005, 'callback.status.NO_ANSWER_1', '未应答1', 'No Answer 1'); +INSERT INTO "sys_i18n" VALUES (2006, 'callback.status.NO_ANSWER_2', '未应答2', 'No Answer 2'); +INSERT INTO "sys_i18n" VALUES (2007, 'callback.status.TIMEOUT', '超时', 'Timeout'); +INSERT INTO "sys_i18n" VALUES (2008, 'callback.status.PENDING', '挂起', 'Pending'); +INSERT INTO "sys_i18n" VALUES (2009, 'callback.status.CLOSED', '关闭', 'Closed'); +INSERT INTO "sys_i18n" VALUES (2010, 'job.export.cdr.mf', '定期导出MF话单', 'Periodic Export of MF Call Records'); +INSERT INTO "sys_i18n" VALUES (2011, 'job.psap.ticket.monitor', '回拨工单监控', 'Callback Ticket Monitoring'); +INSERT INTO "sys_i18n" VALUES (2012, 'menu.omc.cdr', '话单', 'Call Records'); +INSERT INTO "sys_i18n" VALUES (2013, 'menu.omc.cdr.mf', '紧急呼叫话单', 'Emergency Call Records'); +INSERT INTO "sys_i18n" VALUES (2014, 'menu.omc.cdr.crbt', '彩铃话单', 'Color Ring Back Tone Records'); +INSERT INTO "sys_i18n" VALUES (2015, 'menu.omc.cdr.mms', '彩信话单', 'Multimedia Message Service Records'); +INSERT INTO "sys_i18n" VALUES (2016, 'menu.ue.cbc.cbe', '预警广播', 'Early Warning Broadcast'); +INSERT INTO "sys_i18n" VALUES (2017, 'log.operate.title.cbcMessage', '预警广播', 'Early Warning Broadcast'); diff --git a/build/database/lite/install/sys_login_source.sql b/build/database/lite/install/sys_login_source.sql new file mode 100644 index 00000000..fd9c6e99 --- /dev/null +++ b/build/database/lite/install/sys_login_source.sql @@ -0,0 +1,33 @@ +-- ---------------------------- +-- Table structure for sys_login_source +-- ---------------------------- +DROP TABLE IF EXISTS "sys_login_source"; +CREATE TABLE "sys_login_source" ( + "id" integer NOT NULL, + "uid" text(32), + "type" text(32), + "name" text(64), + "icon" text(255), + "active_flag" text(1), + "sync_flag" text(1), + "config" text, + "create_by" text(64), + "create_time" integer, + "update_by" text(64), + "update_time" integer, + "remark" text(500), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Indexes structure for table sys_login_source +-- ---------------------------- +CREATE INDEX "idx_ls_type_name" +ON "sys_login_source" ( + "type" ASC, + "name" ASC +); + +-- ---------------------------- +-- Records of sys_login_source +-- ---------------------------- diff --git a/build/database/lite/install/sys_menu.sql b/build/database/lite/install/sys_menu.sql index 3e7e61d2..fd8bd697 100644 --- a/build/database/lite/install/sys_menu.sql +++ b/build/database/lite/install/sys_menu.sql @@ -47,6 +47,7 @@ INSERT INTO "sys_menu" VALUES (105, 'menu.security.post', 2113, 6, 'post', 'syst INSERT INTO "sys_menu" VALUES (106, 'menu.system.dictType', 1, 30, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.dictTypeRemark'); INSERT INTO "sys_menu" VALUES (107, 'menu.system.dictData', 1, 31, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.dictDataRemark'); INSERT INTO "sys_menu" VALUES (108, 'menu.system.paramSet', 1, 59, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (111, 'menu.system.systemLog', 1, 11, 'log', '', '1', '1', 'D', '0', '0', '', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.cacheInfoRemark'); @@ -109,6 +110,10 @@ INSERT INTO "sys_menu" VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', ' INSERT INTO "sys_menu" VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (1057, 'menu.common.query', 109, 1, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:query', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (1058, 'menu.common.add', 109, 2, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:add', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (1059, 'menu.common.edit', 109, 3, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:edit', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO "sys_menu" VALUES (1060, 'menu.common.delete', 109, 4, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); INSERT INTO "sys_menu" VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); diff --git a/build/database/lite/install/sys_role_menu.sql b/build/database/lite/install/sys_role_menu.sql index 15dc94cf..127372ce 100644 --- a/build/database/lite/install/sys_role_menu.sql +++ b/build/database/lite/install/sys_role_menu.sql @@ -3,8 +3,8 @@ -- ---------------------------- DROP TABLE IF EXISTS "sys_role_menu"; CREATE TABLE "sys_role_menu" ( - "role_id" integer(20) NOT NULL, - "menu_id" integer(20) NOT NULL, + "role_id" integer NOT NULL, + "menu_id" integer NOT NULL, PRIMARY KEY ("role_id", "menu_id") ); @@ -27,6 +27,7 @@ INSERT INTO "sys_role_menu" VALUES (2, 103); INSERT INTO "sys_role_menu" VALUES (2, 104); INSERT INTO "sys_role_menu" VALUES (2, 105); INSERT INTO "sys_role_menu" VALUES (2, 108); +INSERT INTO "sys_role_menu" VALUES (2, 109); INSERT INTO "sys_role_menu" VALUES (2, 111); INSERT INTO "sys_role_menu" VALUES (2, 112); INSERT INTO "sys_role_menu" VALUES (2, 115); @@ -63,10 +64,8 @@ INSERT INTO "sys_role_menu" VALUES (2, 1030); INSERT INTO "sys_role_menu" VALUES (2, 1032); INSERT INTO "sys_role_menu" VALUES (2, 1034); INSERT INTO "sys_role_menu" VALUES (2, 1039); -INSERT INTO "sys_role_menu" VALUES (2, 1040); INSERT INTO "sys_role_menu" VALUES (2, 1041); INSERT INTO "sys_role_menu" VALUES (2, 1042); -INSERT INTO "sys_role_menu" VALUES (2, 1043); INSERT INTO "sys_role_menu" VALUES (2, 1044); INSERT INTO "sys_role_menu" VALUES (2, 1045); INSERT INTO "sys_role_menu" VALUES (2, 1048); @@ -78,6 +77,10 @@ INSERT INTO "sys_role_menu" VALUES (2, 1053); INSERT INTO "sys_role_menu" VALUES (2, 1054); INSERT INTO "sys_role_menu" VALUES (2, 1055); INSERT INTO "sys_role_menu" VALUES (2, 1056); +INSERT INTO "sys_role_menu" VALUES (2, 1057); +INSERT INTO "sys_role_menu" VALUES (2, 1058); +INSERT INTO "sys_role_menu" VALUES (2, 1059); +INSERT INTO "sys_role_menu" VALUES (2, 1060); INSERT INTO "sys_role_menu" VALUES (2, 2000); INSERT INTO "sys_role_menu" VALUES (2, 2001); INSERT INTO "sys_role_menu" VALUES (2, 2002); @@ -168,7 +171,6 @@ INSERT INTO "sys_role_menu" VALUES (3, 65); INSERT INTO "sys_role_menu" VALUES (3, 66); INSERT INTO "sys_role_menu" VALUES (3, 108); INSERT INTO "sys_role_menu" VALUES (3, 112); -INSERT INTO "sys_role_menu" VALUES (3, 115); INSERT INTO "sys_role_menu" VALUES (3, 500); INSERT INTO "sys_role_menu" VALUES (3, 501); INSERT INTO "sys_role_menu" VALUES (3, 1030); @@ -176,7 +178,6 @@ INSERT INTO "sys_role_menu" VALUES (3, 1032); INSERT INTO "sys_role_menu" VALUES (3, 1034); INSERT INTO "sys_role_menu" VALUES (3, 1039); INSERT INTO "sys_role_menu" VALUES (3, 1042); -INSERT INTO "sys_role_menu" VALUES (3, 1048); INSERT INTO "sys_role_menu" VALUES (3, 2000); INSERT INTO "sys_role_menu" VALUES (3, 2001); INSERT INTO "sys_role_menu" VALUES (3, 2002); @@ -189,6 +190,7 @@ INSERT INTO "sys_role_menu" VALUES (3, 2009); INSERT INTO "sys_role_menu" VALUES (3, 2010); INSERT INTO "sys_role_menu" VALUES (3, 2011); INSERT INTO "sys_role_menu" VALUES (3, 2083); +INSERT INTO "sys_role_menu" VALUES (3, 2084); INSERT INTO "sys_role_menu" VALUES (3, 2086); INSERT INTO "sys_role_menu" VALUES (3, 2087); INSERT INTO "sys_role_menu" VALUES (3, 2088); @@ -200,10 +202,12 @@ INSERT INTO "sys_role_menu" VALUES (3, 2097); INSERT INTO "sys_role_menu" VALUES (3, 2107); INSERT INTO "sys_role_menu" VALUES (3, 2108); INSERT INTO "sys_role_menu" VALUES (3, 2109); -INSERT INTO "sys_role_menu" VALUES (3, 2113); +INSERT INTO "sys_role_menu" VALUES (3, 2112); INSERT INTO "sys_role_menu" VALUES (3, 2114); INSERT INTO "sys_role_menu" VALUES (3, 2115); INSERT INTO "sys_role_menu" VALUES (3, 2116); +INSERT INTO "sys_role_menu" VALUES (3, 2118); +INSERT INTO "sys_role_menu" VALUES (3, 2122); INSERT INTO "sys_role_menu" VALUES (3, 2123); INSERT INTO "sys_role_menu" VALUES (3, 2126); INSERT INTO "sys_role_menu" VALUES (3, 2128); @@ -224,11 +228,10 @@ INSERT INTO "sys_role_menu" VALUES (3, 2149); INSERT INTO "sys_role_menu" VALUES (3, 2151); INSERT INTO "sys_role_menu" VALUES (3, 2152); INSERT INTO "sys_role_menu" VALUES (3, 2153); -INSERT INTO "sys_role_menu" VALUES (3, 2154); -INSERT INTO "sys_role_menu" VALUES (3, 2155); -INSERT INTO "sys_role_menu" VALUES (3, 2156); INSERT INTO "sys_role_menu" VALUES (3, 2157); INSERT INTO "sys_role_menu" VALUES (3, 2158); +INSERT INTO "sys_role_menu" VALUES (3, 2162); +INSERT INTO "sys_role_menu" VALUES (3, 2163); INSERT INTO "sys_role_menu" VALUES (3, 2165); INSERT INTO "sys_role_menu" VALUES (3, 2166); INSERT INTO "sys_role_menu" VALUES (3, 2167); @@ -238,9 +241,6 @@ INSERT INTO "sys_role_menu" VALUES (3, 20000); INSERT INTO "sys_role_menu" VALUES (4, 1); INSERT INTO "sys_role_menu" VALUES (4, 4); -INSERT INTO "sys_role_menu" VALUES (4, 60); -INSERT INTO "sys_role_menu" VALUES (4, 65); -INSERT INTO "sys_role_menu" VALUES (4, 66); INSERT INTO "sys_role_menu" VALUES (4, 112); INSERT INTO "sys_role_menu" VALUES (4, 115); INSERT INTO "sys_role_menu" VALUES (4, 500); @@ -250,17 +250,18 @@ INSERT INTO "sys_role_menu" VALUES (4, 1041); INSERT INTO "sys_role_menu" VALUES (4, 1042); INSERT INTO "sys_role_menu" VALUES (4, 1044); INSERT INTO "sys_role_menu" VALUES (4, 1048); -INSERT INTO "sys_role_menu" VALUES (4, 2083); -INSERT INTO "sys_role_menu" VALUES (4, 2086); INSERT INTO "sys_role_menu" VALUES (4, 2087); INSERT INTO "sys_role_menu" VALUES (4, 2088); INSERT INTO "sys_role_menu" VALUES (4, 2089); +INSERT INTO "sys_role_menu" VALUES (4, 2091); INSERT INTO "sys_role_menu" VALUES (4, 2092); INSERT INTO "sys_role_menu" VALUES (4, 2094); INSERT INTO "sys_role_menu" VALUES (4, 2097); +INSERT INTO "sys_role_menu" VALUES (4, 2112); INSERT INTO "sys_role_menu" VALUES (4, 2113); -INSERT INTO "sys_role_menu" VALUES (4, 2114); +INSERT INTO "sys_role_menu" VALUES (4, 2115); INSERT INTO "sys_role_menu" VALUES (4, 2116); +INSERT INTO "sys_role_menu" VALUES (4, 2123); INSERT INTO "sys_role_menu" VALUES (4, 2126); INSERT INTO "sys_role_menu" VALUES (4, 2128); INSERT INTO "sys_role_menu" VALUES (4, 2129); @@ -274,11 +275,7 @@ INSERT INTO "sys_role_menu" VALUES (4, 2141); INSERT INTO "sys_role_menu" VALUES (4, 2147); INSERT INTO "sys_role_menu" VALUES (4, 2148); INSERT INTO "sys_role_menu" VALUES (4, 2149); -INSERT INTO "sys_role_menu" VALUES (4, 2151); -INSERT INTO "sys_role_menu" VALUES (4, 2152); -INSERT INTO "sys_role_menu" VALUES (4, 2153); INSERT INTO "sys_role_menu" VALUES (4, 2157); -INSERT INTO "sys_role_menu" VALUES (4, 2163); INSERT INTO "sys_role_menu" VALUES (4, 2165); INSERT INTO "sys_role_menu" VALUES (4, 2166); INSERT INTO "sys_role_menu" VALUES (4, 2167); @@ -290,6 +287,13 @@ INSERT INTO "sys_role_menu" VALUES (5, 4); INSERT INTO "sys_role_menu" VALUES (5, 112); INSERT INTO "sys_role_menu" VALUES (5, 2087); INSERT INTO "sys_role_menu" VALUES (5, 2115); +INSERT INTO "sys_role_menu" VALUES (5, 2126); +INSERT INTO "sys_role_menu" VALUES (5, 2128); +INSERT INTO "sys_role_menu" VALUES (5, 2130); INSERT INTO "sys_role_menu" VALUES (5, 2131); INSERT INTO "sys_role_menu" VALUES (5, 2132); INSERT INTO "sys_role_menu" VALUES (5, 2165); +INSERT INTO "sys_role_menu" VALUES (5, 2166); +INSERT INTO "sys_role_menu" VALUES (5, 2167); +INSERT INTO "sys_role_menu" VALUES (5, 2168); +INSERT INTO "sys_role_menu" VALUES (5, 2169); diff --git a/build/database/lite/install/sys_user.sql b/build/database/lite/install/sys_user.sql index 077b217e..2e185d3b 100644 --- a/build/database/lite/install/sys_user.sql +++ b/build/database/lite/install/sys_user.sql @@ -12,6 +12,8 @@ CREATE TABLE "sys_user" ( "sex" text(1), "avatar" text(255), "password" text(128), + "user_type" text(20), + "user_source" text(32), "status_flag" text(1), "del_flag" text(1), "password_update_time" integer, @@ -29,7 +31,7 @@ CREATE TABLE "sys_user" ( -- ---------------------------- -- Records of sys_user -- ---------------------------- -INSERT INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); diff --git a/build/database/lite/upgrade/upg_cbc_message.sql b/build/database/lite/upgrade/upg_cbc_message.sql index 251d96d5..b2a1924d 100755 --- a/build/database/lite/upgrade/upg_cbc_message.sql +++ b/build/database/lite/upgrade/upg_cbc_message.sql @@ -1,17 +1,24 @@ -- ---------------------------- -- Table structure for cbc_message -- ---------------------------- -CREATE TABLE IF NOT EXISTS `cbc_message` ( - `id` INTEGER PRIMARY KEY AUTOINCREMENT, - `ne_type` TEXT, - `ne_id` TEXT, - `message_json` TEXT, - `status` TEXT DEFAULT 'INACTIVE' CHECK(`status` IN ('ACTIVE', 'INACTIVE')), - `detail` TEXT, - `created_at` INTEGER, - `updated_at` INTEGER +CREATE TABLE IF NOT EXISTS "cbc_message" ( + "id" integer NOT NULL, + "ne_type" text(32), + "ne_id" text(32), + "message_json" text(10240), + "status" text(32), + "detail" text(255), + "created_at" integer, + "updated_at" integer, + PRIMARY KEY ("id") ); --- Create indexes -CREATE INDEX IF NOT EXISTS `idx_id` ON `cbc_message`(`id`); -CREATE INDEX IF NOT EXISTS `idx_ne_time` ON `cbc_message`(`ne_type`, `ne_id`, `created_at`); +-- ---------------------------- +-- Indexes structure for table cbc_message +-- ---------------------------- +CREATE INDEX IF NOT EXISTS "idx_cbcm_ne_time" +ON "cbc_message" ( + "ne_type" ASC, + "ne_id" ASC, + "created_at" ASC +); diff --git a/build/database/lite/upgrade/upg_sys_dict_data.sql b/build/database/lite/upgrade/upg_sys_dict_data.sql index 21634cef..aae60d22 100644 --- a/build/database/lite/upgrade/upg_sys_dict_data.sql +++ b/build/database/lite/upgrade/upg_sys_dict_data.sql @@ -191,4 +191,8 @@ REPLACE INTO "sys_dict_data" VALUES (166, 'cdr_sip_code_cause', 'dictData.cdr_si REPLACE INTO "sys_dict_data" VALUES (167, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.606', '606', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO "sys_dict_data" VALUES (168, 'trace_interfaces', 'dictData.trace_interfaces.14', 'N14', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO "sys_dict_data" VALUES (169, 'trace_interfaces', 'dictData.trace_interfaces.5', 'N5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (170, 'sys_user_type', 'dictData.sys_user_type.system', 'System', 1, '', 'default', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_data" VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); diff --git a/build/database/lite/upgrade/upg_sys_dict_type.sql b/build/database/lite/upgrade/upg_sys_dict_type.sql new file mode 100644 index 00000000..dca3cac3 --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_dict_type.sql @@ -0,0 +1,54 @@ +-- ---------------------------- +-- Table structure for sys_dict_type +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "sys_dict_type" ( + "dict_id" integer NOT NULL, + "dict_name" text(64) NOT NULL, + "dict_type" text(64) NOT NULL, + "status_flag" text(1), + "del_flag" text(1), + "create_by" text(64), + "create_time" integer(20), + "update_by" text(64), + "update_time" integer(20), + "remark" text(500), + PRIMARY KEY ("dict_id") +); + +-- ---------------------------- +-- Records of sys_dict_type +-- ---------------------------- +REPLACE INTO "sys_dict_type" VALUES (1, 'dictType.sys_user_sex', 'sys_user_sex', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_user_sex_remark'); +REPLACE INTO "sys_dict_type" VALUES (2, 'dictType.sys_show_hide', 'sys_show_hide', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_show_hide_remark'); +REPLACE INTO "sys_dict_type" VALUES (3, 'dictType.sys_normal_disable', 'sys_normal_disable', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_normal_disable_remark'); +REPLACE INTO "sys_dict_type" VALUES (4, 'dictType.sys_job_status', 'sys_job_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_job_status_remark'); +REPLACE INTO "sys_dict_type" VALUES (5, 'dictType.sys_job_group', 'sys_job_group', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_job_group_remark'); +REPLACE INTO "sys_dict_type" VALUES (6, 'dictType.sys_yes_no', 'sys_yes_no', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_yes_no_remark'); +REPLACE INTO "sys_dict_type" VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_oper_type_remark'); +REPLACE INTO "sys_dict_type" VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_common_status_remark'); +REPLACE INTO "sys_dict_type" VALUES (11, 'dictType.sys_user_type', 'sys_user_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (50, 'dictType.trace_type', 'trace_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.trace_type_remark'); +REPLACE INTO "sys_dict_type" VALUES (51, 'dictType.alarm_status', 'alarm_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.alarm_status_remark'); +REPLACE INTO "sys_dict_type" VALUES (52, 'dictType.ne_version_status', 'ne_version_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.ne_version_status_remark'); +REPLACE INTO "sys_dict_type" VALUES (53, 'dictType.sys_role_datascope', 'sys_role_datascope', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_role_datascope_remark'); +REPLACE INTO "sys_dict_type" VALUES (54, 'dictType.active_alarm_type', 'active_alarm_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.active_alarm_type_remark'); +REPLACE INTO "sys_dict_type" VALUES (55, 'dictType.active_clear_type', 'active_clear_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.active_clear_type_remark'); +REPLACE INTO "sys_dict_type" VALUES (56, 'dictType.active_ack_state', 'active_ack_state', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.active_ack_state_remark'); +REPLACE INTO "sys_dict_type" VALUES (57, 'dictType.active_alarm_severity', 'active_alarm_severity', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.active_alarm_severity_remark'); +REPLACE INTO "sys_dict_type" VALUES (58, 'dictType.index_status', 'index_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.index_status_remark'); +REPLACE INTO "sys_dict_type" VALUES (59, 'dictType.cdr_sip_code', 'cdr_sip_code', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (60, 'dictType.cdr_call_type', 'cdr_call_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (61, 'dictType.ue_auth_code', 'ue_auth_code', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (62, 'dictType.ue_event_type', 'ue_event_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (63, 'dictType.ue_event_cm_state', 'ue_event_cm_state', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (64, 'dictType.ne_host_type', 'ne_host_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (65, 'dictType.ne_host_groupId', 'ne_host_groupId', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (66, 'dictType.ne_host_authMode', 'ne_host_authMode', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (67, 'dictType.ne_host_cmd_groupId', 'ne_host_cmd_groupId', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (68, 'dictType.ne_info_status', 'ne_info_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (69, 'dictType.ne_license_status', 'ne_license_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (70, 'dictType.cdr_cause_code', 'cdr_cause_code', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (71, 'dictType.trace_msg_type', 'trace_msg_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (72, 'dictType.trace_msg_direct', 'trace_msg_direct', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (73, 'dictType.trace_interfaces', 'trace_interfaces', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO "sys_dict_type" VALUES (74, 'dictType.cdr_sip_code_cause', 'cdr_sip_code_cause', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); diff --git a/build/database/lite/upgrade/upg_sys_i18n.sql b/build/database/lite/upgrade/upg_sys_i18n.sql index a393a9c9..256fbb8a 100644 --- a/build/database/lite/upgrade/upg_sys_i18n.sql +++ b/build/database/lite/upgrade/upg_sys_i18n.sql @@ -932,22 +932,30 @@ REPLACE INTO "sys_i18n" VALUES (757, 'dictData.trace_interfaces.5', 'N5', 'N5'); REPLACE INTO "sys_i18n" VALUES (758, "alarm.export.alarmCode", "告警编码", "Alarm Code"); REPLACE INTO "sys_i18n" VALUES (759, "config.sys.user.fristPasswdChangeRemark", "关闭改为false 开启改为true, 建议同时设置密码有效期", "Off to false On to true, it is recommended to set the password expiration date at the same time."); REPLACE INTO "sys_i18n" VALUES (760, "menu.perf.kpiIMSOverview", "语音数据概览", "Voice Data Overview"); +REPLACE INTO "sys_i18n" VALUES (761, "dictType.sys_user_type", "用户类型", "User Type"); +REPLACE INTO "sys_i18n" VALUES (762, "dictData.sys_user_type.system", "系统", "System"); +REPLACE INTO "sys_i18n" VALUES (763, "dictData.sys_user_type.ldap", "LDAP", "LDAP"); +REPLACE INTO "sys_i18n" VALUES (764, "dictData.sys_user_type.smtp", "SMTP", "SMTP"); +REPLACE INTO "sys_i18n" VALUES (765, "dictData.sys_user_type.oauth2", "OAuth2", "OAuth2"); +REPLACE INTO "sys_i18n" VALUES (766, "user.export.userType", "用户类型", "User Type"); +REPLACE INTO "sys_i18n" VALUES (767, "menu.system.loginSource", "第三方登录认证", "Third Party Login Source"); +REPLACE INTO "sys_i18n" VALUES (768, "log.operate.title.sysLoginSource", "认证源", "Login Source"); -REPLACE INTO `sys_i18n` VALUES (2000, 'menu.psap.agent', '座席', 'Agent'); -REPLACE INTO `sys_i18n` VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information'); -REPLACE INTO `sys_i18n` VALUES (2002, 'menu.psap.agent.callback', '回拨管理', 'Callback Management'); -REPLACE INTO `sys_i18n` VALUES (2003, 'callback.status.NEW', '新建', 'New'); -REPLACE INTO `sys_i18n` VALUES (2004, 'callback.status.IN_PROGRESS', '处理中', 'In Progress'); -REPLACE INTO `sys_i18n` VALUES (2005, 'callback.status.NO_ANSWER_1', '未应答1', 'No Answer 1'); -REPLACE INTO `sys_i18n` VALUES (2006, 'callback.status.NO_ANSWER_2', '未应答2', 'No Answer 2'); -REPLACE INTO `sys_i18n` VALUES (2007, 'callback.status.TIMEOUT', '超时', 'Timeout'); -REPLACE INTO `sys_i18n` VALUES (2008, 'callback.status.PENDING', '挂起', 'Pending'); -REPLACE INTO `sys_i18n` VALUES (2009, 'callback.status.CLOSED', '关闭', 'Closed'); -REPLACE INTO `sys_i18n` VALUES (2010, 'job.export.cdr.mf', '定期导出MF话单', 'Periodic Export of MF Call Records'); -REPLACE INTO `sys_i18n` VALUES (2011, 'job.psap.ticket.monitor', '回拨工单监控', 'Callback Ticket Monitoring'); -REPLACE INTO `sys_i18n` VALUES (2012, 'menu.omc.cdr', '话单', 'Call Records'); -REPLACE INTO `sys_i18n` VALUES (2013, 'menu.omc.cdr.mf', '紧急呼叫话单', 'Emergency Call Records'); -REPLACE INTO `sys_i18n` VALUES (2014, 'menu.omc.cdr.crbt', '彩铃话单', 'Color Ring Back Tone Records'); -REPLACE INTO `sys_i18n` VALUES (2015, 'menu.omc.cdr.mms', '彩信话单', 'Multimedia Message Service Records'); -REPLACE INTO `sys_i18n` VALUES (2016, 'menu.ue.cbc.cbe', '预警广播', 'Early Warning Broadcast'); -REPLACE INTO `sys_i18n` VALUES (2017, 'log.operate.title.cbcMessage', '预警广播', 'Early Warning Broadcast'); +REPLACE INTO "sys_i18n" VALUES (2000, 'menu.psap.agent', '座席', 'Agent'); +REPLACE INTO "sys_i18n" VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information'); +REPLACE INTO "sys_i18n" VALUES (2002, 'menu.psap.agent.callback', '回拨管理', 'Callback Management'); +REPLACE INTO "sys_i18n" VALUES (2003, 'callback.status.NEW', '新建', 'New'); +REPLACE INTO "sys_i18n" VALUES (2004, 'callback.status.IN_PROGRESS', '处理中', 'In Progress'); +REPLACE INTO "sys_i18n" VALUES (2005, 'callback.status.NO_ANSWER_1', '未应答1', 'No Answer 1'); +REPLACE INTO "sys_i18n" VALUES (2006, 'callback.status.NO_ANSWER_2', '未应答2', 'No Answer 2'); +REPLACE INTO "sys_i18n" VALUES (2007, 'callback.status.TIMEOUT', '超时', 'Timeout'); +REPLACE INTO "sys_i18n" VALUES (2008, 'callback.status.PENDING', '挂起', 'Pending'); +REPLACE INTO "sys_i18n" VALUES (2009, 'callback.status.CLOSED', '关闭', 'Closed'); +REPLACE INTO "sys_i18n" VALUES (2010, 'job.export.cdr.mf', '定期导出MF话单', 'Periodic Export of MF Call Records'); +REPLACE INTO "sys_i18n" VALUES (2011, 'job.psap.ticket.monitor', '回拨工单监控', 'Callback Ticket Monitoring'); +REPLACE INTO "sys_i18n" VALUES (2012, 'menu.omc.cdr', '话单', 'Call Records'); +REPLACE INTO "sys_i18n" VALUES (2013, 'menu.omc.cdr.mf', '紧急呼叫话单', 'Emergency Call Records'); +REPLACE INTO "sys_i18n" VALUES (2014, 'menu.omc.cdr.crbt', '彩铃话单', 'Color Ring Back Tone Records'); +REPLACE INTO "sys_i18n" VALUES (2015, 'menu.omc.cdr.mms', '彩信话单', 'Multimedia Message Service Records'); +REPLACE INTO "sys_i18n" VALUES (2016, 'menu.ue.cbc.cbe', '预警广播', 'Early Warning Broadcast'); +REPLACE INTO "sys_i18n" VALUES (2017, 'log.operate.title.cbcMessage', '预警广播', 'Early Warning Broadcast'); diff --git a/build/database/lite/upgrade/upg_sys_login_source.sql b/build/database/lite/upgrade/upg_sys_login_source.sql new file mode 100644 index 00000000..34071608 --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_login_source.sql @@ -0,0 +1,32 @@ +-- ---------------------------- +-- Table structure for sys_login_source +-- ---------------------------- +CREATE TABLE IF NOT EXISTS "sys_login_source" ( + "id" integer NOT NULL, + "uid" text(32), + "type" text(32), + "name" text(64), + "icon" text(255), + "active_flag" text(1), + "sync_flag" text(1), + "config" text, + "create_by" text(64), + "create_time" integer, + "update_by" text(64), + "update_time" integer, + "remark" text(500), + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Indexes structure for table sys_login_source +-- ---------------------------- +CREATE INDEX IF NOT EXISTS "idx_ls_type_name" +ON "sys_login_source" ( + "type" ASC, + "name" ASC +); + +-- ---------------------------- +-- Records of sys_login_source +-- ---------------------------- diff --git a/build/database/lite/upgrade/upg_sys_menu.sql b/build/database/lite/upgrade/upg_sys_menu.sql index 316e40dc..1cc7a1c7 100644 --- a/build/database/lite/upgrade/upg_sys_menu.sql +++ b/build/database/lite/upgrade/upg_sys_menu.sql @@ -46,6 +46,7 @@ REPLACE INTO "sys_menu" VALUES (105, 'menu.security.post', 2113, 6, 'post', 'sys REPLACE INTO "sys_menu" VALUES (106, 'menu.system.dictType', 1, 30, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.dictTypeRemark'); REPLACE INTO "sys_menu" VALUES (107, 'menu.system.dictData', 1, 31, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.dictDataRemark'); REPLACE INTO "sys_menu" VALUES (108, 'menu.system.paramSet', 1, 59, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO "sys_menu" VALUES (111, 'menu.system.systemLog', 1, 11, 'log', '', '1', '1', 'D', '0', '0', '', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 1728641403588, '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', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.system.cacheInfoRemark'); @@ -108,6 +109,10 @@ REPLACE INTO "sys_menu" VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', REPLACE INTO "sys_menu" VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); REPLACE INTO "sys_menu" VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); REPLACE INTO "sys_menu" VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588, 'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1057, 'menu.common.query', 109, 1, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:query', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1058, 'menu.common.add', 109, 2, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:add', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1059, 'menu.common.edit', 109, 3, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:edit', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO "sys_menu" VALUES (1060, 'menu.common.delete', 109, 4, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO "sys_menu" VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); REPLACE INTO "sys_menu" VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); REPLACE INTO "sys_menu" VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, ''); diff --git a/build/database/lite/upgrade/upg_sys_role_menu.sql b/build/database/lite/upgrade/upg_sys_role_menu.sql index 995e7c22..15b8ae6a 100644 --- a/build/database/lite/upgrade/upg_sys_role_menu.sql +++ b/build/database/lite/upgrade/upg_sys_role_menu.sql @@ -2,11 +2,12 @@ -- Table structure for sys_role_menu -- ---------------------------- CREATE TABLE IF NOT EXISTS "sys_role_menu" ( - "role_id" integer(20) NOT NULL, - "menu_id" integer(20) NOT NULL, + "role_id" integer NOT NULL, + "menu_id" integer NOT NULL, PRIMARY KEY ("role_id", "menu_id") ); +DELETE FROM "sys_role_menu" WHERE "role_id" IN (2,3,4,5); -- ---------------------------- -- Records of sys_role_menu -- ---------------------------- @@ -26,6 +27,7 @@ REPLACE INTO "sys_role_menu" VALUES (2, 103); REPLACE INTO "sys_role_menu" VALUES (2, 104); REPLACE INTO "sys_role_menu" VALUES (2, 105); REPLACE INTO "sys_role_menu" VALUES (2, 108); +REPLACE INTO "sys_role_menu" VALUES (2, 109); REPLACE INTO "sys_role_menu" VALUES (2, 111); REPLACE INTO "sys_role_menu" VALUES (2, 112); REPLACE INTO "sys_role_menu" VALUES (2, 115); @@ -62,10 +64,8 @@ REPLACE INTO "sys_role_menu" VALUES (2, 1030); REPLACE INTO "sys_role_menu" VALUES (2, 1032); REPLACE INTO "sys_role_menu" VALUES (2, 1034); REPLACE INTO "sys_role_menu" VALUES (2, 1039); -REPLACE INTO "sys_role_menu" VALUES (2, 1040); REPLACE INTO "sys_role_menu" VALUES (2, 1041); REPLACE INTO "sys_role_menu" VALUES (2, 1042); -REPLACE INTO "sys_role_menu" VALUES (2, 1043); REPLACE INTO "sys_role_menu" VALUES (2, 1044); REPLACE INTO "sys_role_menu" VALUES (2, 1045); REPLACE INTO "sys_role_menu" VALUES (2, 1048); @@ -77,6 +77,10 @@ REPLACE INTO "sys_role_menu" VALUES (2, 1053); REPLACE INTO "sys_role_menu" VALUES (2, 1054); REPLACE INTO "sys_role_menu" VALUES (2, 1055); REPLACE INTO "sys_role_menu" VALUES (2, 1056); +REPLACE INTO "sys_role_menu" VALUES (2, 1057); +REPLACE INTO "sys_role_menu" VALUES (2, 1058); +REPLACE INTO "sys_role_menu" VALUES (2, 1059); +REPLACE INTO "sys_role_menu" VALUES (2, 1060); REPLACE INTO "sys_role_menu" VALUES (2, 2000); REPLACE INTO "sys_role_menu" VALUES (2, 2001); REPLACE INTO "sys_role_menu" VALUES (2, 2002); @@ -167,7 +171,6 @@ REPLACE INTO "sys_role_menu" VALUES (3, 65); REPLACE INTO "sys_role_menu" VALUES (3, 66); REPLACE INTO "sys_role_menu" VALUES (3, 108); REPLACE INTO "sys_role_menu" VALUES (3, 112); -REPLACE INTO "sys_role_menu" VALUES (3, 115); REPLACE INTO "sys_role_menu" VALUES (3, 500); REPLACE INTO "sys_role_menu" VALUES (3, 501); REPLACE INTO "sys_role_menu" VALUES (3, 1030); @@ -175,7 +178,6 @@ REPLACE INTO "sys_role_menu" VALUES (3, 1032); REPLACE INTO "sys_role_menu" VALUES (3, 1034); REPLACE INTO "sys_role_menu" VALUES (3, 1039); REPLACE INTO "sys_role_menu" VALUES (3, 1042); -REPLACE INTO "sys_role_menu" VALUES (3, 1048); REPLACE INTO "sys_role_menu" VALUES (3, 2000); REPLACE INTO "sys_role_menu" VALUES (3, 2001); REPLACE INTO "sys_role_menu" VALUES (3, 2002); @@ -188,6 +190,7 @@ REPLACE INTO "sys_role_menu" VALUES (3, 2009); REPLACE INTO "sys_role_menu" VALUES (3, 2010); REPLACE INTO "sys_role_menu" VALUES (3, 2011); REPLACE INTO "sys_role_menu" VALUES (3, 2083); +REPLACE INTO "sys_role_menu" VALUES (3, 2084); REPLACE INTO "sys_role_menu" VALUES (3, 2086); REPLACE INTO "sys_role_menu" VALUES (3, 2087); REPLACE INTO "sys_role_menu" VALUES (3, 2088); @@ -199,10 +202,12 @@ REPLACE INTO "sys_role_menu" VALUES (3, 2097); REPLACE INTO "sys_role_menu" VALUES (3, 2107); REPLACE INTO "sys_role_menu" VALUES (3, 2108); REPLACE INTO "sys_role_menu" VALUES (3, 2109); -REPLACE INTO "sys_role_menu" VALUES (3, 2113); +REPLACE INTO "sys_role_menu" VALUES (3, 2112); REPLACE INTO "sys_role_menu" VALUES (3, 2114); REPLACE INTO "sys_role_menu" VALUES (3, 2115); REPLACE INTO "sys_role_menu" VALUES (3, 2116); +REPLACE INTO "sys_role_menu" VALUES (3, 2118); +REPLACE INTO "sys_role_menu" VALUES (3, 2122); REPLACE INTO "sys_role_menu" VALUES (3, 2123); REPLACE INTO "sys_role_menu" VALUES (3, 2126); REPLACE INTO "sys_role_menu" VALUES (3, 2128); @@ -223,11 +228,10 @@ REPLACE INTO "sys_role_menu" VALUES (3, 2149); REPLACE INTO "sys_role_menu" VALUES (3, 2151); REPLACE INTO "sys_role_menu" VALUES (3, 2152); REPLACE INTO "sys_role_menu" VALUES (3, 2153); -REPLACE INTO "sys_role_menu" VALUES (3, 2154); -REPLACE INTO "sys_role_menu" VALUES (3, 2155); -REPLACE INTO "sys_role_menu" VALUES (3, 2156); REPLACE INTO "sys_role_menu" VALUES (3, 2157); REPLACE INTO "sys_role_menu" VALUES (3, 2158); +REPLACE INTO "sys_role_menu" VALUES (3, 2162); +REPLACE INTO "sys_role_menu" VALUES (3, 2163); REPLACE INTO "sys_role_menu" VALUES (3, 2165); REPLACE INTO "sys_role_menu" VALUES (3, 2166); REPLACE INTO "sys_role_menu" VALUES (3, 2167); @@ -237,9 +241,6 @@ REPLACE INTO "sys_role_menu" VALUES (3, 20000); REPLACE INTO "sys_role_menu" VALUES (4, 1); REPLACE INTO "sys_role_menu" VALUES (4, 4); -REPLACE INTO "sys_role_menu" VALUES (4, 60); -REPLACE INTO "sys_role_menu" VALUES (4, 65); -REPLACE INTO "sys_role_menu" VALUES (4, 66); REPLACE INTO "sys_role_menu" VALUES (4, 112); REPLACE INTO "sys_role_menu" VALUES (4, 115); REPLACE INTO "sys_role_menu" VALUES (4, 500); @@ -249,17 +250,18 @@ REPLACE INTO "sys_role_menu" VALUES (4, 1041); REPLACE INTO "sys_role_menu" VALUES (4, 1042); REPLACE INTO "sys_role_menu" VALUES (4, 1044); REPLACE INTO "sys_role_menu" VALUES (4, 1048); -REPLACE INTO "sys_role_menu" VALUES (4, 2083); -REPLACE INTO "sys_role_menu" VALUES (4, 2086); REPLACE INTO "sys_role_menu" VALUES (4, 2087); REPLACE INTO "sys_role_menu" VALUES (4, 2088); REPLACE INTO "sys_role_menu" VALUES (4, 2089); +REPLACE INTO "sys_role_menu" VALUES (4, 2091); REPLACE INTO "sys_role_menu" VALUES (4, 2092); REPLACE INTO "sys_role_menu" VALUES (4, 2094); REPLACE INTO "sys_role_menu" VALUES (4, 2097); +REPLACE INTO "sys_role_menu" VALUES (4, 2112); REPLACE INTO "sys_role_menu" VALUES (4, 2113); -REPLACE INTO "sys_role_menu" VALUES (4, 2114); +REPLACE INTO "sys_role_menu" VALUES (4, 2115); REPLACE INTO "sys_role_menu" VALUES (4, 2116); +REPLACE INTO "sys_role_menu" VALUES (4, 2123); REPLACE INTO "sys_role_menu" VALUES (4, 2126); REPLACE INTO "sys_role_menu" VALUES (4, 2128); REPLACE INTO "sys_role_menu" VALUES (4, 2129); @@ -273,11 +275,7 @@ REPLACE INTO "sys_role_menu" VALUES (4, 2141); REPLACE INTO "sys_role_menu" VALUES (4, 2147); REPLACE INTO "sys_role_menu" VALUES (4, 2148); REPLACE INTO "sys_role_menu" VALUES (4, 2149); -REPLACE INTO "sys_role_menu" VALUES (4, 2151); -REPLACE INTO "sys_role_menu" VALUES (4, 2152); -REPLACE INTO "sys_role_menu" VALUES (4, 2153); REPLACE INTO "sys_role_menu" VALUES (4, 2157); -REPLACE INTO "sys_role_menu" VALUES (4, 2163); REPLACE INTO "sys_role_menu" VALUES (4, 2165); REPLACE INTO "sys_role_menu" VALUES (4, 2166); REPLACE INTO "sys_role_menu" VALUES (4, 2167); @@ -289,6 +287,13 @@ REPLACE INTO "sys_role_menu" VALUES (5, 4); REPLACE INTO "sys_role_menu" VALUES (5, 112); REPLACE INTO "sys_role_menu" VALUES (5, 2087); REPLACE INTO "sys_role_menu" VALUES (5, 2115); +REPLACE INTO "sys_role_menu" VALUES (5, 2126); +REPLACE INTO "sys_role_menu" VALUES (5, 2128); +REPLACE INTO "sys_role_menu" VALUES (5, 2130); REPLACE INTO "sys_role_menu" VALUES (5, 2131); REPLACE INTO "sys_role_menu" VALUES (5, 2132); REPLACE INTO "sys_role_menu" VALUES (5, 2165); +REPLACE INTO "sys_role_menu" VALUES (5, 2166); +REPLACE INTO "sys_role_menu" VALUES (5, 2167); +REPLACE INTO "sys_role_menu" VALUES (5, 2168); +REPLACE INTO "sys_role_menu" VALUES (5, 2169); diff --git a/build/database/lite/upgrade/upg_sys_user.sql b/build/database/lite/upgrade/upg_sys_user.sql new file mode 100644 index 00000000..89eab69f --- /dev/null +++ b/build/database/lite/upgrade/upg_sys_user.sql @@ -0,0 +1,46 @@ +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +ALTER TABLE "sys_user" RENAME TO "sys_user_old"; +CREATE TABLE "sys_user" ( + "user_id" integer NOT NULL, + "dept_id" integer, + "user_name" text(36) NOT NULL, + "nick_name" text(36) NOT NULL, + "email" text(64), + "phone" text(32), + "sex" text(1), + "avatar" text(255), + "password" text(128), + "user_type" text(20), + "user_source" text(32), + "status_flag" text(1), + "del_flag" text(1), + "password_update_time" integer, + "login_count" integer, + "login_ip" text(128), + "login_time" integer, + "create_by" text(64), + "create_time" integer, + "update_by" text(64), + "update_time" integer, + "remark" text(200), + PRIMARY KEY ("user_id") +); + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO "sys_user" ( +"user_id", "dept_id", "user_name", "nick_name", "email", "phone", "sex", "avatar", "password", "status_flag", "del_flag", "password_update_time", "login_count", "login_ip", "login_time", "create_by", "create_time", "update_by", "update_time", "remark") +SELECT +"user_id", "dept_id", "user_name", "nick_name", "email", "phone", "sex", "avatar", "password", "status_flag", "del_flag", "password_update_time", "login_count", "login_ip", "login_time", "create_by", "create_time", "update_by", "update_time", "remark" +FROM "sys_user_old"; + +-- UPDATE "user_type", "user_source" +UPDATE sys_user SET +user_type = COALESCE((SELECT user_type FROM sys_user_old WHERE sys_user_old.user_id = sys_user.user_id), 'Sytem'), +user_source = COALESCE((SELECT user_source FROM sys_user_old WHERE sys_user_old.user_id = sys_user.user_id), '#') +WHERE EXISTS (SELECT 1 FROM sys_user_old WHERE sys_user_old.user_id = sys_user.user_id); + +DROP TABLE IF EXISTS "sys_user_old"; \ No newline at end of file diff --git a/build/database/std/common/mml_command.sql b/build/database/std/common/mml_command.sql index 43d1e488..ef32e0d4 100644 --- a/build/database/std/common/mml_command.sql +++ b/build/database/std/common/mml_command.sql @@ -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 -- ---------------------------- @@ -31,9 +12,8 @@ CREATE TABLE `mml_command` ( `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, `status` enum('Active','Inactive') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'Active' COMMENT '激活: Active 未激活: Inactive', - PRIMARY KEY (`id`) USING BTREE, - INDEX `id`(`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1626 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- 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 (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'); - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/install/cbc_message.sql b/build/database/std/install/cbc_message.sql index 8eae21f5..78d119b1 100755 --- a/build/database/std/install/cbc_message.sql +++ b/build/database/std/install/cbc_message.sql @@ -1,38 +1,16 @@ -/* - Navicat Premium Data Transfer - - Source Server : root@192.168.2.242 - Source Server Type : MariaDB - Source Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1) - Source Host : 192.168.2.242:33066 - Source Schema : omc_db - - Target Server Type : MariaDB - Target Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1) - File Encoding : 65001 - - Date: 01/08/2025 10:07:00 -*/ - -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for cbc_message -- ---------------------------- DROP TABLE IF EXISTS `cbc_message`; -CREATE TABLE `cbc_message` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `message_json` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `status` enum('ACTIVE','INACTIVE') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'INACTIVE', - `detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `created_at` bigint(20) NULL DEFAULT NULL, - `updated_at` bigint(20) NULL DEFAULT NULL, +CREATE TABLE `cbc_message` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `message_json` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'INACTIVE' COMMENT 'ACTIVE/INACTIVE', + `detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `created_at` bigint DEFAULT NULL, + `updated_at` bigint DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, - INDEX `id`(`id`) USING BTREE, - INDEX `idx_ne_time`(`ne_type`, `ne_id`, `created_at`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 64 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'CDR事件_MF' ROW_FORMAT = Dynamic; - -SET FOREIGN_KEY_CHECKS = 1; + KEY `idx_cbcm_ne_time` (`ne_type`,`ne_id`,`created_at`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='CDR事件_MF'; diff --git a/build/database/std/install/sys_dict_data.sql b/build/database/std/install/sys_dict_data.sql index 3555e337..0dbcda4f 100644 --- a/build/database/std/install/sys_dict_data.sql +++ b/build/database/std/install/sys_dict_data.sql @@ -195,6 +195,10 @@ INSERT INTO `sys_dict_data` VALUES (166, 'cdr_sip_code_cause', 'dictData.cdr_sip INSERT INTO `sys_dict_data` VALUES (167, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.606', '606', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (168, 'trace_interfaces', 'dictData.trace_interfaces.14', 'N14', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_data` VALUES (169, 'trace_interfaces', 'dictData.trace_interfaces.5', 'N5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (170, 'sys_user_type', 'dictData.sys_user_type.system', 'System', 1, '', 'default', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +INSERT INTO `sys_dict_data` VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/install/sys_dict_type.sql b/build/database/std/install/sys_dict_type.sql index 750c56d1..a03a372b 100644 --- a/build/database/std/install/sys_dict_type.sql +++ b/build/database/std/install/sys_dict_type.sql @@ -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', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_yes_no_remark'); INSERT INTO `sys_dict_type` VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_oper_type_remark'); INSERT INTO `sys_dict_type` VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_common_status_remark'); +INSERT INTO `sys_dict_type` VALUES (11, 'dictType.sys_user_type', 'sys_user_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); INSERT INTO `sys_dict_type` VALUES (50, 'dictType.trace_type', 'trace_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.trace_type_remark'); INSERT INTO `sys_dict_type` VALUES (51, 'dictType.alarm_status', 'alarm_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.alarm_status_remark'); INSERT INTO `sys_dict_type` VALUES (52, 'dictType.ne_version_status', 'ne_version_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.ne_version_status_remark'); diff --git a/build/database/std/install/sys_i18n.sql b/build/database/std/install/sys_i18n.sql index e8675d6b..88c198b5 100644 --- a/build/database/std/install/sys_i18n.sql +++ b/build/database/std/install/sys_i18n.sql @@ -775,6 +775,14 @@ INSERT INTO `sys_i18n` VALUES (757, 'dictData.trace_interfaces.5', 'N5', 'N5'); INSERT INTO `sys_i18n` VALUES (758, "alarm.export.alarmCode", "告警编码", "Alarm Code"); INSERT INTO `sys_i18n` VALUES (759, "config.sys.user.fristPasswdChangeRemark", "关闭改为false 开启改为true, 建议同时设置密码有效期", "Off to false On to true, it is recommended to set the password expiration date at the same time."); INSERT INTO `sys_i18n` VALUES (760, "menu.perf.kpiIMSOverview", "语音数据概览", "Voice Data Overview"); +INSERT INTO `sys_i18n` VALUES (761, "dictType.sys_user_type", "用户类型", "User Type"); +INSERT INTO `sys_i18n` VALUES (762, "dictData.sys_user_type.system", "系统", "System"); +INSERT INTO `sys_i18n` VALUES (763, "dictData.sys_user_type.ldap", "LDAP", "LDAP"); +INSERT INTO `sys_i18n` VALUES (764, "dictData.sys_user_type.smtp", "SMTP", "SMTP"); +INSERT INTO `sys_i18n` VALUES (765, "dictData.sys_user_type.oauth2", "OAuth2", "OAuth2"); +INSERT INTO `sys_i18n` VALUES (766, "user.export.userType", "用户类型", "User Type"); +INSERT INTO `sys_i18n` VALUES (767, "menu.system.loginSource", "第三方登录认证", "Third Party Login Source"); +INSERT INTO `sys_i18n` VALUES (768, "log.operate.title.sysLoginSource", "认证源", "Login Source"); INSERT INTO `sys_i18n` VALUES (2000, 'menu.psap.agent', '座席', 'Agent'); INSERT INTO `sys_i18n` VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information'); diff --git a/build/database/std/install/sys_login_source.sql b/build/database/std/install/sys_login_source.sql new file mode 100644 index 00000000..073189af --- /dev/null +++ b/build/database/std/install/sys_login_source.sql @@ -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 diff --git a/build/database/std/install/sys_menu.sql b/build/database/std/install/sys_menu.sql index 869ffb04..a83b723a 100644 --- a/build/database/std/install/sys_menu.sql +++ b/build/database/std/install/sys_menu.sql @@ -50,6 +50,7 @@ INSERT INTO `sys_menu` VALUES (105, 'menu.security.post', 2113, 6, 'post', 'syst INSERT INTO `sys_menu` VALUES (106, 'menu.system.dictType', 1, 30, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.dictTypeRemark'); INSERT INTO `sys_menu` VALUES (107, 'menu.system.dictData', 1, 31, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.dictDataRemark'); INSERT INTO `sys_menu` VALUES (108, 'menu.system.paramSet', 1, 59, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', '0', 'system', 1728641403588,'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (111, 'menu.system.systemLog', 1, 11, 'log', '', '1', '1', 'D', '0', '0', '', '#', '0', 'system', 1728641403588,'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.cacheInfoRemark'); @@ -112,6 +113,10 @@ INSERT INTO `sys_menu` VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', ' INSERT INTO `sys_menu` VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (1057, 'menu.common.query', 109, 1, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:query', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (1058, 'menu.common.add', 109, 2, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:add', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (1059, 'menu.common.edit', 109, 3, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:edit', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +INSERT INTO `sys_menu` VALUES (1060, 'menu.common.delete', 109, 4, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); INSERT INTO `sys_menu` VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); diff --git a/build/database/std/install/sys_role_menu.sql b/build/database/std/install/sys_role_menu.sql index c8e6b38e..542dc973 100644 --- a/build/database/std/install/sys_role_menu.sql +++ b/build/database/std/install/sys_role_menu.sql @@ -1,6 +1,3 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for sys_role_menu -- ---------------------------- @@ -14,9 +11,6 @@ CREATE TABLE `sys_role_menu` ( -- -- Dumping data for table `sys_role_menu` -- - -LOCK TABLES `sys_role_menu` WRITE; - INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 5); @@ -33,6 +27,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 103); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 104); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 105); 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, 111); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 115); @@ -69,10 +64,8 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1030); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1032); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1034); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1039); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1040); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1041); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1042); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1043); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1044); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1045); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1048); @@ -84,6 +77,10 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1053); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1054); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1055); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1056); +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, 2000); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2001); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2002); @@ -91,8 +88,8 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2003); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2004); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2005); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2007); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2008); +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, 2011); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2083); @@ -174,7 +171,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 65); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 112); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 115); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 500); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 501); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1030); @@ -182,7 +178,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1032); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1034); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1039); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1042); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1048); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2000); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2001); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2002); @@ -195,6 +190,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2010); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2011); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2083); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2084); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2088); @@ -206,10 +202,12 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2097); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2109); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2113); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2114); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2116); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2118); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2122); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2123); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2128); @@ -230,11 +228,10 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2149); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2151); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2153); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2154); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2155); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2156); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2157); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2158); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2166); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2167); @@ -244,9 +241,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 20000); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 4); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 60); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 65); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 115); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 500); @@ -256,17 +250,18 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1041); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1042); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1044); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1048); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2083); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2088); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2089); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2097); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2113); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2116); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2123); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2129); @@ -280,11 +275,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2141); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2147); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2148); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2149); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2151); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2152); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2153); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2157); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2166); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2167); @@ -296,10 +287,15 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (5, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2115); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2126); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2128); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2130); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2131); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2132); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2165); - -UNLOCK TABLES; +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2166); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2167); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2168); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2169); -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/install/sys_user.sql b/build/database/std/install/sys_user.sql index 557efe35..c8db9d4f 100644 --- a/build/database/std/install/sys_user.sql +++ b/build/database/std/install/sys_user.sql @@ -1,4 +1,3 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) -- -- Table structure for table `sys_user` -- @@ -14,6 +13,8 @@ CREATE TABLE `sys_user` ( `sex` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '用户性别(0未选择 1男 2女)', `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '头像地址', `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码', + `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(#系统)', `status_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '账号状态(0停用 1正常)', `del_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标记(0存在 1删除)', `password_update_time` bigint NULL DEFAULT 0 COMMENT '密码更新时间', @@ -30,15 +31,10 @@ CREATE TABLE `sys_user` ( -- -- Dumping data for table `sys_user` --- - -LOCK TABLES `sys_user` WRITE; -/*!40000 ALTER TABLE `sys_user` DISABLE KEYS */; -INSERT INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); - -UNLOCK TABLES; +-- +INSERT INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/upgrade/upg_cbc_message.sql b/build/database/std/upgrade/upg_cbc_message.sql index 88a75dca..845c049a 100755 --- a/build/database/std/upgrade/upg_cbc_message.sql +++ b/build/database/std/upgrade/upg_cbc_message.sql @@ -1,37 +1,15 @@ -/* - Navicat Premium Data Transfer - - Source Server : root@192.168.2.242 - Source Server Type : MariaDB - Source Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1) - Source Host : 192.168.2.242:33066 - Source Schema : omc_db - - Target Server Type : MariaDB - Target Server Version : 100622 (10.6.22-MariaDB-0ubuntu0.22.04.1) - File Encoding : 65001 - - Date: 01/08/2025 10:07:00 -*/ - -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for cbc_message -- ---------------------------- -CREATE TABLE IF NOT EXISTS `cbc_message` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `message_json` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `status` enum('ACTIVE','INACTIVE') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'INACTIVE', - `detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `created_at` bigint(20) NULL DEFAULT NULL, - `updated_at` bigint(20) NULL DEFAULT NULL, +CREATE TABLE IF NOT EXISTS `cbc_message` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ne_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `message_json` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'INACTIVE' COMMENT 'ACTIVE/INACTIVE', + `detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `created_at` bigint DEFAULT NULL, + `updated_at` bigint DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, - INDEX `id`(`id`) USING BTREE, - INDEX `idx_ne_time`(`ne_type`, `ne_id`, `created_at`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 64 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'CDR事件_MF' ROW_FORMAT = Dynamic; - -SET FOREIGN_KEY_CHECKS = 1; + KEY `idx_cbcm_ne_time` (`ne_type`,`ne_id`,`created_at`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='CDR事件_MF'; diff --git a/build/database/std/upgrade/upg_sys_dict_data.sql b/build/database/std/upgrade/upg_sys_dict_data.sql index 4d078c0b..51ae420a 100644 --- a/build/database/std/upgrade/upg_sys_dict_data.sql +++ b/build/database/std/upgrade/upg_sys_dict_data.sql @@ -199,6 +199,10 @@ REPLACE INTO `sys_dict_data` VALUES (166, 'cdr_sip_code_cause', 'dictData.cdr_si REPLACE INTO `sys_dict_data` VALUES (167, 'cdr_sip_code_cause', 'dictData.cdr_sip_code_cause.606', '606', 22, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (168, 'trace_interfaces', 'dictData.trace_interfaces.14', 'N14', 14, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_data` VALUES (169, 'trace_interfaces', 'dictData.trace_interfaces.5', 'N5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (170, 'sys_user_type', 'dictData.sys_user_type.system', 'System', 1, '', 'default', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); +REPLACE INTO `sys_dict_data` VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/upgrade/upg_sys_dict_type.sql b/build/database/std/upgrade/upg_sys_dict_type.sql index baa43888..0dc114a0 100644 --- a/build/database/std/upgrade/upg_sys_dict_type.sql +++ b/build/database/std/upgrade/upg_sys_dict_type.sql @@ -31,6 +31,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', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_yes_no_remark'); REPLACE INTO `sys_dict_type` VALUES (9, 'dictType.sys_oper_type', 'sys_oper_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_oper_type_remark'); REPLACE INTO `sys_dict_type` VALUES (10, 'dictType.sys_common_status', 'sys_common_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.sys_common_status_remark'); +REPLACE INTO `sys_dict_type` VALUES (11, 'dictType.sys_user_type', 'sys_user_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, ''); REPLACE INTO `sys_dict_type` VALUES (50, 'dictType.trace_type', 'trace_type', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.trace_type_remark'); REPLACE INTO `sys_dict_type` VALUES (51, 'dictType.alarm_status', 'alarm_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.alarm_status_remark'); REPLACE INTO `sys_dict_type` VALUES (52, 'dictType.ne_version_status', 'ne_version_status', '1', '0', 'system', 1699348237468, 'system', 1699348237468, 'dictType.ne_version_status_remark'); diff --git a/build/database/std/upgrade/upg_sys_i18n.sql b/build/database/std/upgrade/upg_sys_i18n.sql index e1855bf5..45033918 100644 --- a/build/database/std/upgrade/upg_sys_i18n.sql +++ b/build/database/std/upgrade/upg_sys_i18n.sql @@ -772,6 +772,14 @@ REPLACE INTO `sys_i18n` VALUES (757, 'dictData.trace_interfaces.5', 'N5', 'N5'); REPLACE INTO `sys_i18n` VALUES (758, "alarm.export.alarmCode", "告警编码", "Alarm Code"); REPLACE INTO `sys_i18n` VALUES (759, "config.sys.user.fristPasswdChangeRemark", "关闭改为false 开启改为true, 建议同时设置密码有效期", "Off to false On to true, it is recommended to set the password expiration date at the same time."); REPLACE INTO `sys_i18n` VALUES (760, "menu.perf.kpiIMSOverview", "语音数据概览", "Voice Data Overview"); +REPLACE INTO `sys_i18n` VALUES (761, "dictType.sys_user_type", "用户类型", "User Type"); +REPLACE INTO `sys_i18n` VALUES (762, "dictData.sys_user_type.system", "系统", "System"); +REPLACE INTO `sys_i18n` VALUES (763, "dictData.sys_user_type.ldap", "LDAP", "LDAP"); +REPLACE INTO `sys_i18n` VALUES (764, "dictData.sys_user_type.smtp", "SMTP", "SMTP"); +REPLACE INTO `sys_i18n` VALUES (765, "dictData.sys_user_type.oauth2", "OAuth2", "OAuth2"); +REPLACE INTO `sys_i18n` VALUES (766, "user.export.userType", "用户类型", "User Type"); +REPLACE INTO `sys_i18n` VALUES (767, "menu.system.loginSource", "第三方登录认证", "Third Party Login Source"); +REPLACE INTO `sys_i18n` VALUES (768, "log.operate.title.sysLoginSource", "认证源", "Login Source"); REPLACE INTO `sys_i18n` VALUES (2000, 'menu.psap.agent', '座席', 'Agent'); REPLACE INTO `sys_i18n` VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information'); diff --git a/build/database/std/upgrade/upg_sys_login_source.sql b/build/database/std/upgrade/upg_sys_login_source.sql new file mode 100644 index 00000000..e68e205a --- /dev/null +++ b/build/database/std/upgrade/upg_sys_login_source.sql @@ -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 diff --git a/build/database/std/upgrade/upg_sys_menu.sql b/build/database/std/upgrade/upg_sys_menu.sql index 10e5e0de..6f2770ed 100644 --- a/build/database/std/upgrade/upg_sys_menu.sql +++ b/build/database/std/upgrade/upg_sys_menu.sql @@ -72,6 +72,7 @@ REPLACE INTO `sys_menu` VALUES (105, 'menu.security.post', 2113, 6, 'post', 'sys REPLACE INTO `sys_menu` VALUES (106, 'menu.system.dictType', 1, 30, 'dict', 'system/dict/index', '1', '1', 'M', '1', '1', 'system:dict:list', 'icon-tubiaoku', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.dictTypeRemark'); REPLACE INTO `sys_menu` VALUES (107, 'menu.system.dictData', 1, 31, 'dict/inline/data/:dictId', 'system/dict/data', '1', '1', 'M', '0', '1', 'system:dict:data', '#', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.dictDataRemark'); REPLACE INTO `sys_menu` VALUES (108, 'menu.system.paramSet', 1, 59, 'config', 'system/config/index', '1', '1', 'M', '1', '1', 'system:config:list', 'icon-gongnengjieshao', '0', 'system', 1728641403588,'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (111, 'menu.system.systemLog', 1, 11, 'log', '', '1', '1', 'D', '0', '0', '', '#', '0', 'system', 1728641403588,'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, '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', '0', 'system', 1728641403588,'system', 1728641403588, 'menu.system.cacheInfoRemark'); @@ -134,6 +135,10 @@ REPLACE INTO `sys_menu` VALUES (1053, 'menu.common.edit', 116, 3, '#', '', '1', REPLACE INTO `sys_menu` VALUES (1054, 'menu.common.delete', 116, 4, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (1055, 'menu.common.edit', 116, 5, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:changeStatus', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (1056, 'menu.common.export', 116, 6, '#', '', '1', '1', 'B', '1', '1', 'monitor:job:export', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (1057, 'menu.common.query', 109, 1, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:query', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (1058, 'menu.common.add', 109, 2, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:add', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (1059, 'menu.common.edit', 109, 3, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:edit', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); +REPLACE INTO `sys_menu` VALUES (1060, 'menu.common.delete', 109, 4, '#', '', '1', '1', 'B', '1', '1', 'system:loginSource:remove', '#', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); REPLACE INTO `sys_menu` VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, ''); diff --git a/build/database/std/upgrade/upg_sys_role_menu.sql b/build/database/std/upgrade/upg_sys_role_menu.sql index 2c9c27ac..8733307c 100644 --- a/build/database/std/upgrade/upg_sys_role_menu.sql +++ b/build/database/std/upgrade/upg_sys_role_menu.sql @@ -1,6 +1,3 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for sys_role_menu -- ---------------------------- @@ -10,12 +7,10 @@ CREATE TABLE IF NOT EXISTS `sys_role_menu` ( PRIMARY KEY (`role_id`, `menu_id`) USING BTREE ) 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); -- -- Dumping data for table `sys_role_menu` -- - -LOCK TABLES `sys_role_menu` WRITE; - INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 5); @@ -32,6 +27,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 103); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 104); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 105); 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, 111); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 115); @@ -68,10 +64,8 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1030); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1032); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1034); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1039); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1040); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1041); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1042); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1043); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1044); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1045); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1048); @@ -83,6 +77,10 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1053); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1054); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1055); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 1056); +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, 2000); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2001); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2002); @@ -90,8 +88,8 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2003); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2004); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2005); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2007); -INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2008); +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, 2011); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2083); @@ -173,7 +171,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 65); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 112); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 115); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 500); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 501); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1030); @@ -181,7 +178,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1032); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1034); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1039); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1042); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 1048); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2000); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2001); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2002); @@ -194,6 +190,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2009); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2010); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2011); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2083); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2084); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2088); @@ -205,10 +202,12 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2097); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2107); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2108); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2109); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2113); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2114); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2116); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2118); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2122); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2123); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2128); @@ -229,11 +228,10 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2149); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2151); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2152); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2153); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2154); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2155); -INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2156); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2157); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2158); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2162); +INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2166); INSERT IGNORE INTO `sys_role_menu` VALUES (3, 2167); @@ -243,9 +241,6 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (3, 20000); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 4); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 60); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 65); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 66); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 115); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 500); @@ -255,17 +250,18 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1041); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1042); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1044); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 1048); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2083); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2086); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2088); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2089); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2091); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2092); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2094); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2097); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2112); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2113); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2114); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2115); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2116); +INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2123); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2126); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2128); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2129); @@ -279,11 +275,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2141); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2147); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2148); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2149); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2151); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2152); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2153); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2157); -INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2163); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2165); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2166); INSERT IGNORE INTO `sys_role_menu` VALUES (4, 2167); @@ -295,10 +287,15 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (5, 4); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 112); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2087); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2115); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2126); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2128); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2130); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2131); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2132); INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2165); - -UNLOCK TABLES; +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2166); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2167); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2168); +INSERT IGNORE INTO `sys_role_menu` VALUES (5, 2169); -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/upgrade/upg_sys_user.sql b/build/database/std/upgrade/upg_sys_user.sql index eb89d6b1..35e4a953 100644 --- a/build/database/std/upgrade/upg_sys_user.sql +++ b/build/database/std/upgrade/upg_sys_user.sql @@ -1,6 +1,7 @@ -- -- Table structure for table `sys_user` -- + CREATE TABLE IF NOT EXISTS `sys_user` ( `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `dept_id` bigint NULL DEFAULT 0 COMMENT '部门ID', @@ -11,6 +12,8 @@ CREATE TABLE IF NOT EXISTS `sys_user` ( `sex` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '用户性别(0未选择 1男 2女)', `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '头像地址', `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码', + `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 (系统#)', `status_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '账号状态(0停用 1正常)', `del_flag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标记(0存在 1删除)', `password_update_time` bigint NULL DEFAULT 0 COMMENT '密码更新时间', @@ -28,10 +31,6 @@ CREATE TABLE IF NOT EXISTS `sys_user` ( -- ---------------------------- -- COLUMN for sys_user -- ---------------------------- -ALTER TABLE `sys_user` DROP COLUMN `user_type`; -ALTER TABLE `sys_user` DROP COLUMN `phonenumber`; -ALTER TABLE `sys_user` DROP COLUMN `status`; -ALTER TABLE `sys_user` DROP COLUMN `login_date`; ALTER TABLE `sys_user` MODIFY COLUMN `user_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号' AFTER `dept_id`; ALTER TABLE `sys_user` MODIFY COLUMN `nick_name` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户昵称' AFTER `user_name`; ALTER TABLE `sys_user` ADD COLUMN `phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '手机号码' AFTER `email`; @@ -45,15 +44,18 @@ ALTER TABLE `sys_user` ADD COLUMN `login_time` bigint(20) NULL DEFAULT 0 COMMENT ALTER TABLE `sys_user` MODIFY COLUMN `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者' AFTER `login_time`; ALTER TABLE `sys_user` MODIFY COLUMN `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者' AFTER `create_time`; ALTER TABLE `sys_user` MODIFY COLUMN `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注' AFTER `update_time`; +ALTER TABLE `sys_user` ADD COLUMN `user_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'System' COMMENT '用户类型(System系统用户)' AFTER `password`; +ALTER TABLE `sys_user` ADD COLUMN `user_source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '#' COMMENT '用户来源UID (系统#)' AFTER `user_type`; ALTER TABLE `sys_user` COMMENT = '系统_用户信息表'; -- ---------------------------- -- Data for sys_user -- ---------------------------- -INSERT IGNORE INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT IGNORE INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT IGNORE INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -INSERT IGNORE INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); -UPDATE `sys_user` SET `status_flag` = '1' WHERE `user_id` in (1,2,3,4); +INSERT IGNORE INTO `sys_user` VALUES (1, 100, 'supervisor', 'supervisor', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT IGNORE INTO `sys_user` VALUES (2, 100, 'admin', 'admin', '', '', '0', '', '$2a$10$QgIcp6yuOEGrEU0TNU12K.uQRLbcufesEU7hiRYlRSSdUO7OAkoTq', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT IGNORE INTO `sys_user` VALUES (3, 100, 'manager', 'manager', '', '', '0', '', '$2a$10$RND3fUw9Ai.WcggYSI57tu.u3OIlktdPxFzlWkmiHC1paV038t0I2', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +INSERT IGNORE INTO `sys_user` VALUES (4, 100, 'monitor', 'monitor', '', '', '0', '', '$2a$10$t3zpKQ0olECotFyI1yO43.tCoS0EXoSRBDcqwl09xvrsmn14qFHHy', 'System', '#', '1', '0', 0, 0, '127.0.0.1', 0, 'system', 0, '', 0, ''); +UPDATE `sys_user` SET `status_flag` = '1', `user_type` = 'System', `user_source` = '#' WHERE `user_id` in (1,2,3,4); + -- Dump completed on 2025-02-14 15:26:56 diff --git a/src/modules/auth/auth.go b/src/modules/auth/auth.go index 11e64407..801e916f 100644 --- a/src/modules/auth/auth.go +++ b/src/modules/auth/auth.go @@ -23,38 +23,84 @@ func Setup(router *gin.Engine) { ) // 账号身份操作 + account := controller.NewAccount + accountGroup := router.Group("/auth") { - router.POST("/auth/login", + accountGroup.POST("/login", middleware.RateLimit(middleware.LimitOption{ Time: 180, Count: 15, Type: middleware.LIMIT_IP, }), - controller.NewAccount.Login, + account.Login, ) - router.POST("/auth/logout", + accountGroup.POST("/logout", middleware.RateLimit(middleware.LimitOption{ Time: 120, Count: 15, Type: middleware.LIMIT_IP, }), - controller.NewAccount.Logout, + account.Logout, ) - router.POST("/auth/refresh-token", + accountGroup.POST("/refresh-token", middleware.RateLimit(middleware.LimitOption{ Time: 60, Count: 5, Type: middleware.LIMIT_IP, }), - controller.NewAccount.RefreshToken, + account.RefreshToken, ) router.GET("/me", middleware.AuthorizeUser(nil), - controller.NewAccount.Me, + account.Me, ) router.GET("/router", middleware.AuthorizeUser(nil), - controller.NewAccount.Router, + account.Router, + ) + } + + // 登录认证源 + { + 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, ) } diff --git a/src/modules/auth/controller/account.go b/src/modules/auth/controller/account.go index e3584682..b95cf140 100644 --- a/src/modules/auth/controller/account.go +++ b/src/modules/auth/controller/account.go @@ -4,16 +4,13 @@ import ( "fmt" "time" - "be.ems/src/framework/config" "be.ems/src/framework/constants" "be.ems/src/framework/i18n" "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/token" "be.ems/src/framework/utils/parse" - "be.ems/src/modules/auth/model" "be.ems/src/modules/auth/service" - systemModelVO "be.ems/src/modules/system/model/vo" systemService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" @@ -33,95 +30,6 @@ type AccountController struct { sysLogLoginService *systemService.SysLogLogin // 系统登录访问 } -// Login 系统登录 -// -// POST /auth/login -// -// @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 [post] -func (s AccountController) Login(c *gin.Context) { - language := reqctx.AcceptLanguage(c) - var body model.LoginBody - 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) - - // 校验验证码 根据错误信息,创建系统访问记录 - if err := s.accountService.ValidateCaptcha(body.Code, body.UUID); err != nil { - msg := fmt.Sprintf("%s code %s", err.Error(), body.Code) - s.sysLogLoginService.Insert( - body.Username, constants.STATUS_NO, msg, - [4]string{ipaddr, location, os, browser}, - ) - c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) - return - } - - // 登录用户信息 - info, err := s.accountService.ByUsername(body.Username, body.Password) - if err != nil { - s.sysLogLoginService.Insert( - body.Username, constants.STATUS_NO, err.Error(), - [4]string{ipaddr, location, os, browser}, - ) - c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) - return - } - - data := map[string]any{} - - if !config.IsSystemUser(info.UserId) { - // 强制改密码 - forcePasswdChange, err := s.accountService.PasswordCountOrExpireTime(info.User.LoginCount, info.User.PasswordUpdateTime) - if err != nil { - c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) - return - } - if forcePasswdChange { - data["forcePasswdChange"] = true - } - } - - deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId) - - // 生成访问令牌 - accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access") - if accessToken == "" || expiresIn == 0 { - c.JSON(200, resp.ErrMsg("token generation failed")) - return - } - // 生成刷新令牌 - refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh") - - // 记录令牌,创建系统访问记录 - token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser}) - s.accountService.UpdateLoginDateAndIP(info) - s.sysLogLoginService.Insert( - body.Username, constants.STATUS_YES, "app.common.loginSuccess", - [4]string{ipaddr, location, os, browser}, - ) - - data["tokenType"] = constants.HEADER_PREFIX - data["accessToken"] = accessToken - data["expiresIn"] = expiresIn - data["refreshToken"] = refreshToken - data["refreshExpiresIn"] = refreshExpiresIn - data["userId"] = info.UserId - c.JSON(200, resp.OkData(data)) -} - // Logout 系统登出 // // POST /auth/logout @@ -222,82 +130,10 @@ func (s AccountController) RefreshToken(c *gin.Context) { })) } -// Me 登录用户信息 +// LoginSource 登录认证源 // -// GET /me -// -// @Tags common/authorization -// @Accept json -// @Produce json -// @Success 200 {object} object "Response Results" -// @Security TokenAuth -// @Summary Login User Information -// @Description Login User Information -// @Router /me [get] -func (s AccountController) Me(c *gin.Context) { - language := reqctx.AcceptLanguage(c) - info, err := reqctx.LoginUser(c) - if err != nil { - c.JSON(401, resp.CodeMsg(resp.CODE_AUTH_INVALID, err.Error())) - return - } - - // 角色权限集合,系统管理员拥有所有权限 - isSystemUser := config.IsSystemUser(info.UserId) - roles, perms := s.accountService.RoleAndMenuPerms(info.UserId, isSystemUser) - - info.User.NickName = i18n.TKey(language, info.User.NickName) - info.User.Remark = i18n.TKey(language, info.User.Remark) - info.User.Dept.DeptName = i18n.TKey(language, info.User.Dept.DeptName) - for ri := range info.User.Roles { - info.User.Roles[ri].RoleName = i18n.TKey(language, info.User.Roles[ri].RoleName) - } - - data := map[string]any{ - "user": info.User, - "roles": roles, - "permissions": perms, - } - if !isSystemUser { - // 强制改密码 - forcePasswdChange, _ := s.accountService.PasswordCountOrExpireTime(info.User.LoginCount, info.User.PasswordUpdateTime) - if forcePasswdChange { - data["forcePasswdChange"] = true - } - } +// GET /auth/login/source +func (s AccountController) LoginSource(c *gin.Context) { + data := s.accountService.LoginSource() c.JSON(200, resp.OkData(data)) } - -// Router 登录用户路由信息 -// -// GET /router -// -// @Tags common/authorization -// @Accept json -// @Produce json -// @Success 200 {object} object "Response Results" -// @Security TokenAuth -// @Summary Login User Routing Information -// @Description Login User Routing Information -// @Router /router [get] -func (s AccountController) Router(c *gin.Context) { - loginUserId := reqctx.LoginUserToUserID(c) - - // 前端路由,系统管理员拥有所有 - isSystemUser := config.IsSystemUser(loginUserId) - buildMenus := s.accountService.RouteMenus(loginUserId, isSystemUser) - // 闭包函数处理多语言 - language := reqctx.AcceptLanguage(c) - var converI18n func(language string, arr *[]systemModelVO.Router) - converI18n = func(language string, arr *[]systemModelVO.Router) { - for i := range *arr { - (*arr)[i].Meta.Title = i18n.TKey(language, (*arr)[i].Meta.Title) - if len((*arr)[i].Children) > 0 { - converI18n(language, &(*arr)[i].Children) - } - } - } - converI18n(language, &buildMenus) - - c.JSON(200, resp.OkData(buildMenus)) -} diff --git a/src/modules/auth/controller/account_info.go b/src/modules/auth/controller/account_info.go new file mode 100644 index 00000000..49c5ec41 --- /dev/null +++ b/src/modules/auth/controller/account_info.go @@ -0,0 +1,93 @@ +package controller + +import ( + "be.ems/src/framework/config" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + systemModelVO "be.ems/src/modules/system/model/vo" + + "github.com/gin-gonic/gin" +) + +// Me 登录用户信息 +// +// GET /me +// +// @Tags common/authorization +// @Accept json +// @Produce json +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Login User Information +// @Description Login User Information +// @Router /me [get] +func (s AccountController) Me(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + info, err := reqctx.LoginUser(c) + if err != nil { + c.JSON(401, resp.CodeMsg(resp.CODE_AUTH_INVALID, err.Error())) + return + } + + // 角色权限集合,系统管理员拥有所有权限 + isSystemUser := config.IsSystemUser(info.UserId) + roles, perms := s.accountService.RoleAndMenuPerms(info.UserId, isSystemUser) + + info.User.NickName = i18n.TKey(language, info.User.NickName) + info.User.Remark = i18n.TKey(language, info.User.Remark) + if info.User.Dept != nil { + info.User.Dept.DeptName = i18n.TKey(language, info.User.Dept.DeptName) + } + for ri := range info.User.Roles { + info.User.Roles[ri].RoleName = i18n.TKey(language, info.User.Roles[ri].RoleName) + } + + data := map[string]any{ + "user": info.User, + "roles": roles, + "permissions": perms, + } + if !isSystemUser { + // 强制改密码 + forcePasswdChange, _ := s.accountService.PasswordCountOrExpireTime(info.User.LoginCount, info.User.PasswordUpdateTime) + if forcePasswdChange { + data["forcePasswdChange"] = true + } + } + c.JSON(200, resp.OkData(data)) +} + +// Router 登录用户路由信息 +// +// GET /router +// +// @Tags common/authorization +// @Accept json +// @Produce json +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Login User Routing Information +// @Description Login User Routing Information +// @Router /router [get] +func (s AccountController) Router(c *gin.Context) { + loginUserId := reqctx.LoginUserToUserID(c) + + // 前端路由,系统管理员拥有所有 + isSystemUser := config.IsSystemUser(loginUserId) + buildMenus := s.accountService.RouteMenus(loginUserId, isSystemUser) + // 闭包函数处理多语言 + language := reqctx.AcceptLanguage(c) + var converI18n func(language string, arr *[]systemModelVO.Router) + converI18n = func(language string, arr *[]systemModelVO.Router) { + for i := range *arr { + (*arr)[i].Meta.Title = i18n.TKey(language, (*arr)[i].Meta.Title) + if len((*arr)[i].Children) > 0 { + converI18n(language, &(*arr)[i].Children) + } + } + } + converI18n(language, &buildMenus) + + c.JSON(200, resp.OkData(buildMenus)) +} diff --git a/src/modules/auth/controller/account_ldap.go b/src/modules/auth/controller/account_ldap.go new file mode 100644 index 00000000..d2510d96 --- /dev/null +++ b/src/modules/auth/controller/account_ldap.go @@ -0,0 +1,80 @@ +package controller + +import ( + "fmt" + + "be.ems/src/framework/constants" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" + "be.ems/src/modules/auth/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) + + // 登录用户信息 + info, err := s.accountService.ByLDAP(body) + if err != nil { + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_NO, err.Error(), + [4]string{ipaddr, location, os, browser}, + ) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + + data := map[string]any{} + + deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId) + + // 生成访问令牌 + accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access") + if accessToken == "" || expiresIn == 0 { + c.JSON(200, resp.ErrMsg("token generation failed")) + return + } + // 生成刷新令牌 + refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh") + + // 记录令牌,创建系统访问记录 + token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser}) + s.accountService.UpdateLoginDateAndIP(info) + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_YES, "app.common.loginSuccess", + [4]string{ipaddr, location, os, browser}, + ) + + data["tokenType"] = constants.HEADER_PREFIX + data["accessToken"] = accessToken + data["expiresIn"] = expiresIn + data["refreshToken"] = refreshToken + data["refreshExpiresIn"] = refreshExpiresIn + data["userId"] = info.UserId + c.JSON(200, resp.OkData(data)) +} diff --git a/src/modules/auth/controller/account_oauth2.go b/src/modules/auth/controller/account_oauth2.go new file mode 100644 index 00000000..1a90bccd --- /dev/null +++ b/src/modules/auth/controller/account_oauth2.go @@ -0,0 +1,107 @@ +package controller + +import ( + "fmt" + + "be.ems/src/framework/constants" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" + "be.ems/src/modules/auth/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) + + // 登录用户信息 + info, err := s.accountService.ByOAuth2(body) + if err != nil { + s.sysLogLoginService.Insert( + body.State, constants.STATUS_NO, err.Error(), + [4]string{ipaddr, location, os, browser}, + ) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + + data := map[string]any{} + + deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId) + + // 生成访问令牌 + accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access") + if accessToken == "" || expiresIn == 0 { + c.JSON(200, resp.ErrMsg("token generation failed")) + return + } + // 生成刷新令牌 + refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh") + + // 记录令牌,创建系统访问记录 + token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser}) + s.accountService.UpdateLoginDateAndIP(info) + s.sysLogLoginService.Insert( + body.State, constants.STATUS_YES, "app.common.loginSuccess", + [4]string{ipaddr, location, os, browser}, + ) + + data["tokenType"] = constants.HEADER_PREFIX + data["accessToken"] = accessToken + data["expiresIn"] = expiresIn + data["refreshToken"] = refreshToken + data["refreshExpiresIn"] = refreshExpiresIn + data["userId"] = info.UserId + c.JSON(200, resp.OkData(data)) +} diff --git a/src/modules/auth/controller/account_smtp.go b/src/modules/auth/controller/account_smtp.go new file mode 100644 index 00000000..ab94e0bd --- /dev/null +++ b/src/modules/auth/controller/account_smtp.go @@ -0,0 +1,80 @@ +package controller + +import ( + "fmt" + + "be.ems/src/framework/constants" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" + "be.ems/src/modules/auth/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) + + // 登录用户信息 + info, err := s.accountService.BySMTP(body) + if err != nil { + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_NO, err.Error(), + [4]string{ipaddr, location, os, browser}, + ) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + + data := map[string]any{} + + deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId) + + // 生成访问令牌 + accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access") + if accessToken == "" || expiresIn == 0 { + c.JSON(200, resp.ErrMsg("token generation failed")) + return + } + // 生成刷新令牌 + refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh") + + // 记录令牌,创建系统访问记录 + token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser}) + s.accountService.UpdateLoginDateAndIP(info) + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_YES, "app.common.loginSuccess", + [4]string{ipaddr, location, os, browser}, + ) + + data["tokenType"] = constants.HEADER_PREFIX + data["accessToken"] = accessToken + data["expiresIn"] = expiresIn + data["refreshToken"] = refreshToken + data["refreshExpiresIn"] = refreshExpiresIn + data["userId"] = info.UserId + c.JSON(200, resp.OkData(data)) +} diff --git a/src/modules/auth/controller/account_system.go b/src/modules/auth/controller/account_system.go new file mode 100644 index 00000000..d9721a1e --- /dev/null +++ b/src/modules/auth/controller/account_system.go @@ -0,0 +1,104 @@ +package controller + +import ( + "fmt" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/i18n" + "be.ems/src/framework/reqctx" + "be.ems/src/framework/resp" + "be.ems/src/framework/token" + "be.ems/src/modules/auth/model" + + "github.com/gin-gonic/gin" +) + +// Login 系统登录 +// +// POST /auth/login +// +// @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 [post] +func (s AccountController) Login(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body model.LoginBody + 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) + + // 校验验证码 根据错误信息,创建系统访问记录 + if err := s.accountService.ValidateCaptcha(body.Code, body.UUID); err != nil { + msg := fmt.Sprintf("%s code %s", err.Error(), body.Code) + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_NO, msg, + [4]string{ipaddr, location, os, browser}, + ) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + + // 登录用户信息 + info, err := s.accountService.ByUsername(body.Username, body.Password) + if err != nil { + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_NO, err.Error(), + [4]string{ipaddr, location, os, browser}, + ) + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + + data := map[string]any{} + + if !config.IsSystemUser(info.UserId) { + // 强制改密码 + forcePasswdChange, err := s.accountService.PasswordCountOrExpireTime(info.User.LoginCount, info.User.PasswordUpdateTime) + if err != nil { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + if forcePasswdChange { + data["forcePasswdChange"] = true + } + } + + deviceFingerprint := reqctx.DeviceFingerprint(c, info.UserId) + + // 生成访问令牌 + accessToken, expiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "access") + if accessToken == "" || expiresIn == 0 { + c.JSON(200, resp.ErrMsg("token generation failed")) + return + } + // 生成刷新令牌 + refreshToken, refreshExpiresIn := token.UserTokenCreate(info.UserId, deviceFingerprint, "refresh") + + // 记录令牌,创建系统访问记录 + token.UserInfoCreate(&info, deviceFingerprint, [4]string{ipaddr, location, os, browser}) + s.accountService.UpdateLoginDateAndIP(info) + s.sysLogLoginService.Insert( + body.Username, constants.STATUS_YES, "app.common.loginSuccess", + [4]string{ipaddr, location, os, browser}, + ) + + data["tokenType"] = constants.HEADER_PREFIX + data["accessToken"] = accessToken + data["expiresIn"] = expiresIn + data["refreshToken"] = refreshToken + data["refreshExpiresIn"] = refreshExpiresIn + data["userId"] = info.UserId + c.JSON(200, resp.OkData(data)) +} diff --git a/src/modules/auth/model/login_body.go b/src/modules/auth/model/login_body.go index ec37763e..78546991 100644 --- a/src/modules/auth/model/login_body.go +++ b/src/modules/auth/model/login_body.go @@ -2,15 +2,8 @@ package model // LoginBody 用户登录对象 type LoginBody struct { - // Username 用户名 - Username string `json:"username" binding:"required"` - - // Password 用户密码 - Password string `json:"password" binding:"required"` - - // Code 验证码 - Code string `json:"code"` - - // UUID 验证码唯一标识 - UUID string `json:"uuid"` + Username string `json:"username" binding:"required"` // Username 用户名 + Password string `json:"password" binding:"required"` // Password 用户密码 + Code string `json:"code"` // Code 验证码 + UUID string `json:"uuid"` // UUID 验证码唯一标识 } diff --git a/src/modules/auth/model/login_source_vo.go b/src/modules/auth/model/login_source_vo.go new file mode 100644 index 00000000..7b63ad57 --- /dev/null +++ b/src/modules/auth/model/login_source_vo.go @@ -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 状态-认证源唯一标识 +} diff --git a/src/modules/auth/model/register_body.go b/src/modules/auth/model/register_body.go index 4bf11142..9354306a 100644 --- a/src/modules/auth/model/register_body.go +++ b/src/modules/auth/model/register_body.go @@ -2,21 +2,10 @@ package model // RegisterBody 用户注册对象 type RegisterBody struct { - // Username 用户名 - Username string `json:"username" binding:"required"` - - // Password 用户密码 - Password string `json:"password" binding:"required"` - - // ConfirmPassword 用户确认密码 - ConfirmPassword string `json:"confirmPassword" binding:"required"` - - // Code 验证码 - Code string `json:"code"` - - // UUID 验证码唯一标识 - UUID string `json:"uuid"` - - // UserType 标记用户类型 - UserType string `json:"userType"` + Username string `json:"username" binding:"required"` // Username 用户名 + Password string `json:"password" binding:"required"` // Password 用户密码 + ConfirmPassword string `json:"confirmPassword" binding:"required"` // ConfirmPassword 用户确认密码 + Code string `json:"code"` // Code 验证码 + UUID string `json:"uuid"` // UUID 验证码唯一标识 + UserType string `json:"userType"` // UserType 标记用户类型 } diff --git a/src/modules/auth/service/account.go b/src/modules/auth/service/account.go index bc8d605a..d4939326 100644 --- a/src/modules/auth/service/account.go +++ b/src/modules/auth/service/account.go @@ -2,102 +2,32 @@ package service import ( "fmt" - "time" "be.ems/src/framework/config" "be.ems/src/framework/constants" - "be.ems/src/framework/database/redis" "be.ems/src/framework/token" - "be.ems/src/framework/utils/crypto" "be.ems/src/framework/utils/parse" - systemModelVO "be.ems/src/modules/system/model/vo" + "be.ems/src/modules/auth/model" + systemModel "be.ems/src/modules/system/model" systemService "be.ems/src/modules/system/service" ) // 实例化服务层 Account 结构体 var NewAccount = &Account{ - sysUserService: systemService.NewSysUser, - sysConfigService: systemService.NewSysConfig, - sysRoleService: systemService.NewSysRole, - sysMenuService: systemService.NewSysMenu, + sysUserService: systemService.NewSysUser, + sysConfigService: systemService.NewSysConfig, + sysRoleService: systemService.NewSysRole, + sysMenuService: systemService.NewSysMenu, + sysLogSourceService: systemService.NewSysLoginSource, } // 账号身份操作服务 服务层处理 type Account struct { - sysUserService *systemService.SysUser // 用户信息服务 - sysConfigService *systemService.SysConfig // 参数配置服务 - sysRoleService *systemService.SysRole // 角色服务 - sysMenuService *systemService.SysMenu // 菜单服务 -} - -// ValidateCaptcha 校验验证码 -func (s *Account) ValidateCaptcha(code, uuid string) error { - // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 - captchaEnabledStr := s.sysConfigService.FindValueByKey("sys.account.captchaEnabled") - if !parse.Boolean(captchaEnabledStr) { - return nil - } - if code == "" || uuid == "" { - // 验证码信息错误 - return fmt.Errorf("captcha.err") - } - verifyKey := constants.CACHE_CAPTCHA_CODE + ":" + uuid - captcha, _ := redis.Get("", verifyKey) - if captcha == "" { - // 验证码已失效 - return fmt.Errorf("captcha.errValid") - } - _ = redis.Del("", verifyKey) - if captcha != code { - // 验证码错误 - return fmt.Errorf("captcha.err") - } - return nil -} - -// ByUsername 登录创建用户信息 -func (s Account) ByUsername(username, password string) (token.UserInfo, error) { - info := token.UserInfo{} - - // 检查密码重试次数 - retryKey, retryCount, lockTime, err := s.passwordRetryCount(username) - if err != nil { - return info, err - } - - // 查询用户登录账号 - sysUser := s.sysUserService.FindByUserName(username) - if sysUser.UserName != username { - return info, fmt.Errorf("login.errNameOrPasswd") - } - if sysUser.DelFlag == constants.STATUS_YES { - return info, fmt.Errorf("login.errDelFlag") - } - if sysUser.StatusFlag == constants.STATUS_NO { - return info, fmt.Errorf("login.errStatus") - } - - // 检验用户密码 - compareBool := crypto.BcryptCompare(password, sysUser.Password) - if compareBool { - s.CleanLoginRecordCache(sysUser.UserName) // 清除错误记录次数 - } else { - _ = redis.Set("", retryKey, retryCount+1, lockTime) - return info, fmt.Errorf("login.errNameOrPasswd") - } - - // 登录用户信息 - info.UserId = sysUser.UserId - info.DeptId = sysUser.DeptId - info.User = sysUser - // 用户权限组标识 - if config.IsSystemUser(sysUser.UserId) { - info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} - } else { - perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) - info.Permissions = parse.RemoveDuplicates(perms) - } - return info, nil + sysUserService *systemService.SysUser // 用户信息服务 + sysConfigService *systemService.SysConfig // 参数配置服务 + sysRoleService *systemService.SysRole // 角色服务 + sysMenuService *systemService.SysMenu // 菜单服务 + sysLogSourceService *systemService.SysLoginSource // 认证源 } // ByUserId 用户ID刷新令牌创建用户信息 @@ -140,86 +70,43 @@ func (s Account) UpdateLoginDateAndIP(info token.UserInfo) bool { return s.sysUserService.Update(user) > 0 } -// CleanLoginRecordCache 清除错误记录次数 -func (s Account) CleanLoginRecordCache(userName string) bool { - cacheKey := fmt.Sprintf("%s:%s", constants.CACHE_PWD_ERR_COUNT, userName) - hasKey, err := redis.Has("", cacheKey) - if hasKey > 0 && err == nil { - return redis.Del("", cacheKey) == nil +// 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 false + return data } -// passwordRetryCount 密码重试次数 -func (s Account) passwordRetryCount(userName string) (string, int64, time.Duration, error) { - // 从数据库配置获取登录次数和错误锁定时间 - maxRetryCountStr := s.sysConfigService.FindValueByKey("sys.user.maxRetryCount") - lockTimeStr := s.sysConfigService.FindValueByKey("sys.user.lockTime") - // 验证登录次数和错误锁定时间 - maxRetryCount := parse.Number(maxRetryCountStr) - lockTime := parse.Number(lockTimeStr) +// 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", // 性别未选择 + StatusFlag: constants.STATUS_YES, // 账号状态激活 + DeptId: 101, // 归属部门为根节点 + CreateBy: sType, // 创建来源 + } - // 验证缓存记录次数 - retryKey := fmt.Sprintf("%s:%s", constants.CACHE_PWD_ERR_COUNT, userName) - retryCount, err := redis.Get("", retryKey) - if retryCount == "" || err != nil { - retryCount = "0" + // 新增用户的角色管理 + sysUser.RoleIds = []int64{5} + // 新增用户的岗位管理 + sysUser.PostIds = []int64{} + + insertId := s.sysUserService.Insert(sysUser) + if insertId > 0 { + sysUser.UserId = insertId } - // 是否超过错误值 - retryCountInt64 := parse.Number(retryCount) - if retryCountInt64 >= int64(maxRetryCount) { - // msg := fmt.Sprintf("密码输入错误 %d 次,帐户锁定 %d 分钟", maxRetryCount, lockTime) - msg := fmt.Errorf("login.errRetryPasswd") // 密码输入错误多次,帐户已被锁定 - return retryKey, retryCountInt64, time.Duration(lockTime) * time.Minute, fmt.Errorf("%s", msg) - } - return retryKey, retryCountInt64, time.Duration(lockTime) * time.Minute, nil -} - -// PasswordCountOrExpireTime 首次登录或密码过期时间 -func (s Account) PasswordCountOrExpireTime(loginCount, passwordUpdateTime int64) (bool, error) { - forcePasswdChange := false - // 从数据库配置获取-首次登录密码修改 - fristPasswdChangeStr := s.sysConfigService.FindValueByKey("sys.user.fristPasswdChange") - if parse.Boolean(fristPasswdChangeStr) { - forcePasswdChange = loginCount < 1 || passwordUpdateTime == 0 - } - - // 非首次登录,判断密码是否过期 - if !forcePasswdChange { - alert, err := s.sysUserService.ValidatePasswordExpireTime(passwordUpdateTime) - if err != nil { - return alert, err - } - forcePasswdChange = alert - } - return forcePasswdChange, nil -} - -// RoleAndMenuPerms 角色和菜单数据权限 -func (s Account) RoleAndMenuPerms(userId int64, isSystemUser bool) ([]string, []string) { - if isSystemUser { - return []string{constants.SYS_ROLE_SYSTEM_KEY}, []string{constants.SYS_PERMISSION_SYSTEM} - } - // 角色key - var roleGroup []string - roles := s.sysRoleService.FindByUserId(userId) - for _, role := range roles { - roleGroup = append(roleGroup, role.RoleKey) - } - // 菜单权限key - perms := s.sysMenuService.FindPermsByUserId(userId) - return parse.RemoveDuplicates(roleGroup), parse.RemoveDuplicates(perms) -} - -// RouteMenus 前端路由所需要的菜单 -func (s Account) RouteMenus(userId int64, isSystemUser bool) []systemModelVO.Router { - var buildMenus []systemModelVO.Router - if isSystemUser { - menus := s.sysMenuService.BuildTreeMenusByUserId(0) - buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") - } else { - menus := s.sysMenuService.BuildTreeMenusByUserId(userId) - buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") - } - return buildMenus + return s.sysUserService.FindByUserName(username, sType, uid) } diff --git a/src/modules/auth/service/account_info.go b/src/modules/auth/service/account_info.go new file mode 100644 index 00000000..5c22a16b --- /dev/null +++ b/src/modules/auth/service/account_info.go @@ -0,0 +1,36 @@ +package service + +import ( + "be.ems/src/framework/constants" + "be.ems/src/framework/utils/parse" + systemModelVO "be.ems/src/modules/system/model/vo" +) + +// RoleAndMenuPerms 角色和菜单数据权限 +func (s Account) RoleAndMenuPerms(userId int64, isSystemUser bool) ([]string, []string) { + if isSystemUser { + return []string{constants.SYS_ROLE_SYSTEM_KEY}, []string{constants.SYS_PERMISSION_SYSTEM} + } + // 角色key + var roleGroup []string + roles := s.sysRoleService.FindByUserId(userId) + for _, role := range roles { + roleGroup = append(roleGroup, role.RoleKey) + } + // 菜单权限key + perms := s.sysMenuService.FindPermsByUserId(userId) + return parse.RemoveDuplicates(roleGroup), parse.RemoveDuplicates(perms) +} + +// RouteMenus 前端路由所需要的菜单 +func (s Account) RouteMenus(userId int64, isSystemUser bool) []systemModelVO.Router { + var buildMenus []systemModelVO.Router + if isSystemUser { + menus := s.sysMenuService.BuildTreeMenusByUserId(0) + buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") + } else { + menus := s.sysMenuService.BuildTreeMenusByUserId(userId) + buildMenus = s.sysMenuService.BuildRouteMenus(menus, "") + } + return buildMenus +} diff --git a/src/modules/auth/service/account_ldap.go b/src/modules/auth/service/account_ldap.go new file mode 100644 index 00000000..999fba21 --- /dev/null +++ b/src/modules/auth/service/account_ldap.go @@ -0,0 +1,108 @@ +package service + +import ( + "encoding/json" + "fmt" + + "github.com/go-ldap/ldap/v3" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/token" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/auth/model" + systemModelVo "be.ems/src/modules/system/model/vo" +) + +// ByLDAP 登录创建用户信息 +func (s *Account) ByLDAP(body model.LoginSourceBody) (token.UserInfo, error) { + info := token.UserInfo{} + rows := s.sysLogSourceService.FindByActive(body.UID) + if len(rows) != 1 { + return info, fmt.Errorf("ldap auth source not exist") + } + item := rows[0] + if item.Config == "" { + return info, fmt.Errorf("ldap auth source config is empty") + } + var source systemModelVo.SysLoginSourceLDAP + if err := json.Unmarshal([]byte(item.Config), &source); err != nil { + return info, err + } + + // 校验LDAP用户 + err := ldapAuth(source, body.Username, body.Password) + if err != nil { + return info, err + } + + // 查询用户登录账号 + sysUser := s.sysUserService.FindByUserName(body.Username, item.Type, item.UID) + if sysUser.UserId == 0 || sysUser.UserName == "" { + sysUser = s.initLoginSourceUser(item.UID, item.Type, body.Username, body.Password) + } + if sysUser.UserId == 0 || sysUser.UserName != body.Username { + return info, fmt.Errorf("login.errNameOrPasswd") + } + if sysUser.DelFlag == constants.STATUS_YES { + return info, fmt.Errorf("login.errDelFlag") + } + if sysUser.StatusFlag == constants.STATUS_NO { + return info, fmt.Errorf("login.errStatus") + } + + // 登录用户信息 + info.UserId = sysUser.UserId + info.DeptId = sysUser.DeptId + info.User = sysUser + // 用户权限组标识 + if config.IsSystemUser(sysUser.UserId) { + info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} + } else { + perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) + info.Permissions = parse.RemoveDuplicates(perms) + } + return info, 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 +} diff --git a/src/modules/auth/service/account_oauth2.go b/src/modules/auth/service/account_oauth2.go new file mode 100644 index 00000000..c9c51d9e --- /dev/null +++ b/src/modules/auth/service/account_oauth2.go @@ -0,0 +1,168 @@ +package service + +import ( + "context" + "encoding/json" + "fmt" + "reflect" + "strings" + "time" + + "golang.org/x/oauth2" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/token" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/auth/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) (token.UserInfo, error) { + info := token.UserInfo{} + rows := s.sysLogSourceService.FindByActive(body.State) + if len(rows) != 1 { + return info, fmt.Errorf("oauth2 auth source not exist") + } + item := rows[0] + if item.Config == "" { + return info, fmt.Errorf("oauth2 auth source config is empty") + } + var source systemModelVo.SysLoginSourceOAuth2 + if err := json.Unmarshal([]byte(item.Config), &source); err != nil { + return info, err + } + + // 校验OAuth2用户 + account, err := oauth2Auth(source, body.Code) + if err != nil { + return info, err + } + + // 查询用户登录账号 + sysUser := s.sysUserService.FindByUserName(account, item.Type, item.UID) + if sysUser.UserId == 0 || sysUser.UserName == "" { + sysUser = s.initLoginSourceUser(item.UID, item.Type, account, account) + } + if sysUser.UserId == 0 || sysUser.UserName != account { + return info, fmt.Errorf("login.errNameOrPasswd") + } + if sysUser.DelFlag == constants.STATUS_YES { + return info, fmt.Errorf("login.errDelFlag") + } + if sysUser.StatusFlag == constants.STATUS_NO { + return info, fmt.Errorf("login.errStatus") + } + + // 登录用户信息 + info.UserId = sysUser.UserId + info.DeptId = sysUser.DeptId + info.User = sysUser + // 用户权限组标识 + if config.IsSystemUser(sysUser.UserId) { + info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} + } else { + perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) + info.Permissions = parse.RemoveDuplicates(perms) + } + return info, 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 +} diff --git a/src/modules/auth/service/account_smtp.go b/src/modules/auth/service/account_smtp.go new file mode 100644 index 00000000..020cd4e4 --- /dev/null +++ b/src/modules/auth/service/account_smtp.go @@ -0,0 +1,88 @@ +package service + +import ( + "context" + "crypto/tls" + "encoding/json" + "fmt" + + "github.com/wneessen/go-mail" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/token" + "be.ems/src/framework/utils/parse" + "be.ems/src/modules/auth/model" + systemModelVo "be.ems/src/modules/system/model/vo" +) + +// BySMTP 登录创建用户信息 +func (s *Account) BySMTP(body model.LoginSourceBody) (token.UserInfo, error) { + info := token.UserInfo{} + rows := s.sysLogSourceService.FindByActive(body.UID) + if len(rows) != 1 { + return info, fmt.Errorf("smtp auth source not exist") + } + item := rows[0] + if item.Config == "" { + return info, fmt.Errorf("smtp auth source config is empty") + } + var source systemModelVo.SysLoginSourceSMTP + if err := json.Unmarshal([]byte(item.Config), &source); err != nil { + return info, err + } + + // 校验SMTP用户 + err := smtpAuth(source, body.Username, body.Password) + if err != nil { + return info, err + } + + // 查询用户登录账号 + sysUser := s.sysUserService.FindByUserName(body.Username, item.Type, item.UID) + if sysUser.UserId == 0 || sysUser.UserName == "" { + sysUser = s.initLoginSourceUser(item.UID, item.Type, body.Username, body.Password) + } + if sysUser.UserId == 0 || sysUser.UserName != body.Username { + return info, fmt.Errorf("login.errNameOrPasswd") + } + if sysUser.DelFlag == constants.STATUS_YES { + return info, fmt.Errorf("login.errDelFlag") + } + if sysUser.StatusFlag == constants.STATUS_NO { + return info, fmt.Errorf("login.errStatus") + } + + // 登录用户信息 + info.UserId = sysUser.UserId + info.DeptId = sysUser.DeptId + info.User = sysUser + // 用户权限组标识 + if config.IsSystemUser(sysUser.UserId) { + info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} + } else { + perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) + info.Permissions = parse.RemoveDuplicates(perms) + } + return info, 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 +} diff --git a/src/modules/auth/service/account_sysstem.go b/src/modules/auth/service/account_sysstem.go new file mode 100644 index 00000000..21b45238 --- /dev/null +++ b/src/modules/auth/service/account_sysstem.go @@ -0,0 +1,138 @@ +package service + +import ( + "fmt" + "time" + + "be.ems/src/framework/config" + "be.ems/src/framework/constants" + "be.ems/src/framework/database/redis" + "be.ems/src/framework/token" + "be.ems/src/framework/utils/crypto" + "be.ems/src/framework/utils/parse" +) + +// ValidateCaptcha 校验验证码 +func (s Account) ValidateCaptcha(code, uuid string) error { + // 验证码检查,从数据库配置获取验证码开关 true开启,false关闭 + captchaEnabledStr := s.sysConfigService.FindValueByKey("sys.account.captchaEnabled") + if !parse.Boolean(captchaEnabledStr) { + return nil + } + if code == "" || uuid == "" { + // 验证码信息错误 + return fmt.Errorf("captcha.err") + } + verifyKey := constants.CACHE_CAPTCHA_CODE + ":" + uuid + captcha, _ := redis.Get("", verifyKey) + if captcha == "" { + // 验证码已失效 + return fmt.Errorf("captcha.errValid") + } + _ = redis.Del("", verifyKey) + if captcha != code { + // 验证码错误 + return fmt.Errorf("captcha.err") + } + return nil +} + +// ByUsername 登录创建用户信息 +func (s Account) ByUsername(username, password string) (token.UserInfo, error) { + info := token.UserInfo{} + + // 检查密码重试次数 + retryKey, retryCount, lockTime, err := s.passwordRetryCount(username) + if err != nil { + return info, err + } + + // 查询用户登录账号 + sysUser := s.sysUserService.FindByUserName(username, "System", "#") + if sysUser.UserName != username { + return info, fmt.Errorf("login.errNameOrPasswd") + } + if sysUser.DelFlag == constants.STATUS_YES { + return info, fmt.Errorf("login.errDelFlag") + } + if sysUser.StatusFlag == constants.STATUS_NO { + return info, fmt.Errorf("login.errStatus") + } + + // 检验用户密码 + compareBool := crypto.BcryptCompare(password, sysUser.Password) + if compareBool { + s.CleanLoginRecordCache(sysUser.UserName) // 清除错误记录次数 + } else { + _ = redis.Set("", retryKey, retryCount+1, lockTime) + return info, fmt.Errorf("login.errNameOrPasswd") + } + + // 登录用户信息 + info.UserId = sysUser.UserId + info.DeptId = sysUser.DeptId + info.User = sysUser + // 用户权限组标识 + if config.IsSystemUser(sysUser.UserId) { + info.Permissions = []string{constants.SYS_PERMISSION_SYSTEM} + } else { + perms := s.sysMenuService.FindPermsByUserId(sysUser.UserId) + info.Permissions = parse.RemoveDuplicates(perms) + } + return info, nil +} + +// CleanLoginRecordCache 清除错误记录次数 +func (s Account) CleanLoginRecordCache(userName string) bool { + cacheKey := fmt.Sprintf("%s:%s", constants.CACHE_PWD_ERR_COUNT, userName) + hasKey, err := redis.Has("", cacheKey) + if hasKey > 0 && err == nil { + return redis.Del("", cacheKey) == nil + } + return false +} + +// passwordRetryCount 密码重试次数 +func (s Account) passwordRetryCount(userName string) (string, int64, time.Duration, error) { + // 从数据库配置获取登录次数和错误锁定时间 + maxRetryCountStr := s.sysConfigService.FindValueByKey("sys.user.maxRetryCount") + lockTimeStr := s.sysConfigService.FindValueByKey("sys.user.lockTime") + // 验证登录次数和错误锁定时间 + maxRetryCount := parse.Number(maxRetryCountStr) + lockTime := parse.Number(lockTimeStr) + + // 验证缓存记录次数 + retryKey := fmt.Sprintf("%s:%s", constants.CACHE_PWD_ERR_COUNT, userName) + retryCount, err := redis.Get("", retryKey) + if retryCount == "" || err != nil { + retryCount = "0" + } + // 是否超过错误值 + retryCountInt64 := parse.Number(retryCount) + if retryCountInt64 >= int64(maxRetryCount) { + // msg := fmt.Sprintf("密码输入错误 %d 次,帐户锁定 %d 分钟", maxRetryCount, lockTime) + msg := fmt.Errorf("login.errRetryPasswd") // 密码输入错误多次,帐户已被锁定 + return retryKey, retryCountInt64, time.Duration(lockTime) * time.Minute, fmt.Errorf("%s", msg) + } + return retryKey, retryCountInt64, time.Duration(lockTime) * time.Minute, nil +} + +// PasswordCountOrExpireTime 首次登录或密码过期时间 +func (s Account) PasswordCountOrExpireTime(loginCount, passwordUpdateTime int64) (bool, error) { + forcePasswdChange := false + // 从数据库配置获取-首次登录密码修改 + fristPasswdChangeStr := s.sysConfigService.FindValueByKey("sys.user.fristPasswdChange") + if parse.Boolean(fristPasswdChangeStr) { + forcePasswdChange = loginCount < 1 || passwordUpdateTime == 0 + } + + // 非首次登录,判断密码是否过期 + if !forcePasswdChange { + alert, err := s.sysUserService.ValidatePasswordExpireTime(passwordUpdateTime) + if err != nil { + return alert, err + } + forcePasswdChange = alert + } + return forcePasswdChange, nil +} diff --git a/src/modules/auth/service/register.go b/src/modules/auth/service/register.go index 39903be2..9dca45c4 100644 --- a/src/modules/auth/service/register.go +++ b/src/modules/auth/service/register.go @@ -61,12 +61,14 @@ func (s Register) ByUserName(username, password string) (int64, error) { sysUser := systemModel.SysUser{ UserName: username, - NickName: username, // 昵称使用名称账号 - Password: password, // 原始密码 + NickName: username, // 昵称使用名称账号 + Password: password, // 原始密码 + UserType: "System", + UserSource: "#", Sex: "0", // 性别未选择 StatusFlag: constants.STATUS_YES, // 账号状态激活 - DeptId: 100, // 归属部门为根节点 - CreateBy: "register", // 创建来源 + DeptId: 101, // 归属部门为根节点 + CreateBy: "System", // 创建来源 } // 新增用户的角色管理 diff --git a/src/modules/oauth2/controller/oauth2_client.go b/src/modules/system/controller/sys_login_source.go similarity index 51% rename from src/modules/oauth2/controller/oauth2_client.go rename to src/modules/system/controller/sys_login_source.go index 30d0bbf5..2349af9b 100644 --- a/src/modules/oauth2/controller/oauth2_client.go +++ b/src/modules/system/controller/sys_login_source.go @@ -1,8 +1,8 @@ package controller import ( + "encoding/json" "fmt" - "strings" "github.com/gin-gonic/gin" @@ -10,54 +10,54 @@ import ( "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/utils/parse" - "be.ems/src/modules/oauth2/model" - "be.ems/src/modules/oauth2/service" + "be.ems/src/modules/system/model" + "be.ems/src/modules/system/service" ) -// NewOauth2Client 实例化控制层 -var NewOauth2Client = &Oauth2ClientController{ - oauth2ClientService: service.NewOauth2ClientService, +// NewLoginSource 实例化控制层 +var NewSysLoginSource = &SysLoginSourceController{ + sysLoginSourceService: service.NewSysLoginSource, } -// Oauth2ClientController 客户端授权管理 控制层处理 +// SysLoginSourceController 认证源管理 控制层处理 // -// PATH /oauth2/client -type Oauth2ClientController struct { - oauth2ClientService *service.Oauth2ClientService // 用户授权第三方应用信息服务 +// PATH /sys/login-source +type SysLoginSourceController struct { + sysLoginSourceService *service.SysLoginSource // 认证源信息服务 } // List 列表 // // GET /list -func (s Oauth2ClientController) List(c *gin.Context) { +func (s SysLoginSourceController) List(c *gin.Context) { query := reqctx.QueryMap(c) - rows, total := s.oauth2ClientService.FindByPage(query) + rows, total := s.sysLoginSourceService.FindByPage(query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } // Info 信息 // -// GET /:clientId -func (s Oauth2ClientController) Info(c *gin.Context) { - clientId := c.Param("clientId") - if clientId == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: clientId is empty")) +// 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.oauth2ClientService.FindByClientId(clientId) - if info.ClientId == clientId { + 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("clientId does not exist")) + c.JSON(200, resp.ErrMsg("id does not exist")) } // Add 新增 // // POST / -func (s Oauth2ClientController) Add(c *gin.Context) { - var body model.Oauth2Client +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)) @@ -67,23 +67,19 @@ func (s Oauth2ClientController) Add(c *gin.Context) { c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id not is empty")) return } - - // 本地IP地址不支持 - localHosts := []string{"127.0.0.1", "localhost", "::ffff:", "::1"} - localHost := false - for _, host := range localHosts { - if strings.Contains(body.IPWhite, host) { - localHost = true - break - } - } - if localHost { - c.JSON(200, resp.ErrMsg("no support local host")) + 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.oauth2ClientService.Insert(body) + insertId := s.sysLoginSourceService.Insert(body) if insertId > 0 { c.JSON(200, resp.OkData(insertId)) return @@ -94,8 +90,8 @@ func (s Oauth2ClientController) Add(c *gin.Context) { // Edit 更新 // // PUT / -func (s Oauth2ClientController) Edit(c *gin.Context) { - var body model.Oauth2Client +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)) @@ -105,33 +101,32 @@ func (s Oauth2ClientController) Edit(c *gin.Context) { c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id is empty")) return } - - // 本地IP地址不支持 - localHosts := []string{"127.0.0.1", "localhost", "::ffff:", "::1"} - localHost := false - for _, host := range localHosts { - if strings.Contains(body.IPWhite, host) { - localHost = true - break - } - } - if localHost { - c.JSON(200, resp.ErrMsg("no support local host")) + 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.oauth2ClientService.FindById(body.Id) - if info.ClientId == "" || info.Id != body.Id { + info := s.sysLoginSourceService.FindById(body.Id) + if info.Id != body.Id { c.JSON(200, resp.ErrMsg("modification failed, data not exist")) return } - info.Title = body.Title - info.IPWhite = body.IPWhite + 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.oauth2ClientService.Update(info) + rowsAffected := s.sysLoginSourceService.Update(info) if rowsAffected > 0 { c.JSON(200, resp.Ok(nil)) return @@ -142,7 +137,7 @@ func (s Oauth2ClientController) Edit(c *gin.Context) { // Remove 删除 // // DELETE /:id -func (s Oauth2ClientController) Remove(c *gin.Context) { +func (s SysLoginSourceController) Remove(c *gin.Context) { language := reqctx.AcceptLanguage(c) id := c.Param("id") if id == "" { @@ -158,7 +153,7 @@ func (s Oauth2ClientController) Remove(c *gin.Context) { ids = append(ids, parse.Number(v)) } - rows, err := s.oauth2ClientService.DeleteByIds(ids) + rows, err := s.sysLoginSourceService.DeleteByIds(ids) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/system/controller/sys_user.go b/src/modules/system/controller/sys_user.go index 3ea14fef..cd63404d 100644 --- a/src/modules/system/controller/sys_user.go +++ b/src/modules/system/controller/sys_user.go @@ -550,15 +550,19 @@ func (s *SysUserController) Export(c *gin.Context) { "C1": i18n.TKey(language, "user.export.nick"), "D1": i18n.TKey(language, "user.export.role"), "E1": i18n.TKey(language, "user.export.deptName"), - "F1": i18n.TKey(language, "user.export.loginIP"), - "G1": i18n.TKey(language, "user.export.loginDate"), - "H1": i18n.TKey(language, "user.export.status"), + "F1": i18n.TKey(language, "user.export.userType"), + "G1": i18n.TKey(language, "user.export.loginIP"), + "H1": i18n.TKey(language, "user.export.loginDate"), + "I1": i18n.TKey(language, "user.export.status"), // "F1": i18n.TKey(language, "user.export.sex"), // "E1": i18n.TKey(language, "user.export.phone"), // "D1": i18n.TKey(language, "user.export.email"), // "I1": i18n.TKey(language, "user.export.deptID"), // "K1": i18n.TKey(language, "user.export.deptLeader"), } + // 读取用户性别字典数据 + dictSysUserType := service.NewSysDictType.FindDataByType("sys_user_type") + // 读取用户性别字典数据 // dictSysUserSex := s.sysDictDataService.SelectDictDataByType("sys_user_sex") // 从第二行开始的数据 @@ -573,6 +577,14 @@ func (s *SysUserController) Export(c *gin.Context) { // break // } // } + // 用户类型 + userType := row.UserType + for _, v := range dictSysUserType { + if row.UserType == v.DataValue && row.UserSource != "#" { + userType = i18n.TKey(language, v.DataLabel) + " " + row.UserSource + break + } + } // 帐号状态 statusValue := i18n.TKey(language, "dictData.disable") if row.StatusFlag == "1" { @@ -581,7 +593,11 @@ func (s *SysUserController) Export(c *gin.Context) { // 用户角色, 默认导出首个 userRole := "" 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{ "A" + idx: row.UserId, @@ -589,9 +605,10 @@ func (s *SysUserController) Export(c *gin.Context) { "C" + idx: row.NickName, "D" + idx: userRole, "E" + idx: row.Dept.DeptName, - "F" + idx: row.LoginIp, - "G" + idx: date.ParseDateToStr(row.LoginTime, date.YYYY_MM_DDTHH_MM_SSZ), - "H" + idx: statusValue, + "F" + idx: userType, + "G" + idx: row.LoginIp, + "H" + idx: date.ParseDateToStr(row.LoginTime, date.YYYY_MM_DDTHH_MM_SSZ), + "I" + idx: statusValue, // "E" + idx: row.PhoneNumber, // "F" + idx: sysUserSex, // "D" + idx: row.Email, @@ -725,7 +742,7 @@ func (s *SysUserController) Import(c *gin.Context) { } // 验证是否存在这个用户 - newSysUser := s.sysUserService.FindByUserName(row["B"]) + newSysUser := s.sysUserService.FindByUserName(row["B"], "System", "#") newSysUser.Password = initPassword newSysUser.UserName = row["B"] newSysUser.NickName = row["C"] diff --git a/src/modules/system/model/sys_login_source.go b/src/modules/system/model/sys_login_source.go new file mode 100644 index 00000000..6f62dedb --- /dev/null +++ b/src/modules/system/model/sys_login_source.go @@ -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" +} diff --git a/src/modules/system/model/sys_user.go b/src/modules/system/model/sys_user.go index e2594b0f..e90b66a3 100644 --- a/src/modules/system/model/sys_user.go +++ b/src/modules/system/model/sys_user.go @@ -11,6 +11,8 @@ type SysUser struct { Sex string `json:"sex" gorm:"column:sex"` // 用户性别(0未选择 1男 2女) Avatar string `json:"avatar" gorm:"column:avatar"` // 头像地址 Password string `json:"-" gorm:"column:password"` // 密码 + UserType string `json:"userType" gorm:"column:user_type"` // 用户类型(System系统用户) + UserSource string `json:"userSource" gorm:"column:user_source"` // 用户来源UID (系统#)) StatusFlag string `json:"statusFlag" gorm:"column:status_flag"` // 账号状态(0停用 1正常) DelFlag string `json:"-" gorm:"column:del_flag"` // 删除标记(0存在 1删除) PasswordUpdateTime int64 `json:"passwordUpdateTime" gorm:"column:password_update_time"` // 密码更新时间 diff --git a/src/modules/system/model/vo/login_source.go b/src/modules/system/model/vo/login_source.go new file mode 100644 index 00000000..5f401d6e --- /dev/null +++ b/src/modules/system/model/vo/login_source.go @@ -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"` // 账号字段从用户信息中获取 +} diff --git a/src/modules/system/repository/sys_login_source.go b/src/modules/system/repository/sys_login_source.go new file mode 100644 index 00000000..c9170f8b --- /dev/null +++ b/src/modules/system/repository/sys_login_source.go @@ -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 +} diff --git a/src/modules/system/repository/sys_menu.go b/src/modules/system/repository/sys_menu.go index 3b84a319..146655dc 100644 --- a/src/modules/system/repository/sys_menu.go +++ b/src/modules/system/repository/sys_menu.go @@ -83,14 +83,15 @@ func (r SysMenu) Insert(sysMenu model.SysMenu) int64 { } // 根据菜单类型重置参数 - if sysMenu.MenuType == constants.MENU_TYPE_BUTTON { + switch sysMenu.MenuType { + case constants.MENU_TYPE_BUTTON: sysMenu.Component = "" sysMenu.FrameFlag = "1" sysMenu.CacheFlag = "1" sysMenu.VisibleFlag = "1" sysMenu.MenuPath = "" sysMenu.Icon = "#" - } else if sysMenu.MenuType == constants.MENU_TYPE_DIR { + case constants.MENU_TYPE_DIR: sysMenu.Component = "" sysMenu.FrameFlag = "1" sysMenu.CacheFlag = "1" @@ -118,14 +119,15 @@ func (r SysMenu) Update(sysMenu model.SysMenu) int64 { } // 根据菜单类型重置参数 - if sysMenu.MenuType == constants.MENU_TYPE_BUTTON { + switch sysMenu.MenuType { + case constants.MENU_TYPE_BUTTON: sysMenu.Component = "" sysMenu.FrameFlag = "1" sysMenu.CacheFlag = "1" sysMenu.VisibleFlag = "1" sysMenu.MenuPath = "" sysMenu.Icon = "#" - } else if sysMenu.MenuType == constants.MENU_TYPE_DIR { + case constants.MENU_TYPE_DIR: sysMenu.Component = "" sysMenu.FrameFlag = "1" sysMenu.CacheFlag = "1" diff --git a/src/modules/system/repository/sys_user.go b/src/modules/system/repository/sys_user.go index 987e28ae..962df1b2 100644 --- a/src/modules/system/repository/sys_user.go +++ b/src/modules/system/repository/sys_user.go @@ -31,6 +31,12 @@ func (r SysUser) SelectByPage(query map[string]string, dataScopeSQL string) ([]m if v, ok := query["phone"]; ok && v != "" { tx = tx.Where("phone like ?", fmt.Sprintf("%s%%", v)) } + if v, ok := query["userType"]; ok && v != "" { + tx = tx.Where("user_type = ?", v) + } + if v, ok := query["userSource"]; ok && v != "" { + tx = tx.Where("user_source = ?", v) + } if v, ok := query["statusFlag"]; ok && v != "" { tx = tx.Where("status_flag = ?", v) } @@ -198,6 +204,12 @@ func (r SysUser) CheckUnique(sysUser model.SysUser) int64 { if sysUser.Email != "" { tx = tx.Where("email = ?", sysUser.Email) } + if sysUser.UserType != "" { + tx = tx.Where("user_type = ?", sysUser.UserType) + } + if sysUser.UserSource != "" { + tx = tx.Where("user_source = ?", sysUser.UserSource) + } // 查询数据 var id int64 = 0 @@ -209,14 +221,20 @@ func (r SysUser) CheckUnique(sysUser model.SysUser) int64 { } // SelectByUserName 通过登录账号查询信息 -func (r SysUser) SelectByUserName(userName string) model.SysUser { +func (r SysUser) SelectByUserName(userName, userType, userSource string) model.SysUser { item := model.SysUser{} if userName == "" { return item } + if userType == "" { + userType = "System" + } + if userSource == "" { + userSource = "#" + } tx := db.DB("").Model(&model.SysUser{}) // 构建查询条件 - tx = tx.Where("user_name = ? and del_flag = '0'", userName) + tx = tx.Where("user_name = ? and user_type = ? and user_source = ? and del_flag = '0'", userName, userType, userSource) // 查询数据 if err := tx.Limit(1).Find(&item).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) diff --git a/src/modules/system/service/sys_login_source.go b/src/modules/system/service/sys_login_source.go new file mode 100644 index 00000000..b6a9b949 --- /dev/null +++ b/src/modules/system/service/sys_login_source.go @@ -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 +} diff --git a/src/modules/system/service/sys_user.go b/src/modules/system/service/sys_user.go index 1f734149..6cd2b33a 100644 --- a/src/modules/system/service/sys_user.go +++ b/src/modules/system/service/sys_user.go @@ -189,7 +189,9 @@ func (s SysUser) DeleteByIds(userIds []int64) (int64, error) { // CheckUniqueByUserName 检查用户名称是否唯一 func (s SysUser) CheckUniqueByUserName(userName string, userId int64) bool { uniqueId := s.sysUserRepository.CheckUnique(model.SysUser{ - UserName: userName, + UserName: userName, + UserType: "System", + UserSource: "#", }) if uniqueId == userId { return true @@ -200,7 +202,9 @@ func (s SysUser) CheckUniqueByUserName(userName string, userId int64) bool { // CheckUniqueByPhone 检查手机号码是否唯一 func (s SysUser) CheckUniqueByPhone(phone string, userId int64) bool { uniqueId := s.sysUserRepository.CheckUnique(model.SysUser{ - Phone: phone, + Phone: phone, + UserType: "System", + UserSource: "#", }) if uniqueId == userId { return true @@ -211,7 +215,9 @@ func (s SysUser) CheckUniqueByPhone(phone string, userId int64) bool { // CheckUniqueByEmail 检查Email是否唯一 func (s SysUser) CheckUniqueByEmail(email string, userId int64) bool { uniqueId := s.sysUserRepository.CheckUnique(model.SysUser{ - Email: email, + Email: email, + UserType: "System", + UserSource: "#", }) if uniqueId == userId { return true @@ -220,8 +226,10 @@ func (s SysUser) CheckUniqueByEmail(email string, userId int64) bool { } // FindByUserName 通过用户名查询用户信息 -func (s SysUser) FindByUserName(userName string) model.SysUser { - userinfo := s.sysUserRepository.SelectByUserName(userName) +// userType 系统sys +// userSource 系统# +func (s SysUser) FindByUserName(userName, userType, userSource string) model.SysUser { + userinfo := s.sysUserRepository.SelectByUserName(userName, userType, userSource) if userinfo.UserName != userName { return userinfo } diff --git a/src/modules/system/system.go b/src/modules/system/system.go index d4cca368..18e861c1 100644 --- a/src/modules/system/system.go +++ b/src/modules/system/system.go @@ -429,6 +429,35 @@ func Setup(router *gin.Engine) { controller.NewSysUser.Import, ) } + + // 第三方认证-配置认证源 + sysLoginSource := controller.NewSysLoginSource + sysLoginSourceGroup := router.Group("/system/login-source") + { + sysLoginSourceGroup.GET("/list", + middleware.AuthorizeUser(map[string][]string{"hasPerms": {"system:loginSource:list"}}), + sysLoginSource.List, + ) + sysLoginSourceGroup.GET("/:id", + middleware.AuthorizeUser(map[string][]string{"hasPerms": {"system:loginSource:query"}}), + sysLoginSource.Info, + ) + sysLoginSourceGroup.POST("", + middleware.AuthorizeUser(map[string][]string{"hasPerms": {"system:loginSource:add"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLoginSource", middleware.BUSINESS_TYPE_INSERT)), + sysLoginSource.Add, + ) + sysLoginSourceGroup.PUT("", + middleware.AuthorizeUser(map[string][]string{"hasPerms": {"system:loginSource:edit"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLoginSource", middleware.BUSINESS_TYPE_UPDATE)), + sysLoginSource.Edit, + ) + sysLoginSourceGroup.DELETE("/:id", + middleware.AuthorizeUser(map[string][]string{"hasPerms": {"system:loginSource:remove"}}), + middleware.OperateLog(middleware.OptionNew("log.operate.title.sysLoginSource", middleware.BUSINESS_TYPE_DELETE)), + sysLoginSource.Remove, + ) + } } // InitLoad 初始参数