Add spider and workflow visualization module entries and related route configurations.
This commit is contained in:
@@ -83,11 +83,12 @@ app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
|
|||||||
from views.page import page
|
from views.page import page
|
||||||
from views.user import user
|
from views.user import user
|
||||||
from views.spider_control import spider_bp
|
from views.spider_control import spider_bp
|
||||||
from views.workflow_api import workflow_bp
|
from views.workflow_api import workflow_bp, workflow_api_bp
|
||||||
app.register_blueprint(page.pb)
|
app.register_blueprint(page.pb)
|
||||||
app.register_blueprint(user.ub)
|
app.register_blueprint(user.ub)
|
||||||
app.register_blueprint(spider_bp)
|
app.register_blueprint(spider_bp)
|
||||||
app.register_blueprint(workflow_bp) # 注册工作流蓝图
|
app.register_blueprint(workflow_bp) # 注册工作流蓝图
|
||||||
|
app.register_blueprint(workflow_api_bp) # 注册工作流API蓝图
|
||||||
|
|
||||||
# 首页路由
|
# 首页路由
|
||||||
@app.route('/')
|
@app.route('/')
|
||||||
|
|||||||
@@ -115,6 +115,26 @@
|
|||||||
<span class="ml-2" data-i18n="yuqingpredict">舆情预测</span>
|
<span class="ml-2" data-i18n="yuqingpredict">舆情预测</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="sidebar-layout">
|
||||||
|
<a href="/spider/control" class="svg-icon">
|
||||||
|
<i class="">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="18" fill="none" viewbox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"></path>
|
||||||
|
</svg>
|
||||||
|
</i>
|
||||||
|
<span class="ml-2" data-i18n="spiderControl">爬虫可视化控制</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="sidebar-layout">
|
||||||
|
<a href="/workflow/editor" class="svg-icon">
|
||||||
|
<i class="">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="18" fill="none" viewbox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path>
|
||||||
|
</svg>
|
||||||
|
</i>
|
||||||
|
<span class="ml-2" data-i18n="workflowEditor">流程可视化编排</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li class=" sidebar-layout">
|
<li class=" sidebar-layout">
|
||||||
<a href="/page/articleCloud" class="svg-icon">
|
<a href="/page/articleCloud" class="svg-icon">
|
||||||
<i class="">
|
<i class="">
|
||||||
|
|||||||
+40
-16
@@ -4,18 +4,27 @@ import time
|
|||||||
import uuid
|
import uuid
|
||||||
import logging
|
import logging
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from flask import Blueprint, request, jsonify, current_app
|
from flask import Blueprint, request, jsonify, current_app, render_template
|
||||||
from utils.db_manager import DatabaseManager
|
from utils.db_manager import DatabaseManager
|
||||||
from utils.sensitive_filter import filter_dict
|
from utils.sensitive_filter import filter_dict
|
||||||
from utils.cache_manager import CacheManager
|
from utils.cache_manager import CacheManager
|
||||||
|
|
||||||
workflow_bp = Blueprint('workflow', __name__, url_prefix='/api/workflow')
|
# 创建两个蓝图:一个用于页面渲染,一个用于API
|
||||||
|
workflow_bp = Blueprint('workflow', __name__, url_prefix='/workflow')
|
||||||
|
workflow_api_bp = Blueprint('workflow_api', __name__, url_prefix='/api/workflow')
|
||||||
|
|
||||||
logger = logging.getLogger('workflow_api')
|
logger = logging.getLogger('workflow_api')
|
||||||
logger.setLevel(logging.INFO)
|
logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
# 缓存管理器
|
# 缓存管理器
|
||||||
workflow_cache = CacheManager(name="workflows", memory_capacity=100, cache_duration=1)
|
workflow_cache = CacheManager(name="workflows", memory_capacity=100, cache_duration=1)
|
||||||
|
|
||||||
|
# 添加工作流编辑器页面路由
|
||||||
|
@workflow_bp.route('/editor', methods=['GET'])
|
||||||
|
def workflow_editor():
|
||||||
|
"""渲染工作流编辑器页面"""
|
||||||
|
return render_template('workflow_editor.html')
|
||||||
|
|
||||||
# 默认爬虫配置模板
|
# 默认爬虫配置模板
|
||||||
DEFAULT_CRAWLER_TEMPLATES = [
|
DEFAULT_CRAWLER_TEMPLATES = [
|
||||||
{
|
{
|
||||||
@@ -363,7 +372,7 @@ AVAILABLE_COMPONENTS = {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@workflow_bp.route('/crawler-templates', methods=['GET'])
|
@workflow_api_bp.route('/crawler-templates', methods=['GET'])
|
||||||
def get_crawler_templates():
|
def get_crawler_templates():
|
||||||
"""获取爬虫配置模板列表"""
|
"""获取爬虫配置模板列表"""
|
||||||
# 从缓存获取
|
# 从缓存获取
|
||||||
@@ -392,7 +401,7 @@ def get_crawler_templates():
|
|||||||
'data': filter_dict(templates)
|
'data': filter_dict(templates)
|
||||||
})
|
})
|
||||||
|
|
||||||
@workflow_bp.route('/crawler-templates/<template_id>', methods=['GET'])
|
@workflow_api_bp.route('/crawler-templates/<template_id>', methods=['GET'])
|
||||||
def get_crawler_template(template_id):
|
def get_crawler_template(template_id):
|
||||||
"""获取指定爬虫配置模板"""
|
"""获取指定爬虫配置模板"""
|
||||||
# 查找默认模板
|
# 查找默认模板
|
||||||
@@ -425,7 +434,7 @@ def get_crawler_template(template_id):
|
|||||||
'data': filter_dict(template)
|
'data': filter_dict(template)
|
||||||
})
|
})
|
||||||
|
|
||||||
@workflow_bp.route('/crawler-templates', methods=['POST'])
|
@workflow_api_bp.route('/crawler-templates', methods=['POST'])
|
||||||
def create_crawler_template():
|
def create_crawler_template():
|
||||||
"""创建爬虫配置模板"""
|
"""创建爬虫配置模板"""
|
||||||
data = request.json
|
data = request.json
|
||||||
@@ -491,7 +500,7 @@ def create_crawler_template():
|
|||||||
finally:
|
finally:
|
||||||
cursor.close()
|
cursor.close()
|
||||||
|
|
||||||
@workflow_bp.route('/crawler-templates/<template_id>', methods=['PUT'])
|
@workflow_api_bp.route('/crawler-templates/<template_id>', methods=['PUT'])
|
||||||
def update_crawler_template(template_id):
|
def update_crawler_template(template_id):
|
||||||
"""更新爬虫配置模板"""
|
"""更新爬虫配置模板"""
|
||||||
data = request.json
|
data = request.json
|
||||||
@@ -552,7 +561,7 @@ def update_crawler_template(template_id):
|
|||||||
finally:
|
finally:
|
||||||
cursor.close()
|
cursor.close()
|
||||||
|
|
||||||
@workflow_bp.route('/crawler-templates/<template_id>', methods=['DELETE'])
|
@workflow_api_bp.route('/crawler-templates/<template_id>', methods=['DELETE'])
|
||||||
def delete_crawler_template(template_id):
|
def delete_crawler_template(template_id):
|
||||||
"""删除爬虫配置模板"""
|
"""删除爬虫配置模板"""
|
||||||
# 验证模板是否存在
|
# 验证模板是否存在
|
||||||
@@ -597,7 +606,7 @@ def delete_crawler_template(template_id):
|
|||||||
finally:
|
finally:
|
||||||
cursor.close()
|
cursor.close()
|
||||||
|
|
||||||
@workflow_bp.route('/analysis-templates', methods=['GET'])
|
@workflow_api_bp.route('/analysis-templates', methods=['GET'])
|
||||||
def get_analysis_templates():
|
def get_analysis_templates():
|
||||||
"""获取分析流程模板列表"""
|
"""获取分析流程模板列表"""
|
||||||
# 从缓存获取
|
# 从缓存获取
|
||||||
@@ -626,7 +635,7 @@ def get_analysis_templates():
|
|||||||
'data': filter_dict(templates)
|
'data': filter_dict(templates)
|
||||||
})
|
})
|
||||||
|
|
||||||
@workflow_bp.route('/analysis-templates/<template_id>', methods=['GET'])
|
@workflow_api_bp.route('/analysis-templates/<template_id>', methods=['GET'])
|
||||||
def get_analysis_template(template_id):
|
def get_analysis_template(template_id):
|
||||||
"""获取指定分析流程模板"""
|
"""获取指定分析流程模板"""
|
||||||
# 查找默认模板
|
# 查找默认模板
|
||||||
@@ -659,7 +668,7 @@ def get_analysis_template(template_id):
|
|||||||
'data': filter_dict(template)
|
'data': filter_dict(template)
|
||||||
})
|
})
|
||||||
|
|
||||||
@workflow_bp.route('/analysis-templates', methods=['POST'])
|
@workflow_api_bp.route('/analysis-templates', methods=['POST'])
|
||||||
def create_analysis_template():
|
def create_analysis_template():
|
||||||
"""创建分析流程模板"""
|
"""创建分析流程模板"""
|
||||||
data = request.json
|
data = request.json
|
||||||
@@ -727,7 +736,7 @@ def create_analysis_template():
|
|||||||
finally:
|
finally:
|
||||||
cursor.close()
|
cursor.close()
|
||||||
|
|
||||||
@workflow_bp.route('/analysis-templates/<template_id>', methods=['PUT'])
|
@workflow_api_bp.route('/analysis-templates/<template_id>', methods=['PUT'])
|
||||||
def update_analysis_template(template_id):
|
def update_analysis_template(template_id):
|
||||||
"""更新分析流程模板"""
|
"""更新分析流程模板"""
|
||||||
data = request.json
|
data = request.json
|
||||||
@@ -790,7 +799,7 @@ def update_analysis_template(template_id):
|
|||||||
finally:
|
finally:
|
||||||
cursor.close()
|
cursor.close()
|
||||||
|
|
||||||
@workflow_bp.route('/analysis-templates/<template_id>', methods=['DELETE'])
|
@workflow_api_bp.route('/analysis-templates/<template_id>', methods=['DELETE'])
|
||||||
def delete_analysis_template(template_id):
|
def delete_analysis_template(template_id):
|
||||||
"""删除分析流程模板"""
|
"""删除分析流程模板"""
|
||||||
# 验证模板是否存在
|
# 验证模板是否存在
|
||||||
@@ -835,7 +844,7 @@ def delete_analysis_template(template_id):
|
|||||||
finally:
|
finally:
|
||||||
cursor.close()
|
cursor.close()
|
||||||
|
|
||||||
@workflow_bp.route('/components', methods=['GET'])
|
@workflow_api_bp.route('/components', methods=['GET'])
|
||||||
def get_available_components():
|
def get_available_components():
|
||||||
"""获取可用组件列表"""
|
"""获取可用组件列表"""
|
||||||
return jsonify({
|
return jsonify({
|
||||||
@@ -843,7 +852,7 @@ def get_available_components():
|
|||||||
'data': filter_dict(AVAILABLE_COMPONENTS)
|
'data': filter_dict(AVAILABLE_COMPONENTS)
|
||||||
})
|
})
|
||||||
|
|
||||||
@workflow_bp.route('/run-workflow', methods=['POST'])
|
@workflow_api_bp.route('/run-workflow', methods=['POST'])
|
||||||
def run_workflow():
|
def run_workflow():
|
||||||
"""执行工作流"""
|
"""执行工作流"""
|
||||||
data = request.json
|
data = request.json
|
||||||
@@ -874,7 +883,7 @@ def run_workflow():
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@workflow_bp.route('/task-status/<task_id>', methods=['GET'])
|
@workflow_api_bp.route('/task-status/<task_id>', methods=['GET'])
|
||||||
def get_task_status(task_id):
|
def get_task_status(task_id):
|
||||||
"""获取任务执行状态"""
|
"""获取任务执行状态"""
|
||||||
# 这里是获取任务状态的占位符
|
# 这里是获取任务状态的占位符
|
||||||
@@ -893,4 +902,19 @@ def get_task_status(task_id):
|
|||||||
return jsonify({
|
return jsonify({
|
||||||
'success': True,
|
'success': True,
|
||||||
'data': status
|
'data': status
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@workflow_api_bp.route('/save', methods=['POST'])
|
||||||
|
def save_workflow():
|
||||||
|
"""保存工作流"""
|
||||||
|
# ... existing code ...
|
||||||
|
|
||||||
|
@workflow_api_bp.route('/<workflow_id>', methods=['GET'])
|
||||||
|
def get_workflow(workflow_id):
|
||||||
|
"""获取工作流"""
|
||||||
|
# ... existing code ...
|
||||||
|
|
||||||
|
@workflow_api_bp.route('/<workflow_id>', methods=['DELETE'])
|
||||||
|
def delete_workflow(workflow_id):
|
||||||
|
"""删除工作流"""
|
||||||
|
# ... existing code ...
|
||||||
Reference in New Issue
Block a user