✨ feat(im): 修管理端 3 处:群消息 atUserNicknames 类型允许 null、移除前端无效的「消息内容」查询入口、表情包宽高加表单校验

pull/881/head
YunaiV 2026-05-21 15:10:34 +08:00
parent 7a236b4378
commit 73aa578c9b
4 changed files with 40 additions and 31 deletions

View File

@ -11,7 +11,8 @@ export interface ImManagerGroupMessageVO {
content: string
status: number
atUserIds?: number[]
atUserNicknames?: string[]
// 与 atUserIds 同长度;后端对找不到 / 已删除的成员返回 null,UI 用 `?.[idx] || userId` 回退到 userId 渲染
atUserNicknames?: (string | null)[]
receiptStatus?: number
sendTime: Date
createTime: Date

View File

@ -19,7 +19,8 @@
class="w-1/1"
/>
</el-form-item>
<el-form-item label="尺寸">
<!-- 尺寸:拆两个 form-item 让 prop / rules 各自绑定,避免单 form-item 时 rules 不生效 -->
<el-form-item label="宽度" prop="width">
<el-input-number
v-model="formData.width"
:min="1"
@ -27,18 +28,19 @@
controls-position="right"
class="!w-1/3"
/>
<span class="mx-2 text-[var(--el-text-color-secondary)]">×</span>
<el-input-number
v-model="formData.height"
:min="1"
:max="2048"
controls-position="right"
class="!w-1/3"
/>
<span class="ml-2 text-12px text-[var(--el-text-color-placeholder)]">
上传后自动探测;可手动调整(1 ~ 2048 像素)
</span>
</el-form-item>
<el-form-item label="高度" prop="height">
<el-input-number
v-model="formData.height"
:min="1"
:max="2048"
controls-position="right"
class="!w-1/3"
/>
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input-number
v-model="formData.sort"
@ -99,7 +101,31 @@ const formData = ref({
})
const formRules = reactive({
url: [{ required: true, message: '表情图不能为空', trigger: 'change' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }],
// 宽高自动探测后允许手改,但提交前必须落 1-2048 范围;防止用户清空后 submit 让后端报错
// 范围 rule 加 transform 把 null/undefined 透传给 async-validator,让空值只触发上面的 required 文案
width: [
{ required: true, message: '宽度不能为空', trigger: 'change' },
{
type: 'integer',
min: 1,
max: 2048,
message: '宽度需在 1 - 2048 像素之间',
trigger: 'change',
transform: (value) => (value == null ? value : Number(value))
}
],
height: [
{ required: true, message: '高度不能为空', trigger: 'change' },
{
type: 'integer',
min: 1,
max: 2048,
message: '高度需在 1 - 2048 像素之间',
trigger: 'change',
transform: (value) => (value == null ? value : Number(value))
}
]
})
const formRef = ref() // 表单 Ref

View File

@ -33,15 +33,7 @@
/>
</el-select>
</el-form-item>
<el-form-item label="消息内容" prop="content">
<el-input
v-model="queryParams.content"
placeholder="请输入消息内容"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<!-- 「消息内容」搜索入口暂时移除:后端 page 接口没有 content 字段,留着会误导管理员;后端补上后再恢复 -->
<el-form-item label="发送时间" prop="sendTime">
<el-date-picker
v-model="queryParams.sendTime"
@ -184,7 +176,6 @@ const queryParams = reactive({
groupId: undefined as number | undefined,
senderId: undefined as number | undefined,
type: undefined as number | undefined,
content: undefined as string | undefined,
sendTime: [] as string[]
})
const queryFormRef = ref() // 搜索的表单

View File

@ -37,15 +37,7 @@
/>
</el-select>
</el-form-item>
<el-form-item label="消息内容" prop="content">
<el-input
v-model="queryParams.content"
placeholder="请输入消息内容"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<!-- 「消息内容」搜索入口暂时移除:后端 page 接口没有 content 字段,留着会误导管理员;后端补上后再恢复 -->
<el-form-item label="发送时间" prop="sendTime">
<el-date-picker
v-model="queryParams.sendTime"
@ -159,7 +151,6 @@ const queryParams = reactive({
senderId: undefined as number | undefined,
receiverId: undefined as number | undefined,
type: undefined as number | undefined,
content: undefined as string | undefined,
sendTime: [] as string[]
})
const queryFormRef = ref() // 搜索的表单