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 }