Mock.js配合vuex进行登录获取token

2023-11-09

新项目,后端数据还没准备好,没办法直接从后端获取接口数据,于是我利用Mock简单实现一下这个功能,以作为测试用。

首先,利用  cnpm install mockjs --save-dev  指令安装完mock后,在项目里创建文件夹mock,再创建index.js和userList.js(前者为mock服务文件,后者为模拟数据文件)
 

index.js中复制如下代码:

// 首先引入Mock
const Mock = require('mockjs');
 
// 设置拦截ajax请求的相应时间
Mock.setup({
    timeout: '200-600'
});
 
let configArray = [];
 
// 使用webpack的require.context()遍历所有mock文件
const files = require.context('.', true, /\.js$/);
files.keys().forEach((key) => {
    if (key === './index.js') return;
    configArray = configArray.concat(files(key).default);
});
 
// 注册所有的mock服务
configArray.forEach((item) => {
    for (let [path, target] of Object.entries(item)) {
        let protocol = path.split('|');
        Mock.mock(new RegExp('^' + protocol[1]), protocol[0], target);
    }
})

另外,需要在main.js中插入一段代码:require('../mock')

之后在userList中写入数据,首先写入get请求获取的数据:

import Mock from 'mockjs'; //导入mockjs

const userList = {
    //定义用户数据
    data: {
        total: 6,
        //前两个用户数据分别固定设为管理员和普通用户,为后续权限设置做准备,其他用户随机生成
        userinfo: [
            {
                username: 'admin',
                password: '123456',
                roles: 'admin',
                name: '张三',
                age: 23,
                job: '前端工程师',
                token: '000111222333444555666',
                id: '100'
            },
            {
                username: 'editor',
                password: '123456',
                roles: 'editor',
                name: '测试1',
                'age|20-30': 23,
                job: '前端工程师',
                token: '145145145123123123111',
                id: '101'
            },
            {
                username: '@word(3, 5)',
                password: '123456',
                roles: 'editor',
                name: '@cname',
                'age|20-30': 23,
                'job|1': ['前端工程师', '后端工程师', 'UI工程师', '需求工程师'],
                token: '@guid()',
                id: '102'
            },
            {
                username: 'uf100991',
                password: '1qaz!QAZ2wsx@WSX',
                roles: 'admin',
                name: '张三',
                age: 23,
                job: '前端工程师',
                token: '000111222333444555666',
                id: '103'
            }
        ],
        meta: {
            status: 200,
            message: 'success'
        }
    }
};

Mock.mock('/user', 'post', (req) => {
    //路径与请求方式
    console.log(req, 'req');
    console.log(JSON.parse(req.body), '==================22222=========');
    const user = JSON.parse(req.body); //将传递进来的数据保存
    console.log(user.data.username,"user.data.username")
    const username = user.data.username
    const password = user.data.password
    for (let i = 0; i < userList.data.userinfo.length; i++) {
        //判断userList中是否存在该用户并且用户密码是否正确
        if (username === userList.data.userinfo[i].username && password === userList.data.userinfo[i].password) {
            return {
                meta: {
                    msg: 'success',
                    status: 200
                },
                user: {
                    username: userList.data.userinfo[i].username,
                    roles: userList.data.userinfo[i].roles
                }
            };
        }
    }
    return {
        meta: {
            msg: 'error',
            status: 201
        }
    };
});

//定义请求方法与路径
export default {
    'get|/user': userList
};

在登录页某一按钮上定义methods以测试是否成功获取数据 ,这里搭配的vuex  此为登录页面

<template>
  <div class="login-wrap">
    <div class="ms-login">
      <div class="ms-title">后台管理系统</div>
      <el-form
        :model="ruleForm"
        status-icon
        :rules="rules"
        ref="ruleForm"
        label-width="0px"
        class="ms-content"
      >
        <el-form-item prop="username">
          <el-input v-model="ruleForm.username" placeholder="username">
            <el-button slot="prepend" icon="el-icon-lx-people"></el-button>
          </el-input>
        </el-form-item>
        <el-form-item prop="password">
          <el-input
            type="password"
            placeholder="password"
            v-model="ruleForm.password"
            autocomplete="off"
            @keyup.enter.native="submitForm('ruleForm')"
          >
            <el-button slot="prepend" icon="el-icon-lx-lock"></el-button>
          </el-input>
        </el-form-item>
        <div class="login-btn">
          <el-button type="primary" @click="submitForm('ruleForm')">登录</el-button>
        </div>
        <p class="login-tips">Tips : 用户名和密码随便填。</p>
      </el-form>
    </div>
  </div>
