chore: seed migration objects batch 6

This commit is contained in:
dev
2026-10-18 13:37:38 +08:00
parent c8c40b1dd2
commit 8b1b0219c5
100 changed files with 9849 additions and 537 deletions
+78 -78
View File
@@ -9,11 +9,6 @@
:title="'群成员 ' + current.topic"
:style="{ width: dialogWidth }"
>
<n-form label-placement="left" :label-width="110" class="member-command-form">
<n-form-item label="操作IM用户ID">
<n-input-number v-model:value="actorUserId" clearable />
</n-form-item>
</n-form>
<BasicTable
ref="actionRef"
:columns="memberColumns"
@@ -36,59 +31,59 @@
import { computed, h, reactive, ref } from 'vue';
import { useDialog, useMessage } from 'naive-ui';
import { BasicTable, TableAction } from '@/components/Table';
import { AdminRemove, AdminSet, MemberList, MemberMute, MemberRemove, MemberUnmute } from '@/api/imGroup';
import { MemberState, memberColumns, newState, State } from './model';
import { usePermission } from '@/hooks/web/usePermission';
import { MemberList, Mute, OwnerTransfer, RoleUpdate } from '@/api/imGroup';
import { memberColumns, newState, State } from './model';
import { adaModalWidth, adaTableScrollX } from '@/utils/hotgo';
const dialog = useDialog();
const message = useMessage();
const dialog = useDialog();
const { hasPermission } = usePermission();
const showModal = ref(false);
const current = ref<State>(newState(null));
const actorUserId = ref<number | null>(null);
const actionRef = ref();
const dialogWidth = computed(() => adaModalWidth(1120));
const dialogWidth = computed(() => adaModalWidth(980));
const actionColumn = reactive({
width: 300,
width: 210,
title: '操作',
key: 'action',
fixed: 'right',
render(record: MemberState) {
render(record) {
return h(TableAction as any, {
style: 'button',
actions: [
{
label: '设管理员',
onClick: () => submitMemberCommand('setAdmin', record),
auth: ['/imGroup/adminSet'],
ifShow: record.role !== 'admin' && record.role !== 'owner',
},
{
label: '删管理员',
onClick: () => submitMemberCommand('removeAdmin', record),
auth: ['/imGroup/adminRemove'],
ifShow: record.role === 'admin',
},
{
label: '禁言',
onClick: () => submitMemberCommand('mute', record),
auth: ['/imGroup/memberMute'],
type: 'warning',
ifShow: () => record.memberStatus === 'active',
disabled: !hasPermission(['/imGroup/mute']),
onClick: () => handleMute(record),
},
{
label: '解禁',
onClick: () => submitMemberCommand('unmute', record),
auth: ['/imGroup/memberUnmute'],
label: '设管理员',
type: 'primary',
ifShow: () => record.memberStatus === 'active' && record.role === 'member',
auth: ['/imGroup/roleUpdate'],
onClick: () => handleRoleUpdate(record, 'admin'),
},
{
label: '移出',
onClick: () => submitMemberCommand('remove', record),
auth: ['/imGroup/memberRemove'],
label: '取消管理员',
type: 'default',
ifShow: () => record.memberStatus === 'active' && record.role === 'admin',
auth: ['/imGroup/roleUpdate'],
onClick: () => handleRoleUpdate(record, 'member'),
},
{
label: '转群主',
type: 'error',
ifShow: () => record.memberStatus === 'active' && record.role !== 'owner',
auth: ['/imGroup/ownerTransfer'],
onClick: () => handleOwnerTransfer(record),
},
],
});
},
});
const scrollX = computed(() => adaTableScrollX(memberColumns, actionColumn.width));
// 加载表格数据
@@ -108,48 +103,58 @@
showModal.value = false;
}
function baseCommand(record: MemberState) {
if (!actorUserId.value) {
message.warning('请先填写操作IM用户ID');
return null;
}
return {
tenantId: current.value.tenantId,
topic: current.value.topic,
actorUserId: String(actorUserId.value),
userId: String(record.userId),
};
}
function submitMemberCommand(type: string, record: MemberState) {
const labels = {
setAdmin: '设置管理员',
removeAdmin: '删除管理员',
mute: '禁言成员',
unmute: '解除禁言',
remove: '移出群成员',
};
function handleMute(record) {
dialog.warning({
title: labels[type],
content: `确认对用户 ${record.userId} 执行该操作?`,
title: '禁言成员',
content: '将该成员禁言 24 小时,是否确认?',
positiveText: '确认',
negativeText: '取消',
onPositiveClick: async () => {
const params = baseCommand(record);
if (!params) return false;
let res: any;
if (type === 'setAdmin') {
res = await AdminSet({ ...params, userIds: [String(record.userId)] });
} else if (type === 'removeAdmin') {
res = await AdminRemove(params);
} else if (type === 'mute') {
res = await MemberMute(params);
} else if (type === 'unmute') {
res = await MemberUnmute(params);
} else {
res = await MemberRemove(params);
}
message.success(`命令已发送:${res?.commandId || '-'}`);
await Mute({
tenantId: current.value.tenantId,
topic: current.value.topic,
userId: record.userId,
expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
reason: '后台管理员禁言',
});
message.success('操作成功');
actionRef.value?.reload();
},
});
}
function handleRoleUpdate(record, role: string) {
dialog.warning({
title: role === 'admin' ? '设置管理员' : '取消管理员',
content: role === 'admin' ? '确定将该成员设置为管理员?' : '确定取消该成员管理员身份?',
positiveText: '确认',
negativeText: '取消',
onPositiveClick: async () => {
await RoleUpdate({
tenantId: current.value.tenantId,
topic: current.value.topic,
userId: record.userId,
role,
});
message.success('操作成功');
actionRef.value?.reload();
},
});
}
function handleOwnerTransfer(record) {
dialog.error({
title: '转让群主',
content: '转让后原群主会变为管理员,是否确认?',
positiveText: '确认',
negativeText: '取消',
onPositiveClick: async () => {
await OwnerTransfer({
tenantId: current.value.tenantId,
topic: current.value.topic,
userId: record.userId,
});
message.success('操作成功');
actionRef.value?.reload();
},
});
@@ -158,7 +163,6 @@
// 打开弹窗
function openModal(state: State) {
current.value = newState(state);
actorUserId.value = current.value.ownerId || null;
showModal.value = true;
setTimeout(() => {
actionRef.value?.reload();
@@ -170,8 +174,4 @@
});
</script>
<style lang="less" scoped>
.member-command-form {
margin-bottom: 12px;
}
</style>
<style lang="less"></style>