import os from flask import Blueprint, render_template, request, redirect, url_for, flash, current_app from flask_login import login_required, current_user from werkzeug.utils import secure_filename from models import db, Post, Comment from config import Config posts_bp = Blueprint('posts', __name__) def allowed_file(filename): """检查文件扩展名是否允许""" return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in Config.ALLOWED_EXTENSIONS @posts_bp.route('/') def index(): """首页 - 显示已审核的帖子流""" page = request.args.get('page', 1, type=int) # 只显示已审核的帖子 pagination = Post.query.filter_by(is_approved=True)\ .order_by(Post.created_at.desc())\ .paginate(page=page, per_page=current_app.config['POSTS_PER_PAGE'], error_out=False) posts = pagination.items return render_template('index.html', posts=posts, pagination=pagination) @posts_bp.route('/post/create', methods=['GET', 'POST']) @login_required def create_post(): """创建帖子""" if not current_user.is_approved: flash('您的账号尚未通过审核,无法发帖', 'error') return redirect(url_for('posts.index')) if request.method == 'POST': description = request.form.get('description') image = request.files.get('image') if not image: flash('请上传照片', 'error') return render_template('create_post.html') if not allowed_file(image.filename): flash('请上传有效的图片文件(支持 PNG, JPG, JPEG, GIF, WEBP)', 'error') return render_template('create_post.html') # 保存图片 filename = secure_filename(f"{current_user.username}_{image.filename}") # 添加时间戳避免重名 from datetime import datetime timestamp = datetime.now().strftime('%Y%m%d%H%M%S') filename = f"{timestamp}_{filename}" filepath = os.path.join(Config.UPLOAD_FOLDER, 'posts', filename) image.save(filepath) # 创建帖子 post = Post( user_id=current_user.id, image_path=f'posts/{filename}', description=description, is_approved=False # 需要审核 ) db.session.add(post) db.session.commit() flash('帖子已提交,等待管理员审核', 'success') return redirect(url_for('posts.index')) return render_template('create_post.html') @posts_bp.route('/post/') def post_detail(post_id): """帖子详情页""" post = Post.query.get_or_404(post_id) # 如果帖子未审核,只有作者和管理员可以查看 if not post.is_approved: if not current_user.is_authenticated or \ (current_user.id != post.user_id and not current_user.is_admin): flash('该帖子正在审核中', 'warning') return redirect(url_for('posts.index')) # 获取评论 comments = post.comments.order_by(Comment.created_at.desc()).all() return render_template('post_detail.html', post=post, comments=comments) @posts_bp.route('/post//comment', methods=['POST']) @login_required def add_comment(post_id): """添加评论""" if not current_user.is_approved: flash('您的账号尚未通过审核,无法评论', 'error') return redirect(url_for('posts.post_detail', post_id=post_id)) post = Post.query.get_or_404(post_id) if not post.is_approved: flash('该帖子正在审核中,无法评论', 'error') return redirect(url_for('posts.index')) content = request.form.get('content') if not content or not content.strip(): flash('评论内容不能为空', 'error') return redirect(url_for('posts.post_detail', post_id=post_id)) comment = Comment( post_id=post_id, user_id=current_user.id, content=content.strip() ) db.session.add(comment) db.session.commit() flash('评论发表成功', 'success') return redirect(url_for('posts.post_detail', post_id=post_id))