feat: 小程序连接服务器IP + 同步未提交开发

- miniprogram/config.js: BASE_URL 指向 http://192.227.237.8:3001
- 动作标题中文化(nameZh),搜索匹配 name/nameZh/nameEn
- 新增计划/收藏/我的 等页面与组件
- 后端 Docker 化(Dockerfile/.dockerignore)与翻译脚本
- .gitignore 补充 .DS_Store
This commit is contained in:
2026-07-22 14:05:30 +08:00
parent b3b58e66fb
commit 70ff806042
79 changed files with 2397 additions and 146070 deletions

View File

@@ -0,0 +1,88 @@
const app = getApp();
const planSvc = require('../../services/plan');
const EMOJIS = ['📋', '💪', '🔥', '🏋️', '🏃', '🧘', '🤸', '🥊', '🚴', '⚡', '🌟', '🎯'];
const COLORS = ['#D9B36C', '#58C9B9', '#9B8CFF', '#F08A5D', '#3FBF7F', '#5B9DF9'];
Page({
data: {
statusBarHeight: 20,
mode: 'new',
id: '',
name: '',
description: '',
emoji: '📋',
color: '#D9B36C',
emojis: EMOJIS,
colors: COLORS,
loading: false,
dirty: false // 是否有未保存的修改
},
onLoad(query) {
const mode = query.mode === 'edit' ? 'edit' : 'new';
const id = query.id || '';
this.setData({ statusBarHeight: app.globalData.statusBarHeight || 20, mode, id });
if (mode === 'edit' && id) {
this.setData({ loading: true });
planSvc.get(id).then((p) => {
this.setData({
name: p.name || '',
description: p.description || '',
emoji: p.emoji || '📋',
color: p.color || '#D9B36C',
loading: false
});
}).catch(() => {
this.setData({ loading: false });
});
}
},
onName(e) { this.setData({ name: e.detail.value, dirty: true }); },
onDesc(e) { this.setData({ description: e.detail.value, dirty: true }); },
onPickEmoji(e) { this.setData({ emoji: e.currentTarget.dataset.emoji, dirty: true }); },
onPickColor(e) { this.setData({ color: e.currentTarget.dataset.color, dirty: true }); },
// 点返回键navbar 拦截模式)触发:有未保存改动时先确认
onBackRequest() {
if (!this.data.dirty) {
wx.navigateBack();
return;
}
wx.showModal({
title: '放弃编辑?',
content: '当前修改尚未保存,确定要退出吗?',
confirmText: '退出',
cancelText: '继续编辑',
success: (res) => {
if (res.confirm) wx.navigateBack();
}
});
},
onSave() {
const name = (this.data.name || '').trim();
if (!name) {
wx.showToast({ title: '请填写计划名称', icon: 'none' });
return;
}
const dto = {
name,
description: (this.data.description || '').trim(),
emoji: this.data.emoji,
color: this.data.color
};
wx.showLoading({ title: '保存中…', mask: true });
const op = this.data.mode === 'edit'
? planSvc.update(this.data.id, dto)
: planSvc.create(dto);
op.then(() => {
wx.hideLoading();
wx.showToast({ title: '已保存', icon: 'success' });
setTimeout(() => wx.navigateBack(), 500);
}).catch(() => {
wx.hideLoading();
});
}
});