|
@@ -1,191 +1,176 @@
|
|
|
<script setup>
|
|
|
import { apiCustomerUser } from '@/api/customer'
|
|
|
+import { watch } from 'vue'
|
|
|
|
|
|
-const props=defineProps({
|
|
|
- userId:{
|
|
|
- type:[Number,String],
|
|
|
- default:''
|
|
|
+const props = defineProps({
|
|
|
+ userId: {
|
|
|
+ type: [Number, String],
|
|
|
+ default: ''
|
|
|
}
|
|
|
})
|
|
|
|
|
|
-const checkedIds = defineModel('checkedIds',{type:Array,default:[]})
|
|
|
+const checkedIds = defineModel('checkedIds', { type: Array, default: [] })
|
|
|
|
|
|
-const PublicAuth = ref([])
|
|
|
-const PrivateAuth = ref([])
|
|
|
+const opts = ref([])
|
|
|
async function getAuthData() {
|
|
|
const res = await apiCustomerUser.userPermissionData({
|
|
|
- UserId:props.userId||''
|
|
|
+ UserId: props.userId || ''
|
|
|
})
|
|
|
if (res.Ret !== 200) return
|
|
|
- const pubArr = res.Data.PublicList || []
|
|
|
- const priArr = res.Data.PrivateList || []
|
|
|
- const selectArr=res.Data.SelectedList||[]
|
|
|
- PublicAuth.value = setData(pubArr, 'public',selectArr)
|
|
|
- PrivateAuth.value = setData(priArr,'private',selectArr)
|
|
|
+ opts.value = res.Data.List || []
|
|
|
+ const selectArr = res.Data.SelectedList || []
|
|
|
+ if (selectArr.length === 0) {
|
|
|
+ opts.value.forEach(item => {
|
|
|
+ item.PublicChild && item.PublicChild.forEach(_i => {
|
|
|
+ checkedIds.value.push(_i.ChartPermissionId)
|
|
|
+ })
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ checkedIds.value = res.Data.SelectedList
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
getAuthData()
|
|
|
|
|
|
-function setData(data, type,selectArr) {
|
|
|
- let arr = []
|
|
|
- data.forEach(item => {
|
|
|
- item.Child?.forEach((_item, index) => {
|
|
|
- arr.push({
|
|
|
- ..._item,
|
|
|
- parent_permission_name: item.permission_name,
|
|
|
- rowSpan: index == 0 ? item.Child.length : 0,
|
|
|
- })
|
|
|
- if (type==='public') {
|
|
|
- if(selectArr.length===0){
|
|
|
- checkedIds.value.push(_item.chart_permission_id)
|
|
|
- }else{
|
|
|
- checkedIds.value=selectArr
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- });
|
|
|
-
|
|
|
- return arr
|
|
|
+// 二级品种选中态改变
|
|
|
+function handleSelectChange(checked, item) {
|
|
|
+ console.log('二级品种选中态改变');
|
|
|
+ if (checked) {
|
|
|
+ checkedIds.value.push(item.ChartPermissionId)
|
|
|
+ } else {
|
|
|
+ checkedIds.value = checkedIds.value.filter(i => i !== item.ChartPermissionId)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 一级品种选中态改变
|
|
|
function handleChangeLevel1(checked, item) {
|
|
|
+ console.log('一级品种选中态改变');
|
|
|
if (checked) {
|
|
|
- console.log(item.parent_id);
|
|
|
- PrivateAuth.value.forEach(_e => {
|
|
|
- if (_e.parent_id === item.parent_id) {
|
|
|
- // 将该一级品种下的二级品种id全选中
|
|
|
- if (!checkedIds.value.includes(_e.chart_permission_id)) {
|
|
|
- checkedIds.value.push(_e.chart_permission_id)
|
|
|
- }
|
|
|
+ item.PrivateChild && item.PrivateChild.forEach(_i => {
|
|
|
+ if (!checkedIds.value.includes(_i.ChartPermissionId)) {
|
|
|
+ checkedIds.value.push(_i.ChartPermissionId)
|
|
|
}
|
|
|
})
|
|
|
- } else {//取消全选
|
|
|
+ } else {
|
|
|
+ //取消全选
|
|
|
let ids = []
|
|
|
- PrivateAuth.value.forEach(_e => {
|
|
|
- if (_e.parent_id === item.parent_id) {
|
|
|
- ids.push(_e.chart_permission_id)
|
|
|
- }
|
|
|
+ item.PrivateChild && item.PrivateChild.forEach(_e => {
|
|
|
+ ids.push(_e.ChartPermissionId)
|
|
|
})
|
|
|
checkedIds.value = checkedIds.value.filter(_e => !ids.includes(_e))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// 二级品种选中态改变
|
|
|
-function handleSelectChange(checked, item) {
|
|
|
- if (checked) {
|
|
|
- checkedIds.value.push(item.chart_permission_id)
|
|
|
- } else {
|
|
|
- checkedIds.value = checkedIds.value.filter(i => i !== item.chart_permission_id)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
// 控制一级品种的状态 0全没选中 1部分选中 2全选中
|
|
|
function level1Status(item) {
|
|
|
let allCount = 0//一级品种总共有多少二级
|
|
|
let count = 0//当前有多少该一级品种下面的二级是选中的
|
|
|
- PrivateAuth.value.forEach(_e => {
|
|
|
- if (_e.parent_id === item.parent_id) {
|
|
|
- allCount++
|
|
|
- if(checkedIds.value.includes(_e.chart_permission_id)){
|
|
|
+ if (item.PublicChild) {
|
|
|
+ allCount = allCount + item.PublicChild.length
|
|
|
+ count = count + item.PublicChild.length //公有的都选中
|
|
|
+ }
|
|
|
+ if (item.PrivateChild) {
|
|
|
+ allCount = allCount + item.PrivateChild.length
|
|
|
+ item.PrivateChild.forEach(_i => {
|
|
|
+ if (checkedIds.value.includes(_i.ChartPermissionId)) {
|
|
|
count++
|
|
|
}
|
|
|
- }
|
|
|
- })
|
|
|
- if(count===0){//全没选中
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ if (count === 0) {//全没选中
|
|
|
return 0
|
|
|
- }else if(count===allCount){//全选中了
|
|
|
+ } else if (count === allCount) {//全选中了
|
|
|
return 2
|
|
|
- }else{//部分选中
|
|
|
+ } else {//部分选中
|
|
|
return 1
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-const allSelectStatus=computed(()=>{
|
|
|
- let flag=1
|
|
|
- if(PrivateAuth.value.length===(checkedIds.value.length-PublicAuth.value.length)){
|
|
|
- flag=2
|
|
|
- }
|
|
|
- return flag
|
|
|
+//全选状态 0全没选中 1部分选中 2全选中
|
|
|
+const allSelectStatus = computed(() => {
|
|
|
+
|
|
|
+ let count = 0 //总共有多少二级品种
|
|
|
+ opts.value.forEach(item => {
|
|
|
+ if (item.PublicChild) {
|
|
|
+ count = count + item.PublicChild.length
|
|
|
+ }
|
|
|
+ if (item.PrivateChild) {
|
|
|
+ count = count + item.PrivateChild.length
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ if (checkedIds.value.length === 0) return 0
|
|
|
+ if (checkedIds.value.length > 0 && checkedIds.value.length < count) return 1
|
|
|
+ if (checkedIds.value.length === count) return 2
|
|
|
})
|
|
|
|
|
|
-function handleChangeAll(checked){
|
|
|
- if(checked){
|
|
|
- PrivateAuth.value.forEach(_e=>{
|
|
|
- if(!checkedIds.value.includes(_e.chart_permission_id)){
|
|
|
- checkedIds.value.push(_e.chart_permission_id)
|
|
|
- }
|
|
|
+// 全选状态改变
|
|
|
+function handleChangeAll(checked) {
|
|
|
+ let arr=[]
|
|
|
+ opts.value.forEach(item => {
|
|
|
+ item.PublicChild?.forEach(_i=>{
|
|
|
+ arr.push(_i.ChartPermissionId)
|
|
|
})
|
|
|
- }else{
|
|
|
- let allPrivateAuthIds=PrivateAuth.value.map(_e=>_e.chart_permission_id)
|
|
|
- checkedIds.value=checkedIds.value.filter(_e=>!allPrivateAuthIds.includes(_e))
|
|
|
- }
|
|
|
+ if (checked){//权限将所有私有权限选中
|
|
|
+ item.PrivateChild?.forEach(_i=>{
|
|
|
+ arr.push(_i.ChartPermissionId)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ checkedIds.value=arr
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
<div class="permission-table-wrap">
|
|
|
- <table
|
|
|
- class="el-table table-box"
|
|
|
- width="auto"
|
|
|
- border="0"
|
|
|
- cellspacing="0"
|
|
|
- cellpadding="0"
|
|
|
+ <div class="item-wrap">
|
|
|
+ <div class="checkall-box">
|
|
|
+ <el-checkbox
|
|
|
+ :model-value="allSelectStatus === 2"
|
|
|
+ :indeterminate="allSelectStatus === 1"
|
|
|
+ @change="handleChangeAll"
|
|
|
+ >全选</el-checkbox
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class="item-wrap"
|
|
|
+ v-for="level1 in opts"
|
|
|
+ :key="level1.ChartPermissionId"
|
|
|
>
|
|
|
- <thead>
|
|
|
- <td>权限分类</td>
|
|
|
- <td>一级品种</td>
|
|
|
- <td>二级品种</td>
|
|
|
- <td>
|
|
|
- <el-checkbox
|
|
|
- :model-value="allSelectStatus===2"
|
|
|
- :indeterminate="allSelectStatus===1"
|
|
|
- @change="handleChangeAll"
|
|
|
- >全选</el-checkbox>
|
|
|
- </td>
|
|
|
- </thead>
|
|
|
- <tbody>
|
|
|
- <!-- 公有 -->
|
|
|
- <tr v-for="(item, index) in PublicAuth" :key="item.chart_permission_id">
|
|
|
- <td :rowspan="PublicAuth.length" v-if="index === 0">公有</td>
|
|
|
- <td :rowspan="item.rowSpan" v-if="item.rowSpan > 0">
|
|
|
- <span>{{ item.parent_permission_name }}</span>
|
|
|
- <!-- <el-icon><i-ep-ArrowDown /></el-icon> -->
|
|
|
- </td>
|
|
|
- <td>{{ item.permission_name }}</td>
|
|
|
- <td>
|
|
|
- <el-checkbox
|
|
|
- :model-value="checkedIds.includes(item.chart_permission_id)"
|
|
|
- disabled
|
|
|
- />
|
|
|
- </td>
|
|
|
- </tr>
|
|
|
- <!-- 私有 -->
|
|
|
- <tr
|
|
|
- v-for="(item, index) in PrivateAuth"
|
|
|
- :key="item.chart_permission_id"
|
|
|
+ <div class="checkall-box">
|
|
|
+ <el-checkbox
|
|
|
+ @change="handleChangeLevel1($event, level1)"
|
|
|
+ :model-value="level1Status(level1) === 2"
|
|
|
+ :indeterminate="level1Status(level1) === 1"
|
|
|
+ >{{ level1.PermissionName }}</el-checkbox
|
|
|
>
|
|
|
- <td :rowspan="PrivateAuth.length" v-if="index === 0">私有</td>
|
|
|
- <td :rowspan="item.rowSpan" v-if="item.rowSpan > 0">
|
|
|
- <el-checkbox
|
|
|
- :model-value="level1Status(item) === 2"
|
|
|
- :indeterminate="level1Status(item) === 1"
|
|
|
- @change="handleChangeLevel1($event, item)"
|
|
|
- >{{ item.parent_permission_name }}
|
|
|
- </el-checkbox>
|
|
|
- <!-- <el-icon><i-ep-ArrowDown /></el-icon> -->
|
|
|
- </td>
|
|
|
- <td>{{ item.permission_name }}</td>
|
|
|
- <td>
|
|
|
- <el-checkbox
|
|
|
- :model-value="checkedIds.includes(item.chart_permission_id)"
|
|
|
- @change="handleSelectChange($event, item)"
|
|
|
- />
|
|
|
- </td>
|
|
|
- </tr>
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
+ </div>
|
|
|
+ <!-- 公有权限 -->
|
|
|
+ <div class="child-box" v-if="level1.PublicChild">
|
|
|
+ <span class="label-tag pub-tag">公有</span>
|
|
|
+ <el-checkbox
|
|
|
+ :model-value="checkedIds.includes(pubitem.ChartPermissionId)"
|
|
|
+ disabled
|
|
|
+ v-for="pubitem in level1.PublicChild"
|
|
|
+ :key="pubitem.ChartPermissionId"
|
|
|
+ >{{ pubitem.PermissionName }}</el-checkbox
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <!-- 私有权限 -->
|
|
|
+ <div class="child-box" v-if="level1.PrivateChild">
|
|
|
+ <span class="label-tag pri-tag">私有</span>
|
|
|
+ <el-checkbox
|
|
|
+ :model-value="checkedIds.includes(priitem.ChartPermissionId)"
|
|
|
+ v-for="priitem in level1.PrivateChild"
|
|
|
+ :key="priitem.ChartPermissionId"
|
|
|
+ @change="handleSelectChange($event, priitem)"
|
|
|
+ >{{ priitem.PermissionName }}</el-checkbox
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -193,20 +178,29 @@ function handleChangeAll(checked){
|
|
|
.permission-table-wrap {
|
|
|
margin-top: 10px;
|
|
|
margin-left: 60px;
|
|
|
- .table-box {
|
|
|
- max-width: 800px;
|
|
|
- width: 100%;
|
|
|
- border-left: 1px solid #dcdfe6;
|
|
|
- border-bottom: 1px solid #dcdfe6;
|
|
|
- td {
|
|
|
- text-align: center;
|
|
|
- padding: 15px 0;
|
|
|
- border-top: 1px solid #dcdfe6;
|
|
|
- border-right: 1px solid #dcdfe6;
|
|
|
+ border: 1px solid #ebeff6;
|
|
|
+ .item-wrap {
|
|
|
+ border-bottom: 1px solid #ebeff6;
|
|
|
+ .checkall-box {
|
|
|
+ border-bottom: 1px solid #ebeff6;
|
|
|
+ padding: 14px 16px;
|
|
|
+ background-color: #f9faff;
|
|
|
}
|
|
|
- thead {
|
|
|
- color: var(--el-table-header-text-color);
|
|
|
- background-color: var(--el-table-header-bg-color);
|
|
|
+ .child-box {
|
|
|
+ padding: 14px 16px;
|
|
|
+ .label-tag {
|
|
|
+ display: inline-block;
|
|
|
+ padding: 2px 3px;
|
|
|
+ margin-right: 10px;
|
|
|
+ }
|
|
|
+ .pub-tag {
|
|
|
+ color: #436cff;
|
|
|
+ background-color: #d1e4ff;
|
|
|
+ }
|
|
|
+ .pri-tag {
|
|
|
+ color: #edab29;
|
|
|
+ background-color: #fffaeb;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|