帖子分类

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];
       });
+
+
 }