</template>

<script>
import Axios from 'axios';
export default {
  name: "Login",
  data() {
    var validateUser = (rule, value, callback) => {
      let reg = /^[A-Za-z0-9]+$/;
      //value就是输入的值
      if (value === "") {
        callback(new Error("请输入用户名"));
      } else {
        if (reg.test(value)) {
          callback(); //必须要callback 否则提交不了
        } else {
          callback(new Error("用户名是由数字和字母组成"));
        }
      }
    };
    var validatePass = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("请输入密码"));
      } else {
        callback();
      }
    };
    return {
      ruleForm: {
        username: "",
        password: "",
      },
      rules: {
        username: [{ validator: validateUser, trigger: "blur" }],
        password: [{ validator: validatePass, trigger: "blur" }],
      },
    };
  },
  methods: {
    login() {},

    // 提交表单
    submitForm(formName) {
      JSON.stringify();
      this.$refs[formName].validate((valid) => {
        if (valid) {
          // let a = this.ruleForm;
          // console.log(a,"aaaaaaaaaaaaaaaa")
          // Axios.post('/user',{
          //   data:this.ruleForm
          // }).then((res) => {
          //   console.log(res,"res111111111111111111");
          //   let code = res.data.meta.status;
          //   if (code == "200") {
          //     this.$router.push("/home");
          //   }
          // });
          this.$store.dispatch("login", this.ruleForm);
        } else {
          console.log("error submit!!");
          return false;
        }
      });
    },
    // 重置表单
    resetForm(loginForm) {
      this.$refs[loginForm].resetFields();
    },
    // 获取验证码方法
    // getVerifyCodeImg() {
    //   /*获取验证码*/
    //   this.$axios.UploadFormFile.then((res) => {
    //     // 获取验证码key
    //     this.loginForm.codeToken = res.data.data.code;
    //     // 获取验证码图片
    //     this.codeImg = res.data.data.codeImg;
    //   });
    // },
  },
  // created() {
  //   // 页面渲染完成后执行获取验证码方法
  //   this.getVerifyCodeImg();
  // },
};
</script>

<style scoped>
.login-wrap {
  position: relative;
  width: 100%;
  height: 100%;
  background: url(../../assets/img/5d97a7ba_E905711_68c773e3.jpg) no-repeat;
  background-size: 100% 100%;
}

.ms-title {
  width: 100%;
  line-height: 50px;
  text-align: center;
  font-size: 20px;
  color: rgb(8, 8, 8);
  border-bottom: 1px solid #ddd;
}

.ms-login {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 350px;
  margin: -190px 0 0 -175px;
  border-radius: 5px;
  background: rgba(255, 255, 255, 0.7);
  overflow: hidden;
}

.ms-content {
  padding: 30px 30px;
}

.login-btn {
  text-align: center;
}

.login-btn button {
  width: 100%;
  height: 36px;
  margin-bottom: 10px;
}

.login-tips {
  font-size: 12px;
  line-height: 30px;
  color: rgba(255, 255, 255, 0.247);
}
</style>

登录按钮的methods暂时写为:

 submitForm(formName) {
      JSON.stringify();
      this.$refs[formName].validate((valid) => {
        if (valid) {
          // let a = this.ruleForm;
          // console.log(a,"aaaaaaaaaaaaaaaa")
          // Axios.post('/user',{
          //   data:this.ruleForm
          // }).then((res) => {
          //   console.log(res,"res111111111111111111");
          //   let code = res.data.meta.status;
          //   if (code == "200") {
          //     this.$router.push("/home");
          //   }
          // });
          this.$store.dispatch("login", this.ruleForm); //引用vuex里面的方法
        } else {
          console.log("error submit!!");
          return false;
        }
      });
    },

