ModifyRole.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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 roleTypes"
  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. <span class="custom-tree-node" slot-scope="{ node, data }">
  61. <span
  62. ><i class="el-icon-s-check" v-if="data.type === 'LINK'"></i>
  63. {{ node.label }}</span
  64. >
  65. </span>
  66. </el-tree>
  67. </div>
  68. </el-form-item>
  69. </el-form>
  70. </div>
  71. <div slot="footer">
  72. <el-button type="primary" :disabled="isSubmit" @click="submit"
  73. >确认</el-button
  74. >
  75. <el-button type="danger" @click="cancel" plain>取消</el-button>
  76. </div>
  77. </el-dialog>
  78. </template>
  79. <script>
  80. import { updateRole, roleBoundPrivileges } from "../api";
  81. const initModalForm = {
  82. id: null,
  83. name: "",
  84. type: "",
  85. privilegeIds: []
  86. };
  87. export default {
  88. name: "modify-role",
  89. props: {
  90. instance: {
  91. type: Object,
  92. default() {
  93. return {};
  94. }
  95. },
  96. menus: {
  97. type: Array,
  98. default() {
  99. return [];
  100. }
  101. },
  102. roleTypes: {
  103. type: Object,
  104. default() {
  105. return {};
  106. }
  107. }
  108. },
  109. computed: {
  110. isEdit() {
  111. return !!this.instance.id;
  112. },
  113. title() {
  114. return (this.isEdit ? "编辑" : "新增") + "角色";
  115. }
  116. },
  117. data() {
  118. return {
  119. modalIsShow: false,
  120. isSubmit: false,
  121. modalForm: {},
  122. defaultProps: {
  123. label: "name"
  124. },
  125. rules: {
  126. name: [
  127. {
  128. required: true,
  129. pattern: /^[0-9a-zA-Z\u4E00-\u9FA5]{1,10}$/,
  130. message: "角色名称只能输入汉字、字母和数字,长度不能超过10",
  131. trigger: "change"
  132. }
  133. ],
  134. type: [
  135. {
  136. required: true,
  137. message: "请选择角色类型",
  138. trigger: "change"
  139. }
  140. ],
  141. privilegeIds: [
  142. {
  143. required: true,
  144. validator: (rule, value, callback) => {
  145. if (this.modalForm.type !== "CUSTOM" || value.length) {
  146. callback();
  147. } else {
  148. callback(new Error("请选择扩展字段"));
  149. }
  150. },
  151. trigger: "change"
  152. }
  153. ]
  154. }
  155. };
  156. },
  157. methods: {
  158. async visibleChange() {
  159. if (this.instance.id) {
  160. this.modalForm = this.$objAssign(initModalForm, this.instance);
  161. if (this.instance.type === "CUSTOM") {
  162. let privilegeIds = await roleBoundPrivileges(this.instance.id);
  163. let checkedIds = [];
  164. const getCheckedIds = list => {
  165. list.forEach(item => {
  166. if (item["children"] && item["children"].length) {
  167. getCheckedIds(item.children);
  168. } else {
  169. const isChecked = privilegeIds.includes(item.id);
  170. if (isChecked) checkedIds.push(item.id);
  171. }
  172. });
  173. };
  174. getCheckedIds(this.menus);
  175. this.$refs.MenuTree.setCheckedKeys(checkedIds);
  176. this.modalForm.privilegeIds = checkedIds;
  177. }
  178. } else {
  179. this.modalForm = { ...initModalForm };
  180. this.$refs.MenuTree.setCheckedKeys([]);
  181. }
  182. this.$nextTick(() => {
  183. this.$refs.modalFormComp.clearValidate();
  184. });
  185. },
  186. cancel() {
  187. this.modalIsShow = false;
  188. },
  189. open() {
  190. this.modalIsShow = true;
  191. },
  192. checkChange() {
  193. this.modalForm.privilegeIds = this.$refs.MenuTree.getCheckedKeys();
  194. this.$refs.modalFormComp.validateField("privilegeIds");
  195. },
  196. async submit() {
  197. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  198. if (!valid) return;
  199. if (this.isSubmit) return;
  200. this.isSubmit = true;
  201. const datas = { ...this.modalForm };
  202. const privilegeIds = [
  203. ...this.$refs.MenuTree.getCheckedKeys(),
  204. ...this.$refs.MenuTree.getHalfCheckedKeys()
  205. ];
  206. datas.privilegeIds = privilegeIds;
  207. const data = await updateRole(datas).catch(() => {});
  208. this.isSubmit = false;
  209. if (!data) return;
  210. this.$emit("modified", this.modalForm);
  211. this.cancel();
  212. }
  213. }
  214. };
  215. </script>