第一次提交
This commit is contained in:
213
app/api/package.py
Normal file
213
app/api/package.py
Normal file
@@ -0,0 +1,213 @@
|
||||
from flask import request, jsonify, current_app
|
||||
from app import db
|
||||
from app.models import Package, Product
|
||||
from . import api_bp
|
||||
from .decorators import require_login, require_admin
|
||||
import traceback
|
||||
|
||||
@api_bp.route('/packages', methods=['GET'])
|
||||
@require_login
|
||||
def get_packages():
|
||||
"""获取套餐列表"""
|
||||
try:
|
||||
product_id = request.args.get('product_id')
|
||||
if not product_id:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '缺少产品ID参数'
|
||||
}), 400
|
||||
|
||||
# 验证产品是否存在
|
||||
product = Product.query.filter_by(product_id=product_id).first()
|
||||
if not product:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '产品不存在'
|
||||
}), 404
|
||||
|
||||
# 获取套餐列表
|
||||
packages = Package.query.filter_by(product_id=product_id).order_by(Package.sort_order).all()
|
||||
package_list = [pkg.to_dict() for pkg in packages]
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': {
|
||||
'packages': package_list
|
||||
}
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"获取套餐列表失败: {str(e)}")
|
||||
current_app.logger.error(f"错误堆栈: {traceback.format_exc()}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '服务器内部错误'
|
||||
}), 500
|
||||
|
||||
@api_bp.route('/packages', methods=['POST'])
|
||||
@require_login
|
||||
def create_package():
|
||||
"""创建套餐"""
|
||||
try:
|
||||
data = request.get_json()
|
||||
if not data:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '请求数据为空'
|
||||
}), 400
|
||||
|
||||
# 验证必填字段
|
||||
required_fields = ['product_id', 'name', 'price', 'duration']
|
||||
for field in required_fields:
|
||||
if field not in data or not data[field]:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'缺少必要参数: {field}'
|
||||
}), 400
|
||||
|
||||
# 验证产品是否存在
|
||||
product = Product.query.filter_by(product_id=data['product_id']).first()
|
||||
if not product:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '产品不存在'
|
||||
}), 404
|
||||
|
||||
# 创建套餐
|
||||
package = Package(
|
||||
product_id=data['product_id'],
|
||||
name=data['name'],
|
||||
description=data.get('description', ''),
|
||||
price=float(data['price']),
|
||||
duration=int(data['duration']),
|
||||
max_devices=int(data.get('max_devices', 1)),
|
||||
stock=int(data.get('stock', -1)),
|
||||
sort_order=int(data.get('sort_order', 0)),
|
||||
status=int(data.get('status', 1))
|
||||
)
|
||||
|
||||
db.session.add(package)
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': '套餐创建成功',
|
||||
'data': package.to_dict()
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
current_app.logger.error(f"创建套餐失败: {str(e)}")
|
||||
current_app.logger.error(f"错误堆栈: {traceback.format_exc()}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '服务器内部错误'
|
||||
}), 500
|
||||
|
||||
@api_bp.route('/packages/<package_id>', methods=['GET'])
|
||||
@require_login
|
||||
def get_package(package_id):
|
||||
"""获取套餐详情"""
|
||||
try:
|
||||
package = Package.query.filter_by(package_id=package_id).first()
|
||||
if not package:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '套餐不存在'
|
||||
}), 404
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': package.to_dict()
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"获取套餐详情失败: {str(e)}")
|
||||
current_app.logger.error(f"错误堆栈: {traceback.format_exc()}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '服务器内部错误'
|
||||
}), 500
|
||||
|
||||
@api_bp.route('/packages/<package_id>', methods=['PUT'])
|
||||
@require_login
|
||||
def update_package(package_id):
|
||||
"""更新套餐"""
|
||||
try:
|
||||
package = Package.query.filter_by(package_id=package_id).first()
|
||||
if not package:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '套餐不存在'
|
||||
}), 404
|
||||
|
||||
data = request.get_json()
|
||||
if not data:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '请求数据为空'
|
||||
}), 400
|
||||
|
||||
# 更新字段
|
||||
if 'name' in data:
|
||||
package.name = data['name']
|
||||
if 'description' in data:
|
||||
package.description = data['description']
|
||||
if 'price' in data:
|
||||
package.price = float(data['price'])
|
||||
if 'duration' in data:
|
||||
package.duration = int(data['duration'])
|
||||
if 'max_devices' in data:
|
||||
package.max_devices = int(data['max_devices'])
|
||||
if 'stock' in data:
|
||||
package.stock = int(data['stock'])
|
||||
if 'sort_order' in data:
|
||||
package.sort_order = int(data['sort_order'])
|
||||
if 'status' in data:
|
||||
package.status = int(data['status'])
|
||||
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': '套餐更新成功',
|
||||
'data': package.to_dict()
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
current_app.logger.error(f"更新套餐失败: {str(e)}")
|
||||
current_app.logger.error(f"错误堆栈: {traceback.format_exc()}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '服务器内部错误'
|
||||
}), 500
|
||||
|
||||
@api_bp.route('/packages/<package_id>', methods=['DELETE'])
|
||||
@require_login
|
||||
def delete_package(package_id):
|
||||
"""删除套餐"""
|
||||
try:
|
||||
package = Package.query.filter_by(package_id=package_id).first()
|
||||
if not package:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '套餐不存在'
|
||||
}), 404
|
||||
|
||||
db.session.delete(package)
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': '套餐删除成功'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
current_app.logger.error(f"删除套餐失败: {str(e)}")
|
||||
current_app.logger.error(f"错误堆栈: {traceback.format_exc()}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '服务器内部错误'
|
||||
}), 500
|
||||
Reference in New Issue
Block a user