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,73 @@
// 收藏服务:动作收藏 + 官方计划收藏(均受保护)。
const { request } = require('../utils/request');
// 复用 displayName 注入(避免循环依赖,内联轻量版)
function injectDisplayName(item) {
if (!item) return item;
item.displayName = item.nameZh || item.name || '';
return item;
}
function injectDisplayNames(list) {
if (!list || !Array.isArray(list)) return list || [];
return list.map(injectDisplayName);
}
// 收藏的动作列表
function listExercises() {
return request({ url: '/api/favorites/exercises', method: 'GET' }).then((res) => {
const items = (res && Array.isArray(res)) ? res : (res && res.items);
if (items) {
const injected = injectDisplayNames(items);
if (Array.isArray(res)) return injected;
res.items = injected;
}
return res;
});
}
// 收藏某个动作
function addExercise(id) {
return request({ url: '/api/favorites/exercises', method: 'POST', data: { target: id } });
}
// 取消收藏某个动作
function removeExercise(id) {
return request({ url: '/api/favorites/exercises/' + encodeURIComponent(id), method: 'DELETE' });
}
// 查询某动作收藏状态 { favorited }
function exerciseStatus(id) {
return request({ url: '/api/favorites/exercises/' + encodeURIComponent(id) + '/status', method: 'GET' });
}
// 收藏的官方计划列表CollectionDef[]
function listPlans() {
return request({ url: '/api/favorites/plans', method: 'GET' });
}
// 收藏某个官方计划
function addPlan(slug) {
return request({ url: '/api/favorites/plans', method: 'POST', data: { target: slug } });
}
// 取消收藏某个官方计划
function removePlan(slug) {
return request({ url: '/api/favorites/plans/' + encodeURIComponent(slug), method: 'DELETE' });
}
// 查询某官方计划收藏状态 { favorited }
function planStatus(slug) {
return request({ url: '/api/favorites/plans/' + encodeURIComponent(slug) + '/status', method: 'GET' });
}
module.exports = {
listExercises,
addExercise,
removeExercise,
exerciseStatus,
listPlans,
addPlan,
removePlan,
planStatus
};