import type { ILoginForm } from '@/api/login' import type { IAuthLoginRes } from '@/api/types/login' import { defineStore } from 'pinia' import { ref } from 'vue' import { authExamLogin as _authExamLogin, login as _login } from '@/api/login' import { useTokenStore } from './token' import { useUserStore } from './user' export const useAuthStore = defineStore( 'auth', () => { const tokenStore = useTokenStore() const userStore = useUserStore() // 登录加载状态 const loginLoading = ref(false) /** * 登录成功后处理逻辑 * @param tokenInfo 登录返回的token信息 */ async function _postLogin(tokenInfo: IAuthLoginRes) { // 使用现有的tokenStore来处理token存储 tokenStore.setTokenInfo(tokenInfo) await userStore.fetchUserInfo() } /** * 用户登录 * @param loginForm 登录参数 * @returns 登录结果 */ const authLogin = async (loginForm: ILoginForm) => { try { loginLoading.value = true const res = await _login(loginForm) // 根据不同的token类型输出相应信息 if ('token' in res) { console.log('登录-res: ', res.token) } else if ('accessToken' in res) { console.log('登录-res: ', res.accessToken) } // 直接传递整个res对象,它已经是IAuthLoginRes类型 await _postLogin(res) uni.showToast({ title: '登录成功', icon: 'success', }) return res } catch (error) { console.error('登录失败:', error) uni.showToast({ title: '登录失败,请重试', icon: 'error', }) throw error } finally { loginLoading.value = false } } /** * 用户登录 * @param loginForm 登录参数 * @returns 登录结果 */ const authExamLogin = async (loginForm: ILoginForm) => { try { loginLoading.value = true const res = await _authExamLogin(loginForm) // 根据不同的token类型输出相应信息 if ('token' in res) { console.log('登录-res: ', res.token) } else if ('accessToken' in res) { console.log('登录-res: ', res.accessToken) } // 直接传递整个res对象,它已经是IAuthLoginRes类型 await _postLogin(res) uni.showToast({ title: '登录成功', icon: 'success', }) return res } catch (error) { console.error('登录失败:', error) uni.showToast({ title: '登录失败,请重试', icon: 'error', }) throw error } finally { loginLoading.value = false } } /** * 钉钉免登录 * @param code 可选,钉钉授权码,如果不传则自动获取 * @returns 登录结果 */ const authDingTalkLogin = async (code?: string) => { try { loginLoading.value = true const res = await tokenStore.dingTalkLogin(code) uni.showToast({ title: '登录成功', icon: 'success', }) return res } catch (error) { console.error('钉钉登录失败:', error) uni.showToast({ title: '钉钉登录失败,请重试', icon: 'error', }) throw error } finally { loginLoading.value = false } } return { loginLoading, authLogin, authExamLogin, authDingTalkLogin, } }, { persist: true, }, )