edit.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <template>
  2. <el-dialog class="api-edit" v-model="showDialog" :title="`${formData.id ? '编辑接口' : '新增接口'}`" width="600px" :close-on-click-modal="false" :close-on-press-escape="false">
  3. <el-form ref="formRef" :model="formData" :rules="ruleForm" label-width="80px" @keyup.enter="onSubmit">
  4. <el-form-item label="选择类型" prop="types">
  5. <el-radio-group v-model="formData.types">
  6. <el-radio-button :label="2">接口</el-radio-button>
  7. <el-radio-button :label="1">分类</el-radio-button>
  8. </el-radio-group>
  9. </el-form-item>
  10. <el-form-item label="上级分类" prop="parentId">
  11. <el-cascader :options="typeData" :props="{ checkStrictly: true, multiple: false, emitPath: false, value: 'id', label: 'name' }" placeholder="请选择关联页面" clearable class="w100" v-model="formData.parentId"></el-cascader>
  12. </el-form-item>
  13. <template v-if="formData.types===1">
  14. <el-form-item label="分类名称" prop="name">
  15. <el-input v-model="formData.name" placeholder="输入接口名称" />
  16. </el-form-item>
  17. </template>
  18. <template v-else>
  19. <el-form-item label="关联页面" prop="menuIds">
  20. <el-cascader :options="menuData" :props="{ checkStrictly: false, multiple: true, emitPath: false, value: 'id', label: 'title' }" placeholder="请选择关联页面" clearable class="w100" v-model="formData.menuIds"></el-cascader>
  21. </el-form-item>
  22. <el-form-item label="接口名称" prop="name">
  23. <el-input v-model="formData.name" placeholder="输入接口名称" />
  24. </el-form-item>
  25. <el-form-item label="接口地址" prop="address">
  26. <el-input v-model="formData.address" placeholder="接口地址" />
  27. </el-form-item>
  28. <el-form-item label="状态" prop="status">
  29. <el-switch v-model="formData.status" :active-value="1" :inactive-value="0" />
  30. </el-form-item>
  31. </template>
  32. <el-form-item label="备注" prop="remark">
  33. <el-input v-model="formData.remark" type="textarea" :rows="3" />
  34. </el-form-item>
  35. </el-form>
  36. <template #footer>
  37. <div class="dialog-footer">
  38. <el-button @click="showDialog = false">取消</el-button>
  39. <el-button type="primary" @click="onSubmit">确定</el-button>
  40. </div>
  41. </template>
  42. </el-dialog>
  43. </template>
  44. <script lang="ts" setup>
  45. import { ref, reactive, nextTick } from 'vue';
  46. import api from '/@/api/system';
  47. import { ApiRow } from '/@/api/model/system/menu';
  48. import { ruleRequired } from '/@/utils/validator';
  49. import { ElMessage } from 'element-plus';
  50. const emit = defineEmits(['getList']);
  51. const showDialog = ref(false);
  52. const formRef = ref();
  53. const menuData = ref<any[]>([]);
  54. const typeData = ref<any[]>([]);
  55. const baseForm: ApiRow = {
  56. menuIds: [],
  57. id: undefined,
  58. parentId: -1,
  59. name: '',
  60. types: 2,
  61. address: '',
  62. remark: '',
  63. status: 1,
  64. };
  65. const formData = reactive<ApiRow>({
  66. ...baseForm,
  67. });
  68. const ruleForm = {
  69. parentId: [ruleRequired('上级分类不能为空')],
  70. menuIds: [ruleRequired('关联页面不能为空')],
  71. name: [ruleRequired('接口名称不能为空')],
  72. address: [ruleRequired('接口地址不能为空')],
  73. };
  74. // 加载菜单列表
  75. api.menu.getList({ status: -1 }).then((res: any[]) => {
  76. menuData.value = res;
  77. });
  78. const onSubmit = async () => {
  79. await formRef.value.validate();
  80. const theApi = formData.id ? api.api.edit : api.api.add;
  81. await theApi(formData);
  82. ElMessage.success('操作成功');
  83. resetForm();
  84. showDialog.value = false;
  85. emit('getList');
  86. };
  87. const resetForm = async () => {
  88. Object.assign(formData, { ...baseForm });
  89. formRef.value && formRef.value.resetFields();
  90. };
  91. const open = async (row: any) => {
  92. resetForm();
  93. showDialog.value = true;
  94. api.api.getList({ types: 1, status: -1, }).then((res: any) => {
  95. typeData.value = [{
  96. id: -1,
  97. name: '主分类',
  98. children: res.Info
  99. }]
  100. });
  101. nextTick(() => {
  102. Object.assign(formData, { ...row });
  103. });
  104. };
  105. defineExpose({ open });
  106. </script>