AuthAdmin.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. <template>
  2. <div class="box">
  3. <div class="box-content">
  4. <!-- input + button* 2 -->
  5. <div style="margin-bottom: 10px">
  6. <el-form :inline="true" label-width="80px">
  7. <el-form-item>
  8. <el-input v-model="keyword" placeholder="请输入权限组名称"></el-input>
  9. </el-form-item>
  10. <el-form-item>
  11. <el-button @click="search" type="success">搜索</el-button>
  12. </el-form-item>
  13. <el-form-item>
  14. <el-button type="primary" @click="dialogVisible = true">新增权限组</el-button>
  15. </el-form-item>
  16. </el-form>
  17. </div>
  18. <div>
  19. <el-table
  20. :data="tableData"
  21. border
  22. :height="590 + 'px'">
  23. <el-table-column
  24. prop="id"
  25. label="权限组id">
  26. </el-table-column>
  27. <el-table-column
  28. prop="groupName"
  29. label="权限组名称">
  30. </el-table-column>
  31. <el-table-column
  32. prop="remark"
  33. label="备注">
  34. </el-table-column>
  35. <el-table-column label="操作">
  36. <template slot-scope="scope">
  37. <el-button
  38. size="mini"
  39. type="primary"
  40. @click="handleEdit(scope.row)">编辑</el-button>
  41. <el-button
  42. size="mini"
  43. type="warning"
  44. @click="handleLimits(scope.row)">权限分配</el-button>
  45. <el-button
  46. size="mini"
  47. type="danger"
  48. @click="handleUser(scope.row)">用户分配</el-button>
  49. <el-button
  50. size="mini"
  51. type="danger"
  52. @click="del(scope.row)">删除</el-button>
  53. </template>
  54. </el-table-column>
  55. </el-table>
  56. <table-footer
  57. :totals="total"
  58. :size="size"
  59. @sizeChange="sizeChange"
  60. @pageChange="pageChange"></table-footer>
  61. </div>
  62. </div>
  63. <!-- // 新增-->
  64. <el-dialog
  65. :title="showType ? '编辑权限组' : '新增权限组'"
  66. :visible.sync="dialogVisible"
  67. width="30%">
  68. <div>
  69. <el-form ref="form" :model="form" label-width="100px">
  70. <el-form-item label="权限组名称">
  71. <el-input v-model="form.groupName"></el-input>
  72. </el-form-item>
  73. <el-form-item label="备注">
  74. <el-input v-model="form.remark" ></el-input>
  75. </el-form-item>
  76. </el-form>
  77. </div>
  78. <span slot="footer" class="dialog-footer">
  79. <el-button @click="dialogVisible = false">取 消</el-button>
  80. <el-button v-if="showType" type="primary" @click="setUpdate">更 新</el-button>
  81. <el-button v-else type="primary" @click="onSubmit">新 增</el-button>
  82. </span>
  83. </el-dialog>
  84. <!-- 权限分配 -->
  85. <a-modal
  86. title="权限分配"
  87. :width="600"
  88. :visible="dialogLimits"
  89. @ok="limitSave"
  90. ok-text="确认"
  91. cancel-text="取消"
  92. @cancel="dialogLimits = false"
  93. :destroyOnClose="true">
  94. <a-tree
  95. v-model="checkedKeys"
  96. multiple
  97. checkable
  98. :auto-expand-parent="autoExpandParent"
  99. :expanded-keys="expandedKeys"
  100. :tree-data="menuTreeData"
  101. :selected-keys="selectedKeys"
  102. :replaceFields="replaceFields"
  103. @expand="onExpand"
  104. @check="onCheck"
  105. />
  106. </a-modal>
  107. <!-- <el-dialog-->
  108. <!-- title="权限分配"-->
  109. <!-- :visible.sync="dialogLimits"-->
  110. <!-- width="50%">-->
  111. <!-- <div>-->
  112. <!-- <el-tree-->
  113. <!-- v-if="dialogLimits"-->
  114. <!-- :data="limitList"-->
  115. <!-- show-checkbox-->
  116. <!-- node-key="id"-->
  117. <!-- default-expand-all-->
  118. <!-- :default-checked-keys="defaultList"-->
  119. <!-- :props="defaultProps"-->
  120. <!-- @check-change="handleCheckChange"-->
  121. <!-- ref="tree">-->
  122. <!-- </el-tree>-->
  123. <!-- </div>-->
  124. <!-- <span slot="footer" class="dialog-footer">-->
  125. <!-- <el-button @click="dialogLimits = false">取 消</el-button>-->
  126. <!-- <el-button type="primary" @click="limitSave">保存</el-button>-->
  127. <!-- </span>-->
  128. <!-- </el-dialog>-->
  129. <el-dialog
  130. title="用户分配"
  131. :visible.sync="dialogUsers"
  132. width="50%">
  133. <div>
  134. <el-table
  135. :data="userList"
  136. ref="multipleTable"
  137. tooltip-effect="dark"
  138. @selection-change="handleSelectionChange">
  139. <el-table-column
  140. type="selection"
  141. width="55">
  142. </el-table-column>
  143. <el-table-column
  144. prop="id"
  145. label="用户ID">
  146. </el-table-column>
  147. <el-table-column
  148. prop="userName"
  149. label="用户姓名">
  150. </el-table-column>
  151. </el-table>
  152. </div>
  153. <span slot="footer" class="dialog-footer">
  154. <el-button @click="dialogUsers = false">取 消</el-button>
  155. <el-button type="primary" @click="userSave">保存</el-button>
  156. </span>
  157. </el-dialog>
  158. </div>
  159. </template>
  160. <script>
  161. import { Tree } from 'ant-design-vue';
  162. import TableFooter from "../../components/TableFooter";
  163. import { getMenu, getAuth, delAuth, addAuth, editAuth, getMenuByGroup, saveGroupMenu, getAcountByGroup, saveAccountGroup, getUserList } from '../../utils/api';
  164. export default {
  165. name: "AuthAdmin",
  166. components: {
  167. TableFooter,
  168. ATree: Tree
  169. },
  170. data() {
  171. return {
  172. tableData: [],
  173. showType: false,
  174. dialogVisible: false,
  175. form: {
  176. id: '',
  177. groupName: '',
  178. remark: '',
  179. },
  180. dialogLimits: false,
  181. // 权限分配list
  182. limitList: [],
  183. defaultProps: {
  184. children: 'children',
  185. label: 'title'
  186. },
  187. autoExpandParent: true,
  188. // 默认选择的参数
  189. defaultList: [],
  190. expandedKeys: [],
  191. checkedKeys: [],
  192. replaceFields: {
  193. key: 'id'
  194. },
  195. keyword: '',
  196. total: 0,
  197. size: 20,
  198. pageNum: 1,
  199. selectId: '',
  200. // 用户列表
  201. userList: [],
  202. dialogUsers: false,
  203. userSelect: [],
  204. leastChilds: [],
  205. commitKeys: [],
  206. selectedKeys: [],
  207. menuTreeData: [],
  208. }
  209. },
  210. methods: {
  211. // 搜索
  212. search() {
  213. this.init();
  214. },
  215. // 修改size
  216. sizeChange(val) {
  217. this.size = val;
  218. this.init();
  219. },
  220. // 修改页数
  221. pageChange(val) {
  222. this.pageNum= val;
  223. this.init();
  224. },
  225. handleEdit(data) {
  226. this.showType = true;
  227. this.dialogVisible = true;
  228. this.form.remark = data.remark;
  229. this.form.groupName = data.groupName;
  230. this.form.id = data.id;
  231. },
  232. // 用户分配
  233. handleUser(data) {
  234. this.dialogUsers = true;
  235. this.selectId = data.id;
  236. getAcountByGroup({groupId: data.id})
  237. .then(res => {
  238. if(res.code === 10006) {
  239. this.userSelect = [];
  240. this.$nextTick(() => {
  241. this.$refs.multipleTable.clearSelection();
  242. this.$forceUpdate();
  243. });
  244. } else {
  245. let arr = res.data.split(',');
  246. console.log(arr);
  247. this.$nextTick(() => {
  248. this.$refs.multipleTable.clearSelection();
  249. for (let key in this.userList) {
  250. for(let i in arr) {
  251. if(this.userList[key]['id'] == arr[i]) {
  252. this.$refs.multipleTable.toggleRowSelection(this.userList[key], true);
  253. }
  254. }
  255. }
  256. })
  257. }
  258. })
  259. },
  260. // 用户分配选择
  261. handleSelectionChange(val) {
  262. this.userSelect = val;
  263. },
  264. // 用户分配保存
  265. userSave() {
  266. let users = [];
  267. this.userSelect.forEach(item => {
  268. users.push(item.id);
  269. });
  270. let str = users.join(',');
  271. saveAccountGroup({accountId: str, groupIds: this.selectId})
  272. .then(res => {
  273. if(res.code === 10001) {
  274. this.$message.success(res.message);
  275. } else {
  276. this.userSelect = [];
  277. this.selectId = '';
  278. this.$message(res.message);
  279. }
  280. });
  281. this.dialogUsers = false;
  282. },
  283. // 新增角色
  284. onSubmit() {
  285. let params = {
  286. groupName: this.form.groupName,
  287. remark: this.form.remark
  288. };
  289. addAuth(params)
  290. .then(res => {
  291. if(res.code === 10000) {
  292. this.init();
  293. this.$message.success(res.message);
  294. } else {
  295. this.$message.error(res.message);
  296. }
  297. this.dialogVisible = false;
  298. this.reset();
  299. })
  300. },
  301. // handleCheckChange() {
  302. // // console.log(data, ls, lg)
  303. // this.selectList = [];
  304. // console.log(this.$refs.tree.getCheckedKeys());
  305. // this.selectList = this.$refs.tree.getCheckedKeys().concat(this.$refs.tree.getHalfCheckedKeys());
  306. // },
  307. onExpand(expandedKeys) {
  308. this.expandedKeys = expandedKeys
  309. this.autoExpandParent = false
  310. },
  311. onCheck(checkedKeys, info) {
  312. this.checkedKeys = checkedKeys;
  313. this.commitKeys = checkedKeys.concat(info.halfCheckedKeys)
  314. console.log(this.commitKeys);
  315. },
  316. pickCheckedKeys(data) {
  317. for (let i = 0; i < data.length; i++) {
  318. if (this.leastChilds.includes(data[i])) {
  319. this.checkedKeys.push(data[i])
  320. }
  321. }
  322. },
  323. onSelect(selectedKeys) {
  324. this.selectedKeys = selectedKeys
  325. },
  326. // 权限分配
  327. handleLimits(data) {
  328. this.dialogLimits = true;
  329. this.selectId = data.id;
  330. this.defaultList = [];
  331. getMenuByGroup({groupId: data.id})
  332. .then(res => {
  333. let arr;
  334. if(res.code === 10005) {
  335. arr = [];
  336. } else {
  337. arr = res.data.split(',');
  338. }
  339. this.defaultList = arr.map(Number);
  340. this.pickCheckedKeys(this.defaultList);
  341. this.selectList = this.defaultList;
  342. })
  343. },
  344. // 权限分配保存
  345. limitSave() {
  346. // this.selectList = this.$refs.tree.getCheckedKeys();
  347. let menuIds;
  348. if(this.commitKeys.length > 0) {
  349. menuIds = this.commitKeys.join(',');
  350. } else {
  351. menuIds = '';
  352. }
  353. saveGroupMenu( {groupId: this.selectId, menuIds: menuIds})
  354. .then(res => {
  355. if(res.code === 10001) {
  356. this.$message.success(res.message);
  357. }
  358. this.selectId = '';
  359. this.dialogLimits = false;
  360. this.selectList = [];
  361. });
  362. },
  363. init() {
  364. // 后端分页
  365. let params = {
  366. pageNum: this.pageNum,
  367. pageSize: this.size,
  368. searchStr: this.keyword
  369. };
  370. getAuth(params)
  371. .then(res => {
  372. this.tableData = res.records;
  373. this.total = res.total;
  374. })
  375. },
  376. // 重置
  377. reset(){
  378. this.form.id = '';
  379. this.form.groupName = '';
  380. this.form.remark = '';
  381. this.pageNum = 1;
  382. this.keyword = '';
  383. this.showType = false;
  384. },
  385. // 更新
  386. setUpdate() {
  387. let params = {
  388. groupName: this.form.groupName,
  389. remark: this.form.remark,
  390. id: this.form.id
  391. };
  392. editAuth(params)
  393. .then(res => {
  394. if(res.code === 10000) {
  395. this.init();
  396. this.$message.success(res.message);
  397. }
  398. this.dialogVisible = false;
  399. this.reset();
  400. });
  401. },
  402. // 删除
  403. del(data) {
  404. this.$confirm('此操作将永久删除批量删除, 是否继续?', '提示', {
  405. confirmButtonText: '确定',
  406. cancelButtonText: '取消',
  407. type: 'warning'
  408. }).then(() => {
  409. delAuth({groupId: data.id})
  410. .then(res => {
  411. if(res.code === 10000) {
  412. this.init();
  413. this.$message.success(res.message);
  414. }
  415. })
  416. }).catch(() => {
  417. this.$message({
  418. type: 'info',
  419. message: '已取消删除'
  420. });
  421. });
  422. },
  423. // 菜单列表
  424. authInit() {
  425. getMenu().then(res => {
  426. if(res.code === 10000) {
  427. this.menuTreeData = res.data;
  428. this.getLeastChilds(res.data)
  429. this.menuTreeData.forEach(item => {
  430. this.expandedKeys.push(item.id)
  431. })
  432. // this.expandedMenuKeys(this.roleEntity)
  433. }
  434. })
  435. },
  436. getLeastChilds(data) {
  437. for (let i = 0; i < data.length; i++) {
  438. this.pushLeastChilds(data[i])
  439. }
  440. },
  441. pushLeastChilds(e) {
  442. if (e.children.length > 0) {
  443. this.getLeastChilds(e.children)
  444. return
  445. }
  446. this.leastChilds.push(e.id)
  447. },
  448. // 用户列表
  449. userInit() {
  450. let params = {
  451. pageNum: 1,
  452. pageSize: 200,
  453. searchStr: ''
  454. };
  455. getUserList(params)
  456. .then(res => {
  457. if(res.code === 10001) {
  458. this.userList = res.data;
  459. }
  460. });
  461. }
  462. },
  463. mounted() {
  464. this.init();
  465. this.authInit();
  466. this.userInit();
  467. }
  468. }
  469. </script>
  470. <style scoped>
  471. .box {
  472. width: 100%;
  473. height: 100%;
  474. box-sizing: border-box;
  475. padding: 20px;
  476. }
  477. </style>