Просмотр исходного кода

fix(fatloss-miniprogram): add store/user.js, wire App.vue store init, append fatloss API docs

Sisyphus 2 дней назад
Родитель
Сommit
552a6c313f

+ 30 - 0
docs/superpowers/api/API_REFERENCE.md

@@ -1539,3 +1539,33 @@ interactionType 取值:`PHONE` / `WECHAT` / `MEETING` / `OTHER`。
 ---
 
 *文档最后更新:2026-10-04*
+
+---
+
+### 5.0 减脂专题(`/api/fatloss/*`)
+
+> 减脂专题(`xiaofat-miniprogram`)新增接口,与主系统用户体系共享(JWT 认证,需登录)。
+> 所有接口统一 `@PostMapping`,响应格式 `Result<T>`。
+
+| 端点 | 权限 | 说明 |
+|---|---|---|
+| `POST /api/fatloss/weight/list` | 登录 | 体重记录列表(params: `memberId/startDate/endDate`,memberId 优先取 params,fallback currentMemberId) |
+| `POST /api/fatloss/weight/create` | 登录 | 创建体重记录(body: `memberId/weight/bodyFatPercent/waistCircumference/measureDate/remark`) |
+| `POST /api/fatloss/weight/update` | 登录 | 更新体重记录(body: `id/weight/bodyFatPercent/waistCircumference`) |
+| `POST /api/fatloss/weight/delete` | 登录 | 删除体重记录(body: `id`) |
+| `POST /api/fatloss/diet/list` | 登录 | 饮食记录列表(params: `memberId/startDate/endDate`) |
+| `POST /api/fatloss/diet/create` | 登录 | 创建饮食记录(body: `memberId/mealType/foodName/foodWeight/calories/protein/fat/carbs/eatDate/remark`) |
+| `POST /api/fatloss/diet/delete` | 登录 | 删除饮食记录(body: `id`) |
+| `POST /api/fatloss/diet/calories-summary` | 登录 | 当日总热量(params: `memberId/date`,date 默认今日) |
+| `POST /api/fatloss/exercise/list` | 登录 | 运动记录列表(params: `memberId/startDate/endDate`) |
+| `POST /api/fatloss/exercise/create` | 登录 | 创建运动记录(body: `memberId/exerciseType/durationMin/distanceKm/caloriesBurned/exerciseDate/remark`) |
+| `POST /api/fatloss/exercise/delete` | 登录 | 删除运动记录(body: `id`) |
+| `POST /api/fatloss/goal/active` | 登录 | 获取当前活跃目标(params: `memberId`,返回最新 `status=active` 的目标) |
+| `POST /api/fatloss/goal/create` | 登录 | 创建目标(body: `memberId/startWeight/targetWeight/targetBodyFat/targetDate/startDate`,targetWeight/startWeight/startDate 必填) |
+| `POST /api/fatloss/goal/update` | 登录 | 更新目标(body: `id/targetWeight/targetBodyFat/targetDate`) |
+| `POST /api/fatloss/goal/complete` | 登录 | 完成目标(body: `id`,status → `completed`) |
+| `POST /api/fatloss/goal/abandon` | 登录 | 放弃目标(body: `id`,status → `abandoned`) |
+
+**新增表:** `fat_weight_record`、`fat_diet_record`、`fat_exercise_record`、`fat_goal`(迁移 355–358,DatabaseInitializer)
+
+*文档更新:2026-10-09(减脂专题新增)*

+ 2 - 32
xiaofat-miniprogram/App.vue

@@ -1,38 +1,8 @@
 <script>
