fix: 修复Tool模块相关问题 - 优化签到、社区、食物和AI服务功能

This commit is contained in:
msh-agent
2026-04-12 09:31:00 +08:00
parent b164d8ba11
commit 77632510cf
12 changed files with 1158 additions and 756 deletions

View File

@@ -119,8 +119,8 @@ export function getCheckinList(data) {
* 获取打卡记录详情
* @param {Number} id - 打卡记录ID
*/
export function getCheckinDetail(id) {
return request.get('tool/checkin/detail/' + id);
export function getCheckinDetail(id, opt) {
return request.get('tool/checkin/detail/' + id, {}, opt || {});
}
/**
@@ -196,7 +196,7 @@ export function shareCheckinToCommunity(checkinId) {
* @param {Number} data.limit - 每页数量
*/
export function searchFood(data) {
return request.get('tool/food/search', data);
return request.get('tool/food/search', data, { noAuth: true });
}
/**
@@ -205,9 +205,31 @@ export function searchFood(data) {
* @param {String} data.category - 分类all/grain/vegetable/fruit/meat/seafood
* @param {Number} data.page - 页码
* @param {Number} data.limit - 每页数量
*
* 响应 data 为分页list[] 项含 image、nutrientsJson、energy、protein、钾/磷/钠/钙、suitabilityLevelToolFoodServiceImpl
*/
export function getFoodList(data) {
return request.get('tool/food/list', data);
return request.get('tool/food/list', data, { noAuth: true });
}
/** 将列表/路由上的 id 规范为整数字符串(兼容 Long 序列化为 123、123.0、"123.0" 等,拒绝小数与非数字) */
export function normalizeFoodDetailIdString(v) {
if (v === undefined || v === null || v === '') return '';
let input = v;
if (typeof input === 'string') {
input = input.trim();
if (input === '') return '';
}
const n = Number(input);
if (Number.isFinite(n)) {
const t = Math.trunc(n);
if (Math.abs(n - t) > 1e-6) return '';
return String(t);
}
const s = String(input).trim();
if (s === '') return '';
if (/^-?\d+$/.test(s)) return s;
return '';
}
/**
@@ -215,14 +237,18 @@ export function getFoodList(data) {
* @param {Number|String} id - 食物ID必须为数字不能传名称
*/
export function getFoodDetail(id) {
const numId = typeof id === 'number' && !isNaN(id) ? id : parseInt(String(id), 10);
// 打印请求参数便于确认(后端仅接受 Long 类型 id传 name 会 400
const apiPath = 'tool/food/detail/' + numId;
console.log('[api/tool] getFoodDetail 请求参数:', { id, numId, type: typeof id, apiPath });
if (isNaN(numId)) {
const rawId = normalizeFoodDetailIdString(id);
// 严格按整型 ID 校验,避免 parseInt('123abc') 这类误判;路径用字符串拼接避免超过 JS 安全整数时 Number() 精度丢失
const isIntegerId = rawId !== '' && /^-?\d+$/.test(rawId);
const apiPath = 'tool/food/detail/' + rawId;
const numId = isIntegerId ? Number(rawId) : NaN;
// 打印请求参数便于确认(后端仅接受 Long 类型 id传 name 会导致 400 NumberFormatException
console.log('[api/tool] getFoodDetail 请求参数:', { id, rawId, numId, idType: typeof id, apiPath, isNumeric: !isNaN(numId) });
if (!isIntegerId) {
return Promise.reject(new Error('食物详情接口需要数字ID当前传入: ' + id));
}
return request.get(apiPath);
// 与食物百科列表一致:只读接口免登录,避免未带 token 时请求被拦截导致详情页空白/仅 toast
return request.get(apiPath, {}, { noAuth: true });
}
/**
@@ -244,7 +270,8 @@ export function getSimilarFoods(foodId) {
* @param {Number} data.limit - 每页数量
*/
export function getKnowledgeList(data) {
return request.get('tool/knowledge/list', data);
// 与后端 /api/front/tool/** 免登录一致,未登录用户也可浏览饮食指南/科普文章
return request.get('tool/knowledge/list', data, { noAuth: true });
}
/**
@@ -252,7 +279,7 @@ export function getKnowledgeList(data) {
* @param {Number} id - 知识ID
*/
export function getKnowledgeDetail(id) {
return request.get('tool/knowledge/detail/' + id);
return request.get('tool/knowledge/detail/' + id, {}, { noAuth: true });
}
/**