filesend/backend/app/routes/settings.py

131 lines
4.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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