index.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <template>
  2. <zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: $route.meta.title+'-列表', essential: true }]">
  3. <template slot-scope="{activeKey, data}">
  4. <div :style="{
  5. width: '100%',
  6. height: activeKey == 'list' ? '100%' : '0px',
  7. overflow: 'hidden'
  8. }">
  9. <div class="app-container">
  10. <div class="setting_title">权限管理</div>
  11. <el-divider></el-divider>
  12. <div class="mymain-container">
  13. <div class="btn-group clearfix">
  14. <div class="fl">
  15. <el-button size="small" type="primary" icon="el-icon-plus" @click="addOrEdit('add')">新增角色</el-button>
  16. </div>
  17. <div class="fr">
  18. </div>
  19. </div>
  20. <div class="table">
  21. <el-table v-loading="listLoading" :data="dataList" element-loading-text="Loading" border fit
  22. highlight-current-row stripe>
  23. <el-table-column align="center" label="序号" type="index" width="50"></el-table-column>
  24. <el-table-column align="center" label="角色" prop="name"></el-table-column>
  25. <el-table-column align="center" label="操作" width="180">
  26. <template slot-scope="scope">
  27. <el-button type="text" @click="setMenuRole(scope.row.adminRoleId)">设置权限</el-button>
  28. <el-button type="text" @click="addOrEdit('edit', scope.row.adminRoleId)"
  29. v-if="scope.row.adminRoleId != 1">编辑</el-button>
  30. <el-popconfirm style="margin-left: 10px;" title="确定删除吗?"
  31. @confirm="handleDelete(scope.row.adminRoleId)" v-if="scope.row.adminRoleId != 1">
  32. <el-button slot="reference" type="text">删除</el-button>
  33. </el-popconfirm>
  34. </template>
  35. </el-table-column>
  36. </el-table>
  37. </div>
  38. <div class="pagination clearfix">
  39. <div class="fr">
  40. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
  41. :current-page="currentPage" :page-sizes="[10, 20, 30, 50]" :page-size="10"
  42. layout="total, sizes, prev, pager, next, jumper" :total="listTotal">
  43. </el-pagination>
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. </div>
  49. <div v-if="~['add', 'edit'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
  50. <el-form ref="addForm" :model="addForm" :rules="addFormRules" label-position="left" label-width="100px">
  51. <el-form-item label="角色名" prop="name">
  52. <el-input v-model="addForm.name" autocomplete="off" placeholder="请输入角色名"></el-input>
  53. </el-form-item>
  54. </el-form>
  55. <div slot="footer" class="dialog-footer">
  56. <el-button size="mini" @click="data.removeTab()">取 消</el-button>
  57. <el-button size="mini" type="primary" @click="submitAddForm(data.removeTab)">确 定</el-button>
  58. </div>
  59. </div>
  60. <div v-if="~['detail'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
  61. <zj-tree :data="menuRoleList" show-checkbox :default-expand-all="true" node-key="moduleId" ref="tree"
  62. highlight-current :props="defaultProps">
  63. </zj-tree>
  64. <div slot="footer" class="dialog-footer">
  65. <el-button size="mini" @click="data.removeTab()">{{ editId != 1 ? '取 消' : '关 闭' }}</el-button>
  66. <el-button size="mini" type="primary" @click="submitRoleForm(data.removeTab)" v-if="editId != 1">确 定</el-button>
  67. </div>
  68. </div>
  69. </template>
  70. </zj-tab-page>
  71. </template>
  72. <script>
  73. import { mapGetters } from 'vuex'
  74. import { getRoleList, addRole, editRole, getRoleDetail, deleteRole, getMenuList, getMenuRoleIds, setMenuRole } from '@/api/setting'
  75. export default {
  76. data() {
  77. return {
  78. baseURL: process.env.VUE_APP_BASE_API,
  79. dataList: null, // 列表数据
  80. listLoading: true, // 列表加载loading
  81. currentPage: 1, // 当前页码
  82. pageSize: 10, // 每页数量
  83. listTotal: 0, // 列表总数
  84. editId: null,
  85. addFormType: 'add',
  86. addForm: {
  87. name: '', // 角色名
  88. },
  89. addFormRules: {
  90. name: [
  91. { required: true, message: '请输入角色名', trigger: 'blur' }
  92. ],
  93. },
  94. menuRoleList: [],
  95. defaultProps: {
  96. children: 'children',
  97. label: 'moduleName'
  98. }
  99. }
  100. },
  101. computed: {
  102. ...mapGetters([
  103. 'userid',
  104. 'name'
  105. ])
  106. },
  107. created() {
  108. this.getList();
  109. },
  110. methods: {
  111. getList() {
  112. this.listLoading = true;
  113. let params = {
  114. pageNum: this.currentPage,
  115. pageSize: this.pageSize
  116. };
  117. getRoleList(params).then(res => {
  118. this.dataList = res.data.records;
  119. this.listTotal = res.data.total;
  120. this.listLoading = false;
  121. })
  122. },
  123. // 更改每页数量
  124. handleSizeChange(val) {
  125. this.pageSize = val;
  126. this.currentPage = 1;
  127. this.getList();
  128. },
  129. // 更改当前页
  130. handleCurrentChange(val) {
  131. this.currentPage = val;
  132. this.getList();
  133. },
  134. // 操作 - 删除
  135. handleDelete(id) {
  136. deleteRole({ adminRoleId: id }).then(res => {
  137. this.getList();
  138. this.$successMsg();
  139. })
  140. },
  141. // 新增编辑
  142. addOrEdit(type, id) {
  143. this.$refs.tabPage.addTab({
  144. activeKey: type,
  145. key: type,
  146. label: ({ add: "新增", edit: "编辑" })[type],
  147. triggerEvent: () => {
  148. this.$refs?.addForm?.resetFields();
  149. this.$data.addForm = this.$options.data().addForm
  150. this.addFormType = type;
  151. if (type == 'edit') {
  152. this.editId = id;
  153. getRoleDetail({ adminRoleId: id }).then(res => {
  154. this.addForm = {
  155. name: res.data.name
  156. }
  157. })
  158. }
  159. },
  160. closeEvent: () => {
  161. }
  162. })
  163. },
  164. // 提交 新增编辑
  165. submitAddForm(removeTab) {
  166. this.$refs.addForm.validate((valid) => {
  167. if (valid) {
  168. let params = {
  169. name: this.addForm.name
  170. }
  171. if (this.addFormType == 'edit') {
  172. params.adminRoleId = this.editId;
  173. editRole(params).then(res => {
  174. removeTab('list');
  175. this.getList();
  176. this.$successMsg('编辑成功');
  177. })
  178. } else {
  179. addRole(params).then(res => {
  180. removeTab('list');
  181. this.getList();
  182. this.$successMsg('新增成功');
  183. })
  184. }
  185. }
  186. })
  187. },
  188. // 设置权限 - 获取列表
  189. setMenuRole(id) {
  190. this.$refs.tabPage.addTab({
  191. activeKey: "detail",
  192. key: "detail",
  193. label: "设置权限",
  194. triggerEvent: () => {
  195. this.$nextTick(() => {
  196. this.editId = id;
  197. function aaa(list) {
  198. for (var item of list) {
  199. if (item.type == 3) {
  200. item.tiling = true
  201. item.labelWidthNum = 115
  202. }
  203. if (item.children && item.children.length) {
  204. aaa(item.children)
  205. }
  206. }
  207. }
  208. getMenuList({ adminUserId: this.userid }).then(res => {
  209. aaa(res.data);
  210. this.menuRoleList = res.data
  211. })
  212. getMenuRoleIds({ adminRoleId: id }).then(res => {
  213. this.$refs.tree.setCheckedKeys(res.data);
  214. })
  215. })
  216. },
  217. closeEvent: () => {
  218. }
  219. })
  220. },
  221. // 设置权限 - 提交数据
  222. submitRoleForm(removeTab) {
  223. let params = {
  224. adminModuleIds: this.$refs.tree.getCheckedKeys(),
  225. adminModuleIds2: this.$refs.tree.getHalfCheckedKeys(),
  226. adminRoleId: this.editId,
  227. }
  228. setMenuRole(params).then(res => {
  229. removeTab('list')
  230. this.getList();
  231. this.$successMsg();
  232. })
  233. },
  234. }
  235. }
  236. </script>
  237. <style lang="scss">
  238. .tree-dialog {
  239. .el-dialog__body {
  240. padding: 20px;
  241. .el-tree {
  242. max-height: calc(100vh - 140px - 54px - 70px);
  243. overflow-y: scroll;
  244. padding: 0 30px;
  245. >.el-tree-node {
  246. padding: 15px 0;
  247. border: 1px dashed #ddd;
  248. margin-bottom: 15px;
  249. border-radius: 10px;
  250. }
  251. }
  252. }
  253. }
  254. </style>