diff --git a/AI/A1_Flask.py b/AI/A1_Flask.py new file mode 100644 index 00000000..f12e3cb9 --- /dev/null +++ b/AI/A1_Flask.py @@ -0,0 +1,124 @@ +import os +import uuid +import threading +from flask import Flask, request, jsonify +from oss2 import Auth, Bucket +from A1_GenerateMarkdown import * +from A2_MarkdownToPptx import * +from A3_MarkdownToDocx import * + +app = Flask(__name__) + +# 内存存储任务状态 +tasks = {} +# OSS配置 +OSS_ACCESS_KEY = 'LTAI5t5jxkgJtRK8wew8fnbq' +OSS_SECRET_KEY = 'b8HXNGz7IkI3Dhv7BZx9BNBEZy1uku' +OSS_ENDPOINT = 'oss-cn-hangzhou.aliyuncs.com' +OSS_BUCKET_NAME = 'ylt' +# 或者更明确的写法(推荐) +OSS_PREFIX = f'https://{OSS_BUCKET_NAME}.{OSS_ENDPOINT.replace("https://", "")}' + +# 初始化OSS客户端 +oss_auth = Auth(OSS_ACCESS_KEY, OSS_SECRET_KEY) +oss_bucket = Bucket(oss_auth, OSS_ENDPOINT, OSS_BUCKET_NAME) + + +def async_generate_task(guid, course_name): + """异步生成任务""" + try: + tasks[guid] = {'status': 'processing', 'files': {}} + + # 生成Markdown + md_path = mdWorkingPath / f"{guid}.md" + generate_document(course_name, md_path) + + # 生成PPTX + pptx_path = Path(f"/tmp/{guid}.pptx") + generate("通用", str(pptx_path), str(md_path)) + pptx_url = upload_to_oss(pptx_path, f"HuangHai/pptx/{guid}.pptx") + tasks[guid]['files']['pptx'] = pptx_url + + # 生成DOCX + docx_path = Path(f"/tmp/{guid}.docx") + convert_md_to_docx( + input_md=str(md_path), + output_docx=str(docx_path), + reference_template=Path(__file__).parent / "left-aligned-template.docx" + ) + docx_url = upload_to_oss(docx_path, f"docx/{guid}.docx") + tasks[guid]['files']['docx'] = docx_url + + # 清理临时文件 + os.remove(md_path) + os.remove(pptx_path) + os.remove(docx_path) + + tasks[guid]['status'] = 'completed' + except Exception as e: + tasks[guid]['status'] = 'failed' + tasks[guid]['error'] = str(e) + + +def upload_to_oss(local_path, object_name): + """上传文件到OSS""" + # 添加路径格式校验 + if object_name.startswith('/'): + object_name = object_name[1:] + oss_bucket.put_object_from_file(object_name, str(local_path)) + return f"{OSS_PREFIX}/{object_name}" + + +@app.route('/submit', methods=['POST']) +def submit_task(): + """提交生成任务接口""" + course_name = request.json.get('course_name') + if not course_name: + return jsonify({'code': 400, 'msg': '课程名称不能为空'}), 400 + + guid = str(uuid.uuid4()) + tasks[guid] = {'status': 'pending'} # 初始状态 + + # 启动异步任务 + thread = threading.Thread( + target=async_generate_task, + args=(guid, course_name) + ) + thread.start() + + return jsonify({ + 'code': 0, + 'msg': '任务已提交', + 'task_id': guid + }) + + +@app.route('/check/') +def check_task(guid): + """查询任务状态接口""" + task = tasks.get(guid) + if not task: + return jsonify({'code': 404, 'msg': '任务不存在'}), 404 + + if task['status'] == 'completed': + return jsonify({ + 'code': 0, + 'status': 'completed', + 'files': task['files'] + }) + elif task['status'] == 'failed': + return jsonify({ + 'code': 500, + 'status': 'failed', + 'error': task.get('error', '未知错误') + }) + else: + return jsonify({ + 'code': 0, + 'status': 'processing', + 'msg': '生成进行中,请稍后查询' + }) + + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000, threaded=True) \ No newline at end of file diff --git a/AI/__pycache__/A1_GenerateMarkdown.cpython-310.pyc b/AI/__pycache__/A1_GenerateMarkdown.cpython-310.pyc index ee7daa3b..56d117c9 100644 Binary files a/AI/__pycache__/A1_GenerateMarkdown.cpython-310.pyc and b/AI/__pycache__/A1_GenerateMarkdown.cpython-310.pyc differ diff --git a/AI/__pycache__/A3_MarkdownToDocx.cpython-310.pyc b/AI/__pycache__/A3_MarkdownToDocx.cpython-310.pyc index 3993c9fd..42be9bdb 100644 Binary files a/AI/__pycache__/A3_MarkdownToDocx.cpython-310.pyc and b/AI/__pycache__/A3_MarkdownToDocx.cpython-310.pyc differ diff --git a/WebRoot/Excel/1bb7ed98-8d16-448f-8ce4-38eae69c5bbc.xlsx b/WebRoot/Excel/1bb7ed98-8d16-448f-8ce4-38eae69c5bbc.xlsx new file mode 100644 index 00000000..8ebdda6e Binary files /dev/null and b/WebRoot/Excel/1bb7ed98-8d16-448f-8ce4-38eae69c5bbc.xlsx differ diff --git a/WebRoot/Excel/2b383736-ecb6-441f-84c7-cd64e849fe22.xlsx b/WebRoot/Excel/2b383736-ecb6-441f-84c7-cd64e849fe22.xlsx new file mode 100644 index 00000000..fe4f2b93 Binary files /dev/null and b/WebRoot/Excel/2b383736-ecb6-441f-84c7-cd64e849fe22.xlsx differ