Nuxt 中的 vuex 及鉴权应用

部分关键代码

login.vue

<!-- 部分关键代码 -->
<script>
export default {
  middleware: "login", // 使用 login 中间件
  beforeCreate() {
    this.form = this.$form.createForm(this, { name: "normal_login" });
  },
  methods: {
    handleSubmit(e) {
      e.preventDefault();

      this.form.validateFields(async (err, values) => {
        if (!err) {
          // console.log('Received values of form: ', values);
          const { userName, password } = values;

          try {
            const val = await this.$axios.post("/login", {
              userName,
              password
            });
            this.$message.success(val.msg);

            // 登录后更新 store
            this.$store.commit("setUser", val.name);
            this.$store.commit("setLogin", true);

            // 登录成功后跳转页面
            const url = this.$route.query.url || "/home";
            this.$router.push(url);
          } catch (error) {
            this.$message.error(error.msg);
          }
        }
      });
    }
  }
};
</script>

服务端代码

const express = require('express');
const server = express();

server.use(express.json());

server.post('/login', async (req, res) => {
  try {
    const { userName, password } = req.body;
    if (userName == 'root' && password == '123123') {

      // 登录成功后,设置 cookie
      res.cookie('session', '123456');
      res.cookie('username', '小丁');

      res.json({ name: '小丁', msg: '登录成功', code: 200 });
    } else {
      res.json({ code: 400, msg: '用户名密码错误' });
    }
  } catch (error) {
    console.log(error);
    res.statusCode(500).send('服务器错误');
  }
});

server.listen(8080, _ => console.log('server is running at 8080'));

访问 /about 界面

<template>
  <h1>About页面</h1>
</template>

<script>
export default {
  middleware: 'auth', // 会先走 auth 中间件
}
</script>

<style>

</style>

auth 中间件

export default function ({ store, redirect, route }) {
  if (!store.state.user) {
    // 未登录重定向到 登录界面
    redirect({ path: '/login', query: { url: route.path } })
  }
}

vuex 的 store

export const actions = {
  // 该方法是在服务端执行的,如果 cookie 存在说明登录成功,更新 store
  nuxtServerInit({ commit }, { req }) {
    const cookie = req && req.headers.cookie;
    const val = getCookie(cookie, 'session');
    if (val) {
      const user = getCookie(cookie, 'username');
      commit('setUser', user);
      commit('setLogin', true);
    }
  }
}

function getCookie(cookie, key) {
  if (!cookie) {
    return;
  }
  const cookies = cookie.split('; ');
  for (var i = 0; i < cookies.length; i++) {
    const c = cookies[i];
    const [k, v] = c.split('=');
    if (k == key) {
      return v;
    }
  }
}

export const state = () => ({
  user: null,
  isLogin: false
});

export const mutations = {
  setUser(state, user) {
    state.user = user;
  },
  setLogin(state, b) {
    state.isLogin = b;
  }
}
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. Nuxt 中的 vuex 及鉴权应用
  2. 2. 部分关键代码
    1. 2.1. login.vue
    2. 2.2. 服务端代码
    3. 2.3. 访问 /about 界面
    4. 2.4. auth 中间件
    5. 2.5. vuex 的 store