304 lines
9.9 KiB
Python
304 lines
9.9 KiB
Python
|
|
#!/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
|