1.数据模板定义规范
1.1 npm i mockjs
1.2 npm i @types/mockjs:mock的js
运行mock文件命令如下:(当然也可以在控制台输出)
npm install --save-dev typescript ts-node @types/node
npx ts-node index.ts
1.3 控制台查看mock结果
多试几次,都是random值
1.4 不同数据类型的模板
通常遵循以下:
生成规则:
1.4.1 值为字符串
1.4.2 值为正则表达式
import Mock from 'mockjs'
let data = Mock.mock({
// 重复5次列表
"list|3":[
{
'邮箱': /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
'用户名': /^[a-zA-Z][a-zA-Z0-9_]{3,19}$/,
'手机号': /^1[3-9]\d{9}$/,
'年龄': /^([1-9]\d?|1[01]\d|120)$/,
'性别': /^[男女MF]|Male|Female$/,
'状态': /^(active|inactive|deleted|pending)$/,
'ID': /^\d{1,10}$/
}
]
})
console.log(data)
1.4.3 占位符
占位符 只在属性值字符串中占位置 并不出现在最终的属性值中 需要import方法
import { Random } from 'mockjs'
占位符格式如下:
1.4.3.1 图片占位符
图片占位符示例:
import Mock from 'mockjs'
const { Random } = Mock
let data = Mock.mock({
// 重复5次列表
"list|3":[
{
("参数大小",“背景色”,“文字颜色”,“图片类型后缀”,“你好”) "b":Random.image("200x100","#000","#fff","png","图片",“你好”)
}
]
})
// console.log(JSON.stringify(data))
console.log(data)
效果:
1.4.3.1 中文占位符
import Mock from 'mockjs'
const { Random } = Mock
let data = Mock.mock({
// 重复5次列表
"list|3":[
{
"中文单词":"@cword(2,4)",
"中文句子":"@csentence(8,15)",
"中文段落":"@cparagraph(1,10)",
"中文标题":"@ctitle(2,4)"
}
]
})
// console.log(JSON.stringify(data))
console.log(data)
1.4.3.2 常见占位符
import Mock from 'mockjs'
const { Random } = Mock
let data = Mock.mock({
// 常见的测试字段
"list|3":[
{
"url":"@url('http')",
"ip":"@ip()",
"email":"@email()",
"city":"@city()",
"id":"@id()",
"name":"@cname()"
}
]
})
// console.log(JSON.stringify(data))
console.log(data)
1.4.3.3 拓展占位符
使用自定义一个方法进行自定义占位符
import Mock from 'mockjs'
const { Random } = Mock
Random.extend({
'tt':function(){
return this.pick(['a','b','c','d','e','f'])
}
})
let data = Mock.mock({
// 常见的测试字段
"list|3":[
{
"tt":"@tt()"
}
]
})
// console.log(JSON.stringify(data))
console.log(data)
2. 拦截axios请求(重点)
·可以给每一个请求写一个mock的规则,不需要后端接口也可以跑前端
·需要注意的是,需要在发送请求之前把mock的拦截写上
MockJS 必须提前注册拦截规则
2.1 先在ts中定义好用户字段和响应字段
//axios.d.ts
export interface User {
id: number;
name: string;
age: number;
email: string;
city: string;
address: string;
}
// resopnse.d.ts
import { User } from './axios.d';
export interface ResponseData<T> {
code: number;
data: User[];
message: string;
}
2.2 在axios前使用mock
流程:设置axios的baseURL==》配置mock拦截器,定义mock字段==》使用axios的try、catch进行拦截处理======》成功则保存user信息,再在标签中使用for循环将获取到的信息遍历(这里没有截取、可以自行尝试)
// axios.vue
<script lang="ts">
import { defineComponent, ref } from "vue";
import axios from "axios";
import Mock from "mockjs";
import { message } from "ant-design-vue";
import { User } from "../types/axios";
import { ResponseData } from "../types/response";
export default defineComponent({
name: "AxiosDemo",
setup() {
const users = ref<User[]>([]);
const loading = ref(false);
const messageText = ref("");
const messageType = ref<"success" | "error" | "info">("info");
const responsedata = ref<ResponseData<User[]>>();
// 表格列配置
const columns = [
{
title: "ID",
dataIndex: "id",
key: "id",
width: 80,
},
{
title: "姓名",
dataIndex: "name",
key: "name",
},
{
title: "年龄",
dataIndex: "age",
key: "age",
width: 100,
},
{
title: "邮箱",
dataIndex: "email",
key: "email",
},
{
title: "城市",
dataIndex: "city",
key: "city",
},
{
title: "地址",
dataIndex: "address",
key: "address",
},
];
// 设置axios基础URL
axios.defaults.baseURL = "http://localhost:3000";
// 配置MockJS拦截器
Mock.mock("http://localhost:3000/users", "get", () => {
return {
code: 200,
data: Mock.mock({
"data|3-5": [
{
"id|+1": 1,
name: "@cname",
"age|18-30": 18,
email: "@email(qq.com)",
city: "@city",
address: "@county(true)",
},
],
}).data,
msg: "success",
};
});
// 获取用户列表的方法
const fetchUsers = async (): Promise<void> => {
loading.value = true;
try {
const response = await axios.get<ResponseData<User[]>>("/users");
if (response.data.code === 200) {
users.value = response.data.data;
message.success(`成功获取 ${response.data.data.length} 条用户数据`);
console.log("获取用户列表成功:", response.data);
}
} catch (error) {
message.error("获取用户列表失败");
console.error("获取用户列表失败:", error);
} finally {
loading.value = false;
}
};
return {
users,
loading,
message: messageText,
messageType,
columns,
responsedata,
fetchUsers,
};
},
});
</script>
结果:
2.2 随机生成statucode,模拟真实响应码
// 配置MockJS拦截器 - 修复所有错误
Mock.mock("http://localhost:3000/users", "get", () => {
// 生成随机状态码(200 或 500)
const statusCode = Math.random() > 0.5 ? 200 : 500;
const code = statusCode;
const isSuccess = code === 200;
return {
code: code,
data: isSuccess
? Mock.mock({
"data|3-5": [
{
"id|+1": 1,
name: "@cname",
"age|18-30": 18,
email: "@email(qq.com)",
city: "@city",
address: "@county(true)",
},
],
}).data
: [],
msg: isSuccess ? "success" : "failed",
};
});