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

@@ -1,6 +1,19 @@
// 业务服务层:直接映射后端 REST 接口字段,不做多余转换。
const { request } = require('../utils/request');
// 确保动作名称以中文展示(防御层:即使后端意外返回英文也能兜底)
function injectDisplayName(item) {
if (!item) return item;
// 优先级nameZh > name后端 normalize 已把 name 设为中文)> nameEn 不展示
item.displayName = item.nameZh || item.name || '';
return item;
}
function injectDisplayNames(list) {
if (!list || !Array.isArray(list)) return list || [];
return list.map(injectDisplayName);
}
// 将参数对象序列化为 query string跳过空值
function buildQuery(params) {
const qs = Object.keys(params || {})
@@ -12,12 +25,15 @@ function buildQuery(params) {
// 1) 动作列表(支持多维筛选与排序)
function listExercises(params = {}) {
return request({ url: '/api/exercises' + buildQuery(params) });
return request({ url: '/api/exercises' + buildQuery(params) }).then((res) => {
if (res && res.items) res.items = injectDisplayNames(res.items);
return res;
});
}
// 2) 动作详情
function getExercise(id) {
return request({ url: '/api/exercises/' + encodeURIComponent(id) });
return request({ url: '/api/exercises/' + encodeURIComponent(id) }).then(injectDisplayName);
}
// 3) 分类维度枚举
@@ -27,7 +43,10 @@ function getCategories(type) {
// 4) 智能推荐
function recommend(params = {}) {
return request({ url: '/api/recommend' + buildQuery(params) });
return request({ url: '/api/recommend' + buildQuery(params) }).then((res) => {
if (res && res.items) res.items = injectDisplayNames(res.items);
return res;
});
}
// 5) 训练组合列表
@@ -37,12 +56,18 @@ function listCollections() {
// 5) 训练组合下的动作
function getCollectionExercises(slug, params = {}) {
return request({ url: '/api/collections/' + encodeURIComponent(slug) + '/exercises' + buildQuery(params) });
return request({ url: '/api/collections/' + encodeURIComponent(slug) + '/exercises' + buildQuery(params) }).then((res) => {
if (res && res.items) res.items = injectDisplayNames(res.items);
return res;
});
}
// 6) 搜索
function search(q) {
return request({ url: '/api/search?q=' + encodeURIComponent(q) });
return request({ url: '/api/search?q=' + encodeURIComponent(q) }).then((res) => {
if (res && res.items) res.items = injectDisplayNames(res.items);
return res;
});
}
// 7) 统计概览