|
|
@@ -1,146 +1,137 @@
|
|
|
<template>
|
|
|
- <div>
|
|
|
- <ElRow :gutter="20">
|
|
|
+ <div class="role">
|
|
|
+ <ElRow :gutter="20" style="background: white; height: 840px">
|
|
|
<ElCol :md="6">
|
|
|
- <PageMain class="vh100">
|
|
|
- <ElFormItem prop="roleName">
|
|
|
- <ElCol :md="20">
|
|
|
- <ElInput
|
|
|
- v-model="roleName"
|
|
|
- placeholder="角色名称查找"
|
|
|
- type="text"
|
|
|
- tabindex="1"
|
|
|
- >
|
|
|
- <template #prefix>
|
|
|
- <SvgIcon name="i-ri:user-3-fill" />
|
|
|
- </template>
|
|
|
- </ElInput>
|
|
|
- </ElCol>
|
|
|
- <ElCol :md="20" style="margin-top: 20px;">
|
|
|
- <ElButton type="primary" @click="addRole">
|
|
|
- <el-icon><Plus /></el-icon>
|
|
|
- 添加</ElButton
|
|
|
- >
|
|
|
-
|
|
|
- <ElButton type="primary">查找</ElButton>
|
|
|
- </ElCol>
|
|
|
- <ElCol :md="24">
|
|
|
- <div
|
|
|
- v-for="item in roleList"
|
|
|
- :key="item.id"
|
|
|
- :class="roleId == item.id ? 'on' : 'role-item'"
|
|
|
- @click="chooseRole(item)"
|
|
|
- >
|
|
|
- <p>{{ item.name }}</p>
|
|
|
- <p>
|
|
|
- <span>{{ item.remark || "--" }}</span>
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- </ElCol>
|
|
|
- </ElFormItem>
|
|
|
- </PageMain>
|
|
|
+ <ElCol :md="20" style="margin: 10px 0">
|
|
|
+ <ElInput
|
|
|
+ v-model="roleName"
|
|
|
+ placeholder="角色名称查找"
|
|
|
+ type="text"
|
|
|
+ tabindex="1"
|
|
|
+ >
|
|
|
+ <template #prefix>
|
|
|
+ <SvgIcon name="i-ri:user-3-fill" />
|
|
|
+ </template>
|
|
|
+ </ElInput>
|
|
|
+ </ElCol>
|
|
|
+ <ElCol :md="20" style="margin: 10px 0">
|
|
|
+ <ElButton type="primary" @click="addRole">
|
|
|
+ <el-icon><Plus /></el-icon>添加
|
|
|
+ </ElButton>
|
|
|
+ <ElButton type="primary" @click="handleSearch">查找</ElButton>
|
|
|
+ </ElCol>
|
|
|
+ <ElCol :md="24" style="height: 720px; overflow-y: auto;">
|
|
|
+ <div
|
|
|
+ v-for="item in searchList"
|
|
|
+ :key="item.id"
|
|
|
+ :class="roleId == item.id ? 'on' : 'role-item'"
|
|
|
+ @click="chooseRole(item)"
|
|
|
+ >
|
|
|
+ <p>{{ item.name }}</p>
|
|
|
+ <p>
|
|
|
+ <span>{{ item.remark || "--" }}</span>
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ </ElCol>
|
|
|
</ElCol>
|
|
|
<ElCol :md="18">
|
|
|
- <PageMain class="vh100">
|
|
|
- <template #title>
|
|
|
- <div class="flex j-s a-c">
|
|
|
- <span class="strong">角色管理</span>
|
|
|
- <div>
|
|
|
- <ElButton type="primary" @click="roleSubmit">提交</ElButton>
|
|
|
- <ElButton type="danger" @click="deleteRole">删除</ElButton>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <h5>基本信息</h5>
|
|
|
- <!-- <ElCol :md="6"></ElCol> -->
|
|
|
- <ElForm
|
|
|
- :model="roleInfo"
|
|
|
- :rules="roleRules"
|
|
|
- label-width="auto"
|
|
|
- size=""
|
|
|
- style="max-width: 500px;"
|
|
|
+ <div class="flex j-s a-c" style="margin-top: 20px;">
|
|
|
+ <span class="strong">角色管理</span>
|
|
|
+ <div>
|
|
|
+ <ElButton type="primary" @click="roleSubmit(roleRef)">提交</ElButton>
|
|
|
+ <ElButton type="danger" @click="deleteRole">删除</ElButton>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <h5>基本信息</h5>
|
|
|
+ <!-- <ElCol :md="6"></ElCol> -->
|
|
|
+ <ElForm
|
|
|
+ :model="roleInfo"
|
|
|
+ :rules="roleRules"
|
|
|
+ ref="roleRef"
|
|
|
+ label-width="auto"
|
|
|
+ size=""
|
|
|
+ style="max-width: 500px;"
|
|
|
+ >
|
|
|
+ <ElFormItem prop="name" label="角色名称">
|
|
|
+ <ElInput
|
|
|
+ v-model="roleInfo.name"
|
|
|
+ placeholder="输入20个字以内的角色名称"
|
|
|
+ type="text"
|
|
|
+ tabindex="1"
|
|
|
+ >
|
|
|
+ </ElInput>
|
|
|
+ </ElFormItem>
|
|
|
+ <ElFormItem prop="deptId" label="所属机构">
|
|
|
+ <el-cascader
|
|
|
+ clearable
|
|
|
+ style="width: 100%;"
|
|
|
+ v-model="roleInfo.deptId"
|
|
|
+ :options="tableData"
|
|
|
+ :props="tableProps"
|
|
|
+ @change="deptChange"
|
|
|
+ />
|
|
|
+ </ElFormItem>
|
|
|
+ <ElFormItem prop="remark" label="角色描述">
|
|
|
+ <ElInput
|
|
|
+ v-model="roleInfo.remark"
|
|
|
+ placeholder="请输入"
|
|
|
+ type="textarea"
|
|
|
+ tabindex="2"
|
|
|
+ >
|
|
|
+ </ElInput>
|
|
|
+ </ElFormItem>
|
|
|
+ </ElForm>
|
|
|
+ <ElDivider></ElDivider>
|
|
|
+ <div style="min-height: 500px;">
|
|
|
+ <h5>角色权限
|
|
|
+ <span style=" font-size: 12px; font-weight: 400;color: #ccc;">
|
|
|
+ (该角色享有的后台模块功能权限剩余数据权限)
|
|
|
+ </span>
|
|
|
+ </h5>
|
|
|
+ <el-tabs
|
|
|
+ :tab-position="'left'"
|
|
|
+ style="height: 460px;"
|
|
|
+ class="demo-tabs"
|
|
|
>
|
|
|
- <ElFormItem prop="name" label="角色名称">
|
|
|
- <ElInput
|
|
|
- v-model="roleInfo.name"
|
|
|
- placeholder="输入20个字以内的角色名称"
|
|
|
- type="text"
|
|
|
- tabindex="1"
|
|
|
- >
|
|
|
- </ElInput>
|
|
|
- </ElFormItem>
|
|
|
- <ElFormItem prop="deptId" label="所属机构">
|
|
|
- <el-cascader
|
|
|
- clearable
|
|
|
- style="width: 100%;"
|
|
|
- v-model="roleInfo.deptId"
|
|
|
- :options="tableData"
|
|
|
- :props="tableProps"
|
|
|
- @change="deptChange"
|
|
|
+ <el-tab-pane label="菜单/操作权限">
|
|
|
+ <ElTree
|
|
|
+ style="height: 490px; overflow-y: auto;"
|
|
|
+ :data="treeData"
|
|
|
+ ref="permsRef"
|
|
|
+ :props="defaultProps"
|
|
|
+ show-checkbox
|
|
|
+ node-key="id"
|
|
|
+ :default-expand-all="true"
|
|
|
+ :default-checked-keys="checkedKeys"
|
|
|
+ @check="handleCheckChange"
|
|
|
/>
|
|
|
- </ElFormItem>
|
|
|
- <ElFormItem prop="desc" label="角色描述">
|
|
|
- <ElInput
|
|
|
- v-model="roleInfo.desc"
|
|
|
- placeholder="请输入"
|
|
|
- type="textarea"
|
|
|
- tabindex="2"
|
|
|
- >
|
|
|
- </ElInput>
|
|
|
- </ElFormItem>
|
|
|
- </ElForm>
|
|
|
- <ElDivider></ElDivider>
|
|
|
- <div style="min-height: 500px;">
|
|
|
- <h5>
|
|
|
- 角色权限<span
|
|
|
- style=" font-size: 12px; font-weight: 400;color: #ccc;"
|
|
|
- >(该角色享有的后台模块功能权限剩余数据权限)</span
|
|
|
+ </el-tab-pane>
|
|
|
+ <el-tab-pane label="组织架构权限">
|
|
|
+ <el-radio-group
|
|
|
+ v-model="roleInfo.dataMark"
|
|
|
+ @change="dataMarkChange"
|
|
|
>
|
|
|
- </h5>
|
|
|
- <el-tabs
|
|
|
- :tab-position="'left'"
|
|
|
- style="height: 500px;"
|
|
|
- class="demo-tabs"
|
|
|
- >
|
|
|
- <el-tab-pane label="菜单/操作权限">
|
|
|
- <ElTree
|
|
|
- style="max-height: 440px; overflow-y: auto;"
|
|
|
- :data="treeData"
|
|
|
- :props="defaultProps"
|
|
|
- show-checkbox
|
|
|
- node-key="id"
|
|
|
- :default-expand-all="true"
|
|
|
- :default-checked-keys="checkedKeys"
|
|
|
- @check="handleCheckChange"
|
|
|
- />
|
|
|
- </el-tab-pane>
|
|
|
- <el-tab-pane label="组织架构权限">
|
|
|
- <el-radio-group
|
|
|
- v-model="roleInfo.dataMark"
|
|
|
- @change="dataMarkChange"
|
|
|
+ <el-radio value="1" size="large">可见本机构下的数据</el-radio>
|
|
|
+ <el-radio value="2" size="large"
|
|
|
+ >可见本机构及下级机构数据</el-radio
|
|
|
>
|
|
|
- <el-radio value="1" size="large">可见本机构下的数据</el-radio>
|
|
|
- <el-radio value="2" size="large"
|
|
|
- >可见本机构及下级机构数据</el-radio
|
|
|
- >
|
|
|
- <el-radio value="3" size="large">指定机构</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- <ElTree
|
|
|
- style="max-height: 440px; overflow-y: auto;"
|
|
|
- :data="deptTreeData"
|
|
|
- :props="deptProps"
|
|
|
- show-checkbox
|
|
|
- node-key="id"
|
|
|
- :check-strictly="true"
|
|
|
- :default-expand-all="true"
|
|
|
- :default-checked-keys="roleInfo.deptIds"
|
|
|
- @check="handleDeptCheckChange"
|
|
|
- ref="deptTree"
|
|
|
- />
|
|
|
- </el-tab-pane>
|
|
|
- </el-tabs>
|
|
|
- </div>
|
|
|
- </PageMain>
|
|
|
+ <el-radio value="3" size="large">指定机构</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ <ElTree
|
|
|
+ style="max-height: 440px; overflow-y: auto;"
|
|
|
+ :data="deptTreeData"
|
|
|
+ :props="deptProps"
|
|
|
+ show-checkbox
|
|
|
+ node-key="id"
|
|
|
+ :check-strictly="true"
|
|
|
+ :default-expand-all="true"
|
|
|
+ :default-checked-keys="roleInfo.deptIds"
|
|
|
+ @check="handleDeptCheckChange"
|
|
|
+ ref="deptTree"
|
|
|
+ />
|
|
|
+ </el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
+ </div>
|
|
|
</ElCol>
|
|
|
</ElRow>
|
|
|
</div>
|
|
|
@@ -152,8 +143,9 @@ import { ref, reactive, onMounted, onBeforeMount, } from "vue";
|
|
|
import {
|
|
|
type FormRules,
|
|
|
type ElTree,
|
|
|
+ type FormInstance,
|
|
|
ElMessage,
|
|
|
- ElMessageBox,
|
|
|
+ ElMessageBox
|
|
|
} from "element-plus";
|
|
|
import {
|
|
|
preprocessRoutes,
|
|
|
@@ -163,9 +155,12 @@ import {
|
|
|
import api from "@/api";
|
|
|
const roleName = ref<string>("");
|
|
|
|
|
|
+const roleRef = ref<FormInstance>()
|
|
|
+const permsRef = ref<InstanceType<typeof ElTree>>()
|
|
|
+
|
|
|
let roleInfo = reactive<{
|
|
|
name: string;
|
|
|
- desc: string;
|
|
|
+ remark: string;
|
|
|
system: string;
|
|
|
permsId: number[];
|
|
|
perms: any[];
|
|
|
@@ -174,7 +169,7 @@ let roleInfo = reactive<{
|
|
|
dataMark: string;
|
|
|
}>({
|
|
|
name: "", //角色
|
|
|
- desc: "", //描述
|
|
|
+ remark: "", //描述
|
|
|
system: "PLATFORM", //系统
|
|
|
permsId: [], //权限id
|
|
|
perms: [], //权限标识
|
|
|
@@ -283,7 +278,7 @@ function chooseRole(item: any) {
|
|
|
.roleInfo({
|
|
|
roleId: item.id,
|
|
|
name: "",
|
|
|
- desc: "",
|
|
|
+ remark: "",
|
|
|
system: "",
|
|
|
permsId: [],
|
|
|
perms: [],
|
|
|
@@ -292,7 +287,7 @@ function chooseRole(item: any) {
|
|
|
// console.log(res);
|
|
|
roleInfo.name = res.data.name;
|
|
|
|
|
|
- roleInfo.desc = res.data.remark;
|
|
|
+ roleInfo.remark = res.data.remark;
|
|
|
roleInfo.deptId = res.data.deptId;
|
|
|
roleInfo.permsId = res.data.perms.map((val: Perm) => val.id);
|
|
|
roleInfo.perms = res.data.perms;
|
|
|
@@ -323,50 +318,80 @@ const operationType = ref("add");
|
|
|
function addRole() {
|
|
|
showRole.value = true;
|
|
|
operationType.value = "add";
|
|
|
+ roleInfo.name = ''
|
|
|
+ roleInfo.deptId = ''
|
|
|
+ roleInfo.remark = ''
|
|
|
+ roleInfo.deptIds = []
|
|
|
+ roleInfo.permsId = []
|
|
|
+ deptTree.value!.setCheckedKeys([], true)
|
|
|
+ permsRef.value!.setCheckedKeys([], true)
|
|
|
+}
|
|
|
+// 搜索
|
|
|
+let searchList = ref([])
|
|
|
+const handleSearch = () => {
|
|
|
+ searchList.value = roleList.value.filter(a => a.name.includes(roleName.value))
|
|
|
}
|
|
|
//提交角色信息
|
|
|
-function roleSubmit() {
|
|
|
- if (operationType.value == "add") {
|
|
|
- api.roleApi
|
|
|
- .roleAdd({
|
|
|
- name: roleInfo.name,
|
|
|
- desc: roleInfo.desc,
|
|
|
- system: localStorage.getItem("login_system") || "",
|
|
|
- permsId: roleInfo.permsId,
|
|
|
- perms: roleInfo.perms,
|
|
|
- deptId: roleInfo.deptId,
|
|
|
- dataScope: {
|
|
|
- deptIds: roleInfo.deptIds,
|
|
|
- dataMark: roleInfo.dataMark,
|
|
|
- },
|
|
|
- })
|
|
|
- .then((res) => {
|
|
|
- // console.log(res);
|
|
|
- ElMessage.success("操作成功");
|
|
|
- getRoleList();
|
|
|
- });
|
|
|
- } else {
|
|
|
- api.roleApi
|
|
|
- .roleUpdate({
|
|
|
- // roleId: roleInfo.id,
|
|
|
- id: roleId.value,
|
|
|
- name: roleInfo.name,
|
|
|
- desc: roleInfo.desc,
|
|
|
- system: localStorage.getItem("login_system") || "",
|
|
|
- permsId: roleInfo.permsId,
|
|
|
- perms: roleInfo.perms,
|
|
|
- deptId: roleInfo.deptId,
|
|
|
- dataScope: {
|
|
|
- deptIds: roleInfo.deptIds,
|
|
|
- dataMark: roleInfo.dataMark,
|
|
|
- },
|
|
|
- })
|
|
|
- .then((res) => {
|
|
|
- // console.log(res);
|
|
|
- ElMessage.success("操作成功");
|
|
|
- getRoleList();
|
|
|
- });
|
|
|
+async function roleSubmit(roleRef: FormInstance | undefined) {
|
|
|
+ if(!roleRef) {
|
|
|
+ roleRef.resetFields()
|
|
|
+ return
|
|
|
}
|
|
|
+ await roleRef.validate((vaild) => {
|
|
|
+ if(vaild) {
|
|
|
+ if (operationType.value == "add") {
|
|
|
+ api.roleApi
|
|
|
+ .roleAdd({
|
|
|
+ name: roleInfo.name,
|
|
|
+ remark: roleInfo.remark,
|
|
|
+ system: localStorage.getItem("login_system") || "",
|
|
|
+ permsId: roleInfo.permsId,
|
|
|
+ perms: roleInfo.perms,
|
|
|
+ deptId: roleInfo.deptId,
|
|
|
+ dataScope: {
|
|
|
+ deptIds: roleInfo.deptIds,
|
|
|
+ dataMark: roleInfo.dataMark,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ .then((res) => {
|
|
|
+ // console.log(res);
|
|
|
+ if(res.code == 200) {
|
|
|
+ ElMessage.success("操作成功");
|
|
|
+ getRoleList();
|
|
|
+ } else {
|
|
|
+ ElMessage.error(res.msg)
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ api.roleApi
|
|
|
+ .roleUpdate({
|
|
|
+ // roleId: roleInfo.id,
|
|
|
+ id: roleId.value,
|
|
|
+ name: roleInfo.name,
|
|
|
+ remark: roleInfo.remark,
|
|
|
+ system: localStorage.getItem("login_system") || "",
|
|
|
+ permsId: roleInfo.permsId,
|
|
|
+ perms: roleInfo.perms,
|
|
|
+ deptId: roleInfo.deptId,
|
|
|
+ dataScope: {
|
|
|
+ deptIds: roleInfo.deptIds,
|
|
|
+ dataMark: roleInfo.dataMark,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ .then((res) => {
|
|
|
+ // console.log(res);
|
|
|
+ if(res.code == 200) {
|
|
|
+ ElMessage.success("操作成功");
|
|
|
+ getRoleList();
|
|
|
+ } else {
|
|
|
+ ElMessage.error(res.msg)
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ ElMessage.error('请填写相关信息!')
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
//删除角色
|
|
|
function deleteRole() {
|
|
|
@@ -377,17 +402,17 @@ function deleteRole() {
|
|
|
.then((res) => {
|
|
|
console.log(res);
|
|
|
if (res.code == 200) {
|
|
|
- ElMessageBox.confirm("确认要删除当前数据吗?", "提示", {
|
|
|
+ ElMessageBox({
|
|
|
+ title: '提示',
|
|
|
+ message: '确认要删除当前数据吗?',
|
|
|
+ type: 'warning',
|
|
|
+ showCancelButton: true,
|
|
|
confirmButtonText: "确认",
|
|
|
cancelButtonText: "取消",
|
|
|
- type: "warning",
|
|
|
- })
|
|
|
- .then(() => {
|
|
|
- api.roleApi
|
|
|
- .roleDelete({
|
|
|
+ }).then(() => {
|
|
|
+ api.roleApi.roleDelete({
|
|
|
id: roleId.value,
|
|
|
- })
|
|
|
- .then((res) => {
|
|
|
+ }).then((res) => {
|
|
|
ElMessage.success("操作成功");
|
|
|
getRoleList();
|
|
|
});
|
|
|
@@ -485,12 +510,13 @@ function getRoleList() {
|
|
|
.roleList({
|
|
|
system: localStorage.getItem("login_system") || "",
|
|
|
name: "",
|
|
|
- desc: "",
|
|
|
+ remark: "",
|
|
|
permsId: [],
|
|
|
perms: [],
|
|
|
})
|
|
|
.then((res) => {
|
|
|
- roleList.value = res.data;
|
|
|
+ roleList.value = JSON.parse(JSON.stringify(res.data))
|
|
|
+ searchList.value = JSON.parse(JSON.stringify(res.data))
|
|
|
// roleId.value = res.data[0].id;
|
|
|
});
|
|
|
}
|
|
|
@@ -517,6 +543,10 @@ onMounted(() => {
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
+.role{
|
|
|
+ height: 100%;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
.roleitem {
|
|
|
padding: 20px;
|
|
|
cursor: pointer;
|