index.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. <template>
  2. <div class="pa-3 white">
  3. <m-search :items="searchItems" v-model="searchValues" class="mb-3" @search="search" @reset="search">
  4. <template #button>
  5. <el-button type="primary" icon="el-icon-plus" @click="onAdd">
  6. 新增
  7. </el-button>
  8. </template>
  9. </m-search>
  10. <MTable
  11. v-loading="loading"
  12. :items="items"
  13. :headers="headers"
  14. :page-size="pageInfo.size"
  15. :page-current="pageInfo.current"
  16. :total="pageInfo.total"
  17. @page-change="handlePageChange"
  18. >
  19. <template #createTime="scope">
  20. {{ dateFormat(scope.row.createTime) }}
  21. </template>
  22. <template #actions="scope">
  23. <m-button type="primary" text @click="onEdit(scope.row)">编辑</m-button>
  24. <m-button type="primary" text @click="onMenu(scope.row)">菜单权限</m-button>
  25. <m-button type="primary" text @click="onPermission(scope.row)">数据权限</m-button>
  26. <m-button type="danger" text @click="onDelete(scope.row)">删除</m-button>
  27. </template>
  28. </MTable>
  29. <MDialog ref="dialog" :title="itemData.id ? '编辑角色' : '新增角色'" @sure="handleSave">
  30. <MForm ref="roleForm" :items="roleFormItems" v-model="roleFormValue"></MForm>
  31. </MDialog>
  32. <MDialog ref="menuDialog" title="菜单权限编辑" @sure="handleSaveMenu">
  33. <MForm ref="menuForm">
  34. <el-form-item label="角色名称">
  35. <el-tag>{{ itemData.roleName }}</el-tag>
  36. </el-form-item>
  37. <el-form-item label="菜单权限" required>
  38. <m-card shadow="never">
  39. <el-tree
  40. ref="menuTree"
  41. :data="menuData"
  42. show-checkbox
  43. node-key="id"
  44. :props="{
  45. children: 'children',
  46. label: 'label'
  47. }"
  48. >
  49. </el-tree>
  50. </m-card>
  51. </el-form-item>
  52. </MForm>
  53. </MDialog>
  54. <MDialog ref="dataDialog" title="数据权限编辑" @sure="handleSaveData">
  55. <MForm ref="roleForm" :items="roleFormItems" v-model="roleFormValue"></MForm>
  56. </MDialog>
  57. </div>
  58. </template>
  59. <script>
  60. import {
  61. getRoleList,
  62. deleteRole,
  63. getRoleDetails,
  64. saveRole,
  65. getMenuTree,
  66. saveDataPermission
  67. } from '@/api/menu'
  68. import { dateFormat } from '@/utils/date'
  69. export default {
  70. name: 'role-manage-role',
  71. data () {
  72. return {
  73. itemData: {},
  74. roleFormItems: [
  75. {
  76. label: '角色名称',
  77. prop: 'roleName',
  78. type: 'input',
  79. rules: [
  80. { required: true, message: '请输入角色名称', trigger: 'blur' }
  81. ]
  82. }
  83. ],
  84. roleFormValue: {
  85. roleName: null
  86. },
  87. menuFormItems: [
  88. {
  89. label: '角色名称'
  90. }
  91. ],
  92. searchValues: {
  93. roleName: null
  94. },
  95. searchItems: [
  96. {
  97. label: '角色名称',
  98. prop: 'roleName',
  99. type: 'input'
  100. }
  101. ],
  102. menuData: [],
  103. itemDataPermission: {},
  104. show: false,
  105. showMenu: false,
  106. headers: [
  107. { label: '角色', align: 'start', prop: 'roleName' },
  108. { label: '创建时间', align: 'start', prop: 'createTime' },
  109. { label: '操作', align: 'start', prop: 'actions', fixed: 'right' }
  110. ],
  111. items: [],
  112. total: 0,
  113. pageInfo: {
  114. size: 10,
  115. current: 1
  116. },
  117. orders: [],
  118. loading: false
  119. }
  120. },
  121. // computed: {
  122. // defaultCheckedKeys () {
  123. // if (Object.keys(this.itemData).length === 0) {
  124. // return []
  125. // }
  126. // return this.itemData.menuIds.split(',').map(e => +e)
  127. // }
  128. // },
  129. created () {
  130. this.getMenu()
  131. },
  132. methods: {
  133. async getMenu () {
  134. try {
  135. const { data } = await getMenuTree({})
  136. this.menuData = data.routes
  137. this.initPage()
  138. } catch (error) {
  139. this.$message.error(error)
  140. }
  141. },
  142. async initPage () {
  143. this.loading = true
  144. try {
  145. const { data } = await getRoleList({ ...this.pageInfo, orders: this.orders, entity: this.searchValues })
  146. this.items = data.records
  147. this.total = data.total
  148. } catch (error) {
  149. this.$message.error(error)
  150. } finally {
  151. this.loading = false
  152. }
  153. },
  154. async getDetails (roleId) {
  155. try {
  156. const { data } = await getRoleDetails({ roleId })
  157. this.itemData = data
  158. Object.assign(this.itemData, data)
  159. return data
  160. } catch (error) {
  161. this.$message.error(error)
  162. }
  163. },
  164. onAdd () {
  165. this.roleFormValue = {
  166. roleName: null
  167. }
  168. this.itemData = {}
  169. this.$refs.dialog.open()
  170. },
  171. async onEdit (item) {
  172. const data = await this.getDetails(item.id)
  173. if (!data) {
  174. return
  175. }
  176. this.roleFormValue = {
  177. roleName: data.roleName
  178. }
  179. this.itemData = data
  180. this.$refs.dialog.open()
  181. },
  182. async onMenu (item) {
  183. const data = await this.getDetails(item.id)
  184. if (!data) {
  185. return
  186. }
  187. this.itemData = data
  188. this.$refs.menuDialog.open()
  189. this.$nextTick(() => {
  190. this.$refs.menuTree.setCheckedKeys(data.menuIds.split(',').map(e => +e))
  191. })
  192. },
  193. async onPermission (item) {
  194. const data = await this.getDetails(item.id)
  195. if (!data) {
  196. return
  197. }
  198. this.itemData = data
  199. this.$refs.dataDialog.open()
  200. },
  201. onDelete (item) {
  202. this.$confirm('是否确定删除该选项', '提示', {
  203. confirmButtonText: '确定',
  204. cancelButtonText: '取消',
  205. type: 'warning'
  206. }).then(async () => {
  207. try {
  208. await deleteRole({ id: item.id })
  209. this.$message.success('删除成功')
  210. this.initPage()
  211. } catch (error) {
  212. this.$message.error(error)
  213. }
  214. }).catch(_ => {})
  215. },
  216. handleData (item) {
  217. this.itemDataPermission = item
  218. this.showMenu = true
  219. },
  220. handleSave () {
  221. this.$refs.roleForm.validate(async (valid) => {
  222. if (!valid) {
  223. return
  224. }
  225. const obj = {
  226. ...this.roleFormValue,
  227. menuIds: '-9999'
  228. }
  229. try {
  230. await saveRole(obj)
  231. this.$message.success(this.itemData.id ? '编辑成功' : '添加成功')
  232. this.$refs.dialog.close()
  233. this.initPage()
  234. } catch (error) {
  235. this.$message.error(error)
  236. }
  237. })
  238. },
  239. async handleSaveMenu () {
  240. const menuIds = this.$refs.menuTree.getCheckedKeys(true)
  241. if (!menuIds.length) {
  242. this.$message.warning('请选择菜单')
  243. return
  244. }
  245. const obj = {
  246. id: this.itemData.id,
  247. menuIds: menuIds.join(',')
  248. }
  249. try {
  250. await saveRole(obj)
  251. this.$message.success('保存成功')
  252. this.$refs.menuDialog.close()
  253. this.initPage()
  254. } catch (error) {
  255. this.$message.error(error)
  256. }
  257. },
  258. async handleSaveData () {
  259. try {
  260. await saveDataPermission({
  261. roleId: this.itemData.id
  262. // menuIds: menuIds.join(',')
  263. })
  264. this.$message.success('保存成功')
  265. this.showMenu = false
  266. this.initPage()
  267. } catch (error) {
  268. this.$message.error(error)
  269. }
  270. },
  271. handlePageChange (page) {
  272. this.pageInfo.current = page
  273. this.initPage()
  274. },
  275. dateFormat (str) {
  276. const date = new Date(+str * 1000)
  277. return dateFormat('YYYY-mm-dd HH:MM:SS', date)
  278. },
  279. handleSort (val) {
  280. this.orders = val
  281. this.initPage()
  282. },
  283. search (val) {
  284. Object.assign(this.searchValues, val)
  285. this.pageInfo.current = 1
  286. this.initPage()
  287. }
  288. }
  289. }
  290. </script>
  291. <style lang="scss" scoped>
  292. </style>