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.

797 lines
23 KiB

1 month ago
4 weeks ago
1 month ago
4 weeks ago
4 weeks ago
4 weeks ago
1 month ago
  1. <script setup>
  2. import { ref, onMounted, reactive, computed, watch } from 'vue'
  3. import ElementPlus from 'element-plus'
  4. import { ElMessage, ElMessageBox } from 'element-plus'
  5. import axios from 'axios'
  6. import moment from 'moment'
  7. import { UserFilled } from '@element-plus/icons-vue'
  8. import _ from 'lodash'
  9. import request from '@/util/http'
  10. import API from '@/util/http'
  11. // 客户明细表格 什么表格???????
  12. const tableData = ref([])
  13. const total = ref(100)
  14. // 搜索admin
  15. const admin = ref({
  16. account: '',
  17. market: '',
  18. postiton: ''
  19. })
  20. // 搜索对象
  21. const getObj = ref({
  22. pageNum: 1,
  23. pageSize: 10
  24. })
  25. // 新增用户权限弹窗
  26. const userAddVisible = ref(false)
  27. // 编辑用户权限弹窗
  28. const userEditVisible = ref(false)
  29. //选地区
  30. const market = ref([])
  31. // 选部门
  32. const postiton = ref([])
  33. // 新增用户对象
  34. const userAddObj = ref({})
  35. // 新增角色对象
  36. const permissionAddObj = ref({})
  37. // 新增角色弹窗
  38. const permissionAddVisible = ref(false)
  39. // 新增用户权限对象,机器码要实现存储多个,addMachineIdInput方法实现
  40. const addAdmin = ref({
  41. account: '',
  42. name: '',
  43. market: [],
  44. permission: '',
  45. postiton: '',
  46. machineId: '', // 初始机器码输入框
  47. machineIds: [], // 动态添加的机器码输入框
  48. remark: ''
  49. })
  50. // 新增角色对象
  51. const addRole = ref({
  52. roleName: '',
  53. parentName: '',
  54. checkedKeys: [],
  55. grade: ''
  56. })
  57. // 新增角色的权限列表
  58. const permissionSelect = ref()
  59. const addMachineIdInput = function () {
  60. if (addAdmin.value.machineIds.length >= 1) {
  61. ElMessage.warning('设备数量已达上限')
  62. return
  63. }
  64. addAdmin.value.machineIds.push('')
  65. }
  66. // 编辑用户权限对象
  67. const permissionEditObj = ref({})
  68. // 删除权限对象
  69. const delObj = ref({})
  70. // 各角色权限列表
  71. const lists = [
  72. { name: '管理员', value: '1', permissions: ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20'] },
  73. { name: '总部财务', value: '2', permissions: ['2', '3', '4', '5', '6', '7', '8', '9'] },
  74. { name: '总部客服', value: '3', permissions: ['2', '3', '4', '5', '6', '7', '8'] },
  75. { name: '地区负责人', value: '4', permissions: ['2', '3', '4', '5', '6'] },
  76. { name: '地区财务', value: '5', permissions: ['2', '3', '4', '5'] },
  77. { name: '客服专员', value: '6', permissions: ['2', '3'] }
  78. ]
  79. const get = async function (val) {
  80. try {
  81. if (typeof val === 'number') {
  82. getObj.value.pageNum = val
  83. }
  84. console.log('搜索参数', getObj.value, admin.value)
  85. const result = await request({
  86. url: '/permission/getPermission',
  87. data: {
  88. ...getObj.value,
  89. permission: {
  90. ...admin.value
  91. }
  92. }
  93. })
  94. tableData.value = result.data.list
  95. console.log('tableData', tableData.value)
  96. total.value = result.data.total
  97. } catch (error) {
  98. console.log('请求失败', error)
  99. }
  100. }
  101. const trimJwCode = () => {
  102. if (admin.value.account) {
  103. admin.value.account = admin.value.account.replace(/\s/g, '');
  104. }
  105. }
  106. const search = function () {
  107. trimJwCode();
  108. getObj.value.pageNum = 1
  109. get()
  110. }
  111. // 重置
  112. const reset = function () {
  113. admin.value = {}
  114. }
  115. const getArea = async function () {
  116. try {
  117. const result = await request({
  118. url: '/permission/getmarket',
  119. data: {}
  120. })
  121. market.value = result.data
  122. } catch (error) {
  123. console.log('请求失败', error)
  124. }
  125. }
  126. // 获取部门
  127. const getStore = async function () {
  128. try {
  129. const result = await request({
  130. url: '/permission/getposition',
  131. data: {}
  132. })
  133. postiton.value = result.data
  134. } catch (error) {
  135. console.log('请求失败', error)
  136. }
  137. }
  138. // 打开新增用户权限弹窗
  139. const openUserAddVisible = function () {
  140. userAddVisible.value = true
  141. addAdmin.value = {
  142. account: '',
  143. name: '',
  144. market: '',
  145. permission: '',
  146. postiton: '',
  147. machineId: '',
  148. machineIds: [],
  149. remark: ''
  150. };
  151. }
  152. // 新增角色弹窗
  153. const openPermissionAddVisible = function () {
  154. permissionAddVisible.value = true
  155. }
  156. // 关闭新增用户权限弹窗,并刷新表单
  157. const closeUserAddVisible = function () {
  158. addAdmin.value = {
  159. account: '',
  160. name: '',
  161. market: '',
  162. permission: '',
  163. postiton: '',
  164. machineId: '',
  165. machineIds: [],
  166. remark: ''
  167. };
  168. userAddVisible.value = false;
  169. // 清除表单验证状态
  170. Ref.value.resetFields();
  171. }
  172. const closePermissionAddVisible = function () {
  173. permissionAddVisible.value = false
  174. Ref.value.resetFields();
  175. }
  176. // 新增用户权限初始化
  177. const userAddInit = function () {
  178. userAddObj.value = {}
  179. openUserAddVisible()
  180. }
  181. // 新增角色初始化
  182. const permissionAddInit = function () {
  183. permissionAddObj.value = {}
  184. openPermissionAddVisible()
  185. }
  186. const permissionAdd = async function () {
  187. Ref.value.validate(async (valid) => {
  188. console.log('addRole', addRole.value)
  189. console.log('valid', valid)
  190. if (valid) {
  191. try {
  192. addAdmin.value.adminFlag = 1
  193. addAdmin.value.status1 = 1
  194. if (addAdmin.value.postiton == '管理员') {
  195. addAdmin.value.postiton == 1
  196. }
  197. const params = {
  198. "account": addAdmin.value.account,//OA号
  199. "adminName": addAdmin.value.name,//姓名
  200. "market": addAdmin.value.market,//地区
  201. "roleId": addAdmin.value.permission,//权限ID
  202. "postiton": addAdmin.value.postiton,//职位
  203. "machineId": addAdmin.value.machineId,//机器码
  204. "remark": addAdmin.value.remark//备注
  205. }
  206. const result = await request({
  207. url: '/permission/addPermission',
  208. data: params
  209. })
  210. console.log(addAdmin.value)
  211. if (result.code == 200) {
  212. ElMessage.success('添加成功')
  213. } else {
  214. ElMessage.error(result.msg)
  215. }
  216. addAdmin.value = {}
  217. get()
  218. closeUserAddVisible()
  219. } catch (error) {
  220. console.log('新增用户权限失败', error)
  221. ElMessage.error('新增用户权限失败')
  222. closeUserAddVisible()
  223. }
  224. } else {
  225. ElMessage({
  226. type: 'error',
  227. message: '请检查输入内容'
  228. })
  229. }
  230. })
  231. }
  232. // 表单验证ref
  233. const Ref = ref(null)
  234. // 使用 _.throttle 并设置 trailing 为 false 实现严格节流,只执行一次
  235. const throttledPermissionAdd = _.throttle(permissionAdd, 5000, {
  236. trailing: false
  237. })
  238. // 权限类别
  239. const permissionList = [
  240. {
  241. label: '管理员',
  242. value: '1'
  243. },
  244. {
  245. label: '总部财务',
  246. value: '2'
  247. },
  248. {
  249. label: '总部客服',
  250. value: '3'
  251. },
  252. {
  253. label: '地区负责人',
  254. value: '4'
  255. },
  256. {
  257. label: '地区财务',
  258. value: '5'
  259. },
  260. {
  261. label: '客服专员',
  262. value: '6'
  263. }
  264. ]
  265. // 打开编辑用户权限弹窗
  266. const openUserEditVisible = function () {
  267. userEditVisible.value = true
  268. }
  269. // 关闭编辑用户权限弹窗
  270. const closeUserEditVisible = function () {
  271. userEditVisible.value = false
  272. }
  273. // 编辑用户权限初始化
  274. const permissionEditInit = function (row) {
  275. permissionEditObj.value = {}
  276. permissionEditObj.value.id = row.id
  277. permissionEditObj.value.account = row.account
  278. permissionEditObj.value.name = row.name
  279. permissionEditObj.value.market = row.market
  280. permissionEditObj.value.postiton = row.postiton
  281. permissionEditObj.value.permission = row.permission
  282. permissionEditObj.value.roleId = row.roleId
  283. console.log('编辑用户权限', permissionEditObj.value)
  284. openUserEditVisible()
  285. }
  286. // 编辑用户权限提交
  287. const permissionEdit = async function () {
  288. try {
  289. const result = await request({
  290. url: '/permission/updateAdminRole',
  291. data: permissionEditObj.value
  292. })
  293. console.log('请求成功3', result)
  294. ElMessage.success('编辑用户权限成功')
  295. get()
  296. closeUserEditVisible()
  297. } catch (error) {
  298. console.log('编辑用户权限失败', error)
  299. ElMessage.error('编辑用户权限失败')
  300. closeUserEditVisible()
  301. }
  302. }
  303. const throttledPermissionEdit = _.throttle(permissionEdit, 5000, {
  304. trailing: false
  305. })
  306. // 删除初始化
  307. const del = function (row) {
  308. delObj.value = {}
  309. console.log(row, '删除初始化')
  310. delObj.value.account = row.account
  311. delObj.value.id = row.id
  312. }
  313. // 删除权限
  314. const delConfirm = async function () {
  315. try {
  316. const result = await request({
  317. url: '/permission/deleteAdmin',
  318. data: delObj.value
  319. })
  320. console.log('看看删除对象', delObj.value)
  321. console.log('请求成功1', result)
  322. ElMessage.success('删除权限成功')
  323. delObj.value = {}
  324. get()
  325. } catch (error) {
  326. console.log('删除权限失败', error)
  327. ElMessage.error('删除权限失败')
  328. }
  329. }
  330. const handleAddRole = async function () {
  331. try {
  332. const res = await API({
  333. url: '/role/add',
  334. data: {
  335. "roleName": addRole.value.roleName,
  336. "menuIds": addRole.value.checkedKeys,
  337. "priority": addRole.value.grade,
  338. "fatherId": addRole.value.parentName
  339. }
  340. })
  341. console.log('成功了,看看addRole', addRole.value)
  342. } catch (error) {
  343. console.log('请求失败', error)
  344. }
  345. }
  346. // 禁用启用用户权限
  347. const editStatus = async function (row) {
  348. try {
  349. console.log(row)
  350. permissionEditObj.value = {}
  351. permissionEditObj.value.id = row.id
  352. permissionEditObj.value.account = row.account
  353. permissionEditObj.value.adminStatus = row.adminStatus
  354. console.log('修改用户权限状态', permissionEditObj.value)
  355. const result = await request({
  356. url: '/permission/upadatePermission',
  357. data: permissionEditObj.value
  358. })
  359. console.log('请求成功2', result)
  360. ElMessage.success(
  361. permissionEditObj.value.adminStatus == 1 ? '启用成功' : '禁用成功'
  362. )
  363. permissionEditObj.value = {}
  364. get()
  365. } catch (error) {
  366. console.log('修改用户权限失败', error)
  367. }
  368. }
  369. // 挂载
  370. onMounted(async function () {
  371. await get()
  372. await getArea()
  373. await getStore()
  374. })
  375. const handlePageSizeChange = function (val) {
  376. getObj.value.pageSize = val
  377. get()
  378. }
  379. const handleCurrentChange = function (val) {
  380. getObj.value.pageNum = val
  381. get()
  382. }
  383. const data = [
  384. {
  385. value: '2',
  386. label: '工作台'
  387. },
  388. {
  389. value: '3',
  390. label: '财务审核',
  391. children: [
  392. {
  393. value: '11',
  394. label: '充值审核'
  395. },
  396. {
  397. value: '13',
  398. label: '退款审核'
  399. }, {
  400. value: '12',//14
  401. label: '审核操作'
  402. }
  403. ]
  404. },
  405. {
  406. value: '4',
  407. label: '汇率管理'
  408. }, {
  409. value: '5',
  410. label: '充值管理',
  411. children: [
  412. {
  413. value: '17',
  414. label: '新增充值'
  415. },
  416. {
  417. value: '18',
  418. label: '金币充值明细'
  419. }
  420. ]
  421. }, {
  422. value: '6',
  423. label: '消耗管理',
  424. children: [
  425. {
  426. value: '19',
  427. label: '新增消耗'
  428. },
  429. {
  430. value: '20',
  431. label: '金币消耗明细'
  432. }
  433. ]
  434. }, {
  435. value: '7',
  436. label: '退款管理',
  437. children: [
  438. {
  439. value: '21',
  440. label: '新增退款'
  441. },
  442. {
  443. value: '22',
  444. label: '金币退款明细'
  445. }
  446. ]
  447. }, {
  448. value: '8',
  449. label: '客户账户明细',
  450. children: [
  451. {
  452. value: '23',
  453. label: '客户金币明细'
  454. },
  455. {
  456. value: '24',
  457. label: '客户金币余额'
  458. }
  459. ]
  460. }, {
  461. value: '9',
  462. label: '权限管理'
  463. }, {
  464. value: '100',
  465. label: '地区数据',
  466. children: [
  467. {
  468. value: '101',
  469. label: '总部'
  470. },
  471. {
  472. value: '102',
  473. label: '香港'
  474. },
  475. {
  476. value: '103',
  477. label: '新加坡'
  478. },
  479. {
  480. value: '104',
  481. label: '马来西亚'
  482. },
  483. {
  484. value: '105',
  485. label: '越南'
  486. },
  487. {
  488. value: '106',
  489. label: '韩国'
  490. }
  491. ]
  492. }
  493. ]
  494. const filteredData = ref([...data])
  495. watch(() => addRole.value.parentName, (newValue) => {
  496. if (newValue) {
  497. const selectedRole = lists.find(role => role.value === newValue)
  498. if (selectedRole) {
  499. const allowedPermissions = selectedRole.permissions
  500. filteredData.value = filterPermissions(data, allowedPermissions)
  501. } else {
  502. filteredData.value = data
  503. }
  504. } else {
  505. filteredData.value = data
  506. }
  507. })
  508. const filterPermissions = (permissions, allowedPermissions) => {
  509. return permissions.filter(permission => {
  510. if (allowedPermissions.includes(permission.value)) {
  511. if (permission.children) {
  512. permission.children = filterPermissions(permission.children, allowedPermissions)
  513. }
  514. return true
  515. }
  516. return false
  517. })
  518. }
  519. const includeHq = computed(() => {
  520. const i = addAdmin.value.market.includes('总部')
  521. return (item) => i && item != '总部'
  522. })
  523. const handleCheckChange = (checkedNodes, { checkedKeys }) => {
  524. addRole.value.checkedKeys = checkedKeys;
  525. };
  526. </script>
  527. <template>
  528. <!-- 搜索表单 -->
  529. <el-row>
  530. <el-col>
  531. <el-card style="margin-bottom: 20px">
  532. <div class="head-card">
  533. <div class="head-card-element">
  534. <el-text class="mx-1" size="large">OA号</el-text>
  535. <el-input v-model="admin.account" style="width: 240px" placeholder="请输入OA号" clearable />
  536. </div>
  537. <div class="head-card-element" style="margin-left: 50px">
  538. <el-text class="mx-1" size="large">所属地区</el-text>
  539. <el-select v-model="admin.market" placeholder="请选择所属地区" style="width: 240px" clearable>
  540. <el-option v-for="item in market" :key="item" :label="item" :value="item" />
  541. </el-select>
  542. </div>
  543. <div class="head-card-element" style="margin-left: 50px">
  544. <el-text class="mx-1" size="large">职位名称</el-text>
  545. <el-select v-model="admin.postiton" placeholder="请选择职位名称" style="width: 240px" clearable>
  546. <el-option v-for="item in postiton" :key="item" :label="item" :value="item" />
  547. </el-select>
  548. </div>
  549. <div class="head-card-btn">
  550. <el-button type="success" @click="reset()">重置</el-button>
  551. <el-button type="primary" @click="search()">查询</el-button>
  552. </div>
  553. </div>
  554. </el-card>
  555. </el-col>
  556. </el-row>
  557. <el-row>
  558. <el-col>
  559. <el-card>
  560. <!-- 展示表单 -->
  561. <div class="add-item">
  562. <el-button style="color: #048efb; border: 1px solid #048efb" @click="userAddInit()">新增用户</el-button>
  563. <el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()">新增角色</el-button>
  564. </div>
  565. <div>
  566. <el-table :data="tableData" style="width: 100%" show-overflow-tooltip>
  567. <el-table-column type="index" label="序号" width="100px" fixed="left">
  568. <template #default="scope">
  569. <span>{{
  570. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  571. }}</span>
  572. </template>
  573. </el-table-column>
  574. <el-table-column prop="account" label="OA号" />
  575. <el-table-column prop="name" label="姓名" />
  576. <el-table-column prop="market" label="所属地区" />
  577. <el-table-column prop="postiton" label="职位" />
  578. <el-table-column prop="roleName" label="部门权限">
  579. </el-table-column>
  580. <el-table-column prop="remark" label="备注" />
  581. <el-table-column prop="operation" label="操作" width="200px">
  582. <template #default="scope">
  583. <el-button type="warning" text @click="permissionEditInit(scope.row)"
  584. :disabled="scope.row.adminStatus === 0">
  585. 修改权限
  586. </el-button>
  587. <el-popconfirm title="确定将此用户删除吗?" @confirm="delConfirm">
  588. <template #reference>
  589. <el-button type="danger" text @click="del(scope.row)" :disabled="scope.row.adminStatus === 0">
  590. 删除
  591. </el-button>
  592. </template>
  593. <template #actions="{ confirm, cancel }">
  594. <el-button size="small" @click="cancel">取消</el-button>
  595. <el-button type="primary" size="small" @click="confirm">
  596. 确定
  597. </el-button>
  598. </template>
  599. </el-popconfirm>
  600. </template>
  601. </el-table-column>
  602. <el-table-column prop="adminStatus" label="状态">
  603. <template #default="scope">
  604. <el-switch v-model="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large"
  605. @change="editStatus(scope.row)" style="
  606. --el-switch-on-color: #13ce66;
  607. --el-switch-off-color: #ff4949;
  608. " active-text="启用" inactive-text="禁用" inline-prompt />
  609. </template>
  610. </el-table-column>
  611. </el-table>
  612. </div>
  613. <!-- 分页 -->
  614. <div class="pagination" style="margin-top: 20px">
  615. <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  616. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
  617. @current-change="handleCurrentChange"></el-pagination>
  618. </div>
  619. </el-card>
  620. </el-col>
  621. </el-row>
  622. <!-- 新增用户权限 -->
  623. <el-dialog v-model="userAddVisible" title="新增用户权限" width="800px" :close-on-click-modal="false">
  624. <template #footer>
  625. <!-- 居中显示 -->
  626. <el-form ref="Ref" :model="addAdmin" label-width="auto" style="max-width: 600px; align-items: center">
  627. <el-form-item prop="account" label="OA号:" required clearable>
  628. <el-input v-model="addAdmin.account" placeholder="请输入OA号" style="width: 220px" />
  629. </el-form-item>
  630. <el-form-item prop="name" label="用户名:" required clearable>
  631. <el-input v-model="addAdmin.name" placeholder="请输入用户名" style="width: 220px" />
  632. </el-form-item>
  633. <el-form-item prop="market" label="所属地区:" required clearable>
  634. <el-select multiple v-model="addAdmin.market" placeholder="请选择所属地区" style="width: 440px" clearable>
  635. <el-option v-for="item in market" :key="item" :label="item" :value="item" :disabled="includeHq(item)" />
  636. </el-select>
  637. </el-form-item>
  638. <el-form-item prop="permission" label="角色名称:" required>
  639. <el-select v-model="addAdmin.permission" placeholder="请选择角色名称" style="width: 220px" clearable>
  640. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  641. :value="item.value"></el-option>
  642. </el-select>
  643. </el-form-item>
  644. <el-form-item prop="postiton" label="职位:" required>
  645. <el-input v-model="addAdmin.postiton" placeholder="请输入职位" style="width: 220px" clearable />
  646. </el-form-item>
  647. <el-form-item prop="machineId" label="机器码:" required>
  648. <div style="display: flex; align-items: center; flex-wrap: wrap;">
  649. <el-input v-model="addAdmin.machineId" placeholder="请输入机器码" style="width: 220px; margin-right: 10px;"
  650. clearable />
  651. <el-button type="primary" @click="addMachineIdInput">添加</el-button>
  652. <!-- 动态添加的机器码输入框 -->
  653. <div v-for="(item, index) in addAdmin.machineIds" :key="index" style="margin-left: 10px;">
  654. <el-input v-model="addAdmin.machineIds[index]" placeholder="请输入机器码"
  655. style="width: 180px; margin-right: 10px;" />
  656. </div>
  657. </div>
  658. </el-form-item>
  659. <el-form-item prop="remark" label="备注">
  660. <el-input v-model="addAdmin.remark" style="width: 300px" :rows="2" maxlength="100" show-word-limit
  661. type="textarea" />
  662. </el-form-item>
  663. </el-form>
  664. <div>
  665. <el-button @click="closeUserAddVisible()">取消</el-button>
  666. <el-button type="primary" @click="throttledPermissionAdd()">
  667. 提交
  668. </el-button>
  669. </div>
  670. </template>
  671. </el-dialog>
  672. <!-- 这是编辑用户权限弹窗 -->
  673. <el-dialog v-model="userEditVisible" title="编辑用户权限" width="800px" :close-on-click-modal="false">
  674. <el-form ref="Ref" :model="permissionEditObj" label-width="auto" style="max-width: 600px; align-items: center">
  675. <el-form-item prop="userName" label="用户名称:" required>
  676. <el-input v-model="permissionEditObj.userName" placeholder="请输入用户名" style="width: 220px" />
  677. </el-form-item>
  678. <el-form-item prop="roleName" label="角色名称:" required>
  679. <el-input v-model="permissionEditObj.roleName" placeholder="请输入用户名" style="width: 220px" />
  680. </el-form-item>
  681. <el-form-item prop="parentName" label="上级角色:" required>
  682. <el-select v-model="permissionEditObj.parentName" placeholder="请选择上级角色" style="width: 220px">
  683. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  684. :value="item.value"></el-option>
  685. </el-select>
  686. </el-form-item>
  687. <el-form-item prop="permissionSelect" label="权限列表:" required>
  688. <el-tree multiple v-model="permissionEditObj.permissionSelect" :data="data" :render-after-expand="false"
  689. show-checkbox style="width: 700px" />
  690. </el-form-item>
  691. </el-form>
  692. <div>
  693. </div>
  694. <template #footer>
  695. <div>
  696. <el-button @click="closeUserEditVisible()">取消</el-button>
  697. <el-button type="primary" @click="throttledPermissionEdit">
  698. 提交
  699. </el-button>
  700. </div>
  701. </template>
  702. </el-dialog>
  703. <!-- 新增角色 -->
  704. <el-dialog v-model="permissionAddVisible" title="新增角色" width="800px" :close-on-click-modal="false">
  705. <template #footer>
  706. <el-form ref="Ref" :model="addRole" label-width="auto" style="max-width: 600px; align-items: center">
  707. <el-form-item prop="roleName" label="角色名称:" required>
  708. <el-input v-model="addRole.roleName" placeholder="请输入用户名" style="width: 220px" />
  709. </el-form-item>
  710. <el-form-item prop="parentName" label="上级角色:">
  711. <el-select v-model="addRole.parentName" placeholder="请选择上级角色" style="width: 220px" clearable>
  712. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  713. :value="item.value"></el-option>
  714. </el-select>
  715. </el-form-item>
  716. <el-form-item prop="checkedKeys" label="权限列表:" required>
  717. <el-tree :data="filteredData" show-checkbox node-key="value" :props="{ label: 'label', children: 'children' }"
  718. :checked-keys="addRole.checkedKeys" @check="handleCheckChange" />
  719. </el-form-item>
  720. <el-form-item prop="grade" label="优先级:" required>
  721. <el-input v-model="addRole.grade" placeholder="数字1~999" style="width: 220px" />
  722. </el-form-item>
  723. </el-form>
  724. <div>
  725. <el-button @click="closePermissionAddVisible()">取消</el-button>
  726. <el-button type="primary" @click="handleAddRole">
  727. 提交
  728. </el-button>
  729. </div>
  730. </template>
  731. </el-dialog>
  732. </template>
  733. <style scoped>
  734. .pagination {
  735. display: flex;
  736. }
  737. .status {
  738. display: flex;
  739. }
  740. .head-card {
  741. display: flex;
  742. }
  743. .head-card-element {
  744. margin-right: 20px;
  745. }
  746. .head-card-btn {
  747. margin-left: auto;
  748. }
  749. /* 新增样式让弹窗内容居中 */
  750. .el-dialog__body {
  751. display: flex;
  752. flex-direction: column;
  753. align-items: center;
  754. }
  755. .el-dialog__footer {
  756. display: flex;
  757. flex-direction: column;
  758. align-items: center;
  759. }
  760. </style>