PetEditView.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <div class="pet-edit">
  3. <el-button text @click="router.back()">← 返回</el-button>
  4. <h1>编辑宠物</h1>
  5. <el-form ref="formRef" :model="form" :rules="rules" label-width="100px" class="form">
  6. <el-form-item label="宠物名" prop="name">
  7. <el-input v-model="form.name" />
  8. </el-form-item>
  9. <el-form-item label="品种" prop="breed">
  10. <el-input v-model="form.breed" />
  11. </el-form-item>
  12. <el-form-item label="年龄" prop="age">
  13. <el-input-number v-model="form.age" :min="0" />
  14. </el-form-item>
  15. <el-form-item label="体重(kg)" prop="weight">
  16. <el-input-number v-model="form.weight" :min="0" :precision="1" :step="0.5" />
  17. </el-form-item>
  18. <el-form-item label="性别" prop="gender">
  19. <el-radio-group v-model="form.gender">
  20. <el-radio value="MALE">公</el-radio>
  21. <el-radio value="FEMALE">母</el-radio>
  22. </el-radio-group>
  23. </el-form-item>
  24. <el-form-item label="备注">
  25. <el-input v-model="form.notes" type="textarea" />
  26. </el-form-item>
  27. <el-form-item>
  28. <el-button type="primary" @click="handleSubmit">保存</el-button>
  29. <el-button @click="router.back()">取消</el-button>
  30. </el-form-item>
  31. </el-form>
  32. </div>
  33. </template>
  34. <script setup lang="ts">
  35. import { reactive, ref, onMounted } from 'vue'
  36. import { useRouter, useRoute } from 'vue-router'
  37. import { ElMessage } from 'element-plus'
  38. import type { FormInstance, FormRules } from 'element-plus'
  39. import { getPetController } from '@/api/pet-controller'
  40. import type { PetDto } from '@/api/models'
  41. const router = useRouter()
  42. const route = useRoute()
  43. const formRef = ref<FormInstance>()
  44. const form = reactive({
  45. name: '',
  46. breed: '',
  47. age: 0,
  48. weight: 0,
  49. gender: 'MALE' as 'MALE' | 'FEMALE',
  50. notes: ''
  51. })
  52. const rules: FormRules = {
  53. name: [{ required: true, message: '请输入宠物名', trigger: 'blur' }],
  54. breed: [{ required: true, message: '请输入品种', trigger: 'blur' }],
  55. weight: [{ type: 'number', min: 0, message: '体重必须大于 0', trigger: 'blur' }]
  56. }
  57. const fetchPet = async () => {
  58. try {
  59. const api = getPetController()
  60. const res = await api.getById(Number(route.params.id))
  61. if (res.code === 200 && res.data) {
  62. const p = res.data
  63. form.name = p.name ?? ''
  64. form.breed = p.breed ?? ''
  65. form.weight = p.weight ?? 0
  66. form.gender = (p.gender as 'MALE' | 'FEMALE') ?? 'MALE'
  67. form.notes = p.remark ?? ''
  68. }
  69. } catch (err: any) {
  70. ElMessage.error(err.message || '加载失败')
  71. }
  72. }
  73. const handleSubmit = async () => {
  74. const valid = await formRef.value?.validate().catch(() => false)
  75. if (!valid) return
  76. try {
  77. const api = getPetController()
  78. const dto: PetDto = {
  79. name: form.name,
  80. species: form.breed,
  81. breed: form.breed,
  82. gender: form.gender,
  83. weight: form.weight,
  84. remark: form.notes
  85. }
  86. const res = await api.update(Number(route.params.id), dto)
  87. if (res.code === 200) {
  88. ElMessage.success('保存成功')
  89. router.push('/pets')
  90. } else {
  91. ElMessage.error(res.message || '保存失败')
  92. }
  93. } catch (err: any) {
  94. ElMessage.error(err.message || '保存失败')
  95. }
  96. }
  97. onMounted(fetchPet)
  98. </script>
  99. <style scoped>
  100. .pet-edit {
  101. max-width: 600px;
  102. margin: 0 auto;
  103. padding: 20px;
  104. }
  105. .form {
  106. margin-top: 20px;
  107. }
  108. </style>