dialog.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <script setup lang="ts">
  2. import { reactive, ref } from "vue";
  3. import { getStationDetail, addStation, modifyStation } from "@/api/station";
  4. import { ElMessage } from "element-plus";
  5. const emit = defineEmits(["refresh"]);
  6. const formRef = ref();
  7. const dialogVisible = ref(false);
  8. const dialogType = ref<"add" | "edit" | "view">("add");
  9. const loading = ref(false);
  10. const state = reactive({
  11. ruleForm: {
  12. id: null as number | null,
  13. stationId: "",
  14. stationName: "",
  15. address: "",
  16. stationStatus: "1",
  17. stationType: "1",
  18. parkingFee: "",
  19. parkingQrCode: "",
  20. remark: "",
  21. pictures: [] as string[],
  22. stationLng: "",
  23. stationLat: ""
  24. },
  25. rules: {
  26. stationName: [{ required: true, message: "请输入站点名称", trigger: "blur" }],
  27. address: [{ required: true, message: "请输入站点地址", trigger: "blur" }]
  28. }
  29. });
  30. const resetForm = () => {
  31. state.ruleForm = {
  32. id: null,
  33. stationId: "",
  34. stationName: "",
  35. address: "",
  36. stationStatus: "1",
  37. stationType: "1",
  38. parkingFee: "",
  39. parkingQrCode: "",
  40. remark: "",
  41. pictures: [],
  42. stationLng: "",
  43. stationLat: ""
  44. };
  45. formRef.value?.resetFields();
  46. };
  47. const open = async (type: "add" | "edit" | "view", row?: any) => {
  48. dialogType.value = type;
  49. resetForm();
  50. if (type !== "add" && row) {
  51. loading.value = true;
  52. try {
  53. const res = await getStationDetail(row.id);
  54. Object.assign(state.ruleForm, res);
  55. } catch (e) {
  56. ElMessage.error("加载站点详情失败");
  57. } finally {
  58. loading.value = false;
  59. }
  60. }
  61. dialogVisible.value = true;
  62. };
  63. const handleClose = () => {
  64. dialogVisible.value = false;
  65. resetForm();
  66. };
  67. const handleSubmit = async () => {
  68. const valid = await formRef.value?.validate().catch(() => false);
  69. if (!valid) return;
  70. loading.value = true;
  71. try {
  72. if (dialogType.value === "add") {
  73. await addStation(state.ruleForm);
  74. ElMessage.success("新增成功");
  75. } else {
  76. await modifyStation(state.ruleForm);
  77. ElMessage.success("修改成功");
  78. }
  79. handleClose();
  80. emit("refresh");
  81. } catch (e) {
  82. ElMessage.error("操作失败");
  83. } finally {
  84. loading.value = false;
  85. }
  86. };
  87. const isView = () => dialogType.value === "view";
  88. const getTitle = () => {
  89. const map = { add: "新增站点", edit: "编辑站点", view: "站点详情" };
  90. return map[dialogType.value];
  91. };
  92. defineExpose({ open });
  93. </script>
  94. <template>
  95. <el-dialog
  96. v-model="dialogVisible"
  97. :title="getTitle()"
  98. width="700px"
  99. :close-on-click-modal="false"
  100. destroy-on-close
  101. >
  102. <el-form
  103. ref="formRef"
  104. :model="state.ruleForm"
  105. :rules="state.rules"
  106. label-width="120px"
  107. :disabled="isView()"
  108. >
  109. <el-form-item label="站点ID" prop="stationId">
  110. <el-input v-model="state.ruleForm.stationId" placeholder="请输入站点ID" />
  111. </el-form-item>
  112. <el-form-item label="站点名称" prop="stationName">
  113. <el-input v-model="state.ruleForm.stationName" placeholder="请输入站点名称" />
  114. </el-form-item>
  115. <el-form-item label="站点地址" prop="address">
  116. <el-input v-model="state.ruleForm.address" placeholder="请输入站点地址" />
  117. </el-form-item>
  118. <el-form-item label="站点状态" prop="stationStatus">
  119. <el-select v-model="state.ruleForm.stationStatus" placeholder="请选择站点状态">
  120. <el-option label="营业中" value="1" />
  121. <el-option label="已关闭" value="0" />
  122. </el-select>
  123. </el-form-item>
  124. <el-form-item label="站点类型" prop="stationType">
  125. <el-select v-model="state.ruleForm.stationType" placeholder="请选择站点类型">
  126. <el-option label="公共" value="1" />
  127. <el-option label="私人" value="2" />
  128. </el-select>
  129. </el-form-item>
  130. <el-form-item label="免停服务" prop="parkingFee">
  131. <el-input
  132. v-model="state.ruleForm.parkingFee"
  133. type="textarea"
  134. :rows="2"
  135. placeholder="洗车费用满10元减免1小时停车费"
  136. />
  137. </el-form-item>
  138. <el-form-item label="停车二维码文本" prop="parkingQrCode">
  139. <el-input
  140. v-model="state.ruleForm.parkingQrCode"
  141. type="textarea"
  142. :rows="2"
  143. placeholder="停车费减免二维码文本"
  144. />
  145. </el-form-item>
  146. <el-form-item label="备注" prop="remark">
  147. <el-input
  148. v-model="state.ruleForm.remark"
  149. type="textarea"
  150. :rows="2"
  151. placeholder="请输入备注"
  152. />
  153. </el-form-item>
  154. </el-form>
  155. <template #footer>
  156. <span class="dialog-footer">
  157. <el-button @click="handleClose">取 消</el-button>
  158. <el-button v-if="!isView()" :loading="loading" type="primary" @click="handleSubmit">
  159. 确 定
  160. </el-button>
  161. </span>
  162. </template>
  163. </el-dialog>
  164. </template>
  165. <style scoped lang="scss">
  166. .el-select {
  167. width: 100%;
  168. }
  169. </style>