from datetime import datetime, timezone from fastapi.logger import logger from sqlalchemy import and_ from shared.enums import ITEM_TYPE_LIST from shared.constants import PAGE_SIZE from modules.cms.item.schemas import ItemForm from modules.cms.item.models import Item from core.database import get_db_session 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_page(request): db = get_db_session() # 页码 page = int(request.query_params.get("pageNo", 1)) # 每页数 limit = int(request.query_params.get("pageSize", PAGE_SIZE)) # 实例化查询对象 query = db.query(Item).filter(Item.is_delete == 0) # 站点名称 name = request.query_params.get('name') if name: query = query.filter(Item.name.like(like_contains(name), escape='\\')) # 站点类型 type = request.query_params.get('type') if type: query = query.filter(Item.type == type) # 站点状态筛选 status = request.query_params.get('status') if status: query = query.filter(Item.status == status) # 排序 query = query.order_by(Item.sort.asc()) # 记录总数 count = query.count() # 分页查询 item_list = query.limit(limit).offset((page - 1) * limit).all() # 若当前页超出末页(数据被并发删除),自动回退到第一页 if page > 1 and not item_list: page = 1 count = query.count() item_list = query.limit(limit).offset(0).all() # 实例化结果 result = [] # 遍历数据源 if len(item_list) > 0: for item in item_list: # 对象转字典 data = item.to_dict() # 站点图片 data['image'] = get_file_url(item.image) # 站点类型描述 data['type_name'] = ITEM_TYPE_LIST.get(item.type) # 加入列表 result.append(data) # 返回结果 return R.ok(data=result, count=count) # 根据ID查询站点详情 def get_item_detail(item_id): db = get_db_session() # 根据ID查询站点 item = db.query(Item).filter(and_(Item.id == item_id, Item.is_delete == 0)).first() # 查询结果判空 if not item: return None # 对象转字典 data = item.to_dict() # 站点图片 data['image'] = get_file_url(item.image) # 返回结果 return data # 添加站点 def add_item(request, data: ItemForm): db = get_db_session() # 唯一性校验 if db.query(Item).filter(and_(Item.name == data.name, Item.is_delete == 0)).first(): return R.failed("站点名称不能重复") # 表单数据转字典 form_data = data.model_dump(exclude={'id'}) # 站点图片 image = data.image if image: form_data['image'] = save_file(image, "item") # 表单数据赋值给对象 item = Item(**form_data) item.create_user = get_user_id(request) # 插入数据 item.save() # 返回结果 return R.ok(msg="添加成功") # 更新站点 def update_item(request, data: ItemForm): db = get_db_session() # 记录ID判空 if not data.id or data.id <= 0: return R.failed("记录ID不能为空") # 唯一性校验(排除自身) if db.query(Item).filter(and_(Item.name == data.name, Item.id != data.id, Item.is_delete == 0)).first(): return R.failed("站点名称不能重复") # 根据ID查询记录 item = db.query(Item).filter(and_(Item.id == data.id, Item.is_delete == 0)).first() # 查询结果判空 if not item: return R.failed("记录不存在") # 构造更新数据(排除 id) updData = data.model_dump(exclude={'id'}) # 站点图片 image = data.image if image: updData['image'] = save_file(image, "item") updData['update_user'] = get_user_id(request) updData['update_time'] = datetime.now(tz=timezone.utc) # 更新数据 result = db.query(Item).filter_by(id=data.id).update(updData) # 提交数据 if not result: return R.failed("更新失败") # 返回结果 return R.ok(msg="更新成功") # 删除站点 def delete_item(item_id): return Item.batch_delete_r(item_id) # 获取站点列表 def get_item_list(): db = get_db_session() item_rows = db.query(Item).filter(and_(Item.status == 1, Item.is_delete == 0)).order_by(Item.sort.asc()).all() # 实例化站点列表 item_list = [] # 遍历数据源 for v in item_rows: # 对象转字典 item = v.to_dict() # 加入列表 item_list.append(item) # 返回结果 return item_list