fix: BUG修改

This commit is contained in:
kun 2023-09-18 18:50:22 +08:00
parent c6944d9c47
commit 67d2f901d2
16 changed files with 1703 additions and 127 deletions

1348
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -46,6 +46,7 @@
"mars3d-cesium": "^1.105.0", "mars3d-cesium": "^1.105.0",
"mitt": "^3.0.0", "mitt": "^3.0.0",
"moment": "^2.29.4", "moment": "^2.29.4",
"mqtt": "^2.18.8",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"pinia": "^2.0.28", "pinia": "^2.0.28",
"pinia-plugin-persistedstate": "^3.0.1", "pinia-plugin-persistedstate": "^3.0.1",

View File

@ -44,13 +44,13 @@
</template> </template>
<script setup lang="ts" name="TreeFilter"> <script setup lang="ts" name="TreeFilter">
import { ref, watch, onBeforeMount } from "vue"; import { ref, watch, onBeforeMount, onMounted } from "vue";
import { ElTree } from "element-plus"; import { ElTree } from "element-plus";
// //
interface TreeFilterProps { interface TreeFilterProps {
requestApi?: (data?: any) => Promise<any>; // api ==> requestApi?: (data?: any) => Promise<any>; // api ==>
data?: { [key: string]: any }[]; // api ==> data?: []; // api ==>
title?: string; // treeFilter ==> title?: string; // treeFilter ==>
id?: string; // id ==> id id?: string; // id ==> id
label?: string; // label ==> label label?: string; // label ==> label
@ -79,12 +79,11 @@ const selected = ref();
// console.log("node", node); // console.log("node", node);
// console.log("data", data); // console.log("data", data);
// }; // };
onMounted(async () => {
onBeforeMount(async () => {
// //
if (props.multiple) selected.value = Array.isArray(props.defaultValue) ? props.defaultValue : [props.defaultValue]; if (props.multiple) selected.value = Array.isArray(props.defaultValue) ? props.defaultValue : [props.defaultValue];
else selected.value = typeof props.defaultValue === "string" ? props.defaultValue : ""; else selected.value = typeof props.defaultValue === "string" ? props.defaultValue : "";
console.log(props.data);
// //
if (props.data?.length) { if (props.data?.length) {
treeData.value = props.data; treeData.value = props.data;
@ -93,11 +92,29 @@ onBeforeMount(async () => {
} }
const res = await props.requestApi!(); const res = await props.requestApi!();
console.log(res); console.log(res);
treeData.value = res || []; treeData.value = res?.result || [];
// treeAllData.value = [{ id: "", [props.label]: "" }, ...result]; // treeAllData.value = [{ id: "", [props.label]: "" }, ...result];
treeAllData.value = res ? [...res] : []; treeAllData.value = res ? [...res.result] : [];
}); });
// onBeforeMount(async () => {
// //
// if (props.multiple) selected.value = Array.isArray(props.defaultValue) ? props.defaultValue : [props.defaultValue];
// else selected.value = typeof props.defaultValue === "string" ? props.defaultValue : "";
// console.log(props.data);
// //
// if (props.data?.length) {
// treeData.value = props.data;
// treeAllData.value = props.data;
// return;
// }
// const res = await props.requestApi!();
// console.log(res);
// treeData.value = res || [];
// // treeAllData.value = [{ id: "", [props.label]: "" }, ...result];
// treeAllData.value = res ? [...res] : [];
// });
watch(filterText, val => { watch(filterText, val => {
treeRef.value!.filter(val); treeRef.value!.filter(val);

View File

@ -7,7 +7,7 @@
<div style="margin-left: 10px">消息</div> <div style="margin-left: 10px">消息</div>
</el-badge> </el-badge>
</template> </template>
<el-tabs v-model="activeName"> <el-tabs v-model="activeName" @tab-change="tabsChange">
<el-tab-pane label="通知(5)" name="first"> <el-tab-pane label="通知(5)" name="first">
<div class="message-list"> <div class="message-list">
<div class="message-item"> <div class="message-item">
@ -65,9 +65,70 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from "vue"; import { ref, onMounted, onBeforeUnmount } from "vue";
import * as mqtt from "mqtt/dist/mqtt.min.js";
const activeName = ref("first"); const activeName = ref("first");
const clientInstance = ref();
const connectOption = ref({
clean: true,
connectTimeout: 5000,
clientId: "mqtt_01",
username: "admin",
password: "JXJ@admin"
});
// tabs
const tabsChange = (val: any) => {
console.log(val);
if (val == "first") {
} else if (val == "second") {
} else if (val == "third") {
}
};
//
const createMqttConnect = () => {
console.log(666);
// const wsurl = "ws://182.90.224.147:1883";
// let wx = new WebSocket(wsurl);
// mqtt
let url = "ws://182.90.224.147:8083/mqtt";
// client.subscribe("test-topic/123");
// client.on("message", con => {
// console.log(con);
// });
//
clientInstance.value = mqtt.connect(url, connectOption.value);
// clientInstance.value.on("reconnect", error => {
// console.log("", error);
// });
clientInstance.value.on("connect", con => {
console.log("连接成功", con);
//
clientInstance.value.subscribe("test-topic/#", { qos: 1 }, (error, res) => {
console.log(error, res);
});
});
clientInstance.value.on("message", (topic, message) => {
console.log(topic, JSON.parse(message.toString()));
});
};
//
const destroyConnection = () => {
if (clientInstance.value) {
try {
clientInstance.value.end();
clientInstance.value = null;
console.log("已断开连接");
} catch (error) {
console.log("断开连接失败");
}
}
};
onMounted(() => {
createMqttConnect();
});
onBeforeUnmount(() => {
destroyConnection();
});
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -3,7 +3,7 @@
<div class="sta-item" v-for="(item, index) in statisticsOption" :key="index"> <div class="sta-item" v-for="(item, index) in statisticsOption" :key="index">
<div class="sta-item-content"> <div class="sta-item-content">
<img :src="item.img" alt="" /> <img :src="item.img" alt="" />
<span>{{ item.value }}</span> <span>{{ item.value }}{{ item.prop == "checkRatio" ? "%" : "" }}</span>
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
</div> </div>
</div> </div>
@ -202,16 +202,21 @@ const columns: ColumnProps[] = [
// //
const getCountData = async () => { const getCountData = async () => {
let requestData = {}; let requestData = {};
if (activeValue.value == "eng") { if (searchSn.value) {
requestData.engineeringSn = searchSn.value; if (activeValue.value == "eng") {
} else if (activeValue.value == "project") { requestData.engineeringSn = searchSn.value;
requestData.projectSn = searchSn.value; } else if (activeValue.value == "project") {
requestData.projectSn = searchSn.value;
}
const res = await dangerousEngineerCount(requestData);
statisticsOption.value.map(item => {
item.value = res.result[item.prop];
});
} else {
statisticsOption.value.map(item => {
item.value = 0;
});
} }
const res = await dangerousEngineerCount(requestData);
statisticsOption.value.map(item => {
item.value = res.result[item.prop];
});
console.log(res);
}; };
// //
const textTransform = (val: any) => { const textTransform = (val: any) => {

View File

@ -1383,7 +1383,7 @@ onMounted(() => {
.list-content { .list-content {
display: grid; display: grid;
// grid-template-columns: repeat(3, 1fr); // grid-template-columns: repeat(3, 1fr);
grid-template-columns: repeat(auto-fit, minmax(530px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(530px, 0fr));
grid-gap: 20px; grid-gap: 20px;
&-item { &-item {
width: 530px; width: 530px;

View File

@ -19,7 +19,7 @@
<div class="base-box" v-show="!showPage"> <div class="base-box" v-show="!showPage">
<el-form style="padding: 10% 30%" :model="baseFrom" ref="ruleFormRef" label-width="150px"> <el-form style="padding: 10% 30%" :model="baseFrom" ref="ruleFormRef" label-width="150px">
<el-form-item label="上级部门:" prop="parentId"> <el-form-item label="上级部门:" prop="parentId">
<el-select style="width: 100%" v-model="baseFrom.parentId" placeholder="请选择"> <el-select style="width: 100%" v-model="baseFrom.parentId" clearable placeholder="请选择">
<el-option v-for="item in treeDeptList" :key="item.deptId" :label="item.deptName" :value="item.deptId" /> <el-option v-for="item in treeDeptList" :key="item.deptId" :label="item.deptName" :value="item.deptId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -339,7 +339,8 @@ const formConfigDept = reactive({
label: "上级部门", label: "上级部门",
prop: "parentId", prop: "parentId",
type: "select", type: "select",
data: [] data: [],
clearable: true
}, },
{ {
label: "部门名称", label: "部门名称",

View File

@ -31,9 +31,27 @@
</template> </template>
</ProTable> </ProTable>
<el-drawer v-model="drawerVisible" :destroy-on-close="true" :before-close="closeDrawer" size="450px" title="配置权限"> <el-drawer v-model="drawerVisible" :destroy-on-close="true" :before-close="closeDrawer" size="450px" title="配置权限">
<div class="select-all">
<el-checkbox
:indeterminate="isIndeterminate"
v-model="checkAll"
@change="handleCheckAllChange"
style="padding: 0px; margin-right: 5px"
>全选</el-checkbox
>
</div>
<span class="title sle">所拥有的权限</span> <span class="title sle">所拥有的权限</span>
<el-scrollbar :style="{ height: title ? `calc(100% - 95px)` : `calc(100% - 56px)` }"> <el-scrollbar :style="{ height: title ? `calc(100% - 95px)` : `calc(100% - 56px)` }">
<el-tree ref="treeRef" default-expand-all :data="datas" show-checkbox node-key="name" :props="defaultProps"> </el-tree> <el-tree
ref="treeRef"
default-expand-all
:data="datas"
show-checkbox
node-key="name"
:props="defaultProps"
@check-change="testCheckChange"
>
</el-tree>
</el-scrollbar> </el-scrollbar>
<template #footer> <template #footer>
<div class="flx-center"> <div class="flx-center">
@ -79,7 +97,8 @@ import DialogForm from "@/components/DialogForm/index.vue";
import { Delete } from "@element-plus/icons-vue"; import { Delete } from "@element-plus/icons-vue";
import { GlobalStore } from "@/stores"; import { GlobalStore } from "@/stores";
const checkAll = ref(false);
const isIndeterminate = ref(false);
const treeRef = ref(null); const treeRef = ref(null);
const { BUTTONS } = useAuthButtons(); const { BUTTONS } = useAuthButtons();
const datas = reactive([]); const datas = reactive([]);
@ -182,7 +201,52 @@ const formConfig = {
] ]
} }
}; };
//
const testCheckChange = () => {
const tree = treeRef.value;
let checkedCount = 0;
let disabledCount = 0;
let indeterminateFlag = false;
for (let i = 0; i < datas.length; i++) {
if (tree.getNode(datas[i]).disabled == true) {
disabledCount += 1; // 1
}
if (tree.getNode(datas[i]).checked == true) {
checkedCount += 1; // 1
}
if (tree.getNode(datas[i]).indeterminate == true) {
indeterminateFlag = true; // true
}
}
if (checkedCount == 0) {
isIndeterminate.value = false;
checkAll.value = false; // 0false
if (indeterminateFlag == true) {
isIndeterminate.value = true;
checkAll.value = false;
}
} else if (checkedCount + disabledCount == datas.length) {
isIndeterminate.value = false;
checkAll.value = true;
} else {
isIndeterminate.value = true;
checkAll.value = false;
}
return;
};
const handleCheckAllChange = (val: any) => {
isIndeterminate.value = false;
if (checkAll.value == true) {
for (let i = 0; i < datas.length; i++) {
if (treeRef.value.getNode(datas[i]).disabled == false) {
console.log(datas[i].path);
treeRef.value.setChecked(datas[i].name, true, true);
}
}
} else {
treeRef.value.setCheckedKeys([]);
}
};
// dataCallback list && total && pageNum && pageSize // dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts // hooks/useTable.ts
const dataCallback = (data: any) => { const dataCallback = (data: any) => {
@ -224,11 +288,19 @@ const transfrom = (arr: Array<any>) => {
const confirm = async () => { const confirm = async () => {
const checked = treeRef.value.getCheckedNodes(); const checked = treeRef.value.getCheckedNodes();
await editRolePermissions(transfrom(checked)); const halfChecked = treeRef.value.getHalfCheckedNodes();
drawerVisible.value = false; const checkedArr = transfrom(checked);
datas.length = 0; const halfCheckedArr = transfrom(halfChecked);
const concatArr: any = checkedArr.concat(halfCheckedArr);
console.log(halfChecked);
if (!concatArr.length) {
ElMessage.error("请选择");
} else {
await editRolePermissions(transfrom(checked));
drawerVisible.value = false;
datas.length = 0;
}
}; };
// params // params
// ProTable :requestApi="getUserList" // ProTable :requestApi="getUserList"
const getTableList = (params: any) => { const getTableList = (params: any) => {
@ -264,7 +336,13 @@ const handleEditItem = async (row: any) => {
const res = await getTreeByIdList({ roleId: row.roleId }); const res = await getTreeByIdList({ roleId: row.roleId });
nextTick(() => { nextTick(() => {
treeRef.value.setCheckedKeys(res.result.map(item => item.authorityId)); treeRef.value.setCheckedKeys(
res.result.map(item => {
if (item.type != 0) {
return item.authorityId;
}
})
);
}); });
}; };

View File

@ -30,7 +30,7 @@
<div class="sta-item" v-for="(item, index) in statisticsOption" :key="index"> <div class="sta-item" v-for="(item, index) in statisticsOption" :key="index">
<div class="sta-item-content"> <div class="sta-item-content">
<img :src="item.img" alt="" /> <img :src="item.img" alt="" />
<span>{{ item.value }}</span> <span>{{ item.value }}{{ item.prop == "checkRatio" ? "%" : "" }}</span>
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
</div> </div>
</div> </div>
@ -213,16 +213,21 @@ const columns: ColumnProps[] = [
// //
const getCountData = async () => { const getCountData = async () => {
let requestData = {}; let requestData = {};
if (active.value == 0) { if (searchSn.value) {
requestData.projectSn = searchSn.value; if (active.value == 0) {
requestData.projectSn = searchSn.value;
} else {
requestData.engineeringSn = searchSn.value;
}
const res = await dangerousEngineerCount(requestData);
statisticsOption.value.map(item => {
item.value = res.result[item.prop];
});
} else { } else {
requestData.engineeringSn = searchSn.value; statisticsOption.value.map(item => {
item.value = 0;
});
} }
const res = await dangerousEngineerCount(requestData);
statisticsOption.value.map(item => {
item.value = res.result[item.prop];
});
console.log(res);
}; };
// div // div
const onSearch = async (params: any) => { const onSearch = async (params: any) => {

View File

@ -1205,7 +1205,7 @@ onMounted(() => {
.list-content { .list-content {
display: grid; display: grid;
// grid-template-columns: repeat(3, 1fr); // grid-template-columns: repeat(3, 1fr);
grid-template-columns: repeat(auto-fit, minmax(530px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(530px, 0fr));
grid-gap: 20px; grid-gap: 20px;
&-item { &-item {
width: 530px; width: 530px;

View File

@ -20,7 +20,7 @@
<div class="base-box" v-show="!showPage"> <div class="base-box" v-show="!showPage">
<el-form style="padding: 10% 30%" :model="baseFrom" ref="ruleFormRef" label-width="150px"> <el-form style="padding: 10% 30%" :model="baseFrom" ref="ruleFormRef" label-width="150px">
<el-form-item label="上级部门:" prop="parentId"> <el-form-item label="上级部门:" prop="parentId">
<el-select style="width: 100%" v-model="baseFrom.parentId" placeholder="请选择"> <el-select style="width: 100%" v-model="baseFrom.parentId" clearable placeholder="请选择">
<el-option v-for="item in treeDeptList" :key="item.deptId" :label="item.deptName" :value="item.deptId" /> <el-option v-for="item in treeDeptList" :key="item.deptId" :label="item.deptName" :value="item.deptId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -130,7 +130,6 @@ import {
} from "@/api/modules/goverment"; } from "@/api/modules/goverment";
import DialogForm from "@/components/DialogForm/index.vue"; import DialogForm from "@/components/DialogForm/index.vue";
import { jxj_User } from "@/api/types"; import { jxj_User } from "@/api/types";
const router = useRouter(); const router = useRouter();
const title = ref(""); const title = ref("");
const visible = ref(false); const visible = ref(false);
@ -403,7 +402,6 @@ const formConfigDept = reactive({
] ]
} }
}); });
// params // params
// ProTable :requestApi="getUserList" // ProTable :requestApi="getUserList"
const getTableList = (params: any) => { const getTableList = (params: any) => {

View File

@ -31,10 +31,28 @@
</template> </template>
</ProTable> </ProTable>
<el-drawer v-model="drawerVisible" :destroy-on-close="true" :before-close="closeDrawer" size="450px" title="配置权限"> <el-drawer v-model="drawerVisible" :destroy-on-close="true" :before-close="closeDrawer" size="450px" title="配置权限">
<div class="select-all">
<el-checkbox
:indeterminate="isIndeterminate"
v-model="checkAll"
@change="handleCheckAllChange"
style="padding: 0px; margin-right: 5px"
>全选</el-checkbox
>
</div>
<span class="title sle">所拥有的权限</span> <span class="title sle">所拥有的权限</span>
<el-scrollbar :style="{ height: title ? `calc(100% - 95px)` : `calc(100% - 56px)` }"> <el-scrollbar :style="{ height: title ? `calc(100% - 95px)` : `calc(100% - 56px)` }">
<!-- check-strictly 父子不关联 这样数据选择父 子不会默认被勾选 子被选择 父也不会 --> <!-- check-strictly 父子不关联 这样数据选择父 子不会默认被勾选 子被选择 父也不会 -->
<el-tree ref="treeRef" default-expand-all :data="datas" show-checkbox node-key="name" :props="defaultProps"> </el-tree> <el-tree
ref="treeRef"
default-expand-all
:data="datas"
show-checkbox
node-key="name"
:props="defaultProps"
@check-change="testCheckChange"
>
</el-tree>
</el-scrollbar> </el-scrollbar>
<template #footer> <template #footer>
<div class="flx-center"> <div class="flx-center">
@ -81,7 +99,8 @@ import DialogForm from "@/components/DialogForm/index.vue";
import { Delete } from "@element-plus/icons-vue"; import { Delete } from "@element-plus/icons-vue";
import { GlobalStore } from "@/stores"; import { GlobalStore } from "@/stores";
const checkAll = ref(false);
const isIndeterminate = ref(false);
const treeRef = ref(null); const treeRef = ref(null);
const datas = reactive([]); const datas = reactive([]);
@ -191,7 +210,52 @@ const formConfig = {
] ]
} }
}; };
//
const testCheckChange = () => {
const tree = treeRef.value;
let checkedCount = 0;
let disabledCount = 0;
let indeterminateFlag = false;
for (let i = 0; i < datas.length; i++) {
if (tree.getNode(datas[i]).disabled == true) {
disabledCount += 1; // 1
}
if (tree.getNode(datas[i]).checked == true) {
checkedCount += 1; // 1
}
if (tree.getNode(datas[i]).indeterminate == true) {
indeterminateFlag = true; // true
}
}
if (checkedCount == 0) {
isIndeterminate.value = false;
checkAll.value = false; // 0false
if (indeterminateFlag == true) {
isIndeterminate.value = true;
checkAll.value = false;
}
} else if (checkedCount + disabledCount == datas.length) {
isIndeterminate.value = false;
checkAll.value = true;
} else {
isIndeterminate.value = true;
checkAll.value = false;
}
return;
};
const handleCheckAllChange = (val: any) => {
isIndeterminate.value = false;
if (checkAll.value == true) {
for (let i = 0; i < datas.length; i++) {
if (treeRef.value.getNode(datas[i]).disabled == false) {
console.log(datas[i].path);
treeRef.value.setChecked(datas[i].name, true, true);
}
}
} else {
treeRef.value.setCheckedKeys([]);
}
};
// dataCallback list && total && pageNum && pageSize // dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts // hooks/useTable.ts
const dataCallback = (data: any) => { const dataCallback = (data: any) => {
@ -230,14 +294,21 @@ const transfrom = (arr: Array<any>) => {
}) })
.concat(result); .concat(result);
}; };
const confirm = async () => { const confirm = async () => {
const checked = treeRef.value.getCheckedNodes(); const checked = treeRef.value.getCheckedNodes();
await editRolePermissions(transfrom(checked)); const halfChecked = treeRef.value.getHalfCheckedNodes();
drawerVisible.value = false; const checkedArr = transfrom(checked);
datas.length = 0; const halfCheckedArr = transfrom(halfChecked);
const concatArr: any = checkedArr.concat(halfCheckedArr);
console.log(halfChecked);
if (!concatArr.length) {
ElMessage.error("请选择");
} else {
await editRolePermissions(transfrom(checked));
drawerVisible.value = false;
datas.length = 0;
}
}; };
// params // params
// ProTable :requestApi="getUserList" // ProTable :requestApi="getUserList"
const getTableList = (params: any) => { const getTableList = (params: any) => {
@ -278,7 +349,13 @@ const handleEditItem = async (row: any) => {
const res = await getTreeByIdList({ roleId: row.roleId }); const res = await getTreeByIdList({ roleId: row.roleId });
// //
nextTick(() => { nextTick(() => {
treeRef.value.setCheckedKeys(res.result.map(item => item.authorityId)); treeRef.value.setCheckedKeys(
res.result.map(item => {
if (item.type != 0) {
return item.authorityId;
}
})
);
}); });
}; };

View File

@ -3,7 +3,7 @@
<div class="sta-item" v-for="(item, index) in statisticsOption" :key="index"> <div class="sta-item" v-for="(item, index) in statisticsOption" :key="index">
<div class="sta-item-content"> <div class="sta-item-content">
<img :src="item.img" alt="" /> <img :src="item.img" alt="" />
<span>{{ item.value }}</span> <span>{{ item.value }}{{ item.prop == "checkRatio" ? "%" : "" }}</span>
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
</div> </div>
</div> </div>
@ -209,16 +209,21 @@ const columns: ColumnProps[] = [
// //
const getCountData = async () => { const getCountData = async () => {
let requestData = {}; let requestData = {};
if (activeValue.value == "eng") { if (searchSn.value) {
requestData.engineeringSn = searchSn.value; if (activeValue.value == "eng") {
} else if (activeValue.value == "project") { requestData.engineeringSn = searchSn.value;
requestData.projectSn = searchSn.value; } else if (activeValue.value == "project") {
requestData.projectSn = searchSn.value;
}
const res = await dangerousEngineerCount(requestData);
statisticsOption.value.map(item => {
item.value = res.result[item.prop];
});
} else {
statisticsOption.value.map(item => {
item.value = 0;
});
} }
const res = await dangerousEngineerCount(requestData);
statisticsOption.value.map(item => {
item.value = res.result[item.prop];
});
console.log(res);
}; };
// //
const textTransform = (val: any) => { const textTransform = (val: any) => {
@ -239,6 +244,10 @@ const confirmAdd = () => {
}; };
// //
const handleAddItem = () => { const handleAddItem = () => {
if (!searchSn.value) {
ElMessage.error("请先选择工程/项目");
return;
}
addVisible.value = true; addVisible.value = true;
}; };
// //
@ -302,6 +311,8 @@ const getProject = async () => {
engList.value = [res.result]; engList.value = [res.result];
if (res.result) { if (res.result) {
searchSn.value = res.result.projectSn; searchSn.value = res.result.projectSn;
} else {
searchSn.value = "";
} }
proTable.value.getTableList(); proTable.value.getTableList();
console.log(res); console.log(res);
@ -312,6 +323,8 @@ const getengineering = async () => {
engList.value = res.result; engList.value = res.result;
if (res.result && res.result.length > 0) { if (res.result && res.result.length > 0) {
searchSn.value = res.result[0].engineeringSn; searchSn.value = res.result[0].engineeringSn;
} else {
searchSn.value = "";
} }
proTable.value.getTableList(); proTable.value.getTableList();
console.log(res); console.log(res);

View File

@ -1048,7 +1048,7 @@ onMounted(() => {
.list-content { .list-content {
display: grid; display: grid;
// grid-template-columns: repeat(3, 1fr); // grid-template-columns: repeat(3, 1fr);
grid-template-columns: repeat(auto-fit, minmax(530px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(530px, 0fr));
grid-gap: 20px; grid-gap: 20px;
&-item { &-item {
width: 530px; width: 530px;

View File

@ -19,7 +19,7 @@
<div class="base-box" v-show="!showPage"> <div class="base-box" v-show="!showPage">
<el-form style="padding: 10% 30%" :model="baseFrom" ref="ruleFormRef" label-width="150px"> <el-form style="padding: 10% 30%" :model="baseFrom" ref="ruleFormRef" label-width="150px">
<el-form-item label="上级部门:" prop="parentId"> <el-form-item label="上级部门:" prop="parentId">
<el-select style="width: 100%" v-model="baseFrom.parentId" placeholder="请选择"> <el-select style="width: 100%" v-model="baseFrom.parentId" clearable placeholder="请选择">
<el-option v-for="item in treeDeptList" :key="item.deptId" :label="item.deptName" :value="item.deptId" /> <el-option v-for="item in treeDeptList" :key="item.deptId" :label="item.deptName" :value="item.deptId" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -339,7 +339,8 @@ const formConfigDept = reactive({
label: "上级部门", label: "上级部门",
prop: "parentId", prop: "parentId",
type: "select", type: "select",
data: [] data: [],
clearable: true
}, },
{ {
label: "部门名称", label: "部门名称",

View File

@ -31,9 +31,27 @@
</template> </template>
</ProTable> </ProTable>
<el-drawer v-model="drawerVisible" :destroy-on-close="true" :before-close="closeDrawer" size="450px" title="配置权限"> <el-drawer v-model="drawerVisible" :destroy-on-close="true" :before-close="closeDrawer" size="450px" title="配置权限">
<div class="select-all">
<el-checkbox
:indeterminate="isIndeterminate"
v-model="checkAll"
@change="handleCheckAllChange"
style="padding: 0px; margin-right: 5px"
>全选</el-checkbox
>
</div>
<span class="title sle">所拥有的权限</span> <span class="title sle">所拥有的权限</span>
<el-scrollbar :style="{ height: title ? `calc(100% - 95px)` : `calc(100% - 56px)` }"> <el-scrollbar :style="{ height: title ? `calc(100% - 95px)` : `calc(100% - 56px)` }">
<el-tree ref="treeRef" default-expand-all :data="datas" show-checkbox node-key="name" :props="defaultProps"> </el-tree> <el-tree
ref="treeRef"
default-expand-all
:data="datas"
show-checkbox
node-key="name"
:props="defaultProps"
@check-change="testCheckChange"
>
</el-tree>
</el-scrollbar> </el-scrollbar>
<template #footer> <template #footer>
<div class="flx-center"> <div class="flx-center">
@ -80,7 +98,8 @@ import DialogForm from "@/components/DialogForm/index.vue";
import { Delete } from "@element-plus/icons-vue"; import { Delete } from "@element-plus/icons-vue";
import { GlobalStore } from "@/stores"; import { GlobalStore } from "@/stores";
const checkAll = ref(false);
const isIndeterminate = ref(false);
const treeRef = ref(null); const treeRef = ref(null);
const datas = reactive([]); const datas = reactive([]);
@ -183,7 +202,52 @@ const formConfig = {
] ]
} }
}; };
//
const testCheckChange = () => {
const tree = treeRef.value;
let checkedCount = 0;
let disabledCount = 0;
let indeterminateFlag = false;
for (let i = 0; i < datas.length; i++) {
if (tree.getNode(datas[i]).disabled == true) {
disabledCount += 1; // 1
}
if (tree.getNode(datas[i]).checked == true) {
checkedCount += 1; // 1
}
if (tree.getNode(datas[i]).indeterminate == true) {
indeterminateFlag = true; // true
}
}
if (checkedCount == 0) {
isIndeterminate.value = false;
checkAll.value = false; // 0false
if (indeterminateFlag == true) {
isIndeterminate.value = true;
checkAll.value = false;
}
} else if (checkedCount + disabledCount == datas.length) {
isIndeterminate.value = false;
checkAll.value = true;
} else {
isIndeterminate.value = true;
checkAll.value = false;
}
return;
};
const handleCheckAllChange = (val: any) => {
isIndeterminate.value = false;
if (checkAll.value == true) {
for (let i = 0; i < datas.length; i++) {
if (treeRef.value.getNode(datas[i]).disabled == false) {
console.log(datas[i].path);
treeRef.value.setChecked(datas[i].name, true, true);
}
}
} else {
treeRef.value.setCheckedKeys([]);
}
};
// dataCallback list && total && pageNum && pageSize // dataCallback list && total && pageNum && pageSize
// hooks/useTable.ts // hooks/useTable.ts
const dataCallback = (data: any) => { const dataCallback = (data: any) => {
@ -225,9 +289,18 @@ const transfrom = (arr: Array<any>) => {
const confirm = async () => { const confirm = async () => {
const checked = treeRef.value.getCheckedNodes(); const checked = treeRef.value.getCheckedNodes();
await editRolePermissions(transfrom(checked)); const halfChecked = treeRef.value.getHalfCheckedNodes();
drawerVisible.value = false; const checkedArr = transfrom(checked);
datas.length = 0; const halfCheckedArr = transfrom(halfChecked);
const concatArr: any = checkedArr.concat(halfCheckedArr);
console.log(halfChecked);
if (!concatArr.length) {
ElMessage.error("请选择");
} else {
await editRolePermissions(concatArr);
drawerVisible.value = false;
datas.length = 0;
}
}; };
// params // params
@ -265,7 +338,13 @@ const handleEditItem = async (row: any) => {
const res = await getTreeByIdList({ roleId: row.roleId }); const res = await getTreeByIdList({ roleId: row.roleId });
nextTick(() => { nextTick(() => {
treeRef.value.setCheckedKeys(res.result.map(item => item.authorityId)); treeRef.value.setCheckedKeys(
res.result.map(item => {
if (item.type != 0) {
return item.authorityId;
}
})
);
}); });
}; };