Files
DjangoAdmin_FastAPI_EleVue/modules/notice/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

130 lines
4.1 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 shared.enums import NOTICE_SOURCE_LIST
from shared.constants import PAGE_SIZE
from modules.notice.schemas import NoticeForm
from modules.notice.models import Notice
from modules.notice.repository import notice_repo
from config import FASTAPI_IMAGE_URL
from core import R
from utils.rich_text import save_content
from utils.request import like_contains
from core.security import get_user_id
# 查询通知公告分页数据
def get_notice_page(request):
# 页码
page = int(request.query_params.get("pageNo", 1))
# 每页数
limit = int(request.query_params.get("pageSize", PAGE_SIZE))
# 实例化查询对象
query = notice_repo.filter(Notice.is_delete == 0)
# 通知公告标题
title = request.query_params.get('title')
if title:
query = query.filter(Notice.title.like(like_contains(title), escape='\\'))
# 通知来源:1官方平台 2开源中国 3CSDN官方 4新浪微博
source = request.query_params.get('source')
if source:
query = query.filter(Notice.source == source)
# 通知状态:1-正常 2-停用
status = request.query_params.get('status')
if status:
query = query.filter(Notice.status == status)
# 排序
query = query.order_by(Notice.id.desc())
# 记录总数
count = query.count()
# 分页查询
notice_list = query.limit(limit).offset((page - 1) * limit).all()
# 若当前页超出末页(数据被并发删除),自动回退到第一页
if page > 1 and not notice_list:
page = 1
count = query.count()
notice_list = query.limit(limit).offset(0).all()
# 实例化结果
result = []
# 遍历数据源
if len(notice_list) > 0:
for item in notice_list:
# 对象转字典
data = item.to_dict()
# 通知来源描述
data['source_name'] = NOTICE_SOURCE_LIST.get(item.source)
# 加入列表
result.append(data)
# 返回结果
return R.ok(data=result, count=count)
# 根据通知ID查询详情
def get_notice_detail(notice_id):
# 根据ID查询通知公告
notice = notice_repo.get_by_id(notice_id)
# 查询结果判空
if not notice:
return None
# 对象转字典
data = notice.to_dict()
# 富文本内容
content = (notice.content or "").replace("[IMG_URL]", FASTAPI_IMAGE_URL)
data['content'] = content
# 通知来源
data['source_name'] = NOTICE_SOURCE_LIST.get(notice.source)
# 返回结果
return data
# 添加通知公告
def add_notice(request, data: NoticeForm):
# 通知标题
title = data.title
# 通知内容
content = data.content
# 处理富文本内容
content = save_content(content, title, "notice")
# 表单数据赋值给对象并插入(content 用处理后的富文本,排除表单原值避免重复传参)
notice_repo.create(**data.model_dump(exclude={'id', 'content'}), content=content, create_user=get_user_id(request))
# 返回结果
return R.ok(msg="添加成功")
# 更新通知公告
def update_notice(request, data: NoticeForm):
# 记录ID判空
if not data.id or data.id <= 0:
return R.failed("记录ID不能为空")
# 根据ID查询记录
notice = notice_repo.get_by_id(data.id)
# 查询结果判空
if not notice:
return R.failed("记录不存在")
# 通知标题
title = data.title
# 通知内容
content = data.content
# 处理富文本内容
content = save_content(content, title, "notice")
# 构造更新数据(排除 id)
updData = data.model_dump(exclude={'id'})
updData['content'] = content
updData['update_user'] = get_user_id(request)
updData['update_time'] = datetime.now(tz=timezone.utc)
# 更新记录
result = notice_repo.update(data.id, updData)
# 提交数据
if not result:
return R.failed("更新失败")
# 返回结果
return R.ok(msg="更新成功")
# 删除通知公告
def delete_notice(notice_id):
return notice_repo.batch_delete_r(notice_id)