index.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <template>
  2. <Edit v-model="showCodesEditForm" :role="editRole"></Edit>
  3. <div>
  4. <el-card class="box-card" v-loading="wholeLoading" element-loading-text="Loading..." style="height: 600px">
  5. <template #header>
  6. <div class="card-header">
  7. <span>权限管理</span>
  8. <div>
  9. <el-button type="default" @click="reflush()">刷新列表</el-button>
  10. <el-button type="primary" @click="create()">新增角色</el-button>
  11. </div>
  12. </div>
  13. </template>
  14. <el-auto-resizer>
  15. <template #default="{ height, width }">
  16. <el-table-v2 :data="data" :columns="columns" :width="width" :height="600" fixed />
  17. </template>
  18. </el-auto-resizer>
  19. </el-card>
  20. </div>
  21. </template>
  22. <script lang="ts" setup name="underlyingRoleManage">
  23. import { ref, reactive, onMounted, h } from 'vue'
  24. import { ElSwitch, ElTag, ElMessage, ElMessageBox, ElButton, TableV2FixedDir, roleTypes } from 'element-plus'
  25. import type { Column, RowClassNameGetter } from 'element-plus'
  26. import { throttle } from 'lodash'
  27. import { init, update } from '/@/api/role'
  28. import type { Role } from '/@/api/role'
  29. import Edit from '/@/components/role/edit.vue'
  30. /**
  31. * 表格数据
  32. */
  33. const data = await init()
  34. /**
  35. * 整个页面的loading
  36. */
  37. const wholeLoading = ref(false)
  38. /**
  39. * 编辑权限表单的显示控制
  40. */
  41. const showCodesEditForm = ref(false)
  42. const editRole = ref<Role>()
  43. /**
  44. * 虚拟表格列信息
  45. */
  46. const columns: Column<any>[] = [
  47. {
  48. key: 'name',
  49. title: '角色名',
  50. dataKey: 'name',
  51. width: 150,
  52. },
  53. {
  54. key: 'codes_cn',
  55. title: '权限值',
  56. dataKey: 'codes_cn',
  57. width: 400,
  58. cellRenderer: ({ cellData: codes_cn }) => h(
  59. 'div',
  60. codes_cn?.map(cn => h(ElTag, { style: { 'margin-right': '5px' } }, cn))
  61. ),
  62. },
  63. {
  64. key: 'remark',
  65. title: '备注',
  66. dataKey: 'remark',
  67. width: 300,
  68. },
  69. {
  70. key: 'valid',
  71. title: '是否启用',
  72. dataKey: 'valid',
  73. width: 100,
  74. cellRenderer: ({ cellData: valid }) => h(
  75. ElTag,
  76. { effect: valid ? 'dark' : 'plain' }, valid ? '已启用' : '已禁用'
  77. ),
  78. },
  79. {
  80. key: 'op',
  81. title: '操作',
  82. width: 400,
  83. fixed: TableV2FixedDir.RIGHT,
  84. flexGrow: 1,
  85. cellRenderer: ({ rowData: row }) =>
  86. h('div', [
  87. // 启用禁用
  88. h(
  89. ElButton,
  90. {
  91. type: row.valid ? 'danger' : 'success',
  92. onClick: throttle(() => {
  93. row.valid = !row.valid
  94. update(row)
  95. }),
  96. },
  97. row.valid ? '禁用' : '启用'
  98. ),
  99. // 打开权限表单
  100. h(
  101. ElButton,
  102. {
  103. type: 'primary',
  104. onClick: throttle(() => {
  105. showCodesEditForm.value = true
  106. console.log(showCodesEditForm)
  107. editRole.value = row
  108. }),
  109. },
  110. '权限'
  111. ),
  112. ]),
  113. },
  114. ]
  115. /**
  116. * 创建
  117. */
  118. const create = () => { }
  119. /**
  120. * 刷新
  121. */
  122. const reflush = () => { }
  123. </script>
  124. <style lang="scss" scoped>
  125. .box-card {
  126. margin: 10px;
  127. }
  128. .card-header {
  129. display: flex;
  130. justify-content: space-between;
  131. align-items: center;
  132. overflow-x: auto;
  133. }
  134. </style>