init: 毛孩子计划 小程序 + Go 后端 + 内嵌后台
- pets-fe: 微信原生小程序(首页/计划/记录/报告/社区/引导), 服务端驱动、无假数据;弹层改用 scroll-view,打开时隐藏自定义 tabBar - pets-be: Gin + GORM(MySQL, sundynix_ 前缀) + MinIO,统一响应/分页, 微信 code2session 登录,provider-neutral AI(DeepSeek),go:embed React 后台 - 修复:分段选择类型不匹配(字符串 vs 数字)导致选不中 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
const { request, uploadFile, setToken } = require('./request.js');
|
||||
|
||||
// wx.login 取 code
|
||||
function wxLogin() {
|
||||
return new Promise((resolve, reject) => {
|
||||
wx.login({
|
||||
success: (r) => (r.code ? resolve(r.code) : reject(new Error('wx.login 未返回 code'))),
|
||||
fail: reject,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 登录:优先微信 code2session,失败回退开发态 Mock 登录(后端 dev_login=true)
|
||||
async function login() {
|
||||
try {
|
||||
const code = await wxLogin();
|
||||
const data = await request({ url: '/api/auth/wechat', method: 'POST', data: { code } });
|
||||
setToken(data.token);
|
||||
return data;
|
||||
} catch (e) {
|
||||
console.warn('[api] 微信登录失败,回退 Mock 登录:', e && e.message);
|
||||
const data = await request({ url: '/api/auth/login', method: 'POST', data: { nickname: '开发用户' } });
|
||||
setToken(data.token);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
const api = {
|
||||
login,
|
||||
uploadFile,
|
||||
|
||||
// 用户
|
||||
getProfile: () => request({ url: '/api/user/profile' }),
|
||||
updateProfile: (body) => request({ url: '/api/user/profile', method: 'PUT', data: body }),
|
||||
|
||||
// 用户
|
||||
userSummary: () => request({ url: '/api/user/summary' }),
|
||||
|
||||
// 宠物
|
||||
getPets: () => request({ url: '/api/pets' }),
|
||||
homeSummary: (id) => request({ url: `/api/pets/${id}/home-summary` }),
|
||||
getPet: (id) => request({ url: `/api/pets/${id}` }),
|
||||
createPet: (body) => request({ url: '/api/pets', method: 'POST', data: body }),
|
||||
updatePet: (id, body) => request({ url: `/api/pets/${id}`, method: 'PUT', data: body }),
|
||||
deletePet: (id) => request({ url: `/api/pets/${id}`, method: 'DELETE' }),
|
||||
onboarding: (body) => request({ url: '/api/onboarding', method: 'POST', data: body }),
|
||||
|
||||
// 记录
|
||||
getRecords: (id, type) =>
|
||||
request({ url: `/api/pets/${id}/records${type ? `?type=${type}` : ''}` }),
|
||||
createRecord: (id, body) => request({ url: `/api/pets/${id}/records`, method: 'POST', data: body }),
|
||||
weightTrend: (id) => request({ url: `/api/pets/${id}/records/weight-trend` }),
|
||||
|
||||
// 任务
|
||||
getTasks: (id) => request({ url: `/api/pets/${id}/tasks` }),
|
||||
toggleTask: (taskId) => request({ url: `/api/tasks/${taskId}/toggle`, method: 'POST' }),
|
||||
completeAllTasks: (id) => request({ url: `/api/pets/${id}/tasks/complete-all`, method: 'POST' }),
|
||||
|
||||
// 计划
|
||||
getPlan: (id) => request({ url: `/api/pets/${id}/plan` }),
|
||||
planCalendar: (id, month) =>
|
||||
request({ url: `/api/pets/${id}/plan/calendar${month ? `?month=${month}` : ''}` }),
|
||||
createAIPlan: (id, input) => request({ url: `/api/pets/${id}/ai-plan`, method: 'POST', data: { input } }),
|
||||
applyAIPlan: (planId) => request({ url: `/api/ai-plan/${planId}/apply`, method: 'POST' }),
|
||||
togglePlanTask: (taskId) => request({ url: `/api/plan-tasks/${taskId}/toggle`, method: 'POST' }),
|
||||
|
||||
// 提醒
|
||||
getReminders: (id) => request({ url: `/api/pets/${id}/reminders` }),
|
||||
|
||||
// 报告
|
||||
weeklyReport: (id) => request({ url: `/api/pets/${id}/report/weekly` }),
|
||||
getBill: (id, period) => request({ url: `/api/pets/${id}/bill?period=${period || 'month'}` }),
|
||||
healthSummary: (id) => request({ url: `/api/pets/${id}/health-summary` }),
|
||||
getPoster: (id) => request({ url: `/api/pets/${id}/poster` }),
|
||||
|
||||
// 社区
|
||||
listPosts: (tab, page) =>
|
||||
request({ url: `/api/posts?tab=${encodeURIComponent(tab || '')}&page=${page || 1}&page_size=10` }),
|
||||
createPost: (body) => request({ url: '/api/posts', method: 'POST', data: body }),
|
||||
likePost: (id) => request({ url: `/api/posts/${id}/like`, method: 'POST' }),
|
||||
listComments: (id) => request({ url: `/api/posts/${id}/comments` }),
|
||||
createComment: (id, content) =>
|
||||
request({ url: `/api/posts/${id}/comments`, method: 'POST', data: { content } }),
|
||||
|
||||
// 文章
|
||||
listArticles: () => request({ url: '/api/articles' }),
|
||||
getArticle: (id) => request({ url: `/api/articles/${id}` }),
|
||||
|
||||
// Pro
|
||||
getPro: () => request({ url: '/api/pro' }),
|
||||
activatePro: () => request({ url: '/api/pro/activate', method: 'POST' }),
|
||||
|
||||
// AI
|
||||
aiChat: (body) => request({ url: '/api/ai/chat', method: 'POST', data: body }),
|
||||
assessSymptom: (id, body) =>
|
||||
request({ url: `/api/pets/${id}/ai/assess-symptom`, method: 'POST', data: body }),
|
||||
};
|
||||
|
||||
module.exports = api;
|
||||
Reference in New Issue
Block a user