feat(auth): 实现登录注册功能并重构 App 组件
- 新增登录和注册页面组件
- 实现用户认证和权限管理逻辑
- 重构 App 组件,使用 Router 和 AuthProvider
- 添加管理员面板和论坛页面组件
Change-Id: Iaa4502616970e75e3268537f73c75dac8f60e24d
diff --git a/src/mock/index.js b/src/mock/index.js
index 8fd2118..46a5209 100644
--- a/src/mock/index.js
+++ b/src/mock/index.js
@@ -9,89 +9,240 @@
const users = [
{
id: 1,
- username: 'admin',
- password: 'admin123',
- email: 'admin@example.com',
- role: 'admin',
- avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=admin'
+ username: 'LukasWu',
+ password: '060050bbb',
+ email: '22301102@bjtu.edu.cn',
+ role: 'user',
+ userType: 0, // 普通用户
+ avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=LukasWu',
+ createTime: '2025-05-13 17:51:08'
},
{
id: 2,
- username: 'user',
- password: 'user123',
- email: 'user@example.com',
- role: 'user',
- avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=user'
+ username: 'IcyIron',
+ password: '111111',
+ email: 'icyiron@example.com',
+ role: 'admin',
+ userType: 1, // 管理员
+ avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=IcyIron',
+ createTime: '2025-05-13 18:00:00'
},
{
id: 3,
- username: 'moderator',
- password: 'mod123',
- email: 'mod@example.com',
- role: 'moderator',
- avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=moderator'
+ username: 'tanzhennan727',
+ password: 'password123',
+ email: 'tanzhennan727@example.com',
+ role: 'user',
+ userType: 0,
+ avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=tanzhennan727',
+ createTime: '2025-05-14 10:00:00'
},
{
id: 4,
- username: 'blacklisted',
- password: 'black123',
- email: 'black@example.com',
- role: 'blacklisted',
- avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=blacklisted'
- },
- {
- id: 5,
- username: 'veteran',
- password: 'vet123',
- email: 'veteran@example.com',
- role: 'veteran',
- avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=veteran'
- },
- {
- id: 6,
- username: 'newbie',
- password: 'new123',
- email: 'newbie@example.com',
- role: 'newbie',
- avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=newbie'
+ username: 'ybt',
+ password: 'ybt123',
+ email: 'ybt@example.com',
+ role: 'user',
+ userType: 0,
+ avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=ybt',
+ createTime: '2025-05-15 14:30:00'
}
]
-// 模拟登录接口
-Mock.mock('/api/auth/login', 'post', (options) => {
- const { username, password } = JSON.parse(options.body)
- const user = users.find(u => u.username === username && u.password === password)
+// 模拟帖子数据
+const posts = [
+ {
+ id: 1,
+ title: '如何成为云顶高手',
+ content: '向icyiron学习',
+ author: 'LukasWu',
+ createTime: '2025-05-18 16:43:51',
+ views: 256,
+ likes: 57
+ },
+ {
+ id: 101,
+ title: '北京交通大学实训心得',
+ content: '实训非常有趣,学到了很多知识',
+ author: 'LukasWu',
+ createTime: '2025-05-17 09:30:00',
+ views: 128,
+ likes: 32
+ },
+ {
+ id: 102,
+ title: '前端开发技巧分享',
+ content: 'React和Vue的使用经验总结...',
+ author: 'IcyIron',
+ createTime: '2025-05-16 15:20:00',
+ views: 345,
+ likes: 89
+ },
+ {
+ id: 103,
+ title: '后端接口设计规范',
+ content: 'RESTful API设计的最佳实践...',
+ author: 'tanzhennan727',
+ createTime: '2025-05-15 11:10:00',
+ views: 210,
+ likes: 45
+ },
+ {
+ id: 104,
+ title: '数据库优化技巧',
+ content: 'MySQL索引优化与查询性能提升...',
+ author: 'ybt',
+ createTime: '2025-05-14 16:40:00',
+ views: 178,
+ likes: 36
+ },
+ {
+ id: 105,
+ title: '云顶之弈攻略',
+ content: '最强阵容搭配与装备选择...',
+ author: 'IcyIron',
+ createTime: '2025-05-13 20:15:00',
+ views: 567,
+ likes: 120
+ }
+]
+
+// 模拟评论数据
+const comments = [
+ {
+ id: 1001,
+ postId: 105,
+ content: '感谢分享,学到了很多!',
+ author: 'LukasWu',
+ createTime: '2025-05-19 12:30:15'
+ },
+ {
+ id: 1002,
+ postId: 105,
+ content: '这个阵容我试了,确实很强',
+ author: 'tanzhennan727',
+ createTime: '2025-05-19 14:25:30'
+ },
+ {
+ id: 1003,
+ postId: 101,
+ content: '实训课程安排得很合理',
+ author: 'ybt',
+ createTime: '2025-05-18 10:15:45'
+ },
+ {
+ id: 1004,
+ postId: 102,
+ content: 'React Hooks确实好用',
+ author: 'LukasWu',
+ createTime: '2025-05-17 16:40:20'
+ },
+ {
+ id: 1005,
+ postId: 103,
+ content: '接口文档写得很清晰',
+ author: 'IcyIron',
+ createTime: '2025-05-16 09:35:10'
+ }
+]
+
+// 生成JWT格式的token
+const generateToken = (username, userType) => {
+ const header = { alg: 'HS256', typ: 'JWT' };
+ const payload = {
+ username: username,
+ userType: userType,
+ exp: Math.floor(Date.now() / 1000) + 86400 // 24小时后过期
+ };
+
+ // Base64编码
+ const encodeBase64 = (obj) => {
+ return btoa(JSON.stringify(obj)).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
+ };
+
+ const headerEncoded = encodeBase64(header);
+ const payloadEncoded = encodeBase64(payload);
+
+ // 在实际应用中应该使用正确的签名算法,这里简化处理
+ const signature = encodeBase64(`${username}-${Date.now()}`);
+
+ return `${headerEncoded}.${payloadEncoded}.${signature}`;
+};
+
+// 验证token
+const verifyToken = (token) => {
+ if (!token) return false;
+
+ try {
+ // 解析token的payload部分
+ const parts = token.split('.');
+ if (parts.length !== 3) return false;
+
+ const payload = JSON.parse(atob(parts[1].replace(/-/g, '+').replace(/_/g, '/')));
+ const now = Math.floor(Date.now() / 1000);
+
+ // 检查过期时间
+ if (payload.exp <= now) return false;
+
+ // 检查用户是否存在
+ const user = users.find(u => u.username === payload.username);
+ if (!user) return false;
+
+ return { valid: true, user, userType: payload.userType };
+ } catch (e) {
+ return false;
+ }
+};
+
+// 用户信息相关接口
+
+// 1. 用户登录
+Mock.mock('/user/login', 'post', (options) => {
+ const body = JSON.parse(options.body);
+ const { username, password } = body;
+
+ const user = users.find(u => u.username === username && u.password === password);
if (user) {
- const { password, ...userWithoutPassword } = user
+ const token = generateToken(user.username, user.userType);
+
return {
code: 200,
message: '登录成功',
+ success: true,
data: {
- token: `mock-token-${user.id}-${Date.now()}`,
- user: userWithoutPassword
+ token,
+ user: {
+ id: user.id,
+ username: user.username,
+ email: user.email,
+ role: user.role,
+ userType: user.userType,
+ avatar: user.avatar
+ }
}
- }
+ };
} else {
return {
code: 401,
message: '用户名或密码错误',
- data: null
- }
+ success: false
+ };
}
-})
+});
-// 模拟注册接口
-Mock.mock('/api/auth/register', 'post', (options) => {
- const { username, email, password } = JSON.parse(options.body)
+// 2. 用户注册
+Mock.mock('/user/register', 'post', (options) => {
+ const body = JSON.parse(options.body);
+ const { username, password, email } = body;
// 检查用户名是否已存在
if (users.some(u => u.username === username)) {
return {
code: 400,
message: '用户名已存在',
- data: null
- }
+ success: false
+ };
}
// 检查邮箱是否已存在
@@ -99,8 +250,8 @@
return {
code: 400,
message: '邮箱已被注册',
- data: null
- }
+ success: false
+ };
}
// 创建新用户
@@ -109,39 +260,671 @@
username,
password,
email,
- role: 'newbie', // 默认为新人角色
- avatar: `https://api.dicebear.com/7.x/avataaars/svg?seed=${username}`
- }
+ role: 'user',
+ userType: 0, // 普通用户
+ avatar: `https://api.dicebear.com/7.x/avataaars/svg?seed=${username}`,
+ createTime: new Date().toISOString().replace('T', ' ').substring(0, 19)
+ };
- users.push(newUser)
+ users.push(newUser);
+
+ const token = generateToken(newUser.username, newUser.userType);
return {
code: 200,
message: '注册成功',
- data: null
- }
-})
+ success: true,
+ data: {
+ token,
+ user: {
+ id: newUser.id,
+ username: newUser.username,
+ email: newUser.email,
+ role: newUser.role,
+ userType: newUser.userType,
+ avatar: newUser.avatar
+ }
+ }
+ };
+});
-// 模拟获取用户信息接口
-Mock.mock('/api/user/info', 'get', (options) => {
- // 在实际应用中,这里会从token中解析用户ID
- // 这里简化处理,假设已登录用户是admin
- const user = users.find(u => u.username === 'admin')
+// 3. 修改用户名
+Mock.mock('/user/update/username', 'post', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
- if (user) {
- const { password, ...userWithoutPassword } = user
+ if (!auth || !auth.valid) {
+ return {
+ code: 401,
+ message: '未授权访问',
+ success: false
+ };
+ }
+
+ const body = JSON.parse(options.body);
+ const { username, newUsername } = body;
+
+ // 检查用户名是否存在
+ const userIndex = users.findIndex(u => u.username === username);
+ if (userIndex === -1) {
+ return {
+ code: 404,
+ message: '用户不存在',
+ success: false
+ };
+ }
+
+ // 检查新用户名是否已被使用
+ if (users.some(u => u.username === newUsername && u.id !== users[userIndex].id)) {
+ return {
+ code: 400,
+ message: '用户名已存在',
+ success: false
+ };
+ }
+
+ // 更新用户名
+ users[userIndex].username = newUsername;
+ users[userIndex].avatar = `https://api.dicebear.com/7.x/avataaars/svg?seed=${newUsername}`;
+
+ return {
+ code: 200,
+ message: '用户名修改成功',
+ success: true,
+ data: {
+ user: {
+ id: users[userIndex].id,
+ username: users[userIndex].username,
+ email: users[userIndex].email,
+ role: users[userIndex].role,
+ userType: users[userIndex].userType,
+ avatar: users[userIndex].avatar
+ }
+ }
+ };
+});
+
+// 4. 修改密码
+Mock.mock('/user/update/password', 'post', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid) {
+ return {
+ code: 401,
+ message: '未授权访问',
+ success: false
+ };
+ }
+
+ const body = JSON.parse(options.body);
+ const { username, newPassword } = body;
+
+ // 检查用户名是否存在
+ const userIndex = users.findIndex(u => u.username === username);
+ if (userIndex === -1) {
+ return {
+ code: 404,
+ message: '用户不存在',
+ success: false
+ };
+ }
+
+ // 更新密码
+ users[userIndex].password = newPassword;
+
+ return {
+ code: 200,
+ message: '密码修改成功',
+ success: true
+ };
+});
+
+// 5. 修改邮箱
+Mock.mock('/user/update/email', 'post', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid) {
+ return {
+ code: 401,
+ message: '未授权访问',
+ success: false
+ };
+ }
+
+ const body = JSON.parse(options.body);
+ const { username, newEmail } = body;
+
+ // 检查用户名是否存在
+ const userIndex = users.findIndex(u => u.username === username);
+ if (userIndex === -1) {
+ return {
+ code: 404,
+ message: '用户不存在',
+ success: false
+ };
+ }
+
+ // 检查邮箱是否已被使用
+ if (users.some(u => u.email === newEmail && u.id !== users[userIndex].id)) {
+ return {
+ code: 400,
+ message: '邮箱已被注册',
+ success: false
+ };
+ }
+
+ // 更新邮箱
+ users[userIndex].email = newEmail;
+
+ return {
+ code: 200,
+ message: '邮箱修改成功',
+ success: true,
+ data: {
+ user: {
+ id: users[userIndex].id,
+ username: users[userIndex].username,
+ email: users[userIndex].email,
+ role: users[userIndex].role,
+ userType: users[userIndex].userType,
+ avatar: users[userIndex].avatar
+ }
+ }
+ };
+});
+
+// 6. 获取用户信息
+Mock.mock(new RegExp('/user/get/info\\?username=.+'), 'get', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid) {
+ return {
+ code: 401,
+ message: '未授权访问',
+ success: false
+ };
+ }
+
+ const url = options.url;
+ const username = url.split('username=')[1];
+
+ const user = users.find(u => u.username === username);
+ if (!user) {
+ return {
+ code: 404,
+ message: '用户不存在',
+ success: false
+ };
+ }
+
+ return {
+ code: 200,
+ message: '获取用户信息成功',
+ success: true,
+ data: {
+ user: {
+ id: user.id,
+ username: user.username,
+ email: user.email,
+ role: user.role,
+ userType: user.userType,
+ avatar: user.avatar,
+ createTime: user.createTime
+ }
+ }
+ };
+});
+
+// 帖子相关接口
+
+// 7. 新建帖子
+Mock.mock('/posts/create', 'post', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid) {
+ return {
+ code: 401,
+ message: '未授权访问',
+ success: false
+ };
+ }
+
+ const body = JSON.parse(options.body);
+ const { title, content, author } = body;
+
+ // 生成新帖子ID
+ const id = posts.length > 0 ? Math.max(...posts.map(p => p.id)) + 1 : 1;
+
+ const newPost = {
+ id,
+ title,
+ content,
+ author,
+ createTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
+ views: 0,
+ likes: 0
+ };
+
+ posts.push(newPost);
+
+ return {
+ code: 200,
+ message: '帖子发布成功',
+ success: true,
+ data: { post: newPost }
+ };
+});
+
+// 8. 查询帖子
+Mock.mock(new RegExp('/posts/list\\?.*'), 'get', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid) {
+ return {
+ code: 401,
+ message: '未授权访问',
+ success: false
+ };
+ }
+
+ const url = options.url;
+ const params = new URLSearchParams(url.split('?')[1]);
+
+ const username = params.get('username');
+ const title = params.get('title');
+ const author = params.get('author');
+ const date = params.get('date');
+
+ // 过滤帖子
+ let filteredPosts = [...posts];
+
+ if (title) {
+ filteredPosts = filteredPosts.filter(p => p.title.includes(title));
+ }
+
+ if (author) {
+ filteredPosts = filteredPosts.filter(p => p.author.includes(author));
+ }
+
+ if (date) {
+ filteredPosts = filteredPosts.filter(p => p.createTime.startsWith(date));
+ }
+
+ return {
+ code: 200,
+ message: '查询帖子成功',
+ success: true,
+ data: {
+ total: filteredPosts.length,
+ posts: filteredPosts
+ }
+ };
+});
+
+// 评论相关接口
+
+// 9. 获取帖子评论
+Mock.mock(new RegExp('/comment/get\\?.*'), 'get', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid) {
+ return {
+ code: 401,
+ message: '未授权访问',
+ success: false
+ };
+ }
+
+ const url = options.url;
+ const params = new URLSearchParams(url.split('?')[1]);
+
+ const postId = params.get('postId');
+
+ if (!postId) {
+ return {
+ code: 400,
+ message: '参数错误',
+ success: false
+ };
+ }
+
+ // 查找帖子
+ const post = posts.find(p => p.id === parseInt(postId));
+ if (!post) {
+ return {
+ code: 404,
+ message: '帖子不存在',
+ success: false
+ };
+ }
+
+ // 获取帖子的评论
+ const postComments = comments.filter(c => c.postId === parseInt(postId));
+
+ return {
+ code: 200,
+ message: '获取评论成功',
+ success: true,
+ data: {
+ total: postComments.length,
+ comments: postComments
+ }
+ };
+});
+
+// 10. 发布帖子评论
+Mock.mock('/comment/add', 'post', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid) {
+ return {
+ code: 401,
+ message: '未授权访问',
+ success: false
+ };
+ }
+
+ const body = JSON.parse(options.body);
+ const { content, username, postId } = body;
+
+ // 检查帖子是否存在
+ const post = posts.find(p => p.id === parseInt(postId));
+ if (!post) {
+ return {
+ code: 404,
+ message: '帖子不存在',
+ success: false
+ };
+ }
+
+ // 检查用户是否存在
+ const user = users.find(u => u.username === username);
+ if (!user) {
+ return {
+ code: 404,
+ message: '用户不存在',
+ success: false
+ };
+ }
+
+ // 生成评论ID
+ const id = comments.length > 0 ? Math.max(...comments.map(c => c.id)) + 1 : 1001;
+
+ const newComment = {
+ id,
+ postId: parseInt(postId),
+ content,
+ author: username,
+ createTime: new Date().toISOString().replace('T', ' ').substring(0, 19)
+ };
+
+ comments.push(newComment);
+
+ return {
+ code: 200,
+ message: '评论发布成功',
+ success: true,
+ data: { comment: newComment }
+ };
+});
+
+// 管理员相关接口
+
+// 11. 管理员登录
+Mock.mock('/admin/login', 'post', (options) => {
+ const body = JSON.parse(options.body);
+ const { username, password } = body;
+
+ // 查找管理员用户
+ const admin = users.find(u => u.username === username && u.password === password && u.userType === 1);
+
+ if (admin) {
+ const token = generateToken(admin.username, admin.userType);
+
return {
code: 200,
- message: '获取用户信息成功',
- data: userWithoutPassword
- }
+ message: '管理员登录成功',
+ success: true,
+ data: {
+ token,
+ user: {
+ id: admin.id,
+ username: admin.username,
+ email: admin.email,
+ role: admin.role,
+ userType: admin.userType,
+ avatar: admin.avatar
+ }
+ }
+ };
} else {
return {
code: 401,
- message: '获取用户信息失败',
- data: null
- }
+ message: '用户名或密码错误,或无管理员权限',
+ success: false
+ };
}
-})
+});
+
+// 12. 获取用户列表 (管理员)
+Mock.mock(new RegExp('/user/list\\?.*'), 'get', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid || auth.userType !== 1) {
+ return {
+ code: 403,
+ message: '无权限访问',
+ success: false
+ };
+ }
+
+ // 返回除密码外的用户信息
+ const userList = users.map(user => ({
+ id: user.id,
+ username: user.username,
+ email: user.email,
+ role: user.role,
+ userType: user.userType,
+ avatar: user.avatar,
+ createTime: user.createTime
+ }));
+
+ return {
+ code: 200,
+ message: '获取用户列表成功',
+ success: true,
+ data: {
+ total: userList.length,
+ users: userList
+ }
+ };
+});
+
+// 13. 删除指定用户 (管理员)
+Mock.mock('/user/delete', 'delete', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid || auth.userType !== 1) {
+ return {
+ code: 403,
+ message: '无权限访问',
+ success: false
+ };
+ }
+
+ const body = JSON.parse(options.body);
+ const { username, targetUsername } = body;
+
+ // 确保操作者是管理员
+ const admin = users.find(u => u.username === username && u.userType === 1);
+ if (!admin) {
+ return {
+ code: 403,
+ message: '无权限操作',
+ success: false
+ };
+ }
+
+ // 查找要删除的用户
+ const userIndex = users.findIndex(u => u.username === targetUsername);
+ if (userIndex === -1) {
+ return {
+ code: 404,
+ message: '用户不存在',
+ success: false
+ };
+ }
+
+ // 不允许删除管理员
+ if (users[userIndex].userType === 1) {
+ return {
+ code: 403,
+ message: '不能删除管理员账户',
+ success: false
+ };
+ }
+
+ // 删除用户
+ const deletedUser = users.splice(userIndex, 1)[0];
+
+ return {
+ code: 200,
+ message: '用户删除成功',
+ success: true,
+ data: {
+ username: deletedUser.username
+ }
+ };
+});
+
+// 14. 删除帖子 (管理员)
+Mock.mock('/posts/delete', 'delete', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid || auth.userType !== 1) {
+ return {
+ code: 403,
+ message: '无权限访问',
+ success: false
+ };
+ }
+
+ const body = JSON.parse(options.body);
+ const { username, pid } = body;
+
+ // 确保操作者是管理员
+ const admin = users.find(u => u.username === username && u.userType === 1);
+ if (!admin) {
+ return {
+ code: 403,
+ message: '无权限操作',
+ success: false
+ };
+ }
+
+ // 查找要删除的帖子
+ const postIndex = posts.findIndex(p => p.id === parseInt(pid));
+ if (postIndex === -1) {
+ return {
+ code: 404,
+ message: '帖子不存在',
+ success: false
+ };
+ }
+
+ // 删除帖子
+ const deletedPost = posts.splice(postIndex, 1)[0];
+
+ // 同时删除该帖子的所有评论
+ const relatedComments = comments.filter(c => c.postId === parseInt(pid));
+ relatedComments.forEach(comment => {
+ const commentIndex = comments.findIndex(c => c.id === comment.id);
+ if (commentIndex !== -1) {
+ comments.splice(commentIndex, 1);
+ }
+ });
+
+ return {
+ code: 200,
+ message: '帖子删除成功',
+ success: true,
+ data: {
+ title: deletedPost.title,
+ deletedComments: relatedComments.length
+ }
+ };
+});
+
+// 15. 删除帖子评论 (管理员)
+Mock.mock('/comment/delete', 'delete', (options) => {
+ const headers = options.headers || {};
+ const token = headers.token;
+ const auth = verifyToken(token);
+
+ if (!auth || !auth.valid || auth.userType !== 1) {
+ return {
+ code: 403,
+ message: '无权限访问',
+ success: false
+ };
+ }
+
+ const body = JSON.parse(options.body);
+ const { username, commentId } = body;
+
+ // 确保操作者是管理员
+ const admin = users.find(u => u.username === username && u.userType === 1);
+ if (!admin) {
+ return {
+ code: 403,
+ message: '无权限操作',
+ success: false
+ };
+ }
+
+ // 查找要删除的评论
+ const commentIndex = comments.findIndex(c => c.id === parseInt(commentId));
+ if (commentIndex === -1) {
+ return {
+ code: 404,
+ message: '评论不存在',
+ success: false
+ };
+ }
+
+ // 删除评论
+ const deletedComment = comments.splice(commentIndex, 1)[0];
+
+ return {
+ code: 200,
+ message: '评论删除成功',
+ success: true,
+ data: {
+ commentId: deletedComment.id,
+ postId: deletedComment.postId
+ }
+ };
+});
export default Mock
\ No newline at end of file