from flask import Blueprint, request, jsonify from flask_jwt_extended import jwt_required from ..models import SystemSettings, db from functools import wraps settings_bp = Blueprint('settings', __name__) def admin_required(fn): @wraps(fn) @jwt_required() def wrapper(*args, **kwargs): from flask_jwt_extended import get_jwt if not get_jwt().get('is_admin'): return jsonify({'message': '需要管理员权限'}), 403 return fn(*args, **kwargs) return wrapper @settings_bp.route('/settings', methods=['GET']) @admin_required def get_all_settings(): """获取所有系统设置""" settings = SystemSettings.query.all() return jsonify([setting.to_dict() for setting in settings]), 200 @settings_bp.route('/settings/', methods=['GET']) @admin_required def get_setting(key): """获取单个设置""" setting = SystemSettings.query.filter_by(key=key).first() if not setting: return jsonify({'message': '设置不存在'}), 404 return jsonify(setting.to_dict()), 200 @settings_bp.route('/settings/', methods=['PUT']) @admin_required def update_setting(key): """更新单个设置""" data = request.get_json() if 'value' not in data: return jsonify({'message': '缺少value字段'}), 400 value = data['value'] description = data.get('description') data_type = data.get('data_type', 'string') setting = SystemSettings.set_value(key, value, description, data_type) return jsonify(setting.to_dict()), 200 @settings_bp.route('/settings', methods=['PUT']) @admin_required def update_multiple_settings(): """批量更新设置""" data = request.get_json() if not isinstance(data, dict): return jsonify({'message': '数据格式错误'}), 400 updated_settings = [] for key, setting_data in data.items(): if isinstance(setting_data, dict): value = setting_data.get('value') description = setting_data.get('description') data_type = setting_data.get('data_type', 'string') else: value = setting_data description = None data_type = 'string' if value is not None: setting = SystemSettings.set_value(key, value, description, data_type) updated_settings.append(setting.to_dict()) return jsonify(updated_settings), 200 @settings_bp.route('/settings/defaults', methods=['POST']) @admin_required def init_default_settings(): """初始化默认设置""" default_settings = { 'daily_quota': { 'value': '5', 'description': '用户每日可领取文件数量', 'data_type': 'int' }, 'max_file_size': { 'value': '10485760', # 10MB 'description': '上传文件最大大小(字节)', 'data_type': 'int' }, 'auto_reset_quota': { 'value': 'true', 'description': '是否自动重置用户每日领取配额', 'data_type': 'bool' }, 'reset_hour': { 'value': '0', 'description': '每日配额重置时间(小时,0-23)', 'data_type': 'int' }, 'allow_registration': { 'value': 'true', 'description': '是否允许新用户注册', 'data_type': 'bool' }, 'require_admin_approval': { 'value': 'true', 'description': '新注册用户是否需要管理员审核', 'data_type': 'bool' }, 'site_name': { 'value': '文件领取系统', 'description': '网站名称', 'data_type': 'string' }, 'max_files_per_user': { 'value': '100', 'description': '用户最多可上传文件数量', 'data_type': 'int' } } created_settings = [] for key, config in default_settings.items(): setting = SystemSettings.set_value( key, config['value'], config['description'], config['data_type'] ) created_settings.append(setting.to_dict()) return jsonify(created_settings), 201