index.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <template>
  2. <div class="app-container page-nesting" style="position: relative">
  3. <!-- 左侧start -->
  4. <div class="grid-content treeDom roleLeft">
  5. <div style="" class="mb-20 addBox">
  6. <b>角色类型</b>
  7. <el-button type="success" @click="addRole()" :disabled="store.state.authorities.indexOf('新增')==-1">新增</el-button>
  8. <el-button type="primary" @click="editRole()" :disabled="store.state.authorities.indexOf('修改')==-1">修改</el-button>
  9. </div>
  10. <el-radio-group v-model="radio1">
  11. <el-radio-button
  12. @change="listTabsChange(radio1, item)"
  13. v-for="(item, index) in roleData"
  14. :label="item.roleId"
  15. :key="index"
  16. >
  17. <img src="@/assets/images/userIcon.svg" />
  18. {{ item.roleName }}
  19. <i v-if="store.state.authorities.indexOf('删除')!=-1" class="el-icon-delete" @click="deleteRoleItem(item)"></i>
  20. </el-radio-button>
  21. </el-radio-group>
  22. </div>
  23. <!-- 左侧end -->
  24. <!-- 右侧表格start -->
  25. <div class="grid-content nestingDom" style="width: calc(100% - 300px)">
  26. <role-info-com
  27. class="basicInfo"
  28. style="height: calc(100vh - 140px)"
  29. v-if="menuData.length > 0&&menuData2.length > 0"
  30. :menuData="menuData"
  31. :menuData2="menuData2"
  32. :checkedKeys="checkedKeys"
  33. :objItem="objItem"
  34. :radio1="radio1"
  35. ></role-info-com>
  36. </div>
  37. <!-- 右侧表格end -->
  38. <!-- 新建角色start -->
  39. <add-role-com
  40. :dialog-title="dialogTitle"
  41. :itemInfo="tableItem"
  42. @closeDialog="closeDialog"
  43. :flag="showDialog"
  44. ></add-role-com>
  45. <!-- 新建角色end -->
  46. </div>
  47. </template>
  48. <script>
  49. import { defineComponent, ref, reactive, onMounted } from 'vue'
  50. import * as api from '@/api/systemManage/rolePermission.js'
  51. import { ElMessage } from 'element-plus'
  52. import roleInfoCom from './roleInfoCom'
  53. import addRoleCom from './addRoleCom'
  54. import { useStore } from 'vuex'
  55. export default defineComponent({
  56. components: { roleInfoCom, addRoleCom },
  57. setup() {
  58. const store = useStore()
  59. const radio1 = ref('1')
  60. const showDialog = ref(false)
  61. const roleData = ref([])
  62. const menuData = ref([])
  63. const menuData2 = ref([])
  64. const newMenuData = ref([])
  65. const checkedKeys = ref([])
  66. const objItem = ref({})
  67. const dialogTitle = ref('')
  68. // 删除左侧角色列表
  69. function deleteRoleItem(item) {
  70. // item
  71. // console.log(radio1.value)
  72. // console.log(item.roleId)
  73. // this.roleData.splice(params, 1)
  74. api.roleDelete({}, item.roleId).then((requset) => {
  75. if (requset.status === 'SUCCESS') {
  76. ElMessage.success({
  77. message: '删除成功',
  78. type: 'success',
  79. })
  80. roleList()
  81. } else {
  82. ElMessage.error(requset.msg)
  83. }
  84. })
  85. }
  86. // 新增角色
  87. const tableItem = reactive([])
  88. function addRole() {
  89. // alert('新增')
  90. tableItem.value = {
  91. roleName: '',
  92. roleKey: '',
  93. status: '',
  94. roleSort: 1,
  95. }
  96. dialogTitle.value = '角色新增'
  97. showDialog.value = true
  98. }
  99. // 修改角色
  100. function editRole() {
  101. // alert('修改')
  102. // console.log(radio1.value)
  103. api.roleDetail({}, radio1.value).then((requset) => {
  104. if (requset.status === 'SUCCESS') {
  105. tableItem.value = {
  106. roleName: requset.data.roleName,
  107. roleKey: requset.data.roleKey,
  108. status: requset.data.status,
  109. roleSort: Number(requset.data.roleSort),
  110. roleId: requset.data.roleId,
  111. }
  112. dialogTitle.value = '角色修改'
  113. showDialog.value = true
  114. } else {
  115. ElMessage.error(requset.msg)
  116. }
  117. })
  118. }
  119. const listTabsChange = (value, item) => {
  120. // console.log('value')
  121. console.log(radio1.value)
  122. radio1.value = value
  123. objItem.value = item
  124. // console.log('objItem.value')
  125. // console.log(objItem.value)
  126. roleMenuTreeselect()
  127. getAuthorityTable()
  128. }
  129. // 表格树结构渲染
  130. function roleMenuTreeselect() {
  131. menuData.value = []
  132. api.roleMenuTreeselect({}, radio1.value).then((requset) => {
  133. if (requset.code == 200) {
  134. menuData.value = requset.data.menus
  135. // getTreeData2(menuData.value) //对树结构返回值进行重组
  136. checkedKeys.value = requset.data.checkedKeys
  137. //当返回值没有选中菜单时,否
  138. if (!checkedKeys.value.length) {
  139. menuData.value.map((item) => {
  140. item.authority2 = '0'
  141. })
  142. if (radio1.value == 1) {
  143. menuData.value.map(function (item) {
  144. checkedKeys.value.push(item.id)
  145. checkedKeys.value.map(function (num) {
  146. if (JSON.stringify(item).indexOf(num) != -1) {
  147. item.authority2 = '1'
  148. }
  149. })
  150. })
  151. }
  152. } else {
  153. menuData.value.map(function (item) {
  154. item.authority2 = '0'
  155. checkedKeys.value.map(function (num) {
  156. if (JSON.stringify(item).indexOf(num) != -1) {
  157. item.authority2 = '1'
  158. }
  159. })
  160. })
  161. }
  162. } else {
  163. ElMessage.error(requset.msg)
  164. }
  165. })
  166. }
  167. //小吉新接口渲染右侧表格树数据
  168. function getAuthorityTable() {
  169. menuData2.value = []
  170. api.getAuthorityTable({roleId:radio1.value}).then((requset) => {
  171. if (requset.code == 200) {
  172. menuData2.value = requset.data
  173. } else {
  174. ElMessage.error(requset.msg)
  175. }
  176. })
  177. }
  178. function getTreeData2(data) {
  179. for (var i = 0; i < data.length; i++) {
  180. if (data[i].label == data[i].children[0].label) {
  181. // console.log(data[i].label)
  182. data[i].children = data[i].children[0].children
  183. }
  184. }
  185. return data
  186. }
  187. // 关闭弹框操作
  188. const closeDialog = () => {
  189. showDialog.value = false
  190. roleList()
  191. console.log('1111aaa'+radio1.value)
  192. }
  193. //角色列表
  194. function roleList() {
  195. api.roleList().then((requset) => {
  196. if (requset.code === 200) {
  197. roleData.value = requset.rows
  198. // var item = requset.rows[0]
  199. // objItem.value = {
  200. // roleSort: item.roleSort,
  201. // roleKey: item.roleKey,
  202. // roleName: item.roleName,
  203. // }
  204. } else {
  205. ElMessage.error(requset.msg)
  206. }
  207. })
  208. }
  209. onMounted(() => {
  210. roleList()
  211. roleMenuTreeselect()
  212. getAuthorityTable()
  213. })
  214. return {
  215. radio1,
  216. showDialog,
  217. roleData,
  218. dialogTitle,
  219. tableItem,
  220. menuData,
  221. menuData2,
  222. newMenuData,
  223. checkedKeys,
  224. listTabsChange,
  225. roleMenuTreeselect,
  226. getAuthorityTable,
  227. deleteRoleItem,
  228. addRole,
  229. editRole,
  230. closeDialog,
  231. objItem,
  232. getTreeData2,
  233. store,
  234. }
  235. },
  236. })
  237. </script>
  238. <style scoped lang="scss">
  239. .el-button + .el-button {
  240. margin-left: 0;
  241. }
  242. .app-container.page-nesting {
  243. padding: 0;
  244. background: rgba(0, 0, 0, 0);
  245. }
  246. .grid-content {
  247. background: #fff;
  248. height: calc(100vh - 140px);
  249. overflow-y: auto;
  250. }
  251. .el-input__inner {
  252. border-radius: 20px !important;
  253. }
  254. .treeDom {
  255. width: 270px;
  256. position: absolute;
  257. left: 0;
  258. // margin-left: 20px;
  259. padding: 15px;
  260. // min-height: calc(100vh - 130px);
  261. height: calc(100vh - 140px);
  262. }
  263. .nestingDom {
  264. margin-left: 285px;
  265. }
  266. </style>