From ae2e141713bdfa4e992d30e4ff809f98e404bd8b Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Aug 2026 11:28:25 +0800 Subject: [PATCH] =?UTF-8?q?refactor(repo):=20=E6=94=B6=E6=95=9B=20base=5Fm?= =?UTF-8?q?odel=20=E5=8F=8C=E8=BD=A8=EF=BC=8C=E5=88=A0=E9=99=A4=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E7=BB=9F=E4=B8=80=E8=B5=B0=20repo.batch=5Fdelete=5Fr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- modules/cms/ad/service.py | 2 +- modules/cms/ad_sort/service.py | 2 +- modules/cms/item/service.py | 2 +- modules/cms/item_cate/service.py | 2 +- modules/configuration/service.py | 4 +- modules/dictionary/service.py | 4 +- modules/job/service.py | 2 +- modules/link/service.py | 2 +- modules/member/service.py | 4 +- modules/notice/service.py | 2 +- modules/region/service.py | 2 +- modules/system/dept/service.py | 2 +- modules/system/level/service.py | 2 +- modules/system/position/service.py | 2 +- modules/system/user/service.py | 2 +- shared/base_model.py | 84 ++---------------------------- shared/base_repository.py | 25 ++++++++- 17 files changed, 46 insertions(+), 99 deletions(-) diff --git a/modules/cms/ad/service.py b/modules/cms/ad/service.py index 42367f1..644d1ec 100644 --- a/modules/cms/ad/service.py +++ b/modules/cms/ad/service.py @@ -150,7 +150,7 @@ def update_ad(request, data: AdForm): # 删除广告 def delete_ad(ad_id): - return Ad.batch_delete_r(ad_id) + return ad_repo.batch_delete_r(ad_id) # 设置状态 def update_ad_status(request, data: AdStatusForm): diff --git a/modules/cms/ad_sort/service.py b/modules/cms/ad_sort/service.py index 90c7977..ba0698c 100644 --- a/modules/cms/ad_sort/service.py +++ b/modules/cms/ad_sort/service.py @@ -115,7 +115,7 @@ def update_ad_sort(request, data: AdSortForm): # 删除广告位 def delete_ad_sort(adsort_id): - return AdSort.batch_delete_r(adsort_id) + return adsort_repo.batch_delete_r(adsort_id) # 查询广告位列表 def get_ad_sort_list(): diff --git a/modules/cms/item/service.py b/modules/cms/item/service.py index c32ccb4..cab3263 100644 --- a/modules/cms/item/service.py +++ b/modules/cms/item/service.py @@ -129,7 +129,7 @@ def update_item(request, data: ItemForm): # 删除站点 def delete_item(item_id): - return Item.batch_delete_r(item_id) + return item_repo.batch_delete_r(item_id) # 获取站点列表 def get_item_list(): diff --git a/modules/cms/item_cate/service.py b/modules/cms/item_cate/service.py index 21b82e6..fbf199b 100644 --- a/modules/cms/item_cate/service.py +++ b/modules/cms/item_cate/service.py @@ -145,7 +145,7 @@ def update_item_cate(request, data: ItemCateForm): # 删除栏目 def delete_item_cate(cate_id): - return ItemCate.batch_delete_r(cate_id) + return itemcate_repo.batch_delete_r(cate_id) # 获取栏目列表 def get_cate_list(): diff --git a/modules/configuration/service.py b/modules/configuration/service.py index 14021de..c2ee800 100644 --- a/modules/configuration/service.py +++ b/modules/configuration/service.py @@ -104,7 +104,7 @@ def update_config(request, data: ConfigForm): # 删除配置 def delete_config(config_id): - return Config.batch_delete_r(config_id) + return config_repo.batch_delete_r(config_id) # 解析配置项选项字符串为字典 @@ -320,7 +320,7 @@ def update_config_item(request, data: ConfigItemForm): # 删除配置项 def delete_config_item(config_id): - return ConfigItem.batch_delete_r(config_id) + return configitem_repo.batch_delete_r(config_id) # 设置状态 def update_config_item_status(request, data: ConfigItemStatusForm): diff --git a/modules/dictionary/service.py b/modules/dictionary/service.py index 053d76e..86329db 100644 --- a/modules/dictionary/service.py +++ b/modules/dictionary/service.py @@ -99,7 +99,7 @@ def update_dict(request, data: DictForm): # 删除字典 def delete_dict(dict_id): - return Dict.batch_delete_r(dict_id) + return dict_repo.batch_delete_r(dict_id) from datetime import datetime, timezone @@ -205,7 +205,7 @@ def update_dict_item(request, data: DictItemForm): # 删除字典项 def delete_dict_item(dict_id): - return DictItem.batch_delete_r(dict_id) + return dictitem_repo.batch_delete_r(dict_id) # 设置状态 def update_dict_item_status(request, data: DictItemStatusForm): diff --git a/modules/job/service.py b/modules/job/service.py index 5a2ac0d..111c509 100644 --- a/modules/job/service.py +++ b/modules/job/service.py @@ -155,7 +155,7 @@ def delete_job(job_id): id_list = parse_id_list(job_id) for jid in id_list: remove_job_from_scheduler(jid) - return Job.batch_delete_r(job_id) + return job_repo.batch_delete_r(job_id) # 设置任务状态 diff --git a/modules/link/service.py b/modules/link/service.py index 8ea1440..551c71b 100644 --- a/modules/link/service.py +++ b/modules/link/service.py @@ -135,7 +135,7 @@ def update_link(request, data: LinkForm): # 删除友链 def delete_link(link_id): - return Link.batch_delete_r(link_id) + return link_repo.batch_delete_r(link_id) # 设置状态 def update_link_status(request, data: LinkStatusForm): diff --git a/modules/member/service.py b/modules/member/service.py index fd7e2bd..af5d4e4 100644 --- a/modules/member/service.py +++ b/modules/member/service.py @@ -200,7 +200,7 @@ def update_member(request, data: MemberForm): # 删除会员 def delete_member(member_id): - return Member.batch_delete_r(member_id) + return member_repo.batch_delete_r(member_id) # 设置状态 def update_member_status(request, data: MemberStatusForm): @@ -323,7 +323,7 @@ def update_member_level(request, data: MemberLevelForm): # 删除会员等级 def delete_member_level(member_level_id): - return MemberLevel.batch_delete_r(member_level_id) + return memberlevel_repo.batch_delete_r(member_level_id) # 获取会员等级列表 def get_member_level_list(): diff --git a/modules/notice/service.py b/modules/notice/service.py index 886bd13..8692f77 100644 --- a/modules/notice/service.py +++ b/modules/notice/service.py @@ -126,4 +126,4 @@ def update_notice(request, data: NoticeForm): # 删除通知公告 def delete_notice(notice_id): - return Notice.batch_delete_r(notice_id) + return notice_repo.batch_delete_r(notice_id) diff --git a/modules/region/service.py b/modules/region/service.py index aec1582..a47a0b7 100644 --- a/modules/region/service.py +++ b/modules/region/service.py @@ -130,7 +130,7 @@ def update_city(request, data: CityForm): # 删除城市 def delete_city(city_id): - return City.batch_delete_r(city_id) + return city_repo.batch_delete_r(city_id) # 根据城市ID获取子级城市 def get_child_list(city_code): diff --git a/modules/system/dept/service.py b/modules/system/dept/service.py index b115b5e..3b39499 100644 --- a/modules/system/dept/service.py +++ b/modules/system/dept/service.py @@ -85,7 +85,7 @@ def update_dept(request, data: DeptForm): # 删除部门 def delete_dept(dept_id): - return Dept.batch_delete_r(dept_id) + return dept_repo.batch_delete_r(dept_id) # 获取部门列表 def get_dept_list(): diff --git a/modules/system/level/service.py b/modules/system/level/service.py index 3465a08..bf57f4b 100644 --- a/modules/system/level/service.py +++ b/modules/system/level/service.py @@ -152,7 +152,7 @@ def update_level(request, data: LevelForm): # 删除职级 def delete_level(level_id): - return Level.batch_delete_r(level_id) + return level_repo.batch_delete_r(level_id) # 设置状态 def update_level_status(request, data: LevelStatusForm): diff --git a/modules/system/position/service.py b/modules/system/position/service.py index 02bccff..8880c80 100644 --- a/modules/system/position/service.py +++ b/modules/system/position/service.py @@ -101,7 +101,7 @@ def update_position(request, data: PositionForm): # 删除岗位 def delete_position(position_id): - return Position.batch_delete_r(position_id) + return position_repo.batch_delete_r(position_id) # 设置状态 def update_position_status(request, data: PositionStatusForm): diff --git a/modules/system/user/service.py b/modules/system/user/service.py index 6102391..4242714 100644 --- a/modules/system/user/service.py +++ b/modules/system/user/service.py @@ -273,7 +273,7 @@ async def add_user_role(user_id, roleIdList): # 删除用户 def delete_user(user_id): - return User.batch_delete_r(user_id) + return user_repo.batch_delete_r(user_id) # 设置状态 def update_user_status(request, data: UserStatusForm): diff --git a/shared/base_model.py b/shared/base_model.py index e3a5539..ef9b165 100644 --- a/shared/base_model.py +++ b/shared/base_model.py @@ -6,20 +6,15 @@ # +====================================================================== # 由 apps/models/base_model.py 迁移而来。 -"""数据库模型基类:通用字段、序列化与通用查询方法。""" +"""数据库模型基类:通用字段与序列化方法(数据访问统一走 Repository)。""" -import logging from datetime import date, datetime, timezone -from typing import Optional, List, Dict, Any +from typing import Dict, Any -from sqlalchemy import Column, Integer, DATETIME, and_ +from sqlalchemy import Column, Integer, DATETIME -from core import R -from core.database import Base, get_db_session +from core.database import Base from shared.constants import SERIALIZE_EXCLUDE_FIELDS -from utils.request import parse_id_list - -logger = logging.getLogger(__name__) _UTC_NOW = lambda: datetime.now(tz=timezone.utc) @@ -76,74 +71,3 @@ class base_model(Base): value = value.strftime('%Y-%m-%d') result[column.name] = value return result - - # ============================================================ - # 通用查询方法 - # ============================================================ - - @classmethod - def get_by_id(cls, id: Optional[int]) -> Optional['base_model']: - """根据ID获取未删除的记录,不存在返回 None""" - if id is None or id <= 0: - return None - db = get_db_session() - return db.query(cls).filter(cls.id == id, cls.is_delete == 0).first() - - @classmethod - def get_by_ids(cls, ids: List[int]) -> List['base_model']: - """根据ID列表批量获取未删除的记录""" - if not ids: - return [] - valid_ids = [i for i in ids if i and i > 0] - if not valid_ids: - return [] - db = get_db_session() - return db.query(cls).filter(cls.id.in_(valid_ids), cls.is_delete == 0).all() - - @classmethod - def get_all_active(cls) -> List['base_model']: - """获取所有未删除的记录""" - db = get_db_session() - return db.query(cls).filter(cls.is_delete == 0).all() - - @classmethod - def exists(cls, id: Optional[int]) -> bool: - """检查未删除记录是否存在""" - if id is None or id <= 0: - return False - db = get_db_session() - return db.query(cls).filter(cls.id == id, cls.is_delete == 0).count() > 0 - - # ============================================================ - # 删除方法 - # ============================================================ - - @classmethod - def batch_delete_r(cls, ids_str: Optional[str]): - """ - 批量软删除并返回R对象 - - 封装ID校验、解析、软删除的完整流程。 - - Args: - ids_str: 逗号分隔的ID字符串,如 "1,2,3" - - Returns: - R: 操作结果 - """ - if not ids_str: - return R.failed("记录ID不存在") - - id_list = parse_id_list(ids_str) - if not id_list: - return R.failed("记录ID不存在") - - db = get_db_session() - records = db.query(cls).filter(and_(cls.id.in_(id_list), cls.is_delete == 0)).all() - if len(records) != len(id_list): - return R.failed("记录不存在") - - for record in records: - record.is_delete = 1 - - return R.ok(msg="本次共删除{0}条数据".format(len(records))) diff --git a/shared/base_repository.py b/shared/base_repository.py index a29608e..67e0f67 100644 --- a/shared/base_repository.py +++ b/shared/base_repository.py @@ -8,11 +8,11 @@ """通用 Repository 基类:封装各模型的数据访问层公共操作。 各模块 repository.py 继承本类并提供自定义查询,service 通过 repository 访问数据库。 -过渡期与 base_model 的 classmethod 双轨并存,全部模块迁移完成后收敛。 """ from typing import Generic, Optional, TypeVar +from core import R from core.database import get_db_session from shared.constants import PAGE_SIZE from utils.request import parse_id_list @@ -132,6 +132,29 @@ class BaseRepository(Generic[M]): setattr(record, self.soft_delete_col, 1) return True + def batch_delete_r(self, ids_str) -> R: + """ + 批量软删除并返回 R 对象(等价原 base_model.batch_delete_r)。 + + Args: + ids_str: 逗号分隔的ID字符串,如 "1,2,3" + + Returns: + R: 操作结果(成功 code=0,失败 code=1) + """ + if not ids_str: + return R.failed("记录ID不存在") + id_list = parse_id_list(ids_str) + if not id_list: + return R.failed("记录ID不存在") + records = self.db.query(self.model).filter( + self.model.id.in_(id_list), self._soft_col() == 0).all() + if len(records) != len(id_list): + return R.failed("记录不存在") + for record in records: + setattr(record, self.soft_delete_col, 1) + return R.ok(msg="本次共删除{0}条数据".format(len(records))) + def hard_delete(self, obj) -> bool: """物理删除实例。""" self.db.delete(obj)