dialog.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <script setup lang="ts">
  2. import { reactive, computed, ref } from "vue";
  3. import { ElMessage } from "element-plus";
  4. import { addQuota } from "@/api/indexDefine";
  5. const emit = defineEmits(["closeDialog"]);
  6. const visible = ref(false);
  7. const ruleFormRef = ref(null);
  8. const form = reactive({
  9. name: "",
  10. categoryName: "",
  11. define: "",
  12. caliber: "",
  13. source: "",
  14. statue: null
  15. });
  16. const msgName = ref("");
  17. const addQuotaApi = async () => {
  18. ruleFormRef.value.validate(async (valid: boolean) => {
  19. if (valid) {
  20. const { code, msg } = await addQuota(form);
  21. if (code === 200) {
  22. ElMessage({
  23. message: "添加成功",
  24. type: "success"
  25. });
  26. emit("closeDialog");
  27. }
  28. if (code === 10027) {
  29. msgName.value = msg;
  30. // rules.name[0].message = msg; // 将 msg 设置为 name 字段的错误信息
  31. // ruleFormRef.value.validateField("name"); // 触发验证以显示错误消息
  32. }
  33. }
  34. });
  35. };
  36. const rules = reactive({
  37. name: [{ required: true, message: "请填写指标名称", trigger: "blur" }],
  38. define: [{ required: true, message: "请填写指标分类", trigger: "blur" }],
  39. categoryName: [
  40. { required: true, message: "请填写指标定义", trigger: "blur" }
  41. ],
  42. caliber: [{ required: true, message: "请填写指标口径", trigger: "blur" }],
  43. source: [{ required: true, message: "来源", trigger: "blur" }],
  44. statue: [{ required: true, message: "请填写选择状态", trigger: "blur" }]
  45. });
  46. const close = () => {
  47. // 请关闭弹框
  48. console.log(visible.value);
  49. visible.value = false;
  50. };
  51. const save = () => {
  52. addQuotaApi();
  53. };
  54. const open = () => {
  55. // 打开弹框
  56. const form = {
  57. name: "",
  58. categoryName: "",
  59. define: "",
  60. caliber: "",
  61. source: "",
  62. statue: null
  63. };
  64. msgName.value = "";
  65. visible.value = true;
  66. console.log("打开弹框");
  67. };
  68. defineExpose({
  69. open
  70. });
  71. </script>
  72. <template>
  73. <el-dialog v-model="visible" title="新建指标" width="480">
  74. <div class="m-auto w-full">
  75. <el-form
  76. ref="ruleFormRef"
  77. :model="form"
  78. label-position="right"
  79. label-width="auto"
  80. :rules="rules"
  81. style="max-width: 600px"
  82. >
  83. <el-form-item label="指标名称" prop="name">
  84. <el-input
  85. v-model="form.name"
  86. autocomplete="off"
  87. placeholder="请输入"
  88. />
  89. <el-text v-if="msgName" class="absolute top-6 msgName" type="warning">
  90. 指标名称已存在,请更换一个名称
  91. </el-text>
  92. </el-form-item>
  93. <el-form-item label="指标分类">
  94. <el-select v-model="form.categoryName" placeholder="请选择">
  95. <el-option label="Zone No.1" value="shanghai" />
  96. <el-option label="Zone No.2" value="beijing" />
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item label="指标定义" prop="define">
  100. <el-input
  101. v-model="form.define"
  102. type="textarea"
  103. autocomplete="off"
  104. placeholder="请输入"
  105. />
  106. </el-form-item>
  107. <el-form-item label="指标口径" prop="caliber">
  108. <el-input
  109. v-model="form.caliber"
  110. type="textarea"
  111. autocomplete="off"
  112. placeholder="请输入"
  113. />
  114. </el-form-item>
  115. <el-form-item label="来源">
  116. <el-select v-model="form.source" placeholder="请选择">
  117. <el-option label="Zone No.1" value="shanghai" />
  118. <el-option label="Zone No.2" value="beijing" />
  119. </el-select>
  120. </el-form-item>
  121. <el-form-item label="状态" prop="statue">
  122. <el-select v-model="form.statue" placeholder="请选择">
  123. <el-option label="草稿" value="0" />
  124. <el-option label="发布" value="1" />
  125. <el-option label="下架" value="2" />
  126. </el-select>
  127. </el-form-item>
  128. </el-form>
  129. </div>
  130. <template #footer>
  131. <div class="dialog-footer">
  132. <el-button @click="close">取消</el-button>
  133. <el-button type="primary" @click="save">保存</el-button>
  134. </div>
  135. </template>
  136. </el-dialog>
  137. </template>
  138. <style lang="scss" scope>
  139. .msgName {
  140. font-size: 10px;
  141. }
  142. </style>