Przeglądaj źródła

feat: 单独登陆模块功能 完成

chenpeng 1 tydzień temu
rodzic
commit
6bcdda1207

+ 15 - 1
api/model/user.ts

@@ -1,15 +1,29 @@
 import { useMyRequest } from '~/composables/useFetchRequest'
 
 enum Api {
-  Login = '/client/user/login',
+  Login = '/client-s003/s003Customer/login',
   UserInfo = '/client/user/userinfo',
   Logout = '/client/user/logout',
   Register = '/client/user/preRegister',
   ValidateRegister = '/client/user/register',
   ValidateEmail = '/client/user/forgetPassword',
   ResetOrChangePassword = '/client/user/changePassword',
+  ValidateEmailIsExist = '/client-s003/s003Customer/lastLoginType',
+  SendEmailCode = '/client-s003/captcha/sms/send',
 }
 
+/**
+ * 验证邮箱是否存在
+ */
+export async function validateEmailIsExistApi(params: any) {
+  return await useMyRequest().get(Api.ValidateEmailIsExist, params)
+}
+/**
+ * 验证邮箱是否存在
+ */
+export async function getEmailCodeApi(params: any) {
+  return await useMyRequest().post(Api.SendEmailCode, params)
+}
 /**
  * @description: user login api
  */

+ 5 - 73
components/common/googleLogin/index.vue

@@ -1,89 +1,21 @@
 <script setup>
 const emit = defineEmits(['success', 'error'])
-const loading = ref(false)
-const clientID = '482169597782-nic3d8bo67o0gmq93cmgao7050ets16n.apps.googleusercontent.com'
-onMounted(() => {
-  const script = document.createElement('script')
-  script.src = 'https://accounts.google.com/gsi/client'
-  script.async = true
-  script.defer = true
-  document.head.appendChild(script)
-})
+const { loading, onGoogleLogin } = useGoogleLogin()
 
