feat: 统一IM后台商户文案和默认选择

This commit is contained in:
richjohnrambo
2026-09-09 14:28:44 +08:00
parent da60b52be2
commit 27a368b386
76 changed files with 272 additions and 186 deletions
+11
View File
@@ -239,6 +239,17 @@ func (s *sSysImUser) List(ctx context.Context, in *sysin.ImUserListInp) (list []
if err = fillImUserRegisterTypes(ctx, tenant.Id, list); err != nil {
return nil, 0, err
}
page := in.Page
if page < 1 {
page = 1
}
perPage := in.PerPage
if perPage < 1 {
perPage = 10
}
for index, item := range list {
item.DisplayNo = 1000 + (page-1)*perPage + index
}
return list, totalCount, nil
}
@@ -41,6 +41,7 @@ func (in *ImUserListInp) Filter(ctx context.Context) (err error) {
type ImUserListModel struct {
TenantId int64 `json:"tenantId" dc:"租户ID"`
TenantName string `json:"tenantName" dc:"租户名称"`
DisplayNo int `json:"displayNo" dc:"后台展示编号"`
UserId string `json:"userId" dc:"用户ID"`
Username string `json:"username" dc:"登录账号"`
Phone string `json:"phone" dc:"手机号"`
@@ -11,6 +11,11 @@ FROM (
SELECT '登录失败日志','imLoginFailureLogIndex','login-failure-log/index','/imLoginFailureLog/list','/imLoginFailureLog/index',55
) p WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=p.name);
UPDATE `hg_admin_menu`
SET `pid`=@imRootId, `icon`='DashboardOutlined', `type`=2, `level`=2,
`tree`=CONCAT('tr_',@imRootId,' '), `sort`=5, `updated_at`=@now
WHERE `name`='imDashboardIndex';
SET @dashboardId := (SELECT `id` FROM `hg_admin_menu` WHERE `name`='imDashboardIndex' LIMIT 1);
SET @privateMessageId := (SELECT `id` FROM `hg_admin_menu` WHERE `name`='imPrivateMessageIndex' LIMIT 1);
SET @groupMessageId := (SELECT `id` FROM `hg_admin_menu` WHERE `name`='imGroupMessageIndex' LIMIT 1);
@@ -30,6 +30,7 @@ UPDATE `hg_admin_menu` SET `pid`=@imRootId, `title`='用户与群组', `path`='p
UPDATE `hg_admin_menu` SET `pid`=@imRootId, `title`='内容审核', `path`='content', `icon`='FileSearchOutlined', `type`=1, `redirect`='/im/content/private-message/index', `component`='ParentLayout', `always_show`=1, `hidden`=0, `status`=1, `level`=2, `tree`=CONCAT('tr_', @imRootId, ' '), `sort`=20, `updated_at`=@now WHERE `id`=@contentId;
UPDATE `hg_admin_menu` SET `pid`=@imRootId, `title`='日志审计', `path`='audit', `icon`='AuditOutlined', `type`=1, `redirect`='/im/audit/operation/index', `component`='ParentLayout', `always_show`=1, `hidden`=0, `status`=1, `level`=2, `tree`=CONCAT('tr_', @imRootId, ' '), `sort`=30, `updated_at`=@now WHERE `id`=@auditId;
UPDATE `hg_admin_menu` SET `pid`=@imRootId, `title`='系统设置', `path`='settings', `icon`='SettingOutlined', `type`=1, `redirect`='/im/settings/tenant/index', `component`='ParentLayout', `always_show`=1, `hidden`=0, `status`=1, `level`=2, `tree`=CONCAT('tr_', @imRootId, ' '), `sort`=40, `updated_at`=@now WHERE `id`=@settingsId;
UPDATE `hg_admin_menu` SET `pid`=@imRootId, `icon`='DashboardOutlined', `type`=2, `level`=2, `tree`=CONCAT('tr_', @imRootId, ' '), `sort`=5, `updated_at`=@now WHERE `name`='imDashboardIndex';
UPDATE `hg_admin_menu` SET `redirect`='/im/dashboard/index', `updated_at`=@now WHERE `id`=@imRootId;
-- User and group management.
@@ -59,7 +60,7 @@ UPDATE `hg_admin_menu` SET `pid`=@auditId, `path`='dead-letter/index', `level`=3
UPDATE `hg_admin_menu` SET `pid`=@auditId, `path`='task-dashboard/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @auditId, ' '), `sort`=80, `updated_at`=@now WHERE `name`='imTaskDashboardIndex';
-- System and tenant settings.
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `title`='租户管理', `path`='tenant/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=10, `updated_at`=@now WHERE `name`='imTenantIndex';
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `title`='商户管理', `path`='tenant/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=10, `updated_at`=@now WHERE `name`='imTenantIndex';
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `path`='security-policy/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=20, `updated_at`=@now WHERE `name`='imSecurityPolicyIndex';
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `path`='file-policy/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=30, `updated_at`=@now WHERE `name`='imFilePolicyIndex';
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `path`='workbench/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=40, `updated_at`=@now WHERE `name`='imWorkbenchIndex';
@@ -1,15 +1,15 @@
SET NAMES utf8mb4;
UPDATE `hg_admin_menu` SET `title` = 'IM管理' WHERE `name` = 'imManager';
UPDATE `hg_admin_menu` SET `title` = '租户管理' WHERE `name` = 'imTenant';
UPDATE `hg_admin_menu` SET `title` = '租户列表' WHERE `name` = 'imTenantIndex';
UPDATE `hg_admin_menu` SET `title` = '租户详情' WHERE `name` = 'imTenantView';
UPDATE `hg_admin_menu` SET `title` = '新增/编辑租户' WHERE `name` = 'imTenantEdit';
UPDATE `hg_admin_menu` SET `title` = '启用/停用租户' WHERE `name` = 'imTenantStatus';
UPDATE `hg_admin_menu` SET `title` = '租户用量统计' WHERE `name` = 'imTenantUsage';
UPDATE `hg_admin_menu` SET `title` = '租户删除检查' WHERE `name` = 'imTenantDeletionCheck';
UPDATE `hg_admin_menu` SET `title` = '商户管理' WHERE `name` = 'imTenant';
UPDATE `hg_admin_menu` SET `title` = '商户列表' WHERE `name` = 'imTenantIndex';
UPDATE `hg_admin_menu` SET `title` = '商户详情' WHERE `name` = 'imTenantView';
UPDATE `hg_admin_menu` SET `title` = '新增/编辑商户' WHERE `name` = 'imTenantEdit';
UPDATE `hg_admin_menu` SET `title` = '启用/停用商户' WHERE `name` = 'imTenantStatus';
UPDATE `hg_admin_menu` SET `title` = '商户用量统计' WHERE `name` = 'imTenantUsage';
UPDATE `hg_admin_menu` SET `title` = '商户删除检查' WHERE `name` = 'imTenantDeletionCheck';
UPDATE `hg_admin_menu` SET `title` = '进入删除保护期' WHERE `name` = 'imTenantEnterDeleting';
UPDATE `hg_admin_menu` SET `title` = '恢复租户' WHERE `name` = 'imTenantRestore';
UPDATE `hg_admin_menu` SET `title` = '恢复商户' WHERE `name` = 'imTenantRestore';
UPDATE `hg_admin_menu` SET `title` = '用户管理' WHERE `name` = 'imUser';
UPDATE `hg_admin_menu` SET `title` = '用户列表' WHERE `name` = 'imUserIndex';
@@ -67,10 +67,10 @@ FROM (
SELECT @abuseReasonId, '原因禁用', 'imAbuseReasonDelete', '/imAbuseReason/delete', 3, CONCAT('tr_', @imRootId, ' tr_', @abuseReasonId, ' '), 20 UNION ALL
SELECT @mailboxConfigId, '信箱配置更新', 'imMailboxConfigUpdate', '/imMailboxConfig/update', 3, CONCAT('tr_', @imRootId, ' tr_', @mailboxConfigId, ' '), 10 UNION ALL
SELECT @feedbackConfigId, '反馈配置更新', 'imFeedbackConfigUpdate', '/imFeedbackConfig/update', 3, CONCAT('tr_', @imRootId, ' tr_', @feedbackConfigId, ' '), 10 UNION ALL
SELECT @tenantListId, '租户用量与健康', 'imTenantUsage', '/imTenant/usage', 4, CONCAT('tr_', @imRootId, ' tr_', (SELECT `pid` FROM `hg_admin_menu` WHERE `id` = @tenantListId), ' tr_', @tenantListId, ' '), 40 UNION ALL
SELECT @tenantListId, '租户删除前检查', 'imTenantDeletionCheck', '/imTenant/deletionCheck', 4, CONCAT('tr_', @imRootId, ' tr_', (SELECT `pid` FROM `hg_admin_menu` WHERE `id` = @tenantListId), ' tr_', @tenantListId, ' '), 50 UNION ALL
SELECT @tenantListId, '租户进入删除流程', 'imTenantEnterDeleting', '/imTenant/enterDeleting', 4, CONCAT('tr_', @imRootId, ' tr_', (SELECT `pid` FROM `hg_admin_menu` WHERE `id` = @tenantListId), ' tr_', @tenantListId, ' '), 60 UNION ALL
SELECT @tenantListId, '恢复租户', 'imTenantRestore', '/imTenant/restore', 4, CONCAT('tr_', @imRootId, ' tr_', (SELECT `pid` FROM `hg_admin_menu` WHERE `id` = @tenantListId), ' tr_', @tenantListId, ' '), 70 UNION ALL
SELECT @tenantListId, '商户用量与健康', 'imTenantUsage', '/imTenant/usage', 4, CONCAT('tr_', @imRootId, ' tr_', (SELECT `pid` FROM `hg_admin_menu` WHERE `id` = @tenantListId), ' tr_', @tenantListId, ' '), 40 UNION ALL
SELECT @tenantListId, '商户删除前检查', 'imTenantDeletionCheck', '/imTenant/deletionCheck', 4, CONCAT('tr_', @imRootId, ' tr_', (SELECT `pid` FROM `hg_admin_menu` WHERE `id` = @tenantListId), ' tr_', @tenantListId, ' '), 50 UNION ALL
SELECT @tenantListId, '商户进入删除流程', 'imTenantEnterDeleting', '/imTenant/enterDeleting', 4, CONCAT('tr_', @imRootId, ' tr_', (SELECT `pid` FROM `hg_admin_menu` WHERE `id` = @tenantListId), ' tr_', @tenantListId, ' '), 60 UNION ALL
SELECT @tenantListId, '恢复商户', 'imTenantRestore', '/imTenant/restore', 4, CONCAT('tr_', @imRootId, ' tr_', (SELECT `pid` FROM `hg_admin_menu` WHERE `id` = @tenantListId), ' tr_', @tenantListId, ' '), 70 UNION ALL
SELECT @auditLogId, '导出审计日志', 'imAuditLogExport', '/imAuditLog/export', 3, CONCAT('tr_', @imRootId, ' tr_', @auditLogId, ' '), 20
) p
WHERE parent_id IS NOT NULL
@@ -25,12 +25,12 @@ SET @now = NOW();
SELECT @groupMenuId := `id` FROM `hg_admin_menu` WHERE `name` = 'imUserPolicyGroupIndex' LIMIT 1;
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @groupMenuId, '查看租户登录IP白名单', 'imTenantLoginIPWhitelist', '', '', '3', '', '/imUserPolicyGroup/loginIPWhitelist', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT(`tree`, 'tr_', `id`, ' '), '9', '', '1', @now, @now
SELECT NULL, @groupMenuId, '查看商户登录IP白名单', 'imTenantLoginIPWhitelist', '', '', '3', '', '/imUserPolicyGroup/loginIPWhitelist', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT(`tree`, 'tr_', `id`, ' '), '9', '', '1', @now, @now
FROM `hg_admin_menu` WHERE `id` = @groupMenuId
AND NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imTenantLoginIPWhitelist');
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @groupMenuId, '保存租户登录IP白名单', 'imTenantLoginIPWhitelistSave', '', '', '3', '', '/imUserPolicyGroup/loginIPWhitelistSave', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT(`tree`, 'tr_', `id`, ' '), '10', '', '1', @now, @now
SELECT NULL, @groupMenuId, '保存商户登录IP白名单', 'imTenantLoginIPWhitelistSave', '', '', '3', '', '/imUserPolicyGroup/loginIPWhitelistSave', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT(`tree`, 'tr_', `id`, ' '), '10', '', '1', @now, @now
FROM `hg_admin_menu` WHERE `id` = @groupMenuId
AND NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imTenantLoginIPWhitelistSave');
@@ -11,7 +11,7 @@ SELECT @imRootId := `id` FROM `hg_admin_menu` WHERE `name` = 'imManager' LIMIT 1
SELECT @tenantDirId := `id` FROM `hg_admin_menu` WHERE `name` = 'imTenant' LIMIT 1;
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @imRootId, '租户管理', 'imTenant', 'tenant', '', '1', '/im/tenant/index', '', '', 'ParentLayout', '1', '', '0', '0', '', '0', '0', '0', '2', CONCAT('tr_', @imRootId, ' '), '10', '', '1', @now, @now
SELECT NULL, @imRootId, '商户管理', 'imTenant', 'tenant', '', '1', '/im/tenant/index', '', '', 'ParentLayout', '1', '', '0', '0', '', '0', '0', '0', '2', CONCAT('tr_', @imRootId, ' '), '10', '', '1', @now, @now
WHERE @tenantDirId IS NULL;
SELECT @tenantDirId := `id` FROM `hg_admin_menu` WHERE `name` = 'imTenant' LIMIT 1;
@@ -19,35 +19,35 @@ SELECT @tenantDirId := `id` FROM `hg_admin_menu` WHERE `name` = 'imTenant' LIMIT
SELECT @tenantListId := `id` FROM `hg_admin_menu` WHERE `name` = 'imTenantIndex' LIMIT 1;
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @tenantDirId, '租户列表', 'imTenantIndex', 'index', '', '2', '', '/imTenant/list', '', '/imTenant/index', '1', 'imTenant', '0', '0', '', '0', '0', '0', '3', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' '), '10', '', '1', @now, @now
SELECT NULL, @tenantDirId, '商户列表', 'imTenantIndex', 'index', '', '2', '', '/imTenant/list', '', '/imTenant/index', '1', 'imTenant', '0', '0', '', '0', '0', '0', '3', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' '), '10', '', '1', @now, @now
WHERE @tenantListId IS NULL;
SELECT @tenantListId := `id` FROM `hg_admin_menu` WHERE `name` = 'imTenantIndex' LIMIT 1;
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @tenantListId, '租户详情', 'imTenantView', '', '', '3', '', '/imTenant/view', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '10', '', '1', @now, @now
SELECT NULL, @tenantListId, '商户详情', 'imTenantView', '', '', '3', '', '/imTenant/view', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '10', '', '1', @now, @now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imTenantView');
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @tenantListId, '编辑/新增租户', 'imTenantEdit', '', '', '3', '', '/imTenant/edit', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '20', '', '1', @now, @now
SELECT NULL, @tenantListId, '编辑/新增商户', 'imTenantEdit', '', '', '3', '', '/imTenant/edit', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '20', '', '1', @now, @now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imTenantEdit');
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @tenantListId, '修改租户状态', 'imTenantStatus', '', '', '3', '', '/imTenant/status', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '30', '', '1', @now, @now
SELECT NULL, @tenantListId, '修改商户状态', 'imTenantStatus', '', '', '3', '', '/imTenant/status', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '30', '', '1', @now, @now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imTenantStatus');
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @tenantListId, '租户用量与健康', 'imTenantUsage', '', '', '3', '', '/imTenant/usage', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '40', '', '1', @now, @now
SELECT NULL, @tenantListId, '商户用量与健康', 'imTenantUsage', '', '', '3', '', '/imTenant/usage', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '40', '', '1', @now, @now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imTenantUsage');
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @tenantListId, '租户删除前检查', 'imTenantDeletionCheck', '', '', '3', '', '/imTenant/deletionCheck', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '50', '', '1', @now, @now
SELECT NULL, @tenantListId, '商户删除前检查', 'imTenantDeletionCheck', '', '', '3', '', '/imTenant/deletionCheck', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '50', '', '1', @now, @now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imTenantDeletionCheck');
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @tenantListId, '租户进入删除流程', 'imTenantEnterDeleting', '', '', '3', '', '/imTenant/enterDeleting', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '60', '', '1', @now, @now
SELECT NULL, @tenantListId, '商户进入删除流程', 'imTenantEnterDeleting', '', '', '3', '', '/imTenant/enterDeleting', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '60', '', '1', @now, @now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imTenantEnterDeleting');
INSERT INTO `hg_admin_menu` (`id`, `pid`, `title`, `name`, `path`, `icon`, `type`, `redirect`, `permissions`, `permission_name`, `component`, `always_show`, `active_menu`, `is_root`, `is_frame`, `frame_src`, `keep_alive`, `hidden`, `affix`, `level`, `tree`, `sort`, `remark`, `status`, `created_at`, `updated_at`)
SELECT NULL, @tenantListId, '恢复租户', 'imTenantRestore', '', '', '3', '', '/imTenant/restore', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '70', '', '1', @now, @now
SELECT NULL, @tenantListId, '恢复商户', 'imTenantRestore', '', '', '3', '', '/imTenant/restore', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @tenantDirId, ' tr_', @tenantListId, ' '), '70', '', '1', @now, @now
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imTenantRestore');
+13 -7
View File
@@ -1,15 +1,21 @@
import { http } from '@/utils/http/axios';
// 获取IM租户列表
export function List(params) {
return http.request({
// 获取IM商户列表
export async function List(params) {
const res: any = await http.request({
url: '/imTenant/list',
method: 'get',
params,
});
if (Array.isArray(res?.list)) {
res.list = [...res.list].sort((left, right) => {
return Number(right.code === 'default') - Number(left.code === 'default');
});
}
return res;
}
// 添加/编辑IM租户
// 添加/编辑IM商户
export function Edit(params) {
return http.request({
url: '/imTenant/edit',
@@ -18,7 +24,7 @@ export function Edit(params) {
});
}
// 修改IM租户状态
// 修改IM商户状态
export function Status(params) {
return http.request({
url: '/imTenant/status',
@@ -27,7 +33,7 @@ export function Status(params) {
});
}
// 获取IM租户指定详情
// 获取IM商户指定详情
export function View(params) {
return http.request({
url: '/imTenant/view',
@@ -36,7 +42,7 @@ export function View(params) {
});
}
// 获取IM租户用量和健康状态
// 获取IM商户用量和健康状态
export function Usage(params) {
return http.request({
url: '/imTenant/usage',
@@ -1,7 +1,7 @@
<template>
<div>
<div class="n-layout-page-header">
<n-card :bordered="false" title="IM注册邀请码" />
<n-card :bordered="false" title="邀请码管理" />
</div>
<n-card :bordered="false" class="proCard">
<BasicForm
@@ -158,7 +158,7 @@
function handleCreate(batch: boolean) {
const tenantId = selectedTenantId();
if (isPlatformAdmin.value && !tenantId) {
message.warning('请先选择租户');
message.warning('请先选择商户');
return;
}
createRef.value.openModal(tenantId, batch);
@@ -215,9 +215,10 @@
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
await setFieldsValue({ tenantId: null });
if (tenantOptions.value.length === 0) {
message.warning('暂无可用租户');
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
}
reloadTable();
+3 -3
View File
@@ -33,11 +33,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: true,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
@@ -99,7 +99,7 @@ export const schemas = ref<FormSchema[]>([
export const columns = [
{ title: 'ID', key: 'id', align: 'left', width: 150 },
{ title: '租户', key: 'tenantName', align: 'left', width: 160 },
{ title: '商户', key: 'tenantName', align: 'left', width: 160 },
{ title: '邀请码', key: 'code', align: 'left', width: 120 },
{ title: '状态', key: 'status', align: 'left', width: 110 },
{ title: '批次ID', key: 'batchId', align: 'left', width: 150 },
+1 -1
View File
@@ -253,7 +253,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+2 -2
View File
@@ -38,11 +38,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+1 -1
View File
@@ -234,7 +234,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+2 -2
View File
@@ -42,11 +42,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+2 -2
View File
@@ -116,7 +116,7 @@
function handleExport() {
const params = { ...searchFormRef.value?.formModel };
if (isPlatformAdmin.value && !params.tenantId) {
message.warning('请选择租户');
message.warning('请选择商户');
return;
}
Export(params);
@@ -128,7 +128,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+2 -2
View File
@@ -41,11 +41,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+1 -1
View File
@@ -12,7 +12,7 @@
<n-scrollbar style="max-height: 87vh" class="pr-5">
<n-spin :show="loading" description="请稍候...">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="操作时间">{{ formValue.createdAt || '-' }}</n-descriptions-item>
<n-descriptions-item label="操作人UID">{{ formValue.actorUid }}</n-descriptions-item>
<n-descriptions-item label="角色">{{ formValue.actorRole || '-' }}</n-descriptions-item>
+3 -3
View File
@@ -9,7 +9,7 @@
v-model:value="tenantId"
:options="imQueryTenantOptions"
class="tenant-select"
placeholder="请选择租户"
placeholder="请选择商户"
/>
<n-select v-model:value="days" :options="dayOptions" class="days-select" />
<n-button type="primary" :loading="loading" @click="loadDashboard">刷新</n-button>
@@ -72,7 +72,7 @@
async function loadDashboard() {
if (isPlatformAdmin.value && !tenantId.value) {
message.warning('请选择租户');
message.warning('请选择商户');
return;
}
loading.value = true;
@@ -90,7 +90,7 @@
if (isPlatformAdmin.value) {
await loadImQueryTenantOptions();
tenantId.value = imQueryTenantOptions.value[0]?.value || 0;
if (!tenantId.value) message.warning('暂无可用租户');
if (!tenantId.value) message.warning('暂无可用商户');
}
if (!isPlatformAdmin.value || tenantId.value) await loadDashboard();
});
+18 -5
View File
@@ -1,7 +1,7 @@
<template>
<div>
<div class="n-layout-page-header">
<n-card :bordered="false" title="IM Kafka死信"></n-card>
<n-card :bordered="false" title="IM Kafka死信" />
</div>
<n-card :bordered="false" class="proCard">
<BasicForm
@@ -30,7 +30,7 @@
import { BasicTable, TableAction } from '@/components/Table';
import { BasicForm, useForm } from '@/components/Form/index';
import { List } from '@/api/imDeadLetter';
import { columns, loadOptions, loadTenantOptions, schemas, State } from './model';
import { columns, loadOptions, loadTenantOptions, schemas, State, tenantOptions } from './model';
import { adaTableScrollX } from '@/utils/hotgo';
import ViewModal from './view.vue';
@@ -48,7 +48,13 @@
render(record: State) {
return h(TableAction as any, {
style: 'button',
actions: [{ label: '详情', onClick: () => viewRef.value.openModal(record, currentTenantId.value), auth: ['/imDeadLetter/view'] }],
actions: [
{
label: '详情',
onClick: () => viewRef.value.openModal(record, currentTenantId.value),
auth: ['/imDeadLetter/view'],
},
],
});
},
});
@@ -56,7 +62,7 @@
const scrollX = computed(() => adaTableScrollX(columns, actionColumn.width));
const currentTenantId = computed(() => searchFormRef.value?.formModel?.tenantId || 0);
const [register] = useForm({
const [register, { setFieldsValue }] = useForm({
gridProps: { cols: '1 s:1 m:2 l:3 xl:4 2xl:4' },
labelWidth: 90,
schemas,
@@ -66,7 +72,11 @@
if (!currentTenantId.value) {
return { list: [], totalCount: 0 };
}
const params = { ...searchFormRef.value?.formModel, limit: res.pageSize || res.perPage || 50, cursor: cursor.value };
const params = {
...searchFormRef.value?.formModel,
limit: res.pageSize || res.perPage || 50,
cursor: cursor.value,
};
const data = await List(params);
hasMore.value = !!data?.hasMore;
cursor.value = data?.nextCursor || '';
@@ -82,6 +92,9 @@
onMounted(async () => {
loadOptions();
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
}
});
</script>
+2 -2
View File
@@ -46,11 +46,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: true,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+1 -1
View File
@@ -123,7 +123,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+2 -2
View File
@@ -42,11 +42,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+3 -3
View File
@@ -11,11 +11,11 @@
label-placement="left"
label-width="120"
>
<n-form-item v-if="isPlatformAdmin" label="租户">
<n-form-item v-if="isPlatformAdmin" label="商户">
<n-select
v-model:value="selectedTenantId"
:options="tenantOptions"
placeholder="请选择租户"
placeholder="请选择商户"
@update:value="loadConfig"
/>
</n-form-item>
@@ -133,7 +133,7 @@
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) selectedTenantId.value = tenantOptions.value[0].value;
else message.warning('暂无可用租户');
else message.warning('暂无可用商户');
}
await loadConfig();
});
+2 -2
View File
@@ -150,7 +150,7 @@
function handleCleanupOrphan() {
const params = searchFormRef.value?.formModel || {};
if (isPlatformAdmin.value && !params.tenantId) {
message.warning('请先选择租户');
message.warning('请先选择商户');
return;
}
dialog.warning({
@@ -173,7 +173,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+2 -2
View File
@@ -45,11 +45,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+1 -1
View File
@@ -8,7 +8,7 @@
>
<n-spin :show="loading" description="请稍候...">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="状态">{{ statusLabel }}</n-descriptions-item>
<n-descriptions-item label="用途">{{ purposeLabel }}</n-descriptions-item>
<n-descriptions-item label="上传用户">{{ formValue.userId || '-' }}</n-descriptions-item>
+1 -1
View File
@@ -217,7 +217,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+2 -2
View File
@@ -38,11 +38,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+2 -2
View File
@@ -1,7 +1,7 @@
<template>
<div>
<div class="n-layout-page-header">
<n-card :bordered="false" title="IM群组管理" />
<n-card :bordered="false" title="群组管理" />
</div>
<n-card :bordered="false" class="proCard">
<BasicForm
@@ -129,7 +129,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+4 -4
View File
@@ -11,8 +11,8 @@ const dict = useDictStore();
export const tenantOptions = ref<any[]>([]);
export class State {
public tenantId = 0; // 租户ID
public tenantName = ''; // 租户名称
public tenantId = 0; // 商户ID
public tenantName = ''; // 商户名称
public topic = ''; // Topic
public state = 0; // 状态
public ownerId = 0; // 群主ID
@@ -118,11 +118,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+1 -1
View File
@@ -12,7 +12,7 @@
<n-scrollbar style="max-height: 87vh" class="pr-5">
<n-spin :show="loading" description="请稍候...">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="Topic">{{ formValue.topic }}</n-descriptions-item>
<n-descriptions-item label="状态">{{ stateLabel }}</n-descriptions-item>
<n-descriptions-item label="群主昵称">{{
+3 -3
View File
@@ -39,8 +39,8 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantCode',
component: 'NInput',
label: '租户编码',
componentProps: { placeholder: '请输入租户编码' },
label: '商户编码',
componentProps: { placeholder: '请输入商户编码' },
},
{
field: 'eventId',
@@ -92,7 +92,7 @@ export const schemas = ref<FormSchema[]>([
export const columns = [
{ title: 'ID', key: 'id', align: 'left', width: 90 },
{ title: '租户', key: 'tenantCode', align: 'left', width: 120 },
{ title: '商户', key: 'tenantCode', align: 'left', width: 120 },
{ title: '事件ID', key: 'eventId', align: 'left', width: 220 },
{ title: '事件类型', key: 'eventType', align: 'left', width: 190 },
{ title: '动作', key: 'action', align: 'left', width: 170 },
+1 -1
View File
@@ -12,7 +12,7 @@
<n-scrollbar style="max-height: 87vh" class="pr-5">
<n-spin :show="loading" description="请稍候...">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ formValue.tenantCode || '-' }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ formValue.tenantCode || '-' }}</n-descriptions-item>
<n-descriptions-item label="事件类型">{{ formValue.eventType || '-' }}</n-descriptions-item>
<n-descriptions-item label="事件ID">{{ formValue.eventId || '-' }}</n-descriptions-item>
<n-descriptions-item label="业务ID">{{ formValue.bizId || '-' }}</n-descriptions-item>
+14 -5
View File
@@ -1,7 +1,7 @@
<template>
<div>
<div class="n-layout-page-header">
<n-card :bordered="false" title="IM后台命令"></n-card>
<n-card :bordered="false" title="IM后台命令" />
</div>
<n-card :bordered="false" class="proCard">
<BasicForm
@@ -52,14 +52,20 @@
render(record: State) {
return h(TableAction as any, {
style: 'button',
actions: [{ label: '详情', onClick: () => viewRef.value.openModal(record), auth: ['/imKafkaCommand/view'] }],
actions: [
{
label: '详情',
onClick: () => viewRef.value.openModal(record),
auth: ['/imKafkaCommand/view'],
},
],
});
},
});
const scrollX = computed(() => adaTableScrollX(columns, actionColumn.width));
const [register] = useForm({
const [register, { setFieldsValue }] = useForm({
gridProps: { cols: '1 s:1 m:2 l:3 xl:4 2xl:4' },
labelWidth: 90,
schemas,
@@ -77,7 +83,7 @@
async function sendCacheInvalidate() {
const tenant = getFirstTenant();
if (!tenant) {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
return;
}
const res = await CacheInvalidate({
@@ -93,7 +99,7 @@
async function sendWorkbenchEvent() {
const tenant = getFirstTenant();
if (!tenant) {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
return;
}
const res = await WorkbenchEvent({
@@ -117,6 +123,9 @@
onMounted(async () => {
loadOptions();
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
}
});
</script>
+3 -3
View File
@@ -48,11 +48,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: true,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
@@ -103,7 +103,7 @@ export const schemas = ref<FormSchema[]>([
export const columns = [
{ title: 'ID', key: 'id', align: 'left', width: 90 },
{ title: '租户', key: 'tenantCode', align: 'left', width: 120 },
{ title: '商户', key: 'tenantCode', align: 'left', width: 120 },
{ title: '命令ID', key: 'commandId', align: 'left', width: 210 },
{ title: '事件类型', key: 'eventType', align: 'left', width: 190 },
{ title: '业务类型', key: 'bizType', align: 'left', width: 110 },
+1 -1
View File
@@ -12,7 +12,7 @@
<n-scrollbar style="max-height: 87vh" class="pr-5">
<n-spin :show="loading" description="请稍候...">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ formValue.tenantCode || '-' }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ formValue.tenantCode || '-' }}</n-descriptions-item>
<n-descriptions-item label="状态">{{ statusLabel }}</n-descriptions-item>
<n-descriptions-item label="命令ID">{{ formValue.commandId }}</n-descriptions-item>
<n-descriptions-item label="事件ID">{{ formValue.eventId }}</n-descriptions-item>
+2 -2
View File
@@ -150,7 +150,7 @@
function handleExport() {
const params = { ...searchFormRef.value?.formModel };
if (isPlatformAdmin.value && !params.tenantId) {
message.warning('请选择租户');
message.warning('请选择商户');
return;
}
Export(params);
@@ -204,7 +204,7 @@
await loadImQueryTenantOptions();
if (imQueryTenantOptions.value.length)
await setFieldsValue({ tenantId: imQueryTenantOptions.value[0].value });
else message.warning('暂无可用租户');
else message.warning('暂无可用商户');
}
reloadTable();
});
+2 -2
View File
@@ -10,11 +10,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => imQueryTenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+3 -3
View File
@@ -11,11 +11,11 @@
label-placement="left"
label-width="120"
>
<n-form-item v-if="isPlatformAdmin" label="租户">
<n-form-item v-if="isPlatformAdmin" label="商户">
<n-select
v-model:value="selectedTenantId"
:options="tenantOptions"
placeholder="请选择租户"
placeholder="请选择商户"
@update:value="loadConfig"
/>
</n-form-item>
@@ -145,7 +145,7 @@
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) selectedTenantId.value = tenantOptions.value[0].value;
else message.warning('暂无可用租户');
else message.warning('暂无可用商户');
}
await loadConfig();
});
@@ -173,7 +173,7 @@
}
const params = { ...searchFormRef.value?.formModel };
if (isPlatformAdmin.value && !params.tenantId) {
message.warning('请选择租户');
message.warning('请选择商户');
return;
}
api.Export(params);
@@ -219,7 +219,7 @@
await loadImQueryTenantOptions();
if (imQueryTenantOptions.value.length)
await setFieldsValue({ tenantId: imQueryTenantOptions.value[0].value });
else message.warning('暂无可用租户');
else message.warning('暂无可用商户');
}
if (!props.group) reloadTable();
});
+2 -2
View File
@@ -11,11 +11,11 @@ export function createMessageSchemas(group: boolean) {
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => imQueryTenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+1 -1
View File
@@ -220,7 +220,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+3 -3
View File
@@ -40,11 +40,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
@@ -70,7 +70,7 @@ export const schemas = ref<FormSchema[]>([
]);
export const columns = [
{ title: '租户', key: 'tenantName', align: 'left', width: 150 },
{ title: '商户', key: 'tenantName', align: 'left', width: 150 },
{
title: '场景',
key: 'scene',
+3 -3
View File
@@ -1,7 +1,7 @@
<template>
<div>
<div class="n-layout-page-header">
<n-card :bordered="false" title="IM组织架构" />
<n-card :bordered="false" title="组织架构" />
</div>
<n-card :bordered="false" class="proCard">
<n-grid :x-gap="16" :y-gap="16" responsive="screen" cols="1 l:2">
@@ -388,7 +388,7 @@
function handleDepartmentExport() {
const params = { ...departmentSearchRef.value?.formModel };
if (isPlatformAdmin.value && !params.tenantId) {
message.warning('请先选择租户');
message.warning('请先选择商户');
return;
}
DepartmentExport(params);
@@ -529,7 +529,7 @@
if (tenantOptions.value.length > 0) {
await setDepartmentFields({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadDepartments();
+2 -2
View File
@@ -73,11 +73,11 @@ export const departmentSchemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+1 -1
View File
@@ -148,7 +148,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+2 -2
View File
@@ -44,11 +44,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+1 -1
View File
@@ -8,7 +8,7 @@
>
<n-spin :show="loading" description="请稍候...">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="来源">{{ sourceLabel }}</n-descriptions-item>
<n-descriptions-item label="事件ID">{{ formValue.eventId }}</n-descriptions-item>
<n-descriptions-item label="事件类型">{{ formValue.eventType }}</n-descriptions-item>
+8
View File
@@ -3,11 +3,19 @@ import { List as TenantList } from '@/api/imTenant';
export const policyTenantOptions = ref<any[]>([{ label: '全局默认', value: 0 }]);
export function getDefaultTenantValue(options: any[]) {
const defaultTenant = options.find(
(item) => item.code === 'default' || String(item.label || '').includes('(default)')
);
return defaultTenant?.value || options.find((item) => Number(item.value) > 0)?.value || 0;
}
export async function loadPolicyTenantOptions(includeGlobal = true) {
const res = await TenantList({ page: 1, perPage: 100 });
const tenants = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
code: item.code,
}));
policyTenantOptions.value = includeGlobal
? [{ label: '全局默认', value: 0 }, ...tenants]
+2 -2
View File
@@ -42,11 +42,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+1 -1
View File
@@ -8,7 +8,7 @@
>
<n-spin :show="loading">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="用户ID">{{ formValue.userId }}</n-descriptions-item>
<n-descriptions-item label="提交ID">{{ formValue.submissionId }}</n-descriptions-item>
<n-descriptions-item label="状态">{{ statusLabel }}</n-descriptions-item>
+15 -3
View File
@@ -267,7 +267,12 @@
View,
} from '@/api/imSecurityPolicy';
import { columns, ipColumns, loadOptions, schemas } from './model';
import { loadPolicyTenantOptions, parseJSON } from '@/views/imPolicyShared';
import {
getDefaultTenantValue,
loadPolicyTenantOptions,
parseJSON,
policyTenantOptions,
} from '@/views/imPolicyShared';
const dict = useDictStore(),
message = useMessage(),
dialog = useDialog(),
@@ -368,7 +373,11 @@
const ipRules = { ipCidr: { required: true, message: '请输入IP或CIDR' } };
const tenantSchema = schemas.value.find((v) => v.field === 'tenantId');
if (tenantSchema) tenantSchema.ifShow = () => userStore.isCompanyDept;
const [register] = useForm({ gridProps: { cols: '1 s:1 m:2 l:3' }, labelWidth: 90, schemas });
const [register, { setFieldsValue }] = useForm({
gridProps: { cols: '1 s:1 m:2 l:3' },
labelWidth: 90,
schemas,
});
const loadTable = (res) => List({ ...searchFormRef.value?.formModel, ...res }),
loadIPTable = (res) => IPRuleList({ tenantId: tenantId(), ...res });
const reloadAll = () => {
@@ -562,7 +571,10 @@
}
onMounted(async () => {
loadOptions();
if (userStore.isCompanyDept) await loadPolicyTenantOptions(true);
if (userStore.isCompanyDept) {
await loadPolicyTenantOptions(true);
await setFieldsValue({ tenantId: getDefaultTenantValue(policyTenantOptions.value) });
}
reloadAll();
});
</script>
+1 -1
View File
@@ -8,7 +8,7 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: { options: computed(() => policyTenantOptions.value), clearable: false },
},
{
+11 -3
View File
@@ -161,7 +161,12 @@
Status,
} from '@/api/imSensitiveWord';
import { columns, groupOptions, loadOptions, schemas } from './model';
import { loadPolicyTenantOptions, parseJSON } from '@/views/imPolicyShared';
import {
getDefaultTenantValue,
loadPolicyTenantOptions,
parseJSON,
policyTenantOptions,
} from '@/views/imPolicyShared';
const dict = useDictStore(),
message = useMessage(),
dialog = useDialog(),
@@ -204,7 +209,7 @@
};
const tenantSchema = schemas.value.find((v) => v.field === 'tenantId');
if (tenantSchema) tenantSchema.ifShow = () => userStore.isCompanyDept;
const [register] = useForm({
const [register, { setFieldsValue }] = useForm({
gridProps: { cols: '1 s:1 m:2 l:3 xl:4' },
labelWidth: 90,
schemas,
@@ -323,7 +328,10 @@
);
onMounted(async () => {
loadOptions();
if (userStore.isCompanyDept) await loadPolicyTenantOptions(true);
if (userStore.isCompanyDept) {
await loadPolicyTenantOptions(true);
await setFieldsValue({ tenantId: getDefaultTenantValue(policyTenantOptions.value) });
}
await loadGroups();
reload();
});
+1 -1
View File
@@ -9,7 +9,7 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: { options: computed(() => policyTenantOptions.value), clearable: false },
},
{ field: 'word', component: 'NInput', label: '敏感词', componentProps: { clearable: true } },
+4 -2
View File
@@ -70,8 +70,10 @@
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length === 0) {
message.warning('暂无可用租户');
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
}
reloadTable();
+3 -3
View File
@@ -30,11 +30,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: true,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
@@ -50,7 +50,7 @@ export const schemas = ref<FormSchema[]>([
]);
export const columns = [
{ title: '租户', key: 'tenantName', align: 'left', width: 160 },
{ title: '商户', key: 'tenantName', align: 'left', width: 160 },
{ title: '企业码', key: 'tenantCode', align: 'left', width: 120 },
{
title: '状态',
+1 -1
View File
@@ -14,7 +14,7 @@
}}
</n-alert>
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ detail.name || current.name }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ detail.name || current.name }}</n-descriptions-item>
<n-descriptions-item label="编码">{{ detail.code || current.code }}</n-descriptions-item>
<n-descriptions-item label="用户数">{{ detail.userCount }}</n-descriptions-item>
<n-descriptions-item label="群数">{{ detail.groupCount }}</n-descriptions-item>
+7 -7
View File
@@ -6,7 +6,7 @@
:show-icon="false"
preset="dialog"
transform-origin="center"
:title="formValue.id > 0 ? '编辑IM租户 #' + formValue.id : '添加IM租户'"
:title="formValue.id > 0 ? '编辑IM商户 #' + formValue.id : '添加IM商户'"
:style="{
width: dialogWidth,
}"
@@ -23,13 +23,13 @@
>
<n-grid cols="1 s:1 m:2 l:2 xl:2 2xl:2" responsive="screen">
<n-gi span="1">
<n-form-item label="租户编码" path="code">
<n-input placeholder="请输入租户编码" v-model:value="formValue.code" />
<n-form-item label="商户编码" path="code">
<n-input placeholder="请输入商户编码" v-model:value="formValue.code" />
</n-form-item>
</n-gi>
<n-gi span="1">
<n-form-item label="租户名称" path="name">
<n-input placeholder="请输入租户名称" v-model:value="formValue.name" />
<n-form-item label="商户名称" path="name">
<n-input placeholder="请输入商户名称" v-model:value="formValue.name" />
</n-form-item>
</n-gi>
<n-gi span="1">
@@ -83,10 +83,10 @@
</n-form-item>
</n-gi>
<n-gi span="2">
<n-form-item label="租户描述" path="tenantDesc">
<n-form-item label="商户描述" path="tenantDesc">
<n-input
type="textarea"
placeholder="请输入租户描述"
placeholder="请输入商户描述"
v-model:value="formValue.tenantDesc"
/>
</n-form-item>
+1 -1
View File
@@ -1,7 +1,7 @@
<template>
<div>
<div class="n-layout-page-header">
<n-card :bordered="false" title="IM租户管理" />
<n-card :bordered="false" title="IM商户管理" />
</div>
<n-card :bordered="false" class="proCard">
<BasicForm
+12 -12
View File
@@ -10,9 +10,9 @@ const dict = useDictStore();
export class State {
public id = 0; // ID
public code = ''; // 租户编码
public name = ''; // 租户名称
public tenantDesc = ''; // 租户描述
public code = ''; // 商户编码
public name = ''; // 商户名称
public tenantDesc = ''; // 商户描述
public dbName = ''; // 业务库名
public dbDsn = ''; // 独立连接串
public state = 1; // 状态
@@ -69,19 +69,19 @@ export const rules = {
required: true,
trigger: ['blur', 'input'],
type: 'string',
message: '请输入租户编码',
message: '请输入商户编码',
},
name: {
required: true,
trigger: ['blur', 'input'],
type: 'string',
message: '请输入租户名称',
message: '请输入商户名称',
},
state: {
required: true,
trigger: ['blur', 'change'],
type: 'number',
message: '请选择租户状态',
message: '请选择商户状态',
},
};
@@ -90,17 +90,17 @@ export const schemas = ref<FormSchema[]>([
{
field: 'code',
component: 'NInput',
label: '租户编码',
label: '商户编码',
componentProps: {
placeholder: '请输入租户编码',
placeholder: '请输入商户编码',
},
},
{
field: 'name',
component: 'NInput',
label: '租户名称',
label: '商户名称',
componentProps: {
placeholder: '请输入租户名称',
placeholder: '请输入商户名称',
},
},
{
@@ -142,13 +142,13 @@ export const columns = [
width: 70,
},
{
title: '租户编码',
title: '商户编码',
key: 'code',
align: 'left',
width: 150,
},
{
title: '租户名称',
title: '商户名称',
key: 'name',
align: 'left',
width: 180,
+3 -3
View File
@@ -3,14 +3,14 @@
v-model:show="showModal"
preset="dialog"
:show-icon="false"
:title="'租户健康与用量 #' + current.id"
:title="'商户健康与用量 #' + current.id"
:mask-closable="false"
:style="{ width: dialogWidth }"
>
<n-spin :show="loading" description="请稍候...">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ usage.name || current.name }}</n-descriptions-item>
<n-descriptions-item label="租户编码">{{ usage.code || current.code }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ usage.name || current.name }}</n-descriptions-item>
<n-descriptions-item label="商户编码">{{ usage.code || current.code }}</n-descriptions-item>
<n-descriptions-item label="业务库">{{ usage.dbName || '-' }}</n-descriptions-item>
<n-descriptions-item label="独立连接串">
{{ usage.dbDsnConfigured ? '已配置' : '未配置' }}
+1 -1
View File
@@ -10,7 +10,7 @@
>
<n-spin :show="loading" description="请稍候...">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ formValue.tenantName || '-' }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ formValue.tenantName || '-' }}</n-descriptions-item>
<n-descriptions-item label="用户ID">{{ formValue.userId }}</n-descriptions-item>
<n-descriptions-item label="昵称">{{ formValue.nickname || '-' }}</n-descriptions-item>
<n-descriptions-item label="状态">{{ stateLabel }}</n-descriptions-item>
+2 -2
View File
@@ -1,7 +1,7 @@
<template>
<div>
<div class="n-layout-page-header">
<n-card :bordered="false" title="IM用户管理" />
<n-card :bordered="false" title="用户管理" />
</div>
<n-card :bordered="false" class="proCard">
<BasicForm
@@ -575,7 +575,7 @@
tenantId = Number(tenantOptions.value[0].value);
await setFieldsValue({ tenantId });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
await loadPolicyGroupOptions(tenantId);
+6 -5
View File
@@ -13,8 +13,9 @@ export const tenantOptions = ref<any[]>([]);
export const policyGroupOptions = ref<any[]>([]);
export class State {
public tenantId = 0; // 租户ID
public tenantName = ''; // 租户名称
public tenantId = 0; // 商户ID
public tenantName = ''; // 商户名称
public displayNo = 0; // 后台展示编号
public userId = ''; // 用户ID
public username = ''; // 登录账号
public phone = ''; // 手机号
@@ -80,11 +81,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
@@ -130,7 +131,7 @@ export const schemas = ref<FormSchema[]>([
export const columns = [
{
title: '编号',
key: 'userId',
key: 'displayNo',
align: 'left',
width: 90,
},
+1 -1
View File
@@ -14,7 +14,7 @@
<n-scrollbar style="max-height: 87vh" class="pr-5">
<n-spin :show="loading" description="请稍候...">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="用户ID">{{ formValue.userId }}</n-descriptions-item>
<n-descriptions-item label="登录账号">{{ formValue.username }}</n-descriptions-item>
<n-descriptions-item label="手机号">{{ formValue.phone || '-' }}</n-descriptions-item>
+2 -2
View File
@@ -77,7 +77,7 @@
function handleExport() {
const params = { ...searchFormRef.value?.formModel };
if (isPlatformAdmin.value && !params.tenantId) {
message.warning('请选择租户');
message.warning('请选择商户');
return;
}
Export(params);
@@ -88,7 +88,7 @@
await loadImQueryTenantOptions();
if (imQueryTenantOptions.value.length)
await setFieldsValue({ tenantId: imQueryTenantOptions.value[0].value });
else message.warning('暂无可用租户');
else message.warning('暂无可用商户');
}
reloadTable();
});
+2 -2
View File
@@ -10,11 +10,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => imQueryTenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+15 -7
View File
@@ -10,7 +10,7 @@
@keyup.enter="reloadTable"
/>
<n-alert type="info" :show-icon="true" class="whitelist-summary">
租户渠道 IP 白名单 APP:{{
商户渠道 IP 白名单 APP:{{
whitelistSummary.appList.length
? `已配置 ${whitelistSummary.appList.length} 条`
: '未配置'
@@ -54,7 +54,7 @@
<n-modal
v-model:show="loginIPVisible"
preset="dialog"
title="租户渠道 IP 白名单"
title="商户渠道 IP 白名单"
:show-icon="false"
:style="{ width: whitelistDialogWidth }"
>
@@ -235,7 +235,12 @@
Status,
} from '@/api/imUserPolicyGroup';
import { columns, defaultPolicy, loadOptions, schemas } from './model';
import { loadPolicyTenantOptions, parseJSON } from '@/views/imPolicyShared';
import {
getDefaultTenantValue,
loadPolicyTenantOptions,
parseJSON,
policyTenantOptions,
} from '@/views/imPolicyShared';
const dict = useDictStore(),
message = useMessage(),
@@ -280,7 +285,7 @@
};
const tenantSchema = schemas.value.find((v) => v.field === 'tenantId');
if (tenantSchema) tenantSchema.ifShow = () => userStore.isCompanyDept;
const [register] = useForm({
const [register, { setFieldsValue }] = useForm({
gridProps: { cols: '1 s:1 m:2 l:3 xl:4' },
labelWidth: 90,
schemas,
@@ -350,7 +355,7 @@
async function openLoginIPWhitelist() {
const result = await fetchLoginIPWhitelist();
if (!result) {
message.warning('请先选择具体租户');
message.warning('请先选择具体商户');
return;
}
Object.assign(loginIPForm, {
@@ -367,7 +372,7 @@
appList: lines(loginIPForm.appText),
webList: lines(loginIPForm.webText),
});
message.success('租户渠道 IP 白名单保存成功');
message.success('商户渠道 IP 白名单保存成功');
loginIPVisible.value = false;
await refreshLoginIPSummary();
} finally {
@@ -474,7 +479,10 @@
}
onMounted(async () => {
loadOptions();
if (userStore.isCompanyDept) await loadPolicyTenantOptions(true);
if (userStore.isCompanyDept) {
await loadPolicyTenantOptions(true);
await setFieldsValue({ tenantId: getDefaultTenantValue(policyTenantOptions.value) });
}
reloadTable();
});
</script>
+1 -1
View File
@@ -23,7 +23,7 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: { options: computed(() => policyTenantOptions.value), clearable: false },
},
{
+1 -1
View File
@@ -144,7 +144,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value, type: 'abuse' });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+2 -2
View File
@@ -53,11 +53,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{
+1 -1
View File
@@ -12,7 +12,7 @@
<n-scrollbar style="max-height: 87vh" class="pr-5">
<n-spin :show="loading" description="请稍候...">
<n-descriptions label-placement="left" bordered :column="settingStore.isMobile ? 1 : 2">
<n-descriptions-item label="租户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="商户">{{ formValue.tenantName }}</n-descriptions-item>
<n-descriptions-item label="类型">{{ typeLabel }}</n-descriptions-item>
<n-descriptions-item label="工单ID">{{ formValue.orderId }}</n-descriptions-item>
<n-descriptions-item label="状态">{{ statusLabel }}</n-descriptions-item>
+1 -1
View File
@@ -283,7 +283,7 @@
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用租户');
message.warning('暂无可用商户');
}
}
reloadTable();
+2 -2
View File
@@ -40,11 +40,11 @@ export const schemas = ref<FormSchema[]>([
{
field: 'tenantId',
component: 'NSelect',
label: '租户',
label: '商户',
componentProps: {
clearable: false,
options: computed(() => tenantOptions.value),
placeholder: '请选择租户',
placeholder: '请选择商户',
},
},
{