帖子分类
Change-Id: I17bafbfe3c1c8fd26c1e12499cb3c17cd1738e23
diff --git a/src/mock/auth.js b/src/mock/auth.js
index 3cc837b..272d8b7 100644
--- a/src/mock/auth.js
+++ b/src/mock/auth.js
@@ -1,16 +1,63 @@
import Mock from 'mockjs';
import MockAdapter from 'axios-mock-adapter';
-import {postUserLogin} from '@/api/auth'; // Import the API endpoint
+import {postUserLogin, getRefreshToken} from '@/api/auth'; // Import the API endpoint
+
+
+function generateToken(userId, role) {
+ const exp = Math.floor(Date.now() / 1000) + 60 * 60;
+
+ // 生成 JWT Header
+ const header = {
+ alg: 'HS256', // 签名算法
+ typ: 'JWT', // 类型
+ };
+
+ // 生成 JWT Payload
+ const payload = {
+ userId,
+ role,
+ exp,
+ };
+
+ // Base64 编码 Header 和 Payload
+ const base64Header = btoa(JSON.stringify(header));
+ const base64Payload = btoa(JSON.stringify(payload));
+
+ // 模拟 Signature(实际应使用密钥进行 HMAC-SHA256 签名)
+ const signature = btoa('mock-signature'); // 简单模拟签名
+
+ // 拼接 JWT Token
+ const token = `${base64Header}.${base64Payload}.${signature}`;
+ return token;
+}
/**
* 设置用户相关的 Mock 接口
* @param {MockAdapter} mock
*/
-export function setupAuthMock(mock){
- mock.onPost(postUserLogin).reply(config => {
- let data = Mock.mock({
- "token": '11111111111111111',
- });
- return [200, data];
+export function setupAuthMock(mock) {
+ mock.onPost(postUserLogin).reply(config => {
+ const data = JSON.parse(config.data);
+ if(data.email === 'admin@1' && data.password === '123456'){
+ // 模拟用户登录数据
+ const token = generateToken(1, 'admin');
+
+ // 返回模拟的 Token
+ let data = Mock.mock({
+ token,
});
-}
+ return [200, data];
+ }else{
+ return [401, {message: '用户名或密码错误'}];
+ }
+ });
+ mock.onGet(getRefreshToken).reply(config => {
+ // 模拟用户登录数据
+ const token = generateToken(1, 'admin'); // 这里的 1 和 'admin' 可以根据需要修改
+ // 返回模拟的 Token
+ let data = Mock.mock({
+ token,
+ });
+ return [200, data];
+ })
+}
diff --git a/src/mock/comment.d.ts b/src/mock/comment.d.ts
new file mode 100644
index 0000000..2ed6cca
--- /dev/null
+++ b/src/mock/comment.d.ts
@@ -0,0 +1,3 @@
+import type MockAdapter from 'axios-mock-adapter';
+
+export declare function setupCommentMock(mock: MockAdapter): void;
\ No newline at end of file
diff --git a/src/mock/comment.js b/src/mock/comment.js
new file mode 100644
index 0000000..695ccc4
--- /dev/null
+++ b/src/mock/comment.js
@@ -0,0 +1,34 @@
+import mockjs from "mockjs";
+import MockAdapter from "axios-mock-adapter";
+import { getPostComments} from "@/api/comment";
+
+export function setupCommentMock(mock) {
+ const getPostCommentsPattern = new RegExp(`^${getPostComments}/\\d+$`);
+ mock.onGet(getPostCommentsPattern).reply(config => {
+ let data = mockjs.mock({
+ [`list|5`]: [
+ {
+ "commentId|+1": 1, // 自增评论 ID
+ "content": "@cparagraph(1, 3)", // 随机生成 1-3 段评论内容
+ "createdAt": "@datetime('T')", // 随机生成时间戳
+ "parentCommentId": null, // 顶级评论的父评论 ID 为 null
+ "postId|1-100": 1, // 随机生成帖子 ID
+ "userId|1-100": 1, // 随机生成用户 ID
+ "replies|0-3": [ // 随机生成 0-3 条子评论
+ {
+ "commentId|+1": 100, // 子评论的 ID 从 100 开始自增
+ "content": "@cparagraph(1, 2)", // 随机生成 1-2 段子评论内容
+ "createdAt": "@datetime('T')", // 随机生成时间戳
+ "parentCommentId": "@increment(1)", // 父评论 ID
+ "postId|1-100": 1, // 随机生成帖子 ID
+ "userId|1-100": 1, // 随机生成用户 ID
+ "replies": [] // 子评论的子评论为空
+ }
+ ]
+ },
+ ],
+ });
+ return [200, data.list];
+ });
+
+}
\ No newline at end of file
diff --git a/src/mock/index.ts b/src/mock/index.ts
index fabb34e..4429216 100644
--- a/src/mock/index.ts
+++ b/src/mock/index.ts
@@ -3,6 +3,7 @@
import {setupAuthMock} from './auth'
import { setupUserMock } from './user';
import { setupPostMock } from './post';
+import { setupCommentMock } from './comment';
// 创建 Mock 实例
export const mock = new MockAdapter(instance, {
@@ -18,9 +19,8 @@
setupAuthMock(mock)
setupUserMock(mock)
setupPostMock(mock)
+ setupCommentMock(mock)
console.log('Mock 模块已加载')
}
-// 自动执行
-setupMock()
\ No newline at end of file
diff --git a/src/mock/post.js b/src/mock/post.js
index abdfc6a..63f4413 100644
--- a/src/mock/post.js
+++ b/src/mock/post.js
@@ -1,17 +1,83 @@
import Mock from 'mockjs';
import MockAdapter from 'axios-mock-adapter';
-import {hotPosts} from '@/api/post'
+import {getHotPosts, getLikePosts, getPosts, getPostDetail} from '@/api/post'
/**
* 设置用户相关的 Mock 接口
* @param {MockAdapter} mock
*/
export function setupPostMock(mock){
- mock.onGet(hotPosts).reply(config => {
- let data = Mock.mock([{
- 'title':'test title',
- 'date':'2025-4-20'
- }]);
+ const hotPostsPattern = new RegExp(`^${getHotPosts}(\\?page=\\d+&size=\\d+)?$`);
+ const LikePostsPattern = new RegExp(`^${getLikePosts}(\\?page=\\d+&size=\\d+)?$`);
+ const searchPostsPattern = new RegExp(`^${getPosts}\\?((keyword=[^&]+&?)|(tags=[^&]+&?)|(author=[^&]+&?)|)+(page=\\d+)&(pageSize=\\d+)$`);
+ mock.onGet(hotPostsPattern).reply(config => {
+ const urlParams = new URLSearchParams(config.url.split('?')[1]);
+ const size = parseInt(urlParams.get('size')) || 10;
+ let data = Mock.mock({
+ [`list|${size}`]: [
+ {
+ 'postId|+1': 1,
+ 'postTitle': '@ctitle(5, 10)',
+ 'postContent': '@cparagraph(1, 3)',
+ 'author': '@cname()',
+ 'createdAt': '@date("yyyy-MM-dd")',
+ 'viewCount|1-100': 1,
+ },
+ ],
+ });
+ return [200, data.list];
+ });
+ mock.onGet(LikePostsPattern).reply(config => {
+ const urlParams = new URLSearchParams(config.url.split('?')[1]);
+ const size = parseInt(urlParams.get('size')) || 10;
+ let data = Mock.mock({
+ [`list|${size}`]: [
+ {
+ 'postId|+1': 1,
+ 'postTitle': '@ctitle(5, 10)',
+ 'postContent': '@cparagraph(1, 3)',
+ 'author': '@cname()',
+ 'createdAt': '@date("yyyy-MM-dd")',
+ 'viewCount|1-100': 1,
+ },
+ ],
+ });
+ return [200, data.list];
+ });
+ mock.onGet(searchPostsPattern).reply(config => {
+ const urlParams = new URLSearchParams(config.url.split('?')[1]);
+ const tags = urlParams.get('tags')?.split(',') || []; // 将 tags 参数解析为数组
+ const page = parseInt(urlParams.get('page')) || 1; // 默认 page 为 1
+ const size = parseInt(urlParams.get('size')) || 10; // 默认 size 为 10
+ let data = Mock.mock({
+ [`list|${size}`]: [
+ {
+ 'postId|+1': 1,
+ 'postTitle': '@ctitle(5, 10)',
+ 'postContent': '@cparagraph(1, 3)',
+ 'author': '@cname()',
+ 'createdAt': '@date("yyyy-MM-dd")',
+ 'viewCount|1-100': 1,
+ },
+ ],
+ });
+ return [200, data.list];
+ });
+
+
+ const getPostDetailPattern = new RegExp(`^${getPostDetail}/[0-9]+$`);
+ mock.onGet(getPostDetailPattern).reply(config => {
+ const postId = config.url.split('/').pop();
+ let data = Mock.mock({
+ 'postId': postId,
+ 'postTitle': '@ctitle(5, 10)',
+ 'postContent': '@cparagraph(1, 3)',
+ 'author': '@cname()',
+ 'createdAt': '@date("yyyy-MM-dd")',
+ 'viewCount|1-100': 1,
+ });
return [200, data];
});
+
+
}