68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
from models import GenerationRecord, to_bj_time
|
||
from flask import request
|
||
import json
|
||
from datetime import datetime, timedelta
|
||
|
||
def get_user_history_data(user_id, page=1, per_page=10, filter_type='all'):
|
||
"""获取用户历史记录业务逻辑"""
|
||
|
||
# 计算 90 天前的时间
|
||
ninety_days_ago = datetime.now() - timedelta(days=90)
|
||
|
||
query = GenerationRecord.query.filter(
|
||
GenerationRecord.user_id == user_id,
|
||
GenerationRecord.created_at >= ninety_days_ago,
|
||
GenerationRecord.prompt != "解读验光单"
|
||
)
|
||
|
||
if filter_type == 'video':
|
||
# 只看视频
|
||
query = query.filter(GenerationRecord.image_urls.like('%"type": "video"%'))
|
||
elif filter_type == 'image':
|
||
# 只看图片 (排除视频)
|
||
query = query.filter(~GenerationRecord.image_urls.like('%"type": "video"%'))
|
||
|
||
pagination = query.order_by(GenerationRecord.created_at.desc())\
|
||
.paginate(page=page, per_page=per_page, error_out=False)
|
||
|
||
# 格式化 URL,兼容新旧数据格式
|
||
def fix_minio_url(url):
|
||
if url and ":9000/images/" in url:
|
||
return "/files/" + url.split(":9000/images/")[-1]
|
||
return url
|
||
|
||
history_list = []
|
||
for r in pagination.items:
|
||
raw_urls = json.loads(r.image_urls)
|
||
formatted_urls = []
|
||
for u in raw_urls:
|
||
if isinstance(u, str):
|
||
# 旧数据:直接返回原图作为缩略图
|
||
fixed_u = fix_minio_url(u)
|
||
formatted_urls.append({"url": fixed_u, "thumb": fixed_u})
|
||
else:
|
||
# 修复对象格式中的 URL
|
||
if 'url' in u:
|
||
u['url'] = fix_minio_url(u['url'])
|
||
if 'thumb' in u:
|
||
u['thumb'] = fix_minio_url(u['thumb'])
|
||
|
||
# 如果是视频类型,提供默认预览图
|
||
if u.get('type') == 'video' and not u.get('thumb'):
|
||
u['thumb'] = "https://img.icons8.com/flat-round/64/000000/play--v1.png"
|
||
formatted_urls.append(u)
|
||
|
||
history_list.append({
|
||
"id": r.id,
|
||
"prompt": r.prompt,
|
||
"model": r.model,
|
||
"urls": formatted_urls,
|
||
"created_at": r.created_at_bj.strftime('%m-%d %H:%M')
|
||
})
|
||
|
||
return {
|
||
"history": history_list,
|
||
"has_next": pagination.has_next,
|
||
"total": pagination.total
|
||
}
|