使用Pinia持久化存储实现用户认证系统

结果图

知识点

vite和@latest的中间是不能有空格的

-- save

这里的user.js,其实就是类似C++中写类时的一个声明与定义分离的一个操作,是面对大段大段的代码做出的一个必然的选择;在week04中,我们也发现到,区别于C++呢,在vue的JavaScript中,这里'类'声明与定义后是要自己给抛出的,即这里的export default bus 那块;不过我们这里是export const ...

状态管理

state;也就是说,从这里看,pinia它就是我们创建的全局变量,我们使用上的全局变量,是pinia的state属性中的成员变量;通过对比也可以看出,pinia背后做了小动作,把state给默认省掉了,state类的属性直接被看出pinia的成员变量了

LocalStorage;注我们在week06时使用到了sessionStorage

Getter;它返回的还是一个值,是基于成员变量的一个高级值

!!

Meta:{requiresAuth: true}

Export 的 具名const 与 默认default

路由守卫这里,应是隐含着一个路由树,有前序和后序,根就是当前路由,前序就是前一节点路由,后序就是目标路由

登录逻辑,即背后技术部分是路由守卫,是前置条件,是先导是前序,是守门人即守卫

很朴素的提交,hanleLogin

这一块的挂载;使用了store要挂pinia,就类似路由使用一样,前者是来着自己项目的js,后者是来着下载的pinia库,应是自行的链接useStore.js

具体使用时的挂载啊;route是路由对象,router是路由器对象哦;这里也折射了OOP中一切皆对象的观点

实验数据

(1)创建认证 Store

在 Pinia Store 中定义与认证相关的状态(State)、操作(Actions)和获取器(Getters)。Store 的初始状态尝试从localStorage中读取。

javascript 复制代码
import {defineStore} from 'pinia'
export const useUserStore = defineStore('user',{
    //状态(State)
    //从localStorage中读取,实现"刷新后状态恢复"
    state: ()=>({
        token: localStorage.getItem('token') || '',
        username: localStorage.getItem('username') || ''
    }),

    //获取器Getter
    getters:{
        isLoggedIn: (state) => !!state.token
    },

    //操作器Action
    actions:{
        //登录: 更新state + 同步写入localStorage
        login(username, token){
            this.token = token
            this.username = username
            //手动持久化
            localStorage.setItem('token', token)
            localStorage.setItem('username', username)
        },
        
        //登出: 清空state + 同步清除localStorage
        logout(){
            this.token = ''
            this.username = ''
            //手动清除
            localStorage.removeItem('token')
            localStorage.removeItem('username')
            
        }
    }

    //注意: 没有 persiste配置了, 持久化全靠 actions 里的 localStorage 操作
})

(2)配置路由守卫

使用Vue Router的全局前置守卫 (beforeEach),在用户访问需要认证的路由时进行检查。

javascript 复制代码
import {createRouter, createWebHashHistory } from 'vue-router'
import LoginView from '../components/LoginView.vue'
import MainView from '../components/MainView.vue'
import HomeView from '../components/HomeView.vue'
import { useUserStore } from '../store/user.js'

const routes = [
    {path: '/', redirect: '/login'},
    {path: '/login', name: 'login', component: LoginView},
    {
        path: '/main',
        name: 'main',
        component: MainView,
        meta: {requiresAuth: true}
    },
    {
        path: '/home',
        name: 'home',
        component: HomeView,
        meta: {requiresAuth: true}
    },
    {path: '/:pathMatch(.*)*', redirect: '/login'}
]

const router = createRouter({
    history: createWebHashHistory(),
    routes
})

//全局前置守卫
router.beforeEach((to, from) => {
    const userStore = useUserStore()

    //如果目标路由需要认证,且用户未登录
    if(to.meta.requiresAuth && !userStore.isLoggedIn){
        return{
            path: '/login',
            query: { redirect: to.fullPath}  //  保存原目标地址,登录后跳回
        }
    }

    return true
})
export default router

备注

哈哈,这里竟然没有报错

还有这里,用了路由守卫,但是把路由是视图的配置搞忘了,哈哈;跟深的是,login也应是视图的一部分,应该是放到App.vue下同一管理;router/index.js里的是路由链接,App.vue里要配的叫做路由视图

这里用了useUserStore.logout,可以紧接搭配router.push('/login')

这里有个规范

分支用的标识名

学习一下好东西

我的ai工具使用的是opencode

实验数据基于课程老师的资料

相关推荐
gc_22991 天前
使用VS Code终端创建Vue项目报错:“npm : 无法加载文件 ...\npm.ps1,因为在此系统上禁止运行脚本”
vue·vs code
小阿鑫1 天前
尤雨溪 : Vue 4 已经在规划中了!
vue·vite·vite+·程序员海军·vue4
离歌漠2 天前
《我用 Tauri 做了一个本地开发工具箱》
rust·typescript·vue
enjoy编程2 天前
playwright学习-I
typescript·vue·nodejs·1024程序员节·playwright
梅雅达编程笔记2 天前
Day 17 | uni-app 小程序:前端从零搭建
微信小程序·typescript·uni-app·vue3·pinia·前端开发·全栈
落花看风雪5 天前
从零开始搭建后台系统(vue3+TypeScript+Vite)01
typescript·vue·js
梦曦i8 天前
uni-app x 专属 Pinia 库正式发布
前端·pinia·uni-app x
那年那棵树9 天前
基于WebGis的人生如旅地图系统
前端·arcgis·vue·课程设计
冒险的豆子12 天前
Vue2 、Vue3 响应式对比及优劣
vue