封禁账号管理 - 增加封禁备注/是否封禁近30天关联设备

This commit is contained in:
2025-07-18 17:40:38 +08:00
parent e23c8aa156
commit 81d317c492

View File

@@ -3,10 +3,11 @@
<!-- 类型 -->
<div class="inquire">
<span class="demonstration">类型</span>
<el-select v-model="pageParams.type"
class="input"
placeholder="全部"
clearable
<el-select
v-model="pageParams.type"
class="input"
placeholder="全部"
clearable
>
<el-option
v-for="type in Object.keys(typeMap)"
@@ -19,52 +20,81 @@
<!-- 名称 -->
<div class="inquire">
<span class="demonstration">搜索内容</span>
<el-input v-model="pageParams.blockValue" placeholder="平台号、手机号、设备号、IP地址、邮箱" class="input" style="width: 360px"></el-input>
<el-input
v-model="pageParams.blockValue"
placeholder="平台号、手机号、设备号、IP地址、邮箱"
class="input"
style="width: 360px"
></el-input>
</div>
<!-- 封禁原因 -->
<div class="inquire">
<span class="demonstration">封禁原因</span>
<el-input
v-model="pageParams.blockDesc"
placeholder="请输入"
class="input"
style="width: 360px"
></el-input>
</div>
<!-- 查询按钮 -->
<el-button class="primary" type="primary" @click="pageDate"
>查询</el-button>
<el-button class="primary" type="primary" @click="pageDate">查询</el-button>
<el-button
type="primary"
@click="
pageParams.type = undefined;
pageParams.blockValue = undefined;
pageParams.blockDesc = undefined;
pageDate();
"
>重置搜索</el-button>
<el-button type="danger" @click="openEditDialog(undefined)"
>增加</el-button>
>重置搜索</el-button
>
<el-button type="danger" @click="openEditDialog(undefined)">增加</el-button>
<!-- 编辑弹窗 -->
<el-dialog v-model="editDialog.show"
v-loading="editDialog.loading"
v-model:title="editDialog.title"
@close="closeEditDialog"
label-width="auto"
width="28%" center>
<el-dialog
v-model="editDialog.show"
v-loading="editDialog.loading"
v-model:title="editDialog.title"
@close="closeEditDialog"
label-width="auto"
width="28%"
center
>
<el-form :model="editDialog.obj">
<el-form-item label="封禁类型">
<el-select v-model="editDialog.obj.blockType"
placeholder="请选择类型">
<el-select
v-model="editDialog.obj.blockType"
placeholder="请选择类型"
>
<el-option
v-for="type in Object.keys(typeMap)"
:key="type"
:label="typeMap[type]"
:value="type"
v-for="type in Object.keys(typeMap)"
:key="type"
:label="typeMap[type]"
:value="type"
/>
</el-select>
</el-form-item>
<el-form-item label="封禁目标">
<el-input v-model="editDialog.obj.blockValue" type="textarea" placeholder="多个号码请使用英文字符,隔开" />
<el-input
v-model="editDialog.obj.blockValue"
type="textarea"
placeholder="多个号码请使用英文字符,隔开"
/>
</el-form-item>
<el-form-item label="是否封禁近30天关联设备">
<el-select v-model="editDialog.obj.blockDevice" placeholder="请选择">
<el-option label="否" :value="0" />
<el-option label="是" :value="1" />
</el-select>
</el-form-item>
<el-form-item label="封禁状态">
<el-select v-model="editDialog.obj.blockStatus"
placeholder="请选择">
<el-select v-model="editDialog.obj.blockStatus" placeholder="请选择">
<el-option
v-for="type in Object.keys(blockStatusMap)"
:key="type"
:label="blockStatusMap[type]"
:value="type"
v-for="type in Object.keys(blockStatusMap)"
:key="type"
:label="blockStatusMap[type]"
:value="type"
/>
</el-select>
</el-form-item>
@@ -72,35 +102,89 @@
<el-input v-model="editDialog.obj.blockDesc" />
</el-form-item>
<el-form-item label="开始时间">
<el-date-picker v-model="editDialog.obj.blockStartTime" type="datetime" value-format="YYYY-MM-DD HH:mm"/>
<el-date-picker
v-model="editDialog.obj.blockStartTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm"
/>
</el-form-item>
<el-form-item label="结束时间">
<el-date-picker v-model="editDialog.obj.blockEndTime" type="datetime" value-format="YYYY-MM-DD HH:mm"/>
<el-date-picker
v-model="editDialog.obj.blockEndTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm"
/>
</el-form-item>
<el-form-item label="操作备注">
<el-input v-model="editDialog.obj.remark" />
</el-form-item>
</el-form>
<!-- 封禁备注 -->
<div style="margin-bottom: 25px; margin-top: 10px; display: flex">
<span
style="
display: inline-block;
margin-right: 20px;
font-weight: 700;
padding: 0;
"
class="control-label"
>封禁备注</span
>
<el-upload
class="avatar-uploader"
action="/admin/tencent/cos/uploadFile"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
:on-error="handleAvatarError"
>
<template v-if="editDialog.obj.blockImgType == 1">
<img :src="editDialog.obj.blockImgUrl" class="avatar" />
</template>
<template v-else>
<video v-if="editDialog.obj.blockImgUrl"
:key="editDialog.obj.blockImgUrl"
autoplay
width="320"
height="240"
controls="controls">
<source :src="editDialog.obj.blockImgUrl"
type="video/mp4" />
</video>
</template>
</el-upload>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeEditDialog">取消</el-button>
<el-button v-loading="editDialog.loading" type="primary" @click="saveObj">保存</el-button>
<el-button
v-loading="editDialog.loading"
type="primary"
@click="saveObj"
>保存</el-button
>
</div>
</template>
</el-dialog>
<el-dialog
v-loading="unblockDialog.loading"
v-model="unblockDialog.show"
title="确定"
@close="closeUnblockDialog"
width="30%"
v-loading="unblockDialog.loading"
v-model="unblockDialog.show"
title="确定"
@close="closeUnblockDialog"
width="30%"
>
<span>确定要解封 {{ unblockDialog.blockValue }} </span>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeUnblockDialog">取消</el-button>
<el-button v-loading="unblockDialog.loading" type="primary" @click="confirmUnblock">确定</el-button>
<el-button
v-loading="unblockDialog.loading"
type="primary"
@click="confirmUnblock"
>确定</el-button
>
</div>
</template>
</el-dialog>
@@ -113,30 +197,73 @@
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="blockValue" align="center" label="封禁目标" width="320px" />
<el-table-column prop="blockType" align="center" label="封禁类型" >
<el-table-column
prop="blockValue"
align="center"
label="封禁目标"
width="320px"
/>
<el-table-column prop="blockType" align="center" label="封禁类型">
<template v-slot="scope">
{{getBlockTypeDesc(scope.row.blockType) }}
{{ getBlockTypeDesc(scope.row.blockType) }}
</template>
</el-table-column>
<el-table-column prop="blockStartTime" align="center" label="封禁开始时间" />
<el-table-column prop="blockEndTime" align="center" label="封禁结束时间" />
<el-table-column prop="blockStatus" align="center" label="封禁状态" >
<el-table-column
prop="blockStartTime"
align="center"
label="封禁开始时间"
/>
<el-table-column
prop="blockEndTime"
align="center"
label="封禁结束时间"
/>
<el-table-column prop="blockStatus" align="center" label="封禁状态">
<template v-slot="scope">
<el-tag v-if="scope.row.blockStatus === 1" type="danger">
{{getBlockStatusDesc(scope.row.blockStatus) }}
{{ getBlockStatusDesc(scope.row.blockStatus) }}
</el-tag>
<el-tag v-else type="success">
{{getBlockStatusDesc(scope.row.blockStatus) }}
{{ getBlockStatusDesc(scope.row.blockStatus) }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="blockDesc" align="center" label="封禁原因" />
<el-table-column prop="blockDesc" align="center" label="封禁备注" >
<template v-slot="scope">
<template v-if="scope.row.blockImgType == 1">
<el-image style="width: 100px; height: 100px"
:src="scope.row.blockImgUrl"
:zoom-rate="1.1"
:preview-src-list="[scope.row.blockImgUrl ?? '']"
fit="scale-down"
preview-teleported="true"
hide-on-click-modal="true" />
</template>
<template v-else>
<video
:key="scope.row.blockImgUrl"
width="320"
height="240"
controls="controls"
>
<source :src="scope.row.blockImgUrl" type="video/mp4" /></video
>
</template>
</template>
</el-table-column>
<el-table-column prop="adminName" align="center" label="管理员" />
<el-table-column align="center" label="操作">
<template v-slot="scope">
<el-button v-if="scope.row.blockStatus === 1" type="primary" @click="openUnblockDialog(scope.row.blockValue)">解封</el-button>
<el-button @click="openEditDialog(scope.row.blockValue)">编辑</el-button>
<el-button
v-if="scope.row.blockStatus === 1"
type="primary"
@click="openUnblockDialog(scope.row.blockValue)"
>解封</el-button
>
<el-button @click="openEditDialog(scope.row.blockValue)"
>编辑</el-button
>
</template>
</el-table-column>
</el-table>
@@ -153,42 +280,39 @@
@size-change="pageDate"
@current-change="pageDate"
/>
</div>
</template>
<script>
// 声明额外的选项
export default {
name: "BlockedAdmin",
}
// 声明额外的选项
export default {
name: "BlockedAdmin",
};
</script>
<script setup>
import {onMounted, reactive} from "vue";
import {
page, get, save, update, del,
} from "@/api/block/block";
import { onMounted, reactive } from "vue";
import { page, get, save, update, del } from "@/api/block/block";
import { ElMessage } from "element-plus";
const typeMap = {
"1": "平台号",
"2": "手机号",
"3": "设备号",
"4": "IP地址",
"6": "邮箱",
}
1: "平台号",
2: "手机号",
3: "设备号",
4: "IP地址",
6: "邮箱",
};
const getBlockTypeDesc = (type) => {
return typeMap[type] || "未知";
}
};
const blockStatusMap = {
1: "封禁中",
2: "封禁结束",
}
};
const getBlockStatusDesc = (type) => {
return blockStatusMap[type] || "未知";
}
};
const emptyObj = {
blockValue: undefined,
@@ -198,78 +322,83 @@ const emptyObj = {
blockStatus: "1",
blockDesc: undefined,
remark: undefined,
}
blockDevice: 0,
blockImgType: "",
blockImgUrl: "",
};
const editDialog = reactive({
show: false,
loading: false,
title: "",
obj: Object.assign({}, emptyObj),
})
});
const openEditDialog = (blockValue) => {
editDialog.show = true;
editDialog.title = "新增";
editDialog.obj.blockStartTime = new Date().format("yyyy-MM-dd hh:mm");
if (blockValue){
if (blockValue) {
editDialog.title = "编辑";
editDialog.loading = true;
const params = { blockValue }
get(params).then((res) => {
if (res.code !== 200){
throw Error(res.message);
}
if (!res.data){
throw Error("获取不到记录");
}
const params = { blockValue };
get(params)
.then((res) => {
if (res.code !== 200) {
throw Error(res.message);
}
if (!res.data) {
throw Error("获取不到记录");
}
const data = res.data;
data.blockType = data.blockType.toString();
data.blockStatus = data.blockStatus.toString();
const data = res.data;
data.blockType = data.blockType.toString();
data.blockStatus = data.blockStatus.toString();
editDialog.obj = data;
}).catch((err) => {
ElMessage({
showClose: true,
message: err,
type: "error",
editDialog.obj = data;
})
.catch((err) => {
ElMessage({
showClose: true,
message: err,
type: "error",
});
})
.finally(() => {
editDialog.loading = false;
});
}).finally(()=>{
editDialog.loading = false;
})
}
}
};
const closeEditDialog = () => {
editDialog.show = false;
editDialog.obj = Object.assign({}, emptyObj);
}
};
function validObj(obj) {
let valid = false;
try{
if (!obj.blockType || !typeMap[obj.blockType]){
try {
if (!obj.blockType || !typeMap[obj.blockType]) {
throw Error("请选择封禁类型");
}
if (!obj.blockValue || obj.blockValue === ''){
if (!obj.blockValue || obj.blockValue === "") {
throw Error("请输入封禁目标");
}
obj.blockValue = obj.blockValue.trim();
if (!obj.blockType || !typeMap[obj.blockType]){
if (!obj.blockType || !typeMap[obj.blockType]) {
throw Error("请选择封禁状态");
}
if (!obj.blockDesc || obj.blockDesc === ''){
if (!obj.blockDesc || obj.blockDesc === "") {
throw Error("请输入原因");
}
if (!obj.blockStartTime || obj.blockStartTime === ''){
if (!obj.blockStartTime || obj.blockStartTime === "") {
throw Error("请输入开始时间");
}
if (!obj.blockEndTime || obj.blockEndTime === ''){
if (!obj.blockEndTime || obj.blockEndTime === "") {
throw Error("请输入结束时间");
}
if (!obj.blockDesc || obj.blockDesc === ''){
if (!obj.blockDesc || obj.blockDesc === "") {
throw Error("请输入封禁原因");
}
valid = true;
@@ -286,52 +415,55 @@ function validObj(obj) {
const saveObj = () => {
// valid
if (!validObj(editDialog.obj)){
return
if (!validObj(editDialog.obj)) {
return;
}
editDialog.loading = true;
const func = editDialog.title === '新增' ? save: update;
func(editDialog.obj).then((res) => {
if (res.code !== 200 || !res.data){
throw Error(res.message);
}
ElMessage({
showClose: true,
message: "保存成功",
type: "success",
const func = editDialog.title === "新增" ? save : update;
func(editDialog.obj)
.then((res) => {
if (res.code !== 200 || !res.data) {
throw Error(res.message);
}
ElMessage({
showClose: true,
message: "保存成功",
type: "success",
});
closeEditDialog();
pageDate();
})
.catch((err) => {
ElMessage({
showClose: true,
message: err,
type: "error",
});
})
.finally(() => {
editDialog.loading = false;
});
closeEditDialog();
pageDate();
}).catch((err) => {
ElMessage({
showClose: true,
message: err,
type: "error",
});
}).finally(() => {
editDialog.loading = false;
})
}
};
const unblockDialog = reactive({
show: false,
loading: false,
blockValue: undefined,
})
});
const openUnblockDialog = (blockValue) => {
unblockDialog.show = true;
unblockDialog.blockValue = blockValue;
}
};
const closeUnblockDialog = () => {
unblockDialog.show = false;
unblockDialog.blockValue = undefined;
}
};
const confirmUnblock = () => {
if (!unblockDialog.blockValue){
if (!unblockDialog.blockValue) {
ElMessage({
showClose: true,
message: "请选择要解封的记录",
@@ -341,33 +473,37 @@ const confirmUnblock = () => {
}
unblockDialog.loading = true;
const params = { blockValue: unblockDialog.blockValue }
del(params).then((res) => {
if (res.code !== 200 || !res.data){
throw Error(res.message);
}
ElMessage({
showClose: true,
message: "解封成功",
type: "success",
const params = { blockValue: unblockDialog.blockValue };
del(params)
.then((res) => {
if (res.code !== 200 || !res.data) {
throw Error(res.message);
}
ElMessage({
showClose: true,
message: "解封成功",
type: "success",
});
closeUnblockDialog();
pageDate();
})
.catch((err) => {
ElMessage({
showClose: true,
message: err,
type: "error",
});
})
.finally(() => {
unblockDialog.loading = false;
});
closeUnblockDialog();
pageDate();
}).catch((err) => {
ElMessage({
showClose: true,
message: err,
type: "error",
});
}).finally(() => {
unblockDialog.loading = false;
})
}
};
const pageParams = reactive({
type: undefined,
blockValue: undefined,
})
blockDesc: undefined,
});
const table = reactive({
loading: false,
@@ -375,32 +511,79 @@ const table = reactive({
total: 0,
pageNum: 1,
pageSize: 20,
})
});
const pageDate = () =>{
const pageDate = () => {
table.loading = true;
const params = Object.assign({}, pageParams, {pageNum: table.pageNum, pageSize: table.pageSize})
page(params).then((res) => {
if (res.code !== 200){
throw Error(res.message);
const params = Object.assign({}, pageParams, {
pageNum: table.pageNum,
pageSize: table.pageSize,
});
page(params)
.then((res) => {
if (res.code !== 200) {
throw Error(res.message);
}
table.data = res.data.records;
table.total = res.data.total;
})
.catch((err) => {
ElMessage({
showClose: true,
message: err,
type: "error",
});
})
.finally(() => {
table.loading = false;
});
};
const beforeAvatarUpload = () => {
ElMessage({
showClose: true,
message: "上传中~",
type: "warning",
});
};
const handleAvatarError = () => {
ElMessage({
showClose: true,
message: "上传失败!",
type: "error",
});
};
const handleAvatarSuccess = (res, file) => {
console.log(res, file);
if (res.code == 200) {
if (
res.data.fileType == "MP4" ||
res.data.fileType == "MP3" ||
res.data.fileType == "AVI"
) {
editDialog.obj.blockImgType = 2;
} else {
editDialog.obj.blockImgType = 1;
}
table.data = res.data.records;
table.total = res.data.total;
}).catch((err) => {
editDialog.obj.blockImgUrl = res.data.url;
ElMessage({
showClose: true,
message: err,
type: "error",
message: "上传成功!",
type: "success",
});
}).finally(()=>{
table.loading = false;
});
}
} else {
ElMessage.error(res.message);
}
// this.controlsObj.imageUrl1 = file.response.data;
// ElMessage({
// showClose: true,
// message: "上传成功!",
// type: "success",
// });
};
onMounted(()=>{
onMounted(() => {
pageDate();
})
});
</script>
<style lang="less" scoped>
.box {
@@ -463,4 +646,9 @@ onMounted(()=>{
height: 150px;
}
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>