- 八字页:未绑定生辰时展示虚构示例排盘(1990-08-08 10:30男)与15条字段说明, 附传统文化声明文案;已绑定时支持多档案切换,排盘增强(十神/藏干/纳音/五行配色/命盘概览) - 个人中心:新增生辰管理卡片,每用户免费绑定3个出生年月;登录改为真实微信登录 - 服务端:新增 BirthProfile 模型与 /api/user/birth-profiles 增删查接口,AutoMigrate 建表 - 前端:新增 birth-profile.js 本地存储优先+登录后云端双向同步 - 修复:个人中心 tabBar 页面入口误用 navigateTo 改为 switchTab
247 lines
7.1 KiB
JavaScript
247 lines
7.1 KiB
JavaScript
const versionInfo = require('../../utils/version.js');
|
|
const { request } = require('../../utils/request.js');
|
|
const birthProfile = require('../../utils/birth-profile.js');
|
|
|
|
Page({
|
|
data: {
|
|
userInfo: null,
|
|
loggedIn: false,
|
|
logging: false,
|
|
weekStartDay: 0,
|
|
ziHourSect: 'lateZiNextDay',
|
|
solarTime: true,
|
|
showBuddhist: false,
|
|
highlightLunar: true,
|
|
bookmarks: [],
|
|
// 生辰档案
|
|
profiles: [],
|
|
activeProfileId: '',
|
|
maxFree: birthProfile.MAX_PROFILES,
|
|
canAdd: true,
|
|
showAddForm: false,
|
|
formName: '',
|
|
formGender: 'male',
|
|
formDate: '1990-01-01',
|
|
formTime: '12:00',
|
|
version: versionInfo.version,
|
|
buildNumber: versionInfo.buildNumber,
|
|
buildTime: versionInfo.buildTime,
|
|
commitSha: versionInfo.commitSha
|
|
},
|
|
|
|
onLoad() {
|
|
this.loadSettings();
|
|
this.loadBookmarks();
|
|
},
|
|
|
|
onShow() {
|
|
this.loadBookmarks();
|
|
this.loadProfiles();
|
|
},
|
|
|
|
loadSettings() {
|
|
const settings = wx.getStorageSync('lunar-settings') || {};
|
|
this.setData({
|
|
weekStartDay: settings.weekStartDay || 0,
|
|
ziHourSect: settings.ziHourSect || 'lateZiNextDay',
|
|
solarTime: settings.solarTime !== false,
|
|
showBuddhist: settings.showBuddhist === true,
|
|
highlightLunar: settings.highlightLunar !== false
|
|
});
|
|
},
|
|
|
|
saveSettings() {
|
|
const { weekStartDay, ziHourSect, solarTime, showBuddhist, highlightLunar } = this.data;
|
|
wx.setStorageSync('lunar-settings', { weekStartDay, ziHourSect, solarTime, showBuddhist, highlightLunar });
|
|
},
|
|
|
|
loadBookmarks() {
|
|
const bookmarks = wx.getStorageSync('lunar-bookmarks') || [];
|
|
this.setData({ bookmarks });
|
|
},
|
|
|
|
// ==================== 生辰档案 ====================
|
|
|
|
loadProfiles() {
|
|
const render = () => {
|
|
const profiles = birthProfile.getProfiles();
|
|
const active = birthProfile.getActiveProfile();
|
|
this.setData({
|
|
profiles,
|
|
activeProfileId: active ? active.id : '',
|
|
canAdd: profiles.length < this.data.maxFree
|
|
});
|
|
};
|
|
// 已登录时先从服务端同步,失败静默回退本地
|
|
if (birthProfile.isLoggedIn()) {
|
|
birthProfile.syncFromServer().then(render).catch(render);
|
|
} else {
|
|
render();
|
|
}
|
|
},
|
|
|
|
toggleAddForm() {
|
|
if (!this.data.showAddForm && !this.data.canAdd) {
|
|
wx.showToast({ title: `最多可免费绑定 ${this.data.maxFree} 个生辰`, icon: 'none' });
|
|
return;
|
|
}
|
|
this.setData({ showAddForm: !this.data.showAddForm });
|
|
},
|
|
|
|
onFormName(e) {
|
|
this.setData({ formName: e.detail.value });
|
|
},
|
|
|
|
setFormGender(e) {
|
|
this.setData({ formGender: e.currentTarget.dataset.g });
|
|
},
|
|
|
|
onFormDate(e) {
|
|
this.setData({ formDate: e.detail.value });
|
|
},
|
|
|
|
onFormTime(e) {
|
|
this.setData({ formTime: e.detail.value });
|
|
},
|
|
|
|
submitProfile() {
|
|
const { formName, formGender, formDate, formTime } = this.data;
|
|
if (!formDate || !formTime) {
|
|
wx.showToast({ title: '请选择出生日期和时间', icon: 'none' });
|
|
return;
|
|
}
|
|
const result = birthProfile.addProfile({
|
|
name: formName.trim() || '未命名',
|
|
gender: formGender,
|
|
birthday: formDate,
|
|
birthTime: formTime
|
|
});
|
|
if (!result.ok) {
|
|
wx.showToast({ title: result.msg, icon: 'none' });
|
|
return;
|
|
}
|
|
// 已登录时推送到服务端(静默失败,不影响本地)
|
|
birthProfile.pushProfileToServer(result.profile);
|
|
this.setData({ showAddForm: false, formName: '' });
|
|
wx.showToast({ title: '绑定成功', icon: 'success' });
|
|
this.loadProfiles();
|
|
},
|
|
|
|
removeProfile(e) {
|
|
const id = e.currentTarget.dataset.id;
|
|
const profile = this.data.profiles.find(p => p.id === id);
|
|
if (!profile) return;
|
|
wx.showModal({
|
|
title: '删除生辰',
|
|
content: `确定删除「${profile.name}」的生辰信息吗?`,
|
|
success: (res) => {
|
|
if (!res.confirm) return;
|
|
birthProfile.removeProfile(id);
|
|
birthProfile.removeProfileFromServer(profile);
|
|
wx.showToast({ title: '已删除', icon: 'success' });
|
|
this.loadProfiles();
|
|
}
|
|
});
|
|
},
|
|
|
|
// ==================== 登录 ====================
|
|
|
|
login() {
|
|
if (this.data.logging) return;
|
|
this.setData({ logging: true });
|
|
wx.login({
|
|
success: (loginRes) => {
|
|
if (!loginRes.code) {
|
|
this.setData({ logging: false });
|
|
wx.showToast({ title: '微信登录失败', icon: 'none' });
|
|
return;
|
|
}
|
|
request({
|
|
url: '/api/user/login',
|
|
method: 'POST',
|
|
data: { code: loginRes.code }
|
|
}).then((res) => {
|
|
if (res && res.code === 0 && res.data && res.data.token) {
|
|
wx.setStorageSync('token', res.data.token);
|
|
wx.setStorageSync('lunar-user-info', res.data.user);
|
|
this.setData({ userInfo: res.data.user, loggedIn: true, logging: false });
|
|
wx.showToast({ title: '登录成功', icon: 'success' });
|
|
// 登录后同步服务端生辰档案
|
|
this.loadProfiles();
|
|
} else {
|
|
this.setData({ logging: false });
|
|
wx.showToast({ title: (res && res.msg) || '登录失败', icon: 'none' });
|
|
}
|
|
}).catch(() => {
|
|
this.setData({ logging: false });
|
|
wx.showToast({ title: '登录失败,请稍后重试', icon: 'none' });
|
|
});
|
|
},
|
|
fail: () => {
|
|
this.setData({ logging: false });
|
|
wx.showToast({ title: '微信登录失败', icon: 'none' });
|
|
}
|
|
});
|
|
},
|
|
|
|
logout() {
|
|
wx.showModal({
|
|
title: '退出登录',
|
|
content: '退出后生辰档案仅保存在本机,重新登录可恢复云端档案',
|
|
success: (res) => {
|
|
if (!res.confirm) return;
|
|
wx.removeStorageSync('token');
|
|
wx.removeStorageSync('lunar-user-info');
|
|
this.setData({ userInfo: null, loggedIn: false });
|
|
wx.showToast({ title: '已退出', icon: 'success' });
|
|
}
|
|
});
|
|
},
|
|
|
|
// ==================== 偏好设置 ====================
|
|
|
|
setWeekStart(e) {
|
|
this.setData({ weekStartDay: Number(e.currentTarget.dataset.v) });
|
|
this.saveSettings();
|
|
},
|
|
|
|
setZiSect(e) {
|
|
this.setData({ ziHourSect: e.currentTarget.dataset.v });
|
|
this.saveSettings();
|
|
},
|
|
|
|
onSolarTimeChange(e) {
|
|
this.setData({ solarTime: e.detail.value });
|
|
this.saveSettings();
|
|
},
|
|
|
|
onBuddhistChange(e) {
|
|
this.setData({ showBuddhist: e.detail.value });
|
|
this.saveSettings();
|
|
},
|
|
|
|
onHighlightLunarChange(e) {
|
|
this.setData({ highlightLunar: e.detail.value });
|
|
this.saveSettings();
|
|
},
|
|
|
|
removeBookmark(e) {
|
|
const date = e.currentTarget.dataset.date;
|
|
let bookmarks = this.data.bookmarks.filter(b => b.date !== date);
|
|
wx.setStorageSync('lunar-bookmarks', bookmarks);
|
|
this.setData({ bookmarks });
|
|
wx.showToast({ title: '已删除', icon: 'success' });
|
|
},
|
|
|
|
navTo(e) {
|
|
const url = e.currentTarget.dataset.url;
|
|
// tabBar 页面必须用 switchTab 打开
|
|
const tabPages = ['/pages/home/home', '/pages/wish-tree/wish-tree', '/pages/bazi/bazi', '/pages/wiki/wiki', '/pages/settings/settings', '/pages/fortune/fortune'];
|
|
if (tabPages.includes(url)) {
|
|
wx.switchTab({ url });
|
|
} else {
|
|
wx.navigateTo({ url });
|
|
}
|
|
}
|
|
});
|