CreateDrawer.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. roleName: '',
  89. roleCode: '',
  90. remark: '',
  91. permissions: [],
  92. permissionKeys: [],
  93. });
  94. const message = ElMessage;
  95. const checkedKeys = ref<number[]>([]);
  96. const formRef: any = ref(null);
  97. const isDrawer = ref(false);
  98. const subLoading = ref(false);
  99. const isSpread = ref(false);
  100. const isAll = ref(false);
  101. const treeRef = ref();
  102. const expandedKeys = ref();
  103. const formParams = ref<formParamsType>(defaultValueRef());
  104. function treeNodeExpand(status) {
  105. for (var i = 0; i < treeRef.value.store._getAllNodes().length; i++) {
  106. treeRef.value.store._getAllNodes()[i].expanded = status;
  107. }
  108. }
  109. function packHandle(value) {
  110. if (value) {
  111. treeNodeExpand(true);
  112. expandedKeys.value = props?.permissionList?.map((item: any) => item.key as string) as [];
  113. } else {
  114. expandedKeys.value = [];
  115. treeNodeExpand(false);
  116. }
  117. }
  118. function handleCheckAll(value) {
  119. if (!value) {
  120. formParams.value.permissions = [];
  121. treeRef.value!.setCheckedKeys([]);
  122. } else {
  123. formParams.value.permissions = getAllIds(
  124. props?.permissionList as { key: number; children: [] }[],
  125. );
  126. const keys = getTreeValues(props.permissionList || [], 'key');
  127. treeRef.value!.setCheckedKeys(keys);
  128. }
  129. }
  130. function getAllIds(list: { key: number; children: [] }[] = [], ids: number[] = []) {
  131. for (let item of list) {
  132. !ids.includes(item.key) && ids.push(item.key);
  133. if (item.children && item.children.length) getAllIds(item.children, ids);
  134. }
  135. return ids;
  136. }
  137. function checkedTree(_, checkedInfo) {
  138. const keys = checkedInfo.checkedKeys;
  139. const halfKeys = checkedInfo.halfCheckedKeys;
  140. formParams.value.permissions = keys;
  141. checkedKeys.value = keys;
  142. formParams.value.permissionKeys = halfKeys;
  143. }
  144. function openDrawer(roleId?) {
  145. if (roleId) {
  146. formParams.value.roleId = roleId;
  147. getInfo();
  148. return;
  149. }
  150. isDrawer.value = true;
  151. }
  152. function closeDrawer() {
  153. isDrawer.value = false;
  154. }
  155. function formSubmit() {
  156. formRef.value.validate((valid) => {
  157. if (!valid) {
  158. return message.error('请填写完整信息');
  159. }
  160. if (formParams.value.roleId) {
  161. editAdminRole(formParams.value).then((_) => {
  162. message.success('编辑成功');
  163. emit('change');
  164. handleReset();
  165. closeDrawer();
  166. });
  167. } else {
  168. addAdminRole(formParams.value).then((_) => {
  169. message.success('添加成功');
  170. emit('change');
  171. handleReset();
  172. closeDrawer();
  173. });
  174. }
  175. });
  176. }
  177. function handleReset() {
  178. formRef.value.resetFields();
  179. formParams.value = Object.assign(formParams.value, defaultValueRef());
  180. treeRef.value!.setCheckedKeys([]);
  181. }
  182. function getInfo() {
  183. roleAdminInfo({ roleId: formParams.value.roleId }).then((res) => {
  184. const info = {
  185. roleId: res.id,
  186. roleName: res.roleName,
  187. roleCode: res.roleCode,
  188. remark: res.remark,
  189. permissions: res.permissionIds || [],
  190. permissionKeys: res.permissionKeys || [],
  191. };
  192. formParams.value = info;
  193. isDrawer.value = true;
  194. nextTick(() => {
  195. treeRef.value?.setCheckedKeys(res.permissionIds);
  196. });
  197. });
  198. }
  199. onMounted(() => {});
  200. defineExpose({
  201. openDrawer,
  202. closeDrawer,
  203. });
  204. </script>