filesend/backend/app/routes/settings.py

131 lines
4.2 KiB
Python
Raw Permalink Normal View History

2025-10-10 17:25:29 +08:00
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/<string:key>', 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/<string:key>', 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