import os from flask import Blueprint, render_template, request, redirect, url_for, flash, current_app from flask_login import login_user, logout_user, current_user from werkzeug.security import generate_password_hash, check_password_hash from werkzeug.utils import secure_filename from ..extensions import db, login_manager from ..models import User, Profile, UserStatus bp = Blueprint("auth", __name__, url_prefix="/auth") @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) @bp.route("/register", methods=["GET", "POST"]) def register(): if request.method == "POST": email = request.form.get("email") username = request.form.get("username") password = request.form.get("password") photo = request.files.get("identity_photo") if not email or not username or not password or not photo: flash("请完整填写信息并上传身份照片") return redirect(url_for("auth.register")) if User.query.filter_by(email=email).first() or User.query.filter_by(username=username).first(): flash("邮箱或用户名已存在") return redirect(url_for("auth.register")) filename = secure_filename(photo.filename) upload_dir = os.path.join(current_app.config["UPLOAD_FOLDER"], "identity") path = os.path.join(upload_dir, filename) photo.save(path) user = User(email=email, username=username, password_hash=generate_password_hash(password), status=UserStatus.pending, identity_photo_path=path) db.session.add(user) db.session.flush() profile = Profile(user_id=user.id) db.session.add(profile) db.session.commit() flash("注册提交成功,请等待管理员审核") return redirect(url_for("auth.login")) return render_template("auth/register.html") @bp.route("/login", methods=["GET", "POST"]) def login(): if request.method == "POST": email = request.form.get("email") password = request.form.get("password") user = User.query.filter_by(email=email).first() if not user or not check_password_hash(user.password_hash, password): flash("登录失败") return redirect(url_for("auth.login")) if user.status != UserStatus.approved: flash("账户未审核通过") return redirect(url_for("auth.login")) login_user(user) return redirect(url_for("feed.discover")) return render_template("auth/login.html") @bp.route("/logout") def logout(): logout_user() return redirect(url_for("auth.login"))