yado前端vue项目02

114 阅读2分钟

02提纲

用户登录、用户退出、Vuex数据缓存
github地址:github.com/Yado-yu/yad…

将用户信息存入vuex中

vuex

1、用户模块

import { Message } from 'element-ui'
import router from '@/router'

export default {
    namespaced: true,//命名空间开启
    state:{
        token: '',//用于检验用户权限
        currentUser: null,//设置当前用户
        //存储的用户信息
        userList:[{
            userId:'001',
            rank:'admin',
            username:'admin',
            password:'123',
            userDorm:'--',
        },
        {
            userId:'002',
            rank:'student',
            username:'yado',
            password:'123',
            userDorm:'331',
        },
        {
            userId:'003',
            rank:'student',
            username:'student03',
            password:'123',
            userDorm:'330',
        },
        {
            userId:'004',
            rank:'student',
            username:'student04',
            password:'123',
            userDorm:'330',
        },
        {
            userId:'005',
            rank:'student',
            username:'student05',
            password:'123',
            userDorm:'331',
        },
        {
            userId:'006',
            rank:'student',
            username:'student06',
            password:'123',
            userDorm:'332',
        },
        {
            userId:'007',
            rank:'student',
            username:'student07',
            password:'123',
            userDorm:'332',
        },
        {
            userId:'008',
            rank:'student',
            username:'student08',
            password:'123',
            userDorm:'333',
        },
        {
            userId:'009',
            rank:'student',
            username:'student09',
            password:'123',
            userDorm:'333',
        },
    ],
    },
    actions: { 
            //进行账号密码验证
            userLogin({ state, commit }, { username, password}){
            const userTemp = state.userList.find(user=> user.username === username)
            console.log(state)
            if(!userTemp){//如果没找到
                Message.error('不存在该用户!')
            }else if(userTemp.password !== password){//如果密码不正确
                Message.error('用户密码错误!')
            }
            //验证成功后将用户权限(rank)和当前用户传入mutations
            commit('SET_TOKEN',userTemp.rank )
            commit('SET_CURRENT_USER' , userTemp)
            Message.success('登录成功!')
            //跳转到主界面
            router.replace('/')
        },
    mutations: { 
        //设置当前用户权限
        SET_TOKEN(state, token){
            state.token = token;
        },
        //设置当前用户
        SET_CURRENT_USER(state, user){
            state.currentUser = user;
        },
}

2、index.js中加入getters:

export default new Vuex.Store({
   ...
    getters: {
        token: (state) => state.users.token,
        currentUser: (state) => state.users.currentUser || {},
     }
})

登录界面

给登录按钮绑定事件: <button class="btn-login" @click="loginHandler">登录</button>

<script>
import { mapActions } from 'vuex'

export default {
    name:'Login',
    data() {
        return {
            userName:'',
            passWord:'',
        }
    },
    methods:{
        loginHandler(){
            //简单的非空验证
            if(!this.userName||!this.passWord) {
                this.$message.error('账号或密码为空!')
                return
            }
            //讲数据传入
            this.userLogin({
                username:this.userName,
                password:this.passWord,
            })
        },
        //得到vuex中的userLogin方法
        ...mapActions('users', ['userLogin']),
    }
}
</script>

路由守卫更改

1、在src/main.js中引入routerAuth并传入store:routerAuth(router, store)
2、路由守卫src/routerAuth.js中代码如下:

export default function routerAuth(router, store) { 
    router.beforeEach((to, from, next) => {
        const { token } = store.getters
        if (token || to.path === '/login') {
            next();
            return
        }
        next('/login');
        
    })
    //浏览器标题
    router.afterEach((to) => {
        document.title = to.meta && to.meta.title ? `${to.meta.title}-宿舍管理系统` : '宿舍管理系统'
    })
}

简单的登录验证完成,接下来写用户退出

用户退出

1、vuex中:

import { Message } from 'element-ui'
import router from '@/router'

export default {
    ...
    actions: {
        ...
        userExit({ commit }) {
            commit('CLEAR_INFO')
            router.replace('/login')
        }
    },
    mutations: { 
        ...
        CLEAR_INFO(state) {
            state.currentUser = null;
            state.token = '';
        }
    },
}

2、给用户退出绑定方法

<script scoped>
import { mapActions, mapGetters } from 'vuex'
export default {
    name:'User',
    methods:{
      exitHandler() {
        this.$confirm('您确定要退出吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.userExit()
        }).catch(() => {       
        });
      },
      ...mapActions('users', ['userExit'])
    },
    computed:{
      ...mapGetters(['currentUser'])
    }
}
</script>

此时,用户登录退出的简单操作完成。但有缺陷,vuex中的数据没有缓存,每当刷新界面时就会丢失数据,需要重新登录等问题。于是借助vue-persistedstate插件将数据缓存

vue-persistedstate插件缓存数据

1、安装:yarn add vue-persistedstate
2、在src\store\inde.js中引入,并写如下代码:

...
//数据存入缓存,刷新页面还会有
import { createVuexPersistedState } from "vue-persistedstate";

//创建并暴露store
export default new Vuex.Store({
    plugins: [
        createVuexPersistedState({
          key:'vuex',
          storage:{
            setItem(key, value) {
                sessionStorage.setItem(key, JSON.stringify(value))
            },
            getItem(key, def) {
                try {
                    const value = sessionStorage.getItem(key)
                    return JSON.parse(value)
                } catch (_) {
                    return def
                }
            },
            removeItem(key) {
                sessionStorage.removeItem(key)
            }
          },
          whiteList:[],
          blackList: [],
        }),
      ],
      ...
})

现在,简单的用户登录与退出功能以实现