PermissionForm.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <template>
  2. <el-form
  3. :model="formParams"
  4. :rules="rules"
  5. ref="formRef"
  6. label-placement="left"
  7. :label-width="100"
  8. require-mark-placement="left"
  9. >
  10. <el-divider border-style="dashed" class="mt-0 mb-10">基本设置</el-divider>
  11. <el-form-item label="上级权限" prop="parentId">
  12. <el-tree-select
  13. rowKey="key"
  14. :data="permissionTree"
  15. clearable
  16. check-strictly
  17. v-model="formParams.parentId"
  18. />
  19. </el-form-item>
  20. <el-row :gutter="24">
  21. <!-- 权限名称 -->
  22. <el-col :span="12">
  23. <el-form-item prop="permissionName">
  24. <template #label>
  25. <div class="flex items-center">
  26. <el-tooltip trigger="hover">
  27. <el-icon :size="18" class="mr-1 text-gray-400 cursor-pointer">
  28. <QuestionCircleOutlined />
  29. </el-icon>
  30. <template #content>
  31. 权限名称 对应 权限标识 `中文名称`
  32. </template>
  33. </el-tooltip>
  34. <span>权限名称</span>
  35. </div>
  36. </template>
  37. <el-input placeholder="权限名称" v-model="formParams.permissionName" />
  38. </el-form-item>
  39. </el-col>
  40. <!-- 权限标识 -->
  41. <el-col :span="12">
  42. <el-form-item prop="permissionCode">
  43. <template #label>
  44. <div class="flex items-center">
  45. <el-tooltip trigger="hover">
  46. <el-icon :size="18" class="mr-1 text-gray-400 cursor-pointer">
  47. <QuestionCircleOutlined />
  48. </el-icon>
  49. <template #content>
  50. 权限标识,也是权限字符,比如 `system:menu:list`
  51. </template>
  52. </el-tooltip>
  53. <span>权限标识</span>
  54. </div>
  55. </template>
  56. <el-input placeholder="权限标识" v-model="formParams.permissionCode" />
  57. </el-form-item>
  58. </el-col>
  59. </el-row>
  60. <el-row :gutter="24">
  61. <el-col :span="12">
  62. <el-form-item label="显示排序" prop="orderNum">
  63. <el-input-number placeholder="显示排序" v-model="formParams.orderNum" class="w-full" />
  64. </el-form-item>
  65. </el-col>
  66. </el-row>
  67. <el-form-item v-if="isShowSubmit">
  68. <el-button type="primary" :loading="subLoading" @click="formSubmit">保存修改</el-button>
  69. </el-form-item>
  70. </el-form>
  71. </template>
  72. <script lang="ts" setup>
  73. import { ref, computed } from 'vue';
  74. import { ElMessage, FormInstance, FormRules } from 'element-plus';
  75. import { addPermission, updatePermission } from '@/api/system/permission';
  76. import { QuestionCircleOutlined } from '@vicons/antd';
  77. import { PermissionItem } from '@/types/permission/type';
  78. const emit = defineEmits(['change']);
  79. const props = defineProps({
  80. permissionList: {
  81. type: Array,
  82. defalut: () => [],
  83. },
  84. isShowSubmit: {
  85. type: Boolean,
  86. defalut: false,
  87. },
  88. });
  89. const formRef = ref<FormInstance>();
  90. const subLoading = ref(false);
  91. const defaultFormParams: PermissionItem = {
  92. id: null,
  93. parentId: null,
  94. permissionCode: '',
  95. permissionName: '',
  96. orderNum: 0,
  97. };
  98. const formParams = ref({ ...defaultFormParams });
  99. const permissionTree = computed(() => {
  100. // 可根据需要是否需要嵌套这个 避免出现选择器出现 0 的情况
  101. return [
  102. {
  103. label: '顶级目录',
  104. value: -1, // 约定顶级目录是 -1.
  105. children: props.permissionList || [],
  106. },
  107. ];
  108. });
  109. const rules: FormRules = {
  110. parentId: {
  111. required: true,
  112. message: '上级目录',
  113. trigger: 'change',
  114. },
  115. permissionName: {
  116. required: true,
  117. message: '权限名称',
  118. trigger: 'blur',
  119. },
  120. permissionCode: {
  121. required: true,
  122. message: '权限标识',
  123. trigger: 'blur',
  124. },
  125. };
  126. function setData(data: PermissionItem) {
  127. formParams.value = data;
  128. formRef.value?.resetFields();
  129. }
  130. function formSubmit() {
  131. subLoading.value = true;
  132. formRef.value?.validate((valid) => {
  133. if (valid) {
  134. if (!formParams.value.id) {
  135. addPermission(formParams.value)
  136. .then(() => {
  137. subLoading.value = false;
  138. ElMessage.success('添加成功');
  139. handleReset();
  140. emit('change');
  141. })
  142. .catch(() => {
  143. subLoading.value = false;
  144. });
  145. } else {
  146. updatePermission(formParams.value)
  147. .then(() => {
  148. subLoading.value = false;
  149. ElMessage.success('修改成功');
  150. handleReset();
  151. emit('change');
  152. })
  153. .catch(() => {
  154. subLoading.value = false;
  155. });
  156. }
  157. } else {
  158. subLoading.value = false;
  159. ElMessage.error('请填写完整信息');
  160. }
  161. });
  162. }
  163. function handleReset() {
  164. formRef.value?.resetFields();
  165. formParams.value = Object.assign(formParams.value, defaultFormParams);
  166. }
  167. defineExpose({
  168. formSubmit,
  169. handleReset,
  170. setData,
  171. });
  172. </script>
  173. <style lang="scss" sctep>
  174. .submit-form-item {
  175. margin-left: 100px;
  176. }
  177. </style>