You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

751 lines
24 KiB

2 months ago
2 months ago
2 months ago
3 weeks ago
3 weeks ago
2 months ago
2 months ago
2 months ago
3 weeks ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
3 weeks ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
  1. <script setup>
  2. import { nextTick, onMounted, reactive, ref } from 'vue'
  3. import { ElMessage } from 'element-plus'
  4. import _ from 'lodash'
  5. import request from '@/util/http'
  6. import API from '@/util/http'
  7. import { useAdminStore } from "@/store/index.js"
  8. import { storeToRefs } from "pinia"
  9. const adminStore = useAdminStore();
  10. const { adminData, menuTree } = storeToRefs(adminStore);
  11. import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
  12. // 表单验证ref
  13. const Ref = ref(null)
  14. const roleData = ref([])
  15. const roleTotal = ref(100)
  16. const treeRef = ref(null)
  17. const admin = ref({
  18. account: '',
  19. market: '',
  20. postiton: ''
  21. })
  22. const role = ref({
  23. name: ''
  24. })
  25. const getObj = ref({
  26. pageNum: 1,
  27. pageSize: 10
  28. })
  29. const getRoleObj = ref({
  30. pageNum: 1,
  31. pageSize: 10
  32. })
  33. const permissionAddVisible = ref(false)
  34. const addRole = ref({
  35. roleName: '',
  36. parentId: null,
  37. checkedKeys: [],
  38. market: ''
  39. })
  40. const addRoleMarket = ref([])
  41. const getRoleList = async function (val) {
  42. if(!findMenuById(menuTree.value, permissionMapping.roleManageShow)){
  43. ElMessage.error('无此权限')
  44. return
  45. }
  46. try {
  47. if (typeof val === 'number') {
  48. getObj.value.pageNum = val
  49. }
  50. console.log('搜索参数', getObj.value, role.value)
  51. const result = await request({
  52. url: '/role/selectBy',
  53. data: {
  54. ...getRoleObj.value,
  55. roleVo: {
  56. roleName: role.value.name
  57. }
  58. }
  59. })
  60. roleData.value = result.data.list
  61. console.log('roleData', roleData.value)
  62. roleTotal.value = result.data.total
  63. } catch (error) {
  64. console.log('请求失败', error)
  65. }
  66. }
  67. // 试试D老师的方法
  68. const formatPermissions = (tree) => {
  69. if (!tree || tree.length === 0) return '';
  70. return tree.map(menu => {
  71. const mainMenu = menu.menuName;
  72. const subMenus = menu.children?.map(child => child.menuName) || [];
  73. // 如果有子菜单,显示前2个子菜单名称
  74. if (subMenus.length > 0) {
  75. const maxSub = Math.min(2, subMenus.length);
  76. const subText = subMenus.slice(0, maxSub).join('、');
  77. const moreText = subMenus.length > maxSub ? '...' : '';
  78. return `${mainMenu}+${subText}${moreText}`;
  79. }
  80. // 没有子菜单时只显示主菜单
  81. return mainMenu;
  82. }).join('+');
  83. };
  84. const trimJwCode = () => {
  85. if (admin.value.account) {
  86. admin.value.account = admin.value.account.replace(/\s/g, '');
  87. }
  88. }
  89. const searchRole = function () {
  90. trimJwCode();
  91. getObj.value.pageNum = 1
  92. getRoleList()
  93. }
  94. // 重置
  95. const reset = function () {
  96. admin.value = {}
  97. role.value.name = ''
  98. getRoleList()
  99. }
  100. const RoleArea = ref([])
  101. const getRoleArea = async function () {
  102. try {
  103. const result = await request({
  104. url: '/general/allRoleMarket',
  105. data: {}
  106. })
  107. RoleArea.value = result.data
  108. } catch (error) {
  109. console.log('请求失败', error)
  110. }
  111. }
  112. // 新增角色弹窗
  113. const openPermissionAddVisible = function () {
  114. permissionAddVisible.value = true
  115. getRoles()
  116. getLists()
  117. }
  118. const closePermissionAddVisible = function () {
  119. permissionAddVisible.value = false
  120. Ref.value.resetFields();
  121. getRoleList()
  122. }
  123. // 新增角色初始化
  124. const permissionAddInit = function () {
  125. openPermissionAddVisible()
  126. }
  127. const handleDialogClose = function () {
  128. closePermissionAddVisible()
  129. console.log('hhh');
  130. }
  131. // 权限类别
  132. const permissionList = ref([])
  133. const getRoles = async function () {
  134. try {
  135. const res = await API({ url: '/role/selectAll' })
  136. permissionList.value = res.data.map(item => ({
  137. label: item.roleName,
  138. value: item.id
  139. }))
  140. console.log('权限列表:', permissionList.value)
  141. } catch (error) {
  142. console.error('获取权限列表失败:', error)
  143. }
  144. }
  145. const collectIds = (tree) => {
  146. let ids = [];
  147. tree.forEach((node) => {
  148. ids.push(node.id);
  149. if (node.children && node.children.length > 0) {
  150. ids = ids.concat(collectIds(node.children));
  151. }
  152. });
  153. return ids;
  154. }
  155. //给data数据加上disabled属性,控制是否禁用
  156. function processTreeData(data) {
  157. return data.map(item => ({
  158. ...item,
  159. disabled: item.id != null || item.menuName.includes("敏感权限"), //控制权限显示的条件
  160. children: item.children ? processTreeData(item.children) : []
  161. }));
  162. }
  163. const handleAddRole = async function () {
  164. if(!findMenuById(menuTree.value, permissionMapping.addRoleInfo)){
  165. ElMessage.error('无此权限')
  166. return
  167. }
  168. try {
  169. await new Promise((resolve, reject) => {
  170. Ref.value.validate((valid) => {
  171. if (valid) {
  172. resolve(); // 验证通过,继续执行后续代码
  173. } else {
  174. reject(new Error('请检查并完善表单信息')); // 验证失败,抛出错误
  175. }
  176. });
  177. });
  178. addRole.value.roleName = addRole.value.roleName.replace(/\s+/g, '');
  179. console.log('去除角色名空格:', addRole.value.roleName);
  180. // 确保提交时包含所有选中的权限ID(包括父节点)
  181. const finalCheckedKeys = addRole.value.checkedKeys || [];
  182. const res = await API({
  183. url: '/role/add',
  184. data: {
  185. "roleName": addRole.value.roleName,
  186. "menuIds": finalCheckedKeys,
  187. "fatherId": addRole.value.parentId,
  188. "market": addRole.value.market
  189. }
  190. })
  191. if (res.code === 200) {
  192. ElMessage.success('角色' + addRole.value.roleName + '添加成功')
  193. console.log('成功了,看看addRole', addRole.value)
  194. console.log('提交的权限ID列表:', finalCheckedKeys)
  195. closePermissionAddVisible()
  196. } else {
  197. ElMessage.error(res.msg)
  198. }
  199. } catch (error) {
  200. console.log('请求失败', error)
  201. console.log('失败,看看addRole', addRole.value)
  202. }
  203. }
  204. const handleRolePageSizeChange = (val) => {
  205. getRoleObj.value.pageSize = val
  206. getRoleList() // 调用角色管理的查询
  207. }
  208. // 角色管理分页 - 当前页变化
  209. const handleRoleCurrentChange = (val) => {
  210. getRoleObj.value.pageNum = val
  211. getRoleList() // 调用角色管理的查询
  212. }
  213. const data = ref([])
  214. const getLists = async function () {
  215. try {
  216. console.log('addRole.value.roleId', addRole.value.roleId);
  217. let roleId = addRole.value.parentId
  218. if (addRole.value.parentId === null || addRole.value.parentId === undefined) {
  219. roleId = 2
  220. }
  221. const res = await API({
  222. url: '/menu/tree',
  223. data: { id: roleId }
  224. })
  225. data.value = res.data
  226. data.value = filterPermission(data.value)
  227. console.log('看看data', data.value)
  228. console.log('parentID:', addRole.value.parentId, 'roleId:', roleId)
  229. if (addRole.value.parentId && addRole.value.parentId !== 2) {
  230. const result = await API({
  231. url: '/general/roleMarket',
  232. data: { id: addRole.value.parentId }
  233. })
  234. if (result.code === 200) {
  235. if (typeof result.data === 'string' && result.data) {
  236. addRoleMarket.value = result.data.split(',')
  237. addRole.value.market = ''
  238. } else if (Array.isArray(result.data)) {
  239. addRoleMarket.value = result.data
  240. addRole.value.market = ''
  241. } else {
  242. addRoleMarket.value = []
  243. addRole.value.market = ''
  244. }
  245. } else {
  246. ElMessage.error('该上级角色无归属地区')
  247. console.log('该上级角色无归属地区')
  248. }
  249. console.log('addRoleMarket.value', addRoleMarket.value)
  250. } else {
  251. addRoleMarket.value = RoleArea.value
  252. console.log('elseRoleArea', RoleArea);
  253. }
  254. } catch (error) {
  255. console.log('请求失败', error)
  256. }
  257. }
  258. //金豆过滤
  259. const goldenBeanMenuIds = new Set([
  260. permissionMapping.beanAudit,
  261. permissionMapping.beanRecharge,
  262. permissionMapping.beanConsume,
  263. permissionMapping.beanDetail
  264. ])
  265. // 15,43,44,45,46,47,// 金豆审核
  266. // 18,52,53,54,// 金豆充值
  267. // 20,57,58,59,60,// 金豆消耗
  268. // 23// 金豆客户账户明细
  269. const filterGoldenBeanMenus = (tree) => {
  270. return tree
  271. .filter(item => {
  272. // 排除金豆相关的顶层菜单
  273. if (goldenBeanMenuIds.has(item.id)) {
  274. return false
  275. }
  276. // 递归处理子菜单
  277. if (item.children && item.children.length > 0) {
  278. item.children = filterGoldenBeanMenus(item.children)
  279. }
  280. return true
  281. })
  282. }
  283. // 过滤权限模块(????????)俺不会
  284. const filterPermission = (tree) => {
  285. return tree.filter(item =>{
  286. if(item.id === permissionMapping.permissionManage){
  287. return false
  288. }
  289. else if(item.children && item.children.length > 0){
  290. item.children = filterPermission(item.children)
  291. }
  292. return true
  293. })
  294. }
  295. // 处理编辑角色权限时的勾选事件
  296. const handleEditRolePermissionCheck = (checkedNodes, checkedInfo) => {
  297. const { checkedKeys, checkedNodes: allCheckedNodes } = checkedInfo
  298. // 判断是否有选中的节点
  299. if (allCheckedNodes.length === 0) {
  300. permissionEditRoleObj.value.checkedKeys = []
  301. return
  302. }
  303. // 由于设置了 check-strictly="false",Element Plus 会自动处理父子节点联动
  304. // 我们只需要使用 checkedKeys,它已经包含了所有必要的节点ID
  305. permissionEditRoleObj.value.checkedKeys = checkedKeys
  306. console.log('编辑角色选中的权限ID:', checkedKeys)
  307. console.log('选中的节点数量:', allCheckedNodes.length)
  308. };
  309. const handleCheckChange = async (checkedNodes, checkedInfo) => {
  310. const { checkedKeys, checkedNodes: allCheckedNodes } = checkedInfo
  311. // 判断是否有选中的节点
  312. if (allCheckedNodes.length === 0) {
  313. addRole.value.checkedKeys = []
  314. return
  315. }
  316. // 创建一个Set存储所有需要选中的ID(包括父级)
  317. const allKeys = new Set(checkedKeys)
  318. // 遍历所有选中的节点,为每个节点添加其父级
  319. allCheckedNodes.forEach(node => {
  320. // 为每个选中的节点单独查找父级
  321. selectParentNodes(data.value, node.id, allKeys)
  322. });
  323. // 将Set转换为数组并更新
  324. addRole.value.checkedKeys = Array.from(allKeys)
  325. console.log('新增角色包含所有父级的选中项:', addRole.value.checkedKeys)
  326. }
  327. const selectParentNodes = (treeData, nodeId, checkedKeys) => {
  328. if (!Array.isArray(treeData)) return false
  329. for (const item of treeData) {
  330. // 先检查子节点
  331. if (item.children && item.children.length > 0) {
  332. const foundInChildren = selectParentNodes(item.children, nodeId, checkedKeys);
  333. if (foundInChildren) {
  334. // 找到子节点后添加当前节点(父节点)
  335. checkedKeys.add(item.id);
  336. return true
  337. }
  338. }
  339. // 检查当前节点是否为目标节点
  340. if (item.id === nodeId) {
  341. return true
  342. }
  343. }
  344. return false
  345. };
  346. //点击角色权限菜单树点击展示逻辑
  347. const menuTreeVisible = ref(false)
  348. const currentRoleMenuTree = ref([])
  349. const currentRoleName = ref('')
  350. const Rolecheckedkeys = ref([])
  351. const showMenuTree = (treeData, roleName) => {
  352. currentRoleMenuTree.value = processTreeData(treeData) || [];
  353. console.log('currentRoleMenuTree.value', currentRoleMenuTree.value)
  354. Rolecheckedkeys.value = collectIds(treeData)
  355. console.log('Rolecheckedkeys', Rolecheckedkeys.value)
  356. currentRoleName.value = roleName || '权限详情'
  357. menuTreeVisible.value = true;
  358. }
  359. // 编辑角色对象
  360. const permissionEditRoleObj = ref({
  361. id: null,
  362. roleName: '',
  363. market: '',
  364. parentId: null,
  365. parentName: '',
  366. checkedKeys: []
  367. })
  368. // 编辑角色弹窗
  369. const permissionEditRoleVisible = ref(false)
  370. const collectIds2 = (tree) => {
  371. let ids = []
  372. tree.forEach((node) => {
  373. // 如果当前节点没有 children 或 children 为空,说明是叶子节点
  374. if (!node.children || node.children.length === 0) {
  375. ids.push(node.id)
  376. } else {
  377. // 如果有 children,递归收集子节点的叶子节点
  378. ids = ids.concat(collectIds2(node.children))
  379. }
  380. })
  381. return ids
  382. }
  383. // 编辑角色初始化
  384. const permissionEditRoleInit = async function (row) {
  385. console.log('row', row)
  386. console.log('row.tree', row.tree)
  387. permissionEditRoleObj.value = {}
  388. permissionEditRoleObj.value.id = row.id
  389. permissionEditRoleObj.value.roleName = row.roleName
  390. permissionEditRoleObj.value.market = row.market
  391. permissionEditRoleObj.value.parentId = row.fatherId
  392. permissionEditRoleObj.value.parentName = row.fatherName
  393. try {
  394. let roleId = permissionEditRoleObj.value.parentId;
  395. // 如果没有上级角色,设置为管理员的id
  396. if (permissionEditRoleObj.value.parentId === null || permissionEditRoleObj.value.parentId === undefined) {
  397. roleId = 2;
  398. }
  399. // 调用 /tree 接口,使用上级角色 ID 获取权限列表
  400. const res = await API({
  401. url: '/menu/tree',
  402. data: { id: roleId }
  403. });
  404. data.value = res.data;
  405. data.value = filterPermission(data.value)
  406. //data.value = filterGoldenBeanMenus(data.value);
  407. // 收集当前行权限树的叶子节点id(只收集实际选中的叶子节点)
  408. if (row.tree && row.tree.length > 0) {
  409. const leafIds = collectIds2(row.tree);
  410. permissionEditRoleObj.value.checkedKeys = leafIds;
  411. console.log('编辑角色初始化时的权限列表', permissionEditRoleObj.value.checkedKeys);
  412. } else {
  413. permissionEditRoleObj.value.checkedKeys = [];
  414. }
  415. } catch (error) {
  416. console.log('根据上级角色获取权限列表失败', error);
  417. data.value = [];
  418. permissionEditRoleObj.value.checkedKeys = [];
  419. }
  420. console.log('编辑角色', permissionEditRoleObj.value);
  421. permissionEditRoleVisible.value = true;
  422. // 等待DOM更新后手动设置树的选中状态
  423. await nextTick();
  424. if (treeRef.value && permissionEditRoleObj.value.checkedKeys.length > 0) {
  425. treeRef.value.setCheckedKeys(permissionEditRoleObj.value.checkedKeys);
  426. console.log('手动设置树的选中状态:', permissionEditRoleObj.value.checkedKeys);
  427. }
  428. };
  429. // 编辑角色提交
  430. const permissionEditRole = async function () {
  431. if(!findMenuById(menuTree.value, permissionMapping.editRoleInfo)){
  432. ElMessage.error('无此权限')
  433. return
  434. }
  435. try {
  436. await new Promise((resolve, reject) => {
  437. Ref.value.validate((valid) => {
  438. if (valid) {
  439. resolve();
  440. } else {
  441. reject(new Error('请检查并完善表单信息'));
  442. }
  443. });
  444. });
  445. // 确保提交时包含所有选中的权限ID(包括父节点)
  446. let finalCheckedKeys = permissionEditRoleObj.value.checkedKeys || [];
  447. // 为所有选中的节点添加其父节点ID
  448. const allKeys = new Set(finalCheckedKeys);
  449. finalCheckedKeys.forEach(nodeId => {
  450. selectParentNodesForSubmit(data.value, nodeId, allKeys);
  451. });
  452. finalCheckedKeys = Array.from(allKeys);
  453. const res = await API({
  454. url: '/menu/update',
  455. data: {
  456. "id": permissionEditRoleObj.value.id,
  457. "roleName": permissionEditRoleObj.value.roleName,
  458. "menuIds": finalCheckedKeys,
  459. "fatherId": permissionEditRoleObj.value.parentId,
  460. "market": permissionEditRoleObj.value.market
  461. }
  462. });
  463. if (res.code === 200) {
  464. console.log('编辑角色成功', permissionEditRoleObj.value);
  465. console.log('提交的权限ID列表:', finalCheckedKeys);
  466. permissionEditRoleVisible.value = false;
  467. getRoleList();
  468. ElMessage.success('编辑角色成功');
  469. } else if (res.code === 0) {
  470. console.log('角色名重复', permissionEditRoleObj.value);
  471. ElMessage.error('角色名重复');
  472. } else {
  473. console.log('编辑角色失败', res);
  474. ElMessage.error('编辑角色失败');
  475. }
  476. } catch (error) {
  477. console.log('编辑角色失败', error);
  478. console.log('失败,看看permissionEditRoleObj', permissionEditRoleObj.value);
  479. }
  480. };
  481. // 为提交时查找父节点的辅助函数
  482. const selectParentNodesForSubmit = (treeData, nodeId, checkedKeys) => {
  483. if (!Array.isArray(treeData)) return false;
  484. for (const item of treeData) {
  485. // 先检查子节点
  486. if (item.children && item.children.length > 0) {
  487. const foundInChildren = selectParentNodesForSubmit(item.children, nodeId, checkedKeys);
  488. if (foundInChildren) {
  489. // 找到子节点后添加当前节点(父节点)
  490. checkedKeys.add(item.id);
  491. return true;
  492. }
  493. }
  494. // 检查当前节点是否为目标节点
  495. if (item.id === nodeId) {
  496. return true;
  497. }
  498. }
  499. return false;
  500. };
  501. const Rolerules = reactive({
  502. roleName: [
  503. { required: true, message: '请输入角色名称', trigger: 'blur' },
  504. { min: 2, max: 20, message: '角色名称长度应在2-20个字符之间', trigger: 'blur' }
  505. ],
  506. market: [
  507. { required: true, message: '请选择归属地区', trigger: 'change' }
  508. ],
  509. checkedKeys: [
  510. {
  511. required: true,
  512. message: '请选择权限列表',
  513. trigger: 'change', // 选框变化或提交时触发,可根据实际调整
  514. validator: (rule, value, callback) => {
  515. if (value && value.length > 0) {
  516. callback(); // 有选中项,校验通过
  517. } else {
  518. callback(new Error('请选择权限列表')); // 未选中,抛出错误提示
  519. }
  520. }
  521. }
  522. ]
  523. });
  524. const throttledHandleAddRole = _.throttle(handleAddRole, 5000, {
  525. trailing: false
  526. })
  527. const canLook = findMenuById(menuTree.value,permissionMapping.roleManageShow)
  528. const canAdd = findMenuById(menuTree.value, permissionMapping.addRoleInfo)
  529. const canEdit = findMenuById(menuTree.value, permissionMapping.editRoleInfo)
  530. // 挂载
  531. onMounted(async function () {
  532. await getRoleList()
  533. await getRoleArea()
  534. })
  535. </script>
  536. <template>
  537. <div>
  538. <el-card style="margin-bottom: 1vh;">
  539. <div style="display: flex;">
  540. <el-text size="large">角色名称</el-text>
  541. <el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable />
  542. <div style="margin-left: auto;">
  543. <el-button type="success" @click="reset()">重置</el-button>
  544. <el-button type="primary" @click="searchRole()" :disabled="canLook" v-if="canLook">查询</el-button>
  545. </div>
  546. </div>
  547. </el-card>
  548. <el-card>
  549. <div class="add-item">
  550. <el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()" :disabled="!canAdd" v-if="canAdd">新增角色</el-button>
  551. </div>
  552. <div>
  553. <el-table :data="roleData" style="width: 100%" show-overflow-tooltip>
  554. <el-table-column type="index" label="序号" width="100px" fixed="left">
  555. <template #default="scope">
  556. <span>{{
  557. scope.$index + 1 + (getRoleObj.pageNum - 1) * getRoleObj.pageSize
  558. }}</span>
  559. </template>
  560. </el-table-column>
  561. <el-table-column prop="roleName" label="角色名称" />
  562. <el-table-column prop="fatherName" label="上级角色" >
  563. <template #default="scope">
  564. {{ scope.row.fatherName || '-' }}
  565. </template>
  566. </el-table-column>
  567. <el-table-column label="权限范围" show-overflow-tooltip>
  568. <template #default="scope">
  569. <div class="permission-cell" @click="showMenuTree(scope.row.tree, scope.row.roleName)">
  570. {{ formatPermissions(scope.row.tree) }}
  571. </div>
  572. </template>
  573. </el-table-column>
  574. <el-table-column prop="operation" label="操作" width="200px">
  575. <template #default="scope">
  576. <el-button type="warning" text @click="permissionEditRoleInit(scope.row)" :disabled="(scope.row.id === 2)|| (scope.row.id === 1) || !canEdit" v-if="canEdit">
  577. 编辑
  578. </el-button>
  579. </template>
  580. </el-table-column>
  581. </el-table>
  582. </div>
  583. <div style="margin-top: 20px;display: flex;">
  584. <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  585. layout="total, sizes, prev, pager, next, jumper" :total="roleTotal" @size-change="handleRolePageSizeChange"
  586. @current-change="handleRoleCurrentChange"></el-pagination>
  587. </div>
  588. </el-card>
  589. </div>
  590. <!-- 角色菜单树展示 -->
  591. <el-dialog v-model="menuTreeVisible" :title='`权限详情:${currentRoleName}`' width="600px">
  592. <el-tree :data="currentRoleMenuTree" node-key="id" :props="{ label: 'menuName', children: 'children' }"
  593. show-checkbox check-strictly :expand-on-click-node="false"
  594. :default-expanded-keys="currentRoleMenuTree.map(item => item.id)" :default-checked-keys="Rolecheckedkeys" />
  595. <template #footer>
  596. <el-button @click="menuTreeVisible = false" type="primary">关闭</el-button>
  597. </template>
  598. </el-dialog>
  599. <!-- 新增角色 -->
  600. <el-dialog v-model="permissionAddVisible" title="新增角色" width="800px" :close-on-click-modal="false"
  601. @close="handleDialogClose">
  602. <template #footer>
  603. <el-form ref="Ref" :rules="Rolerules" :model="addRole" label-width="auto"
  604. style="max-width: 600px; align-items: center">
  605. <el-form-item prop="roleName" label="角色名称:" required>
  606. <el-input v-model="addRole.roleName" placeholder="请输入角色名称" style="width: 220px" />
  607. </el-form-item>
  608. <el-form-item prop="parentName" label="上级角色:">
  609. <el-select v-model="addRole.parentId" placeholder="请选择上级角色" style="width: 220px" @change="getLists" clearable>
  610. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  611. :value="item.value"></el-option>
  612. </el-select>
  613. </el-form-item>
  614. <el-form-item prop="market" label="归属地区:" required>
  615. <el-select v-model="addRole.market" placeholder="请选择归属地区" style="width: 220px" clearable>
  616. <el-option v-for="item in addRoleMarket" :key="item" :label="item" :value="item" />
  617. </el-select>
  618. <text>(此地区无实际意义仅用于各分部负责人查看其地区角色)</text>
  619. </el-form-item>
  620. <el-form-item prop="checkedKeys" label="权限列表:" required>
  621. <el-tree v-if="data.length > 0" :data="data" show-checkbox node-key="id"
  622. :props="{ label: 'menuName', children: 'children' }" :checked-keys="addRole.checkedKeys"
  623. :check-strictly="false" @check="handleCheckChange">
  624. <template #default="{ node, data }">
  625. <span>{{ node.label }}</span>
  626. </template>
  627. </el-tree>
  628. <div v-else style="display: flex; align-items: center; gap: 8px;">
  629. <span style="color: #999;">暂无数据</span>
  630. </div>
  631. </el-form-item>
  632. </el-form>
  633. <div>
  634. <el-button @click="closePermissionAddVisible()">取消</el-button>
  635. <el-button type="primary" @click="throttledHandleAddRole">
  636. 提交
  637. </el-button>
  638. </div>
  639. </template>
  640. </el-dialog>
  641. <!-- 編輯角色彈窗 -->
  642. <el-dialog v-model="permissionEditRoleVisible" title="编辑角色" width="800px" :close-on-click-modal="false">
  643. <template #footer>
  644. <el-form ref="Ref" :rules="Rolerules" :model="permissionEditRoleObj" label-width="auto"
  645. style="max-width: 600px; align-items: center">
  646. <el-form-item prop="roleName" label="角色名称:" required>
  647. <el-input v-model="permissionEditRoleObj.roleName" placeholder="请输入角色名称" style="width: 220px" />
  648. </el-form-item>
  649. <el-form-item prop="parentName" label="上级角色:">
  650. <el-input v-model="permissionEditRoleObj.parentName" placeholder="无上级角色" disabled style="width: 220px">
  651. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  652. :value="item.value"></el-option>
  653. </el-input>
  654. </el-form-item>
  655. <el-form-item prop="market" label="归属地区" required>
  656. <el-input v-model="permissionEditRoleObj.market" placeholder="请输入归属地区" style="width: 220px" disabled />
  657. <text>(此地区无实际意义仅用于各分部负责人查看其地区角色)</text>
  658. </el-form-item>
  659. <el-form-item prop="checkedKeys" label="权限列表:" required>
  660. <el-tree v-if="data.length > 0" :data="data" show-checkbox node-key="id" ref="treeRef"
  661. :props="{ label: 'menuName', children: 'children' }"
  662. :default-checked-keys="permissionEditRoleObj.checkedKeys" :check-strictly="false"
  663. @check="handleEditRolePermissionCheck">
  664. <template #default="{ node, data }">
  665. <span>{{ node.label }}</span>
  666. </template>
  667. </el-tree>
  668. <div v-else style="display: flex; align-items: center; gap: 8px;">
  669. <span style="color: #999;">暂无数据</span>
  670. </div>
  671. </el-form-item>
  672. </el-form>
  673. <div>
  674. <el-button @click="permissionEditRoleVisible = false">取消</el-button>
  675. <el-button type="primary" @click="permissionEditRole">
  676. 提交
  677. </el-button>
  678. </div>
  679. </template>
  680. </el-dialog>
  681. </template>
  682. <style scoped>
  683. .head-card {
  684. display: flex;
  685. }
  686. .permission-cell {
  687. cursor: pointer;
  688. color: #409eff;
  689. /* 蓝色文字,提示可点击 */
  690. }
  691. </style>