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/') @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//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/') @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//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: '', 1: '', 2: '' } return priority_map.get(priority, '未知') # 工单管理页面 @web_bp.route('/tickets') @login_required def tickets(): """工单管理页面""" return render_template('ticket/list.html') @web_bp.route('/tickets/') @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//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/') @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='订单已取消')