实现vue3配置mockjs

2,273 阅读1分钟

本文用来记录使用vue3+ts+element-plus+mockjs的资料
第一步:安装依赖
npm i mockjs -D;
npm i @type/mockjs -D
第二步: 在src下创建:mock文件夹如下图:

image.png

index.js中配置:

import Mock from 'mockjs'
import login from './data/login.json'

Mock.mock('/mock/login', {
  code: 200,
  data:login
})

login.json文件:

{
  "code":200,
  "msg":"登录成功",
  "data":{
    "token":"abc",
    "authority":[
      {
        "path":"/order",
        "name":"Order",
        "meta":{
          "title":"订单列表",
          "isShow":true
        }
      },
      {
        "path":"/userList",
        "name":"UserList",
        "meta":{
          "title":"用户列表",
          "isShow":true
        }
      },
      {
        "path":"/roleList",
        "name":"RoleList",
        "meta":{
          "title":"角色列表",
          "isShow":true
        }
      },
      {
        "path":"/tauthority",
        "name":"Tauthority",
        "meta":{
          "title":"权限列表",
          "isShow":false
        }
      }
    ]
  }
}

axios配置文件中:

import axios from "axios";
import { ElMessage } from 'element-plus'

enum MSGS  {
  '操作成功'= 200,
  '密码错误',
  '账号错误',
  '请求异常'
}

const request = axios.create({
  baseURL: '/mock',
  timeout: 2000,
  headers: {
    "Content-Type":'application/json;charset:utf-8'
  }
})
// 请求拦截器
request.interceptors.request.use(config => {
  config.headers=config.headers || {}
  if (localStorage.getItem('token')) {
    config.headers.token = localStorage.getItem('token') || ''
  }
  return config
})
// 响应拦截器
request.interceptors.response.use(res => {
  const code: number = res.data.code
  if (code === 200) {
    ElMessage(MSGS[code])
    // return Promise.reject(res.data)
  }
  return res.data
}, err => {
  console.log(err,'0000000000000000');
})

export default request

main.ts文件中配置:

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
import router from './router'
import '@/mock'
// if(process.env.NODE_ENV==="development") Mock()
createApp(App).use(router).use(ElementPlus).mount('#app') 

最后就可以在接口文件里使用了:

import request from './index'

interface loginData{
  userName: string,
  password:string
}

export const login = (data:loginData) => request({
  url: '/login',
  method: 'post',
  data,
})

业务代码:

<template>
   <el-form
    ref="loginFormRef"
    :model="loginForm"
    :rules="rules"
    status-icon
    label-width="120px"
    class="demo-loginForm"
  >
    <el-form-item label="账号" prop="userName">
      <el-input v-model="loginForm.userName" type="userName" autocomplete="off" />
    </el-form-item>
    <el-form-item label="密码" prop="password">
      <el-input
        v-model="loginForm.password"
        type="password"
        autocomplete="off"
      />
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm(loginFormRef)"
        >Submit</el-button
      >
    </el-form-item>
  </el-form>
</template>

<script lang='ts'>
import { defineComponent, Ref, reactive, toRefs } from 'vue'
import { useRouter } from "vue-router";
import { InitData } from '../types/login'
import { login } from "../api/login";
// 用defineComponent进行包裹,会有很多的这种小提示。
export default defineComponent({

   setup () {
    const data = reactive(new InitData())
    const router=useRouter()
    const submitForm = (loginFormRef:any)=>{
      loginFormRef?.validate((valid:boolean) => {
        if (valid) {
          login(data.loginForm).then(res => {
            router.push('/')
            console.log(res,'登录成功')
          })
        } else {
          console.log(valid,'登录失败')
        }
      })
    }
    const rules = {
      userName: [{ required: true, message: '请输入账号', trigger: 'blur' }],
      password:[{required:true,message:'请输入密码',trigger:'blur'}]
    }

     return {
       ...toRefs(data),
      rules,
      submitForm,
     }
   }
})
</script>


<style lang='scss' scoped>
  .demo-loginForm{
    width: 350px;
    border: 1px solid #333;
  }
</style>