|
|
@ -1,7 +1,6 @@ |
|
|
<template> |
|
|
<template> |
|
|
<div class="p-2"> |
|
|
<div class="p-2"> |
|
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" |
|
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
|
|
:leave-active-class="proxy?.animate.searchAnimate.leave"> |
|
|
|
|
|
<div v-show="showSearch" class="mb-[10px]"> |
|
|
<div v-show="showSearch" class="mb-[10px]"> |
|
|
<el-card shadow="hover"> |
|
|
<el-card shadow="hover"> |
|
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
|
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
|
|
@ -12,15 +11,20 @@ |
|
|
<im-user-select v-model="queryParams.ownerId"></im-user-select> |
|
|
<im-user-select v-model="queryParams.ownerId"></im-user-select> |
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
<el-form-item label="创建时间" prop="createdTime"> |
|
|
<el-form-item label="创建时间" prop="createdTime"> |
|
|
<el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" |
|
|
<el-date-picker |
|
|
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" |
|
|
v-model="dateRange" |
|
|
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker> |
|
|
value-format="YYYY-MM-DD HH:mm:ss" |
|
|
|
|
|
type="daterange" |
|
|
|
|
|
range-separator="-" |
|
|
|
|
|
start-placeholder="开始日期" |
|
|
|
|
|
end-placeholder="结束日期" |
|
|
|
|
|
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
|
|
|
|
|
></el-date-picker> |
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
<el-form-item> |
|
|
<el-form-item> |
|
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
|
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
|
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
|
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
|
|
<el-button type="warning" plain icon="Download" @click="handleExport" |
|
|
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['im:group:export']">导出</el-button> |
|
|
v-hasPermi="['im:group:export']">导出</el-button> |
|
|
|
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
</el-form> |
|
|
</el-form> |
|
|
</el-card> |
|
|
</el-card> |
|
|
@ -32,8 +36,7 @@ |
|
|
<el-table-column label="群名" align="center" prop="name" /> |
|
|
<el-table-column label="群名" align="center" prop="name" /> |
|
|
<el-table-column label="群头像" align="center" prop="headImage" width="100"> |
|
|
<el-table-column label="群头像" align="center" prop="headImage" width="100"> |
|
|
<template #default="scope"> |
|
|
<template #default="scope"> |
|
|
<image-preview v-if="scope.row.headImageThumb" :src="scope.row.headImageThumb" |
|
|
<image-preview v-if="scope.row.headImageThumb" :src="scope.row.headImageThumb" :full-src="scope.row.headImage" :width="40" :height="40" /> |
|
|
:full-src="scope.row.headImage" :width="40" :height="40" /> |
|
|
|
|
|
</template> |
|
|
</template> |
|
|
</el-table-column> |
|
|
</el-table-column> |
|
|
<el-table-column label="群主" align="center" prop="ownerUserName" /> |
|
|
<el-table-column label="群主" align="center" prop="ownerUserName" /> |
|
|
@ -55,19 +58,15 @@ |
|
|
</el-table-column> |
|
|
</el-table-column> |
|
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
|
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
|
|
<template #default="scope"> |
|
|
<template #default="scope"> |
|
|
<el-button link type="primary" v-hasPermi="['im:group:query']" |
|
|
<el-button link type="primary" v-hasPermi="['im:group:query']" @click="handleDetail(scope.row)">详情</el-button> |
|
|
@click="handleDetail(scope.row)">详情</el-button> |
|
|
<el-button v-if="scope.row.isBanned" link type="danger" v-hasPermi="['im:group:ban']" @click="handleUnban(scope.row)">解封</el-button> |
|
|
<el-button v-if="scope.row.isBanned" link type="danger" v-hasPermi="['im:group:ban']" |
|
|
<el-button v-else link type="danger" v-hasPermi="['im:group:ban']" @click="handleBan(scope.row)">封禁</el-button> |
|
|
@click="handleUnban(scope.row)">解封</el-button> |
|
|
|
|
|
<el-button v-else link type="danger" v-hasPermi="['im:group:ban']" |
|
|
|
|
|
@click="handleBan(scope.row)">封禁</el-button> |
|
|
|
|
|
<el-button link type="primary" @click="handleShowMember(scope.row.id)">查看成员</el-button> |
|
|
<el-button link type="primary" @click="handleShowMember(scope.row.id)">查看成员</el-button> |
|
|
</template> |
|
|
</template> |
|
|
</el-table-column> |
|
|
</el-table-column> |
|
|
</el-table> |
|
|
</el-table> |
|
|
|
|
|
|
|
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" |
|
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
|
|
v-model:limit="queryParams.pageSize" @pagination="getList" /> |
|
|
|
|
|
</el-card> |
|
|
</el-card> |
|
|
<!-- 添加或修改群对话框 --> |
|
|
<!-- 添加或修改群对话框 --> |
|
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body> |
|
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body> |
|
|
@ -82,8 +81,7 @@ |
|
|
<el-input v-model="form.ownerUserName" /> |
|
|
<el-input v-model="form.ownerUserName" /> |
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
<el-form-item label="创建时间" prop="createdTime"> |
|
|
<el-form-item label="创建时间" prop="createdTime"> |
|
|
<el-date-picker clearable v-model="form.createdTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"> |
|
|
<el-date-picker clearable v-model="form.createdTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"> </el-date-picker> |
|
|
</el-date-picker> |
|
|
|
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
<el-form-item label="是否已解散" prop="dissolve"> |
|
|
<el-form-item label="是否已解散" prop="dissolve"> |
|
|
<dict-tag :options="im_bool" :value="form.dissolve" /> |
|
|
<dict-tag :options="im_bool" :value="form.dissolve" /> |
|
|
@ -104,8 +102,7 @@ |
|
|
</div> |
|
|
</div> |
|
|
</template> |
|
|
</template> |
|
|
</el-dialog> |
|
|
</el-dialog> |
|
|
<el-drawer v-model="memberVisible" title="成员列表" :size="900" :close-on-press-escape="false" |
|
|
<el-drawer v-model="memberVisible" title="成员列表" :size="900" :close-on-press-escape="false" :close-on-click-modal="true"> |
|
|
:close-on-click-modal="true"> |
|
|
|
|
|
<member ref="memberRef"></member> |
|
|
<member ref="memberRef"></member> |
|
|
</el-drawer> |
|
|
</el-drawer> |
|
|
</div> |
|
|
</div> |
|
|
@ -149,7 +146,7 @@ const initFormData: GroupForm = { |
|
|
createdTime: undefined, |
|
|
createdTime: undefined, |
|
|
isBanned: undefined, |
|
|
isBanned: undefined, |
|
|
reason: undefined |
|
|
reason: undefined |
|
|
} |
|
|
}; |
|
|
const data = reactive<PageData<GroupForm, GroupQuery>>({ |
|
|
const data = reactive<PageData<GroupForm, GroupQuery>>({ |
|
|
form: { ...initFormData }, |
|
|
form: { ...initFormData }, |
|
|
queryParams: { |
|
|
queryParams: { |
|
|
@ -164,12 +161,9 @@ const data = reactive<PageData<GroupForm, GroupQuery>>({ |
|
|
createdTime: undefined, |
|
|
createdTime: undefined, |
|
|
isBanned: undefined, |
|
|
isBanned: undefined, |
|
|
reason: undefined, |
|
|
reason: undefined, |
|
|
params: { |
|
|
params: {} |
|
|
} |
|
|
|
|
|
}, |
|
|
}, |
|
|
rules: { |
|
|
rules: {} |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
const { queryParams, form } = toRefs(data); |
|
|
const { queryParams, form } = toRefs(data); |
|
|
@ -182,45 +176,43 @@ const getList = async () => { |
|
|
groupList.value = res.rows; |
|
|
groupList.value = res.rows; |
|
|
total.value = res.total; |
|
|
total.value = res.total; |
|
|
loading.value = false; |
|
|
loading.value = false; |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 表单重置 */ |
|
|
/** 表单重置 */ |
|
|
const reset = () => { |
|
|
const reset = () => { |
|
|
form.value = { ...initFormData }; |
|
|
form.value = { ...initFormData }; |
|
|
groupFormRef.value?.resetFields(); |
|
|
groupFormRef.value?.resetFields(); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
/** 搜索按钮操作 */ |
|
|
/** 搜索按钮操作 */ |
|
|
const handleQuery = () => { |
|
|
const handleQuery = () => { |
|
|
queryParams.value.pageNum = 1; |
|
|
queryParams.value.pageNum = 1; |
|
|
getList(); |
|
|
getList(); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
/** 重置按钮操作 */ |
|
|
/** 重置按钮操作 */ |
|
|
const resetQuery = () => { |
|
|
const resetQuery = () => { |
|
|
dateRange.value = ['', '']; |
|
|
dateRange.value = ['', '']; |
|
|
queryFormRef.value?.resetFields(); |
|
|
queryFormRef.value?.resetFields(); |
|
|
handleQuery(); |
|
|
handleQuery(); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
/** 多选框选中数据 */ |
|
|
/** 多选框选中数据 */ |
|
|
const handleSelectionChange = (selection: GroupVO[]) => { |
|
|
const handleSelectionChange = (selection: GroupVO[]) => { |
|
|
ids.value = selection.map(item => item.id); |
|
|
ids.value = selection.map((item) => item.id); |
|
|
single.value = selection.length != 1; |
|
|
single.value = selection.length != 1; |
|
|
multiple.value = !selection.length; |
|
|
multiple.value = !selection.length; |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
/** 详情按钮操作 */ |
|
|
/** 详情按钮操作 */ |
|
|
const handleDetail = async (row?: GroupVO) => { |
|
|
const handleDetail = async (row?: GroupVO) => { |
|
|
reset(); |
|
|
reset(); |
|
|
const _id = row?.id || ids.value[0] |
|
|
const _id = row?.id || ids.value[0]; |
|
|
const res = await getGroup(_id); |
|
|
const res = await getGroup(_id); |
|
|
Object.assign(form.value, res.data); |
|
|
Object.assign(form.value, res.data); |
|
|
dialog.visible = true; |
|
|
dialog.visible = true; |
|
|
dialog.title = "用户信息"; |
|
|
dialog.title = '用户信息'; |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
const handleBan = (group: any) => { |
|
|
const handleBan = (group: any) => { |
|
|
ElMessageBox.prompt('封禁原因:', '确定对该群组进行封禁?', { |
|
|
ElMessageBox.prompt('封禁原因:', '确定对该群组进行封禁?', { |
|
|
@ -229,43 +221,47 @@ const handleBan = (group: any) => { |
|
|
confirmButtonText: '确定', |
|
|
confirmButtonText: '确定', |
|
|
cancelButtonText: '取消' |
|
|
cancelButtonText: '取消' |
|
|
}).then(({ value }) => { |
|
|
}).then(({ value }) => { |
|
|
const data = { id: group.id, reason: value } |
|
|
const data = { id: group.id, reason: value }; |
|
|
ban(data).then(() => { |
|
|
ban(data).then(() => { |
|
|
group.isBanned = true; |
|
|
group.isBanned = true; |
|
|
ElMessage.success(`群组'${group.name}'已被封禁`); |
|
|
ElMessage.success(`群组'${group.name}'已被封禁`); |
|
|
}) |
|
|
}); |
|
|
}) |
|
|
}); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
const handleUnban = (group: any) => { |
|
|
const handleUnban = (group: any) => { |
|
|
ElMessageBox.confirm('确定解除该群组的封禁状态?', '提示', { |
|
|
ElMessageBox.confirm('确定解除该群组的封禁状态?', '提示', { |
|
|
confirmButtonText: '确定', |
|
|
confirmButtonText: '确定', |
|
|
cancelButtonText: '取消' |
|
|
cancelButtonText: '取消' |
|
|
}).then(() => { |
|
|
}).then(() => { |
|
|
const data = { id: group.id } |
|
|
const data = { id: group.id }; |
|
|
unban(data).then(() => { |
|
|
unban(data).then(() => { |
|
|
group.isBanned = false; |
|
|
group.isBanned = false; |
|
|
ElMessage.success(`群组'${group.name}'解封成功`); |
|
|
ElMessage.success(`群组'${group.name}'解封成功`); |
|
|
}) |
|
|
}); |
|
|
}) |
|
|
}); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
const handleShowMember = (id: number) => { |
|
|
const handleShowMember = (id: number) => { |
|
|
memberVisible.value = true; |
|
|
memberVisible.value = true; |
|
|
nextTick(() => memberRef.value.init(id)); |
|
|
nextTick(() => memberRef.value.init(id)); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
/** 提交按钮 */ |
|
|
/** 提交按钮 */ |
|
|
const submitForm = () => { |
|
|
const submitForm = () => { |
|
|
dialog.visible = false; |
|
|
dialog.visible = false; |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
/** 导出按钮操作 */ |
|
|
/** 导出按钮操作 */ |
|
|
const handleExport = () => { |
|
|
const handleExport = () => { |
|
|
proxy?.download('im/group/export', { |
|
|
proxy?.download( |
|
|
...queryParams.value |
|
|
'im/group/export', |
|
|
}, `group_${new Date().getTime()}.xlsx`) |
|
|
{ |
|
|
} |
|
|
...queryParams.value |
|
|
|
|
|
}, |
|
|
|
|
|
`group_${new Date().getTime()}.xlsx` |
|
|
|
|
|
); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
onMounted(() => { |
|
|
onMounted(() => { |
|
|
getList(); |
|
|
getList(); |
|
|
|