This commit is contained in:
2026-06-25 18:24:29 +08:00
commit a1190d7d9a
90 changed files with 5459 additions and 0 deletions

View File

@@ -0,0 +1,130 @@
// 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' });
},
});