You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
757 lines
20 KiB
Vue
757 lines
20 KiB
Vue
<script setup lang="ts">
|
|
import { reactive, ref, onMounted } from "vue";
|
|
import type { FormInstance } from "element-plus";
|
|
import { Close } from "@element-plus/icons-vue";
|
|
import { useColumns } from "./table/accountColumns";
|
|
import {
|
|
getUserList,
|
|
getDeptManageList,
|
|
resetPW,
|
|
deletePW,
|
|
deleteDeptManage,
|
|
queryRoleDateList,
|
|
deleteRole,
|
|
updateUserStatus
|
|
} from "@/api/system";
|
|
import { message } from "@/utils/message";
|
|
import accountDrawer from "./compontents/accountDrawer.vue";
|
|
import deptDrawer from "./compontents/deptDrawer.vue";
|
|
import roleDrawer from "./compontents/roleDrawer.vue";
|
|
import ruleSet from "./compontents/ruleSet.vue";
|
|
defineOptions({
|
|
name: "AccountManagement"
|
|
});
|
|
const { accountColumns, deptColumns, roleColumns } = useColumns();
|
|
const seachForm = reactive({
|
|
status: "1"
|
|
});
|
|
const accountForm = reactive({
|
|
userName: "",
|
|
roleId: "",
|
|
deptId: ""
|
|
});
|
|
const updateFrom = ref({});
|
|
const updateDeptFrom = ref({});
|
|
const updateRoleFrom = ref({});
|
|
const passwordForm = reactive({
|
|
id: "",
|
|
account: "",
|
|
password: "",
|
|
confirmPassword: ""
|
|
});
|
|
const accountFromType = ref("");
|
|
const tabList = ref([
|
|
{
|
|
title: "账号管理",
|
|
id: "1"
|
|
},
|
|
{
|
|
title: "部门管理",
|
|
id: "2"
|
|
},
|
|
{
|
|
title: "角色权限",
|
|
id: "3"
|
|
}
|
|
]);
|
|
const pagination = reactive({
|
|
total: 0,
|
|
pageSize: 10,
|
|
currentPage: 1,
|
|
align: "center",
|
|
layout: "total, prev, pager, next, jumper",
|
|
background: true
|
|
});
|
|
|
|
const roleDataList = ref([]);
|
|
const accountDataList = ref([]);
|
|
// const deptDataList = ref([]);
|
|
/**
|
|
* 部门列表查询
|
|
*/
|
|
const getDeptData = async () => {
|
|
const res: any = await getDeptManageList({
|
|
baseName: "",
|
|
deptCode: "",
|
|
pageNum: 1,
|
|
pageSize: 20
|
|
});
|
|
if (res.code === 200) {
|
|
deptOptions.value = res.data.records;
|
|
if (seachForm.status === "2") {
|
|
pagination.total = res.data.total;
|
|
}
|
|
}
|
|
};
|
|
/**
|
|
* 用户列表查询
|
|
*/
|
|
const getUserTableData = async () => {
|
|
const res: any = await getUserList({
|
|
userName: accountForm.userName,
|
|
deptId: accountForm.deptId,
|
|
roleName: accountForm.roleId,
|
|
pageNum: pagination.currentPage,
|
|
pageSize: pagination.pageSize
|
|
});
|
|
if (res.code === 200) {
|
|
accountDataList.value = res.data.records;
|
|
pagination.total = res.data.total;
|
|
}
|
|
console.log(res);
|
|
// dataList.value = res.data;
|
|
};
|
|
/**
|
|
* 角色列表查询
|
|
*/
|
|
const getRoleTableData = async () => {
|
|
const res: any = await queryRoleDateList({
|
|
roleName: accountForm.userName,
|
|
pageNum: pagination.currentPage,
|
|
pageSize: pagination.pageSize
|
|
});
|
|
if (res.code === 200) {
|
|
roleDataList.value = res.data.records;
|
|
pagination.total = res.data.total;
|
|
}
|
|
};
|
|
const search = () => {
|
|
pagination.currentPage = 1;
|
|
pagination.pageSize = 10;
|
|
if (seachForm.status === "1") {
|
|
getUserTableData();
|
|
} else if (seachForm.status === "2") {
|
|
getDeptData();
|
|
} else {
|
|
getRoleTableData();
|
|
}
|
|
};
|
|
|
|
const reset = () => {
|
|
accountForm.userName = "";
|
|
accountForm.roleId = "";
|
|
accountForm.deptId = "";
|
|
search();
|
|
};
|
|
const createFlag = ref(false);
|
|
const createDeptFlag = ref(false);
|
|
const createRoleFlag = ref(false);
|
|
const dialogFormVisible = ref(false);
|
|
const deleteFormVisible = ref(false);
|
|
const roleSetVisible = ref(false);
|
|
|
|
const passwordFormRef = ref<FormInstance>();
|
|
|
|
const create = () => {
|
|
if (seachForm.status === "1") {
|
|
createFlag.value = true;
|
|
} else if (seachForm.status === "2") {
|
|
createDeptFlag.value = true;
|
|
} else {
|
|
createRoleFlag.value = true;
|
|
}
|
|
|
|
// search();
|
|
};
|
|
// const changeStatus = item => {
|
|
// seachForm.status = item.id;
|
|
// };
|
|
const closeDrawer = () => {
|
|
if (createFlag.value) {
|
|
createFlag.value = false;
|
|
accountFromType.value = "";
|
|
search();
|
|
} else if (createDeptFlag.value) {
|
|
createDeptFlag.value = false;
|
|
accountFromType.value = "";
|
|
search();
|
|
} else {
|
|
createRoleFlag.value = false;
|
|
accountFromType.value = "";
|
|
search();
|
|
}
|
|
// if (updateFlag.value) {
|
|
// updateFlag.value = false;
|
|
// search();
|
|
// }
|
|
};
|
|
const deptOptions = ref([]);
|
|
|
|
const changeStatus = item => {
|
|
seachForm.status = item.id;
|
|
search();
|
|
};
|
|
const handleView = async (value: any, type: string) => {
|
|
console.log(value);
|
|
createFlag.value = true;
|
|
accountFromType.value = type;
|
|
updateFrom.value = value;
|
|
};
|
|
const handleEdit = async (value: any, type: string) => {
|
|
if (seachForm.status === "1") {
|
|
createFlag.value = true;
|
|
accountFromType.value = type;
|
|
updateFrom.value = value;
|
|
} else if (seachForm.status === "2") {
|
|
createDeptFlag.value = true;
|
|
accountFromType.value = type;
|
|
updateDeptFrom.value = value;
|
|
} else {
|
|
createRoleFlag.value = true;
|
|
accountFromType.value = type;
|
|
updateRoleFrom.value = value;
|
|
}
|
|
};
|
|
|
|
const handleReset = (value: any) => {
|
|
dialogFormVisible.value = true;
|
|
passwordForm.id = value.id;
|
|
passwordForm.account = value.account;
|
|
passwordForm.password = "";
|
|
passwordForm.confirmPassword = "";
|
|
// updateId.value = value.id;
|
|
// updateFlag.value = true;
|
|
};
|
|
const handleDelete = (value: any) => {
|
|
deleteFormVisible.value = true;
|
|
passwordForm.id = value.id;
|
|
};
|
|
function onCurrentChange(page: number) {
|
|
// console.log("onCurrentChange", page);
|
|
pagination.currentPage = page;
|
|
pagination.pageSize = 10;
|
|
getUserTableData();
|
|
}
|
|
const submitForm = (formEl: FormInstance | undefined) => {
|
|
if (!formEl) return;
|
|
formEl.validate(valid => {
|
|
if (valid) {
|
|
// console.log(valid);
|
|
if (passwordForm.password !== passwordForm.confirmPassword) {
|
|
message("原密码要与新密码不一样!", { type: "error" });
|
|
} else {
|
|
resetPW({
|
|
id: passwordForm.id,
|
|
password: passwordForm.password
|
|
}).then(res => {
|
|
if (res.code === 200) {
|
|
message("重置成功", { type: "success" });
|
|
dialogFormVisible.value = false;
|
|
}
|
|
});
|
|
}
|
|
} else {
|
|
dialogFormVisible.value = false;
|
|
console.log("error submit!");
|
|
}
|
|
});
|
|
};
|
|
|
|
const resetForm = (formEl: FormInstance | undefined) => {
|
|
if (!formEl) return;
|
|
formEl.resetFields();
|
|
dialogFormVisible.value = false;
|
|
};
|
|
const deleteForm = () => {
|
|
if (seachForm.status === "1") {
|
|
deletePW({
|
|
id: passwordForm.id
|
|
}).then(res => {
|
|
if (res.code === 200) {
|
|
message("删除成功", { type: "success" });
|
|
deleteFormVisible.value = false;
|
|
search();
|
|
}
|
|
});
|
|
} else if (seachForm.status === "2") {
|
|
deleteDeptManage({
|
|
id: passwordForm.id
|
|
}).then(res => {
|
|
if (res.code === 200) {
|
|
message("删除成功", { type: "success" });
|
|
deleteFormVisible.value = false;
|
|
search();
|
|
}
|
|
});
|
|
} else {
|
|
deleteRole({
|
|
id: passwordForm.id
|
|
}).then(res => {
|
|
if (res.code === 200) {
|
|
message("删除成功", { type: "success" });
|
|
deleteFormVisible.value = false;
|
|
search();
|
|
}
|
|
});
|
|
}
|
|
};
|
|
const newName = (type: any) => {
|
|
if (type === "1") {
|
|
return "新建账号";
|
|
} else if (type === "2") {
|
|
return "新建部门";
|
|
} else {
|
|
return "新建角色";
|
|
}
|
|
};
|
|
const deleteName = (type: any) => {
|
|
if (type === "1") {
|
|
return "账号";
|
|
} else if (type === "2") {
|
|
return "部门";
|
|
} else {
|
|
return "角色";
|
|
}
|
|
};
|
|
//角色权限
|
|
const handleRolePermission = row => {
|
|
console.log(row);
|
|
roleSetVisible.value = true;
|
|
};
|
|
//状态切换
|
|
const changeUserStatus = async row => {
|
|
console.log(row);
|
|
const res: any = await updateUserStatus({
|
|
id: row.id,
|
|
status: row.status ? 0 : 1
|
|
});
|
|
if (res.code === 200) {
|
|
message("修改成功", { type: "success" });
|
|
getUserTableData();
|
|
}
|
|
};
|
|
onMounted(() => {
|
|
getDeptData();
|
|
// getUserTableData();
|
|
// getRoleTableData();
|
|
search();
|
|
});
|
|
</script>
|
|
|
|
<template>
|
|
<div class="sublibrary_management app-main-content">
|
|
<div class="main-table">
|
|
<div class="main-table-header">
|
|
<div class="tab-list">
|
|
<div
|
|
class="tab-list-item"
|
|
:class="[seachForm.status === item.id ? 'actived' : '']"
|
|
v-for="(item, index) in tabList"
|
|
:key="index"
|
|
@click="changeStatus(item)"
|
|
>
|
|
<span>{{ item.title }}</span>
|
|
</div>
|
|
</div>
|
|
<div class="header-btn">
|
|
<el-button @click="create" type="primary">{{
|
|
newName(seachForm.status)
|
|
}}</el-button>
|
|
</div>
|
|
</div>
|
|
<div class="account_seach" v-if="seachForm.status === '1'">
|
|
<el-form :model="accountForm">
|
|
<el-row>
|
|
<el-form-item label="姓名">
|
|
<el-input v-model="accountForm.userName" placeholder="请输入" />
|
|
</el-form-item>
|
|
<el-form-item class="ml-4" label="角色">
|
|
<el-input v-model="accountForm.roleId" placeholder="请输入" />
|
|
</el-form-item>
|
|
<el-form-item class="ml-4" label="所属部门">
|
|
<el-select
|
|
v-model="accountForm.deptId"
|
|
clearable
|
|
placeholder="请选择"
|
|
style="width: 240px"
|
|
>
|
|
<el-option
|
|
v-for="item in deptOptions"
|
|
:key="item.id"
|
|
:label="item.deptName"
|
|
:value="item.id"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
|
|
<el-button @click="reset" class="ml-8">重置</el-button>
|
|
<el-button @click="search" type="primary">搜索</el-button>
|
|
</el-row>
|
|
</el-form>
|
|
<pure-table
|
|
showOverflowTooltip
|
|
alignWhole="center"
|
|
:data="accountDataList"
|
|
:columns="accountColumns"
|
|
adaptive
|
|
:header-cell-style="{
|
|
background: 'var(--el-table-row-hover-bg-color)',
|
|
color: 'var(--el-text-color-primary)'
|
|
}"
|
|
:pagination="pagination"
|
|
@page-current-change="onCurrentChange"
|
|
>
|
|
<template #index="{ index }">
|
|
<span>{{ index + 1 }}</span>
|
|
</template>
|
|
<template #userRoleList="{ row }">
|
|
<span v-for="(item, index) in row.userRoleList" :key="index"
|
|
>{{ item.roleName
|
|
}}<i v-if="index < row.userRoleList.length - 1">, </i></span
|
|
>
|
|
</template>
|
|
<template #status="{ row }">
|
|
<el-switch
|
|
:model-value="row.status === 0 ? true : false"
|
|
@click="changeUserStatus(row)"
|
|
/>
|
|
</template>
|
|
<template #operation="{ row }">
|
|
<el-button link type="primary" @click="handleView(row, 'view')">
|
|
查看
|
|
</el-button>
|
|
<span>|</span>
|
|
<el-button link type="primary" @click="handleEdit(row, 'edit')">
|
|
编辑
|
|
</el-button>
|
|
<span>|</span>
|
|
<el-button link type="primary" @click="handleReset(row)">
|
|
重置密码
|
|
</el-button>
|
|
<span>|</span>
|
|
<el-button link type="danger" @click="handleDelete(row)">
|
|
删除
|
|
</el-button>
|
|
</template></pure-table
|
|
>
|
|
</div>
|
|
<div class="account_seach" v-if="seachForm.status === '2'">
|
|
<pure-table
|
|
showOverflowTooltip
|
|
alignWhole="center"
|
|
:data="deptOptions"
|
|
:columns="deptColumns"
|
|
adaptive
|
|
:header-cell-style="{
|
|
background: 'var(--el-table-row-hover-bg-color)',
|
|
color: 'var(--el-text-color-primary)'
|
|
}"
|
|
:pagination="pagination"
|
|
@page-current-change="onCurrentChange"
|
|
>
|
|
<template #index="{ index }">
|
|
<span>{{ index + 1 }}</span>
|
|
</template>
|
|
<template #operation="{ row }">
|
|
<el-button link type="primary" @click="handleEdit(row, 'edit')">
|
|
编辑
|
|
</el-button>
|
|
<span>|</span>
|
|
<el-button link type="primary"> 部门权限 </el-button>
|
|
<span>|</span>
|
|
<el-button link type="danger" @click="handleDelete(row)">
|
|
删除
|
|
</el-button>
|
|
</template></pure-table
|
|
>
|
|
</div>
|
|
<div class="account_seach" v-if="seachForm.status === '3'">
|
|
<pure-table
|
|
showOverflowTooltip
|
|
alignWhole="center"
|
|
:data="roleDataList"
|
|
:columns="roleColumns"
|
|
adaptive
|
|
:pagination="pagination"
|
|
@page-current-change="onCurrentChange"
|
|
:header-cell-style="{
|
|
background: 'var(--el-table-row-hover-bg-color)',
|
|
color: 'var(--el-text-color-primary)'
|
|
}"
|
|
>
|
|
<template #index="{ index }">
|
|
<span>{{ index + 1 }}</span>
|
|
</template>
|
|
<template #operation="{ row }">
|
|
<el-button link type="primary" @click="handleEdit(row, 'edit')">
|
|
编辑
|
|
</el-button>
|
|
<span>|</span>
|
|
<el-button link type="primary" @click="handleRolePermission(row)">
|
|
角色权限
|
|
</el-button>
|
|
<span>|</span>
|
|
<el-button link type="danger" @click="handleDelete(row)">
|
|
删除
|
|
</el-button>
|
|
</template></pure-table
|
|
>
|
|
</div>
|
|
<!-- 账户抽屉 -->
|
|
<accountDrawer
|
|
:createFlag="createFlag"
|
|
:updateFrom="updateFrom"
|
|
:accountFromType="accountFromType"
|
|
:closeDrawer="closeDrawer"
|
|
/>
|
|
<!-- 部门 -->
|
|
<deptDrawer
|
|
:createFlag="createDeptFlag"
|
|
:updateFrom="updateDeptFrom"
|
|
:accountFromType="accountFromType"
|
|
:closeDrawer="closeDrawer"
|
|
/>
|
|
<!-- 角色 -->
|
|
<roleDrawer
|
|
:createFlag="createRoleFlag"
|
|
:updateFrom="updateRoleFrom"
|
|
:accountFromType="accountFromType"
|
|
:closeDrawer="closeDrawer"
|
|
/>
|
|
|
|
<!-- 账户弹框 -->
|
|
<el-dialog
|
|
v-model="dialogFormVisible"
|
|
title="Shipping address"
|
|
width="560"
|
|
:show-close="false"
|
|
>
|
|
<template #header="{ close, titleId, titleClass }">
|
|
<div class="my-header">
|
|
<h4 :id="titleId" :class="titleClass"><span />重置密码</h4>
|
|
<el-icon @click="close" class="cursor-pointer"><Close /></el-icon>
|
|
</div>
|
|
</template>
|
|
<el-form
|
|
:model="passwordForm"
|
|
label-width="auto"
|
|
ref="passwordFormRef"
|
|
class="p-6"
|
|
>
|
|
<el-form-item label="用户名">
|
|
<el-input
|
|
v-model="passwordForm.account"
|
|
autocomplete="off"
|
|
disabled
|
|
/>
|
|
</el-form-item>
|
|
<el-form-item
|
|
label="密码"
|
|
prop="password"
|
|
:rules="[
|
|
{
|
|
required: true,
|
|
message: '请输入',
|
|
trigger: 'blur'
|
|
}
|
|
]"
|
|
>
|
|
<el-input
|
|
v-model="passwordForm.password"
|
|
autocomplete="off"
|
|
type="password"
|
|
show-password
|
|
placeholder="请输入"
|
|
/>
|
|
</el-form-item>
|
|
<el-form-item
|
|
label="确认密码"
|
|
prop="confirmPassword"
|
|
:rules="[
|
|
{
|
|
required: true,
|
|
message: '请输入',
|
|
trigger: 'blur'
|
|
}
|
|
]"
|
|
>
|
|
<el-input
|
|
v-model="passwordForm.confirmPassword"
|
|
autocomplete="off"
|
|
type="password"
|
|
show-password
|
|
placeholder="请输入"
|
|
/>
|
|
</el-form-item>
|
|
</el-form>
|
|
<template #footer>
|
|
<div class="dialog-footer">
|
|
<el-button @click="resetForm(passwordFormRef)">取消</el-button>
|
|
<el-button type="primary" @click="submitForm(passwordFormRef)">
|
|
确定
|
|
</el-button>
|
|
</div>
|
|
</template>
|
|
</el-dialog>
|
|
<!-- 账户删除弹框 -->
|
|
<el-dialog
|
|
v-model="deleteFormVisible"
|
|
title="Shipping address"
|
|
width="500"
|
|
:show-close="false"
|
|
>
|
|
<template #header="{ titleId, titleClass }">
|
|
<div class="my-header_delete">
|
|
<h4 :id="titleId" :class="titleClass">
|
|
<div class="my_delete_icon" />
|
|
确认删除【{{ deleteName(seachForm.status) }}】?
|
|
</h4>
|
|
</div>
|
|
</template>
|
|
<div class="my_delete_body">
|
|
删除后无法找回,此操作不可逆,请谨慎处理
|
|
</div>
|
|
<template #footer>
|
|
<div class="dialog-footer_delete">
|
|
<el-button @click="deleteFormVisible = false">取消</el-button>
|
|
<el-button type="primary" @click="deleteForm"> 确定 </el-button>
|
|
</div>
|
|
</template>
|
|
</el-dialog>
|
|
<!-- 规则预设 -->
|
|
<el-dialog
|
|
v-model="roleSetVisible"
|
|
title="Shipping address"
|
|
width="1400"
|
|
:show-close="false"
|
|
>
|
|
<template #header="{ close, titleId, titleClass }">
|
|
<div class="my-header">
|
|
<h4 :id="titleId" :class="titleClass"><span />规则预设</h4>
|
|
<el-icon @click="close" class="cursor-pointer"><Close /></el-icon>
|
|
</div>
|
|
</template>
|
|
<ruleSet />
|
|
<template #footer>
|
|
<div class="dialog-footer">
|
|
<el-button @click="roleSetVisible = false">取消</el-button>
|
|
<el-button type="primary" @click="roleSetVisible = false">
|
|
确定
|
|
</el-button>
|
|
</div>
|
|
</template>
|
|
</el-dialog>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<style lang="scss" scoped>
|
|
.sublibrary_management {
|
|
.main-table {
|
|
border-radius: 6px;
|
|
|
|
.main-table-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
margin-bottom: 24px;
|
|
border-bottom: 1px solid #dfe1e2;
|
|
|
|
.tab-list {
|
|
position: relative;
|
|
top: 1px;
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
.tab-list-item {
|
|
padding: 16px 34px;
|
|
font-size: 18px;
|
|
color: #333;
|
|
cursor: pointer;
|
|
background: #f5f7f9;
|
|
border: 1px solid #dfe1e2;
|
|
border-bottom: 0;
|
|
}
|
|
|
|
.actived {
|
|
color: #0052d9;
|
|
background: #fff;
|
|
border: 0;
|
|
border-top: 3px solid #0052d9;
|
|
}
|
|
}
|
|
|
|
.header-btn {
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.main-btn {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 142px;
|
|
height: 32px;
|
|
font-size: 14px;
|
|
color: #fff;
|
|
background: #0052d9;
|
|
border-radius: 6px;
|
|
}
|
|
}
|
|
}
|
|
|
|
:deep(.el-dialog) {
|
|
background: linear-gradient(180deg, #e1ecfe 0%, #fff 30%);
|
|
}
|
|
|
|
.my-header,
|
|
.my-header_delete {
|
|
box-sizing: border-box;
|
|
display: flex;
|
|
flex-direction: row;
|
|
gap: 16px;
|
|
justify-content: space-between;
|
|
height: 74px;
|
|
padding: 24px;
|
|
border-bottom: 1px solid rgb(91 139 255 / 30%);
|
|
|
|
h4 {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
|
|
span {
|
|
display: inline-block;
|
|
width: 6px;
|
|
height: 20px;
|
|
margin-right: 10px;
|
|
background: #0052d9;
|
|
border-radius: 3px;
|
|
}
|
|
}
|
|
}
|
|
|
|
:deep(.el-dialog__body) {
|
|
padding: 0;
|
|
}
|
|
|
|
.my-header_delete {
|
|
padding: 24px 24px 0;
|
|
border-bottom: none;
|
|
|
|
h4 {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
|
|
.my_delete_icon {
|
|
display: block;
|
|
width: 28px;
|
|
height: 28px;
|
|
margin-right: 10px;
|
|
background-image: url("@/assets/home/tishi@2x.png");
|
|
background-size: 100% 100%;
|
|
}
|
|
}
|
|
}
|
|
|
|
.my_delete_body {
|
|
text-align: center;
|
|
}
|
|
|
|
.dialog-footer_delete {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: flex-end;
|
|
}
|
|
}
|
|
</style>
|