CreateDrawer.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <template>
  2. <el-drawer
  3. v-model="isDrawer"
  4. :width="width"
  5. placement="right"
  6. :title="title"
  7. @close="handleReset"
  8. >
  9. <el-form
  10. :model="formParams"
  11. :rules="rules"
  12. ref="formRef"
  13. label-placement="left"
  14. :label-width="80"
  15. >
  16. <el-form-item label="角色编码" prop="roleCode">
  17. <el-input
  18. placeholder="请输入角色编码"
  19. v-model="formParams.roleCode"
  20. :disabled="formParams.roleId ? true : false"
  21. />
  22. </el-form-item>
  23. <el-form-item label="角色名称" prop="roleName">
  24. <el-input placeholder="请输入角色名称" v-model="formParams.roleName" />
  25. </el-form-item>
  26. <el-form-item label="角色权限" prop="permissionIds">
  27. <el-card shadow="hover">
  28. <el-space>
  29. <el-checkbox v-model:checked="isSpread" @change="packHandle">展开/收起</el-checkbox>
  30. <el-checkbox v-model="isAll" @change="handleCheckAll">全选/全不选</el-checkbox>
  31. </el-space>
  32. <el-divider />
  33. <el-tree
  34. ref="treeRef"
  35. show-checkbox
  36. node-key="key"
  37. :data="props.permissionList"
  38. @check="checkedTree"
  39. />
  40. </el-card>
  41. </el-form-item>
  42. <el-form-item label="备注" prop="remark">
  43. <el-input type="textarea" placeholder="请输入备注" v-model="formParams.remark" />
  44. </el-form-item>
  45. </el-form>
  46. <template #footer>
  47. <el-space>
  48. <el-button @click="handleReset">重置</el-button>
  49. <el-button type="primary" :loading="subLoading" @click="formSubmit">提交</el-button>
  50. </el-space>
  51. </template>
  52. </el-drawer>
  53. </template>
  54. <script lang="ts" setup>
  55. import { ref, onMounted, nextTick } from 'vue';
  56. import { ElMessage } from 'element-plus';
  57. import type { formParamsType } from './types';
  58. import { addAdminRole, editAdminRole, roleAdminInfo } from '@/api/system/role';
  59. import { getTreeValues } from '@/utils/helper/treeHelper';
  60. const rules = {
  61. roleCode: {
  62. required: true,
  63. message: '角色编码不能为空',
  64. trigger: 'blur',
  65. },
  66. roleName: {
  67. required: true,
  68. message: '角色名称不能为空',
  69. trigger: 'blur',
  70. },
  71. };
  72. const emit = defineEmits(['change']);
  73. const props = defineProps({
  74. title: {
  75. type: String,
  76. default: '添加角色',
  77. },
  78. width: {
  79. type: Number,
  80. default: 450,
  81. },
  82. permissionList: {
  83. type: Array,
  84. },
  85. });
  86. const defaultValueRef = () => ({
  87. roleId: null,
  88. roleType: null,
  89. roleName: '',
  90. roleCode: '',
  91. remark: '',
  92. permissions: [],
  93. permissionKeys: [],
  94. });
  95. const message = ElMessage;
  96. const checkedKeys = ref<number[]>([]);
  97. const formRef: any = ref(null);
  98. const isDrawer = ref(false);
  99. const subLoading = ref(false);
  100. const isSpread = ref(false);
  101. const isAll = ref(false);
  102. const treeRef = ref();
  103. const expandedKeys = ref();
  104. const formParams = ref<formParamsType>(defaultValueRef());
  105. function treeNodeExpand(status) {
  106. for (var i = 0; i < treeRef.value.store._getAllNodes().length; i++) {
  107. treeRef.value.store._getAllNodes()[i].expanded = status;
  108. }
  109. }
  110. function packHandle(value) {
  111. if (value) {
  112. treeNodeExpand(true);
  113. expandedKeys.value = props?.permissionList?.map((item: any) => item.key as string) as [];
  114. } else {
  115. expandedKeys.value = [];
  116. treeNodeExpand(false);
  117. }
  118. }
  119. function handleCheckAll(value) {
  120. if (!value) {
  121. formParams.value.permissions = [];
  122. treeRef.value!.setCheckedKeys([]);
  123. } else {
  124. formParams.value.permissions = getAllIds(
  125. props?.permissionList as { key: number; children: [] }[],
  126. );
  127. const keys = getTreeValues(props.permissionList || [], 'key');
  128. treeRef.value!.setCheckedKeys(keys);
  129. }
  130. }
  131. function getAllIds(list: { key: number; children: [] }[] = [], ids: number[] = []) {
  132. for (let item of list) {
  133. !ids.includes(item.key) && ids.push(item.key);
  134. if (item.children && item.children.length) getAllIds(item.children, ids);
  135. }
  136. return ids;
  137. }
  138. function checkedTree(_, checkedInfo) {
  139. const keys = checkedInfo.checkedKeys;
  140. const halfKeys = checkedInfo.halfCheckedKeys;
  141. formParams.value.permissions = keys;
  142. checkedKeys.value = keys;
  143. formParams.value.permissionKeys = halfKeys;
  144. }
  145. function openDrawer(roleId?) {
  146. if (roleId) {
  147. formParams.value.roleId = roleId;
  148. getInfo();
  149. return;
  150. }
  151. isDrawer.value = true;
  152. }
  153. function closeDrawer() {
  154. isDrawer.value = false;
  155. }
  156. function formSubmit() {
  157. formRef.value.validate((valid) => {
  158. if (!valid) {
  159. return message.error('请填写完整信息');
  160. }
  161. if (formParams.value.roleId) {
  162. editAdminRole(formParams.value).then((_) => {
  163. message.success('编辑成功');
  164. emit('change');
  165. handleReset();
  166. closeDrawer();
  167. });
  168. } else {
  169. formParams.value.roleType = 2;
  170. addAdminRole(formParams.value).then((_) => {
  171. message.success('添加成功');
  172. emit('change');
  173. handleReset();
  174. closeDrawer();
  175. });
  176. }
  177. });
  178. }
  179. function handleReset() {
  180. formRef.value.resetFields();
  181. formParams.value = Object.assign(formParams.value, defaultValueRef());
  182. treeRef.value!.setCheckedKeys([]);
  183. }
  184. function getInfo() {
  185. roleAdminInfo({ roleId: formParams.value.roleId }).then((res) => {
  186. const info = {
  187. roleId: res.id,
  188. roleName: res.roleName,
  189. roleCode: res.roleCode,
  190. remark: res.remark,
  191. permissions: res.permissionIds || [],
  192. permissionKeys: res.permissionKeys || [],
  193. };
  194. formParams.value = info;
  195. isDrawer.value = true;
  196. nextTick(() => {
  197. treeRef.value?.setCheckedKeys(res.permissionIds);
  198. });
  199. });
  200. }
  201. onMounted(() => {});
  202. defineExpose({
  203. openDrawer,
  204. closeDrawer,
  205. });
  206. </script>