Files
ai_wht_B/release/22/image_routes.py

304 lines
9.9 KiB
Python
Raw Normal View History

2026-01-06 14:18:39 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
图片库管理接口
"""
from flask import Blueprint, request, jsonify
import logging
from datetime import datetime
from auth_utils import require_auth, AuthUtils
from database_config import get_db_manager
from log_utils import log_create, log_update, log_delete, log_error, log_operation
logger = logging.getLogger(__name__)
# 创建蓝图
image_bp = Blueprint('image', __name__, url_prefix='/api/images')
@image_bp.route('/list', methods=['GET'])
@require_auth
def get_images_list():
"""获取图片列表"""
try:
current_user = AuthUtils.get_current_user()
enterprise_id = current_user.get('enterprise_id')
if not enterprise_id:
return jsonify({
'code': 400,
'message': '无法获取企业ID',
'data': None
}), 400
# 获取查询参数
page = int(request.args.get('page', 1))
page_size = int(request.args.get('pageSize', 20))
keyword = request.args.get('keyword', '').strip()
product_id = request.args.get('product_id', '').strip()
image_type = request.args.get('type', '').strip()
# 构建查询条件
where_conditions = ["1=1"] # ai_images表没有enterprise_id
params = []
if keyword:
where_conditions.append("(image_name LIKE %s OR keywords LIKE %s)")
keyword_pattern = f"%{keyword}%"
params.extend([keyword_pattern, keyword_pattern])
if product_id:
# 跨表查询通过ai_image_tags_relation关联
where_conditions.append("id IN (SELECT image_id FROM ai_image_tags_relation WHERE product_id = %s)")
params.append(product_id)
if image_type:
where_conditions.append("image_type_name LIKE %s")
params.append(f"%{image_type}%")
where_clause = " AND ".join(where_conditions)
# 计算偏移量
offset = (page - 1) * page_size
db_manager = get_db_manager()
# 查询总数
count_sql = f"""
SELECT COUNT(*) as total
FROM ai_images
WHERE {where_clause}
"""
count_result = db_manager.execute_query(count_sql, params)
total = count_result[0]['total']
# 查询图片列表
sql = f"""
SELECT id, image_name, image_url, image_thumb_url, thumbnail_url,
image_type_id, image_type_name, department, keywords,
size_type, file_size, width, height, status,
created_at, updated_at
FROM ai_images
WHERE {where_clause}
ORDER BY created_at DESC
LIMIT %s OFFSET %s
"""
params.extend([page_size, offset])
images = db_manager.execute_query(sql, params)
logger.info(f"获取图片列表成功,总数: {total}")
return jsonify({
'code': 200,
'message': 'success',
'data': {
'total': total,
'list': images
},
'timestamp': int(datetime.now().timestamp() * 1000)
})
except Exception as e:
logger.error(f"[获取图片列表] 处理请求时发生错误: {str(e)}", exc_info=True)
return jsonify({
'code': 500,
'message': '服务器内部错误',
'data': None
}), 500
@image_bp.route('/upload', methods=['POST'])
@require_auth
def upload_image():
"""上传图片"""
try:
current_user = AuthUtils.get_current_user()
enterprise_id = current_user.get('enterprise_id')
if not enterprise_id:
return jsonify({
'code': 400,
'message': '无法获取企业ID',
'data': None
}), 400
data = request.get_json()
if not data:
return jsonify({
'code': 400,
'message': '请求参数错误',
'data': None
}), 400
# 验证必需字段
required_fields = ['image_url', 'image_type_name']
for field in required_fields:
if not data.get(field):
return jsonify({
'code': 400,
'message': f'缺少必需字段: {field}',
'data': None
}), 400
db_manager = get_db_manager()
# 插入图片记录
sql = """
INSERT INTO ai_images
(image_name, image_url, image_thumb_url, thumbnail_url, image_type_id, image_type_name,
department, keywords, size_type, upload_user_id, status)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
"""
image_id = db_manager.execute_insert(sql, (
data.get('image_name', ''),
data['image_url'],
data.get('image_thumb_url', ''),
data.get('thumbnail_url', ''),
data.get('image_type_id', 0),
data['image_type_name'],
data.get('department', ''),
data.get('keywords', ''),
data.get('size_type', 'medical'),
current_user.get('user_id', 0),
'active'
))
logger.info(f"上传图片成功: ID {image_id}")
return jsonify({
'code': 200,
'message': '上传成功',
'data': {'id': image_id, 'url': data['image_url']},
'timestamp': int(datetime.now().timestamp() * 1000)
})
except Exception as e:
logger.error(f"[上传图片] 处理请求时发生错误: {str(e)}", exc_info=True)
return jsonify({
'code': 500,
'message': '服务器内部错误',
'data': None
}), 500
@image_bp.route('/batch-upload', methods=['POST'])
@require_auth
def batch_upload_images():
"""批量上传图片"""
try:
current_user = AuthUtils.get_current_user()
enterprise_id = current_user.get('enterprise_id')
if not enterprise_id:
return jsonify({
'code': 400,
'message': '无法获取企业ID',
'data': None
}), 400
data = request.get_json()
if not data or not data.get('images'):
return jsonify({
'code': 400,
'message': '请求参数错误',
'data': None
}), 400
db_manager = get_db_manager()
uploaded_ids = []
for img in data['images']:
# 验证必需字段
if not img.get('image_url') or not img.get('image_type_name'):
continue
# 插入图片记录
sql = """
INSERT INTO ai_images
(image_name, image_url, image_thumb_url, thumbnail_url, image_type_id, image_type_name,
department, keywords, size_type, upload_user_id, status)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
"""
image_id = db_manager.execute_insert(sql, (
img.get('image_name', ''),
img['image_url'],
img.get('image_thumb_url', ''),
img.get('thumbnail_url', ''),
img.get('image_type_id', 0),
img['image_type_name'],
img.get('department', ''),
img.get('keywords', ''),
img.get('size_type', 'medical'),
current_user.get('user_id', 0),
'active'
))
uploaded_ids.append(image_id)
logger.info(f"批量上传图片成功: {len(uploaded_ids)}")
return jsonify({
'code': 200,
'message': '批量上传成功',
'data': {
'uploaded_count': len(uploaded_ids),
'ids': uploaded_ids
},
'timestamp': int(datetime.now().timestamp() * 1000)
})
except Exception as e:
logger.error(f"[批量上传图片] 处理请求时发生错误: {str(e)}", exc_info=True)
return jsonify({
'code': 500,
'message': '服务器内部错误',
'data': None
}), 500
@image_bp.route('/<int:image_id>', methods=['DELETE'])
@require_auth
def delete_image(image_id):
"""删除图片"""
try:
current_user = AuthUtils.get_current_user()
enterprise_id = current_user.get('enterprise_id')
if not enterprise_id:
return jsonify({
'code': 400,
'message': '无法获取企业ID',
'data': None
}), 400
db_manager = get_db_manager()
# 检查图片是否存在
check_sql = "SELECT id FROM ai_images WHERE id = %s"
existing = db_manager.execute_query(check_sql, (image_id,))
if not existing:
return jsonify({
'code': 404,
'message': '图片不存在',
'data': None
}), 404
# 删除图片记录(软删除)
sql = "UPDATE ai_images SET status = 'deleted' WHERE id = %s"
db_manager.execute_update(sql, (image_id,))
logger.info(f"删除图片成功: ID {image_id}")
return jsonify({
'code': 200,
'message': '删除成功',
'data': None,
'timestamp': int(datetime.now().timestamp() * 1000)
})
except Exception as e:
logger.error(f"[删除图片] 处理请求时发生错误: {str(e)}", exc_info=True)
return jsonify({
'code': 500,
'message': '服务器内部错误',
'data': None
}), 500