Vue3+Ts项目——登录页面跳转到首页

前言:根据我上篇所实现的左边菜单栏之后,需要登录成功跳转home页面。主要分为三步。

第一步:创建三个ts文件结合pinia缓存登录信息和token

src\api\userTypes.ts

就是个接口类方便页面和另一个ts文件数据传递,其实也可以不用

typescript 复制代码
export interface LoginResponse {
    userInfo: UserInfo
    token: string
  }

  export interface UserInfo {
    user: string | null
  }
src\stores\modules\user.ts

这个ts就是结合pinia用于处理页面传过来要处理缓存的数据。

typescript 复制代码
import { defineStore } from 'pinia'
import type {LoginResponse, UserInfo} from '@/api/userTypes'

import { useStorage } from '@vueuse/core'

export const useUserStore = defineStore('user', () => {
  const userInfoRef = useStorage('USER_INFO', {} as UserInfo, sessionStorage)
  const tokenRef = useStorage('TOKEN', '', sessionStorage)

  function setUserInfo(userInfo: UserInfo) {
    userInfoRef.value = userInfo
    console.log('userInfoRef====>',userInfoRef);
    
  }
  
  function setToken(token: string) {
    tokenRef.value = token
  }

  function toLogin(param: LoginResponse) {    
    setToken(param.token) 
    setUserInfo(param.userInfo)
  }
  function toLogout() {
    setUserInfo({} as UserInfo);
    setToken("");
    window.location.href = '/login'
}
  function getUsername() {
    return userInfoRef.value.user
  }

  function getToken() {
    return tokenRef.value
  }

  return { toLogin, toLogout, getToken, getUsername }
})
src\stores\counter.ts
typescript 复制代码
import type {App} from 'vue'
import {createPinia} from 'pinia'

const store = createPinia()

export function useStore(app: App<Element>): void {
  app.use(store)
}

export {store}

第二步:页面调用ts的登录处理方法,router下index.ts路径跳转处理

我这边处理是登录接口请求成功之后,再调用toLogin()方法。其实可以结合接口请求一起写,我这个是借鉴Vue + Ts 项目(七)------ 登录页面及登录校验,实现方式很多。我先结合自己项目实现功能。

包含登录操作的vue页面
typescript 复制代码
import { useUserStore } from "@/stores/modules/user";
import { useRouter, useRoute } from "vue-router";
import { LoginResponse } from "@/api/userTypes";
// 引入这三

//再在setup ()下第一行,切记一定要前排。不然router和route为空。 
setup (){
    const userStore = useUserStore();
    const router = useRouter();
    const route = useRoute();
    const LoginResponseModel: Ref<LoginResponse> = ref({
      userInfo: {user:''},
      token: "",
    });

// 再在登录回调成功的地方加上
              LoginResponseModel.userInfo ={
                user:res.user// 根据你自己的数据结构来
              } 
              LoginResponseModel.token = res.token
              userStore.toLogin(LoginResponseModel);
              // 这里LoginResponseModel,会报红。但是不影响流程。我后期看看怎么去红。哈哈哈哈哈,我还是太废了。
              const redirect = route.query.redirect as string
              
              if (redirect) {
                router.replace(redirect)
              } else {
                router.replace('/combination/dashboard')
              }

不前排会报错Cannot read properties of undefined (reading 'replace')

也不要试图用useRouter()直接.replace会报错inject() can only be used inside setup() or functional components.等一些问题

src\router\index.ts

主要是beforeEach方法。

typescript 复制代码
import {createWebHistory, createRouter} from "vue-router";
import type {App} from 'vue'
// 获取所有路由
import routes from './routes'

import { useUserStore } from "@/stores/modules/user";

const router = createRouter({
  routes,
  // 这里使用历史记录模式
  history: createWebHistory()
})

router.beforeEach((to, from, next) => {
  const userStore = useUserStore();  
  const isAuthenticated = userStore.getToken() && userStore.getToken() !== "";
  console.log('====isAuthenticated==',isAuthenticated);
  // isAuthenticated用于判断没有登录缓存,手动属于的路径,不会跳转成功。
  if (isAuthenticated) {
    next();
  } else {
    if (to.name === "login") {
      next();
    } else {
      next({ name: "login", query: { redirect: to.fullPath } });
    }
  }
});

export const useRouter = (app: App<Element>): void => {
    app.use(router)
}

对了,别忘了配置login页面的路由src\router\modules\login.ts,把默认路径也是设置为登录页面

typescript 复制代码
import type { RouteRecord } from '@/router/type'
import BasicLayout from "@/layouts/BasicLayout.vue";
import { CalendarTools } from '@vicons/carbon'  

const loginRoutes: RouteRecord[] = [
  {
    path: "/",
    name:'login',
    meta:{
      hidden: true
    },
    children: [
      {
        path: "/login",
        name: "login",
        component: () => import("@/views/login/login.vue"),
      },
    ],
  },
]

export default loginRoutes

到目前为止,登录成功后已经可以跳转了。先这样

第三步:检测token过期,登出处理

第三步先欠着。下周我再继续学习。毕竟周五了。我心已经起飞了。

相关推荐
尾善爱看海12 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
weixin_BYSJ198712 小时前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
Bs_MoneyMagnet12 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
驳是12 小时前
一个组件,提升 react-router 开发的幸福感
前端·preact
GreenTea13 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
星云API技术支持13 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
京东云开发者13 小时前
81.8 秒的视频,我们改了 15 个版本:一次纯 Codex 驱动的 AI-native 视频实践
前端·aigc
Csvn14 小时前
TypeScript 大型项目架构:从单体 tsconfig 到分层可扩展的工程
前端
Bs_MoneyMagnet15 小时前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
计算机魔术师15 小时前
Dario Amodei 发文呼吁为前沿 AI 降速并提出三点计划
前端