vuex里定义的方法 ,在actions里面

 //执行上下文 this.$store.dispatch('login_action')
    login(context, user) {
        // let user = {username:"zhangsan001",password:"admin123"}
        // console.log(user,"userInfo")
        console.log(user, '===================user');
        Axios.post('/user', {
            data: user
        }).then((res) => {
            console.log(res, '==============res');
            if (res.data.meta.status == 200) {
                // context.commit('SET_TOKEN', res.data.data.access_token);
                // console.log(context.commit("SET_TOKEN", res.data.data.access_token),"===================token==========")
                // context.commit("SET_NAME", res.data.data.loginname)
                // context.commit('SET_token_type', res.data.data.token_type);
                // setCookie('SET_token_type', res.data.data.token_type);
                // setCookie('SET_TOKEN', res.data.data.access_token);
                // localStorage.setItem('ms_username', res.data.data.token_type);
                Message({
                    message: '登录成功',
                    type: 'success',
                    duration: 2500
                });
                setTimeout(() => {
                    // this.$router.push('/');
                    router.push('/').catch(() => {});
                });
            } else {
                Message({
                    message: '用户名或密码错误',
                    type: 'error',
                    duration: 2500
                });
            }
        });
        // login(user).then((res) => {
        //     console.log(res, '==============res');
        //     if (res.status == 200) {
        //         context.commit('SET_TOKEN', res.data.data.access_token);
        //         // console.log(context.commit("SET_TOKEN", res.data.data.access_token),"===================token==========")
        //         // context.commit("SET_NAME", res.data.data.loginname)
        //         context.commit('SET_token_type', res.data.data.token_type);
        //         setCookie('SET_token_type', res.data.data.token_type);
        //         setCookie('SET_TOKEN', res.data.data.access_token);
        //         localStorage.setItem('ms_username', res.data.data.token_type);
        //         Message({
        //             message: '登录成功',
        //             type: 'success',
        //             duration: 2500
        //         });
        //         setTimeout(() => {

        //             // this.$router.push('/');
        //             router.push('/').catch(() => {});
        //         });
        //     } else {
        //         Message({
        //             message: '用户名或密码错误',
        //             type: 'error',
        //             duration: 2500
        //         });
        //     }
        // });
    },

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mock.js配合vuex进行登录获取token 的相关文章

