"""课程管理路由""" from flask import render_template, request, redirect, url_for, flash from models import db, Course from utils import login_required, log_operation, permission_required, export_excel def register_routes(app): @app.route('/courses', endpoint='course_list') @login_required @permission_required('course_view') def course_list(): keyword = request.args.get('keyword', '') query = Course.query if keyword: query = query.filter(Course.name.contains(keyword)) courses = query.order_by(Course.id.desc()).all() return render_template('course_list.html', courses=courses, keyword=keyword) @app.route('/courses/add', methods=['GET', 'POST'], endpoint='course_add') @login_required @permission_required('course_add') def course_add(): if request.method == 'POST': course = Course( name=request.form.get('name'), price_per_hour=float(request.form.get('price_per_hour', 0)), total_hours=int(request.form.get('total_hours', 0)), material_fee=float(request.form.get('material_fee', 0)), type=request.form.get('type'), status=int(request.form.get('status', 1)), remark=request.form.get('remark', '') ) db.session.add(course) db.session.commit() log_operation('创建课程', f'课程:{course.name}') flash('课程创建成功', 'success') return redirect(url_for('course_list')) return render_template('course_form.html', course=None) @app.route('/courses/export', endpoint='course_export') @login_required @permission_required('course_export') def course_export(): query = Course.query keyword = request.args.get('keyword', '') if keyword: query = query.filter(Course.name.contains(keyword)) courses = query.order_by(Course.id.desc()).all() headers = ['序号', '课程名称', '单价(元/课时)', '级别', '类型', '总课时', '材料费', '状态', '描述', '备注', '创建时间'] rows = [] for i, c in enumerate(courses, 1): rows.append([i, c.name, c.price_per_hour or 0, c.level or '', c.type or '', c.total_hours or 0, c.material_fee or 0, '启用' if c.status == 1 else '停用', c.description or '', c.remark or '', c.created_at.strftime('%Y-%m-%d %H:%M') if c.created_at else '']) return export_excel('课程列表', headers, rows) @app.route('/courses/edit/', methods=['GET', 'POST'], endpoint='course_edit') @login_required @permission_required('course_edit') def course_edit(id): course = db.session.get(Course, id) if request.method == 'POST': old_price = float(course.price_per_hour or 0) course.name = request.form.get('name') course.price_per_hour = float(request.form.get('price_per_hour', 0)) if abs(old_price - course.price_per_hour) > 0.01: flash( '课程标价已变更:仅影响新充值默认换算;已消课与退费按账户加权单价/消课记录单价核算', 'warning', ) course.total_hours = int(request.form.get('total_hours', 0)) course.material_fee = float(request.form.get('material_fee', 0)) course.type = request.form.get('type') course.status = int(request.form.get('status', 1)) course.remark = request.form.get('remark', '') db.session.commit() log_operation('编辑课程', f'课程ID:{id}') flash('课程更新成功', 'success') return redirect(url_for('course_list')) return render_template('course_form.html', course=course) @app.route('/courses/delete/', endpoint='course_delete') @login_required @permission_required('course_delete') def course_delete(id): course = db.session.get(Course, id) if course: course.status = 0 db.session.commit() log_operation('删除课程', f'课程ID:{id}') flash('课程已停用', 'success') return redirect(url_for('course_list'))