role.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. <template>
  2. <basic-container>
  3. <avue-crud
  4. :option="option"
  5. :table-loading="loading"
  6. :data="data"
  7. ref="crud"
  8. v-model="form"
  9. :permission="permissionList"
  10. :before-open="beforeOpen"
  11. @row-del="rowDel"
  12. @row-update="rowUpdate"
  13. @row-save="rowSave"
  14. @search-change="searchChange"
  15. @search-reset="searchReset"
  16. @selection-change="selectionChange"
  17. @current-change="currentChange"
  18. @size-change="sizeChange"
  19. @refresh-change="refreshChange"
  20. @on-load="onLoad"
  21. >
  22. <template slot="menuLeft">
  23. <el-button
  24. type="danger"
  25. size="small"
  26. icon="el-icon-delete"
  27. v-if="permission.role_delete"
  28. plain
  29. @click="handleDelete"
  30. >删 除
  31. </el-button>
  32. <el-button
  33. size="small"
  34. icon="el-icon-setting"
  35. @click="handleRole"
  36. v-if="userInfo.role_name.includes('admin')"
  37. plain
  38. >权限设置
  39. </el-button>
  40. </template>
  41. </avue-crud>
  42. <el-dialog
  43. title="角色权限配置"
  44. append-to-body
  45. :visible.sync="box"
  46. width="567px"
  47. >
  48. <el-tabs type="border-card">
  49. <el-tab-pane label="后管菜单权限">
  50. <el-tree
  51. :data="menuGrantList"
  52. show-checkbox
  53. node-key="id"
  54. ref="treeMenu"
  55. :default-checked-keys="menuTreeObj"
  56. :props="props"
  57. >
  58. </el-tree>
  59. </el-tab-pane>
  60. <el-tab-pane label="数据权限">
  61. <el-tree
  62. :data="dataScopeGrantList"
  63. show-checkbox
  64. node-key="id"
  65. ref="treeDataScope"
  66. :default-checked-keys="dataScopeTreeObj"
  67. :props="props"
  68. >
  69. </el-tree>
  70. </el-tab-pane>
  71. <el-tab-pane label="接口权限">
  72. <el-tree
  73. :data="apiScopeGrantList"
  74. show-checkbox
  75. node-key="id"
  76. ref="treeApiScope"
  77. :default-checked-keys="apiScopeTreeObj"
  78. :props="props"
  79. >
  80. </el-tree>
  81. </el-tab-pane>
  82. </el-tabs>
  83. <span
  84. slot="footer"
  85. class="dialog-footer"
  86. >
  87. <el-button @click="box = false">取 消</el-button>
  88. <el-button
  89. type="primary"
  90. @click="submit"
  91. >确 定</el-button>
  92. </span>
  93. </el-dialog>
  94. </basic-container>
  95. </template>
  96. <script>
  97. import { add, getList, getRole, getRoleTreeById, grant, grantTree, remove, update } from "@/api/system/role";
  98. import { getPostList } from "@/api/system/post";
  99. import { mapGetters } from "vuex";
  100. import website from '@/config/website';
  101. export default {
  102. data () {
  103. return {
  104. form: {},
  105. box: false,
  106. props: {
  107. label: "title",
  108. value: "key"
  109. },
  110. menuGrantList: [],
  111. dataScopeGrantList: [],
  112. apiScopeGrantList: [],
  113. apiGrantList: [],
  114. menuTreeObj: [],
  115. dataScopeTreeObj: [],
  116. apiScopeTreeObj: [],
  117. selectionList: [],
  118. query: {},
  119. loading: true,
  120. page: {
  121. pageSize: 10,
  122. currentPage: 1,
  123. total: 0
  124. },
  125. option: {
  126. tip: false,
  127. simplePage: true,
  128. searchShow: true,
  129. searchMenuSpan: 6,
  130. tree: true,
  131. border: true,
  132. index: true,
  133. selection: true,
  134. viewBtn: true,
  135. dialogWidth: 900,
  136. dialogClickModal: false,
  137. column: [
  138. {
  139. label: "角色名称",
  140. prop: "roleName",
  141. search: true,
  142. span: 24,
  143. rules: [
  144. {
  145. required: true,
  146. message: "请输入角色名称",
  147. trigger: "blur"
  148. }
  149. ]
  150. },
  151. {
  152. label: "所属租户",
  153. prop: "tenantId",
  154. type: "tree",
  155. dicUrl: "/api/blade-system/tenant/select",
  156. addDisplay: false,
  157. editDisplay: false,
  158. viewDisplay: website.tenantMode,
  159. span: 24,
  160. props: {
  161. label: "tenantName",
  162. value: "tenantId"
  163. },
  164. hide: !website.tenantMode,
  165. search: website.tenantMode,
  166. rules: [{
  167. required: true,
  168. message: "请输入所属租户",
  169. trigger: "click"
  170. }]
  171. },
  172. {
  173. label: "角色别名",
  174. prop: "roleAlias",
  175. search: true,
  176. span: 24,
  177. rules: [
  178. {
  179. required: true,
  180. message: "请输入角色别名",
  181. trigger: "blur"
  182. }
  183. ]
  184. },
  185. // {
  186. // label: "所属岗位",
  187. // prop: "pId",
  188. // type: "tree",
  189. // hide: true,
  190. // dicData: [],
  191. // props: {
  192. // label: "postName",
  193. // value: "id"
  194. // },
  195. // rules: [{
  196. // required: true,
  197. // message: "请选择所属岗位",
  198. // trigger: "click"
  199. // }],
  200. // },
  201. {
  202. label: "上级角色",
  203. prop: "parentId",
  204. dicData: [],
  205. type: "tree",
  206. hide: true,
  207. span: 24,
  208. props: {
  209. label: "title"
  210. },
  211. rules: [
  212. {
  213. required: false,
  214. message: "请选择上级角色",
  215. trigger: "click"
  216. }
  217. ]
  218. },
  219. {
  220. label: "角色排序",
  221. prop: "sort",
  222. type: "number",
  223. span: 24,
  224. rules: [
  225. {
  226. required: true,
  227. message: "请输入角色排序",
  228. trigger: "blur"
  229. }
  230. ]
  231. }
  232. ]
  233. },
  234. data: []
  235. };
  236. },
  237. computed: {
  238. ...mapGetters(["userInfo", "permission"]),
  239. permissionList () {
  240. return {
  241. addBtn: this.vaildData(this.permission.role_add, false),
  242. viewBtn: this.vaildData(this.permission.role_view, false),
  243. delBtn: this.vaildData(this.permission.role_delete, false),
  244. editBtn: this.vaildData(this.permission.role_edit, false)
  245. };
  246. },
  247. ids () {
  248. let ids = [];
  249. this.selectionList.forEach(ele => {
  250. ids.push(ele.id);
  251. });
  252. return ids.join(",");
  253. },
  254. idsArray () {
  255. let ids = [];
  256. this.selectionList.forEach(ele => {
  257. ids.push(ele.id);
  258. });
  259. return ids;
  260. }
  261. },
  262. methods: {
  263. initData (roleId) {
  264. getRoleTreeById(roleId).then(res => {
  265. const column = this.findObject(this.option.column, "parentId");
  266. column.dicData = res.data.data;
  267. });
  268. let tenantId = website.tenantId;
  269. getPostList(tenantId).then(res => {
  270. const column = this.findObject(this.option.column, "pId");
  271. column.dicData = res.data.data;
  272. });
  273. },
  274. submit () {
  275. const menuList = this.$refs.treeMenu.getCheckedKeys();
  276. const dataScopeList = this.$refs.treeDataScope.getCheckedKeys();
  277. const apiScopeList = this.$refs.treeApiScope.getCheckedKeys();
  278. grant(this.idsArray, menuList, dataScopeList, apiScopeList).then(() => {
  279. this.box = false;
  280. this.$message({
  281. type: "success",
  282. message: "操作成功!"
  283. });
  284. this.onLoad(this.page);
  285. });
  286. },
  287. rowSave (row, done, loading) {
  288. add(row).then(() => {
  289. this.onLoad(this.page);
  290. this.$message({
  291. type: "success",
  292. message: "操作成功!"
  293. });
  294. done();
  295. }, error => {
  296. window.console.log(error);
  297. loading();
  298. });
  299. },
  300. rowUpdate (row, index, done, loading) {
  301. update(row).then(() => {
  302. this.onLoad(this.page);
  303. this.$message({
  304. type: "success",
  305. message: "操作成功!"
  306. });
  307. done();
  308. }, error => {
  309. window.console.log(error);
  310. loading();
  311. });
  312. },
  313. rowDel (row) {
  314. this.$confirm("确定将选择数据删除?", {
  315. confirmButtonText: "确定",
  316. cancelButtonText: "取消",
  317. type: "warning"
  318. })
  319. .then(() => {
  320. return remove(row.id);
  321. })
  322. .then(() => {
  323. this.onLoad(this.page);
  324. this.$message({
  325. type: "success",
  326. message: "操作成功!"
  327. });
  328. });
  329. },
  330. searchReset () {
  331. this.query = {};
  332. this.onLoad(this.page);
  333. },
  334. searchChange (params, done) {
  335. this.query = params;
  336. this.page.currentPage = 1;
  337. this.onLoad(this.page, params);
  338. done();
  339. },
  340. selectionChange (list) {
  341. this.selectionList = list;
  342. },
  343. selectionClear () {
  344. this.selectionList = [];
  345. this.$refs.crud.toggleSelection();
  346. },
  347. beforeOpen (done, type) {
  348. if (["add", "edit"].includes(type)) {
  349. this.initData(this.form.id);
  350. }
  351. done();
  352. },
  353. handleRole () {
  354. if (this.selectionList.length !== 1) {
  355. this.$message.warning("只能选择一条数据");
  356. return;
  357. }
  358. this.menuTreeObj = [];
  359. this.dataScopeTreeObj = [];
  360. this.apiScopeTreeObj = [];
  361. grantTree()
  362. .then(res => {
  363. this.menuGrantList = res.data.data.menu;
  364. this.dataScopeGrantList = res.data.data.dataScope;
  365. this.apiScopeGrantList = res.data.data.apiScope;
  366. getRole(this.ids).then(res => {
  367. this.menuTreeObj = res.data.data.menu;
  368. this.dataScopeTreeObj = res.data.data.dataScope;
  369. this.apiScopeTreeObj = res.data.data.apiScope;
  370. this.box = true;
  371. });
  372. });
  373. },
  374. handleDelete () {
  375. if (this.selectionList.length === 0) {
  376. this.$message.warning("请选择至少一条数据");
  377. return;
  378. }
  379. this.$confirm("确定将选择数据删除?", {
  380. confirmButtonText: "确定",
  381. cancelButtonText: "取消",
  382. type: "warning"
  383. })
  384. .then(() => {
  385. return remove(this.ids);
  386. })
  387. .then(() => {
  388. this.onLoad(this.page);
  389. this.$message({
  390. type: "success",
  391. message: "操作成功!"
  392. });
  393. this.$refs.crud.toggleSelection();
  394. });
  395. },
  396. currentChange (currentPage) {
  397. this.page.currentPage = currentPage;
  398. },
  399. sizeChange (pageSize) {
  400. this.page.pageSize = pageSize;
  401. },
  402. refreshChange () {
  403. this.onLoad(this.page, this.query);
  404. },
  405. onLoad (page, params = {}) {
  406. this.loading = true;
  407. getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
  408. this.data = res.data.data;
  409. this.loading = false;
  410. this.selectionClear();
  411. });
  412. }
  413. }
  414. };
  415. </script>