131 lines
4.2 KiB
JavaScript
131 lines
4.2 KiB
JavaScript
// 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' });
|
||
},
|
||
});
|