3fde90e97b
P0 修数据问题 - 记录弹层有 5 个输入框从未绑定,用户填的便便备注、饮食内容、药品名称、 剂量、消费备注全部丢弃;用药记录因此只存下「用药记录」四个字。已全部绑定并入库 - 异常观察保存时写死「风险中」,AI 实际判定的等级被丢掉。改为使用 riskData 的真实 risk_level,并把成因与建议存进备注 文章正文 - 早期 seed 的 4 篇文章 Content 全空,点开只是打开关联记录弹层,内容运营等于白做 - 补写 4 篇真实正文(疫苗驱虫/软便判断/换粮方案/养宠花销),遵循不诊断、 异常必提就医的护栏;对已存在的空正文做幂等回填 - 新增文章详情页,学习页与首页卡片改为打开正文 提醒管理 - 后端 CRUD 早已具备但小程序只读,用户改不了疫苗驱虫日期。提醒弹层支持增删改 - 修复后端 UpdateReminder 漏掉 type 字段导致改类型不生效 「我的」页 7 个死入口接活 - 提醒设置、健康记录、多宠物管理、会员权益分别落到对应功能 - 数据导出:汇总档案与记录为文本,可复制发给医生 - 意见反馈:新增 feedback 表与提交接口,后台加「意见反馈」管理页 - 关于我们:应用说明与免责声明 分享 - 各页面补 onShareAppMessage/onShareTimeline - 帖子分享按钮改用微信原生 open-type="share",删除原来点了没反应的空壳弹层 社区关注 - 新增 follows 表与关注/取关接口,「关注」tab 此前等同「推荐」, 现只显示已关注用户的帖子;帖子头部可直接关注,标记 followed / is_self Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
171 lines
4.2 KiB
JavaScript
171 lines
4.2 KiB
JavaScript
const store = require('../../utils/store.js');
|
|
const api = require('../../utils/api.js');
|
|
|
|
function todayStr() {
|
|
const d = new Date();
|
|
const p = (n) => (n < 10 ? '0' + n : '' + n);
|
|
return d.getFullYear() + '-' + p(d.getMonth() + 1) + '-' + p(d.getDate());
|
|
}
|
|
|
|
function mapTask(t) {
|
|
return {
|
|
id: t.id,
|
|
title: t.title,
|
|
sub: t.description,
|
|
priority: t.priority,
|
|
done: t.done,
|
|
sheet: t.sheet_type,
|
|
};
|
|
}
|
|
|
|
Page({
|
|
data: {
|
|
pet: {},
|
|
summary: { greeting: '', insights: [], week: [], advice: '', health_pct: 0, health_status: '正常' },
|
|
tasks: [],
|
|
firstArticle: null,
|
|
selectedDate: '',
|
|
taskLabel: '今日任务',
|
|
todayDate: '',
|
|
sheetShow: false,
|
|
sheetType: '',
|
|
},
|
|
onLoad() {
|
|
this.setData({ todayDate: todayStr() });
|
|
this._unsub = store.subscribe((pet) => {
|
|
this.setData({ pet });
|
|
this.loadAll();
|
|
});
|
|
},
|
|
onUnload() {
|
|
if (this._unsub) this._unsub();
|
|
},
|
|
onShow() {
|
|
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
|
|
this.getTabBar().setData({ selected: 0 });
|
|
}
|
|
store
|
|
.ready()
|
|
.then(() => {
|
|
this.setData({ pet: store.getPet() });
|
|
this.loadAll();
|
|
})
|
|
.catch((e) => wx.showToast({ title: e.message || '加载失败', icon: 'none' }));
|
|
},
|
|
loadAll() {
|
|
this.loadSummary();
|
|
this.loadTasks();
|
|
if (!this.data.firstArticle) {
|
|
api
|
|
.listArticles()
|
|
.then((list) => {
|
|
if (list && list[0]) {
|
|
this.setData({ firstArticle: { id: list[0].id, icon: list[0].icon, title: list[0].title, desc: list[0].description } });
|
|
}
|
|
})
|
|
.catch(() => {});
|
|
}
|
|
},
|
|
loadSummary() {
|
|
const id = store.currentPetId();
|
|
if (!id) return;
|
|
api
|
|
.homeSummary(id)
|
|
.then((summary) => this.setData({ summary }))
|
|
.catch(() => {});
|
|
},
|
|
loadTasks() {
|
|
const id = store.currentPetId();
|
|
if (!id) return;
|
|
const date = this.data.selectedDate || this.data.todayDate;
|
|
api
|
|
.getTasks(id, date)
|
|
.then((tasks) => this.setData({ tasks: (tasks || []).map(mapTask) }))
|
|
.catch(() => {});
|
|
},
|
|
onTapDay(e) {
|
|
const { date, active } = e.currentTarget.dataset;
|
|
if (!date) return;
|
|
const parts = date.split('-');
|
|
this.setData({
|
|
selectedDate: date,
|
|
taskLabel: active ? '今日任务' : +parts[1] + '月' + +parts[2] + '日',
|
|
});
|
|
this.loadTasks();
|
|
},
|
|
backToToday() {
|
|
this.setData({ selectedDate: this.data.todayDate, taskLabel: '今日任务' });
|
|
this.loadTasks();
|
|
},
|
|
onTapTask(e) {
|
|
const i = e.currentTarget.dataset.index;
|
|
const t = this.data.tasks[i];
|
|
if (t.sheet) {
|
|
this.openSheetType(t.sheet);
|
|
return;
|
|
}
|
|
api
|
|
.toggleTask(t.id)
|
|
.then((res) => {
|
|
this.setData({ [`tasks[${i}].done`]: res.done });
|
|
this.loadSummary();
|
|
})
|
|
.catch(() => {});
|
|
},
|
|
completeTasks() {
|
|
const id = store.currentPetId();
|
|
if (!id) return;
|
|
api
|
|
.completeAllTasks(id)
|
|
.then((tasks) => {
|
|
this.setData({ tasks: (tasks || []).map(mapTask) });
|
|
this.loadSummary();
|
|
})
|
|
.catch(() => {});
|
|
},
|
|
openSheet(e) {
|
|
this.openSheetType(e.currentTarget.dataset.type);
|
|
},
|
|
openSheetType(type) {
|
|
this.setData({ sheetType: type, sheetShow: true });
|
|
},
|
|
closeSheet() {
|
|
this.setData({ sheetShow: false });
|
|
this.loadAll();
|
|
},
|
|
onSheetSave() {
|
|
this.loadTasks();
|
|
this.loadSummary();
|
|
},
|
|
onAddPet() {
|
|
this.openSheetType('addPet');
|
|
},
|
|
onEditPet() {
|
|
this.openSheetType('editPet');
|
|
},
|
|
onFab() {
|
|
this.openSheetType('ai');
|
|
},
|
|
goProfile() {
|
|
wx.navigateTo({ url: '/pages/profile/profile' });
|
|
},
|
|
goLearn() {
|
|
wx.navigateTo({ url: '/pages/learn/learn' });
|
|
},
|
|
// 首页那张卡片直接打开这篇文章正文
|
|
openFirstArticle() {
|
|
const a = this.data.firstArticle;
|
|
if (a && a.id) wx.navigateTo({ url: `/pages/article/article?id=${a.id}` });
|
|
else this.goLearn();
|
|
},
|
|
goRecord() {
|
|
wx.switchTab({ url: '/pages/record/record' });
|
|
},
|
|
onShareAppMessage() {
|
|
return { title: '肉垫计划 · 每天照顾好毛孩子', path: '/pages/home/home' };
|
|
},
|
|
onShareTimeline() {
|
|
return { title: '肉垫计划 · 每天照顾好毛孩子' };
|
|
},
|
|
});
|