目录
登录---------登录成功的时候,后台为了区分这个用户是谁,服务器下发token【令牌唯一表示】
前台持久化存储token【带着token找服务器要用户信息进行展示】
vuex 不是持久化存储
网络请求
- //登录
- const reqLogin = (data) => {
- return axios.post('/api/user/passport/login', data)
- }
- //获取用户信息
- const reqUserInfo = () => {
- return axios.get('/api/user/passport/auth/getUserInfo')
- }
- //退出登录
- const reqlogoOut = () => {
- return axios.get('/api/user/passport/logout')
- }
登录事件
- async userLogin() {
- try {
- const {
- phone,
- password
- } = this;
- (phone && password) && await this.$store.dispatch('AsyncLogin', {
- phone,
- password
- })
- this.$router.push('/Home')
- } catch (e) {
- console.log(e.message);
- }
vuex
- import axios from '@/api'
- // user 组件的小仓库
- const state = {
- code: '',
- token: localStorage.getItem('Token'),
- userinfo: ''
- }
- const mutations = {
- userLogin(state, payload) {
- state.token = payload
- },
- GetUserInfo(state, payload) {
- state.userinfo = payload
- },
- CLEAR(state) {
- state.token = ''
- state.userinfo = ''
- localStorage.removeItem('Token')
- }
- }
- const actions = {
- async AsyncLogin({
- commit
- }, data) {
- let result = await axios.reqLogin(data)
- console.log(result);
- if (result.code == 200) {
- commit('userLogin', result.data.token)
- localStorage.setItem('Token', result.data.token)
- return 'ok'
- } else {
- return Promise.reject(new Error('false'))
- }
- },
- async asyncUserInfo({
- commit
- }) {
- let result = await axios.reqUserInfo()
- console.log(result);
- if (result.code == 200) {
- commit('GetUserInfo', result.data)
- return 'ok'
- } else {
- return Promise.reject(new Error('false'))
- }
- },
- async asyncUserOut({
- commit
- }) {
- let result = await axios.reqlogoOut()
- if (result.code == 200) {
- commit('CLEAR')
- return 'ok'
- } else {
- return Promise.reject(new Error('false'))
- }
- }
- }
- const getters = {}
- export default {
- state,
- mutations,
- actions,
- getters
- }
当用户注册完成,用户登录【用户名+密码】向服务器发请求(组件派发 AsyncLogin)
登录成功后获取token,存储与仓库当中(非持久化存储),路由跳转到home
在首页当中(mounted)中派发 action asyncUserInfo 动态展示用户信息
持久化存储token
清除 后台token 用户信息 本地token
跳转到home
- async logoOut(){
- //退出登录发送请求 清楚token 用户信息
- try{
- await this.$store.dispatch('asyncUserOut')
- this.$router.push('/Home')
- }catch(e){
- //TODO handle the exception
- e.message
- }
- },
导航:表示路由正在发生变化
守卫:紫禁城的护卫
举例子:紫禁城【皇帝,太后,妃子】紫禁城大门守卫都要排查
只要发生路由变化,守卫就能监听到
router.beforeEach( (to, from, next) => {}))
//to:可以获取到你要跳转到哪个路由信息
// from::可以获取到你从哪个路由来的信息
// next : 放行函数 可以放行到指定的路由
可以做token过期处理 控制路由跳转
router里可以单独引入仓库import store from '@/store'
- // 配置路由的地方
- import Vue from 'vue'
- import VueRouter from 'vue-router'
- import routes from './router'
- import store from '@/store'
- //使用插件
- Vue.use(VueRouter)
- let router = new VueRouter({
- routes,
- });
- // 全局守卫,前置守卫 在路由跳转之前进行判断
- router.beforeEach(async (to, from, next) => {
- //to:可以获取到你要跳转到哪个路由信息
- // from::可以获取到你从哪个路由来的信息
- // next : 放行函数 可以放行到指定的路由
- let token = store.state.user.token
- let name = store.state.user.userinfo.name;
- if (token) {
- //用户已经登录了,去login(不让去,停留在首页)
- if (to.path == '/login') {
- next('/')
- } else {
- // 登录去的不是login,
- if (name) {
- next()
- } else {
- // 没有用户信息。派发action ,让仓库存储用户信息 进行跳转
- try {
- await store.dispatch('asyncUserInfo')
- next()
- } catch (e) {
- // token 失效,获取不到用户信息,清除token 重新登录,
- await store.dispatch('asyncUserOut')
- }
- }
-
- }
- } else {
- //登录了去的不是login,直接放行
- next()
- }
- })
- export default router
举例子:紫禁城【皇帝,太后,妃子】相对应的【皇帝,太后,妃子】路上守卫
举例子;我要去皇帝的屋子,已经到了皇帝屋子的外面了(进入了)