from datetime import datetime, timezone from fastapi.logger import logger from shared.enums import LINK_TYPE_LIST, LINK_PLATFORM_LIST, LINK_FORM_LIST from shared.constants import PAGE_SIZE from modules.link.schemas import LinkForm, LinkStatusForm from modules.link.models import Link from modules.link.repository import link_repo from core import R from utils.rich_text import get_file_url, save_file from utils.request import like_contains from core.security import get_user_id # 查看友链分页数据 def get_link_page(request): # 页码 page = int(request.query_params.get("pageNo", 1)) # 每页数 limit = int(request.query_params.get("pageSize", PAGE_SIZE)) # 实例化查询对象 query = link_repo.filter(Link.is_delete == 0) # 友链名称 name = request.query_params.get('name') if name: query = query.filter(Link.name.like(like_contains(name), escape='\\')) # 友链类型:1-友情链接 2-合作伙伴 type = request.query_params.get('type') if type: query = query.filter(Link.type == type) # 投放平台:1PC站 2WAP站 3微信小程序 4APP应用 platform = request.query_params.get('platform') if platform: query = query.filter(Link.platform == platform) # 友链形式:1文字链接 2图片链接 form = request.query_params.get('form') if form: query = query.filter(Link.form == form) # 状态筛选 status = request.query_params.get('status') if status: query = query.filter(Link.status == status) # 排序 query = query.order_by(Link.sort.desc()) # 记录总数 count = query.count() # 分页查询 link_list = query.limit(limit).offset((page - 1) * limit).all() # 若当前页超出末页(数据被并发删除),自动回退到第一页 if page > 1 and not link_list: page = 1 count = query.count() link_list = query.limit(limit).offset(0).all() # 实例化结果 result = [] # 遍历数据源 if len(link_list) > 0: for item in link_list: # 对象转字典 data = item.to_dict() # 友链类型 data['type_name'] = LINK_TYPE_LIST.get(item.type) # 投放平台 data['platform_name'] = LINK_PLATFORM_LIST.get(item.platform) # 友链形式 data['form_name'] = LINK_FORM_LIST.get(item.form) # 友链图片 data['image'] = get_file_url(item.image) if item.image else None # 加入列表 result.append(data) # 返回结果 return R.ok(data=result, count=count) # 根据ID查看友链详情 def get_link_detail(link_id): # 根据ID查询友链 link = link_repo.get_by_id(link_id) # 查询结果为空判断 if not link: return None # 对象转字典 data = link.to_dict() # 友链图片 data['image'] = get_file_url(link.image) if link.image else None # 返回结果 return data # 添加友链 def add_link(request, data: LinkForm): # 表单数据转字典 form_data = data.model_dump(exclude={'id'}, by_alias=True) # 友链图片 image = data.image if image: form_data['image'] = save_file(image, "link") # 表单数据赋值给对象并插入 link_repo.create(**form_data, create_user=get_user_id(request)) # 返回结果 return R.ok(msg="添加成功") # 更新友链 def update_link(request, data: LinkForm): # 记录ID判空 if not data.id or data.id <= 0: return R.failed("记录ID不能为空") # 根据ID查询记录 link = link_repo.get_by_id(data.id) # 查询结果判空 if not link: return R.failed("记录不存在") # 构造更新数据(排除 id,使用别名以匹配数据库字段) updData = data.model_dump(exclude={'id'}, by_alias=True) # 友链图片 image = data.image if image: updData['image'] = save_file(image, "link") updData['update_user'] = get_user_id(request) updData['update_time'] = datetime.now(tz=timezone.utc) # 更新数据 result = link_repo.update(data.id, updData) # 提交数据 if not result: return R.failed("更新失败") # 返回结果 return R.ok(msg="更新成功") # 删除友链 def delete_link(link_id): return Link.batch_delete_r(link_id) # 设置状态 def update_link_status(request, data: LinkStatusForm): # 根据ID查询记录 link = link_repo.get_by_id(data.id) # 查询结果判空 if not link: return R.failed("记录不存在") # 更新记录 result = link_repo.update(data.id, { "status": data.status, "update_user": get_user_id(request), "update_time": datetime.now(tz=timezone.utc) }) # 提交数据 if not result: return R.failed("设置失败") # 返回结果 return R.ok(msg="设置成功")