From da60b52be22ec902c006eb09c685932f5617e803 Mon Sep 17 00:00:00 2001 From: richjohnrambo Date: Wed, 9 Sep 2026 11:10:59 +0800 Subject: [PATCH] feat: improve group owner and status display --- server/internal/logic/sys/im_group.go | 8 ++++ server/internal/model/input/sysin/im_group.go | 32 ++++++++------- .../storage/data/generate/im_group_menu.sql | 10 +++++ web/src/views/imGroup/model.ts | 41 +++++++++++++------ web/src/views/imGroup/view.vue | 7 +++- 5 files changed, 70 insertions(+), 28 deletions(-) diff --git a/server/internal/logic/sys/im_group.go b/server/internal/logic/sys/im_group.go index 98e244d..88c3355 100644 --- a/server/internal/logic/sys/im_group.go +++ b/server/internal/logic/sys/im_group.go @@ -70,10 +70,14 @@ func (s *sSysImGroup) List(ctx context.Context, in *sysin.ImGroupListInp) (list func (s *sSysImGroup) groupModel(ctx context.Context, db gdb.DB) *gdb.Model { return db.Model("im_topics t").Safe().Ctx(ctx). LeftJoin("im_group_settings gs", "gs.topic = t.name"). + LeftJoin("im_users owner", "owner.id = COALESCE(gs.owner_user_id, t.owner)"). + LeftJoin("im_user_profiles owner_profile", "owner_profile.user_id = COALESCE(gs.owner_user_id, t.owner)"). Fields( "t.name topic", "t.state", "COALESCE(gs.owner_user_id, t.owner) owner_id", + "COALESCE(NULLIF(owner_profile.nickname, ''), owner.username, '') owner_nickname", + "COALESCE(owner.username, '') owner_username", "t.seqid seq_id", "t.delid del_id", "t.subcnt sub_cnt", @@ -137,10 +141,14 @@ func (s *sSysImGroup) View(ctx context.Context, in *sysin.ImGroupViewInp) (res * err = db.Model("im_topics t").Safe().Ctx(ctx). LeftJoin("im_group_settings gs", "gs.topic = t.name"). + LeftJoin("im_users owner", "owner.id = COALESCE(gs.owner_user_id, t.owner)"). + LeftJoin("im_user_profiles owner_profile", "owner_profile.user_id = COALESCE(gs.owner_user_id, t.owner)"). Fields( "t.name topic", "t.state", "COALESCE(gs.owner_user_id, t.owner) owner_id", + "COALESCE(NULLIF(owner_profile.nickname, ''), owner.username, '') owner_nickname", + "COALESCE(owner.username, '') owner_username", "t.seqid seq_id", "t.delid del_id", "t.subcnt sub_cnt", diff --git a/server/internal/model/input/sysin/im_group.go b/server/internal/model/input/sysin/im_group.go index 2ecbdd7..69df7d1 100644 --- a/server/internal/model/input/sysin/im_group.go +++ b/server/internal/model/input/sysin/im_group.go @@ -30,21 +30,23 @@ func (in *ImGroupListInp) Filter(ctx context.Context) (err error) { } type ImGroupListModel struct { - TenantId int64 `json:"tenantId" dc:"租户ID"` - TenantName string `json:"tenantName" dc:"租户名称"` - Topic string `json:"topic" dc:"Topic"` - State int `json:"state" dc:"状态"` - OwnerId int64 `json:"ownerId" dc:"群主ID"` - SeqId int `json:"seqId" dc:"最新消息序号"` - DelId int `json:"delId" dc:"删除序号"` - SubCnt int `json:"subCnt" dc:"成员数"` - TouchedAt *gtime.Time `json:"touchedAt" dc:"活跃时间"` - CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` - UpdatedAt *gtime.Time `json:"updatedAt" dc:"修改时间"` - PublicJson string `json:"publicJson" dc:"公开资料"` - TrustedJson string `json:"trustedJson" dc:"可信资料"` - TagsJson string `json:"tagsJson" dc:"标签"` - AuxJson string `json:"auxJson" dc:"辅助资料"` + TenantId int64 `json:"tenantId" dc:"租户ID"` + TenantName string `json:"tenantName" dc:"租户名称"` + Topic string `json:"topic" dc:"Topic"` + State int `json:"state" dc:"状态"` + OwnerId int64 `json:"ownerId" dc:"群主ID"` + OwnerNickname string `json:"ownerNickname" dc:"群主昵称"` + OwnerUsername string `json:"ownerUsername" dc:"群主用户名"` + SeqId int `json:"seqId" dc:"最新消息序号"` + DelId int `json:"delId" dc:"删除序号"` + SubCnt int `json:"subCnt" dc:"成员数"` + TouchedAt *gtime.Time `json:"touchedAt" dc:"活跃时间"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" dc:"修改时间"` + PublicJson string `json:"publicJson" dc:"公开资料"` + TrustedJson string `json:"trustedJson" dc:"可信资料"` + TagsJson string `json:"tagsJson" dc:"标签"` + AuxJson string `json:"auxJson" dc:"辅助资料"` GroupName string `json:"groupName" dc:"群名称"` AvatarFileId string `json:"avatarFileId" dc:"头像文件ID"` diff --git a/server/storage/data/generate/im_group_menu.sql b/server/storage/data/generate/im_group_menu.sql index 5424a19..c1112e6 100644 --- a/server/storage/data/generate/im_group_menu.sql +++ b/server/storage/data/generate/im_group_menu.sql @@ -89,3 +89,13 @@ WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imGroupMemberRem 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, @groupListId, '转让群主', 'imGroupOwnerTransfer', '', '', '3', '', '/imGroup/ownerTransfer', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @groupDirId, ' tr_', @groupListId, ' '), '160', '', '1', @now, @now WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imGroupOwnerTransfer'); + +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, @groupListId, '解散群', 'imGroupDissolve', '', '', '3', '', '/imGroup/dissolve', '', '', '1', '', '0', '0', '', '0', '1', '0', '4', CONCAT('tr_', @imRootId, ' tr_', @groupDirId, ' tr_', @groupListId, ' '), '170', '', '1', @now, @now +WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imGroupDissolve'); + +INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`, `menu_id`) +SELECT source_role.`role_id`, dissolve_menu.`id` +FROM `hg_admin_role_menu` source_role +JOIN `hg_admin_menu` governance_update ON governance_update.`id` = source_role.`menu_id` AND governance_update.`name` = 'imGroupGovernanceUpdate' +JOIN `hg_admin_menu` dissolve_menu ON dissolve_menu.`name` = 'imGroupDissolve'; diff --git a/web/src/views/imGroup/model.ts b/web/src/views/imGroup/model.ts index 45c22a4..1a5d7d3 100644 --- a/web/src/views/imGroup/model.ts +++ b/web/src/views/imGroup/model.ts @@ -1,4 +1,5 @@ -import { computed, ref } from 'vue'; +import { computed, h, ref } from 'vue'; +import { NTag } from 'naive-ui'; import { cloneDeep } from 'lodash-es'; import { FormSchema } from '@/components/Form'; import { defRangeShortcuts } from '@/utils/dateUtil'; @@ -15,6 +16,8 @@ export class State { public topic = ''; // Topic public state = 0; // 状态 public ownerId = 0; // 群主ID + public ownerNickname = ''; // 群主昵称 + public ownerUsername = ''; // 群主用户名 public seqId = 0; // 最新消息序号 public delId = 0; // 删除序号 public subCnt = 0; // 成员数 @@ -183,10 +186,10 @@ export const schemas = ref([ // 表格列 export const columns = [ { - title: 'Topic', - key: 'topic', + title: '群名称', + key: 'groupName', align: 'left', - width: 220, + width: 180, }, { title: '状态', @@ -194,7 +197,12 @@ export const columns = [ align: 'left', width: 110, render(row: State) { - return dict.getLabel('ImGroupStateOptions', row.state); + const label = dict.getLabel('ImGroupStateOptions', row.state) || '-'; + return h( + NTag, + { type: dict.getType('ImGroupStateOptions', row.state), bordered: true }, + () => label + ); }, }, { @@ -203,20 +211,29 @@ export const columns = [ align: 'left', width: 110, render(row: State) { - return dict.getLabel('ImGroupStatusOptions', row.groupStatus) || '-'; + const dictName = row.groupStatus ? 'ImGroupStatusOptions' : 'ImGroupStateOptions'; + const value = row.groupStatus || row.state; + const label = dict.getLabel(dictName, value) || '-'; + return h(NTag, { type: dict.getType(dictName, value), bordered: true }, () => label); }, }, { - title: '群名称', - key: 'groupName', + title: 'Topic', + key: 'topic', align: 'left', - width: 160, + width: 220, }, { - title: '群主ID', - key: 'ownerId', + title: '群主昵称', + key: 'ownerNickname', align: 'left', - width: 120, + width: 150, + }, + { + title: '群主用户名', + key: 'ownerUsername', + align: 'left', + width: 160, }, { title: '成员数', diff --git a/web/src/views/imGroup/view.vue b/web/src/views/imGroup/view.vue index ae78247..b85f021 100644 --- a/web/src/views/imGroup/view.vue +++ b/web/src/views/imGroup/view.vue @@ -15,7 +15,12 @@ {{ formValue.tenantName }} {{ formValue.topic }} {{ stateLabel }} - {{ formValue.ownerId }} + {{ + formValue.ownerNickname || '-' + }} + {{ + formValue.ownerUsername || '-' + }} {{ groupStatusLabel }} {{ formValue.groupName || '-'