Files
DjangoAdmin_FastAPI_EleVue/modules/cms/item/service.py
T
ClaudeandClaude 969fdbbe7f feat(repo): 全部模块 service 改用 repository(Repository 全面落地)
- 24 个模块 service 从直接 db.query 改为使用各自 repository(get_by_id/filter/create/update)
- 4 个 agent 并行分组转换:system 组、dictionary/configuration/member/region、cms/link/notice、job/log
- 保留合法 db 用法:跨模型查询(user→dept/level/position、ad→adsort、adsort→item/itemcate)、投影查询(role/menu)、按条件删除(set_permission/save_role_menu/add_user_role)、独立会话(record_job_log/record_operation_log)、db.commit(pause/resume)
- 修复 JobLogRepository 软删列 del_flag;修复 ad/notice create 重复传参 bug
- 修复 base_repository.get_by_id/get_by_ids 兼容字符串 ID
- 实测:27 个读接口 + dept/notice/member/level 写操作全通过

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

147 lines
4.4 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.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 modules.cms.item.repository import item_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_item_page(request):
# 页码
page = int(request.query_params.get("pageNo", 1))
# 每页数
limit = int(request.query_params.get("pageSize", PAGE_SIZE))
# 实例化查询对象
query = item_repo.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):
# 根据ID查询站点
item = item_repo.get_by_id(item_id)
# 查询结果判空
if not item:
return None
# 对象转字典
data = item.to_dict()
# 站点图片
data['image'] = get_file_url(item.image)
# 返回结果
return data
# 添加站点
def add_item(request, data: ItemForm):
# 唯一性校验
if item_repo.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_repo.create(**form_data, create_user=get_user_id(request))
# 返回结果
return R.ok(msg="添加成功")
# 更新站点
def update_item(request, data: ItemForm):
# 记录ID判空
if not data.id or data.id <= 0:
return R.failed("记录ID不能为空")
# 唯一性校验(排除自身)
if item_repo.filter(and_(Item.name == data.name, Item.id != data.id, Item.is_delete == 0)).first():
return R.failed("站点名称不能重复")
# 根据ID查询记录
item = item_repo.get_by_id(data.id)
# 查询结果判空
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 = item_repo.update(data.id, 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():
item_rows = item_repo.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