修复数据库问题
This commit is contained in:
1 parent
b196cb62ad
commit
43dec49e04
27 files changed
+1991
-132
No files matched your search
+272
@@ -270493,3 +270493,275 @@
|
||||
2025-08-06 16:19:06,164 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:19:27,996 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:19:27,997 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:53:49,521 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:53:49,522 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:53:56,286 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:53:56,287 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:53:56,352 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:53:56,353 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:53:56,354 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:54:03,376 - backend.main - INFO - 访问根端点
|
||||
2025-08-06 16:54:44,485 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:54:44,485 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:54:44,535 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:54:44,536 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:54:44,536 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:55:15,462 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:55:15,462 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:55:15,516 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:55:15,516 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:55:15,517 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:56:42,843 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:56:42,843 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:56:42,895 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:56:42,896 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:56:42,896 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:56:54,351 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:56:54,352 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:56:54,405 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:56:54,406 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:56:54,406 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:57:22,469 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:57:22,469 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:57:22,521 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:57:22,521 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:57:22,522 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:57:36,965 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
|
||||
2025-08-06 16:57:56,741 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:57:56,742 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:57:56,819 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:57:56,820 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:57:56,820 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:58:27,987 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:58:27,987 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:58:28,061 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:58:28,062 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:58:28,062 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:59:05,440 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:59:05,441 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:59:05,510 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:59:05,511 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:59:05,511 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:59:32,086 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
|
||||
2025-08-06 16:59:49,979 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:59:49,980 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:59:50,064 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:59:50,065 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:59:50,065 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:00:46,657 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:00:46,657 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:00:46,731 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:00:46,731 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:00:46,732 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:00:56,567 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:00:56,567 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:00:56,621 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:00:56,622 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:00:56,622 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:01:11,557 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
|
||||
2025-08-06 17:03:16,672 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:03:16,672 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:03:16,741 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:03:16,742 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:03:16,742 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:03:31,861 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
|
||||
2025-08-06 17:04:17,690 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:04:17,691 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:04:17,799 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:04:17,801 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:04:17,801 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:04:30,445 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:04:30,445 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:04:30,496 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:04:30,497 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:04:30,497 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:04:38,400 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:04:38,400 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:04:38,450 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:04:38,451 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:04:38,451 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:04:56,025 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
|
||||
2025-08-06 17:05:47,870 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:05:47,870 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:05:47,921 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:05:47,922 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:05:47,922 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:06:01,190 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
|
||||
2025-08-06 17:07:12,421 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
|
||||
2025-08-06 17:08:12,568 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:08:12,569 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:08:12,634 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:08:12,634 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:08:12,634 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:08:28,320 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:08:28,320 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:08:28,369 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:08:28,369 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:08:28,370 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:08:45,319 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:08:45,319 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:08:45,387 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:08:45,388 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:08:45,388 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:08:57,474 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:08:57,474 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:08:57,524 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:08:57,524 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:08:57,524 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:09:09,929 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:09:09,930 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:09:09,980 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:09:09,980 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:09:09,981 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:09:22,037 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:09:22,037 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:09:22,101 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:09:22,102 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:09:22,102 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:09:42,110 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
|
||||
2025-08-06 17:11:12,308 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:11:12,308 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:11:12,378 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:11:12,379 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:11:12,380 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:11:26,301 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:11:26,302 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:11:26,368 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:11:26,369 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:11:26,369 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:11:39,655 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:11:39,656 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:11:39,722 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:11:39,724 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:11:39,724 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:11:52,013 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:11:52,014 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:11:52,079 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:11:52,080 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:11:52,080 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:12:03,804 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:12:03,804 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:12:03,858 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:12:03,859 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:12:03,859 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:12:16,233 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:12:16,234 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:12:16,299 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:12:16,300 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:12:16,300 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:13:21,729 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 324a9c81-1b4f-4ce6-96d4-3b7a75e34b05 - processing
|
||||
2025-08-06 17:15:16,083 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:15:16,083 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:15:16,149 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:15:16,150 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:15:16,150 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:19:13,816 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:19:13,816 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:19:13,880 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:19:13,881 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:19:13,881 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:22:20,920 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:22:20,921 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:22:20,986 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:22:20,986 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:22:20,987 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:22:44,864 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:22:44,864 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:22:44,913 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:22:44,914 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:22:44,914 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:23:11,778 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:23:11,778 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:23:11,829 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:23:11,830 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:23:11,830 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:23:24,307 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:23:24,307 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:23:24,358 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:23:24,358 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:23:24,359 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:23:41,578 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:23:41,578 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:23:41,626 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:23:41,627 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:23:41,627 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:23:55,750 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:23:55,750 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:23:55,800 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:23:55,801 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:23:55,801 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:25:11,212 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:25:11,215 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:25:11,280 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:25:11,281 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:25:11,281 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:25:28,388 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:25:28,390 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:25:28,439 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:25:28,440 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:25:28,440 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:25:55,127 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:25:55,129 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:25:55,179 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:25:55,179 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:25:55,179 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:26:15,561 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:26:15,563 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:26:15,633 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:26:15,634 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:26:15,634 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:26:31,018 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:26:31,020 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:26:31,087 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:26:31,087 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:26:31,087 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:26:48,110 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:26:48,112 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:26:48,179 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:26:48,180 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:26:48,180 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:27:56,784 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:27:56,784 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:27:56,833 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:27:56,834 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:27:56,834 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:28:52,954 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:28:52,954 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:28:53,003 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:28:53,003 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:28:53,004 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:29:06,568 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:29:06,569 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:29:06,616 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:29:06,617 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:29:06,617 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:29:31,221 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:29:31,221 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:29:31,270 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:29:31,271 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:29:31,271 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:29:47,491 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:29:47,491 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:29:47,540 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:29:47,541 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:29:47,541 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:30:09,544 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:30:09,544 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:30:09,593 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:30:09,593 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:30:09,594 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:30:25,831 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:30:25,831 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:30:25,882 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:30:25,882 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:30:25,882 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:30:45,521 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:30:45,521 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:30:45,587 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:30:45,588 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:30:45,588 - backend.main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:31:01,178 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:31:01,180 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:31:01,244 - backend.main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:31:01,245 - backend.main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:31:01,245 - backend.main - INFO - API密钥已加载到环境变量
|
||||
+40
-41
@@ -6,17 +6,18 @@ from typing import List, Optional
|
||||
from datetime import datetime
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query, UploadFile, File, Form
|
||||
from sqlalchemy.orm import Session
|
||||
from backend.core.database import get_db
|
||||
from backend.services.project_service import ProjectService
|
||||
from backend.services.processing_service import ProcessingService
|
||||
from backend.services.websocket_notification_service import WebSocketNotificationService
|
||||
from backend.tasks.processing import process_video_pipeline
|
||||
from backend.core.websocket_manager import manager as websocket_manager
|
||||
from backend.schemas.project import (
|
||||
from core.database import get_db
|
||||
from services.project_service import ProjectService
|
||||
from services.processing_service import ProcessingService
|
||||
from services.websocket_notification_service import WebSocketNotificationService
|
||||
from tasks.processing import process_video_pipeline
|
||||
from core.websocket_manager import manager as websocket_manager
|
||||
from schemas.project import (
|
||||
ProjectCreate, ProjectUpdate, ProjectResponse, ProjectListResponse, ProjectFilter,
|
||||
ProjectType, ProjectStatus
|
||||
)
|
||||
from backend.schemas.base import PaginationParams
|
||||
from schemas.task import TaskType
|
||||
from schemas.base import PaginationParams
|
||||
from pathlib import Path
|
||||
|
||||
router = APIRouter()
|
||||
@@ -95,8 +96,8 @@ async def upload_files(
|
||||
id=str(project.id),
|
||||
name=str(project.name),
|
||||
description=str(project.description) if project.description else None,
|
||||
project_type=ProjectType(project.project_type.value),
|
||||
status=ProjectStatus(project.status.value),
|
||||
project_type=ProjectType(project.project_type) if hasattr(project.project_type, 'value') else ProjectType(project.project_type),
|
||||
status=ProjectStatus(project.status) if hasattr(project.status, 'value') else ProjectStatus(project.status),
|
||||
source_url=project.project_metadata.get("source_url") if project.project_metadata else None,
|
||||
source_file=project.project_metadata.get("source_file") if project.project_metadata else None,
|
||||
settings=project.processing_config,
|
||||
@@ -124,8 +125,8 @@ async def create_project(
|
||||
id=str(project.id), # Use actual project ID
|
||||
name=str(project.name),
|
||||
description=str(project.description) if project.description else None,
|
||||
project_type=ProjectType(project.project_type.value),
|
||||
status=ProjectStatus(project.status.value),
|
||||
project_type=ProjectType(project.project_type) if hasattr(project.project_type, 'value') else ProjectType(project.project_type),
|
||||
status=ProjectStatus(project.status) if hasattr(project.status, 'value') else ProjectStatus(project.status),
|
||||
source_url=project.project_metadata.get("source_url") if project.project_metadata else None,
|
||||
source_file=str(project.video_path) if project.video_path else None,
|
||||
settings=project.processing_config or {},
|
||||
@@ -195,19 +196,19 @@ async def update_project(
|
||||
if not project:
|
||||
raise HTTPException(status_code=404, detail="Project not found")
|
||||
|
||||
# Convert to response (simplified)
|
||||
# Convert to response using the updated project data
|
||||
return ProjectResponse(
|
||||
id=str(project_id), # Keep as string for UUID
|
||||
name=project_data.name or "Updated Project",
|
||||
description=project_data.description,
|
||||
project_type=ProjectType.DEFAULT, # Use enum
|
||||
status=ProjectStatus.PENDING, # Use enum
|
||||
source_url=None,
|
||||
source_file=None,
|
||||
settings=project_data.settings or {},
|
||||
created_at=datetime.utcnow(),
|
||||
updated_at=datetime.utcnow(),
|
||||
completed_at=None,
|
||||
id=str(project_id),
|
||||
name=project.name,
|
||||
description=project.description,
|
||||
project_type=ProjectType(project.project_type.value if hasattr(project.project_type, 'value') else project.project_type),
|
||||
status=ProjectStatus(project.status.value if hasattr(project.status, 'value') else project.status),
|
||||
source_url=project.project_metadata.get("source_url") if project.project_metadata else None,
|
||||
source_file=str(project.video_path) if project.video_path else None,
|
||||
settings=project.processing_config or {},
|
||||
created_at=project.created_at,
|
||||
updated_at=project.updated_at,
|
||||
completed_at=project.completed_at,
|
||||
total_clips=0,
|
||||
total_collections=0,
|
||||
total_tasks=0
|
||||
@@ -250,7 +251,7 @@ async def start_processing(
|
||||
raise HTTPException(status_code=404, detail="Project not found")
|
||||
|
||||
# 检查项目状态
|
||||
if project.status.value not in ["pending", "failed"]:
|
||||
if project.status not in ["pending", "failed"]:
|
||||
raise HTTPException(status_code=400, detail="Project is not in pending or failed status")
|
||||
|
||||
# 获取视频和SRT文件路径
|
||||
@@ -277,22 +278,21 @@ async def start_processing(
|
||||
|
||||
# 发送WebSocket通知:处理开始
|
||||
await websocket_service.send_processing_started(
|
||||
project_id=int(project_id),
|
||||
project_id=project_id,
|
||||
message="开始视频处理流程"
|
||||
)
|
||||
|
||||
# 提交Celery任务
|
||||
celery_task = process_video_pipeline.delay(
|
||||
project_id=int(project_id),
|
||||
project_id=project_id,
|
||||
input_video_path=str(video_path),
|
||||
input_srt_path=str(srt_path)
|
||||
)
|
||||
|
||||
# 创建处理任务记录
|
||||
task_result = processing_service._create_processing_task(
|
||||
project_id=int(project_id),
|
||||
task_type="video_pipeline",
|
||||
celery_task_id=celery_task.id
|
||||
project_id=project_id,
|
||||
task_type=TaskType.VIDEO_PROCESSING
|
||||
)
|
||||
|
||||
return {
|
||||
@@ -309,7 +309,7 @@ async def start_processing(
|
||||
# 发送错误通知
|
||||
try:
|
||||
await websocket_service.send_processing_error(
|
||||
project_id=int(project_id),
|
||||
project_id=project_id,
|
||||
error=str(e),
|
||||
step="initialization"
|
||||
)
|
||||
@@ -333,7 +333,7 @@ async def retry_processing(
|
||||
raise HTTPException(status_code=404, detail="Project not found")
|
||||
|
||||
# 检查项目状态
|
||||
if project.status.value not in ["failed", "completed"]:
|
||||
if project.status not in ["failed", "completed"]:
|
||||
raise HTTPException(status_code=400, detail="Project is not in failed or completed status")
|
||||
|
||||
# 重置项目状态
|
||||
@@ -341,7 +341,7 @@ async def retry_processing(
|
||||
|
||||
# 发送WebSocket通知
|
||||
await websocket_service.send_processing_started(
|
||||
project_id=int(project_id),
|
||||
project_id=project_id,
|
||||
message="重新开始处理流程"
|
||||
)
|
||||
|
||||
@@ -365,16 +365,15 @@ async def retry_processing(
|
||||
|
||||
# 提交Celery任务
|
||||
celery_task = process_video_pipeline.delay(
|
||||
project_id=int(project_id),
|
||||
project_id=project_id,
|
||||
input_video_path=str(video_path),
|
||||
input_srt_path=str(srt_path)
|
||||
)
|
||||
|
||||
# 创建新的处理任务记录
|
||||
task_result = processing_service._create_processing_task(
|
||||
project_id=int(project_id),
|
||||
task_type="video_pipeline_retry",
|
||||
celery_task_id=celery_task.id
|
||||
project_id=project_id,
|
||||
task_type="video_pipeline_retry"
|
||||
)
|
||||
|
||||
return {
|
||||
@@ -390,7 +389,7 @@ async def retry_processing(
|
||||
except Exception as e:
|
||||
try:
|
||||
await websocket_service.send_processing_error(
|
||||
project_id=int(project_id),
|
||||
project_id=project_id,
|
||||
error=str(e),
|
||||
step="retry_initialization"
|
||||
)
|
||||
@@ -415,7 +414,7 @@ async def resume_processing(
|
||||
raise HTTPException(status_code=404, detail="Project not found")
|
||||
|
||||
# 检查项目状态
|
||||
if project.status.value not in ["failed", "processing", "pending"]:
|
||||
if project.status not in ["failed", "processing", "pending"]:
|
||||
raise HTTPException(status_code=400, detail="Project is not in failed, processing, or pending status")
|
||||
|
||||
# 验证步骤名称
|
||||
@@ -447,7 +446,7 @@ async def resume_processing(
|
||||
|
||||
# 发送WebSocket通知
|
||||
await websocket_service.send_processing_started(
|
||||
project_id=int(project_id),
|
||||
project_id=project_id,
|
||||
message=f"从步骤 {start_step} 恢复处理流程"
|
||||
)
|
||||
|
||||
@@ -471,7 +470,7 @@ async def resume_processing(
|
||||
except Exception as e:
|
||||
try:
|
||||
await websocket_service.send_processing_error(
|
||||
project_id=int(project_id),
|
||||
project_id=project_id,
|
||||
error=str(e),
|
||||
step=f"resume_{start_step}"
|
||||
)
|
||||
|
||||
@@ -61,17 +61,18 @@ async def get_tasks(
|
||||
task_responses.append(TaskResponse(
|
||||
id=str(task.id),
|
||||
project_id=task.project_id,
|
||||
name=task.name, # 添加name字段
|
||||
name=task.name,
|
||||
task_type=task.task_type,
|
||||
status=TaskStatus(task.status),
|
||||
celery_task_id=task.celery_task_id,
|
||||
current_step=task.current_step,
|
||||
total_steps=task.total_steps,
|
||||
progress=task.progress,
|
||||
error_message=task.error_message,
|
||||
task_config=task.task_config or {},
|
||||
result=task.result_data,
|
||||
error_message=task.error_message,
|
||||
priority=task.priority,
|
||||
metadata=task.task_metadata or {},
|
||||
created_at=task.created_at,
|
||||
updated_at=task.updated_at,
|
||||
started_at=task.started_at,
|
||||
completed_at=task.completed_at
|
||||
))
|
||||
|
||||
@@ -335,7 +336,7 @@ async def retry_task(
|
||||
|
||||
@router.get("/project/{project_id}", response_model=TaskListResponse)
|
||||
async def get_project_tasks(
|
||||
project_id: int,
|
||||
project_id: str,
|
||||
page: int = Query(1, ge=1, description="Page number"),
|
||||
size: int = Query(20, ge=1, le=100, description="Page size"),
|
||||
status: Optional[str] = Query(None, description="Filter by task status"),
|
||||
|
||||
@@ -47,3 +47,87 @@
|
||||
2025-08-06 16:27:17,506 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:27:17,506 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:27:17,507 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:37:34,139 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:37:34,140 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:37:34,207 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:37:34,208 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:37:34,208 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:38:47,321 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:38:47,322 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:38:47,374 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:38:47,375 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:38:47,375 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:39:43,400 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:39:43,400 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:39:43,453 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:39:43,454 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:39:43,454 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:41:37,870 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:41:37,870 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:41:37,937 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:41:37,938 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:41:37,938 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:41:49,381 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:41:49,381 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:41:49,434 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:41:49,435 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:41:49,435 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:42:12,124 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: f70ba71d-53e3-4162-acc0-c80da61a05eb - processing
|
||||
2025-08-06 16:42:23,765 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:42:23,766 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:42:23,836 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:42:23,836 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:42:23,836 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:43:02,751 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: f70ba71d-53e3-4162-acc0-c80da61a05eb - processing
|
||||
2025-08-06 16:43:25,482 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:43:25,482 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:43:25,536 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:43:25,537 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:43:25,537 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:43:40,539 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:43:40,539 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:43:40,591 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:43:40,592 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:43:40,592 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:44:07,516 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: f70ba71d-53e3-4162-acc0-c80da61a05eb - processing
|
||||
2025-08-06 16:44:27,637 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:44:27,637 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:44:27,692 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:44:27,693 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:44:27,693 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:44:43,074 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:44:43,074 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:44:43,127 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:44:43,128 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:44:43,128 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:45:13,621 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:45:13,622 - backend.services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 16:45:13,676 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 16:45:13,677 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 16:45:13,677 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 16:45:39,549 - backend.services.websocket_notification_service - INFO - 项目更新通知已发送: 9e930785-38da-468c-b4f3-875e0c5eb501 - processing
|
||||
2025-08-06 17:41:42,018 - services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:41:49,745 - services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:42:08,512 - services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:42:08,515 - services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:42:15,599 - services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:42:15,600 - services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:44:16,206 - services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:44:16,208 - services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:44:22,473 - services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:44:22,473 - services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:44:22,855 - services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:44:22,855 - services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:47:17,234 - services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:47:17,235 - services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:47:17,263 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:47:17,310 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:47:17,311 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:47:17,311 - main - INFO - API密钥已加载到环境变量
|
||||
2025-08-06 17:48:13,664 - main - INFO - 访问根端点
|
||||
2025-08-06 17:50:59,350 - services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:50:59,351 - services.processing_orchestrator - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:50:59,386 - backend.services.pipeline_adapter - INFO - 流水线模块导入成功
|
||||
2025-08-06 17:50:59,434 - main - INFO - 启动AutoClip API服务...
|
||||
2025-08-06 17:50:59,434 - main - INFO - 数据库表创建完成
|
||||
2025-08-06 17:50:59,435 - main - INFO - API密钥已加载到环境变量
|
||||
@@ -8,10 +8,10 @@ from typing import Dict, Any, Optional, Callable
|
||||
from datetime import datetime
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from backend.models.task import Task
|
||||
from backend.models.project import Project
|
||||
from backend.services.websocket_notification_service import WebSocketNotificationService
|
||||
from backend.core.websocket_manager import manager as websocket_manager
|
||||
from models.task import Task
|
||||
from models.project import Project
|
||||
from services.websocket_notification_service import WebSocketNotificationService
|
||||
from core.websocket_manager import manager as websocket_manager
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
+703
@@ -0,0 +1,703 @@
|
||||
1
|
||||
00:00:00,210 --> 00:00:01,932
|
||||
你们都是什么区块链
|
||||
|
||||
2
|
||||
00:00:03,200 --> 00:00:04,500
|
||||
我说一句话
|
||||
|
||||
3
|
||||
00:00:04,500 --> 00:00:07,888
|
||||
比你外面你自己或你自己瞎操作十年二十年都有用
|
||||
|
||||
4
|
||||
00:00:08,780 --> 00:00:09,548
|
||||
但是你听不懂
|
||||
|
||||
5
|
||||
00:00:10,530 --> 00:00:11,280
|
||||
配三个固态
|
||||
|
||||
6
|
||||
00:00:11,280 --> 00:00:12,320
|
||||
那哥们儿那你出来
|
||||
|
||||
7
|
||||
00:00:12,500 --> 00:00:13,508
|
||||
这不是你他妈又割了
|
||||
|
||||
8
|
||||
00:00:14,050 --> 00:00:15,818
|
||||
割了说因为Z哥说要控制风险
|
||||
|
||||
9
|
||||
00:00:15,830 --> 00:00:16,565
|
||||
所以我他妈割了
|
||||
|
||||
10
|
||||
00:00:16,680 --> 00:00:18,090
|
||||
所以我说傻逼叫你炒股
|
||||
|
||||
11
|
||||
00:00:18,090 --> 00:00:19,034
|
||||
你赚钱跟我没关系
|
||||
|
||||
12
|
||||
00:00:19,040 --> 00:00:20,480
|
||||
你他妈亏钱就是他让我买的
|
||||
|
||||
13
|
||||
00:00:20,700 --> 00:00:21,663
|
||||
我他妈从来没让你买
|
||||
|
||||
14
|
||||
00:00:21,920 --> 00:00:22,390
|
||||
对吗
|
||||
|
||||
15
|
||||
00:00:22,870 --> 00:00:23,686
|
||||
配置还是配置
|
||||
|
||||
16
|
||||
00:00:23,770 --> 00:00:26,058
|
||||
你他妈一个仓配配了三个固态
|
||||
|
||||
17
|
||||
00:00:26,060 --> 00:00:27,360
|
||||
你那赖谁
|
||||
|
||||
18
|
||||
00:00:28,610 --> 00:00:29,780
|
||||
所以这钱你认知不够
|
||||
|
||||
19
|
||||
00:00:29,780 --> 00:00:30,650
|
||||
你就赚不了
|
||||
|
||||
20
|
||||
00:00:30,970 --> 00:00:31,579
|
||||
很正常
|
||||
|
||||
21
|
||||
00:00:31,580 --> 00:00:32,300
|
||||
你就赚不了
|
||||
|
||||
22
|
||||
00:00:34,760 --> 00:00:35,390
|
||||
配三个固态
|
||||
|
||||
23
|
||||
00:00:35,390 --> 00:00:37,040
|
||||
哥们儿前天还发视频总结自己成绩
|
||||
|
||||
24
|
||||
00:00:37,160 --> 00:00:37,680
|
||||
是吗
|
||||
|
||||
25
|
||||
00:00:37,680 --> 00:00:38,728
|
||||
他觉得他行了是吗
|
||||
|
||||
26
|
||||
00:00:39,110 --> 00:00:39,990
|
||||
他不骂我了
|
||||
|
||||
27
|
||||
00:00:40,240 --> 00:00:41,640
|
||||
他他他他不卖门
|
||||
|
||||
28
|
||||
00:00:41,640 --> 00:00:43,134
|
||||
他妈的诋毁我了是吗
|
||||
|
||||
29
|
||||
00:00:44,230 --> 00:00:45,210
|
||||
人性人性
|
||||
|
||||
30
|
||||
00:00:45,350 --> 00:00:47,950
|
||||
我操这人人性人性
|
||||
|
||||
31
|
||||
00:00:48,080 --> 00:00:50,790
|
||||
我操没办法
|
||||
|
||||
32
|
||||
00:00:50,790 --> 00:00:54,320
|
||||
这他妈人性是不是人性
|
||||
|
||||
33
|
||||
00:00:54,940 --> 00:00:58,056
|
||||
我周三我说我说没准你下礼拜就ZGNB了
|
||||
|
||||
34
|
||||
00:00:58,380 --> 00:00:58,880
|
||||
对吗
|
||||
|
||||
35
|
||||
00:01:01,000 --> 00:01:03,272
|
||||
所以我说这个市场永远是有经验人赚
|
||||
|
||||
36
|
||||
00:01:03,280 --> 00:01:05,247
|
||||
没经验钱的地方
|
||||
|
||||
37
|
||||
00:01:06,390 --> 00:01:07,720
|
||||
就是说什么意思
|
||||
|
||||
38
|
||||
00:01:07,720 --> 00:01:08,746
|
||||
我不是吹牛逼
|
||||
|
||||
39
|
||||
00:01:08,750 --> 00:01:11,846
|
||||
咱上礼拜三我给你们举的那五个还是四个
|
||||
|
||||
40
|
||||
00:01:11,860 --> 00:01:13,520
|
||||
四个还是五个例子来着
|
||||
|
||||
41
|
||||
00:01:13,690 --> 00:01:17,630
|
||||
我忘了就那那哥们儿那个短线到后面周四周五接着涨
|
||||
|
||||
42
|
||||
00:01:18,430 --> 00:01:21,334
|
||||
康康又登了10% 10几
|
||||
|
||||
43
|
||||
00:01:21,570 --> 00:01:24,882
|
||||
一根涨停加一个6%还是7
|
||||
|
||||
44
|
||||
00:01:25,140 --> 00:01:25,690
|
||||
是吧
|
||||
|
||||
45
|
||||
00:01:27,390 --> 00:01:30,030
|
||||
某康俩涨停
|
||||
|
||||
46
|
||||
00:01:31,160 --> 00:01:37,348
|
||||
然后那个国某矿直接把周五登进来是吧
|
||||
|
||||
47
|
||||
00:01:37,350 --> 00:01:38,294
|
||||
然后还有什么来着
|
||||
|
||||
48
|
||||
00:01:38,530 --> 00:01:39,610
|
||||
我忘了记不清了
|
||||
|
||||
49
|
||||
00:01:40,570 --> 00:01:43,658
|
||||
然后那陈他没买买进去的又一根长阳
|
||||
|
||||
50
|
||||
00:01:43,670 --> 00:01:44,230
|
||||
对吧
|
||||
|
||||
51
|
||||
00:01:44,890 --> 00:01:45,940
|
||||
这他妈就是水平
|
||||
|
||||
52
|
||||
00:01:46,080 --> 00:01:47,438
|
||||
你别你还别不服
|
||||
|
||||
53
|
||||
00:01:47,440 --> 00:01:53,936
|
||||
我操就有那那你那黑子说听周三的跟大直播没还没比大直播要无聊
|
||||
|
||||
54
|
||||
00:01:53,950 --> 00:01:58,010
|
||||
他说那所以可能他妈是可能玩鞋或者喝喝酒的
|
||||
|
||||
55
|
||||
00:01:58,010 --> 00:01:58,370
|
||||
是Line truncated
|
||||
|
||||
56
|
||||
00:01:58,550 --> 00:01:59,378
|
||||
就是你听不懂
|
||||
|
||||
57
|
||||
00:02:00,230 --> 00:02:00,760
|
||||
所以听不懂
|
||||
|
||||
58
|
||||
00:02:00,760 --> 00:02:01,388
|
||||
认知不够
|
||||
|
||||
59
|
||||
00:02:01,390 --> 00:02:02,086
|
||||
那么就没办法
|
||||
|
||||
60
|
||||
00:02:02,090 --> 00:02:03,962
|
||||
无知者无畏才会说出这种话
|
||||
|
||||
61
|
||||
00:02:05,360 --> 00:02:07,592
|
||||
踏踏实实看两个70%到是吧
|
||||
|
||||
62
|
||||
00:02:07,600 --> 00:02:09,283
|
||||
你这他妈实打实的吗
|
||||
|
||||
63
|
||||
00:02:09,290 --> 00:02:10,958
|
||||
傻逼续费对吗
|
||||
|
||||
64
|
||||
00:02:11,440 --> 00:02:14,116
|
||||
说如果说这哥们儿包括续费
|
||||
|
||||
65
|
||||
00:02:14,120 --> 00:02:17,054
|
||||
现在周三两万多同屏
|
||||
|
||||
66
|
||||
00:02:18,040 --> 00:02:19,370
|
||||
我诚惶诚恐
|
||||
|
||||
67
|
||||
00:02:19,660 --> 00:02:20,050
|
||||
真的
|
||||
|
||||
68
|
||||
00:02:20,050 --> 00:02:22,294
|
||||
咱家当时3000到5000特别自由
|
||||
|
||||
69
|
||||
00:02:23,810 --> 00:02:25,079
|
||||
现在充电视频两万多
|
||||
|
||||
70
|
||||
00:02:25,080 --> 00:02:25,905
|
||||
我诚惶诚恐
|
||||
|
||||
71
|
||||
00:02:25,910 --> 00:02:27,080
|
||||
说实话真的
|
||||
|
||||
72
|
||||
00:02:30,080 --> 00:02:32,852
|
||||
所以我还是这块儿我想告诉大家
|
||||
|
||||
73
|
||||
00:02:33,430 --> 00:02:33,758
|
||||
什么意思
|
||||
|
||||
74
|
||||
00:02:33,760 --> 00:02:39,280
|
||||
就是说咱们一保护咱们直播间不容易
|
||||
|
||||
75
|
||||
00:02:39,590 --> 00:02:42,837
|
||||
在B站能够有这样一个非常开心的地方
|
||||
|
||||
76
|
||||
00:02:42,850 --> 00:02:43,898
|
||||
我觉得非常不容易
|
||||
|
||||
77
|
||||
00:02:44,200 --> 00:02:49,348
|
||||
另外第二就是说也请你们珍惜
|
||||
|
||||
78
|
||||
00:02:49,360 --> 00:02:55,022
|
||||
我还愿意说真的虽然那几个杂毛不超过五个
|
||||
|
||||
79
|
||||
00:02:55,430 --> 00:02:58,269
|
||||
咱家他妈每每礼拜大大直播的十几万人
|
||||
|
||||
80
|
||||
00:02:58,870 --> 00:02:59,927
|
||||
咱们不超过五个
|
||||
|
||||
81
|
||||
00:03:01,490 --> 00:03:06,950
|
||||
但是人性我经历过人性你能明白吗
|
||||
|
||||
82
|
||||
00:03:07,510 --> 00:03:11,386
|
||||
就比如说咱们上礼拜大直播
|
||||
|
||||
83
|
||||
00:03:12,500 --> 00:03:14,580
|
||||
我说反内卷
|
||||
|
||||
84
|
||||
00:03:14,720 --> 00:03:17,814
|
||||
我专门讲了一晚上反内卷对吗
|
||||
|
||||
85
|
||||
00:03:19,620 --> 00:03:20,868
|
||||
周五是不是反内卷
|
||||
|
||||
86
|
||||
00:03:22,800 --> 00:03:25,124
|
||||
然后我之前说我上周说的是反对
|
||||
|
||||
87
|
||||
00:03:25,130 --> 00:03:25,778
|
||||
眼都瞪起来了
|
||||
|
||||
88
|
||||
00:03:25,780 --> 00:03:26,770
|
||||
别着急我等回来
|
||||
|
||||
89
|
||||
00:03:26,770 --> 00:03:27,340
|
||||
等下来
|
||||
|
||||
90
|
||||
00:03:27,720 --> 00:03:28,300
|
||||
等他下来
|
||||
|
||||
91
|
||||
00:03:28,300 --> 00:03:28,789
|
||||
等下来
|
||||
|
||||
92
|
||||
00:03:29,410 --> 00:03:30,280
|
||||
周五是什么
|
||||
|
||||
93
|
||||
00:03:30,400 --> 00:03:32,688
|
||||
煤炭对吧
|
||||
|
||||
94
|
||||
00:03:33,100 --> 00:03:33,410
|
||||
稀土
|
||||
|
||||
95
|
||||
00:03:36,600 --> 00:03:39,336
|
||||
然后水利就乱七八糟
|
||||
|
||||
96
|
||||
00:03:39,340 --> 00:03:41,836
|
||||
这些你们平时就咱们看不到
|
||||
|
||||
97
|
||||
00:03:41,840 --> 00:03:43,465
|
||||
我说我跟他讲的都是机构思维
|
||||
|
||||
98
|
||||
00:03:44,470 --> 00:03:46,630
|
||||
机构思维不是你那种抱着说
|
||||
|
||||
99
|
||||
00:03:47,060 --> 00:03:48,660
|
||||
说完以后马上就涨起来
|
||||
|
||||
100
|
||||
00:03:48,820 --> 00:03:49,288
|
||||
不一定
|
||||
|
||||
101
|
||||
00:03:50,530 --> 00:03:54,273
|
||||
但是概率足够大比你下芝麻轮那些要大很多
|
||||
|
||||
102
|
||||
00:03:55,310 --> 00:03:56,949
|
||||
就是我微信打开我那些群
|
||||
|
||||
103
|
||||
00:03:57,850 --> 00:03:59,390
|
||||
都是什么类的群
|
||||
|
||||
104
|
||||
00:03:59,670 --> 00:04:01,778
|
||||
跟你打开那些他妈小姐姐小妹妹的裙子
|
||||
|
||||
105
|
||||
00:04:01,790 --> 00:04:02,665
|
||||
他妈什么不一样
|
||||
|
||||
106
|
||||
00:04:02,670 --> 00:04:06,058
|
||||
哥们踏踏实实就是很简单
|
||||
|
||||
107
|
||||
00:04:06,060 --> 00:04:08,418
|
||||
你行你上对吗
|
||||
|
||||
108
|
||||
00:04:08,610 --> 00:04:10,338
|
||||
你你你行你上
|
||||
|
||||
109
|
||||
00:04:11,580 --> 00:04:14,375
|
||||
包括下礼拜上周反内卷没涨完
|
||||
|
||||
110
|
||||
00:04:14,670 --> 00:04:16,713
|
||||
没没没休息一礼拜了
|
||||
|
||||
111
|
||||
00:04:16,920 --> 00:04:17,508
|
||||
接着轮
|
||||
|
||||
112
|
||||
00:04:18,230 --> 00:04:19,693
|
||||
就是他妈的没准接着作业
|
||||
|
||||
113
|
||||
00:04:19,700 --> 00:04:22,534
|
||||
接着我就那些还没有轮动到的
|
||||
|
||||
114
|
||||
00:04:22,540 --> 00:04:25,580
|
||||
别着急踏踏实实那踏踏实实
|
||||
|
||||
115
|
||||
00:04:35,320 --> 00:04:38,656
|
||||
然后还有我我我我想到哪儿
|
||||
|
||||
116
|
||||
00:04:38,660 --> 00:04:39,050
|
||||
我说到哪儿
|
||||
|
||||
117
|
||||
00:04:39,170 --> 00:04:41,686
|
||||
因为咱们直播主要就是一个蛋逼直播间
|
||||
|
||||
118
|
||||
00:04:43,750 --> 00:04:48,235
|
||||
有有一些朋友大概我看了有七八个
|
||||
|
||||
119
|
||||
00:04:48,590 --> 00:04:49,910
|
||||
后台给我截图
|
||||
|
||||
120
|
||||
00:04:50,280 --> 00:04:54,620
|
||||
其中还有一个还还有一些是跟的时间比较长的
|
||||
|
||||
121
|
||||
00:04:55,260 --> 00:04:59,385
|
||||
我不知道周三录播你们都看没看啊
|
||||
|
||||
122
|
||||
00:04:59,790 --> 00:05:06,612
|
||||
就是这个我后来后面专门给你们讲的案例
|
||||
|
||||
123
|
||||
00:05:06,780 --> 00:05:09,104
|
||||
我讲第一选出来
|
||||
|
||||
124
|
||||
00:05:09,110 --> 00:05:10,250
|
||||
当天选完之后
|
||||
|
||||
125
|
||||
00:05:10,250 --> 00:05:13,488
|
||||
第二天比如那天比例选了217个
|
||||
|
||||
126
|
||||
00:05:14,050 --> 00:05:16,258
|
||||
第一第二天涨停的只有一个
|
||||
|
||||
127
|
||||
00:05:16,580 --> 00:05:18,637
|
||||
相当于是2百17分之1
|
||||
|
||||
128
|
||||
00:05:19,130 --> 00:05:22,570
|
||||
但是我给你们往上翻三个交易日前的
|
||||
|
||||
129
|
||||
00:05:23,950 --> 00:05:25,358
|
||||
我怀孕了什么意思
|
||||
|
||||
130
|
||||
00:05:26,120 --> 00:05:27,896
|
||||
哥们儿你怀孕了跟我说干嘛
|
||||
|
||||
131
|
||||
00:05:28,310 --> 00:05:29,798
|
||||
他老师该该找谁去
|
||||
|
||||
132
|
||||
00:05:31,860 --> 00:05:32,540
|
||||
说哪儿了
|
||||
|
||||
133
|
||||
00:05:32,540 --> 00:05:35,428
|
||||
对你往三天前一番
|
||||
|
||||
134
|
||||
00:05:36,000 --> 00:05:41,814
|
||||
然后周三的时候一看是单3到5个涨停
|
||||
|
||||
135
|
||||
00:05:42,190 --> 00:05:42,568
|
||||
是不是
|
||||
|
||||
136
|
||||
00:05:42,880 --> 00:05:45,270
|
||||
3到5个涨停什么意思
|
||||
|
||||
137
|
||||
00:05:45,940 --> 00:05:46,930
|
||||
再强调一遍
|
||||
|
||||
138
|
||||
00:05:48,130 --> 00:05:52,882
|
||||
第一叫潜伏好不好
|
||||
|
||||
139
|
||||
00:05:53,930 --> 00:05:57,787
|
||||
B一潜伏不是说B一一进去马上坑就掉下来
|
||||
|
||||
140
|
||||
00:05:58,530 --> 00:06:01,346
|
||||
那概率就是200分之1
|
||||
|
||||
141
|
||||
00:06:03,020 --> 00:06:04,571
|
||||
还是在市场不暴跌的时候
|
||||
|
||||
142
|
||||
00:06:05,100 --> 00:06:08,976
|
||||
B一进去绝大部分时间你要等2到3天
|
||||
|
||||
143
|
||||
00:06:10,060 --> 00:06:12,293
|
||||
甚至个别板块等3到5天
|
||||
|
||||
144
|
||||
00:06:14,130 --> 00:06:15,618
|
||||
这句话能不能明白
|
||||
|
||||
145
|
||||
00:06:16,330 --> 00:06:21,270
|
||||
而B2进去才是已经确认了B一牛逼的情况下
|
||||
|
||||
146
|
||||
00:06:21,410 --> 00:06:22,450
|
||||
B一成立的情况下
|
||||
|
||||
147
|
||||
00:06:22,450 --> 00:06:23,647
|
||||
他可能会快速蹬几根
|
||||
|
||||
148
|
||||
00:06:24,630 --> 00:06:25,894
|
||||
所以先不要管B2
|
||||
|
||||
149
|
||||
00:06:25,900 --> 00:06:27,180
|
||||
先说B1
|
||||
|
||||
150
|
||||
00:06:27,410 --> 00:06:29,060
|
||||
所以说你们第一轮进去的
|
||||
|
||||
151
|
||||
00:06:29,140 --> 00:06:30,860
|
||||
不要抱着不切实际幻想
|
||||
|
||||
152
|
||||
00:06:30,860 --> 00:06:32,948
|
||||
说我今天第一轮完明天就涨
|
||||
|
||||
153
|
||||
00:06:33,300 --> 00:06:34,972
|
||||
说有没有可能有2 1%
|
||||
|
||||
154
|
||||
00:06:34,980 --> 00:06:36,079
|
||||
你就记住这概率
|
||||
|
||||
155
|
||||
00:06:36,080 --> 00:06:37,536
|
||||
市场未来好多1%
|
||||
|
||||
156
|
||||
00:06:38,530 --> 00:06:40,194
|
||||
你100个票第一
|
||||
|
||||
157
|
||||
00:06:40,460 --> 00:06:42,847
|
||||
你虾芝麻轮忙忙忙选进去
|
||||
|
||||
158
|
||||
00:06:43,060 --> 00:06:47,146
|
||||
第二天也是1%的2 1%的涨停的概率
|
||||
|
||||
159
|
||||
00:06:47,950 --> 00:06:51,910
|
||||
5%以上可能是说50分之1或者80分之1就这样了
|
||||
|
||||
160
|
||||
00:06:53,500 --> 00:06:55,130
|
||||
但是你他妈三天后再看
|
||||
|
||||
161
|
||||
00:06:55,630 --> 00:06:57,205
|
||||
或者2到3天后再看
|
||||
|
||||
162
|
||||
00:07:00,030 --> 00:07:01,260
|
||||
所以这块能不能听明白
|
||||
|
||||
163
|
||||
00:07:02,410 --> 00:07:04,160
|
||||
第一叫潜伏
|
||||
|
||||
164
|
||||
00:07:06,070 --> 00:07:09,271
|
||||
B2才是买完之后必须的
|
||||
|
||||
165
|
||||
00:07:10,370 --> 00:07:13,695
|
||||
即使B2也有大概率是那天给你们看的案例
|
||||
|
||||
166
|
||||
00:07:13,710 --> 00:07:15,208
|
||||
一个是国某矿业
|
||||
|
||||
167
|
||||
00:07:15,650 --> 00:07:17,762
|
||||
我调了三天周五才定下来
|
||||
|
||||
168
|
||||
00:07:18,010 --> 00:07:18,540
|
||||
对吗
|
||||
|
||||
169
|
||||
00:07:18,710 --> 00:07:20,355
|
||||
不破止损就拿着
|
||||
|
||||
170
|
||||
00:07:20,360 --> 00:07:21,018
|
||||
但对于很多人讲
|
||||
|
||||
171
|
||||
00:07:21,020 --> 00:07:23,561
|
||||
B2那1根启动的太长了
|
||||
|
||||
172
|
||||
00:07:23,790 --> 00:07:24,498
|
||||
拿不了
|
||||
|
||||
173
|
||||
00:07:24,500 --> 00:07:25,178
|
||||
拿不住
|
||||
|
||||
174
|
||||
00:07:25,470 --> 00:07:26,366
|
||||
B一还没整明白
|
||||
|
||||
175
|
||||
00:07:26,500 --> 00:07:28,489
|
||||
所以先踏踏实实把B一整明白
|
||||
|
||||
176
|
||||
00:07:29,330 --> 00:07:30,930
|
||||
把B一的止损整明白
|
||||
+703
@@ -0,0 +1,703 @@
|
||||
1
|
||||
00:00:00,210 --> 00:00:01,932
|
||||
你们都是什么区块链
|
||||
|
||||
2
|
||||
00:00:03,200 --> 00:00:04,500
|
||||
我说一句话
|
||||
|
||||
3
|
||||
00:00:04,500 --> 00:00:07,888
|
||||
比你外面你自己或你自己瞎操作十年二十年都有用
|
||||
|
||||
4
|
||||
00:00:08,780 --> 00:00:09,548
|
||||
但是你听不懂
|
||||
|
||||
5
|
||||
00:00:10,530 --> 00:00:11,280
|
||||
配三个固态
|
||||
|
||||
6
|
||||
00:00:11,280 --> 00:00:12,320
|
||||
那哥们儿那你出来
|
||||
|
||||
7
|
||||
00:00:12,500 --> 00:00:13,508
|
||||
这不是你他妈又割了
|
||||
|
||||
8
|
||||
00:00:14,050 --> 00:00:15,818
|
||||
割了说因为Z哥说要控制风险
|
||||
|
||||
9
|
||||
00:00:15,830 --> 00:00:16,565
|
||||
所以我他妈割了
|
||||
|
||||
10
|
||||
00:00:16,680 --> 00:00:18,090
|
||||
所以我说傻逼叫你炒股
|
||||
|
||||
11
|
||||
00:00:18,090 --> 00:00:19,034
|
||||
你赚钱跟我没关系
|
||||
|
||||
12
|
||||
00:00:19,040 --> 00:00:20,480
|
||||
你他妈亏钱就是他让我买的
|
||||
|
||||
13
|
||||
00:00:20,700 --> 00:00:21,663
|
||||
我他妈从来没让你买
|
||||
|
||||
14
|
||||
00:00:21,920 --> 00:00:22,390
|
||||
对吗
|
||||
|
||||
15
|
||||
00:00:22,870 --> 00:00:23,686
|
||||
配置还是配置
|
||||
|
||||
16
|
||||
00:00:23,770 --> 00:00:26,058
|
||||
你他妈一个仓配配了三个固态
|
||||
|
||||
17
|
||||
00:00:26,060 --> 00:00:27,360
|
||||
你那赖谁
|
||||
|
||||
18
|
||||
00:00:28,610 --> 00:00:29,780
|
||||
所以这钱你认知不够
|
||||
|
||||
19
|
||||
00:00:29,780 --> 00:00:30,650
|
||||
你就赚不了
|
||||
|
||||
20
|
||||
00:00:30,970 --> 00:00:31,579
|
||||
很正常
|
||||
|
||||
21
|
||||
00:00:31,580 --> 00:00:32,300
|
||||
你就赚不了
|
||||
|
||||
22
|
||||
00:00:34,760 --> 00:00:35,390
|
||||
配三个固态
|
||||
|
||||
23
|
||||
00:00:35,390 --> 00:00:37,040
|
||||
哥们儿前天还发视频总结自己成绩
|
||||
|
||||
24
|
||||
00:00:37,160 --> 00:00:37,680
|
||||
是吗
|
||||
|
||||
25
|
||||
00:00:37,680 --> 00:00:38,728
|
||||
他觉得他行了是吗
|
||||
|
||||
26
|
||||
00:00:39,110 --> 00:00:39,990
|
||||
他不骂我了
|
||||
|
||||
27
|
||||
00:00:40,240 --> 00:00:41,640
|
||||
他他他他不卖门
|
||||
|
||||
28
|
||||
00:00:41,640 --> 00:00:43,134
|
||||
他妈的诋毁我了是吗
|
||||
|
||||
29
|
||||
00:00:44,230 --> 00:00:45,210
|
||||
人性人性
|
||||
|
||||
30
|
||||
00:00:45,350 --> 00:00:47,950
|
||||
我操这人人性人性
|
||||
|
||||
31
|
||||
00:00:48,080 --> 00:00:50,790
|
||||
我操没办法
|
||||
|
||||
32
|
||||
00:00:50,790 --> 00:00:54,320
|
||||
这他妈人性是不是人性
|
||||
|
||||
33
|
||||
00:00:54,940 --> 00:00:58,056
|
||||
我周三我说我说没准你下礼拜就ZGNB了
|
||||
|
||||
34
|
||||
00:00:58,380 --> 00:00:58,880
|
||||
对吗
|
||||
|
||||
35
|
||||
00:01:01,000 --> 00:01:03,272
|
||||
所以我说这个市场永远是有经验人赚
|
||||
|
||||
36
|
||||
00:01:03,280 --> 00:01:05,247
|
||||
没经验钱的地方
|
||||
|
||||
37
|
||||
00:01:06,390 --> 00:01:07,720
|
||||
就是说什么意思
|
||||
|
||||
38
|
||||
00:01:07,720 --> 00:01:08,746
|
||||
我不是吹牛逼
|
||||
|
||||
39
|
||||
00:01:08,750 --> 00:01:11,846
|
||||
咱上礼拜三我给你们举的那五个还是四个
|
||||
|
||||
40
|
||||
00:01:11,860 --> 00:01:13,520
|
||||
四个还是五个例子来着
|
||||
|
||||
41
|
||||
00:01:13,690 --> 00:01:17,630
|
||||
我忘了就那那哥们儿那个短线到后面周四周五接着涨
|
||||
|
||||
42
|
||||
00:01:18,430 --> 00:01:21,334
|
||||
康康又登了10% 10几
|
||||
|
||||
43
|
||||
00:01:21,570 --> 00:01:24,882
|
||||
一根涨停加一个6%还是7
|
||||
|
||||
44
|
||||
00:01:25,140 --> 00:01:25,690
|
||||
是吧
|
||||
|
||||
45
|
||||
00:01:27,390 --> 00:01:30,030
|
||||
某康俩涨停
|
||||
|
||||
46
|
||||
00:01:31,160 --> 00:01:37,348
|
||||
然后那个国某矿直接把周五登进来是吧
|
||||
|
||||
47
|
||||
00:01:37,350 --> 00:01:38,294
|
||||
然后还有什么来着
|
||||
|
||||
48
|
||||
00:01:38,530 --> 00:01:39,610
|
||||
我忘了记不清了
|
||||
|
||||
49
|
||||
00:01:40,570 --> 00:01:43,658
|
||||
然后那陈他没买买进去的又一根长阳
|
||||
|
||||
50
|
||||
00:01:43,670 --> 00:01:44,230
|
||||
对吧
|
||||
|
||||
51
|
||||
00:01:44,890 --> 00:01:45,940
|
||||
这他妈就是水平
|
||||
|
||||
52
|
||||
00:01:46,080 --> 00:01:47,438
|
||||
你别你还别不服
|
||||
|
||||
53
|
||||
00:01:47,440 --> 00:01:53,936
|
||||
我操就有那那你那黑子说听周三的跟大直播没还没比大直播要无聊
|
||||
|
||||
54
|
||||
00:01:53,950 --> 00:01:58,010
|
||||
他说那所以可能他妈是可能玩鞋或者喝喝酒的
|
||||
|
||||
55
|
||||
00:01:58,010 --> 00:01:58,370
|
||||
是Line truncated
|
||||
|
||||
56
|
||||
00:01:58,550 --> 00:01:59,378
|
||||
就是你听不懂
|
||||
|
||||
57
|
||||
00:02:00,230 --> 00:02:00,760
|
||||
所以听不懂
|
||||
|
||||
58
|
||||
00:02:00,760 --> 00:02:01,388
|
||||
认知不够
|
||||
|
||||
59
|
||||
00:02:01,390 --> 00:02:02,086
|
||||
那么就没办法
|
||||
|
||||
60
|
||||
00:02:02,090 --> 00:02:03,962
|
||||
无知者无畏才会说出这种话
|
||||
|
||||
61
|
||||
00:02:05,360 --> 00:02:07,592
|
||||
踏踏实实看两个70%到是吧
|
||||
|
||||
62
|
||||
00:02:07,600 --> 00:02:09,283
|
||||
你这他妈实打实的吗
|
||||
|
||||
63
|
||||
00:02:09,290 --> 00:02:10,958
|
||||
傻逼续费对吗
|
||||
|
||||
64
|
||||
00:02:11,440 --> 00:02:14,116
|
||||
说如果说这哥们儿包括续费
|
||||
|
||||
65
|
||||
00:02:14,120 --> 00:02:17,054
|
||||
现在周三两万多同屏
|
||||
|
||||
66
|
||||
00:02:18,040 --> 00:02:19,370
|
||||
我诚惶诚恐
|
||||
|
||||
67
|
||||
00:02:19,660 --> 00:02:20,050
|
||||
真的
|
||||
|
||||
68
|
||||
00:02:20,050 --> 00:02:22,294
|
||||
咱家当时3000到5000特别自由
|
||||
|
||||
69
|
||||
00:02:23,810 --> 00:02:25,079
|
||||
现在充电视频两万多
|
||||
|
||||
70
|
||||
00:02:25,080 --> 00:02:25,905
|
||||
我诚惶诚恐
|
||||
|
||||
71
|
||||
00:02:25,910 --> 00:02:27,080
|
||||
说实话真的
|
||||
|
||||
72
|
||||
00:02:30,080 --> 00:02:32,852
|
||||
所以我还是这块儿我想告诉大家
|
||||
|
||||
73
|
||||
00:02:33,430 --> 00:02:33,758
|
||||
什么意思
|
||||
|
||||
74
|
||||
00:02:33,760 --> 00:02:39,280
|
||||
就是说咱们一保护咱们直播间不容易
|
||||
|
||||
75
|
||||
00:02:39,590 --> 00:02:42,837
|
||||
在B站能够有这样一个非常开心的地方
|
||||
|
||||
76
|
||||
00:02:42,850 --> 00:02:43,898
|
||||
我觉得非常不容易
|
||||
|
||||
77
|
||||
00:02:44,200 --> 00:02:49,348
|
||||
另外第二就是说也请你们珍惜
|
||||
|
||||
78
|
||||
00:02:49,360 --> 00:02:55,022
|
||||
我还愿意说真的虽然那几个杂毛不超过五个
|
||||
|
||||
79
|
||||
00:02:55,430 --> 00:02:58,269
|
||||
咱家他妈每每礼拜大大直播的十几万人
|
||||
|
||||
80
|
||||
00:02:58,870 --> 00:02:59,927
|
||||
咱们不超过五个
|
||||
|
||||
81
|
||||
00:03:01,490 --> 00:03:06,950
|
||||
但是人性我经历过人性你能明白吗
|
||||
|
||||
82
|
||||
00:03:07,510 --> 00:03:11,386
|
||||
就比如说咱们上礼拜大直播
|
||||
|
||||
83
|
||||
00:03:12,500 --> 00:03:14,580
|
||||
我说反内卷
|
||||
|
||||
84
|
||||
00:03:14,720 --> 00:03:17,814
|
||||
我专门讲了一晚上反内卷对吗
|
||||
|
||||
85
|
||||
00:03:19,620 --> 00:03:20,868
|
||||
周五是不是反内卷
|
||||
|
||||
86
|
||||
00:03:22,800 --> 00:03:25,124
|
||||
然后我之前说我上周说的是反对
|
||||
|
||||
87
|
||||
00:03:25,130 --> 00:03:25,778
|
||||
眼都瞪起来了
|
||||
|
||||
88
|
||||
00:03:25,780 --> 00:03:26,770
|
||||
别着急我等回来
|
||||
|
||||
89
|
||||
00:03:26,770 --> 00:03:27,340
|
||||
等下来
|
||||
|
||||
90
|
||||
00:03:27,720 --> 00:03:28,300
|
||||
等他下来
|
||||
|
||||
91
|
||||
00:03:28,300 --> 00:03:28,789
|
||||
等下来
|
||||
|
||||
92
|
||||
00:03:29,410 --> 00:03:30,280
|
||||
周五是什么
|
||||
|
||||
93
|
||||
00:03:30,400 --> 00:03:32,688
|
||||
煤炭对吧
|
||||
|
||||
94
|
||||
00:03:33,100 --> 00:03:33,410
|
||||
稀土
|
||||
|
||||
95
|
||||
00:03:36,600 --> 00:03:39,336
|
||||
然后水利就乱七八糟
|
||||
|
||||
96
|
||||
00:03:39,340 --> 00:03:41,836
|
||||
这些你们平时就咱们看不到
|
||||
|
||||
97
|
||||
00:03:41,840 --> 00:03:43,465
|
||||
我说我跟他讲的都是机构思维
|
||||
|
||||
98
|
||||
00:03:44,470 --> 00:03:46,630
|
||||
机构思维不是你那种抱着说
|
||||
|
||||
99
|
||||
00:03:47,060 --> 00:03:48,660
|
||||
说完以后马上就涨起来
|
||||
|
||||
100
|
||||
00:03:48,820 --> 00:03:49,288
|
||||
不一定
|
||||
|
||||
101
|
||||
00:03:50,530 --> 00:03:54,273
|
||||
但是概率足够大比你下芝麻轮那些要大很多
|
||||
|
||||
102
|
||||
00:03:55,310 --> 00:03:56,949
|
||||
就是我微信打开我那些群
|
||||
|
||||
103
|
||||
00:03:57,850 --> 00:03:59,390
|
||||
都是什么类的群
|
||||
|
||||
104
|
||||
00:03:59,670 --> 00:04:01,778
|
||||
跟你打开那些他妈小姐姐小妹妹的裙子
|
||||
|
||||
105
|
||||
00:04:01,790 --> 00:04:02,665
|
||||
他妈什么不一样
|
||||
|
||||
106
|
||||
00:04:02,670 --> 00:04:06,058
|
||||
哥们踏踏实实就是很简单
|
||||
|
||||
107
|
||||
00:04:06,060 --> 00:04:08,418
|
||||
你行你上对吗
|
||||
|
||||
108
|
||||
00:04:08,610 --> 00:04:10,338
|
||||
你你你行你上
|
||||
|
||||
109
|
||||
00:04:11,580 --> 00:04:14,375
|
||||
包括下礼拜上周反内卷没涨完
|
||||
|
||||
110
|
||||
00:04:14,670 --> 00:04:16,713
|
||||
没没没休息一礼拜了
|
||||
|
||||
111
|
||||
00:04:16,920 --> 00:04:17,508
|
||||
接着轮
|
||||
|
||||
112
|
||||
00:04:18,230 --> 00:04:19,693
|
||||
就是他妈的没准接着作业
|
||||
|
||||
113
|
||||
00:04:19,700 --> 00:04:22,534
|
||||
接着我就那些还没有轮动到的
|
||||
|
||||
114
|
||||
00:04:22,540 --> 00:04:25,580
|
||||
别着急踏踏实实那踏踏实实
|
||||
|
||||
115
|
||||
00:04:35,320 --> 00:04:38,656
|
||||
然后还有我我我我想到哪儿
|
||||
|
||||
116
|
||||
00:04:38,660 --> 00:04:39,050
|
||||
我说到哪儿
|
||||
|
||||
117
|
||||
00:04:39,170 --> 00:04:41,686
|
||||
因为咱们直播主要就是一个蛋逼直播间
|
||||
|
||||
118
|
||||
00:04:43,750 --> 00:04:48,235
|
||||
有有一些朋友大概我看了有七八个
|
||||
|
||||
119
|
||||
00:04:48,590 --> 00:04:49,910
|
||||
后台给我截图
|
||||
|
||||
120
|
||||
00:04:50,280 --> 00:04:54,620
|
||||
其中还有一个还还有一些是跟的时间比较长的
|
||||
|
||||
121
|
||||
00:04:55,260 --> 00:04:59,385
|
||||
我不知道周三录播你们都看没看啊
|
||||
|
||||
122
|
||||
00:04:59,790 --> 00:05:06,612
|
||||
就是这个我后来后面专门给你们讲的案例
|
||||
|
||||
123
|
||||
00:05:06,780 --> 00:05:09,104
|
||||
我讲第一选出来
|
||||
|
||||
124
|
||||
00:05:09,110 --> 00:05:10,250
|
||||
当天选完之后
|
||||
|
||||
125
|
||||
00:05:10,250 --> 00:05:13,488
|
||||
第二天比如那天比例选了217个
|
||||
|
||||
126
|
||||
00:05:14,050 --> 00:05:16,258
|
||||
第一第二天涨停的只有一个
|
||||
|
||||
127
|
||||
00:05:16,580 --> 00:05:18,637
|
||||
相当于是2百17分之1
|
||||
|
||||
128
|
||||
00:05:19,130 --> 00:05:22,570
|
||||
但是我给你们往上翻三个交易日前的
|
||||
|
||||
129
|
||||
00:05:23,950 --> 00:05:25,358
|
||||
我怀孕了什么意思
|
||||
|
||||
130
|
||||
00:05:26,120 --> 00:05:27,896
|
||||
哥们儿你怀孕了跟我说干嘛
|
||||
|
||||
131
|
||||
00:05:28,310 --> 00:05:29,798
|
||||
他老师该该找谁去
|
||||
|
||||
132
|
||||
00:05:31,860 --> 00:05:32,540
|
||||
说哪儿了
|
||||
|
||||
133
|
||||
00:05:32,540 --> 00:05:35,428
|
||||
对你往三天前一番
|
||||
|
||||
134
|
||||
00:05:36,000 --> 00:05:41,814
|
||||
然后周三的时候一看是单3到5个涨停
|
||||
|
||||
135
|
||||
00:05:42,190 --> 00:05:42,568
|
||||
是不是
|
||||
|
||||
136
|
||||
00:05:42,880 --> 00:05:45,270
|
||||
3到5个涨停什么意思
|
||||
|
||||
137
|
||||
00:05:45,940 --> 00:05:46,930
|
||||
再强调一遍
|
||||
|
||||
138
|
||||
00:05:48,130 --> 00:05:52,882
|
||||
第一叫潜伏好不好
|
||||
|
||||
139
|
||||
00:05:53,930 --> 00:05:57,787
|
||||
B一潜伏不是说B一一进去马上坑就掉下来
|
||||
|
||||
140
|
||||
00:05:58,530 --> 00:06:01,346
|
||||
那概率就是200分之1
|
||||
|
||||
141
|
||||
00:06:03,020 --> 00:06:04,571
|
||||
还是在市场不暴跌的时候
|
||||
|
||||
142
|
||||
00:06:05,100 --> 00:06:08,976
|
||||
B一进去绝大部分时间你要等2到3天
|
||||
|
||||
143
|
||||
00:06:10,060 --> 00:06:12,293
|
||||
甚至个别板块等3到5天
|
||||
|
||||
144
|
||||
00:06:14,130 --> 00:06:15,618
|
||||
这句话能不能明白
|
||||
|
||||
145
|
||||
00:06:16,330 --> 00:06:21,270
|
||||
而B2进去才是已经确认了B一牛逼的情况下
|
||||
|
||||
146
|
||||
00:06:21,410 --> 00:06:22,450
|
||||
B一成立的情况下
|
||||
|
||||
147
|
||||
00:06:22,450 --> 00:06:23,647
|
||||
他可能会快速蹬几根
|
||||
|
||||
148
|
||||
00:06:24,630 --> 00:06:25,894
|
||||
所以先不要管B2
|
||||
|
||||
149
|
||||
00:06:25,900 --> 00:06:27,180
|
||||
先说B1
|
||||
|
||||
150
|
||||
00:06:27,410 --> 00:06:29,060
|
||||
所以说你们第一轮进去的
|
||||
|
||||
151
|
||||
00:06:29,140 --> 00:06:30,860
|
||||
不要抱着不切实际幻想
|
||||
|
||||
152
|
||||
00:06:30,860 --> 00:06:32,948
|
||||
说我今天第一轮完明天就涨
|
||||
|
||||
153
|
||||
00:06:33,300 --> 00:06:34,972
|
||||
说有没有可能有2 1%
|
||||
|
||||
154
|
||||
00:06:34,980 --> 00:06:36,079
|
||||
你就记住这概率
|
||||
|
||||
155
|
||||
00:06:36,080 --> 00:06:37,536
|
||||
市场未来好多1%
|
||||
|
||||
156
|
||||
00:06:38,530 --> 00:06:40,194
|
||||
你100个票第一
|
||||
|
||||
157
|
||||
00:06:40,460 --> 00:06:42,847
|
||||
你虾芝麻轮忙忙忙选进去
|
||||
|
||||
158
|
||||
00:06:43,060 --> 00:06:47,146
|
||||
第二天也是1%的2 1%的涨停的概率
|
||||
|
||||
159
|
||||
00:06:47,950 --> 00:06:51,910
|
||||
5%以上可能是说50分之1或者80分之1就这样了
|
||||
|
||||
160
|
||||
00:06:53,500 --> 00:06:55,130
|
||||
但是你他妈三天后再看
|
||||
|
||||
161
|
||||
00:06:55,630 --> 00:06:57,205
|
||||
或者2到3天后再看
|
||||
|
||||
162
|
||||
00:07:00,030 --> 00:07:01,260
|
||||
所以这块能不能听明白
|
||||
|
||||
163
|
||||
00:07:02,410 --> 00:07:04,160
|
||||
第一叫潜伏
|
||||
|
||||
164
|
||||
00:07:06,070 --> 00:07:09,271
|
||||
B2才是买完之后必须的
|
||||
|
||||
165
|
||||
00:07:10,370 --> 00:07:13,695
|
||||
即使B2也有大概率是那天给你们看的案例
|
||||
|
||||
166
|
||||
00:07:13,710 --> 00:07:15,208
|
||||
一个是国某矿业
|
||||
|
||||
167
|
||||
00:07:15,650 --> 00:07:17,762
|
||||
我调了三天周五才定下来
|
||||
|
||||
168
|
||||
00:07:18,010 --> 00:07:18,540
|
||||
对吗
|
||||
|
||||
169
|
||||
00:07:18,710 --> 00:07:20,355
|
||||
不破止损就拿着
|
||||
|
||||
170
|
||||
00:07:20,360 --> 00:07:21,018
|
||||
但对于很多人讲
|
||||
|
||||
171
|
||||
00:07:21,020 --> 00:07:23,561
|
||||
B2那1根启动的太长了
|
||||
|
||||
172
|
||||
00:07:23,790 --> 00:07:24,498
|
||||
拿不了
|
||||
|
||||
173
|
||||
00:07:24,500 --> 00:07:25,178
|
||||
拿不住
|
||||
|
||||
174
|
||||
00:07:25,470 --> 00:07:26,366
|
||||
B一还没整明白
|
||||
|
||||
175
|
||||
00:07:26,500 --> 00:07:28,489
|
||||
所以先踏踏实实把B一整明白
|
||||
|
||||
176
|
||||
00:07:29,330 --> 00:07:30,930
|
||||
把B一的止损整明白
|
||||
+7
-7
@@ -6,7 +6,7 @@ from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
# 导入配置管理
|
||||
from backend.core.config import settings, get_logging_config, get_api_key
|
||||
from core.config import settings, get_logging_config, get_api_key
|
||||
|
||||
# 配置日志
|
||||
logging_config = get_logging_config()
|
||||
@@ -21,12 +21,12 @@ logging.basicConfig(
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 使用绝对导入
|
||||
from backend.api.v1 import health, projects, clips, collections, tasks as task_routes, settings as settings_routes
|
||||
from backend.api.v1.tasks import router as tasks_router
|
||||
from backend.api.v1 import websocket
|
||||
from backend.core.database import engine
|
||||
from backend.models.base import Base
|
||||
# 使用相对导入
|
||||
from api.v1 import health, projects, clips, collections, tasks as task_routes, settings as settings_routes
|
||||
from api.v1.tasks import router as tasks_router
|
||||
from api.v1 import websocket
|
||||
from core.database import engine
|
||||
from models.base import Base
|
||||
|
||||
# Create FastAPI app
|
||||
app = FastAPI(
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
from typing import TypeVar, Generic, Optional, List, Dict, Any, Type
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import and_, or_
|
||||
from backend.models.base import BaseModel
|
||||
from models.base import BaseModel
|
||||
|
||||
# 定义泛型类型
|
||||
ModelType = TypeVar("ModelType", bound=BaseModel)
|
||||
|
||||
@@ -7,7 +7,7 @@ from typing import List, Optional
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import desc, asc
|
||||
from .base import BaseRepository
|
||||
from backend.models.project import Project, ProjectStatus, ProjectType
|
||||
from models.project import Project, ProjectStatus, ProjectType
|
||||
|
||||
class ProjectRepository(BaseRepository[Project]):
|
||||
"""项目Repository类"""
|
||||
|
||||
@@ -7,7 +7,7 @@ from typing import List, Optional
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import desc, asc, func
|
||||
from .base import BaseRepository
|
||||
from backend.models.task import Task, TaskStatus, TaskType
|
||||
from models.task import Task, TaskStatus, TaskType
|
||||
|
||||
class TaskRepository(BaseRepository[Task]):
|
||||
"""任务Repository类"""
|
||||
|
||||
@@ -47,6 +47,7 @@ class ProjectUpdate(BaseSchema):
|
||||
description: Optional[str] = Field(default=None, max_length=1000, description="Project description")
|
||||
status: Optional[ProjectStatus] = Field(default=None, description="Project status")
|
||||
settings: Optional[dict] = Field(default=None, description="Project settings")
|
||||
processing_config: Optional[dict] = Field(default=None, description="Processing configuration")
|
||||
|
||||
|
||||
class ProjectResponse(BaseSchema):
|
||||
|
||||
@@ -57,15 +57,15 @@ class TaskResponse(BaseSchema):
|
||||
task_type: TaskType = Field(description="Task type")
|
||||
status: TaskStatus = Field(description="Task status")
|
||||
progress: float = Field(default=0, description="Task progress percentage")
|
||||
task_config: dict = Field(description="Task configuration")
|
||||
result: Optional[dict] = Field(description="Task result")
|
||||
error_message: Optional[str] = Field(description="Error message if failed")
|
||||
priority: int = Field(description="Task priority")
|
||||
metadata: dict = Field(description="Additional metadata")
|
||||
task_config: Optional[dict] = Field(default_factory=dict, description="Task configuration")
|
||||
result: Optional[dict] = Field(default=None, description="Task result")
|
||||
error_message: Optional[str] = Field(default=None, description="Error message if failed")
|
||||
priority: int = Field(default=0, description="Task priority")
|
||||
metadata: Optional[dict] = Field(default_factory=dict, description="Additional metadata")
|
||||
created_at: datetime = Field(description="Creation timestamp")
|
||||
updated_at: datetime = Field(description="Last update timestamp")
|
||||
started_at: Optional[datetime] = Field(description="Start timestamp")
|
||||
completed_at: Optional[datetime] = Field(description="Completion timestamp")
|
||||
started_at: Optional[datetime] = Field(default=None, description="Start timestamp")
|
||||
completed_at: Optional[datetime] = Field(default=None, description="Completion timestamp")
|
||||
|
||||
|
||||
class TaskListResponse(BaseSchema):
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
from typing import Generic, TypeVar, Type, Optional, List, Dict, Any
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import and_, or_
|
||||
from backend.repositories.base import BaseRepository, ModelType as RepoModelType
|
||||
from backend.schemas.base import BaseSchema, PaginationParams, PaginationResponse
|
||||
from repositories.base import BaseRepository, ModelType as RepoModelType
|
||||
from schemas.base import BaseSchema, PaginationParams, PaginationResponse
|
||||
|
||||
|
||||
CreateSchemaType = TypeVar("CreateSchemaType")
|
||||
|
||||
@@ -12,8 +12,8 @@ from typing import Dict, Any, Optional
|
||||
from dataclasses import dataclass
|
||||
from enum import Enum
|
||||
|
||||
from backend.models.project import ProjectType
|
||||
from backend.core.database import get_db
|
||||
from models.project import ProjectType
|
||||
from core.database import get_db
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -9,11 +9,11 @@ from pathlib import Path
|
||||
from datetime import datetime
|
||||
|
||||
# 导入新架构的模型和服务
|
||||
from backend.models.project import Project, ProjectStatus
|
||||
from backend.models.task import Task, TaskStatus
|
||||
from backend.core.database import get_db
|
||||
from backend.core.progress_manager import get_progress_manager
|
||||
from backend.core.config import get_project_root, get_data_directory, get_output_directory
|
||||
from models.project import Project, ProjectStatus
|
||||
from models.task import Task, TaskStatus
|
||||
from core.database import get_db
|
||||
from core.progress_manager import get_progress_manager
|
||||
from core.config import get_project_root, get_data_directory, get_output_directory
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -43,6 +43,11 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
# 确保父目录存在
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"outlines": [
|
||||
@@ -62,6 +67,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"timeline": [
|
||||
@@ -82,6 +91,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"scored_clips": [
|
||||
@@ -101,6 +114,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"titles": [
|
||||
@@ -120,6 +137,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"collections": [
|
||||
@@ -139,6 +160,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"videos": [
|
||||
@@ -171,7 +196,7 @@ class PipelineAdapter:
|
||||
{"name": "video", "description": "生成视频", "weight": 15}
|
||||
]
|
||||
|
||||
def process_project_sync(self, project_id: int, input_video_path: str, input_srt_path: str) -> Dict[str, Any]:
|
||||
def process_project_sync(self, project_id: str, input_video_path: str, input_srt_path: str) -> Dict[str, Any]:
|
||||
"""同步处理整个项目的Pipeline流程"""
|
||||
try:
|
||||
# 获取项目信息
|
||||
@@ -256,35 +281,43 @@ class PipelineAdapter:
|
||||
raise FileNotFoundError(f"SRT文件不存在: {srt_path}")
|
||||
|
||||
output_path = project_dir / "step1_outline.json"
|
||||
result = run_step1_outline(srt_path=str(srt_file), output_path=str(output_path))
|
||||
result = run_step1_outline(srt_file, output_path=output_path)
|
||||
|
||||
return result
|
||||
|
||||
def _step2_timeline_sync(self, outline_result: Dict[str, Any], project_dir: Path) -> Dict[str, Any]:
|
||||
"""步骤2: 生成时间线"""
|
||||
# 使用上一步的输出作为输入
|
||||
outline_path = project_dir / "step1_outline.json"
|
||||
output_path = project_dir / "step2_timeline.json"
|
||||
result = run_step2_timeline(output_path=str(output_path))
|
||||
result = run_step2_timeline(outline_path, output_path=output_path)
|
||||
|
||||
return result
|
||||
|
||||
def _step3_scoring_sync(self, timeline_result: Dict[str, Any], project_dir: Path) -> Dict[str, Any]:
|
||||
"""步骤3: 内容评分"""
|
||||
# 使用上一步的输出作为输入
|
||||
timeline_path = project_dir / "step2_timeline.json"
|
||||
output_path = project_dir / "step3_scored_clips.json"
|
||||
result = run_step3_scoring(output_path=str(output_path))
|
||||
result = run_step3_scoring(timeline_path, output_path=output_path)
|
||||
|
||||
return result
|
||||
|
||||
def _step4_title_sync(self, scoring_result: Dict[str, Any], project_dir: Path) -> Dict[str, Any]:
|
||||
"""步骤4: 生成标题"""
|
||||
# 使用上一步的输出作为输入
|
||||
high_score_clips_path = project_dir / "step3_scored_clips.json"
|
||||
output_path = project_dir / "step4_titles.json"
|
||||
result = run_step4_title(output_path=str(output_path))
|
||||
result = run_step4_title(high_score_clips_path, output_path=output_path)
|
||||
|
||||
return result
|
||||
|
||||
def _step5_clustering_sync(self, title_result: Dict[str, Any], project_dir: Path) -> Dict[str, Any]:
|
||||
"""步骤5: 主题聚类"""
|
||||
# 使用上一步的输出作为输入
|
||||
clips_with_titles_path = project_dir / "step4_titles.json"
|
||||
output_path = project_dir / "step5_collections.json"
|
||||
result = run_step5_clustering(output_path=str(output_path))
|
||||
result = run_step5_clustering(clips_with_titles_path, output_path=output_path)
|
||||
|
||||
return result
|
||||
|
||||
@@ -294,15 +327,15 @@ class PipelineAdapter:
|
||||
if not input_video.exists():
|
||||
raise FileNotFoundError(f"输入视频不存在: {input_video_path}")
|
||||
|
||||
# 使用上一步的输出作为输入
|
||||
clips_with_titles_path = project_dir / "step4_titles.json"
|
||||
collections_path = project_dir / "step5_collections.json"
|
||||
output_path = project_dir / "step6_video_result.json"
|
||||
result = run_step6_video(
|
||||
video_path=str(input_video),
|
||||
output_path=str(output_path)
|
||||
)
|
||||
result = run_step6_video(clips_with_titles_path, collections_path, input_video, output_path)
|
||||
|
||||
return result
|
||||
|
||||
def _update_progress_sync(self, project_id: int, progress: int, message: str, step_result: Optional[Dict[str, Any]] = None):
|
||||
def _update_progress_sync(self, project_id: str, progress: int, message: str, step_result: Optional[Dict[str, Any]] = None):
|
||||
"""同步更新项目进度"""
|
||||
try:
|
||||
# 更新数据库中的项目进度
|
||||
@@ -322,7 +355,7 @@ class PipelineAdapter:
|
||||
except Exception as e:
|
||||
logger.error(f"更新进度失败: {str(e)}")
|
||||
|
||||
def get_project_status(self, project_id: int) -> Dict[str, Any]:
|
||||
def get_project_status(self, project_id: str) -> Dict[str, Any]:
|
||||
"""获取项目状态"""
|
||||
project = self.db.query(Project).filter(Project.id == project_id).first()
|
||||
if not project:
|
||||
|
||||
@@ -10,11 +10,11 @@ from typing import Dict, Any, List, Optional, Callable
|
||||
from pathlib import Path
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from backend.models.task import Task, TaskStatus, TaskType
|
||||
from backend.repositories.task_repository import TaskRepository
|
||||
from backend.services.config_manager import ProjectConfigManager, ProcessingStep
|
||||
from backend.services.pipeline_adapter import PipelineAdapter
|
||||
from backend.core.config import get_project_root
|
||||
from models.task import Task, TaskStatus, TaskType
|
||||
from repositories.task_repository import TaskRepository
|
||||
from services.config_manager import ProjectConfigManager, ProcessingStep
|
||||
from services.pipeline_adapter import PipelineAdapter
|
||||
from core.config import get_project_root
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -43,6 +43,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"outlines": [
|
||||
@@ -62,6 +66,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"timeline": [
|
||||
@@ -82,6 +90,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"scored_clips": [
|
||||
@@ -101,6 +113,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"titles": [
|
||||
@@ -120,6 +136,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"collections": [
|
||||
@@ -139,6 +159,10 @@ except ImportError as e:
|
||||
output_path = kwargs.get('output_path')
|
||||
if output_path:
|
||||
import json
|
||||
from pathlib import Path
|
||||
# 确保output_path是Path对象
|
||||
if isinstance(output_path, str):
|
||||
output_path = Path(output_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
mock_output = {
|
||||
"videos": [
|
||||
|
||||
@@ -8,14 +8,14 @@ from pathlib import Path
|
||||
from typing import Dict, Any, Optional
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from backend.models.task import Task, TaskStatus, TaskType
|
||||
from backend.repositories.task_repository import TaskRepository
|
||||
from backend.services.config_manager import ProjectConfigManager, ProcessingStep
|
||||
from backend.services.pipeline_adapter import PipelineAdapter
|
||||
from backend.services.processing_orchestrator import ProcessingOrchestrator
|
||||
from backend.services.processing_context import ProcessingContext
|
||||
from backend.services.exceptions import ServiceError, ProcessingError, TaskError, ProjectError, handle_service_error
|
||||
from backend.services.concurrency_manager import with_concurrency_control
|
||||
from models.task import Task, TaskStatus, TaskType
|
||||
from repositories.task_repository import TaskRepository
|
||||
from services.config_manager import ProjectConfigManager, ProcessingStep
|
||||
from services.pipeline_adapter import PipelineAdapter
|
||||
from services.processing_orchestrator import ProcessingOrchestrator
|
||||
from services.processing_context import ProcessingContext
|
||||
from services.exceptions import ServiceError, ProcessingError, TaskError, ProjectError, handle_service_error
|
||||
from services.concurrency_manager import with_concurrency_control
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -333,7 +333,7 @@ class ProcessingService:
|
||||
"progress": 0.0,
|
||||
"metadata": {
|
||||
"project_id": project_id,
|
||||
"task_type": task_type.value
|
||||
"task_type": task_type.value if hasattr(task_type, 'value') else task_type
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
from typing import Optional, List, Dict, Any
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from backend.services.base import BaseService
|
||||
from backend.repositories.project_repository import ProjectRepository
|
||||
from backend.models.project import Project
|
||||
from backend.schemas.project import ProjectCreate, ProjectUpdate, ProjectResponse, ProjectListResponse, ProjectFilter
|
||||
from backend.schemas.base import PaginationParams, PaginationResponse
|
||||
from backend.schemas.project import ProjectType, ProjectStatus
|
||||
from services.base import BaseService
|
||||
from repositories.project_repository import ProjectRepository
|
||||
from models.project import Project
|
||||
from schemas.project import ProjectCreate, ProjectUpdate, ProjectResponse, ProjectListResponse, ProjectFilter
|
||||
from schemas.base import PaginationParams, PaginationResponse
|
||||
from schemas.project import ProjectType, ProjectStatus
|
||||
|
||||
|
||||
class ProjectService(BaseService[Project, ProjectCreate, ProjectUpdate, ProjectResponse]):
|
||||
@@ -46,7 +46,17 @@ class ProjectService(BaseService[Project, ProjectCreate, ProjectUpdate, ProjectR
|
||||
if not update_data:
|
||||
return self.get(project_id)
|
||||
|
||||
return self.update(project_id, **update_data)
|
||||
# Map schema fields to ORM fields
|
||||
orm_data = {}
|
||||
for key, value in update_data.items():
|
||||
if key == "settings":
|
||||
orm_data["processing_config"] = value
|
||||
elif key == "processing_config":
|
||||
orm_data["processing_config"] = value
|
||||
else:
|
||||
orm_data[key] = value
|
||||
|
||||
return self.update(project_id, **orm_data)
|
||||
|
||||
def get_project_with_stats(self, project_id: str) -> Optional[ProjectResponse]:
|
||||
"""Get project with statistics."""
|
||||
@@ -144,4 +154,14 @@ class ProjectService(BaseService[Project, ProjectCreate, ProjectUpdate, ProjectR
|
||||
settings["error_message"] = error_message
|
||||
|
||||
self.update(project_id, status="failed", settings=settings)
|
||||
return True
|
||||
|
||||
def update_project_status(self, project_id: str, status: str) -> bool:
|
||||
"""Update project status."""
|
||||
project = self.get(project_id)
|
||||
if not project:
|
||||
return False
|
||||
|
||||
# Update status
|
||||
self.update(project_id, status=status)
|
||||
return True
|
||||
@@ -8,7 +8,7 @@ import asyncio
|
||||
from typing import Dict, Any, Optional
|
||||
from datetime import datetime
|
||||
|
||||
from backend.core.websocket_manager import manager, WebSocketMessage
|
||||
from core.websocket_manager import manager, WebSocketMessage
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -181,6 +181,16 @@ class WebSocketNotificationService:
|
||||
f"项目 {project_id} 处理失败",
|
||||
{"project_id": project_id, "task_id": task_id, "error": error}
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
async def send_processing_started(project_id: str, message: str = "开始视频处理流程"):
|
||||
"""发送处理开始通知(别名方法)"""
|
||||
await WebSocketNotificationService.send_project_update(
|
||||
project_id=project_id,
|
||||
status="processing",
|
||||
progress=0,
|
||||
message=message
|
||||
)
|
||||
|
||||
# 全局通知服务实例
|
||||
notification_service = WebSocketNotificationService()
|
||||
@@ -16,7 +16,7 @@ from backend.services.pipeline_adapter import create_pipeline_adapter_sync
|
||||
from backend.core.database import SessionLocal
|
||||
from backend.core.progress_manager import get_progress_manager
|
||||
from backend.models.project import Project, ProjectStatus
|
||||
from backend.models.task import Task, TaskStatus
|
||||
from backend.models.task import Task, TaskStatus, TaskType
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -31,7 +31,7 @@ def run_async_notification(coro):
|
||||
return loop.run_until_complete(coro)
|
||||
|
||||
@celery_app.task(bind=True, name='backend.tasks.processing.process_video_pipeline')
|
||||
def process_video_pipeline(self, project_id: int, input_video_path: str, input_srt_path: str) -> Dict[str, Any]:
|
||||
def process_video_pipeline(self, project_id: str, input_video_path: str, input_srt_path: str) -> Dict[str, Any]:
|
||||
"""
|
||||
处理视频流水线任务 - 使用Pipeline适配器
|
||||
|
||||
@@ -55,7 +55,7 @@ def process_video_pipeline(self, project_id: int, input_video_path: str, input_s
|
||||
task = Task(
|
||||
name=f"视频处理流水线",
|
||||
description=f"处理项目 {project_id} 的完整视频流水线",
|
||||
type="pipeline",
|
||||
task_type=TaskType.VIDEO_PROCESSING,
|
||||
project_id=project_id,
|
||||
celery_task_id=task_id,
|
||||
status=TaskStatus.RUNNING,
|
||||
@@ -85,7 +85,7 @@ def process_video_pipeline(self, project_id: int, input_video_path: str, input_s
|
||||
task.status = TaskStatus.COMPLETED
|
||||
task.progress = 100
|
||||
task.current_step = "处理完成"
|
||||
task.result = result
|
||||
task.result_data = result
|
||||
db.commit()
|
||||
|
||||
# 发送完成通知
|
||||
|
||||
Binary file not shown.
+3
-1
@@ -54,8 +54,10 @@ cd ..
|
||||
# 启动Celery
|
||||
echo -e "${BLUE}⚙️ 启动Celery...${NC}"
|
||||
export PYTHONPATH=.:$PYTHONPATH
|
||||
celery -A backend.core.celery_app worker --loglevel=info --concurrency=1 &
|
||||
cd backend
|
||||
celery -A core.celery_app worker --loglevel=info --concurrency=1 &
|
||||
CELERY_PID=$!
|
||||
cd ..
|
||||
|
||||
# 启动前端
|
||||
echo -e "${BLUE}🎨 启动前端...${NC}"
|
||||
|
||||
@@ -31,7 +31,7 @@ def main():
|
||||
|
||||
# 启动服务
|
||||
uvicorn.run(
|
||||
"app.main:app",
|
||||
"main:app",
|
||||
host="0.0.0.0",
|
||||
port=8000,
|
||||
reload=True,
|
||||
|
||||
+16
-12
@@ -160,29 +160,29 @@ echo -e "${GREEN}✅ 前端依赖检查完成${NC}"
|
||||
|
||||
# 初始化数据库
|
||||
echo -e "${BLUE}🗄️ 初始化数据库...${NC}"
|
||||
cd backend || handle_error "进入backend目录失败"
|
||||
|
||||
# 设置环境变量
|
||||
export PYTHONPATH=$PYTHONPATH:$(pwd)
|
||||
|
||||
# 检查并创建.env文件
|
||||
if [ ! -f "../.env" ]; then
|
||||
if [ ! -f ".env" ]; then
|
||||
echo -e "${YELLOW}📝 创建.env配置文件...${NC}"
|
||||
cp ../env.example ../.env
|
||||
cp env.example .env
|
||||
echo -e "${YELLOW}⚠️ 请编辑.env文件设置API密钥等配置${NC}"
|
||||
fi
|
||||
|
||||
# 设置环境变量 - 从项目根目录设置
|
||||
export PYTHONPATH=$PYTHONPATH:$(pwd)
|
||||
|
||||
# 初始化数据库表
|
||||
python -c "
|
||||
import sys
|
||||
sys.path.insert(0, '.')
|
||||
from core.database import create_tables, init_database
|
||||
import os
|
||||
# 添加项目根目录到Python路径
|
||||
project_root = os.path.abspath('.')
|
||||
sys.path.insert(0, project_root)
|
||||
from backend.core.database import create_tables, init_database
|
||||
create_tables()
|
||||
init_database()
|
||||
print('数据库初始化完成')
|
||||
" || handle_error "数据库初始化失败"
|
||||
|
||||
cd .. || handle_error "返回根目录失败"
|
||||
echo -e "${GREEN}✅ 数据库初始化完成${NC}"
|
||||
|
||||
# 启动服务
|
||||
@@ -195,8 +195,10 @@ export PYTHONPATH=.:$PYTHONPATH
|
||||
|
||||
# 尝试启动完整版后端(从项目根目录启动)
|
||||
echo "尝试启动完整版后端..."
|
||||
python -m uvicorn backend.main:app --host 0.0.0.0 --port 8000 --reload &
|
||||
cd backend
|
||||
python -m uvicorn main:app --host 0.0.0.0 --port 8000 --reload &
|
||||
BACKEND_PID=$!
|
||||
cd ..
|
||||
|
||||
# 等待后端启动
|
||||
echo "等待后端服务启动..."
|
||||
@@ -216,8 +218,10 @@ fi
|
||||
echo -e "${BLUE}⚙️ 启动Celery工作进程...${NC}"
|
||||
source venv/bin/activate
|
||||
export PYTHONPATH=.:$PYTHONPATH
|
||||
celery -A backend.core.celery_app worker --loglevel=info --concurrency=1 &
|
||||
cd backend
|
||||
celery -A core.celery_app worker --loglevel=info --concurrency=1 &
|
||||
CELERY_PID=$!
|
||||
cd ..
|
||||
echo -e "${GREEN}✅ Celery工作进程已启动 (PID: $CELERY_PID)${NC}"
|
||||
|
||||
# 3. 启动前端开发服务器
|
||||
|
||||
@@ -112,8 +112,10 @@ cd ..
|
||||
# 启动Celery (简化版)
|
||||
echo -e "${BLUE}⚙️ 启动Celery (简化版)...${NC}"
|
||||
export PYTHONPATH=.:$PYTHONPATH
|
||||
celery -A backend.core.celery_simple worker --loglevel=info --concurrency=1 &
|
||||
cd backend
|
||||
celery -A core.celery_simple worker --loglevel=info --concurrency=1 &
|
||||
CELERY_PID=$!
|
||||
cd ..
|
||||
|
||||
# 启动前端
|
||||
echo -e "${BLUE}🎨 启动前端...${NC}"
|
||||
|
||||
@@ -6,5 +6,6 @@ export PYTHONPATH=.:$PYTHONPATH
|
||||
# 激活虚拟环境
|
||||
source venv/bin/activate
|
||||
|
||||
# 启动Celery worker (在项目根目录运行)
|
||||
celery -A backend.core.celery_app worker --loglevel=info --concurrency=1
|
||||
# 启动Celery worker (在backend目录运行)
|
||||
cd backend
|
||||
celery -A core.celery_app worker --loglevel=info --concurrency=1
|
||||
Reference in new issue
Block a user