239 lines
7.3 KiB
Python
239 lines
7.3 KiB
Python
from flask import Flask, jsonify, request
|
||
from flask_cors import CORS
|
||
from datetime import datetime
|
||
|
||
app = Flask(__name__)
|
||
CORS(app) # 允许跨域请求
|
||
|
||
# 模拟数据库中的模板数据
|
||
MOCK_TEMPLATES = [
|
||
{
|
||
"id": "1",
|
||
"name": "后端开发工程师",
|
||
"description": "专业的后端开发工程师模板",
|
||
"category": "软件开发",
|
||
"industry": "互联网",
|
||
"profession": "开发工程师",
|
||
"sub_category": "后端开发",
|
||
"system_prompt": "你是一位专业的后端开发工程师..."
|
||
},
|
||
{
|
||
"id": "2",
|
||
"name": "前端开发工程师",
|
||
"description": "专业的前端开发工程师模板",
|
||
"category": "软件开发",
|
||
"industry": "互联网",
|
||
"profession": "开发工程师",
|
||
"sub_category": "前端开发",
|
||
"system_prompt": "你是一位专业的前端开发工程师..."
|
||
}
|
||
]
|
||
|
||
# 身份验证装饰器
|
||
def require_auth(f):
|
||
from functools import wraps
|
||
@wraps(f)
|
||
def decorated(*args, **kwargs):
|
||
auth_header = request.headers.get('Authorization')
|
||
if not auth_header or not auth_header.startswith('Bearer '):
|
||
return jsonify({'error': 'No authorization token provided'}), 401
|
||
# 这里简单验证token,实际应该更严格
|
||
token = auth_header.split(' ')[1]
|
||
if token != 'test_token_123':
|
||
return jsonify({'error': 'Invalid token'}), 401
|
||
return f(*args, **kwargs)
|
||
return decorated
|
||
|
||
# 获取模板列表接口
|
||
@app.route('/api/v1/templates', methods=['GET'])
|
||
@require_auth
|
||
def get_templates():
|
||
# 获取查询参数
|
||
page = int(request.args.get('page', 1))
|
||
size = int(request.args.get('size', 10))
|
||
category = request.args.get('category')
|
||
industry = request.args.get('industry')
|
||
profession = request.args.get('profession')
|
||
|
||
# 过滤模板
|
||
filtered_templates = MOCK_TEMPLATES
|
||
if category:
|
||
filtered_templates = [t for t in filtered_templates if t['category'] == category]
|
||
if industry:
|
||
filtered_templates = [t for t in filtered_templates if t['industry'] == industry]
|
||
if profession:
|
||
filtered_templates = [t for t in filtered_templates if t['profession'] == profession]
|
||
|
||
# 计算分页
|
||
start = (page - 1) * size
|
||
end = start + size
|
||
paginated_templates = filtered_templates[start:end]
|
||
|
||
return jsonify({
|
||
'code': 200,
|
||
'data': {
|
||
'total': len(filtered_templates),
|
||
'pages': (len(filtered_templates) + size - 1) // size,
|
||
'current_page': page,
|
||
'templates': paginated_templates
|
||
}
|
||
})
|
||
|
||
# 获取单个模板接口
|
||
@app.route('/api/v1/templates/<template_id>', methods=['GET'])
|
||
@require_auth
|
||
def get_template(template_id):
|
||
template = next((t for t in MOCK_TEMPLATES if t['id'] == template_id), None)
|
||
if not template:
|
||
return jsonify({'error': 'Template not found'}), 404
|
||
|
||
return jsonify({
|
||
'code': 200,
|
||
'data': template
|
||
})
|
||
|
||
# 创建模板接口
|
||
@app.route('/api/v1/templates', methods=['POST'])
|
||
@require_auth
|
||
def create_template():
|
||
data = request.get_json()
|
||
|
||
# 验证必要字段
|
||
required_fields = ['name', 'description', 'category', 'industry', 'profession']
|
||
for field in required_fields:
|
||
if field not in data:
|
||
return jsonify({'error': f'Missing required field: {field}'}), 400
|
||
|
||
# 创建新模板
|
||
new_template = {
|
||
'id': str(len(MOCK_TEMPLATES) + 1),
|
||
**data,
|
||
'created_at': datetime.now().isoformat()
|
||
}
|
||
MOCK_TEMPLATES.append(new_template)
|
||
|
||
return jsonify({
|
||
'code': 200,
|
||
'data': {
|
||
'id': new_template['id'],
|
||
'message': 'Template created successfully'
|
||
}
|
||
})
|
||
|
||
# 更新模板接口
|
||
@app.route('/api/v1/templates/<template_id>', methods=['PUT'])
|
||
@require_auth
|
||
def update_template(template_id):
|
||
template = next((t for t in MOCK_TEMPLATES if t['id'] == template_id), None)
|
||
if not template:
|
||
return jsonify({'error': 'Template not found'}), 404
|
||
|
||
data = request.get_json()
|
||
template.update(data)
|
||
|
||
return jsonify({
|
||
'code': 200,
|
||
'data': {
|
||
'message': 'Template updated successfully'
|
||
}
|
||
})
|
||
|
||
# 删除模板接口
|
||
@app.route('/api/v1/templates/<template_id>', methods=['DELETE'])
|
||
@require_auth
|
||
def delete_template(template_id):
|
||
template_index = next((i for i, t in enumerate(MOCK_TEMPLATES) if t['id'] == template_id), None)
|
||
if template_index is None:
|
||
return jsonify({'error': 'Template not found'}), 404
|
||
|
||
MOCK_TEMPLATES.pop(template_index)
|
||
|
||
return jsonify({
|
||
'code': 200,
|
||
'data': {
|
||
'message': 'Template deleted successfully'
|
||
}
|
||
})
|
||
|
||
# 模糊搜索提示词模板接口
|
||
@app.route('/api/v1/templates/search', methods=['GET'])
|
||
@require_auth
|
||
def search_templates():
|
||
"""模糊搜索提示词模板"""
|
||
# 获取搜索参数
|
||
keyword = request.args.get('keyword', '').strip()
|
||
page = int(request.args.get('page', 1))
|
||
size = int(request.args.get('size', 10))
|
||
|
||
# 如果没有关键词,返回空结果
|
||
if not keyword:
|
||
return jsonify({
|
||
'code': 200,
|
||
'data': {
|
||
'total': 0,
|
||
'pages': 0,
|
||
'current_page': page,
|
||
'templates': []
|
||
}
|
||
})
|
||
|
||
# 执行模糊搜索
|
||
# 搜索范围:名称、描述、分类、行业、职业、子分类、系统提示词
|
||
search_results = []
|
||
for template in MOCK_TEMPLATES:
|
||
# 在各个字段中搜索关键词
|
||
if any(keyword.lower() in str(value).lower() for value in [
|
||
template.get('name', ''),
|
||
template.get('description', ''),
|
||
template.get('category', ''),
|
||
template.get('industry', ''),
|
||
template.get('profession', ''),
|
||
template.get('sub_category', ''),
|
||
template.get('system_prompt', '')
|
||
]):
|
||
# 添加匹配度信息
|
||
match_score = sum(
|
||
str(value).lower().count(keyword.lower())
|
||
for value in [
|
||
template.get('name', ''),
|
||
template.get('description', ''),
|
||
template.get('category', ''),
|
||
template.get('industry', ''),
|
||
template.get('profession', ''),
|
||
template.get('sub_category', ''),
|
||
template.get('system_prompt', '')
|
||
]
|
||
)
|
||
search_results.append({
|
||
**template,
|
||
'_match_score': match_score
|
||
})
|
||
|
||
# 按匹配度排序
|
||
search_results.sort(key=lambda x: x['_match_score'], reverse=True)
|
||
|
||
# 移除匹配度信息
|
||
search_results = [{k: v for k, v in t.items() if k != '_match_score'}
|
||
for t in search_results]
|
||
|
||
# 计算分页
|
||
total = len(search_results)
|
||
total_pages = (total + size - 1) // size
|
||
start = (page - 1) * size
|
||
end = start + size
|
||
paginated_results = search_results[start:end]
|
||
|
||
# 返回结果
|
||
return jsonify({
|
||
'code': 200,
|
||
'data': {
|
||
'total': total,
|
||
'pages': total_pages,
|
||
'current_page': page,
|
||
'keyword': keyword,
|
||
'templates': paginated_results
|
||
}
|
||
})
|
||
|
||
if __name__ == '__main__':
|
||
app.run(debug=True, port=5000) |