hookehuyr

feat(auth): 重构静默授权逻辑并优化Dashboard数据刷新

- 将silentAuth从Promise回调改为async/await实现,提高可读性
- 增加用户家庭状态检查,未加入家庭时跳转欢迎页
- 在Dashboard页面使用useLoad触发静默授权
- 提取数据刷新逻辑到独立函数refreshDashboardData
- 移除app.js中冗余的授权跳转代码
/*
* @Date: 2025-06-28 10:33:00
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-09-01 14:32:25
* @LastEditTime: 2025-09-12 12:10:06
* @FilePath: /lls_program/src/app.js
* @Description: 文件描述
*/
......@@ -18,11 +18,11 @@ const App = createApp({
// 缓存没有权限的地址
const router = routerStore();
router.add(path);
if (!wx.getStorageSync("sessionid")) {
wx.navigateTo({
url: '/pages/auth/index'
})
}
// if (!wx.getStorageSync("sessionid")) {
// wx.navigateTo({
// url: '/pages/auth/index'
// })
// }
},
onShow() {
},
......
......@@ -156,7 +156,7 @@
<script setup>
import "./index.less";
import { ref, computed, onMounted } from 'vue';
import Taro, { useDidShow, useReady } from '@tarojs/taro';
import Taro, { useDidShow, useReady, useLoad } from '@tarojs/taro';
import { Setting, Photograph, Category } from '@nutui/icons-vue-taro';
import BottomNav from '../../components/BottomNav.vue';
import TotalPointsDisplay from '@/components/TotalPointsDisplay.vue';
......@@ -171,6 +171,7 @@ const defaultFamilyCover = 'https://cdn.ipadbiz.cn/lls_prog/images/default-famil
const defaultAvatar = 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg'
// 接口信息
import { getFamilyDashboardAPI } from '@/api/family'
import { silentAuth } from '@/utils/authRedirect'
const todaySteps = ref(0);
const isWeRunAuthorized = ref(false);
......@@ -308,14 +309,18 @@ const handleAdClick = (targetPage) => {
const family_id = ref('');
const totalFamilySteps = ref(0);
useDidShow(async () => {
// 直接获取家庭首页数据,同时判断是否加入家庭
/**
* 刷新Dashboard页面数据
*/
const refreshDashboardData = async () => {
try {
console.log('开始刷新Dashboard页面数据');
const { code, data } = await getFamilyDashboardAPI();
if (code) {
// 获取家庭ID
family_id.value = data.family.id;
// 设置页面数据(数据已经在getFamilyDashboardAPI中获取到了)
// 设置页面数据
pendingPoints.value = data.pending_points || [];
familyMembers.value = data.step_ranking || [];
showTotalPointsOnly.value = !data.pending_points?.length;
......@@ -327,6 +332,46 @@ useDidShow(async () => {
todaySteps.value = data.my_today_step;
totalFamilySteps.value = data.family_today_step;
console.log('Dashboard页面数据刷新成功:', {
familyName: familyName.value,
todaySteps: todaySteps.value,
totalPoints: finalTotalPoints.value
});
} else {
console.error('获取Dashboard数据失败:', data);
}
} catch (error) {
console.error('刷新Dashboard数据异常:', error);
}
};
/**
* 页面加载时执行静默授权
*/
useLoad(async () => {
console.log('Dashboard页面加载,开始静默授权');
// 进行静默授权
try {
await silentAuth(
async (result) => {
console.log('Dashboard onLoad - 静默授权成功:', result);
// 静默授权成功后立即刷新页面数据
await refreshDashboardData();
},
(error) => {
console.error('Dashboard onLoad - 静默授权失败:', error);
}
);
} catch (error) {
console.error('Dashboard onLoad - 静默授权异常:', error);
}
});
useDidShow(async () => {
// 刷新页面数据
await refreshDashboardData();
// 正常刷新微信步数数据
if (weRunAuthRef.value) {
weRunAuthRef.value.checkAuthStatus(true);
......@@ -336,7 +381,6 @@ useDidShow(async () => {
if (rankingCardRef.value) {
rankingCardRef.value.refreshData();
}
}
// TODO: 获取广告信息
adObj.value = {
......
/*
* @Date: 2025-01-25 10:00:00
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-09-12 10:52:09
* @LastEditTime: 2025-09-12 12:24:03
* @FilePath: /lls_program/src/utils/authRedirect.js
* @Description: 授权重定向处理工具函数
*/
......@@ -209,15 +209,14 @@ export const addShareFlag = (path) => {
* @returns {Promise} 授权结果
*/
export const silentAuth = async (onSuccess, onError) => {
return new Promise((resolve, reject) => {
try {
// 检查是否已经授权
if (!needAuth()) {
// 已经授权,直接返回成功
if (onSuccess) {
onSuccess({ code: 1, msg: '已授权' })
}
resolve({ code: 1, msg: '已授权' })
return
return { code: 1, msg: '已授权' }
}
// 显示loading提示
......@@ -227,12 +226,20 @@ export const silentAuth = async (onSuccess, onError) => {
})
// 调用微信登录
const loginResult = await new Promise((resolve, reject) => {
Taro.login({
success: function (res) {
if (res.code) {
success: resolve,
fail: reject
})
})
if (!loginResult.code) {
throw new Error('获取微信登录code失败')
}
// 构建请求数据
const requestData = {
code: res.code,
code: loginResult.code,
}
// 测试环境下传递openid,正式环境不传递
......@@ -247,80 +254,78 @@ export const silentAuth = async (onSuccess, onError) => {
// requestData.openid = 'oex8h5QZnZJto3ttvO6swSvylAQo';
}
// 发起授权请求 - 使用request.post保持与手动授权一致
request.post('/srv/?a=openid', requestData)
.then(response => {
// 发起授权请求
const response = await request.post('/srv/?a=openid', requestData)
Taro.hideLoading()
if (response.data.code) {
if (!response.data.code) {
const errorMsg = response.data.msg || '授权失败'
console.error('静默授权失败:', errorMsg)
if (onError) {
onError(errorMsg)
}
throw new Error(errorMsg)
}
const cookie = response.cookies && response.cookies[0]
if (cookie) {
if (!cookie) {
const errorMsg = '授权失败:没有获取到有效的会话信息'
console.error(errorMsg)
if (onError) {
onError(errorMsg)
}
throw new Error(errorMsg)
}
// 保存sessionid到本地存储
wx.setStorageSync("sessionid", cookie)
// 更新request默认headers
request.defaults.headers.cookie = cookie
// 静默授权成功
// 执行成功回调
if (onSuccess) {
onSuccess(response.data)
}
// 静默授权成功,检查用户是否已加入家庭
try {
const hasFamily = await checkUserHasFamily()
resolve(response.data)
} else {
console.error('授权响应中没有cookie信息')
// 如果用户没有加入家庭,跳转到欢迎页面
if (!hasFamily) {
await Taro.reLaunch({
url: '/pages/Welcome/index'
})
if (onError) {
onError('授权失败:没有获取到有效的会话信息')
const result = { ...response.data, redirected: true }
if (onSuccess) {
onSuccess(result)
}
reject(new Error('授权失败:没有获取到有效的会话信息'))
return result
}
} else {
console.error('静默授权失败:', response.data.msg)
if (onError) {
onError(response.data.msg || '授权失败')
// 用户已有家庭,执行成功回调
if (onSuccess) {
onSuccess(response.data)
}
return response.data
reject(new Error(response.data.msg || '授权失败'))
}
})
.catch(error => {
console.error('静默授权请求失败:', error)
Taro.hideLoading()
} catch (familyCheckError) {
console.error('检查家庭状态失败:', familyCheckError)
if (onError) {
onError('网络请求失败,请稍后重试')
// 家庭检查失败,仍然执行成功回调,让页面正常显示
if (onSuccess) {
onSuccess(response.data)
}
reject(new Error('授权失败,请稍后重试'))
})
} else {
console.error('微信登录失败:', res.errMsg)
Taro.hideLoading()
if (onError) {
onError('微信登录失败:' + res.errMsg)
return response.data
}
reject(new Error('微信登录失败:' + res.errMsg))
}
},
fail: (error) => {
console.error('调用微信登录失败:', error)
} catch (error) {
console.error('静默授权过程失败:', error)
Taro.hideLoading()
const errorMsg = error.message || '授权失败,请稍后重试'
if (onError) {
onError('调用微信登录失败')
onError(errorMsg)
}
reject(error)
throw error
}
})
})
}
/**
......