Files
DjangoAdmin_FastAPI_EleVue/modules/cms/item_cate/service.py
T
ClaudeandClaude ae2e141713 refactor(repo): 收敛 base_model 双轨,删除函数统一走 repo.batch_delete_r
- shared/base_repository.py 新增 batch_delete_r(返回 R,等价原 base_model 语义)
- 20 个模块删除函数从 Model.batch_delete_r 改为 x_repo.batch_delete_r
- shared/base_model.py 移除 classmethod(get_by_id/get_by_ids/get_all_active/exists/batch_delete_r),只留字段 + to_dict
- 清理 base_model 多余 imports
- 实测 dept 删除、批量删除及多模块读接口正常

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 11:28:25 +08:00

164 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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