ModifyRole.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <template>
  2. <el-dialog
  3. class="modify-role"
  4. :visible.sync="modalIsShow"
  5. :title="title"
  6. top="10vh"
  7. width="600px"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. append-to-body
  11. @opened="visibleChange"
  12. >
  13. <div class="part-box part-box-pad part-box-border">
  14. <el-form
  15. ref="modalFormComp"
  16. :model="modalForm"
  17. :rules="rules"
  18. label-width="100px"
  19. >
  20. <el-form-item prop="name" label="角色名称:">
  21. <el-input
  22. style="width:100%;"
  23. v-model.trim="modalForm.name"
  24. placeholder="请输入角色名称"
  25. clearable
  26. ></el-input>
  27. </el-form-item>
  28. <el-form-item prop="type" label="角色类型:">
  29. <el-select
  30. v-model="modalForm.type"
  31. style="width: 100%;"
  32. placeholder="请选择"
  33. >
  34. <el-option
  35. v-for="(val, key) in ROLE_TYPE"
  36. :key="key"
  37. :value="key"
  38. :label="val"
  39. ></el-option>
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item
  43. v-show="modalForm.type === 'CUSTOM'"
  44. prop="privilegeIds"
  45. label="角色权限:"
  46. >
  47. <div class="part-box part-box-pad part-box-border">
  48. <el-tree
  49. :data="menus"
  50. show-checkbox
  51. default-expand-all
  52. node-key="id"
  53. ref="MenuTree"
  54. highlight-current
  55. :props="defaultProps"
  56. check-on-click-node
  57. :expand-on-click-node="false"
  58. @check-change="checkChange"
  59. >
  60. </el-tree>
  61. </div>
  62. </el-form-item>
  63. </el-form>
  64. </div>
  65. <div slot="footer">
  66. <el-button type="primary" @click="submit">确认</el-button>
  67. <el-button type="danger" @click="cancel" plain>取消</el-button>
  68. </div>
  69. </el-dialog>
  70. </template>
  71. <script>
  72. import { updateRole, roleBoundPrivileges } from "../api";
  73. import { getEnums } from "../../login/api";
  74. import { ROLE_TYPE } from "../../../constants/enumerate";
  75. const initModalForm = {
  76. id: null,
  77. name: "",
  78. type: "",
  79. privilegeIds: []
  80. };
  81. export default {
  82. name: "modify-role",
  83. props: {
  84. instance: {
  85. type: Object,
  86. default() {
  87. return {};
  88. }
  89. },
  90. menus: {
  91. type: Array,
  92. default() {
  93. return [];
  94. }
  95. }
  96. },
  97. computed: {
  98. isEdit() {
  99. return !!this.instance.id;
  100. },
  101. title() {
  102. return (this.isEdit ? "编辑" : "新增") + "角色";
  103. }
  104. },
  105. data() {
  106. return {
  107. modalIsShow: false,
  108. modalForm: {},
  109. defaultProps: {
  110. label: "name"
  111. },
  112. ROLE_TYPE,
  113. // ROLE_TYPE: {},
  114. rules: {
  115. name: [
  116. {
  117. required: true,
  118. pattern: /^[\u4E00-\u9FA5]{1,10}$/,
  119. message: "角色名称只能输入汉字,长度不能超过10",
  120. trigger: "change"
  121. }
  122. ],
  123. type: [
  124. {
  125. required: true,
  126. message: "请选择角色类型",
  127. trigger: "change"
  128. }
  129. ],
  130. privilegeIds: [
  131. {
  132. required: true,
  133. validator: (rule, value, callback) => {
  134. if (this.modalForm.type !== "CUSTOM" || value.length) {
  135. callback();
  136. } else {
  137. callback(new Error("请选择扩展字段"));
  138. }
  139. },
  140. trigger: "change"
  141. }
  142. ]
  143. }
  144. };
  145. },
  146. mounted() {
  147. // this.getRoleTypes();
  148. },
  149. methods: {
  150. async getRoleTypes() {
  151. const data = await getEnums("ROLE_TYPE");
  152. let ROLE_TYPE = {};
  153. data.forEach(element => {
  154. ROLE_TYPE[element.name] = element.desc;
  155. });
  156. this.ROLE_TYPE = ROLE_TYPE;
  157. },
  158. async visibleChange() {
  159. if (this.instance.id) {
  160. this.modalForm = this.$objAssign(initModalForm, this.instance);
  161. let privilegeIds = await roleBoundPrivileges(this.instance.id);
  162. let checkedIds = [];
  163. const getCheckedIds = list => {
  164. list.forEach(item => {
  165. if (item["children"]) {
  166. getCheckedIds(item.children);
  167. } else {
  168. const isChecked = privilegeIds.includes(item.id);
  169. if (isChecked) checkedIds.push(item.id);
  170. }
  171. });
  172. };
  173. getCheckedIds(this.menus);
  174. console.log(checkedIds);
  175. this.$refs.MenuTree.setCheckedKeys(checkedIds);
  176. this.modalForm.privilegeIds = checkedIds;
  177. } else {
  178. this.modalForm = { ...initModalForm };
  179. this.$refs.MenuTree.setCheckedKeys([]);
  180. }
  181. this.$nextTick(() => {
  182. this.$refs.modalFormComp.clearValidate();
  183. });
  184. },
  185. cancel() {
  186. this.modalIsShow = false;
  187. },
  188. open() {
  189. this.modalIsShow = true;
  190. },
  191. checkChange() {
  192. this.modalForm.privilegeIds = this.$refs.MenuTree.getCheckedKeys();
  193. this.$refs.modalFormComp.validateField("privilegeIds");
  194. },
  195. async submit() {
  196. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  197. if (!valid) return;
  198. if (this.isSubmit) return;
  199. this.isSubmit = true;
  200. const datas = { ...this.modalForm };
  201. const privilegeIds = [
  202. ...this.$refs.MenuTree.getCheckedKeys(),
  203. ...this.$refs.MenuTree.getHalfCheckedKeys()
  204. ];
  205. datas.privilegeIds = privilegeIds.join();
  206. const data = await updateRole(datas).catch(() => {});
  207. this.isSubmit = false;
  208. if (!data) return;
  209. this.$emit("confirm", this.modalForm);
  210. this.cancel();
  211. }
  212. }
  213. };
  214. </script>