+import store from './store'
 export default {
   onLaunch: function() {
-    var cachedOpenid = uni.getStorageSync('openid')
-    if (!cachedOpenid) {
-      uni.login({
-        provider: 'weixin',
-        success: function(loginRes) {
-          if (loginRes && loginRes.code) {
-            uni.request({
-              url: 'https://cfc.etotem.com.cn/api/auth/silent-login',
-              method: 'POST',
-              data: { code: loginRes.code },
-              header: { 'Content-Type': 'application/json' },
-              success: function(res) {
-                if (res.data && res.data.code === 200 && res.data.data) {
-                  var d = res.data.data
-                  uni.setStorageSync('token', d.token)
-                  uni.setStorageSync('openid', d.openid)
-                  uni.setStorageSync('userId', d.userId)
-                  uni.setStorageSync('userInfo', {
-                    nickname: d.nickname,
-                    userId: d.userId,
-                    familyId: d.familyId
-                  })
-                }
-              },
-              fail: function() {
-                uni.showToast({ title: '网络请求失败', icon: 'none' })
-              }
-            })
-          }
-        }
-      })
-    }
+    store.dispatch('initFromStorage')
   }
 }
 </script>

+ 5 - 56
xiaofat-miniprogram/store/index.js

@@ -1,62 +1,11 @@
 import Vue from 'vue'
 import Vuex from 'vuex'
+import user from './modules/user'
 
 Vue.use(Vuex)
 
-const store = new Vuex.Store({
-  state: {
-    token: '',
-    userId: null,
-    memberId: null,
-    nickname: '',
-    familyId: null,
-    openid: '',
-    isLoggedIn: false
-  },
-  mutations: {
-    setToken(state, token) {
-      state.token = token
-      uni.setStorageSync('token', token)
-    },
-    setUserInfo(state, info) {
-      state.userId = info.userId
-      state.memberId = info.memberId
-      state.nickname = info.nickname
-      state.familyId = info.familyId
-      state.openid = info.openid
-      state.isLoggedIn = !!info.userId
-    },
-    logout(state) {
-      state.token = ''
-      state.userId = null
-      state.memberId = null
-      state.nickname = ''
-      state.familyId = null
-      state.openid = ''
-      state.isLoggedIn = false
-      uni.removeStorageSync('token')
-      uni.removeStorageSync('openid')
-      uni.removeStorageSync('userId')
-    }
-  },
-  actions: {
-    initFromStorage({ commit }) {
-      var token = uni.getStorageSync('token')
-      var openid = uni.getStorageSync('openid')
-      var userId = uni.getStorageSync('userId')
-      if (token) commit('setToken', token)
-      if (userId) {
-        var userInfo = uni.getStorageSync('userInfo') || {}
-        commit('setUserInfo', {
-          userId: userId,
-          memberId: userInfo.memberId,
-          nickname: userInfo.nickname,
-          familyId: userInfo.familyId,
-          openid: openid
-        })
-      }
-    }
+export default new Vuex.Store({
+  modules: {
+    user: user
   }
-})
-
-export default store
+})

+ 56 - 0
xiaofat-miniprogram/store/modules/user.js

@@ -0,0 +1,56 @@
+export default {
+  namespaced: true,
+  state: {
+    token: '',
+    userId: null,
+    memberId: null,
+    nickname: '',
+    familyId: null,
+    openid: '',
+    isLoggedIn: false
+  },
+  mutations: {
+    setToken(state, token) {
+      state.token = token
+      uni.setStorageSync('token', token)
+    },
+    setUserInfo(state, info) {
+      state.userId = info.userId
+      state.memberId = info.memberId
+      state.nickname = info.nickname
+      state.familyId = info.familyId
+      state.openid = info.openid
+      state.isLoggedIn = !!info.userId
+    },
+    logout(state) {
+      state.token = ''
+      state.userId = null
+      state.memberId = null
+      state.nickname = ''
+      state.familyId = null
+      state.openid = ''
+      state.isLoggedIn = false
+      uni.removeStorageSync('token')
+      uni.removeStorageSync('openid')
+      uni.removeStorageSync('userId')
+    }
+  },
+  actions: {
+    initFromStorage({ commit }) {
+      var token = uni.getStorageSync('token')
+      var openid = uni.getStorageSync('openid')
+      var userId = uni.getStorageSync('userId')
+      if (token) commit('setToken', token)
+      if (userId) {
+        var userInfo = uni.getStorageSync('userInfo') || {}
+        commit('setUserInfo', {
+          userId: userId,
+          memberId: userInfo.memberId,
+          nickname: userInfo.nickname,
+          familyId: userInfo.familyId,
+          openid: openid
+        })
+      }
+    }
+  }
+}