From 5f3f6913b800d3321ef5d00c6c2330b2d2dd5c3e Mon Sep 17 00:00:00 2001 From: richjohnrambo Date: Mon, 7 Sep 2026 21:52:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=BE=A4=E8=81=8A?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=89=8B=E5=8A=A8=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/internal/logic/sys/im_message_admin.go | 6 ++++ .../model/input/sysin/im_message_admin.go | 21 ++++++++----- .../input/sysin/im_message_admin_test.go | 22 +++++++++++++ .../views/imMessageShared/MessageTable.vue | 12 +++++-- web/src/views/imMessageShared/model.ts | 31 +++++++++++++++++-- 5 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 server/internal/model/input/sysin/im_message_admin_test.go diff --git a/server/internal/logic/sys/im_message_admin.go b/server/internal/logic/sys/im_message_admin.go index 34f6c9c..c407094 100644 --- a/server/internal/logic/sys/im_message_admin.go +++ b/server/internal/logic/sys/im_message_admin.go @@ -50,7 +50,13 @@ func (s *sSysImGroupMessage) List(ctx context.Context, in *sysin.ImGroupMessageL } values := addPageQuery(url.Values{}, in.Page, in.PerPage) setQuery(values, "topic", in.Topic) + if in.SeqId > 0 { + values.Set("seq_id", strconv.FormatInt(in.SeqId, 10)) + } setQuery(values, "sender_user_id", in.SenderUserId) + setQuery(values, "sender_username", in.SenderUsername) + setQuery(values, "sender_nickname", in.SenderNickname) + setQuery(values, "group_name", in.GroupName) setQuery(values, "content_type", in.ContentType) setQuery(values, "status", in.Status) setQuery(values, "keyword", in.Keyword) diff --git a/server/internal/model/input/sysin/im_message_admin.go b/server/internal/model/input/sysin/im_message_admin.go index e027f05..dfbab99 100644 --- a/server/internal/model/input/sysin/im_message_admin.go +++ b/server/internal/model/input/sysin/im_message_admin.go @@ -29,16 +29,23 @@ func (in *ImPrivateMessageListInp) Filter(ctx context.Context) error { type ImGroupMessageListInp struct { form.PageReq - TenantId int64 `json:"tenantId" dc:"租户ID"` - Topic string `json:"topic" dc:"群Topic"` - SenderUserId string `json:"senderUserId" dc:"发送用户ID"` - ContentType string `json:"contentType" dc:"内容类型"` - Status string `json:"status" dc:"状态"` - Keyword string `json:"keyword" dc:"内容关键词"` - CreatedAt []*gtime.Time `json:"createdAt" dc:"发送时间"` + TenantId int64 `json:"tenantId" dc:"租户ID"` + Topic string `json:"topic" dc:"群Topic"` + SeqId int64 `json:"seqId" dc:"消息序号"` + SenderUserId string `json:"senderUserId" dc:"发送用户ID"` + SenderUsername string `json:"senderUsername" dc:"发送人用户名"` + SenderNickname string `json:"senderNickname" dc:"发送人昵称"` + GroupName string `json:"groupName" dc:"群名称"` + ContentType string `json:"contentType" dc:"内容类型"` + Status string `json:"status" dc:"状态"` + Keyword string `json:"keyword" dc:"内容关键词"` + CreatedAt []*gtime.Time `json:"createdAt" dc:"发送时间"` } func (in *ImGroupMessageListInp) Filter(ctx context.Context) error { + in.SenderUsername = strings.TrimSpace(in.SenderUsername) + in.SenderNickname = strings.TrimSpace(in.SenderNickname) + in.GroupName = strings.TrimSpace(in.GroupName) return filterImMessageList(&in.PageReq, &in.Topic, &in.Keyword, in.ContentType, in.Status) } diff --git a/server/internal/model/input/sysin/im_message_admin_test.go b/server/internal/model/input/sysin/im_message_admin_test.go new file mode 100644 index 0000000..081a5ef --- /dev/null +++ b/server/internal/model/input/sysin/im_message_admin_test.go @@ -0,0 +1,22 @@ +package sysin + +import ( + "context" + "testing" +) + +func TestImGroupMessageListFilterTrimsTextFilters(t *testing.T) { + in := &ImGroupMessageListInp{ + SenderUsername: " alice ", + SenderNickname: " 小明 ", + GroupName: " 测试群 ", + Keyword: " 关键字 ", + Topic: " grpTest ", + } + if err := in.Filter(context.Background()); err != nil { + t.Fatal(err) + } + if in.SenderUsername != "alice" || in.SenderNickname != "小明" || in.GroupName != "测试群" || in.Keyword != "关键字" || in.Topic != "grpTest" { + t.Fatalf("message filters were not normalized: %#v", in) + } +} diff --git a/web/src/views/imMessageShared/MessageTable.vue b/web/src/views/imMessageShared/MessageTable.vue index 3c82d3f..3dc406b 100644 --- a/web/src/views/imMessageShared/MessageTable.vue +++ b/web/src/views/imMessageShared/MessageTable.vue @@ -108,6 +108,7 @@ const showDetail = ref(false); const showAction = ref(false); const submitting = ref(false); + const hasQueried = ref(!props.group); const current = ref({}); const reason = ref(''); const actionType = ref<'hide' | 'delete'>('hide'); @@ -148,21 +149,28 @@ schemas, }); const loadDataTable = async (res) => { + if (props.group && !hasQueried.value) return { list: [], page: 1, pageCount: 0, totalCount: 0 }; const params = { ...searchFormRef.value?.formModel, ...res }; if (isPlatformAdmin.value && !params.tenantId) return { list: [], page: 1, pageCount: 0, totalCount: 0 }; return api.List(params); }; function reloadTable() { + hasQueried.value = true; actionRef.value?.reload(); } async function handleReset() { const defaults: Recordable = {}; if (isPlatformAdmin.value) defaults.tenantId = imQueryTenantOptions.value[0]?.value; await setFieldsValue(defaults); - reloadTable(); + if (props.group) hasQueried.value = false; + actionRef.value?.reload(); } function handleExport() { + if (props.group && !hasQueried.value) { + message.warning('请先查询群聊消息'); + return; + } const params = { ...searchFormRef.value?.formModel }; if (isPlatformAdmin.value && !params.tenantId) { message.warning('请选择租户'); @@ -213,7 +221,7 @@ await setFieldsValue({ tenantId: imQueryTenantOptions.value[0].value }); else message.warning('暂无可用租户'); } - reloadTable(); + if (!props.group) reloadTable(); }); diff --git a/web/src/views/imMessageShared/model.ts b/web/src/views/imMessageShared/model.ts index 47d32e9..7aebd5c 100644 --- a/web/src/views/imMessageShared/model.ts +++ b/web/src/views/imMessageShared/model.ts @@ -21,8 +21,8 @@ export function createMessageSchemas(group: boolean) { { field: 'topic', component: 'NInput', - label: group ? '群Topic' : '会话Topic', - componentProps: { placeholder: '请输入Topic' }, + label: group ? '群号/Topic' : '会话Topic', + componentProps: { placeholder: group ? '请输入群号或Topic' : '请输入Topic' }, }, { field: group ? 'senderUserId' : 'fromUserId', @@ -31,6 +31,33 @@ export function createMessageSchemas(group: boolean) { componentProps: { placeholder: '请输入用户ID' }, }, ]; + if (group) + items.push( + { + field: 'seqId', + component: 'NInputNumber', + label: '消息序号', + componentProps: { min: 1, showButton: false, placeholder: '请输入消息序号' }, + }, + { + field: 'senderUsername', + component: 'NInput', + label: '发送人用户名', + componentProps: { placeholder: '请输入发送人用户名' }, + }, + { + field: 'senderNickname', + component: 'NInput', + label: '发送人昵称', + componentProps: { placeholder: '请输入发送人昵称' }, + }, + { + field: 'groupName', + component: 'NInput', + label: '群名称', + componentProps: { placeholder: '请输入群名称' }, + } + ); if (!group) items.push({ field: 'toUserId',