随机推荐

  • 时间序列算法Prophet代码实现——以天气预测模型为例

    最近在做销售量预测模型相关的项目 重新拾起时间序列算法 包括AR 自回归模型 MA 移动平均模型 ARIMA 差分回归移动平均模型 等 综合预测效果想要特别记录时间序列中的Prophet算法 操作简单 效果显著 一 算法简介 Prophet
  • 【满分】【华为OD机试真题2023 JAVA&JS】优雅数组

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 优雅数组 知识点双指针数组滑窗 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 如果一个数组中出现次数最多的元素出现大于等于k次 被称为 k 优雅数组 k也可以被
  • python 区块链学习(一) 单链结构实现

    最近在纠结以后的研究方向 就先看了看云链 即一种云计算 区块链 物联网设备的架构模式 虽然还是雨里雾里 还是决定先把区块链的编程落实一下 python 区块链学习 二 python 区块链学习 三 0x00 系统环境 本次使用的为Pytho
  • pycharm注释快捷键

    选中需要注释的行代码 按ctrl 进行注释
  • 分红 10 亿,小游戏《羊了个羊》背后实控人拿走 3亿 !股价暴跌 38%

    关注后回复 进群 拉你进程序员交流群 一个月前 一款名为 羊了个羊 的突然爆火 让无数人沉迷不可自拔 但正如一颗流星 昙花一现的它很快消失在公众视野中 10月10日 厦门吉比特技术公司披露 其间接持有 羊了个羊 开发商北京简游科技20 的股
  • git idea 如何删除本地分支_在intellij idea 中怎么不用git 解除关联

    展开全部 file gt settings gt version control 选中这一栏 右边有个 点红色减号 就解除了 然后去项目目录下删除 git这个文件夹 你可以不删除 为了以后继续关联62616964757a686964616f
  • 使用IDEA构建jar然后转执行程序exe的爬坑

    https download csdn net download leoysq 87939492 构建jar
  • Storybook(一)

    TOC 欢迎使用Storybook 你好 这是你第一次使用 Storybook 这个工具 如果你想学习如何使用Storybook 可以仔细阅读这篇文章 了解一下Storybook的基本知识 基本用法 我们对Storybook进行了一些说明
  • 简单的个人介绍网页-主页面【附代码】

    主页面 代码1 style css nav height 41px border top 3px solid b4fffa border bottom 1px solid edeef0 background color fcfcfc lin
  • 微机原理中操作数位置总结

    立即数 立即数在CS里 CS在存储器里 但和存储器操作数有本质的区别 但是不属于存储器数的一种 本质上是立即数寻址而不是存储器寻址 寄存器数 在cup内部 AX BX CX DX属于EU部件 存储器操作数 1看他有没有段超越前缀 超越到了什
  • 在职的我竟然一次通过了注册测绘师考试(注册测绘师备考经验分享)

    先上一波成绩吧 首先说一下我是万万没想到案例能过的 本来做好二战准备的 认为案例答的不够全面 时间不够了 既然过了那我就回想下从几个方面简短的整理下经验吧 没过的话叫教训 希望帮助给后面的同学 时间准备 确切的开始时间记不清了 但应该是20
  • Unity SpriteAtlas 打包AssetBundle的一些问题总结

    1 新版sprite要打包成图集 需要手动创建SpriteAtlas资源 然后选择需要打包进图集资源的Sprite目录或资源文件 参考 https docs unity3d com Manual class SpriteAtlas html
  • 从入门到入土:[SEED-Lab]- Packet Sniffing and Spoofing Lab

    此博客仅用于记录个人学习进度 学识浅薄 若有错误观点欢迎评论区指出 欢迎各位前来交流 部分材料来源网络 若有侵权 立即删除 本人博客所有文章纯属学习之用 不涉及商业利益 不合适引用 自当删除 若被用于非法行为 与我本人无关 SEED Lab
  • UE4 后处理材质 镜头光晕(Lensflare)效果

    介绍 基于PostProcessMaterial实现镜头光晕 Lensflare 的效果 不使用UE自带的Lensflare 在ShaderToy上发现一个好看的 ShaderToy地址 ShaderToyLensflareSample 将
  • Java面向对象编程

    上网的时候 访问某个网页却突然出现了某个运营商的网页 如联通 电信 出现此问题可能的原因是 A DNS劫持 B DDoS攻击 C MAC地址欺骗 D 伪造DHCP服务器 答案 A TCP建立连接的三次握手中 第二次握手发送的包会包含的标记
  • Vue3 使用 jsx

    使用 jsx 格式文件 和 defineComponent 引用自定义组件 传递属性 基本使用 child jsx 组件的配置 demo jsx setup 函数 父组件引用 import demo from components demo
  • 课堂实验-【集成学习】

    实验名称 实验 集成学习 实验目的 1 了解决策树 随机森林理论基础 2 平台实现算法 3 编程实现决策树 随机森林算法 实验原理 决策树 Decision Tree 是在已知各种情况发生概率的基础上 通过构成决策树来求取净现值的期望值大于
  • 【pandas】TypeError: concat() got multiple values for argument 'axis'

    TypeError concat got multiple values for argument axis 原代码 var LotArea data pd concat df train SalePrice df train var ax
  • Hive--添加/更改表字段类型

    Hive添加表字段 新增字段表 alter table 表名 add columns 字段名 数据类型 alter table table name add columns c time string comment 当前时间 正确 添加在
  • Mock.js配合vuex进行登录获取token

    新项目 后端数据还没准备好 没办法直接从后端获取接口数据 于是我利用Mock简单实现一下这个功能 以作为测试用 首先 利用 cnpm install mockjs save dev 指令安装完mock后 在项目里创建文件夹mock 再创建i