-/**
- * 初始化 Google Auth
- */
-function initializeGoogleAuth(resolve, reject) {
-  return window.google.accounts.oauth2.initTokenClient({
-    client_id: clientID,
-    scope: 'email profile',
-    callback: async (response) => {
-      try {
-        // 获取用户基本信息
-        const userInfo = await fetchUserInfo(response.access_token)
-        const res = {
-          token: response.access_token,
-          userInfo,
-        }
-        resolve(res)
-      }
-      catch (error) {
-        reject(error)
-      }
-    },
-    error_callback: (error) => {
-      reject(error)
-    },
-  })
-}
-
-/**
- * 获取用户详细信息
- */
-async function fetchUserInfo(accessToken) {
-  const res = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {
-    headers: {
-      Authorization: `Bearer ${accessToken}`,
-    },
-  })
-  if (!res.ok)
-    throw new Error('获取用户信息失败')
-  return await res.json()
-}
-
-// 触发登录
-function handleGoogleLogin() {
-  return new Promise((resolve, reject) => {
-    if (!window.google) {
-      const t = setTimeout(() => {
-        clearTimeout(t)
-        ElMessage.error('当前环境不支持 Google 登录,请使用其他方式登录')
-        reject(new Error('Google SDK not loaded'))
-      }, 1000)
-      return
-    }
-    const client = initializeGoogleAuth(resolve, reject)
-    client.requestAccessToken()
-  })
-}
-
-async function onGoogleLogin() {
+async function googleLogin() {
   try {
-    loading.value = true
-    const result = await handleGoogleLogin()
-    loading.value = false
-    console.log('result------登陆成功', result)
+    const result = await onGoogleLogin()
+    console.log('登陆成功后------222')
     emit('success', result)
   }
   catch (error) {
-    loading.value = false
     emit('error', error)
   }
 }
 </script>
 
 <template>
-  <button id="google-login-button" class="b-rd-200px w-100% bg-#fff text-#333 b-1px b-solid b-#D8D8D8 h-48px lh-48px hover:b-#9B6CFF disabled:hover:b-#D8D8D8 cursor-pointer mb-24px text-14px fw-500" :disabled="loading" @click="onGoogleLogin">
+  <button id="google-login-button" class="b-rd-200px w-100% bg-#fff text-#333 b-1px b-solid b-#D8D8D8 h-48px lh-48px hover:b-#9B6CFF disabled:hover:b-#D8D8D8 cursor-pointer mb-24px text-14px fw-500" :disabled="loading" @click="googleLogin">
     <span v-if="loading">登录中...</span>
     <div v-else class="flex justify-center items-center">
       <img src="@/assets/images/google_logo.png" alt="" class="w-24px h-24px mr-10px">

+ 6 - 5
components/common/login/comp/account/list.vue

@@ -3,7 +3,8 @@ import useLogin from '../../useLogin'
 import { useCommonStore } from '@/stores/modules/common'
 
 const commonStore = useCommonStore()
-const { accountList } = storeToRefs(commonStore)
+const defaultName = 'EJET Spark'
+const { loginedAccountList } = storeToRefs(commonStore)
 const { onSelectAccount } = useLogin()
 function selectOtherLogin() {
   commonStore.setLoginType('choice')
@@ -20,14 +21,14 @@ function selectOtherLogin() {
     </div>
 
     <div class="flex flex-col gap-20px">
-      <div v-for="item, index in accountList" :key="index" class="flex py-15px px-35px b-rd-10px b-#D8D8D b-1px b-solid cursor-pointer hover:b-#9B6CFF" @click="onSelectAccount(item)">
+      <div v-for="item, index in loginedAccountList" :key="index" class="flex py-15px px-35px b-rd-10px b-#D8D8D b-1px b-solid cursor-pointer hover:b-#9B6CFF" @click="onSelectAccount(item)">
         <!-- 获取首字母 -->
-        <div class="w-50px h-50px bg-#F2E5F2 text-#9B6CFF text-24px flex justify-center b-rd-50% items-center mr-28px">
-          {{ item.name.charAt(0).toUpperCase() }}
+        <div class="w-50px h-50px bg-#F2E5F2 text-#9B6CFF fw-800 text-24px flex justify-center b-rd-50% items-center mr-28px">
+          {{ item.name ? item.name.charAt(0).toUpperCase() : defaultName.charAt(0).toUpperCase() }}
         </div>
         <div>
           <div class="text-18px fw-bold text-#333 custom-title-font">
-            {{ item.name }}
+            {{ item.name || defaultName }}
           </div>
           <div class="text-#9B6CFF mt-8px">
             {{ item.email }}

+ 2 - 2
components/common/login/comp/choice.vue

@@ -1,7 +1,7 @@
 <script lang='ts' setup>
 import useLogin from '../useLogin'
 
-const { onSelectEmail } = useLogin()
+const { onSelectEmail, onGoogleLoginSuccess } = useLogin()
 </script>
 
 <template>
@@ -12,7 +12,7 @@ const { onSelectEmail } = useLogin()
     <div class="text-14px text-#1A1A1A lh-22px mb-20px">
       Use your Email or another service to continue with EJET Spark!
     </div>
-    <common-google-login class="mb-24px" />
+    <common-google-login class="mb-24px" @success="onGoogleLoginSuccess" />
     <div class="b-rd-200px bg-#fff b-1px text-#333 b-solid b-#D8D8D8 h-48px lh-48px hover:b-#9B6CFF flex justify-center items-center cursor-pointer text-14px fw-500" @click="onSelectEmail">
       <img src="@/assets/images/mail_logo.png" class="w-24px h-24px mr-10px" alt="">
       Continue with Email

+ 7 - 7
components/common/login/comp/email/code.vue

@@ -6,7 +6,7 @@ const { loginForm, finishCode, errorCodeTxt, seconds, getMailCode, backStep } =
 const ruleFormRef = ref<FormInstance>()
 
 const rules = ref<FormRules>({
-  code: [
+  captcha: [
     { required: true, message: 'Please enter a valid email.', trigger: 'blur' },
   ],
 })
@@ -19,15 +19,15 @@ const rules = ref<FormRules>({
       Finish Signing In
     </div>
     <div class="text-14px text-#1A1A1A lh-22px mb-20px">
-      Once you enter the code we sent to <span class="text-#1A1A1A fw-700">{{ loginForm.mail }}</span>, you’ll be signed in.
+      Once you enter the code we sent to <span class="text-#1A1A1A fw-700">{{ loginForm.email }}</span>, you’ll be signed in.
     </div>
 
-    <div class="my-10px text-14px text-#9B6CFF underline cursor-pointer fw-bold" @click="getMailCode">
+    <div class="my-10px text-14px text-#9B6CFF underline cursor-pointer fw-bold" :class="seconds && '!text-#999'" @click="getMailCode">
       Get a Code
     </div>
-    <el-form ref="ruleFormRef" :rules="rules" :model="loginForm">
-      <el-form-item label="" prop="code" class="!mb-24px">
-        <el-input v-model.trim="loginForm.code" :class="!!errorCodeTxt && 'error-txt'" class="!h-46px login-input !text-14px" placeholder="Enter email" />
+    <el-form ref="ruleFormRef" :rules="rules" :model="loginForm" @submit.prevent>
+      <el-form-item label="" prop="captcha" class="!mb-24px">
+        <el-input v-model.trim="loginForm.captcha" type="number" :maxlength="6" :class="!!errorCodeTxt && 'error-txt'" class="!h-46px login-input !text-14px" placeholder="Enter email" />
         <div v-if="errorCodeTxt" class="text-red mt-10px">
           {{ errorCodeTxt }}
         </div>
@@ -41,7 +41,7 @@ const rules = ref<FormRules>({
     </el-form>
     <div class="mt-20px text-14px text-#767676">
       <div class="mb-8px">
-        Didn't get the code? <span class="text-#9B6CFF cursor-pointer hover:underline" @click="getMailCode">Resend code</span>⁠.
+        Didn't get the code? <span class="text-#9B6CFF cursor-pointer underline " :class="seconds && '!text-#999'" @click="getMailCode">Resend code</span>⁠.
       </div>
       <div> Didn't get the code? Resend in {{ seconds }} seconds.</div>
     </div>

+ 1 - 8
components/common/login/comp/email/google.vue

@@ -3,13 +3,6 @@ import type { FormInstance, FormRules } from 'element-plus'
 import useLogin from '../../useLogin'
 
 const { loginForm, finishCode, errorCodeTxt, seconds, getMailCode, backStep } = useLogin()
-const ruleFormRef = ref<FormInstance>()
-
-const rules = ref<FormRules>({
-  code: [
-    { required: true, message: 'Please enter a valid email.', trigger: 'blur' },
-  ],
-})
 </script>
 
 <template>
@@ -22,7 +15,7 @@ const rules = ref<FormRules>({
       Your Google account is connected to this EJET Spark account. Sign in using the email
     </div>
     <div class="my-10px text-14px text-#9B6CFF mb-24px">
-      {{ loginForm.mail }}
+      {{ loginForm.email }}
     </div>
     <div class="b-rd-200px bg-#fff text-#333 b-1px b-solid b-#D8D8D8 h-48px lh-48px hover:b-#9B6CFF flex justify-center items-center cursor-pointer mb-24px text-14px fw-500">
       <img src="@/assets/images/google_logo.png" alt="" class="w-24px h-24px mr-10px">

+ 5 - 5
components/common/login/comp/email/index.vue

@@ -6,7 +6,7 @@ const { loginForm, sendEmail, backStep } = useLogin()
 const ruleFormRef = ref<FormInstance>()
 
 const rules = ref<FormRules>({
-  mail: [
+  email: [
     { required: true, message: 'Please enter a valid email.', trigger: 'blur' },
     {
       pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
@@ -25,12 +25,12 @@ const rules = ref<FormRules>({
     <div class="text-14px text-#1A1A1A lh-22px mb-20px">
       We’ll check if you have an account, and help create one if you don’t.
     </div>
-    <el-form ref="ruleFormRef" :rules="rules" :model="loginForm">
-      <el-form-item label="" prop="mail" class="!mb-24px">
-        <el-input v-model.trim="loginForm.mail" class="!h-46px login-input !text-14px" placeholder="Enter email" />
+    <el-form ref="ruleFormRef" :rules="rules" :model="loginForm" @submit.prevent>
+      <el-form-item label="" prop="email" class="!mb-24px">
+        <el-input v-model.trim="loginForm.email" class="!h-46px login-input !text-14px" placeholder="Enter email" />
       </el-form-item>
       <el-form-item>
-        <el-button class="!w-full !h-50px !text-16px !fw-500 !b-rd-10px !bg-#9B6CFF !text-#fff" @click="sendEmail(ruleFormRef)">
+        <el-button class="!w-full !h-50px !text-16px !fw-500 !b-rd-10px !bg-#9B6CFF !text-#fff" @click.prevent="sendEmail(ruleFormRef)">
           Continue
         </el-button>
       </el-form-item>

+ 11 - 34
components/common/login/index.vue

@@ -5,29 +5,19 @@ import Code from './comp/email/code.vue'
 import Google from './comp/email/google.vue'
 import AccountList from './comp/account/list.vue'
 import useLogin from './useLogin'
-import { useUserStore } from '@/stores/modules/user'
 import { useCommonStore } from '@/stores/modules/common'
 
 const commonStore = useCommonStore()
-const { accountList, loginType } = storeToRefs(commonStore)
+const { loginedAccountList, loginType } = storeToRefs(commonStore)
 
-const { emailStep, isEmailGoogle, selectedAccount } = useLogin()
+const { emailStep, isEmailGoogle } = useLogin()
 const { isLoginModalOpen, closeLoginModal } = useLoginModal()
 
-// const userStore = useUserStore()
-// const { login } = userStore
-
-// const loginForm = ref({
-//   email: '',
-//   password: '',
-// })
-// const error = ref(false)
-// const isLoading = ref(false)
-
 const route = useRoute()
 
-watch(() => accountList.value, (newVal: any) => {
-  console.log('accountList changed:', newVal)
+watch(() => loginedAccountList.value, (newVal: any) => {
+  console.log('loginedAccountList', newVal)
+
   if (newVal.length > 0)
     commonStore.setLoginType('account')
   else
@@ -38,21 +28,9 @@ watch(() => route.path, () => {
   if (isLoginModalOpen.value)
     closeLoginModal({ status: false, error: '用户取消登录' })
 })
-
-// async function handleLogin() {
-//   error.value = false
-//   isLoading.value = true
-//   try {
-//     await login(loginForm.value)
-//     closeLoginModal({ status: true, isFirstLogin: true })
-//   }
-//   catch (err) {
-//     error.value = true
-//   }
-//   finally {
-//     isLoading.value = false
-//   }
-// }
+onUnmounted(() => {
+  console.log('onUnmounted------>>登陆弹窗销毁')
+})
 </script>
 
 <template>
@@ -79,12 +57,11 @@ watch(() => route.path, () => {
         </div>
       </div>
       <div class="flex-1 b-rd-10px bg-#fff px-70px pt-100px">
-        <AccountList v-if="emailStep === 0 && accountList.length && loginType === 'account'" />
+        <AccountList v-if="emailStep === 0 && loginedAccountList.length && loginType === 'account'" />
         <Choice v-if="emailStep === 0 && loginType === 'choice'" />
-        <Mail v-if="emailStep === 1 && !selectedAccount" />
-        <Mail v-if="emailStep === 1 && selectedAccount" />
+        <Mail v-if="emailStep === 1 " />
         <Code v-if="emailStep === 2 && !isEmailGoogle " />
-        <Google v-if="emailStep === 2 && isEmailGoogle === 'google'" />
+        <Google v-if="emailStep === 2 && isEmailGoogle " />
       </div>
     </div>
   </el-dialog>

+ 64 - 28
components/common/login/useLogin.ts

@@ -1,21 +1,19 @@
 import type { FormInstance, FormRules } from 'element-plus'
-import { registerApi } from '@/api/model/user'
+import { getEmailCodeApi, validateEmailIsExistApi } from '@/api/model/user'
 import { useUserStore } from '@/stores/modules/user'
 
-const { isLoginModalOpen, closeLoginModal } = useLoginModal()
-
-// const userStore = useUserStore()
-// const { login } = userStore
+const { closeLoginModal } = useLoginModal()
+const { loading, onGoogleLogin } = useGoogleLogin()
 
 const loginForm = ref<any>({
-  mail: '',
-  code: '',
+  email: '',
+  captcha: '',
 })
 const emailStep = ref<number>(0)
 const seconds = ref<number>(0)
-const selectedAccount = ref<string>('')
+const selectedMethod = ref<string>('google')
 const errorCodeTxt = ref<string>('')
-const isEmailGoogle = ref<string>('')
+const isEmailGoogle = ref<boolean>(false)
 export default function useRegister() {
   const nextStep = () => {
     emailStep.value++
@@ -42,17 +40,24 @@ export default function useRegister() {
    * 二选一选择邮箱--下一步
    */
   const onSelectEmail = () => {
-    selectedAccount.value = ''
-    loginForm.value.mail = ''
+    selectedMethod.value = 'email'
+    loginForm.value.email = ''
     nextStep()
   }
   /**
    * 选择曾经登陆过的账号--下一步
    */
-  const onSelectAccount = (item: any) => {
-    selectedAccount.value = item.email
-    loginForm.value.mail = item.email
-    emailStep.value = 1
+  const onSelectAccount = async (item: any) => {
+    console.log('onSelectAccount', item, loading.value)
+    // type: 'google' | 'email'
+    if (item.type === 'google') {
+      const result = await onGoogleLogin()
+      await onGoogleLoginSuccess(result)
+    }
+    if (item.type === 'email') {
+      loginForm.value.email = item.email
+      emailStep.value = 1
+    }
   }
   /**
    * dao: 倒计时60秒
@@ -73,7 +78,7 @@ export default function useRegister() {
       if (seconds.value > 0)
         return
       // 获取验证码
-      //   const res = await registerApi(loginForm.value.mail)
+      await getEmailCodeApi({ account: loginForm.value.email, type: 's003_login' })
       countSeconds()
     }
     catch (error) {
@@ -90,15 +95,24 @@ export default function useRegister() {
     await formEl.validate(async (valid, fields) => {
       if (valid) {
       // 验证已存在google的邮箱
+        const res: any = await validateEmailIsExistApi({ email: loginForm.value.email })
+        console.log('loginedAccountList', res)
 
-        isEmailGoogle.value = 'google' // 模拟google邮箱验证
+        if (!res || res.last_login_type !== 'google')
+          // 如果没有google的邮箱,直接下一步,或者没有注册过邮箱
+          isEmailGoogle.value = false
+        if (res.last_login_type === 'google') {
+          // 显示google登陆按钮
+          isEmailGoogle.value = true
+          loginForm.value.email = ''
+        }
         nextStep()
       }
       else { console.log('error submit!', fields) }
     })
   }
   /**
-   * 邮箱--验证码--完成注册
+   * 邮箱--验证码--完成登陆 (后台默认为注册
    * @returns
    */
   async function finishCode(formEl: FormInstance | undefined) {
@@ -106,24 +120,46 @@ export default function useRegister() {
     if (!formEl)
       return
     await formEl.validate(async (valid, fields) => {
-      if (valid)
-        await handleLogin()
+      if (valid) {
+        await handleLogin({
+          email: loginForm.value.email,
+          captcha: loginForm.value.captcha,
+          type: 'email',
+        })
+      }
 
-      else console.log('error submit!', fields)
+      else { console.log('error submit!', fields) }
     })
   }
   /**
    * 登录--提交
    */
-  async function handleLogin() {
+  async function handleLogin(params: any) {
     try {
-    //   await login(loginForm.value)
-    //   closeLoginModal({ status: true, isFirstLogin: true })
-      isLoginModalOpen.value = false
+      console.log('登陆成功后------000')
+      const { login } = useUserStore()
+      await login(params)
+      console.log('登陆成功后------1111')
+      closeLoginModal({ status: true, isFirstLogin: true })
     }
-    catch (err) {
-      errorCodeTxt.value = 'The code is wrong or invalid.'
+    catch (err: any) {
+      console.log('Login error:', err, selectedMethod.value)
+      if (selectedMethod.value === 'email')
+        errorCodeTxt.value = 'The code is wrong or invalid.'
+      else
+        ElMessage.error(err.message || 'Login failed, please try again later.')
     }
   }
-  return { emailStep, loginForm, selectedAccount, onSelectAccount, errorCodeTxt, seconds, isEmailGoogle, sendEmail, nextStep, onSelectEmail, finishCode, backStep, getMailCode }
+
+  /**
+   * google登陆成功
+   */
+  async function onGoogleLoginSuccess(info: any) {
+    await handleLogin({
+      googleKey: info.token,
+      email: info.userInfo.email,
+      type: 'google',
+    })
+  }
+  return { emailStep, loginForm, onSelectAccount, errorCodeTxt, seconds, isEmailGoogle, sendEmail, nextStep, onSelectEmail, finishCode, onGoogleLoginSuccess, backStep, getMailCode }
 }

+ 7 - 4
components/common/user-avatar/index.vue

@@ -1,8 +1,8 @@
 <!-- @format -->
 
 <script setup lang="ts">
-import { useUserStore } from "@/stores/modules/user"
-import { useCommonStore } from "@/stores/modules/common"
+import { useUserStore } from '@/stores/modules/user'
+import { useCommonStore } from '@/stores/modules/common'
 
 const commonStore = useCommonStore()
 const userStore = useUserStore()
@@ -14,8 +14,11 @@ const { openLoginModal } = useLoginModal()
 async function clickLogin() {
   try {
     const { status } = await openLoginModal()
-    if (status) location.reload()
-  } catch (error) {
+    console.log('Login status:', status)
+    // if (status)
+    //   location.reload()
+  }
+  catch (error) {
     console.log(error)
   }
 }

+ 81 - 0
composables/useGoogleLogin.ts

@@ -0,0 +1,81 @@
+export function useGoogleLogin() {
+  const loading = ref(false)
+  const clientID = '482169597782-nic3d8bo67o0gmq93cmgao7050ets16n.apps.googleusercontent.com'
+  onMounted(() => {
+    const script = document.createElement('script')
+    script.src = 'https://accounts.google.com/gsi/client'
+    script.async = true
+    script.defer = true
+    document.head.appendChild(script)
+  })
+
+  /**
+   * 初始化 Google Auth
+   */
+  function initializeGoogleAuth(resolve, reject) {
+    return window.google.accounts.oauth2.initTokenClient({
+      client_id: clientID,
+      scope: 'email profile',
+      callback: async (response) => {
+        try {
+        // 获取用户基本信息
+          const userInfo = await fetchUserInfo(response.access_token)
+          const res = {
+            token: response.access_token,
+            userInfo,
+          }
+          resolve(res)
+        }
+        catch (error) {
+          reject(error)
+        }
+      },
+      error_callback: (error) => {
+        reject(error)
+      },
+    })
+  }
+
+  /**
+   * 获取用户详细信息
+   */
+  async function fetchUserInfo(accessToken) {
+    const res = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {
+      headers: {
+        Authorization: `Bearer ${accessToken}`,
+      },
+    })
+    if (!res.ok)
+      throw new Error('获取用户信息失败')
+    return await res.json()
+  }
+
+  // 触发登录
+  function handleGoogleLogin() {
+    return new Promise((resolve, reject) => {
+      if (!window.google) {
+        const t = setTimeout(() => {
+          clearTimeout(t)
+          ElMessage.error('当前环境不支持 Google 登录,请使用其他方式登录')
+          reject(new Error('Google SDK not loaded'))
+        }, 1000)
+        return
+      }
+      const client = initializeGoogleAuth(resolve, reject)
+      client.requestAccessToken()
+    })
+  }
+
+  async function onGoogleLogin() {
+    try {
+      loading.value = true
+      const result = await handleGoogleLogin()
+      loading.value = false
+      return result
+    }
+    catch (error) {
+      loading.value = false
+    }
+  }
+  return { loading, onGoogleLogin }
+}

+ 14 - 16
stores/modules/common.ts

@@ -11,19 +11,12 @@ export const useCommonStore = defineStore(
     const isCompletedInfo = ref<boolean>(true) // 是否提交过的信息
     const loginType = ref<string>('choice')
     const downloadCatalog = ref<any>(null)
-    const accountList = ref<any>([
-      // {
-      //   name: 'EJET Spark 12',
-      //   email: '185@163.com',
-      //   id: '1',
-      // },
-      // {
-      //   name: 'EJET Spark 34',
-      //   email: '18525917172@gmail.com',
-      //   id: '2',
-      // },
-    ])
+    const accountList = ref<any>([])
     // const userStore = useUserStore()
+    const loginedAccountList = computed(() => {
+      // 获取已经登陆的账号列表的前两位
+      return accountList.value.filter((item: any) => item.email).slice(0, 2)
+    })
 
     /**
      * 设置头部导航背景色
@@ -48,11 +41,15 @@ export const useCommonStore = defineStore(
     /**
      * 设置已经登陆的账号列表 (在登陆成功后调用)
      */
-    const setAccountList = (list: any[]) => {
-      if (!list || !Array.isArray(list))
+    const pushAccount = (user: any) => {
+      if (!user || !user.email)
         return
-      accountList.value = list
+      accountList.value.push(user)
     }
+    /**
+     *  type 登录方式
+     *
+     */
     const setLoginType = (type: string) => {
       if (!type)
         return
@@ -84,8 +81,9 @@ export const useCommonStore = defineStore(
       setLoginType,
       accountList,
       loginType,
-      setAccountList,
+      pushAccount,
       setFilledInfo,
+      loginedAccountList,
       setDownloadCatalog,
     }
   },

+ 20 - 14
stores/modules/user.ts

@@ -1,16 +1,18 @@
 /** @format */
 
-import { ref } from "vue"
-import { defineStore } from "pinia"
-import { loginApi, logoutApi } from "~/api/model/user"
+import { ref } from 'vue'
+import { defineStore } from 'pinia'
+import { useCommonStore } from './common'
+import { loginApi, logoutApi } from '~/api/model/user'
 
 interface LoginRequestData {
   email: string
   password: string
+  type: 'google' | 'email'
 }
 
 export const useUserStore = defineStore(
-  "user",
+  'user',
   () => {
     const userInfo = shallowRef<any>()
     const token = shallowRef<any>()
@@ -25,11 +27,14 @@ export const useUserStore = defineStore(
         userInfo.value = userDataInfo
         token.value = userToken
         ElMessage({
-          message: "Login success",
-          type: "success",
+          message: 'Login success',
+          type: 'success',
           plain: true,
         })
-      } catch (error) {
+        const commonStore = useCommonStore()
+        commonStore.pushAccount({ email: userDataInfo.email, name: userDataInfo.annualPurchaseAmount, type: params.type })
+      }
+      catch (error) {
         return Promise.reject(error)
       }
     }
@@ -38,24 +43,25 @@ export const useUserStore = defineStore(
       try {
         if (token.value) {
           await logoutApi()
-          document.cookie =
-            "user=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/"
+          document.cookie
+            = 'user=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/'
           ElMessage({
-            message: "Exit successful",
-            type: "success",
+            message: 'Exit successful',
+            type: 'success',
             plain: true,
           })
         }
-      } finally {
+      }
+      finally {
         token.value = null
         userInfo.value = undefined
         const router = useRouter()
-        router.push("/")
+        router.push('/')
       }
     }
     return { userInfo, token, login, logout, isLogin, avatar, nickname }
   },
   {
     persist: true,
-  }
+  },
 )