Files
danyang-match/miniapp/pages/profile-lifestyle/profile-lifestyle.js
T

229 lines
7.4 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.
/**
* 职业与生活页 U07(Phase 04 P04-T22)
*
* 重构要点(遵循 AGENTS.md 不变量):
* - 数据:profileService.getProfile + userStore.updateProfile(第 9 条)
* - 草稿恢复:onLoad 读 ONBOARDING_DRAFT.lifestyle,保存前写回(验收条件"Draft退出后可恢复")
* - 下一步:跳 profile-photos
*/
const { userStore, appStore } = require('../../stores');
const { profileService } = require('../../services');
const { ROUTE, STORAGE_KEYS } = require('../../constants');
const OCCUPATION_CATEGORY_OPTIONS = [
'机关事业单位', '教育', '医疗', '企业职员',
'技术人员', '个体经营', '自由职业', '服务行业',
'农业', '其他',
];
const WORK_REGION_OPTIONS = ['丹阳', '镇江市区', '镇江其他辖区', '南京', '不限'];
const SMOKING_OPTIONS = [
{ value: 'never', label: '不吸烟' },
{ value: 'occasional', label: '偶尔' },
{ value: 'often', label: '经常' },
];
const DRINKING_OPTIONS = [
{ value: 'never', label: '不饮酒' },
{ value: 'occasional', label: '偶尔' },
{ value: 'often', label: '经常' },
];
const LONG_TERM_OPTIONS = [
{ value: 'yes', label: '是' },
{ value: 'no', label: '否' },
];
const FUTURE_DANYANG_OPTIONS = [
{ value: 'willing', label: '愿意' },
{ value: 'uncertain', label: '不确定' },
{ value: 'unwilling', label: '不愿意' },
];
Page({
data: {
statusBarHeight: 20,
navBarHeight: 44,
loading: false,
saving: false,
occupationCategory: '',
workRegion: '',
smokingStatus: '',
drinkingStatus: '',
longTermDanyang: '',
futureDanyang: '',
// 选项
occupationCategoryOptions: OCCUPATION_CATEGORY_OPTIONS,
workRegionOptions: WORK_REGION_OPTIONS,
smokingOptions: SMOKING_OPTIONS,
drinkingOptions: DRINKING_OPTIONS,
longTermOptions: LONG_TERM_OPTIONS,
futureDanyangOptions: FUTURE_DANYANG_OPTIONS,
occupationCategoryIndex: -1,
workRegionIndex: -1,
smokingIndex: -1,
drinkingIndex: -1,
longTermIndex: -1,
futureDanyangIndex: -1,
},
onLoad() {
this._initSystemInfo();
this._applyDraft();
this.loadProfile();
},
_initSystemInfo() {
try {
const sysInfo = wx.getSystemInfoSync();
this.setData({
statusBarHeight: sysInfo.statusBarHeight || 20,
navBarHeight: 44,
});
} catch (e) { /* 使用默认值 */ }
},
async loadProfile() {
this.setData({ loading: true });
try {
const profile = await profileService.getProfile();
this._mergeProfile(profile);
} catch (err) { /* 首次填写无资料 */ } finally {
this.setData({ loading: false });
}
},
_mergeProfile(profile) {
if (!profile) return;
const d = this._readDraft();
const occupationCategory = d.occupationCategory || profile.occupationCategory || '';
const workRegion = d.workRegion || profile.workRegion || '';
const smokingStatus = d.smokingStatus || profile.smokingStatus || '';
const drinkingStatus = d.drinkingStatus || profile.drinkingStatus || '';
const longTermDanyang = d.longTermDanyang || profile.longTermDanyang || '';
const futureDanyang = d.futureDanyang || profile.futureDanyang || '';
this.setData({
occupationCategory,
workRegion,
smokingStatus,
drinkingStatus,
longTermDanyang,
futureDanyang,
occupationCategoryIndex: OCCUPATION_CATEGORY_OPTIONS.indexOf(occupationCategory),
workRegionIndex: WORK_REGION_OPTIONS.indexOf(workRegion),
smokingIndex: SMOKING_OPTIONS.findIndex((o) => o.value === smokingStatus),
drinkingIndex: DRINKING_OPTIONS.findIndex((o) => o.value === drinkingStatus),
longTermIndex: LONG_TERM_OPTIONS.findIndex((o) => o.value === longTermDanyang),
futureDanyangIndex: FUTURE_DANYANG_OPTIONS.findIndex((o) => o.value === futureDanyang),
});
},
// ============ 草稿 ============
_readDraft() {
try {
const draft = wx.getStorageSync(STORAGE_KEYS.ONBOARDING_DRAFT) || {};
return draft.lifestyle || {};
} catch (e) {
return {};
}
},
_applyDraft() {
const d = this._readDraft();
if (!d || Object.keys(d).length === 0) return;
this.setData({
occupationCategory: d.occupationCategory || '',
workRegion: d.workRegion || '',
smokingStatus: d.smokingStatus || '',
drinkingStatus: d.drinkingStatus || '',
longTermDanyang: d.longTermDanyang || '',
futureDanyang: d.futureDanyang || '',
occupationCategoryIndex: OCCUPATION_CATEGORY_OPTIONS.indexOf(d.occupationCategory || ''),
workRegionIndex: WORK_REGION_OPTIONS.indexOf(d.workRegion || ''),
smokingIndex: SMOKING_OPTIONS.findIndex((o) => o.value === (d.smokingStatus || '')),
drinkingIndex: DRINKING_OPTIONS.findIndex((o) => o.value === (d.drinkingStatus || '')),
longTermIndex: LONG_TERM_OPTIONS.findIndex((o) => o.value === (d.longTermDanyang || '')),
futureDanyangIndex: FUTURE_DANYANG_OPTIONS.findIndex((o) => o.value === (d.futureDanyang || '')),
});
},
_writeDraft() {
try {
const draft = wx.getStorageSync(STORAGE_KEYS.ONBOARDING_DRAFT) || {};
draft.lifestyle = {
occupationCategory: this.data.occupationCategory,
workRegion: this.data.workRegion,
smokingStatus: this.data.smokingStatus,
drinkingStatus: this.data.drinkingStatus,
longTermDanyang: this.data.longTermDanyang,
futureDanyang: this.data.futureDanyang,
};
draft.currentStep = 'lifestyle';
wx.setStorageSync(STORAGE_KEYS.ONBOARDING_DRAFT, draft);
} catch (e) { /* ignore */ }
},
// ============ 表单交互 ============
onOccupationCategoryChange(e) {
const idx = Number(e.detail.value);
this.setData({ occupationCategoryIndex: idx, occupationCategory: OCCUPATION_CATEGORY_OPTIONS[idx] });
},
onWorkRegionChange(e) {
const idx = Number(e.detail.value);
this.setData({ workRegionIndex: idx, workRegion: WORK_REGION_OPTIONS[idx] });
},
onSmokingChange(e) {
const idx = Number(e.detail.value);
this.setData({ smokingIndex: idx, smokingStatus: SMOKING_OPTIONS[idx].value });
},
onDrinkingChange(e) {
const idx = Number(e.detail.value);
this.setData({ drinkingIndex: idx, drinkingStatus: DRINKING_OPTIONS[idx].value });
},
onLongTermChange(e) {
const idx = Number(e.detail.value);
this.setData({ longTermIndex: idx, longTermDanyang: LONG_TERM_OPTIONS[idx].value });
},
onFutureDanyangChange(e) {
const idx = Number(e.detail.value);
this.setData({ futureDanyangIndex: idx, futureDanyang: FUTURE_DANYANG_OPTIONS[idx].value });
},
// ============ 导航 ============
onBack() {
this._writeDraft();
wx.navigateBack();
},
async onNext() {
if (this.data.saving) return;
const { occupationCategory, workRegion, smokingStatus, drinkingStatus, longTermDanyang, futureDanyang } = this.data;
if (!occupationCategory) return appStore.toast('请选择职业类别');
if (!workRegion) return appStore.toast('请选择工作区域');
this.setData({ saving: true });
this._writeDraft();
try {
await userStore.updateProfile({
occupationCategory,
workRegion,
smokingStatus,
drinkingStatus,
longTermDanyang,
futureDanyang,
});
this.setData({ saving: false });
wx.navigateTo({ url: ROUTE.ONBOARDING.PROFILE_PHOTOS });
} catch (err) {
this.setData({ saving: false });
appStore.toastError(err, '保存失败');
}
},
});