feat: 更新租户和子账号管理模块,优化状态和权限字段,增强导出功能
This commit is contained in:
parent
47ced8b554
commit
7a69918d6f
|
|
@ -7,7 +7,7 @@ import request from '/@/utils/request';
|
||||||
type TenantListDTO = {
|
type TenantListDTO = {
|
||||||
accountType: number; // 账号类型
|
accountType: number; // 账号类型
|
||||||
companyType: number; // 企业类型
|
companyType: number; // 企业类型
|
||||||
status: number; // 状态
|
status: number; // 状态 0: 启用 1: 禁用
|
||||||
accountName: string; // 账号名称
|
accountName: string; // 账号名称
|
||||||
page: number; // 页码
|
page: number; // 页码
|
||||||
size: number; // 页数
|
size: number; // 页数
|
||||||
|
|
@ -72,15 +72,16 @@ export const exportTenant = (params: Partial<TenantListDTO>) => {
|
||||||
url: '/tenant/export',
|
url: '/tenant/export',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params,
|
params,
|
||||||
|
responseType: 'blob',
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 获取子账号列表参数
|
// 获取子账号列表参数
|
||||||
type TenantUserListDTO = {
|
type TenantUserListDTO = {
|
||||||
phone: string; // 手机号
|
mobile: string; // 手机号
|
||||||
companyName: string; // 企业名称
|
companyName: string; // 企业名称
|
||||||
accountType: number; // 账号类型
|
accountType: number; // 账号类型
|
||||||
active: number; // 状态
|
status: number; // 状态 0: 启用 1: 禁用
|
||||||
page: number; // 页码
|
page: number; // 页码
|
||||||
size: number; // 页数
|
size: number; // 页数
|
||||||
orderBy: string; // 排序字段
|
orderBy: string; // 排序字段
|
||||||
|
|
@ -135,12 +136,13 @@ export const exportTenantUser = (params: Partial<TenantUserListDTO>) => {
|
||||||
url: '/tenant/user/export',
|
url: '/tenant/user/export',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params,
|
params,
|
||||||
|
responseType: 'blob',
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 租户子账号禁用
|
// 租户子账号禁用
|
||||||
export const disableTenantUser = (data: { id: number }) => {
|
export const disableTenantUser = (data: { id: number }) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/tenant/disable',
|
url: '/tenant/user/disable',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,9 @@
|
||||||
<el-select v-model="formData.accountType" placeholder="请选择账号类型" clearable>
|
<el-select v-model="formData.accountType" placeholder="请选择账号类型" clearable>
|
||||||
<el-option v-for="item of ACCOUNTTYPE_CONST" :key="item.value" :label="item.label" :value="item.value" />
|
<el-option v-for="item of ACCOUNTTYPE_CONST" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-row v-if="formData.accountType == 1" style="margin-top: 10px; padding: 10px; border: 1px solid #e7e7e7; border-radius: 5px">
|
<el-row v-if="formData.accountType === 1" style="margin-top: 10px; padding: 10px; border: 1px solid #e7e7e7; border-radius: 5px">
|
||||||
<el-col :span="12" v-for="(item, index) in menu" :key="item.value">
|
<el-col :span="12" v-for="(item, index) in PERMISSIONS" :key="item.value">
|
||||||
<el-switch v-model="formData.menu[index]" :active-text="item.label" :active-value="item.value" :inactive-value="false" />
|
<el-switch v-model="formData.permissions[index]" :active-text="item.label" :active-value="item.value" :inactive-value="0" />
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
@ -57,7 +57,7 @@ import { onMounted, reactive, ref } from 'vue';
|
||||||
import { NextLoading } from '/@/utils/loading';
|
import { NextLoading } from '/@/utils/loading';
|
||||||
import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
|
import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
|
||||||
import { createTenant, updateTenant } from '/@/api/tenant';
|
import { createTenant, updateTenant } from '/@/api/tenant';
|
||||||
import { COMPANYTYPE_CONST, ACCOUNTTYPE_CONST } from './constant';
|
import { COMPANYTYPE_CONST, ACCOUNTTYPE_CONST, PERMISSIONS } from './constant';
|
||||||
|
|
||||||
const emit = defineEmits(['close']);
|
const emit = defineEmits(['close']);
|
||||||
const formRef = ref<FormInstance>();
|
const formRef = ref<FormInstance>();
|
||||||
|
|
@ -70,36 +70,9 @@ const formData = reactive({
|
||||||
accountLimit: 0,
|
accountLimit: 0,
|
||||||
accountType: '',
|
accountType: '',
|
||||||
daterange: [],
|
daterange: [],
|
||||||
menu: ['1','2','3','4','5','6'],
|
permissions: [...PERMISSIONS.map(() => 1)],
|
||||||
});
|
});
|
||||||
|
|
||||||
const menu = ref([
|
|
||||||
{
|
|
||||||
label: '海外独家',
|
|
||||||
value: '1',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '编辑精选',
|
|
||||||
value: '2',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '宏观知微',
|
|
||||||
value: '3',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '智能资讯榜',
|
|
||||||
value: '4',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '热门行业',
|
|
||||||
value: '5',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '风口概念',
|
|
||||||
value: '6',
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
const validatePhone = (rule: any, value: any, callback: any) => {
|
const validatePhone = (rule: any, value: any, callback: any) => {
|
||||||
const phoneRegex = /^1[3456789]\d{9}$/;
|
const phoneRegex = /^1[3456789]\d{9}$/;
|
||||||
if (!value) {
|
if (!value) {
|
||||||
|
|
@ -125,7 +98,7 @@ const dialogTableVisible = ref(false);
|
||||||
function open(data) {
|
function open(data) {
|
||||||
dialogTableVisible.value = true;
|
dialogTableVisible.value = true;
|
||||||
if (data) {
|
if (data) {
|
||||||
Object.assign(formData, data);
|
Object.assign(formData, { ...data, daterange: [data.validStart, data.validEnd], permissions: data.permissions.map((item) => item.enabled) });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function close() {
|
function close() {
|
||||||
|
|
@ -143,6 +116,10 @@ function close() {
|
||||||
async function submit() {
|
async function submit() {
|
||||||
console.log('output >>>>> formData', formData);
|
console.log('output >>>>> formData', formData);
|
||||||
await formRef.value?.validate();
|
await formRef.value?.validate();
|
||||||
|
const permissions = formData.permissions.map((item, index) => ({
|
||||||
|
name: PERMISSIONS[index].label,
|
||||||
|
enabled: item,
|
||||||
|
}));
|
||||||
const params = {
|
const params = {
|
||||||
id: formData?.id || undefined,
|
id: formData?.id || undefined,
|
||||||
companyType: formData.companyType,
|
companyType: formData.companyType,
|
||||||
|
|
@ -153,8 +130,9 @@ async function submit() {
|
||||||
validStart: formData.daterange[0],
|
validStart: formData.daterange[0],
|
||||||
validEnd: formData.daterange[1],
|
validEnd: formData.daterange[1],
|
||||||
accountLimit: formData.accountLimit,
|
accountLimit: formData.accountLimit,
|
||||||
|
permissions: permissions,
|
||||||
};
|
};
|
||||||
console.log('output >>>>> params',params);
|
console.log('output >>>>> params', params);
|
||||||
if (formData.id) {
|
if (formData.id) {
|
||||||
updateTenant(params).then((res) => {
|
updateTenant(params).then((res) => {
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
|
|
@ -176,6 +154,9 @@ async function submit() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const onSwitchChange = ({ key, value, model }) => {
|
||||||
|
console.log(`开关 ${key} 变为 ${value},当前状态:`, model);
|
||||||
|
};
|
||||||
|
|
||||||
// 页面加载时
|
// 页面加载时
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
|
|
||||||
|
|
@ -47,3 +47,30 @@ export const STATUS_CONST: Record<string, IValue> = {
|
||||||
value: 1,
|
value: 1,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const PERMISSIONS = [
|
||||||
|
{
|
||||||
|
label: '海外独家',
|
||||||
|
value: 1, // 0:不可见;1:可见
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '编辑精选',
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '宏观知微',
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '智能资讯榜',
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '热门行业',
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '风口概念',
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
|
||||||
|
|
@ -185,16 +185,28 @@ function exportExcel() {
|
||||||
ElMessageBox.confirm('确定导出吗?', '提示', {
|
ElMessageBox.confirm('确定导出吗?', '提示', {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
}).then(async () => {
|
}).then(async () => {
|
||||||
// 导出
|
try {
|
||||||
let { code, data } = await exportTenant({
|
// 导出
|
||||||
page: tableData.page,
|
const response = await exportTenant({
|
||||||
size: tableData.size,
|
page: tableData.page,
|
||||||
...formData,
|
size: tableData.size,
|
||||||
});
|
...formData,
|
||||||
console.log('output >>>>> data', data);
|
});
|
||||||
|
|
||||||
if (code == 200) {
|
const filename = '租户导出.xlsx'; // 默认文件名
|
||||||
ElMessage.success('导出成功');
|
// 创建 Blob URL
|
||||||
|
const blob = new Blob([response]); // response 已经是 Blob 对象
|
||||||
|
const downloadUrl = window.URL.createObjectURL(blob);
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = downloadUrl;
|
||||||
|
link.download = filename; // 设置下载文件名
|
||||||
|
document.body.appendChild(link);
|
||||||
|
link.click();
|
||||||
|
document.body.removeChild(link);
|
||||||
|
// 释放 Blob URL
|
||||||
|
window.URL.revokeObjectURL(downloadUrl);
|
||||||
|
} catch (error) {
|
||||||
|
ElMessage.error('导出失败');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ async function submit() {
|
||||||
id: form?.id || undefined,
|
id: form?.id || undefined,
|
||||||
name: form.name,
|
name: form.name,
|
||||||
mobile: form.mobile,
|
mobile: form.mobile,
|
||||||
companyName: form.companyName?.companyName,
|
companyName: form.companyName?.id,
|
||||||
department: form.department,
|
department: form.department,
|
||||||
accountType: form.accountType,
|
accountType: form.accountType,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
</div>
|
</div>
|
||||||
<el-form class="form_content"
|
<el-form class="form_content"
|
||||||
><el-form-item>
|
><el-form-item>
|
||||||
<el-input v-model="formData.phone" placeholder="请输入账号手机号" @keydown.enter="getData">
|
<el-input v-model="formData.mobile" placeholder="请输入账号手机号" @keydown.enter="getData">
|
||||||
<template #append>
|
<template #append>
|
||||||
<el-button icon="Search" @click="getData" />
|
<el-button icon="Search" @click="getData" />
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-select v-model="formData.active" placeholder="账号状态(全部)" class="input" clearable @change="getData">
|
<el-select v-model="formData.status" placeholder="账号状态(全部)" class="input" clearable @change="getData">
|
||||||
<el-option v-for="item of STATUS_CONST" :key="item.value" :label="item.label" :value="item.value" />
|
<el-option v-for="item of STATUS_CONST" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
@ -36,7 +36,7 @@
|
||||||
</div>
|
</div>
|
||||||
<tableComponents :tableData="tableData" :tableLoading="loading" :hadExpand="false">
|
<tableComponents :tableData="tableData" :tableLoading="loading" :hadExpand="false">
|
||||||
<el-table-column prop="name" label="姓名" align="center" />
|
<el-table-column prop="name" label="姓名" align="center" />
|
||||||
<el-table-column prop="phone" label="手机号" align="center" />
|
<el-table-column prop="mobile" label="手机号" align="center" />
|
||||||
<el-table-column prop="companyName" label="企业名称" align="center" />
|
<el-table-column prop="companyName" label="企业名称" align="center" />
|
||||||
<el-table-column prop="accountType" label="账号类型" align="center">
|
<el-table-column prop="accountType" label="账号类型" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
|
|
@ -45,16 +45,16 @@
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="createTime" label="创建时间" align="center" />
|
<el-table-column prop="createTime" label="创建时间" align="center" />
|
||||||
<el-table-column prop="updateTime" label="变更时间" align="center" />
|
<el-table-column prop="updateTime" label="变更时间" align="center" />
|
||||||
<el-table-column prop="active" label="账号状态" align="center">
|
<el-table-column prop="status" label="账号状态" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div style="display: flex; align-items: center; justify-content: center">
|
<div style="display: flex; align-items: center; justify-content: center">
|
||||||
<div class="r_point" v-if="scope.row.active === 1">
|
<div class="r_point" v-if="scope.row.status === 0">
|
||||||
<div class="point" style="background-color: #2dc74c"></div>
|
<div class="point" style="background-color: #2dc74c"></div>
|
||||||
<text style="color: #2dc74c; white-space: nowrap">{{ STATUS_CONST[scope.row.active]?.label }}</text>
|
<text style="color: #2dc74c; white-space: nowrap">{{ STATUS_CONST[scope.row.status]?.label }}</text>
|
||||||
</div>
|
</div>
|
||||||
<div class="r_point" v-else>
|
<div class="r_point" v-else>
|
||||||
<div class="point" style="background-color: #eb1c5d"></div>
|
<div class="point" style="background-color: #eb1c5d"></div>
|
||||||
<text style="color: #eb1c5d; white-space: nowrap">{{ STATUS_CONST[scope.row.active]?.label }}</text>
|
<text style="color: #eb1c5d; white-space: nowrap">{{ STATUS_CONST[scope.row.status]?.label }}</text>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -62,7 +62,7 @@
|
||||||
<el-table-column label="操作" align="center">
|
<el-table-column label="操作" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button type="text" @click="addOpen(scope.row)">编辑</el-button>
|
<el-button type="text" @click="addOpen(scope.row)">编辑</el-button>
|
||||||
<el-button type="text" v-if="scope.row.active === 1" @click="doUpdateStatus(scope.row)">启用</el-button>
|
<el-button type="text" v-if="scope.row.status === 1" @click="doUpdateStatus(scope.row)">启用</el-button>
|
||||||
<el-button type="text" v-else @click="doUpdateStatus(scope.row)">禁用</el-button>
|
<el-button type="text" v-else @click="doUpdateStatus(scope.row)">禁用</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
@ -85,20 +85,20 @@ import { disableTenantUser, enableTenantUser, exportTenantUser, getTenantUserLis
|
||||||
import { ACCOUNTTYPE_CONST, STATUS_CONST } from '/@/views/pages/tenant/constant';
|
import { ACCOUNTTYPE_CONST, STATUS_CONST } from '/@/views/pages/tenant/constant';
|
||||||
|
|
||||||
type FormData = {
|
type FormData = {
|
||||||
phone: string;
|
mobile: string;
|
||||||
companyName: string;
|
companyName: string;
|
||||||
accountType: number | undefined;
|
accountType: number | undefined;
|
||||||
active: number | undefined;
|
status: number | undefined;
|
||||||
};
|
};
|
||||||
type IData = {
|
type IData = {
|
||||||
id: number;
|
id: number;
|
||||||
companyName: string;
|
companyName: string;
|
||||||
accountType: number;
|
accountType: number;
|
||||||
phone: string;
|
mobile: string;
|
||||||
name: string;
|
name: string;
|
||||||
createTime: string;
|
createTime: string;
|
||||||
updateTime: string;
|
updateTime: string;
|
||||||
active: number;
|
status: number;
|
||||||
};
|
};
|
||||||
type TableData = {
|
type TableData = {
|
||||||
data: IData[];
|
data: IData[];
|
||||||
|
|
@ -108,10 +108,10 @@ type TableData = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const formData = reactive<FormData>({
|
const formData = reactive<FormData>({
|
||||||
phone: '',
|
mobile: '',
|
||||||
companyName: '',
|
companyName: '',
|
||||||
accountType: undefined,
|
accountType: undefined,
|
||||||
active: undefined,
|
status: undefined,
|
||||||
});
|
});
|
||||||
const tableData = reactive<TableData>({
|
const tableData = reactive<TableData>({
|
||||||
data: [],
|
data: [],
|
||||||
|
|
@ -137,11 +137,11 @@ async function getData() {
|
||||||
}
|
}
|
||||||
// 启用禁用
|
// 启用禁用
|
||||||
async function doUpdateStatus(row: IData) {
|
async function doUpdateStatus(row: IData) {
|
||||||
ElMessageBox.confirm('确定' + (row.active === 0 ? '启用' : '禁用') + '该账号吗?', '提示', {
|
ElMessageBox.confirm('确定' + (row.status === 1 ? '启用' : '禁用') + '该账号吗?', '提示', {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
}).then(async () => {
|
}).then(async () => {
|
||||||
// 启用或禁用
|
// 启用或禁用
|
||||||
const updateStatus = row.active === 0 ? enableTenantUser : disableTenantUser;
|
const updateStatus = row.status === 1 ? enableTenantUser : disableTenantUser;
|
||||||
|
|
||||||
let { code, data } = await updateStatus({
|
let { code, data } = await updateStatus({
|
||||||
id: row.id,
|
id: row.id,
|
||||||
|
|
@ -168,25 +168,37 @@ function exportExcel() {
|
||||||
ElMessageBox.confirm('确定导出吗?', '提示', {
|
ElMessageBox.confirm('确定导出吗?', '提示', {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
}).then(async () => {
|
}).then(async () => {
|
||||||
// 导出
|
try {
|
||||||
let { code, data } = await exportTenantUser({
|
// 导出
|
||||||
page: tableData.page,
|
const response = await exportTenantUser({
|
||||||
size: tableData.size,
|
page: tableData.page,
|
||||||
...formData,
|
size: tableData.size,
|
||||||
});
|
...formData,
|
||||||
console.log('output >>>>> data', data);
|
});
|
||||||
|
|
||||||
if (code == 200) {
|
const filename = '租户子账号导出.xlsx'; // 默认文件名
|
||||||
ElMessage.success('导出成功');
|
// 创建 Blob URL
|
||||||
|
const blob = new Blob([response]); // response 已经是 Blob 对象
|
||||||
|
const downloadUrl = window.URL.createObjectURL(blob);
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = downloadUrl;
|
||||||
|
link.download = filename; // 设置下载文件名
|
||||||
|
document.body.appendChild(link);
|
||||||
|
link.click();
|
||||||
|
document.body.removeChild(link);
|
||||||
|
// 释放 Blob URL
|
||||||
|
window.URL.revokeObjectURL(downloadUrl);
|
||||||
|
} catch (error) {
|
||||||
|
ElMessage.error('导出失败');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearForm() {
|
function clearForm() {
|
||||||
formData.phone = '';
|
formData.mobile = '';
|
||||||
formData.companyName = '';
|
formData.companyName = '';
|
||||||
formData.accountType = undefined;
|
formData.accountType = undefined;
|
||||||
formData.active = undefined;
|
formData.status = undefined;
|
||||||
getData();
|
getData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue