from datetime import datetime, timezone from fastapi.logger import logger from sqlalchemy import and_ from shared.constants import PAGE_SIZE from modules.cms.item_cate.schemas import ItemCateForm from modules.cms.item_cate.models import ItemCate from modules.cms.item_cate.repository import itemcate_repo from modules.cms.item import service as item 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_item_cate_page(request): # 页码 page = int(request.query_params.get("pageNo", 1)) # 每页数 limit = int(request.query_params.get("pageSize", PAGE_SIZE)) # 实例化查询对象 query = itemcate_repo.filter(ItemCate.is_delete == 0) # 栏目名称 name = request.query_params.get('name') if name: query = query.filter(ItemCate.name.like(like_contains(name), escape='\\')) # 栏目状态筛选 status = request.query_params.get('status') if status: query = query.filter(ItemCate.status == status) # 排序 query = query.order_by(ItemCate.sort.asc()) # 记录总数 count = query.count() # 分页查询 item_cate_list = query.limit(limit).offset((page - 1) * limit).all() # 若当前页超出末页(数据被并发删除),自动回退到第一页 if page > 1 and not item_cate_list: page = 1 count = query.count() item_cate_list = query.limit(limit).offset(0).all() # 实例化结果 result = [] # 遍历数据源 if len(item_cate_list) > 0: for v in item_cate_list: # 对象转字典 data = v.to_dict() # 栏目图片 data['cover'] = get_file_url(v.cover) if v.cover else None # 查询站点信息 item_info = item.get_item_detail(v.id) if item_info: data['item_name'] = item_info.get('name') if item_info else None # 加入列表 result.append(data) # 返回结果 return R.ok(data=result, count=count) # 根据栏目ID查询详情 def get_item_cate_detail(itemcate_id): # 根据ID查询栏目 cate = itemcate_repo.get_by_id(itemcate_id) # 查询结果判空 if not cate: return None # 对象转字典 data = cate.to_dict() # 栏目图片 if cate.cover: data['cover'] = get_file_url(cate.cover) # 返回结果 return data # 添加栏目 def add_item_cate(request, data: ItemCateForm): # 唯一性校验 if itemcate_repo.filter(and_(ItemCate.name == data.name, ItemCate.is_delete == 0)).first(): return R.failed("栏目名称不能重复") # 表单数据转字典 form_data = data.model_dump(exclude={'id'}) # 是否有封面 is_cover = data.is_cover if is_cover == 1: # 栏目图片 cover = data.cover # 图片处理 if cover: form_data['cover'] = save_file(cover, "item_cate") else: form_data['cover'] = None else: form_data['cover'] = None # 表单数据赋值给对象并插入 itemcate_repo.create(**form_data, create_user=get_user_id(request)) # 返回结果 return R.ok(msg="添加成功") # 更新栏目 def update_item_cate(request, data: ItemCateForm): # 记录ID判空 if not data.id or data.id <= 0: return R.failed("记录ID不能为空") # 唯一性校验(排除自身) if itemcate_repo.filter(and_(ItemCate.name == data.name, ItemCate.id != data.id, ItemCate.is_delete == 0)).first(): return R.failed("栏目名称不能重复") # 根据ID查询记录 cate = itemcate_repo.get_by_id(data.id) # 查询结果判空 if not cate: return R.failed("记录不存在") # 构造更新数据(排除 id) updData = data.model_dump(exclude={'id'}) # 是否有封面 is_cover = data.is_cover if is_cover == 1: # 栏目图片 cover = data.cover # 图片处理 if cover: updData['cover'] = save_file(cover, "item_cate") else: updData['cover'] = None else: updData['cover'] = None updData['update_user'] = get_user_id(request) updData['update_time'] = datetime.now(tz=timezone.utc) # 更新数据 result = itemcate_repo.update(data.id, updData) # 提交数据 if not result: return R.failed("更新失败") # 返回结果 return R.ok(msg="更新成功") # 删除栏目 def delete_item_cate(cate_id): return itemcate_repo.batch_delete_r(cate_id) # 获取栏目列表 def get_cate_list(): cate_rows = itemcate_repo.filter(and_(ItemCate.is_delete == 0, ItemCate.status == 1)).order_by( ItemCate.sort.asc()).all() # 实例化栏目列表 cate_list = [] # 遍历数据源 for v in cate_rows: # 对象转字典 item = v.to_dict() # 加入列表 cate_list.append(item) # 返回结果 return cate_list