组件整体结构样式
接口数据格式为树形结构 right:1 标记为当前项为选中状态,right:0标记为没选中状态。
首先安装并引用 在main.ts 里面
npm install vxe-table
import { App, createApp } from 'vue'
import { Column, Checkbox, Table } from 'vxe-table'//按需引入
import 'vxe-table/lib/style.css'
function useTable(app: App) {
app.use(Column).use(Checkbox).use(Table)
}
createApp(App).use(useTable).mount('#app')
html结构
<div>
<div>
<p><span class="w-[90px] inline-block text-right">分组名称:</span>
<Input :disabled="isViewDetails" v-model:value="name" style="width: 180px" />
</p>
<p><span class="w-[90px] inline-block text-right">描述:</span><Input :disabled="isViewDetails"
v-model:value="intro" style="width: 180px" />
</p>
<p><span class="w-[90px] inline-block text-right">权限控制:</span>
<RadioGroup :value="type" @change="changeAuthType" button-style="solid">
<Radio value="1">WEB</Radio>
<Radio value="0">APP</Radio>
</RadioGroup>
</p>
</div>
<Tabs v-model:activeKey="activeKey">
<Tabs.TabPane v-for="item in tabsData" :key="item.id" :tab="item.name" />
</Tabs>
<vxe-table border height="600" :scroll-y="{ enabled: false }" :span-method="rowspanMethod"
:data="authority.tableData" :show-header="false" :editable="true">
<vxe-column v-for="(item, index) in vxeColumnList" :field="item.field" :key="index">
<template #default="{ row }">
<vxe-checkbox :disabled="isViewDetails" v-if="row['name' + (index + 1)]"
v-model="row['check' + (index + 1)]"
@change="checkChangeEvent(row, row['check' + (index + 1)], index + 1)">{{ row['name' + (index + 1)]
}}</vxe-checkbox>
</template>
</vxe-column>
</vxe-table>
</div>
script
<script lang="ts" setup name="MaintainAuthorizationsModel">
import {
onMounted,
onUnmounted,
ref,
watchEffect,
reactive,
onActivated,
onDeactivated,
} from 'vue'
import { Tabs, Input, RadioGroup, Radio } from 'ant-design-vue'
import { useModal, BasicModal } from '/@/components/Modal'
import { getAuthorityListNewApi, editAuthorityApi, addGroupApi } from '/@/api/setting/account'
import { useMessage } from '/@/hooks/web/useMessage'
import { VxeTablePropTypes } from 'vxe-table'
import XEUtils from 'xe-utils'
import emitter from '/@/logics/eventBus'
const [modalRegister, { openModal }] = useModal()
const { createMessage } = useMessage()
const authority = reactive({
tableData: [] as any[],
})
const intro = ref('')
const name = ref('')
const type = ref('1')
const activeKey = ref('')//当前激活的Tabs
const tabsData = ref([]) // tabsData Tabs菜单模块
const oldData = ref([])
const vxeColumnList: any = ref([])//表格数据
const permissionGroundId = ref('')
const isViewDetails = ref(false)
const keepRecords = ref({})//记录每次勾选或者取消的数据,避免切换tabs时数据丢失
const changeAuthType = (val) => {
type.value = val.target.value
getAuthorityListNew()
}
//树形结构转成平铺数组
const treeToArr = (data, pid = null, res: any = []) => {
let list = keepRecords.value[activeKey.value]?.records || []
data.forEach((item) => {
if (list && list.length !== 0) {
const record = list.find((el) => el.id === item.id)
res.push({
parentId: pid,
id: item.id,
name: item.name,
right: record ? Number(record.checke) + '' : item.right,
})
} else {
res.push({ parentId: pid, id: item.id, name: item.name, right: item.right })
}
if (item.children && item.children.length !== 0) {
treeToArr(item.children, item.id, res)
}
})
return res
}
//合并数据
const mergeArrays = (arr1, arr2) => {
const merged = [...arr1] // 创建新数组并复制第一个数组的元素
for (const element2 of arr2) {
const index = merged.findIndex((element1) => element1.id === element2.id)
if (index !== -1) {
merged[index] = element2 // 使用第二个数组的元素替换相同ID的元素
} else {
merged.push(element2) // 将第二个数组中不存在的元素添加到新数组
}
}
return merged
}
//每项数据勾选或取消时记录操作
const setKeepRecords = () => {
let list: any = []
for (let i = 0; i < oldData.value.length; i++) {
for (let j = 1; j < vxeColumnList.value.length + 1; j++) {
if (oldData.value[i].hasOwnProperty(['check' + j])) {
if (authority.tableData[i]['check' + j] != oldData.value[i]['check' + j]) {
list.push({
checke: Boolean(authority.tableData[i]['check' + j]),
id: authority.tableData[i]['id' + j],
})
}
}
}
}
keepRecords.value[activeKey.value].records = mergeArrays(
keepRecords.value[activeKey.value].records,
list,
)
}
//第5级
const check5ChangeEvent = (row: any, checked: boolean) => {
let childList = authority.tableData.filter(
(item) => item.id4 === row.id4 && item.name5 === row.name5,
)
childList.forEach((item) => {
item.check5 = checked
item.right = String(Number(checked))
})
}
//第4级
const check4ChangeEvent = (row: any, checked: boolean) => {
let childList = authority.tableData.filter(
(item) => item.id3 === row.id3 && item.name4 === row.name4,
)
childList.forEach((item) => {
item.check4 = checked
item.right = String(Number(checked))
})
childList = authority.tableData.filter((item) => item.id4 === row.id4)
childList.forEach((item) => {
check5ChangeEvent(item, checked)
})
}
//第3级
const check3ChangeEvent = (row: any, checked: boolean) => {
let childList = authority.tableData.filter(
(item) => item.id3 === row.id3 && item.name3 === row.name3,
)
childList.forEach((item) => {
item.check3 = checked
item.right = String(Number(checked))
})
childList = authority.tableData.filter((item) => item.id3 === row.id3)
childList.forEach((item) => {
check4ChangeEvent(item, checked)
})
}
//第2级
const check2ChangeEvent = (row: any, checked: boolean) => {
let childList = authority.tableData.filter(
(item) => item.id1 === row.id1 && item.name2 === row.name2,
)
childList.forEach((item) => {
item.check2 = checked
item.right = String(Number(checked))
})
childList = authority.tableData.filter((item) => item.id2 === row.id2)
childList.forEach((item) => {
check3ChangeEvent(item, checked)
})
}
//第 1 级
const check1ChangeEvent = (row: any, checked: boolean) => {
let childList = authority.tableData.filter(
(item) => item.name1 === row.name1 && item.id1 !== row.id1, // Exclude the current row
)
childList.forEach((item) => {
item.check1 = checked
item.right = String(Number(checked))
})
childList = authority.tableData.filter((item) => item.id1 === row.id1)
childList.forEach((item) => {
check2ChangeEvent(item, checked)
})
}
//checkbox 状态改变时触发的事件
const checkChangeEvent = (row: any, checked: boolean, level) => {
//console.log(row,checked)
if (level === 1) {
check1ChangeEvent(row, checked)
}
if (level === 2) {
check2ChangeEvent(row, checked)
}
if (level === 3) {
check3ChangeEvent(row, checked)
}
if (level === 4) {
check4ChangeEvent(row, checked)
}
if (level === 5) {
check5ChangeEvent(row, checked)
}
if (row.right == '1') {//right==='1' 为选中状态, 就把父级勾选
for (let i = 1; i < level; i++) {
row[`check` + i] = true
}
}
setKeepRecords()
}
const setVxeColumnList = (list) => {
let maxLevel = getLevel(list)
vxeColumnList.value = []
for (let i = 1; i <= maxLevel; i++) {
vxeColumnList.value.push({
field: 'name' + i,
level: i,
})
}
}
//数据转换为table表格渲染的数据
const toColTreeData = (treeData: any[]) => {
const options = { children: 'children' }
const list: any[] = []
const keyMap: any = {}
XEUtils.eachTree(
treeData,
(item, index, result, paths, parent) => {
keyMap[item.id] = item
item.keys = parent ? parent.keys.concat([item.id]) : [item.id]
if (!item.children || !item.children.length) {
const row: any = {}
item.keys.forEach((key: any, index: number) => {
const level = index + 1
const obj = keyMap[key]
row[`check${level}`] = obj.right == '1'
row[`id${level}`] = obj.id
row[`name${level}`] = obj.name
row['right'] = obj.right
})
list.push(row)
}
},
options,
)
oldData.value = JSON.parse(JSON.stringify(list))
authority.tableData = list
}
// 通用行合并函数(将相同多列数据合并为一行)
const rowspanMethod: VxeTablePropTypes.SpanMethod = ({ row, _rowIndex, column, visibleData }) => {
const fields = vxeColumnList.value.map((item: any) => item.field)
const cellValue = row[column.field]
if (cellValue && fields.includes(column.field)) {
const prevRow = visibleData[_rowIndex - 1]
let nextRow = visibleData[_rowIndex + 1]
if (prevRow && prevRow[column.field] === cellValue) {
return { rowspan: 0, colspan: 0 }
} else {
let countRowspan = 1
while (nextRow && nextRow[column.field] === cellValue) {
nextRow = visibleData[++countRowspan + _rowIndex]
}
if (countRowspan > 1) {
return { rowspan: countRowspan, colspan: 1 }
}
}
}
}
// 计算最多层级
const getLevel = (arr) => {
let maxLevel = 0
; (function callBack(arr, level) {
++level
maxLevel = Math.max(level, maxLevel)
for (let i = 0; i < arr.length; i++) {
let item = arr[i]
if (item.children && item.children.length > 0) {
callBack(item.children, level)
} else {
delete item.children
}
}
})(arr, 0)
return maxLevel
}
//监听 activeKey 变化 从新设置vxetable表格数据
watchEffect(() => {
const list = tabsData.value.filter((item) => item.id == activeKey.value)
vxeColumnList.value = []
setVxeColumnList(JSON.parse(JSON.stringify(list)))
const treeData = XEUtils.toArrayTree(treeToArr(list))
toColTreeData(treeData)
})
// 获取菜单数据
const getAuthorityListNew = async () => {
const result = await getAuthorityListNewApi({
id: permissionGroundId.value,
is_web: type.value,
})
// resul数据格式见下方
result.auth.forEach((item) => {
// 初始化缓存 结构
keepRecords.value[item.id] = { id: item.id, name: item.name, records: [] }
})
activeKey.value = result.auth[0].id //取第一项
tabsData.value = result.auth
name.value = result.name
intro.value = result.intro
}
const handleEdit = async () => {
if (isViewDetails.value) return
if (name.value == '') {
createMessage.warning('请输入分组名称')
return
}
if (intro.value == '') {
createMessage.warning('请输入描述')
return
}
let authAdd = [] //勾选的数据
let authDel = [] //取消的数据
Object.values(keepRecords.value).forEach((item) => {
if (item && item.records && item.records.length > 0) {
item.records.forEach((el) => {
if (el.checke) {
authAdd.indexOf(el.id) == -1 ? authAdd.push(el.id) : ''
} else {
authDel.indexOf(el.id) == -1 ? authDel.push(el.id) : ''
}
})
}
})
let result: any = {}
if (permissionGroundId.value != '0') { //编辑
let params = {
id: permissionGroundId.value,
name: name.value,
intro: intro.value,
auth_add: authAdd.join(','),
auth_del: authDel.join(','),
}
result = await editAuthorityApi(params)
} else { // 新增
let params = {
name: name.value,
intro: intro.value,
auth_id: authAdd.join(','),
}
result = await addGroupApi(params)
}
if (result.code == 1) {
getAuthorityListNew()
createMessage.success(result.message)
emitter.emit('reload')
} else {
createMessage.error(result.message)
}
}
onMounted(() => {})
onActivated(() => {
emitter.on('ShowMaintainAuthorizationsModel', ({ id, isDetails = false }) => {
permissionGroundId.value = id
isViewDetails.value = isDetails
getAuthorityListNew()
})
})
</script>
勾选 子账户记录 时父级和子级同时勾中。在checkChangeEvent事件里面可以看到数据的展示(因为接口传参时 也许要需要父级的id,顾子级勾选时父级同样需要勾选)
取消勾选 子账户记录 时子级同时取消勾选。在checkChangeEvent事件里面可以看到数据的展示
{
"auth": [
{
"id": "10",
"name": "信息管理",
"right": "0",
"children": [
{
"id": "18",
"name": "门店信息",
"right": "0",
"children": [
{
"id": "42",
"name": "搜索门店",
"right": "0"
},
{
"id": "43",
"name": "新增门店",
"right": "0"
},
{
"id": "44",
"name": "编辑门店",
"right": "0"
},
{
"id": "46",
"name": "区域管理",
"right": "0"
},
{
"id": "223",
"name": "参数设置",
"right": "0"
},
{
"id": "544",
"name": "终端报备",
"right": "0"
}
]
},
{
"id": "19",
"name": "机台信息",
"right": "0",
"children": [
{
"id": "49",
"name": "搜索机台",
"right": "0"
},
{
"id": "51",
"name": "查看",
"right": "0",
"children": [
{
"id": "68",
"name": "补换货",
"right": "0"
},
{
"id": "96",
"name": "基础参数",
"right": "0"
},
{
"id": "97",
"name": "运营参数",
"right": "0"
},
{
"id": "201",
"name": "报警参数",
"right": "0",
"children": [
{
"id": "482",
"name": "编辑",
"right": "0"
}
]
},
{
"id": "338",
"name": "远程开关机",
"right": "0"
},
{
"id": "339",
"name": "远程开门",
"right": "0"
},
{
"id": "366",
"name": "其他参数设置",
"right": "0"
},
{
"id": "405",
"name": "重置局数",
"right": "0"
},
{
"id": "406",
"name": "下发强抓",
"right": "0"
},
{
"id": "545",
"name": "本地参数日志",
"right": "0"
},
{
"id": "546",
"name": "下发指令",
"right": "0"
},
{
"id": "575",
"name": "机型配置",
"right": "0"
}
]
},
{
"id": "275",
"name": "套餐设置",
"right": "0"
},
{
"id": "276",
"name": "解锁",
"right": "0"
},
{
"id": "365",
"name": "编辑(售票机/兑币机)",
"right": "0"
}
]
},
{
"id": "20",
"name": "礼品信息",
"right": "0",
"children": [
{
"id": "54",
"name": "搜索礼品",
"right": "0"
},
{
"id": "216",
"name": "礼品参数配置",
"right": "0",
"children": [
{
"id": "423",
"name": "平台礼品编辑",
"right": "0"
},
{
"id": "424",
"name": "自采礼品编辑",
"right": "0"
}
]
},
{
"id": "224",
"name": "编辑价格",
"right": "0"
}
]
},
{
"id": "22",
"name": "品牌信息",
"right": "0",
"children": [
{
"id": "208",
"name": "详情",
"right": "0"
},
{
"id": "209",
"name": "编辑子品牌",
"right": "0"
},
{
"id": "210",
"name": "删除子品牌",
"right": "0"
},
{
"id": "211",
"name": "新增子品牌",
"right": "0"
},
{
"id": "212",
"name": "母品牌管理",
"right": "0"
}
]
},
{
"id": "138",
"name": "供货商信息",
"right": "0",
"children": [
{
"id": "139",
"name": "新增供货商",
"right": "0"
},
{
"id": "140",
"name": "删除供货商",
"right": "0"
},
{
"id": "141",
"name": "编辑供货商",
"right": "0"
}
]
},
{
"id": "144",
"name": "仓库信息",
"right": "0",
"children": [
{
"id": "145",
"name": "新增仓库",
"right": "0"
},
{
"id": "146",
"name": "编辑仓库",
"right": "0"
},
{
"id": "147",
"name": "删除仓库",
"right": "0"
}
]
},
{
"id": "370",
"name": "设备信息",
"right": "0",
"children": [
{
"id": "371",
"name": "旧机型维护",
"right": "0",
"children": [
{
"id": "372",
"name": "机型配置",
"right": "0",
"children": [
{
"id": "373",
"name": "新增配置信息",
"right": "0"
},
{
"id": "374",
"name": "删除配置信息",
"right": "0"
},
{
"id": "375",
"name": "修改配置信息",
"right": "0"
}
]
},
{
"id": "376",
"name": "新增机型",
"right": "0"
},
{
"id": "377",
"name": "编辑机型",
"right": "0"
}
]
},
{
"id": "390",
"name": "固件管理",
"right": "0",
"children": [
{
"id": "386",
"name": "固件更新",
"right": "0",
"children": [
{
"id": "387",
"name": "新增配置",
"right": "0"
},
{
"id": "388",
"name": "批量更新",
"right": "0"
},
{
"id": "389",
"name": "删除",
"right": "0"
},
{
"id": "391",
"name": "查看",
"right": "0"
},
{
"id": "392",
"name": "任务删除",
"right": "0"
}
]
}
]
},
{
"id": "558",
"name": "厂家管理",
"right": "0",
"children": [
{
"id": "559",
"name": "新增厂家",
"right": "0"
}
]
},
{
"id": "560",
"name": "新机型管理",
"right": "0",
"children": [
{
"id": "561",
"name": "新增",
"right": "0"
},
{
"id": "562",
"name": "编辑",
"right": "0"
}
]
},
{
"id": "563",
"name": "配置单管理",
"right": "0",
"children": [
{
"id": "564",
"name": "查看",
"right": "0"
},
{
"id": "565",
"name": "编辑",
"right": "0"
},
{
"id": "566",
"name": "删除",
"right": "0"
},
{
"id": "567",
"name": "新增",
"right": "0"
},
{
"id": "568",
"name": "配置项维护",
"right": "0",
"children": [
{
"id": "569",
"name": "新增",
"right": "0"
},
{
"id": "570",
"name": "配置子项编辑",
"right": "0"
},
{
"id": "571",
"name": "编辑",
"right": "0"
}
]
}
]
},
{
"id": "578",
"name": "升级管理",
"right": "0",
"children": [
{
"id": "579",
"name": "查看类",
"right": "0"
},
{
"id": "580",
"name": "编辑类",
"right": "0"
}
]
}
]
},
{
"id": "470",
"name": "入账方管理",
"right": "0",
"children": [
{
"id": "463",
"name": "入账方信息",
"right": "0",
"children": [
{
"id": "465",
"name": "新增入账方",
"right": "0"
}
]
},
{
"id": "466",
"name": "入账方收入",
"right": "0"
},
{
"id": "472",
"name": "收入详情",
"right": "0"
},
{
"id": "474",
"name": "入账方子账号管理",
"right": "0",
"children": [
{
"id": "475",
"name": "子账号记录",
"right": "0",
"children": [
{
"id": "476",
"name": "子账号添加",
"right": "0"
},
{
"id": "477",
"name": "子账号删除",
"right": "0"
}
]
}
]
}
]
},
{
"id": "551",
"name": "积分商城管理",
"right": "0",
"children": [
{
"id": "552",
"name": "商城礼品管理",
"right": "0"
},
{
"id": "553",
"name": "首页轮播图管理",
"right": "0"
},
{
"id": "554",
"name": "参数配置",
"right": "0"
},
{
"id": "581",
"name": "门店礼品同步",
"right": "0"
}
]
}
]
},
{
"id": "79",
"name": "礼品库存管理",
"right": "0",
"children": [
{
"id": "81",
"name": "库存管理",
"right": "0",
"children": [
{
"id": "83",
"name": "采购入库",
"right": "0"
},
{
"id": "86",
"name": "礼品库存",
"right": "0",
"children": [
{
"id": "480",
"name": "设置价格",
"right": "0"
}
]
},
{
"id": "225",
"name": "库存调拨",
"right": "0",
"children": [
{
"id": "226",
"name": "新增调拨",
"right": "0"
},
{
"id": "227",
"name": "查看",
"right": "0"
}
]
},
{
"id": "228",
"name": "库存审核",
"right": "0"
},
{
"id": "290",
"name": "库存监控",
"right": "0"
},
{
"id": "367",
"name": "库存盘点审核",
"right": "0"
},
{
"id": "595",
"name": "库存盘点分析",
"right": "0"
}
]
},
{
"id": "325",
"name": "出入库统计",
"right": "0",
"children": [
{
"id": "273",
"name": "礼品入库明细",
"right": "0"
},
{
"id": "327",
"name": "礼品入库统计",
"right": "0",
"children": [
{
"id": "332",
"name": "门店礼品入库",
"right": "0"
},
{
"id": "333",
"name": "平台礼品入库",
"right": "0"
}
]
},
{
"id": "328",
"name": "礼品出库统计",
"right": "0",
"children": [
{
"id": "330",
"name": "门店礼品出库",
"right": "0"
},
{
"id": "331",
"name": "平台礼品出库",
"right": "0"
}
]
}
]
},
{
"id": "347",
"name": "礼品跨平台调拨",
"right": "0",
"children": [
{
"id": "348",
"name": "跨平台调拨单",
"right": "0"
},
{
"id": "349",
"name": "跨平台调拨入库",
"right": "0"
},
{
"id": "350",
"name": "跨平台调拨出库",
"right": "0"
}
]
}
]
},
{
"id": "128",
"name": "统计分析",
"right": "0",
"children": [
{
"id": "9",
"name": "门店营业",
"right": "0",
"children": [
{
"id": "192",
"name": "营业收入",
"right": "0"
},
{
"id": "193",
"name": "成本分析",
"right": "0"
},
{
"id": "194",
"name": "毛利分析",
"right": "0"
},
{
"id": "294",
"name": "门店效率",
"right": "0"
},
{
"id": "324",
"name": "其他收入",
"right": "0"
},
{
"id": "357",
"name": "门店缺货记录",
"right": "0"
},
{
"id": "368",
"name": "远程上币统计",
"right": "0"
},
{
"id": "473",
"name": "小时分析",
"right": "0"
},
{
"id": "483",
"name": "关键指标总览",
"right": "0"
},
{
"id": "586",
"name": "币值分析",
"right": "0"
},
{
"id": "587",
"name": "门店结算报表",
"right": "0"
}
]
},
{
"id": "123",
"name": "用户分析",
"right": "0",
"children": [
{
"id": "299",
"name": "用户构成",
"right": "0"
},
{
"id": "300",
"name": "用户平均消费",
"right": "0"
},
{
"id": "343",
"name": "用户消费分布",
"right": "0",
"children": [
{
"id": "344",
"name": "门店用户分布",
"right": "0"
},
{
"id": "345",
"name": "平台用户分析",
"right": "0"
}
]
},
{
"id": "354",
"name": "用户礼品获得数",
"right": "0"
}
]
},
{
"id": "125",
"name": "机台分析",
"right": "0",
"children": [
{
"id": "126",
"name": "礼品机收入",
"right": "0"
},
{
"id": "264",
"name": "实时监控",
"right": "0"
},
{
"id": "265",
"name": "异常统计",
"right": "0"
},
{
"id": "279",
"name": "营业状态",
"right": "0"
},
{
"id": "309",
"name": "售票机收入",
"right": "0"
},
{
"id": "542",
"name": "兑币机收入",
"right": "0"
},
{
"id": "590",
"name": "网络连检",
"right": "0"
}
]
},
{
"id": "262",
"name": "礼品排行",
"right": "0",
"children": [
{
"id": "127",
"name": "礼品销售数据",
"right": "0"
},
{
"id": "263",
"name": "礼品吸引力",
"right": "0"
},
{
"id": "307",
"name": "销售提升建议",
"right": "0",
"children": [
{
"id": "429",
"name": "日收入基准值修改",
"right": "0"
}
]
},
{
"id": "326",
"name": "礼品进销存",
"right": "0",
"children": [
{
"id": "334",
"name": "门店进销存",
"right": "0"
},
{
"id": "335",
"name": "平台进销存",
"right": "0"
}
]
},
{
"id": "337",
"name": "礼品流转周期",
"right": "0"
},
{
"id": "481",
"name": "礼品调拨分析",
"right": "0"
}
]
},
{
"id": "287",
"name": "订单记录",
"right": "0",
"children": [
{
"id": "90",
"name": "异常单占比",
"right": "0"
},
{
"id": "91",
"name": "无响应占比",
"right": "0"
},
{
"id": "285",
"name": "游玩记录",
"right": "0"
},
{
"id": "319",
"name": "开关门记录",
"right": "0"
},
{
"id": "320",
"name": "掉落记录",
"right": "0"
},
{
"id": "351",
"name": "嗨卡开卡记录",
"right": "0"
},
{
"id": "352",
"name": "嗨币兑换记录",
"right": "0"
},
{
"id": "353",
"name": "红包领取记录",
"right": "0"
},
{
"id": "369",
"name": "可抓取调整记录",
"right": "0"
},
{
"id": "471",
"name": "扣币记录",
"right": "0"
},
{
"id": "584",
"name": "会员存币记录",
"right": "0"
},
{
"id": "585",
"name": "出币记录",
"right": "0"
},
{
"id": "588",
"name": "售票办卡记录",
"right": "0"
},
{
"id": "592",
"name": "游玩增强中奖记录",
"right": "0"
},
{
"id": "594",
"name": "桌面兑币机出币统计",
"right": "0"
}
]
},
{
"id": "293",
"name": "营业监控",
"right": "0"
},
{
"id": "312",
"name": "门店预测",
"right": "0",
"children": [
{
"id": "286",
"name": "营业预测",
"right": "0"
},
{
"id": "291",
"name": "预测模型",
"right": "0"
}
]
},
{
"id": "313",
"name": "人员效率",
"right": "0",
"children": [
{
"id": "295",
"name": "现场运营统计",
"right": "0"
},
{
"id": "358",
"name": "运营补货记录",
"right": "0"
}
]
},
{
"id": "321",
"name": "优惠劵统计",
"right": "0",
"children": [
{
"id": "322",
"name": "嗨币消费券统计",
"right": "0"
},
{
"id": "336",
"name": "嗨币兑换券统计",
"right": "0"
},
{
"id": "346",
"name": "嗨币充值券统计",
"right": "0"
},
{
"id": "416",
"name": "嗨币体验券统计",
"right": "0"
},
{
"id": "500",
"name": "门店币体验券统计",
"right": "0"
}
]
},
{
"id": "488",
"name": "嗨娃分析",
"right": "0",
"children": [
{
"id": "489",
"name": "存储为积分统计",
"right": "0",
"children": [
{
"id": "494",
"name": "礼品单价",
"right": "0"
},
{
"id": "543",
"name": "删除",
"right": "0"
},
{
"id": "599",
"name": "修改",
"right": "0"
}
]
},
{
"id": "490",
"name": "积分换礼品统计",
"right": "0",
"children": [
{
"id": "495",
"name": "礼品单价",
"right": "0"
}
]
},
{
"id": "491",
"name": "兑换模式库存统计",
"right": "0",
"children": [
{
"id": "492",
"name": "设为积分类",
"right": "0"
},
{
"id": "493",
"name": "设为可兑换",
"right": "0"
}
]
},
{
"id": "548",
"name": "预约管理",
"right": "0",
"children": [
{
"id": "549",
"name": "退单",
"right": "0"
},
{
"id": "550",
"name": "礼品单价",
"right": "0"
}
]
}
]
}
]
},
{
"id": "132",
"name": "采购管理",
"right": "0",
"children": [
{
"id": "84",
"name": "订单审核",
"right": "0",
"children": [
{
"id": "82",
"name": "采购部采购",
"right": "0"
},
{
"id": "85",
"name": "礼品部审单",
"right": "0"
}
]
},
{
"id": "133",
"name": "礼品采购",
"right": "0"
},
{
"id": "229",
"name": "订货建议",
"right": "0"
},
{
"id": "270",
"name": "异常单审核",
"right": "0"
},
{
"id": "271",
"name": "采购退货",
"right": "0"
},
{
"id": "272",
"name": "礼品订单",
"right": "0"
}
]
},
{
"id": "197",
"name": "运营管理",
"right": "0",
"children": [
{
"id": "92",
"name": "用户退款申请",
"right": "0"
},
{
"id": "93",
"name": "用户支付反馈",
"right": "0"
},
{
"id": "198",
"name": "报修管理",
"right": "0",
"children": [
{
"id": "217",
"name": "报修列表",
"right": "0"
},
{
"id": "218",
"name": "报修查看",
"right": "0"
},
{
"id": "219",
"name": "报修受理",
"right": "0"
},
{
"id": "220",
"name": "报修处理",
"right": "0"
}
]
},
{
"id": "199",
"name": "商家反馈建议",
"right": "0",
"children": [
{
"id": "221",
"name": "建议反馈列表",
"right": "0"
},
{
"id": "222",
"name": "反馈回复",
"right": "0"
}
]
},
{
"id": "200",
"name": "礼品摆放图文",
"right": "0"
},
{
"id": "241",
"name": "入驻申请",
"right": "0"
},
{
"id": "242",
"name": "关店申请",
"right": "0"
},
{
"id": "274",
"name": "套餐卡券管理",
"right": "0",
"children": [
{
"id": "425",
"name": "嗨币消费套餐",
"right": "0"
},
{
"id": "426",
"name": "售票机套餐",
"right": "0"
},
{
"id": "427",
"name": "嗨币兑换券设置",
"right": "0"
},
{
"id": "428",
"name": "嗨币体验券设置",
"right": "0"
},
{
"id": "456",
"name": "嗨币充值套餐",
"right": "0"
},
{
"id": "496",
"name": "门店币购币套餐",
"right": "0"
},
{
"id": "499",
"name": "门店币体验券设置",
"right": "0"
}
]
},
{
"id": "301",
"name": "补换货评价",
"right": "0"
},
{
"id": "410",
"name": "商家训练营",
"right": "0",
"children": [
{
"id": "411",
"name": "搜索",
"right": "0"
},
{
"id": "412",
"name": "学习手册",
"right": "0"
},
{
"id": "413",
"name": "核心教程",
"right": "0"
},
{
"id": "414",
"name": "新特性",
"right": "0"
},
{
"id": "415",
"name": "客服信息",
"right": "0"
}
]
},
{
"id": "419",
"name": "洞见云新手指南",
"right": "0",
"children": [
{
"id": "420",
"name": "热搜关键词",
"right": "0"
},
{
"id": "421",
"name": "内容设置",
"right": "0"
},
{
"id": "422",
"name": "内容分组",
"right": "0"
}
]
},
{
"id": "479",
"name": "智能毛利管理",
"right": "0"
},
{
"id": "583",
"name": "更换主板记录",
"right": "0"
}
]
},
{
"id": "248",
"name": "设备资源管理",
"right": "0",
"children": [
{
"id": "249",
"name": "机台调拨",
"right": "0",
"children": [
{
"id": "251",
"name": "入库审核",
"right": "0"
},
{
"id": "252",
"name": "出库审核",
"right": "0"
},
{
"id": "260",
"name": "调拨列表",
"right": "0",
"children": [
{
"id": "250",
"name": "新建调拨单",
"right": "0"
},
{
"id": "253",
"name": "关闭订单",
"right": "0"
}
]
}
]
},
{
"id": "254",
"name": "机台库存",
"right": "0",
"children": [
{
"id": "255",
"name": "机台列表",
"right": "0"
},
{
"id": "256",
"name": "机台入库",
"right": "0",
"children": [
{
"id": "380",
"name": "新建入库单",
"right": "0"
}
]
},
{
"id": "381",
"name": "旧机台计划单",
"right": "0",
"children": [
{
"id": "382",
"name": "添加计划单",
"right": "0"
},
{
"id": "383",
"name": "完结计划单",
"right": "0"
},
{
"id": "384",
"name": "计划单作废",
"right": "0"
},
{
"id": "385",
"name": "计划单详情",
"right": "0"
}
]
},
{
"id": "572",
"name": "新机台计划单",
"right": "0",
"children": [
{
"id": "573",
"name": "新建",
"right": "0"
},
{
"id": "574",
"name": "查看",
"right": "0"
}
]
}
]
},
{
"id": "257",
"name": "机台报废",
"right": "0",
"children": [
{
"id": "259",
"name": "新建报废单",
"right": "0"
}
]
},
{
"id": "478",
"name": "供应商查账",
"right": "0"
}
]
},
{
"id": "266",
"name": "财务管理",
"right": "0",
"children": [
{
"id": "314",
"name": "门店账户",
"right": "0",
"children": [
{
"id": "316",
"name": "账户余额",
"right": "0"
},
{
"id": "317",
"name": "账户明细",
"right": "0"
}
]
},
{
"id": "315",
"name": "财务审核",
"right": "0",
"children": [
{
"id": "267",
"name": "提现审核",
"right": "0"
},
{
"id": "268",
"name": "押金审核",
"right": "0"
},
{
"id": "310",
"name": "现金报账审核",
"right": "0"
},
{
"id": "311",
"name": "现金打款审核",
"right": "0"
}
]
},
{
"id": "401",
"name": "财务报表",
"right": "0",
"children": [
{
"id": "402",
"name": "商家收支总表",
"right": "0"
},
{
"id": "403",
"name": "平台收支总表",
"right": "0"
},
{
"id": "404",
"name": "洞见收支总表",
"right": "0"
},
{
"id": "417",
"name": "商家对账单",
"right": "0"
}
]
}
]
},
{
"id": "277",
"name": "设置",
"right": "0",
"children": [
{
"id": "7",
"name": "账户管理",
"right": "0",
"children": [
{
"id": "12",
"name": "个人信息",
"right": "0",
"children": [
{
"id": "28",
"name": "编辑个人信息",
"right": "0"
}
]
},
{
"id": "13",
"name": "用户列表",
"right": "0",
"children": [
{
"id": "29",
"name": "新增用户",
"right": "0"
},
{
"id": "30",
"name": "编辑用户",
"right": "0"
},
{
"id": "31",
"name": "删除用户",
"right": "0"
},
{
"id": "32",
"name": "搜索用户",
"right": "0"
},
{
"id": "95",
"name": "授权门店权限",
"right": "0"
},
{
"id": "143",
"name": "授权仓库权限",
"right": "0"
}
]
}
]
},
{
"id": "8",
"name": "权限管理",
"right": "0",
"children": [
{
"id": "14",
"name": "权限组",
"right": "0",
"children": [
{
"id": "33",
"name": "新增权限组",
"right": "0"
},
{
"id": "35",
"name": "权限维护",
"right": "0"
},
{
"id": "37",
"name": "删除权限组",
"right": "0"
},
{
"id": "38",
"name": "搜索权限组",
"right": "0"
}
]
}
]
},
{
"id": "278",
"name": "操作日志",
"right": "0"
},
{
"id": "288",
"name": "平台参数",
"right": "0"
},
{
"id": "289",
"name": "日期标签",
"right": "0"
},
{
"id": "292",
"name": "通知设置",
"right": "0"
},
{
"id": "302",
"name": "商家app配置",
"right": "0"
},
{
"id": "340",
"name": "版本说明",
"right": "0",
"children": [
{
"id": "341",
"name": "新增版本",
"right": "0"
},
{
"id": "342",
"name": "编辑版本",
"right": "0"
}
]
},
{
"id": "355",
"name": "事件标记",
"right": "0",
"children": [
{
"id": "362",
"name": "新增事件",
"right": "0"
},
{
"id": "363",
"name": "编辑事件",
"right": "0"
},
{
"id": "364",
"name": "删除事件",
"right": "0"
}
]
},
{
"id": "356",
"name": "活动标记",
"right": "0",
"children": [
{
"id": "359",
"name": "新增活动",
"right": "0"
},
{
"id": "360",
"name": "编辑活动",
"right": "0"
},
{
"id": "361",
"name": "删除活动",
"right": "0"
}
]
}
]
},
],
"name": "",
"intro": ""
}