refactor: 优化代码规范和可读性
This commit is contained in:
@@ -111,7 +111,7 @@
|
||||
<el-table-column label="字段信息" min-width="360">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-start gap-3">
|
||||
<div class="field-info" style=" flex-shrink: 0;width: 140px">
|
||||
<div class="field-info" style="flex-shrink: 0; width: 140px">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="font-medium text-sm">{{ row.columnName }}</span>
|
||||
<el-tag v-if="row.isPrimaryKey" size="small" type="warning" effect="dark">
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
@filter-change="handleFilterChange"
|
||||
>
|
||||
<template #status="scope">
|
||||
<el-tag :type="scope.row[scope.prop] == 1 ? 'success' : 'info'">
|
||||
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
||||
<el-tag :type="scope.row[scope.prop] === 1 ? 'success' : 'info'">
|
||||
{{ scope.row[scope.prop] === 1 ? "启用" : "禁用" }}
|
||||
</el-tag>
|
||||
</template>
|
||||
<template #gender="scope">
|
||||
@@ -187,13 +187,11 @@ const contentConfig: IContentConfig<UserQueryParams, UserItem> = reactive({
|
||||
},
|
||||
exportAction: UserAPI.export,
|
||||
importTemplate: UserAPI.downloadTemplate,
|
||||
importsAction(data: any) {
|
||||
console.log("importsAction", data);
|
||||
importsAction() {
|
||||
return Promise.resolve();
|
||||
},
|
||||
async exportsAction(params: any) {
|
||||
const data = await UserAPI.getPage(params);
|
||||
console.log("exportsAction", data.list);
|
||||
return data.list;
|
||||
},
|
||||
pk: "id",
|
||||
@@ -299,9 +297,6 @@ const addModalConfig: IModalConfig<UserForm> = reactive({
|
||||
labelWidth: 100,
|
||||
},
|
||||
formAction: UserAPI.create,
|
||||
beforeSubmit(data: any) {
|
||||
console.log("提交之前处理", data);
|
||||
},
|
||||
formItems: [
|
||||
{
|
||||
label: "用户名",
|
||||
@@ -415,9 +410,6 @@ const editModalConfig: IModalConfig<UserForm> = reactive({
|
||||
size: useAppStore().device === DeviceEnum.MOBILE ? "80%" : 500,
|
||||
},
|
||||
pk: "id",
|
||||
beforeSubmit(data: any) {
|
||||
console.log("beforeSubmit", data);
|
||||
},
|
||||
formAction(data: any) {
|
||||
return UserAPI.update(data.id as string, data);
|
||||
},
|
||||
@@ -539,7 +531,6 @@ const {
|
||||
|
||||
// 其他工具
|
||||
function handleToolbarClick(name: string) {
|
||||
console.log(name);
|
||||
if (name === "custom1") {
|
||||
ElMessage.success("点击了自定义1按钮");
|
||||
}
|
||||
|
||||
@@ -14,9 +14,6 @@ const modalConfig: IModalConfig<UserForm> = {
|
||||
labelWidth: 100,
|
||||
},
|
||||
formAction: UserAPI.create,
|
||||
beforeSubmit(data) {
|
||||
console.log("提交之前处理", data);
|
||||
},
|
||||
formItems: [
|
||||
{
|
||||
label: "用户名",
|
||||
|
||||
@@ -24,15 +24,13 @@ const contentConfig: IContentConfig<UserQueryParams, UserItem> = {
|
||||
},
|
||||
exportAction: UserAPI.export,
|
||||
importTemplate: UserAPI.downloadTemplate,
|
||||
importsAction(data) {
|
||||
importsAction() {
|
||||
// 模拟导入数据
|
||||
console.log("importsAction", data);
|
||||
return Promise.resolve();
|
||||
},
|
||||
async exportsAction(params) {
|
||||
// 模拟获取到的是全量数据
|
||||
const data = await UserAPI.getPage(params);
|
||||
console.log("exportsAction", data.list);
|
||||
return data.list;
|
||||
},
|
||||
pk: "id",
|
||||
|
||||
@@ -13,9 +13,6 @@ const modalConfig: IModalConfig<UserForm> = {
|
||||
size: useAppStore().device === DeviceEnum.MOBILE ? "80%" : 500,
|
||||
},
|
||||
pk: "id",
|
||||
beforeSubmit(data) {
|
||||
console.log("beforeSubmit", data);
|
||||
},
|
||||
formAction(data) {
|
||||
return UserAPI.update(data.id as string, data);
|
||||
},
|
||||
|
||||
@@ -30,7 +30,6 @@ const contentConfig: IContentConfig<DemoQueryParams, DemoItem> = {
|
||||
toolbar: [],
|
||||
indexAction(params) {
|
||||
// 模拟发起网络请求获取列表数据
|
||||
console.log("indexAction:", params);
|
||||
const list = [
|
||||
{
|
||||
id: 1,
|
||||
@@ -74,7 +73,6 @@ const contentConfig: IContentConfig<DemoQueryParams, DemoItem> = {
|
||||
},
|
||||
modifyAction(data) {
|
||||
// 模拟发起网络请求修改字段
|
||||
// console.log("modifyAction:", data);
|
||||
ElMessage.success(JSON.stringify(data));
|
||||
return Promise.resolve(null);
|
||||
},
|
||||
|
||||
@@ -12,9 +12,6 @@ const modalConfig: IModalConfig = {
|
||||
size: useAppStore().device === DeviceEnum.MOBILE ? "80%" : 500,
|
||||
},
|
||||
form: { labelPosition: "right", labelWidth: "auto" },
|
||||
beforeSubmit(data) {
|
||||
console.log("beforeSubmit", data);
|
||||
},
|
||||
formAction(data) {
|
||||
// return UserAPI.update(data.id as string, data);
|
||||
// 模拟发起网络请求修改字段
|
||||
|
||||
@@ -15,8 +15,7 @@ const searchConfig: ISearchConfig = {
|
||||
prop: "testInput",
|
||||
attrs: { placeholder: "请输入", clearable: true },
|
||||
events: {
|
||||
change: (e) => {
|
||||
console.log("输入框的值: ", e);
|
||||
change: () => {
|
||||
// 级联操作示例,需要使用reactive提前定义数组
|
||||
// selectOptions.push({ label: e, value: e });
|
||||
},
|
||||
@@ -35,9 +34,7 @@ const searchConfig: ISearchConfig = {
|
||||
attrs: { placeholder: "全部", clearable: true },
|
||||
options: stateArr as any,
|
||||
events: {
|
||||
change(e) {
|
||||
console.log("选中的值: ", e);
|
||||
},
|
||||
change() {},
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
@filter-change="handleFilterChange"
|
||||
>
|
||||
<template #status="scope">
|
||||
<el-tag :type="scope.row[scope.prop] == 1 ? 'success' : 'info'">
|
||||
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
||||
<el-tag :type="scope.row[scope.prop] === 1 ? 'success' : 'info'">
|
||||
{{ scope.row[scope.prop] === 1 ? "启用" : "禁用" }}
|
||||
</el-tag>
|
||||
</template>
|
||||
<template #gender="scope">
|
||||
@@ -91,8 +91,8 @@
|
||||
@operate-click="handleOperateClick2"
|
||||
>
|
||||
<template #status="scope">
|
||||
<el-tag :type="scope.row[scope.prop] == 1 ? 'success' : 'info'">
|
||||
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
||||
<el-tag :type="scope.row[scope.prop] === 1 ? 'success' : 'info'">
|
||||
{{ scope.row[scope.prop] === 1 ? "启用" : "禁用" }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</page-content>
|
||||
@@ -145,7 +145,6 @@ const {
|
||||
|
||||
// 其他工具
|
||||
function handleToolbarClick(name: string) {
|
||||
console.log(name);
|
||||
if (name === "custom1") {
|
||||
ElMessage.success("点击了自定义1按钮");
|
||||
}
|
||||
@@ -203,8 +202,7 @@ const addModalRef2 = ref();
|
||||
const openSecondModal = () => {
|
||||
handleAddClick(addModalRef2 as Ref<PageModalInstance>);
|
||||
};
|
||||
const secondSubmit = (formData: any) => {
|
||||
console.log("secondSubmit", formData);
|
||||
const secondSubmit = () => {
|
||||
ElMessage.success("二级弹窗提交成功");
|
||||
};
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@ defineOptions({
|
||||
});
|
||||
|
||||
const route = useRoute();
|
||||
console.log(route);
|
||||
|
||||
const value = ref("");
|
||||
</script>
|
||||
|
||||
@@ -17,7 +17,4 @@ import MultiLevel2 from "../level2.vue";
|
||||
defineOptions({ name: "MultiLevel31" });
|
||||
|
||||
const value = ref("");
|
||||
onMounted(() => {
|
||||
console.log("Multilevel31 onMounted");
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -17,7 +17,4 @@ import MultiLevel2 from "../level2.vue";
|
||||
|
||||
defineOptions({ name: "MultiLevel32" });
|
||||
const value = ref("");
|
||||
onMounted(() => {
|
||||
console.log("Multilevel32 onMounted");
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -6,8 +6,4 @@
|
||||
defineOptions({ name: "MultiLevel2" });
|
||||
|
||||
const value = ref("");
|
||||
|
||||
onMounted(() => {
|
||||
console.log("MultiLevel2 mounted");
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -3,8 +3,4 @@
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
defineOptions({ name: "MultiLevel1" });
|
||||
|
||||
onMounted(() => {
|
||||
console.log("MultiLevel1 mounted");
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -104,7 +104,7 @@ const isCanvasBlank = (canvas: HTMLCanvasElement) => {
|
||||
const blank = document.createElement("canvas"); //系统获取一个空canvas对象
|
||||
blank.width = canvas.width;
|
||||
blank.height = canvas.height;
|
||||
return canvas.toDataURL() == blank.toDataURL(); //比较值相等则为空
|
||||
return canvas.toDataURL() === blank.toDataURL(); //比较值相等则为空
|
||||
};
|
||||
|
||||
// 保存为图片
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
</el-link>
|
||||
<table-select :text="text" :select-config="selectConfig" @confirm-click="handleConfirm">
|
||||
<template #status="scope">
|
||||
<el-tag :type="scope.row[scope.prop] == 1 ? 'success' : 'info'">
|
||||
{{ scope.row[scope.prop] == 1 ? "启用" : "禁用" }}
|
||||
<el-tag :type="scope.row[scope.prop] === 1 ? 'success' : 'info'">
|
||||
{{ scope.row[scope.prop] === 1 ? "启用" : "禁用" }}
|
||||
</el-tag>
|
||||
</template>
|
||||
<template #gender="scope">
|
||||
@@ -46,7 +46,9 @@ function handleConfirm(data: IUser[]) {
|
||||
const text = computed(() => {
|
||||
// 获取字典数据
|
||||
const dictData = dictStore.getDictItems("gender");
|
||||
const genderLabel = dictData.find((item: any) => item.value == selectedUser.value?.gender)?.label;
|
||||
const genderLabel = dictData.find(
|
||||
(item) => String(item.value) === String(selectedUser.value?.gender)
|
||||
)?.label;
|
||||
return selectedUser.value
|
||||
? `${selectedUser.value.username} - ${genderLabel} - ${selectedUser.value.deptName}`
|
||||
: "";
|
||||
|
||||
@@ -348,8 +348,7 @@ const gridOptions = reactive<VxeGridProps<RowMeta>>({
|
||||
},
|
||||
ajax: {
|
||||
// 接收 Promise
|
||||
query: ({ page: { currentPage, pageSize }, form, filters, sort, sorts }) => {
|
||||
console.log({ currentPage, pageSize, form, filters, sort, sorts });
|
||||
query: ({ page: { currentPage, pageSize } }) => {
|
||||
return new Promise<{ total: number; result: RowMeta[] }>((resolve) => {
|
||||
setTimeout(() => {
|
||||
const list = [
|
||||
@@ -465,9 +464,7 @@ const gridOptions = reactive<VxeGridProps<RowMeta>>({
|
||||
});
|
||||
const gridEvents: VxeGridListeners<RowMeta> = {
|
||||
// 只对 form-config 配置时有效,表单重置时会触发该事件
|
||||
formReset() {
|
||||
console.log("Form Reset");
|
||||
},
|
||||
formReset() {},
|
||||
};
|
||||
// #endregion
|
||||
|
||||
@@ -593,7 +590,10 @@ const curd = {
|
||||
},
|
||||
/** 确定并保存 */
|
||||
onSubmitForm: () => {
|
||||
console.log("提交表单");
|
||||
VXETable.modal.message({
|
||||
content: "提交成功",
|
||||
status: "success",
|
||||
});
|
||||
},
|
||||
onDelete: (row?: RowMeta) => {
|
||||
let ids = [];
|
||||
@@ -614,7 +614,10 @@ const curd = {
|
||||
VXETable.modal.confirm("确定要删除吗?").then((type) => {
|
||||
if (type === "confirm") {
|
||||
// 执行删除操作
|
||||
console.log("删除的ID", ids);
|
||||
VXETable.modal.message({
|
||||
content: `已删除 ${ids.length} 条数据`,
|
||||
status: "success",
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
@@ -186,7 +186,7 @@
|
||||
|
||||
<footer class="login-card__footer">
|
||||
<el-text size="small">
|
||||
Copyright © 2021 - 2025 youlai.tech
|
||||
Copyright © 2021 - 2026 youlai.tech
|
||||
<a href="http://beian.miit.gov.cn/" target="_blank">皖ICP备00064962号</a>
|
||||
</el-text>
|
||||
</footer>
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
<el-table-column align="center" label="发布人" prop="publisherName" width="150" />
|
||||
<el-table-column align="center" label="状态" width="100">
|
||||
<template #default="scope">
|
||||
<el-tag v-if="scope.row.isRead == 1" type="success">已读</el-tag>
|
||||
<el-tag v-if="scope.row.isRead === 1" type="success">已读</el-tag>
|
||||
<el-tag v-else type="info">未读</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
<el-table-column prop="code" label="部门编号" width="200" />
|
||||
<el-table-column prop="status" label="状态" width="100">
|
||||
<template #default="scope">
|
||||
<el-tag v-if="scope.row.status == 1" type="success">正常</el-tag>
|
||||
<el-tag v-if="scope.row.status === 1" type="success">正常</el-tag>
|
||||
<el-tag v-else type="info">禁用</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
<el-table-column fixed="right" align="center" label="操作" width="220">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="scope.row.type == MenuTypeEnum.CATALOG || scope.row.type == MenuTypeEnum.MENU"
|
||||
v-if="scope.row.type === MenuTypeEnum.CATALOG || scope.row.type === MenuTypeEnum.MENU"
|
||||
v-hasPerm="['sys:menu:create']"
|
||||
type="primary"
|
||||
link
|
||||
@@ -155,7 +155,10 @@
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item v-if="formData.type == MenuTypeEnum.MENU && !isExternalLink" prop="routeName">
|
||||
<el-form-item
|
||||
v-if="formData.type === MenuTypeEnum.MENU && !isExternalLink"
|
||||
prop="routeName"
|
||||
>
|
||||
<template #label>
|
||||
<div class="flex-y-center">
|
||||
路由名称
|
||||
@@ -173,7 +176,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item
|
||||
v-if="formData.type == MenuTypeEnum.CATALOG || formData.type == MenuTypeEnum.MENU"
|
||||
v-if="formData.type === MenuTypeEnum.CATALOG || formData.type === MenuTypeEnum.MENU"
|
||||
prop="routePath"
|
||||
>
|
||||
<template #label>
|
||||
@@ -191,14 +194,17 @@
|
||||
</div>
|
||||
</template>
|
||||
<el-input
|
||||
v-if="formData.type == MenuTypeEnum.CATALOG"
|
||||
v-if="formData.type === MenuTypeEnum.CATALOG"
|
||||
v-model="formData.routePath"
|
||||
placeholder="system"
|
||||
/>
|
||||
<el-input v-else v-model="formData.routePath" placeholder="user 或 https://example.com" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item v-if="formData.type == MenuTypeEnum.MENU && !isExternalLink" prop="component">
|
||||
<el-form-item
|
||||
v-if="formData.type === MenuTypeEnum.MENU && !isExternalLink"
|
||||
prop="component"
|
||||
>
|
||||
<template #label>
|
||||
<div class="flex-y-center">
|
||||
组件路径
|
||||
@@ -214,12 +220,12 @@
|
||||
</template>
|
||||
|
||||
<el-input v-model="formData.component" placeholder="system/user/index" style="width: 95%">
|
||||
<template v-if="formData.type == MenuTypeEnum.MENU" #prepend>src/views/</template>
|
||||
<template v-if="formData.type == MenuTypeEnum.MENU" #append>.vue</template>
|
||||
<template v-if="formData.type === MenuTypeEnum.MENU" #prepend>src/views/</template>
|
||||
<template v-if="formData.type === MenuTypeEnum.MENU" #append>.vue</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item v-if="formData.type == MenuTypeEnum.MENU && !isExternalLink">
|
||||
<el-form-item v-if="formData.type === MenuTypeEnum.MENU && !isExternalLink">
|
||||
<template #label>
|
||||
<div class="flex-y-center">
|
||||
路由参数
|
||||
@@ -332,7 +338,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<!-- 权限标识 -->
|
||||
<el-form-item v-if="formData.type == MenuTypeEnum.BUTTON" label="权限标识" prop="perm">
|
||||
<el-form-item v-if="formData.type === MenuTypeEnum.BUTTON" label="权限标识" prop="perm">
|
||||
<el-input v-model="formData.perm" placeholder="sys:user:create" />
|
||||
</el-form-item>
|
||||
|
||||
@@ -341,7 +347,7 @@
|
||||
<icon-select v-model="formData.icon" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item v-if="formData.type == MenuTypeEnum.CATALOG" label="跳转路由">
|
||||
<el-form-item v-if="formData.type === MenuTypeEnum.CATALOG" label="跳转路由">
|
||||
<el-input v-model="formData.redirect" placeholder="跳转路由" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
@@ -529,7 +535,7 @@ function handleSubmit(): void {
|
||||
if (isValid) {
|
||||
const menuId = formData.value.id;
|
||||
if (menuId) {
|
||||
if (formData.value.parentId == menuId) {
|
||||
if (formData.value.parentId === menuId) {
|
||||
ElMessage.error("父级菜单不能为当前菜单");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -77,15 +77,15 @@
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="通告目标类型" prop="targetType" min-width="100">
|
||||
<template #default="scope">
|
||||
<el-tag v-if="scope.row.targetType == 1" type="warning">全体</el-tag>
|
||||
<el-tag v-if="scope.row.targetType == 2" type="success">指定</el-tag>
|
||||
<el-tag v-if="scope.row.targetType === 1" type="warning">全体</el-tag>
|
||||
<el-tag v-if="scope.row.targetType === 2" type="success">指定</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="发布状态" min-width="100">
|
||||
<template #default="scope">
|
||||
<el-tag v-if="scope.row.publishStatus == 0" type="info">未发布</el-tag>
|
||||
<el-tag v-if="scope.row.publishStatus == 1" type="success">已发布</el-tag>
|
||||
<el-tag v-if="scope.row.publishStatus == -1" type="warning">已撤回</el-tag>
|
||||
<el-tag v-if="scope.row.publishStatus === 0" type="info">未发布</el-tag>
|
||||
<el-tag v-if="scope.row.publishStatus === 1" type="success">已发布</el-tag>
|
||||
<el-tag v-if="scope.row.publishStatus === -1" type="warning">已撤回</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作时间" width="250">
|
||||
@@ -111,7 +111,7 @@
|
||||
查看
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="scope.row.publishStatus != 1"
|
||||
v-if="scope.row.publishStatus !== 1"
|
||||
v-hasPerm="['sys:notice:publish']"
|
||||
type="primary"
|
||||
size="small"
|
||||
@@ -121,7 +121,7 @@
|
||||
发布
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="scope.row.publishStatus == 1"
|
||||
v-if="scope.row.publishStatus === 1"
|
||||
v-hasPerm="['sys:notice:revoke']"
|
||||
type="primary"
|
||||
size="small"
|
||||
@@ -131,7 +131,7 @@
|
||||
撤回
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="scope.row.publishStatus != 1"
|
||||
v-if="scope.row.publishStatus !== 1"
|
||||
v-hasPerm="['sys:notice:update']"
|
||||
type="primary"
|
||||
size="small"
|
||||
@@ -141,7 +141,7 @@
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="scope.row.publishStatus != 1"
|
||||
v-if="scope.row.publishStatus !== 1"
|
||||
v-hasPerm="['sys:notice:delete']"
|
||||
type="danger"
|
||||
size="small"
|
||||
@@ -207,7 +207,7 @@
|
||||
<el-radio :value="2">指定</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="formData.targetType == 2" label="指定用户" prop="targetUsers">
|
||||
<el-form-item v-if="formData.targetType === 2" label="指定用户" prop="targetUsers">
|
||||
<el-select v-model="formData.targetUsers" multiple search placeholder="请选择指定用户">
|
||||
<el-option
|
||||
v-for="item in userOptions"
|
||||
@@ -252,9 +252,9 @@
|
||||
{{ currentNotice.title }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="发布状态:">
|
||||
<el-tag v-if="currentNotice.publishStatus == 0" type="info">未发布</el-tag>
|
||||
<el-tag v-else-if="currentNotice.publishStatus == 1" type="success">已发布</el-tag>
|
||||
<el-tag v-else-if="currentNotice.publishStatus == -1" type="warning">已撤回</el-tag>
|
||||
<el-tag v-if="currentNotice.publishStatus === 0" type="info">未发布</el-tag>
|
||||
<el-tag v-else-if="currentNotice.publishStatus === 1" type="success">已发布</el-tag>
|
||||
<el-tag v-else-if="currentNotice.publishStatus === -1" type="warning">已撤回</el-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="发布人:">
|
||||
{{ currentNotice.publisherName }}
|
||||
|
||||
Reference in New Issue
Block a user