// pages/dog-edit/dog-edit — 0b 建档/编辑(复用,docs/05 R2) // 仅名字、犬种必填。未知犬种(中华田园犬/其他)需手动选体型档位。?id= 进编辑模式。 const { call } = require('../../utils/cloud.js'); const store = require('../../utils/store.js'); const { SIZE_LABELS, sizeOfBreed } = require('../../utils/dogStep.js'); const { chooseAndUpload } = require('../../utils/media.js'); const BREEDS = [ '柯基', '比熊', '泰迪', '柴犬', '金毛', '拉布拉多', '哈士奇', '边境牧羊犬', '萨摩耶', '法斗', '中华田园犬', '其他', ]; const AGE_STAGES = [ { key: 'puppy', label: '幼犬' }, { key: 'adult', label: '成犬' }, { key: 'senior', label: '老年犬' }, ]; Page({ data: { isEdit: false, dogId: '', breeds: BREEDS, ageStages: AGE_STAGES, sizeLabels: SIZE_LABELS, breedIndex: -1, needSize: false, // 未知犬种时需手动选体型 form: { name: '', breed: '', sizeLevel: '', gender: '', ageStage: '', weight: '', avatar: '', }, submitting: false, }, onLoad(options) { const id = options.id; if (id) { const dog = (store.getState().dogs || []).find((d) => d._id === id); if (dog) { wx.setNavigationBarTitle({ title: '编辑资料' }); this.setData({ isEdit: true, dogId: id, breedIndex: Math.max(0, BREEDS.indexOf(dog.breed)), needSize: !sizeOfBreed(dog.breed), form: { name: dog.name || '', breed: dog.breed || '', sizeLevel: dog.sizeLevel || '', gender: dog.gender || '', ageStage: dog.ageStage || '', weight: dog.weight != null ? String(dog.weight) : '', avatar: dog.avatar || '', }, }); } } }, onNameInput(e) { this.setData({ 'form.name': e.detail.value }); }, onWeightInput(e) { this.setData({ 'form.weight': e.detail.value }); }, async onPickAvatar() { const fileID = await chooseAndUpload('avatars'); if (fileID) this.setData({ 'form.avatar': fileID }); }, onBreedChange(e) { const idx = Number(e.detail.value); const breed = BREEDS[idx]; const mapped = sizeOfBreed(breed); this.setData({ breedIndex: idx, 'form.breed': breed, needSize: !mapped, // 未知犬种 → 手动选 'form.sizeLevel': mapped || '', }); }, onSizeTap(e) { this.setData({ 'form.sizeLevel': e.currentTarget.dataset.v }); }, onGenderTap(e) { const v = e.currentTarget.dataset.v; this.setData({ 'form.gender': this.data.form.gender === v ? '' : v }); }, onAgeTap(e) { const v = e.currentTarget.dataset.v; this.setData({ 'form.ageStage': this.data.form.ageStage === v ? '' : v }); }, async onSubmit() { const { form, isEdit, dogId, needSize, submitting } = this.data; if (submitting) return; if (!form.name.trim()) return wx.showToast({ title: '请填写名字', icon: 'none' }); if (!form.breed) return wx.showToast({ title: '请选择犬种', icon: 'none' }); if (needSize && !form.sizeLevel) return wx.showToast({ title: '请选择体型档位', icon: 'none' }); const ageText = (AGE_STAGES.find((a) => a.key === form.ageStage) || {}).label || ''; const payload = { name: form.name.trim(), breed: form.breed, sizeLevel: form.sizeLevel || null, // 已知犬种服务端会覆盖 gender: form.gender || null, ageStage: form.ageStage || null, ageText, weight: form.weight ? Number(form.weight) : null, avatar: form.avatar || '', }; this.setData({ submitting: true }); const res = await call('dogManage', { action: isEdit ? 'update' : 'create', dog: isEdit ? { _id: dogId, ...payload } : payload, }, { loading: true, loadingText: '保存中' }); this.setData({ submitting: false }); if (!res.ok) return; const dogs = (store.getState().dogs || []).slice(); const i = dogs.findIndex((d) => d._id === res.data._id); if (i >= 0) dogs[i] = res.data; else dogs.push(res.data); store.set({ dogs, currentDogId: res.data._id }); if (isEdit) wx.navigateBack(); else wx.switchTab({ url: '/pages/home/home' }); }, });