Kamixitong/app/web/views.py
2025-12-12 11:35:14 +08:00

343 lines
11 KiB
Python

from flask import render_template, request, jsonify, flash, redirect, url_for
from flask_login import login_required, login_user, logout_user, current_user
from werkzeug.security import check_password_hash
from app.models import Product, License, Device, Ticket, Admin, Order
from app import db
from app.web import web_bp
import sys
import platform
from flask import __version__ as flask_version, current_app
def register_error_handlers(app):
"""注册错误处理器"""
@app.errorhandler(404)
def not_found_error(error):
return render_template('404.html'), 404
@app.errorhandler(500)
def internal_error(error):
db.session.rollback()
return render_template('500.html'), 500
# 产品管理页面
@web_bp.route('/products')
@login_required
def products():
"""产品管理页面"""
return render_template('product/list.html')
@web_bp.route('/products/create')
@login_required
def create_product():
"""创建产品页面"""
return render_template('product/create.html')
@web_bp.route('/products/<product_id>')
@login_required
def product_detail(product_id):
"""产品详情页面"""
product = Product.query.filter_by(product_id=product_id).first()
if not product:
flash('产品不存在', 'error')
return redirect(url_for('web.products'))
# 获取产品统计信息
stats = product.get_stats()
# 将统计信息添加到产品对象中
for key, value in stats.items():
setattr(product, key, value)
return render_template('product/detail.html', product=product)
@web_bp.route('/products/<product_id>/edit')
@login_required
def edit_product(product_id):
"""编辑产品页面"""
product = Product.query.filter_by(product_id=product_id).first()
if not product:
flash('产品不存在', 'error')
return redirect(url_for('web.products'))
return render_template('product/edit.html', product=product)
# 卡密管理页面
@web_bp.route('/licenses')
@login_required
def licenses():
"""卡密管理页面"""
return render_template('license/list.html')
@web_bp.route('/licenses/generate')
@login_required
def generate_license():
"""生成卡密页面"""
products = Product.query.filter_by(status=1).all()
return render_template('license/generate.html', products=products)
@web_bp.route('/licenses/import')
@login_required
def import_license():
"""导入卡密页面"""
return render_template('license/import.html')
@web_bp.route('/licenses/export')
@login_required
def export_license():
"""导出卡密页面"""
products = Product.query.filter_by(status=1).all()
return render_template('license/export.html', products=products)
# 版本管理页面
@web_bp.route('/versions')
@login_required
def versions():
"""版本管理页面"""
return render_template('version/list.html')
@web_bp.route('/versions/create')
@login_required
def create_version():
"""创建版本页面"""
products = Product.query.filter_by(status=1).all()
return render_template('version/create.html', products=products)
@web_bp.route('/versions/<int:version_id>')
@login_required
def version_detail(version_id):
"""版本详情页面"""
from app.models import Version
version = Version.query.get_or_404(version_id)
return render_template('version/detail.html', version=version)
@web_bp.route('/versions/<int:version_id>/edit')
@login_required
def edit_version(version_id):
"""编辑版本页面"""
from app.models import Version
version = Version.query.get_or_404(version_id)
products = Product.query.filter_by(status=1).all()
return render_template('version/edit.html', version=version, products=products)
# 设备管理页面
@web_bp.route('/devices')
@login_required
def devices():
"""设备管理页面"""
return render_template('device/list.html')
def get_priority_badge(priority):
"""获取优先级徽章HTML"""
priority_map = {
0: '<span class="badge bg-secondary ms-1">低</span>',
1: '<span class="badge bg-warning ms-1">中</span>',
2: '<span class="badge bg-danger ms-1">高</span>'
}
return priority_map.get(priority, '<span class="badge bg-secondary ms-1">未知</span>')
# 工单管理页面
@web_bp.route('/tickets')
@login_required
def tickets():
"""工单管理页面"""
return render_template('ticket/list.html')
@web_bp.route('/tickets/<int:ticket_id>')
@login_required
def ticket_detail(ticket_id):
"""工单详情页面"""
ticket = Ticket.query.get_or_404(ticket_id)
return render_template('ticket/detail.html', ticket=ticket, get_priority_badge=get_priority_badge)
# 统计分析页面
@web_bp.route('/statistics')
@login_required
def statistics():
"""统计分析页面"""
return render_template('statistics/index.html')
# 系统设置页面
@web_bp.route('/settings')
@login_required
def settings():
"""系统设置页面"""
# 只有超级管理员可以访问
if not current_user.is_super_admin():
flash('需要超级管理员权限', 'error')
return redirect(url_for('web.dashboard'))
import sys
import platform
from flask import __version__ as flask_version, current_app
from app import db
import datetime
# 获取系统信息
python_version = sys.version.split()[0]
database_type = db.engine.name
# 获取运行时间(这里简单模拟,实际应该从应用启动时间计算)
uptime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 获取系统版本(从项目配置或其他地方获取)
system_version = "v1.0.0" # 这里可以改为从配置文件读取
# 传递配置信息
config = current_app.config
return render_template('settings/index.html',
python_version=python_version,
flask_version=flask_version,
database_type=database_type,
uptime=uptime,
system_version=system_version,
config=config)
# 账号管理页面
@web_bp.route('/admins')
@login_required
def admins():
"""账号管理页面"""
# 只有超级管理员可以访问
if not current_user.is_super_admin():
flash('需要超级管理员权限', 'error')
return redirect(url_for('web.dashboard'))
return render_template('admin/list.html')
# 日志管理页面
@web_bp.route('/logs')
@login_required
def logs():
"""日志管理页面"""
# 只有超级管理员可以访问
if not current_user.is_super_admin():
flash('需要超级管理员权限', 'error')
return redirect(url_for('web.dashboard'))
return render_template('log/list.html')
# 套餐管理页面
@web_bp.route('/packages')
@login_required
def packages():
"""套餐管理页面"""
product_id = request.args.get('product_id')
if not product_id:
flash('缺少产品ID参数', 'error')
return redirect(url_for('web.products'))
product = Product.query.filter_by(product_id=product_id).first()
if not product:
flash('产品不存在', 'error')
return redirect(url_for('web.products'))
return render_template('package/list.html', product=product)
@web_bp.route('/packages/create')
@login_required
def create_package():
"""创建套餐页面"""
product_id = request.args.get('product_id')
if not product_id:
flash('缺少产品ID参数', 'error')
return redirect(url_for('web.products'))
product = Product.query.filter_by(product_id=product_id).first()
if not product:
flash('产品不存在', 'error')
return redirect(url_for('web.products'))
return render_template('package/create.html', product=product)
@web_bp.route('/packages/<package_id>/edit')
@login_required
def edit_package(package_id):
"""编辑套餐页面"""
# 获取套餐
from app.models import Package
package = Package.query.filter_by(package_id=package_id).first()
if not package:
flash('套餐不存在', 'error')
return redirect(url_for('web.products'))
# 获取产品
product = Product.query.filter_by(product_id=package.product_id).first()
if not product:
flash('产品不存在', 'error')
return redirect(url_for('web.products'))
return render_template('package/edit.html', package=package, product=product)
# 订单管理页面
@web_bp.route('/orders')
@login_required
def orders():
"""订单管理页面"""
return render_template('order/list.html')
@web_bp.route('/orders/<int:order_id>')
@login_required
def order_detail(order_id):
"""订单详情页面"""
# 这里可以添加订单详情的逻辑
return render_template('order/detail.html')
# 支付配置页面
@web_bp.route('/payment-config')
@login_required
def payment_config():
"""支付配置页面"""
# 只有超级管理员可以访问
if not current_user.is_super_admin():
flash('需要超级管理员权限', 'error')
return redirect(url_for('web.dashboard'))
# 传递配置信息
config = current_app.config
return render_template('payment_config/index.html', config=config)
# 支付相关页面
@web_bp.route('/payment/result')
def payment_result():
"""支付结果页面"""
order_number = request.args.get('order_number')
if not order_number:
return redirect(url_for('web.index'))
# 查询订单
order = Order.query.filter_by(order_number=order_number).first()
if not order:
return render_template('payment/result.html',
status='error',
order_number=order_number,
message='订单不存在')
# 根据订单状态返回不同的页面
if order.status == 1: # 已支付
# 查询对应的许可证
license_obj = License.query.filter_by(
phone=order.phone,
product_id=order.product_id
).order_by(License.create_time.desc()).first()
return render_template('payment/result.html',
status='success',
order_number=order_number,
amount=order.amount,
payment_time=order.payment_time.strftime('%Y-%m-%d %H:%M:%S') if order.payment_time else '',
license_key=license_obj.license_key if license_obj else None)
elif order.status == 0: # 待支付
return render_template('payment/result.html',
status='processing',
order_number=order_number,
amount=order.amount)
else: # 已取消或已完成
return render_template('payment/result.html',
status='error',
order_number=order_number,
amount=order.amount,
message='订单已取消')