node-blog/routes/user/auth.js
2025-06-24 11:42:12 +08:00

145 lines
4.5 KiB
JavaScript

const express = require('express');
const router = express.Router();
const authController = require('../../controllers/user/auth');
const Post = require('../../models/Post');
const Comment = require('../../models/Comment');
const User = require('../../models/User');
// 文章详情页
// 文章详情页
router.get('/posts/:id', async (req, res) => {
try {
const post = await Post.findOne({ _id: req.params.id, isPublished: true });
if (!post) {
return res.status(404).render('user/info', {
post: null,
user: req.session.user || null,
message: '文章不存在或已被删除'
});
}
res.render('user/info', {
post: post, // 确保传递的是查询到的文章
user: req.session.user || null
});
} catch (err) {
console.error('获取文章详情出错:', err);
res.status(500).render('user/info', {
post: null,
user: req.session.user || null,
message: '服务器错误,请稍后再试'
});
}
});
// 注册页面
router.get('/register', (req, res) => {
res.render('user/register', { error: null });
});
// 注册提交
router.post('/register', authController.register);
// 登录页面
router.get('/login', (req, res) => {
res.render('user/login', { error: null });
});
// 登录提交
router.post('/login', authController.login);
// 登出
router.get('/logout', authController.logout);
// 获取用户资料(包括收藏列表)
router.get('/user/profile', async (req, res) => {
if (!req.session.user) {
return res.status(401).json({ success: false, message: '请先登录' });
}
try {
const user = await User.findById(req.session.user._id).populate('favorites');
res.json({
success: true,
user: {
_id: user._id,
username: user.username,
role: user.role
},
favorites: user.favorites || []
});
} catch (err) {
console.error('获取用户资料失败:', err);
res.status(500).json({ success: false, message: '获取用户资料失败' });
}
});
// 收藏文章
router.post('/posts/:id/favorite', async (req, res) => {
if (!req.session.user) return res.status(401).json({ success: false, message: '请先登录' });
try {
await User.findByIdAndUpdate(req.session.user._id, { $addToSet: { favorites: req.params.id } });
res.json({ success: true });
} catch (err) {
res.status(500).json({ success: false, message: '收藏失败' });
}
});
// 取消收藏
router.post('/posts/:id/unfavorite', async (req, res) => {
if (!req.session.user) return res.status(401).json({ success: false, message: '请先登录' });
try {
await User.findByIdAndUpdate(req.session.user._id, { $pull: { favorites: req.params.id } });
res.json({ success: true });
} catch (err) {
res.status(500).json({ success: false, message: '取消收藏失败' });
}
});
// 获取评论列表
router.get('/posts/:id/comments', async (req, res) => {
try {
const comments = await Comment.find({ post: req.params.id }).populate('author', 'username').sort({ createdAt: -1 });
res.json({ success: true, comments });
} catch (err) {
res.status(500).json({ success: false, message: '获取评论失败' });
}
});
// 发表评论
router.post('/posts/:id/comments', async (req, res) => {
if (!req.session.user) return res.status(401).json({ success: false, message: '请先登录' });
const { content } = req.body;
if (!content || !content.trim()) return res.status(400).json({ success: false, message: '评论内容不能为空' });
try {
const comment = new Comment({
content,
author: req.session.user._id,
post: req.params.id
});
await comment.save();
res.json({ success: true, comment });
} catch (err) {
res.status(500).json({ success: false, message: '发表评论失败' });
}
});
// 用户个人中心页面
router.get('/userInfo', async (req, res) => {
if (!req.session.user) {
return res.redirect('/login');
}
try {
const user = await User.findById(req.session.user._id).populate('favorites');
// 获取用户所有评论
const comments = await Comment.find({ author: req.session.user._id }).populate('post', 'title');
res.render('user/userInfo', {
user,
favorites: user.favorites || [],
comments: comments || []
});
} catch (err) {
console.error('获取个人中心信息失败:', err);
res.status(500).render('user/userInfo', { user: null, favorites: [], comments: [], error: '服务器错误' });
}
});
// 修改密码
router.post('/user/changePassword', authController.changePassword);
module.exports = router;