PermissionForm.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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-divider border-style="dashed" class="mb-10">功能设置</el-divider>
  68. <el-row :gutter="24">
  69. <el-col :span="12">
  70. <el-form-item label="权限状态" prop="isDisabled">
  71. <el-radio-group v-model="formParams.isDisabled">
  72. <el-radio-button label="正常" :value="0" />
  73. <el-radio-button label="停用" :value="1" />
  74. </el-radio-group>
  75. </el-form-item>
  76. </el-col>
  77. </el-row>
  78. <el-form-item v-if="isShowSubmit">
  79. <el-button type="primary" :loading="subLoading" @click="formSubmit">保存修改</el-button>
  80. </el-form-item>
  81. </el-form>
  82. </template>
  83. <script lang="ts" setup>
  84. import { ref, computed } from 'vue';
  85. import { ElMessage, FormInstance, FormRules } from 'element-plus';
  86. import { addPermission, updatePermission } from '@/api/system/permission';
  87. import { QuestionCircleOutlined } from '@vicons/antd';
  88. import { PermissionItem } from '@/types/permission/type';
  89. const emit = defineEmits(['change']);
  90. const props = defineProps({
  91. permissionList: {
  92. type: Array,
  93. defalut: () => [],
  94. },
  95. isShowSubmit: {
  96. type: Boolean,
  97. defalut: false,
  98. },
  99. });
  100. const formRef = ref<FormInstance>();
  101. const subLoading = ref(false);
  102. const defaultFormParams: PermissionItem = {
  103. id: null,
  104. parentId: null,
  105. permissionCode: '',
  106. permissionName: '',
  107. orderNum: 0,
  108. isDisabled: 0,
  109. };
  110. const formParams = ref({ ...defaultFormParams });
  111. const permissionTree = computed(() => {
  112. // 可根据需要是否需要嵌套这个 避免出现选择器出现 0 的情况
  113. return [
  114. {
  115. label: '顶级目录',
  116. value: 0,
  117. children: props.permissionList || [],
  118. },
  119. ];
  120. });
  121. const rules: FormRules = {
  122. parentId: {
  123. required: true,
  124. message: '上级目录',
  125. trigger: 'change',
  126. },
  127. permissionName: {
  128. required: true,
  129. message: '权限名称',
  130. trigger: 'blur',
  131. },
  132. permissionCode: {
  133. required: true,
  134. message: '权限标识',
  135. trigger: 'blur',
  136. },
  137. };
  138. function setData(data: PermissionItem) {
  139. formParams.value = data;
  140. formRef.value?.resetFields();
  141. }
  142. function formSubmit() {
  143. subLoading.value = true;
  144. formRef.value?.validate((valid) => {
  145. if (valid) {
  146. if (!formParams.value.id) {
  147. addPermission(formParams.value)
  148. .then(() => {
  149. subLoading.value = false;
  150. ElMessage.success('添加成功');
  151. handleReset();
  152. emit('change');
  153. })
  154. .catch(() => {
  155. subLoading.value = false;
  156. });
  157. } else {
  158. updatePermission(formParams.value)
  159. .then(() => {
  160. subLoading.value = false;
  161. ElMessage.success('修改成功');
  162. handleReset();
  163. emit('change');
  164. })
  165. .catch(() => {
  166. subLoading.value = false;
  167. });
  168. }
  169. } else {
  170. subLoading.value = false;
  171. ElMessage.error('请填写完整信息');
  172. }
  173. });
  174. }
  175. function handleReset() {
  176. formRef.value?.resetFields();
  177. formParams.value = Object.assign(formParams.value, defaultFormParams);
  178. }
  179. defineExpose({
  180. formSubmit,
  181. handleReset,
  182. setData,
  183. });
  184. </script>
  185. <style lang="scss" sctep>
  186. .submit-form-item {
  187. margin-left: 100px;
  188. }
  189. </style>