deviceIn.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <el-form ref="formRef" :model="formData" :rules="ruleForm" label-width="80px" @keyup.enter="onSubmit">
  3. <el-form-item label="上级分类" prop="parentId">
  4. <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>
  5. </el-form-item>
  6. <el-form-item label="关联页面" prop="menuIds">
  7. <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>
  8. </el-form-item>
  9. <el-form-item label="接口名称" prop="name">
  10. <el-input v-model="formData.name" placeholder="输入接口名称" />
  11. </el-form-item>
  12. <el-form-item label="接口地址" prop="address">
  13. <el-input v-model="formData.address" placeholder="接口地址" />
  14. </el-form-item>
  15. </el-form>
  16. </template>
  17. <script lang="ts" setup>
  18. import { ref, reactive, nextTick, watch } from 'vue';
  19. import api from '/@/api/system';
  20. import { ApiRow } from '/@/api/model/system/menu';
  21. import { ruleRequired } from '/@/utils/validator';
  22. import { ElMessage } from 'element-plus';
  23. import apiDatahub from '/@/api/datahub';
  24. const emit = defineEmits(['getList']);
  25. const showDialog = ref(false);
  26. const formRef = ref();
  27. const menuData = ref<any[]>([]);
  28. const typeData = ref<any[]>([]);
  29. const methodOptions = ref<any[]>([]);
  30. const baseForm: ApiRow = {
  31. menuIds: [],
  32. id: undefined,
  33. parentId: undefined,
  34. name: '',
  35. types: 2,
  36. address: '',
  37. method: '',
  38. remark: '',
  39. status: 1,
  40. };
  41. const formData = reactive<ApiRow>({
  42. ...baseForm,
  43. });
  44. // 切换分类时清空上级分类的选择。因为接口里不能选择跟分类节点
  45. watch(
  46. () => formData.types,
  47. () => {
  48. formData.parentId = undefined;
  49. }
  50. );
  51. const ruleForm = {
  52. parentId: [ruleRequired('上级分类不能为空', 'change')],
  53. menuIds: [ruleRequired('关联页面不能为空', 'change')],
  54. method: [ruleRequired('请求方式不能为空', 'change')],
  55. name: [ruleRequired('接口名称不能为空')],
  56. address: [ruleRequired('接口地址不能为空')],
  57. };
  58. apiDatahub.template.getDictData({ DictType: 'api_methods' }).then((res: any) => {
  59. methodOptions.value = res.values;
  60. });
  61. // 加载菜单列表
  62. api.menu.getList({ status: -1 }).then((res: any[]) => {
  63. menuData.value = res;
  64. });
  65. const onSubmit = async () => {
  66. await formRef.value.validate();
  67. const theApi = formData.id ? api.api.edit : api.api.add;
  68. await theApi(formData);
  69. ElMessage.success('操作成功');
  70. resetForm();
  71. showDialog.value = false;
  72. emit('getList');
  73. };
  74. const resetForm = async () => {
  75. Object.assign(formData, { ...baseForm });
  76. formRef.value && formRef.value.resetFields();
  77. };
  78. const open = async (row: any) => {
  79. resetForm();
  80. showDialog.value = true;
  81. api.api.getList({ types: 1, status: -1 }).then((res: any) => {
  82. typeData.value = res.Info;
  83. });
  84. nextTick(() => {
  85. Object.assign(formData, { method: methodOptions.value.length ? methodOptions.value[0].value : '', ...row });
  86. });
  87. };
  88. defineExpose({ open });
  89. </script>