diff --git a/app/__init__.py b/app/__init__.py index 56140b2..251ed1d 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -3,6 +3,7 @@ from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_login import LoginManager from flask_session import Session +from flask_wtf.csrf import CSRFProtect from config import config from flask_bootstrap import Bootstrap @@ -11,6 +12,7 @@ db = SQLAlchemy() migrate = Migrate() login_manager = LoginManager() sess = Session() +csrf = CSRFProtect() bootstrap = Bootstrap() # login_manager 的基本配置 login_manager.login_view = 'auth.login' # 后面我们会创建一个叫 'auth' 的蓝图 @@ -31,11 +33,13 @@ def create_app(config_name='default'): migrate.init_app(app, db) login_manager.init_app(app) sess.init_app(app) + csrf.init_app(app) bootstrap.init_app(app) # 注册自定义过滤器 - from .filters import translate_status + from .filters import translate_status, translate_reason app.jinja_env.filters['translate_status'] = translate_status + app.jinja_env.filters['translate_reason'] = translate_reason # 3. 注册蓝图 (Blueprint) # 后面我们会在这里添加蓝图 diff --git a/app/filters.py b/app/filters.py index 97188ad..5662940 100644 --- a/app/filters.py +++ b/app/filters.py @@ -22,6 +22,26 @@ STATUS_TRANSLATIONS = { 'expired': '已过期' } +REASON_TRANSLATIONS = { + 'cheating': '作弊 (刷上传/下载)', + 'trading': '账号交易/共享', + 'spam': '发布垃圾/违禁信息', + 'abusive': '辱骂/人身攻击', + 'low_ratio': '分享率过低', + 'hit_and_run': 'H&R (下载不做种)', + 'fake_seeding': '假做种', + 'multiple_accounts': '多账号/小号', + 'account_sharing': '账号共享', + 'reselling': '倒卖邀请', + 'harassment': '骚扰他人', + 'scamming': '诈骗行为', + 'other': '其他 (请在描述中详述)' +} + def translate_status(status): """将英文状态翻译为中文""" return STATUS_TRANSLATIONS.get(status, status) + +def translate_reason(reason): + """将英文违规原因翻译为中文""" + return REASON_TRANSLATIONS.get(reason, reason) diff --git a/app/forms.py b/app/forms.py index 663c3de..05e8135 100644 --- a/app/forms.py +++ b/app/forms.py @@ -3,6 +3,7 @@ from wtforms import StringField, SubmitField, PasswordField, BooleanField, TextA from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError, Optional, URL from .models import User from wtforms_sqlalchemy.fields import QuerySelectField +from .filters import REASON_TRANSLATIONS def get_active_partner_sites(): return PartnerSite.query.filter_by(is_active=True).order_by(PartnerSite.name) @@ -56,14 +57,7 @@ class ReportForm(FlaskForm): ) reason_category = SelectField( '举报原因分类', - choices=[ - ('cheating', '作弊 (刷上传/下载)'), - ('trading', '账号交易/共享'), - ('spam', '发布垃圾/违禁信息'), - ('abusive', '辱骂/人身攻击'), - ('radio', '分享率过低'), - ('other', '其他 (请在描述中详述)') - ], + choices=[(k, v) for k, v in REASON_TRANSLATIONS.items()], validators=[DataRequired()] ) description = TextAreaField( diff --git a/app/templates/admin/report_detail.html b/app/templates/admin/report_detail.html index 3598f9f..bf35437 100644 --- a/app/templates/admin/report_detail.html +++ b/app/templates/admin/report_detail.html @@ -13,7 +13,7 @@
  • 被举报邮箱: {{ report.reported_email }}
  • 被举报用户名: {{ report.reported_username or 'N/A' }}
  • 所属站点: {{ report.reported_pt_site }}
  • -
  • 举报理由: {{ report.reason_category }}
  • +
  • 举报理由: {{ report.reason_category | translate_reason }}
  • 举报人: {{ report.reporter.username }}
  • 状态: {{ report.status | translate_status }}
  • 详细描述:
    {{ report.description }}
  • diff --git a/app/templates/index.html b/app/templates/index.html index 377ed88..1a3260c 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -46,7 +46,7 @@ diff --git a/config.py b/config.py index 7ec693d..1055566 100644 --- a/config.py +++ b/config.py @@ -10,7 +10,11 @@ class Config: """基础配置类""" SECRET_KEY = os.environ.get('SECRET_KEY') or 'a-hard-to-guess-string' SQLALCHEMY_TRACK_MODIFICATIONS = False - + + # CSRF 配置 + WTF_CSRF_ENABLED = True + WTF_CSRF_TIME_LIMIT = None + # Session 配置 SESSION_TYPE = 'redis' SESSION_PERMANENT = False