From c954532f52f2bcc2c285a67e049015f94443ff45 Mon Sep 17 00:00:00 2001 From: user9994793890 <3722323274763196-user9994793890@noreply.coze.cn> Date: Fri, 29 May 2026 10:55:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AF=BC=E5=85=A5Excel=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=B9=B6=E5=AE=8C=E6=88=90=E7=B3=BB=E7=BB=9F=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coze-Commit-Type: user Coze-User-ID: 3722323274763196 Coze-Conversation-ID: 5260473 --- .coze | 17 + .gitignore | 90 ++++ xuexiao/.coze | 12 + xuexiao/import_excel.py | 637 ++++++++++++++++++++++++++ xuexiao/instance/student_course.db | Bin 114688 -> 380928 bytes xuexiao/scripts/coze-preview-build.sh | 15 + xuexiao/scripts/coze-preview-run.sh | 20 + xuexiao/wsgi.py | 9 + 8 files changed, 800 insertions(+) create mode 100644 .coze create mode 100644 .gitignore create mode 100644 xuexiao/.coze create mode 100644 xuexiao/import_excel.py create mode 100755 xuexiao/scripts/coze-preview-build.sh create mode 100755 xuexiao/scripts/coze-preview-run.sh create mode 100644 xuexiao/wsgi.py diff --git a/.coze b/.coze new file mode 100644 index 0000000..5bdcd8a --- /dev/null +++ b/.coze @@ -0,0 +1,17 @@ +[project] +requires = ["python-3.11"] +project_type = "web" + +[preview] +preview_enable = "enabled" + +[dev] +build = ["bash", "xuexiao/scripts/coze-preview-build.sh"] +run = ["bash", "xuexiao/scripts/coze-preview-run.sh"] + +[deploy] +build = ["bash", "xuexiao/scripts/coze-preview-build.sh"] +run = ["bash", "xuexiao/scripts/coze-preview-run.sh"] + +[subprojects] +path = ["xuexiao"] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a6b5972 --- /dev/null +++ b/.gitignore @@ -0,0 +1,90 @@ +node_modules +dist +.DS_Store +*.swp +.git/* +__pycache__/ +*.pyc +.venv/* +*.o +*.a +/vendor +*.egg-info/ +/.env +.env + +# JS/TS bundlers & build outputs +.next +.nuxt +.turbo +.vercel +.parcel-cache +.cache +coverage +storybook-static + +# Package manager artifacts +pnpm-lock.yaml +package-lock.json +yarn.lock +.pnp* +.npm + +# Python tooling +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +.tox/ + +# Go tooling +bin/ +*.test + +# Editor / IDE +.vscode/ +.idea/ +*.iml + +# OS / misc +Thumbs.db +ehthumbs.db + +# Logs +output.log +*.log +*.log.* +logs/ + +# 视频文件 +*.mp4 +*.avi +*.mov +*.wmv +*.flv +*.mkv +*.webm +*.m4v +*.mpeg +*.mpg +*.3gp +*.f4v +*.rmvb +*.vob + +# 归档文件 +*.iso +*.dmg +*.rar +*.zip +*.gz + +# 文档类也默认加入 +*.pdf +*.docx +*.doc +*.xlsx +*.xls +*.ppt +*.pptx +*.xlsx +*.csv diff --git a/xuexiao/.coze b/xuexiao/.coze new file mode 100644 index 0000000..2c49f4a --- /dev/null +++ b/xuexiao/.coze @@ -0,0 +1,12 @@ +[project] +sub_id = "bfa77078" +name = "xuexiao" +requires = ["python-3.11"] +project_type = "web" + +[preview] +preview_enable = "enabled" + +[dev] +build = ["bash", "scripts/coze-preview-build.sh"] +run = ["bash", "scripts/coze-preview-run.sh"] diff --git a/xuexiao/import_excel.py b/xuexiao/import_excel.py new file mode 100644 index 0000000..56678f2 --- /dev/null +++ b/xuexiao/import_excel.py @@ -0,0 +1,637 @@ +#!/usr/bin/env python3 +""" +Excel数据导入SQLite脚本 +导入达尔琳基础数据和课时核对表数据 +""" +import os +import sys +import re +from datetime import datetime, date +from decimal import Decimal + +# 设置环境变量使用SQLite +os.environ['DB_TYPE'] = 'sqlite' + +import openpyxl +from flask import Flask +from config import Config +from models import db, Role, User, Teacher, Student, Course, Class_, ClassStudent, StudentAccount, RechargeRecord + + +def parse_date(value): + """解析日期""" + if value is None: + return None + if isinstance(value, datetime): + return value.date() + if isinstance(value, date): + return value + if isinstance(value, str): + # 处理中文日期格式如 "2026-04-01" 或 "4.5" + value = value.strip() + if re.match(r'^\d{4}-\d{2}-\d{2}', value): + return datetime.strptime(value[:10], '%Y-%m-%d').date() + elif re.match(r'^\d{1,2}\.\d{1,2}$', value): + # 格式如 4.5 表示4月5日,使用当前年份 + parts = value.split('.') + month, day = int(parts[0]), int(parts[1]) + return date(2026, month, day) + elif re.match(r'^\d+$', value): + # Excel日期序列号 + try: + return datetime.fromordinal(datetime(1900, 1, 1).toordinal() + int(value) - 2).date() + except: + pass + return None + + +def parse_number(value): + """解析数字""" + if value is None: + return 0 + if isinstance(value, (int, float)): + return float(value) + if isinstance(value, str): + value = value.strip() + if value == '' or value == '系统合并': + return 0 + try: + return float(value) + except: + return 0 + return 0 + + +def clean_name(name): + """清理姓名中的括号和备注""" + if name is None: + return '' + name = str(name).strip() + # 移除括号及其内容(如 "王莫迪(赛赛)" -> "王莫迪") + name = re.sub(r'(.*?)', '', name) + name = re.sub(r'\(.*?\)', '', name) + return name.strip() + + +def extract_nickname(full_name): + """提取昵称""" + if full_name is None: + return '' + full_name = str(full_name).strip() + # 匹配中文括号 + match = re.search(r'((.+?))', full_name) + if match: + return match.group(1).strip() + # 匹配英文括号 + match = re.search(r'\((.+?)\)', full_name) + if match: + return match.group(1).strip() + return '' + + +def get_gender_from_remark(remark): + """从备注中推断性别""" + if remark and '男' in str(remark): + return '男' + elif remark and '女' in str(remark): + return '女' + return '' + + +def create_app(): + """创建Flask应用""" + app = Flask(__name__) + app.config.from_object(Config) + db.init_app(app) + return app + + +def init_database(app): + """初始化数据库表""" + with app.app_context(): + db.create_all() + # 创建默认角色 + if not Role.query.filter_by(name='管理员').first(): + admin_role = Role(name='管理员', description='系统管理员') + db.session.add(admin_role) + + if not Role.query.filter_by(name='超级管理员').first(): + super_role = Role(name='超级管理员', description='超级管理员', permissions='all') + db.session.add(super_role) + + # 创建默认管理员用户 + if not User.query.filter_by(username='admin').first(): + admin_user = User( + username='admin', + real_name='管理员', + role_id=Role.query.filter_by(name='超级管理员').first().id, + phone='13800000000' + ) + admin_user.set_password('admin123') + db.session.add(admin_user) + + db.session.commit() + print("数据库初始化完成") + + +def import_basic_data(app): + """导入基础数据""" + print("\n" + "=" * 60) + print("开始导入基础数据...") + print("=" * 60) + + with app.app_context(): + # 读取Excel + excel_path = 'assets/达尔琳基础数据.xlsx' + wb = openpyxl.load_workbook(excel_path, data_only=True) + ws = wb['基础信息'] + + # 存储课程映射 (课程名 -> Course对象) + course_map = {} + # 存储班级映射 (班级名 -> Class_对象) + class_map = {} + # 存储老师映射 (老师名 -> Teacher对象) + teacher_map = {} + + # 首先创建默认课程 + default_courses = { + 'scratch': Course(name='Scratch图形编程', level='scratch'), + 'python': Course(name='Python编程', level='python'), + 'c++': Course(name='C++编程', level='c++'), + 'lab': Course(name='Lab编程', level='lab'), + '大班': Course(name='STEM大班', level='大班'), + '中班': Course(name='STEM中班', level='中班'), + '小班': Course(name='STEM小班', level='小班'), + } + for name, course in default_courses.items(): + db.session.add(course) + db.session.commit() + + for name, course in default_courses.items(): + course_map[name] = course + + print(f"已创建 {len(default_courses)} 个默认课程") + + # 从Excel读取数据 + students_data = [] + for row_idx, row in enumerate(ws.iter_rows(min_row=3, values_only=True), 3): + if not row[1]: # 学员姓名 + continue + + student_name = clean_name(row[1]) + if not student_name: + continue + + class_name = str(row[2]).strip() if row[2] else '' + course_level = str(row[3]).strip() if row[3] else '' + nature = str(row[4]).strip() if row[4] else '自费' + + # 解析新签信息 + new_sign_amount = parse_number(row[11]) # 新签金额 + new_sign_hours = parse_number(row[12]) # 新签课时 + new_sign_gift = parse_number(row[13]) # 新签赠课 + new_sign_price = parse_number(row[14]) # 新签课单价 + + # 解析续费信息 + renewal1_amount = parse_number(row[16]) # 续费一金额 + renewal1_hours = parse_number(row[17]) # 续费一课时 + renewal1_gift = parse_number(row[18]) # 赠送课时一 + renewal1_price = parse_number(row[19]) # 续费课单价一 + + renewal2_amount = parse_number(row[20]) # 续费二金额 + renewal2_hours = parse_number(row[21]) # 续费二课时 + renewal2_gift = parse_number(row[22]) # 赠送课时二 + renewal2_price = parse_number(row[23]) # 续费课单价二 + + renewal3_amount = parse_number(row[24]) # 续费三金额 + renewal3_hours = parse_number(row[25]) # 续费三课时 + renewal3_gift = parse_number(row[26]) # 赠送课时三 + renewal3_price = parse_number(row[27]) # 续费课单价三 + + # 剩余课时信息 + remain_hours = parse_number(row[30]) # 3月份剩余课时 + gift_hours = parse_number(row[31]) # 赠课 + remain_total = parse_number(row[32]) # 3月份剩余总课时 + unit_price = parse_number(row[33]) # 单价 + remain_amount = parse_number(row[34]) # 3月末剩余金额 + remark = str(row[35]) if row[35] else '' + + # 提取昵称 + nickname = extract_nickname(str(row[1]) if row[1] else '') + gender = get_gender_from_remark(remark) + + students_data.append({ + 'name': student_name, + 'nickname': nickname, + 'class_name': class_name, + 'course_level': course_level, + 'nature': nature, + 'gender': gender, + 'remark': remark, + 'new_sign_amount': new_sign_amount, + 'new_sign_hours': new_sign_hours, + 'new_sign_gift': new_sign_gift, + 'new_sign_price': new_sign_price, + 'renewal1_amount': renewal1_amount, + 'renewal1_hours': renewal1_hours, + 'renewal1_gift': renewal1_gift, + 'renewal1_price': renewal1_price, + 'renewal2_amount': renewal2_amount, + 'renewal2_hours': renewal2_hours, + 'renewal2_gift': renewal2_gift, + 'renewal2_price': renewal2_price, + 'renewal3_amount': renewal3_amount, + 'renewal3_hours': renewal3_hours, + 'renewal3_gift': renewal3_gift, + 'renewal3_price': renewal3_price, + 'remain_hours': remain_hours, + 'gift_hours': gift_hours, + 'remain_total': remain_total, + 'unit_price': unit_price, + 'remain_amount': remain_amount, + }) + + print(f"从基础数据表读取了 {len(students_data)} 条学员记录") + + # 导入学生 + student_map = {} # name -> Student + account_count = 0 + + for data in students_data: + # 创建或获取学生 + student = Student.query.filter_by(name=data['name']).first() + if not student: + student = Student( + name=data['name'], + nickname=data['nickname'], + gender=data['gender'], + remark=data['remark'], + status=1 + ) + db.session.add(student) + db.session.flush() + student_map[data['name']] = student + elif data['nickname'] and not student.nickname: + student.nickname = data['nickname'] + + # 获取课程 + course = course_map.get(data['course_level']) + if not course: + course = course_map.get('scratch') # 默认 + + # 创建课时账户 + account = StudentAccount.query.filter_by( + student_id=student.id, + course_id=course.id + ).first() + + if not account: + # 计算总课时(正课+赠课) + total_normal = data['remain_hours'] + total_gift = data['gift_hours'] + total_consumed = 0 + + # 根据单价计算 + if data['unit_price'] > 0: + account = StudentAccount( + student_id=student.id, + course_id=course.id, + normal_hours=total_normal, + gifted_hours=total_gift, + consumed_normal=total_consumed, + consumed_gifted=0, + unit_price=data['unit_price'], + original_price_per_lesson=data['unit_price'], + cumulative_amount=data['remain_amount'], + account_status='active' + ) + else: + account = StudentAccount( + student_id=student.id, + course_id=course.id, + normal_hours=total_normal, + gifted_hours=total_gift, + consumed_normal=total_consumed, + consumed_gifted=0, + cumulative_amount=data['remain_amount'], + account_status='active' + ) + db.session.add(account) + account_count += 1 + + # 添加充值记录 + operator = User.query.filter_by(username='admin').first() + if not operator: + continue + + # 新签记录 + if data['new_sign_amount'] > 0: + recharge = RechargeRecord( + student_id=student.id, + course_id=course.id, + amount=data['new_sign_amount'], + normal_hours=data['new_sign_hours'], + gifted_hours=data['new_sign_gift'], + operator_id=operator.id, + remark='新签' + ) + db.session.add(recharge) + + # 续费记录1 + if data['renewal1_amount'] > 0: + recharge = RechargeRecord( + student_id=student.id, + course_id=course.id, + amount=data['renewal1_amount'], + normal_hours=data['renewal1_hours'], + gifted_hours=data['renewal1_gift'], + operator_id=operator.id, + remark='续费一' + ) + db.session.add(recharge) + + # 续费记录2 + if data['renewal2_amount'] > 0: + recharge = RechargeRecord( + student_id=student.id, + course_id=course.id, + amount=data['renewal2_amount'], + normal_hours=data['renewal2_hours'], + gifted_hours=data['renewal2_gift'], + operator_id=operator.id, + remark='续费二' + ) + db.session.add(recharge) + + # 续费记录3 + if data['renewal3_amount'] > 0: + recharge = RechargeRecord( + student_id=student.id, + course_id=course.id, + amount=data['renewal3_amount'], + normal_hours=data['renewal3_hours'], + gifted_hours=data['renewal3_gift'], + operator_id=operator.id, + remark='续费三' + ) + db.session.add(recharge) + + db.session.commit() + print(f"导入完成: {len(student_map)} 名学生, {account_count} 个课时账户") + print(f"充值记录已添加到各学生账户") + + +def import_consumption_data(app): + """导入课时核对表数据(消课记录)""" + print("\n" + "=" * 60) + print("开始导入课时核对表数据...") + print("=" * 60) + + with app.app_context(): + from models import ConsumptionRecord + + excel_path = 'assets/课时核对表_2026_4月份.xlsx' + wb = openpyxl.load_workbook(excel_path, data_only=True) + + total_consumption = 0 + + # 处理每个sheet + for sheet_name in wb.sheetnames: + if sheet_name in ['研学名单', '4月份转账', '校园通转账明细']: + continue # 跳过转账相关sheet + + ws = wb[sheet_name] + print(f"\n处理 Sheet: {sheet_name}") + + # 根据sheet类型确定列位置 + if sheet_name == 'code学龄后': + # 列: A序号 B学员姓名 C课程级别 D3月份剩余课时 E赠送课时 F3月剩余总课时 + # G单价 H3月末剩余金额 I新签金额 J新签课时 K新签赠送课时 L续费金额 M续费课时 + # N续费赠送课时 O4月份已上课时 P4月份已上金额 Q退费课时 R账号费 + # S退赠送课时 T退费金额 U4月份剩余课时 V4月剩余总课时 W4月末剩余金额 + # X4月份上课情况 AA备注 + pass + + # 遍历数据行 + for row_idx, row in enumerate(ws.iter_rows(min_row=3, values_only=True), 3): + if not row[1]: # 学员姓名 + continue + + student_name = clean_name(row[1]) + if not student_name: + continue + + # 找到学生 + student = Student.query.filter_by(name=student_name).first() + if not student: + print(f" 警告: 未找到学生 '{student_name}'") + continue + + # 解析上课日期 + # 根据sheet类型,找到上课情况列 + if sheet_name == 'code学龄后': + attendance_dates = [] # 从X列开始是上课日期 + for col_idx in range(23, 31): # X到AE列 + if col_idx < len(row) and row[col_idx]: + date_val = row[col_idx] + if isinstance(date_val, str): + # 格式如 "4.5", "4.12", "4.19(补)" + date_str = re.sub(r'(.*?)', '', date_val).strip() + parsed_date = parse_date(date_str) + if parsed_date: + attendance_dates.append(parsed_date) + elif isinstance(date_val, (datetime, date)): + if isinstance(date_val, datetime): + attendance_dates.append(date_val.date()) + else: + attendance_dates.append(date_val) + + # 获取已上课时 + consumed_hours = parse_number(row[14] if len(row) > 14 else 0) # O列 + + # 创建消课记录 + if attendance_dates: + for consume_date in attendance_dates: + consumption = ConsumptionRecord( + student_id=student.id, + course_id=student.accounts[0].course_id if student.accounts else 1, + hours_consumed=1, # 每次课1课时 + consume_type='normal', + normal_consumed=1, + gifted_consumed=0, + operator_id=User.query.filter_by(username='admin').first().id, + consume_date=consume_date, + remark=f'从{sheet_name}导入' + ) + db.session.add(consumption) + total_consumption += 1 + + elif sheet_name == 'stem学龄前': + attendance_dates = [] + for col_idx in range(22, 31): # W列开始 + if col_idx < len(row) and row[col_idx]: + date_val = row[col_idx] + if isinstance(date_val, str): + date_str = re.sub(r'(.*?)', '', date_val).strip() + parsed_date = parse_date(date_str) + if parsed_date: + attendance_dates.append(parsed_date) + elif isinstance(date_val, (datetime, date)): + if isinstance(date_val, datetime): + attendance_dates.append(date_val.date()) + else: + attendance_dates.append(date_val) + + if attendance_dates: + for consume_date in attendance_dates: + consumption = ConsumptionRecord( + student_id=student.id, + course_id=student.accounts[0].course_id if student.accounts else 2, + hours_consumed=1, + consume_type='normal', + normal_consumed=1, + gifted_consumed=0, + operator_id=User.query.filter_by(username='admin').first().id, + consume_date=consume_date, + remark=f'从{sheet_name}导入' + ) + db.session.add(consumption) + total_consumption += 1 + + elif sheet_name == '学龄后lab': + attendance_dates = [] + for col_idx in range(15, 26): # P列开始 + if col_idx < len(row) and row[col_idx]: + date_val = row[col_idx] + if isinstance(date_val, str): + date_str = re.sub(r'(.*?)', '', date_val).strip() + parsed_date = parse_date(date_str) + if parsed_date: + attendance_dates.append(parsed_date) + elif isinstance(date_val, (datetime, date)): + if isinstance(date_val, datetime): + attendance_dates.append(date_val.date()) + else: + attendance_dates.append(date_val) + + if attendance_dates: + for consume_date in attendance_dates: + consumption = ConsumptionRecord( + student_id=student.id, + course_id=student.accounts[0].course_id if student.accounts else 4, + hours_consumed=1, + consume_type='normal', + normal_consumed=1, + gifted_consumed=0, + operator_id=User.query.filter_by(username='admin').first().id, + consume_date=consume_date, + remark=f'从{sheet_name}导入' + ) + db.session.add(consumption) + total_consumption += 1 + + elif sheet_name == '免费': + attendance_dates = [] + for col_idx in range(6, 12): # G列开始是上课日期 + if col_idx < len(row) and row[col_idx]: + date_val = row[col_idx] + if isinstance(date_val, str): + date_str = re.sub(r'(.*?)', '', date_val).strip() + # 免费课日期格式可能不同 + if re.match(r'^\d{1,2}\.\d{1,2}', date_str): + parts = date_str.split('.') + month, day = int(parts[0]), int(parts[1][:2]) + parsed_date = date(2026, month, day) + attendance_dates.append(parsed_date) + elif isinstance(date_val, (datetime, date)): + if isinstance(date_val, datetime): + attendance_dates.append(date_val.date()) + else: + attendance_dates.append(date_val) + + if attendance_dates: + for consume_date in attendance_dates: + consumption = ConsumptionRecord( + student_id=student.id, + course_id=1, # 免费课 + hours_consumed=1, + consume_type='gift', + normal_consumed=0, + gifted_consumed=1, + operator_id=User.query.filter_by(username='admin').first().id, + consume_date=consume_date, + remark=f'从{sheet_name}导入' + ) + db.session.add(consumption) + total_consumption += 1 + + db.session.commit() + print(f"\n消课记录导入完成: {total_consumption} 条记录") + + +def verify_data(app): + """验证数据完整性""" + print("\n" + "=" * 60) + print("数据完整性验证...") + print("=" * 60) + + with app.app_context(): + student_count = Student.query.count() + account_count = StudentAccount.query.count() + recharge_count = RechargeRecord.query.count() + consumption_count = ConsumptionRecord.query.count() if 'ConsumptionRecord' in dir() else 0 + course_count = Course.query.count() + + print(f"\n数据统计:") + print(f" - 学生总数: {student_count}") + print(f" - 课时账户: {account_count}") + print(f" - 充值记录: {recharge_count}") + print(f" - 课程数量: {course_count}") + + # 验证消课记录 + from models import ConsumptionRecord + consumption_count = ConsumptionRecord.query.count() + print(f" - 消课记录: {consumption_count}") + + # 按课程统计学生 + print("\n按课程统计:") + for course in Course.query.all(): + count = StudentAccount.query.filter_by(course_id=course.id).count() + print(f" - {course.name}: {count} 名学生") + + # 显示部分学生数据 + print("\n部分学生数据示例:") + for student in Student.query.limit(5).all(): + print(f" - {student.name} (ID:{student.id})") + for account in student.accounts: + print(f" 课程: {account.course.name}, 正课: {account.normal_hours}, 赠课: {account.gifted_hours}, 单价: {account.unit_price}") + + +def main(): + """主函数""" + print("=" * 60) + print("达尔琳数据导入工具") + print("=" * 60) + + # 创建应用 + app = create_app() + + # 初始化数据库 + init_database(app) + + # 导入基础数据 + import_basic_data(app) + + # 导入课时核对表数据 + import_consumption_data(app) + + # 验证数据 + verify_data(app) + + print("\n" + "=" * 60) + print("导入完成!") + print("=" * 60) + + +if __name__ == '__main__': + main() diff --git a/xuexiao/instance/student_course.db b/xuexiao/instance/student_course.db index 02a8e504daedbd55acb002a2ce16217be9816358..6f53ad9b5735642aca288107bf3428cc839b9ca7 100644 GIT binary patch literal 380928 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 Mv$`x7!mF(R3vbR5%>V!Z delta 123 zcmZozAl}fxK0%t*j)8$eW}<>Uqus`YCHy=rTxAUW8+c5)&AG}pD=MUMZ7!4QW94As z-^;+im;dHwK81z+lMMs}ChygE-t>V*VKYm>AN^$wj0Rg6Sp*id90*_*;Jz@OU4T&$ ZsCxzX_6yRC1}YG_4+`5^3K;+R0{~^$B&+}c diff --git a/xuexiao/scripts/coze-preview-build.sh b/xuexiao/scripts/coze-preview-build.sh new file mode 100755 index 0000000..39bd679 --- /dev/null +++ b/xuexiao/scripts/coze-preview-build.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -euo pipefail + +# 基于脚本位置定位项目根目录 +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_DIR="$SCRIPT_DIR" +cd "$PROJECT_DIR" + +# 设置环境变量使用SQLite +export DB_TYPE=sqlite + +# 安装依赖(如果需要) +pip install -q flask flask-sqlalchemy openpyxl werkzeug pymysql cryptography 2>/dev/null || true + +echo "Build complete" diff --git a/xuexiao/scripts/coze-preview-run.sh b/xuexiao/scripts/coze-preview-run.sh new file mode 100755 index 0000000..2d432e8 --- /dev/null +++ b/xuexiao/scripts/coze-preview-run.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail + +# 基于脚本位置定位项目根目录 +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" +cd "$PROJECT_DIR" + +# 设置环境变量使用SQLite +export DB_TYPE=sqlite +export FLASK_ENV=development +export PORT=5000 +export PYTHONPATH="$PROJECT_DIR" + +# 清理 5000 端口残留进程(绝不碰 9000) +fuser -k 5000/tcp 2>/dev/null || true +sleep 1 + +# 启动Flask应用 +exec python3 wsgi.py diff --git a/xuexiao/wsgi.py b/xuexiao/wsgi.py new file mode 100644 index 0000000..d67cc54 --- /dev/null +++ b/xuexiao/wsgi.py @@ -0,0 +1,9 @@ +""" +WSGI 入口文件,用于启动 Flask 应用 +""" +from app import create_app + +app = create_app() + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000, debug=True)