Files
Pet3/miniprogram/pages/dog-edit/dog-edit.js
2026-06-25 18:24:29 +08:00

131 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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' });
},
});