发布v2.0.0分支

This commit is contained in:
zhangtao
2025-07-13 19:31:23 +08:00
parent 4150a39713
commit 6a8ca3becc
342 changed files with 39441 additions and 14737 deletions
+3 -3
View File
@@ -51,14 +51,14 @@ class DeptCRUD(CRUDBase[DeptModel, DeptCreateSchema, DeptUpdateSchema]):
obj.parent_name = parent_map.get(obj.parent_id)
return obj_list
async def set_available_crud(self, ids: List[int], available: bool) -> None:
async def set_available_crud(self, ids: List[int], status: bool) -> None:
"""
批量设置部门可用状态
:param ids: 部门ID列表
:param available: 可用状态
:param status: 可用状态
"""
await self.set(ids=ids, available=available)
await self.set(ids=ids, status=status)
async def get_name_crud(self, id: int) -> Optional[str]:
"""
+4 -4
View File
@@ -36,9 +36,9 @@ class DictTypeCRUD(CRUDBase[DictTypeModel, DictTypeCreateSchema, DictTypeUpdateS
"""删除数据字典类型"""
return await self.delete(ids=ids)
async def set_obj_available_crud(self, ids: List[int], available: bool) -> None:
async def set_obj_available_crud(self, ids: List[int], status: bool) -> None:
"""设置数据字典类型的可用状态"""
return await self.set(ids=ids, available=available)
return await self.set(ids=ids, status=status)
class DictDataCRUD(CRUDBase[DictDataModel, DictDataCreateSchema, DictDataUpdateSchema]):
@@ -69,6 +69,6 @@ class DictDataCRUD(CRUDBase[DictDataModel, DictDataCreateSchema, DictDataUpdateS
"""删除数据字典数据"""
return await self.delete(ids=ids)
async def set_obj_available_crud(self, ids: List[int], available: bool) -> None:
async def set_obj_available_crud(self, ids: List[int], status: bool) -> None:
"""设置数据字典数据的可用状态"""
return await self.set(ids=ids, available=available)
return await self.set(ids=ids, status=status)
+3 -3
View File
@@ -51,11 +51,11 @@ class MenuCRUD(CRUDBase[MenuModel, MenuCreateSchema, MenuUpdateSchema]):
obj.parent_name = parent_map.get(obj.parent_id)
return obj_list
async def set_available_crud(self, ids: List[int], available: bool) -> None:
async def set_available_crud(self, ids: List[int], status: bool) -> None:
"""
批量设置菜单可用状态
:param ids: 菜单ID列表
:param available: 可用状态
:param status: 可用状态
"""
await self.set(ids=ids, available=available)
await self.set(ids=ids, status=status)
@@ -36,6 +36,6 @@ class NoticeCRUD(CRUDBase[NoticeModel, NoticeCreateSchema, NoticeUpdateSchema]):
"""删除公告"""
return await self.delete(ids=ids)
async def set_available_crud(self, ids: List[int], available: bool) -> None:
async def set_available_crud(self, ids: List[int], status: bool) -> None:
"""设置公告的可用状态"""
return await self.set(ids=ids, available=available)
return await self.set(ids=ids, status=status)
@@ -35,14 +35,14 @@ class PositionCRUD(CRUDBase[PositionModel, PositionCreateSchema, PositionUpdateS
"""
return await self.list(search=search, order_by=order_by)
async def set_available_crud(self, ids: List[int], available: bool) -> None:
async def set_available_crud(self, ids: List[int], status: bool) -> None:
"""
批量设置岗位可用状态
:param ids: 岗位ID列表
:param available: 可用状态
:param status: 可用状态
"""
await self.set(ids=ids, available=available)
await self.set(ids=ids, status=status)
async def get_name_crud(self, ids: List[int]) -> Optional[str]:
"""
+2 -2
View File
@@ -49,6 +49,6 @@ class RoleCRUD(CRUDBase[RoleModel, RoleCreateSchema, RoleUpdateSchema]):
related_objs=depts
)
async def set_available_crud(self, ids: List[int], available: bool) -> None:
async def set_available_crud(self, ids: List[int], status: bool) -> None:
"""设置角色的可用状态"""
await self.set(ids=ids, available=available)
await self.set(ids=ids, status=status)
+3 -3
View File
@@ -84,15 +84,15 @@ class UserCRUD(CRUDBase[UserModel, UserCreateSchema, UserUpdateSchema]):
"""
return await self.update(id=id, data={"last_login": datetime.now()})
async def set_available_crud(self, ids: List[int], available: bool) -> None:
async def set_available_crud(self, ids: List[int], status: bool) -> None:
"""
批量设置用户可用状态
Args:
ids: 用户ID列表
available: 可用状态
status: 可用状态
"""
await self.set(ids=ids, available=available)
await self.set(ids=ids, status=status)
async def set_user_roles_crud(self, user_ids: List[int], role_ids: List[int]) -> None:
"""
@@ -34,7 +34,7 @@ class DeptModel(ModelBase):
)
# 状态字段
available = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
status = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
# 审计字段
description = Column(Text, nullable=True, comment="备注说明")
@@ -18,7 +18,7 @@ class DictTypeModel(ModelBase):
id = Column(Integer, primary_key=True, autoincrement=True, comment='字典主键')
dict_name = Column(String(100), nullable=True, unique=True, default='', comment='字典名称')
dict_type = Column(String(100), nullable=True, unique=True, default='', comment='字典类型')
available = Column(Boolean, nullable=True, default='0', comment='状态(0正常 1停用)')
status = Column(Boolean, nullable=True, default='0', comment='状态(0正常 1停用)')
# 审计字段
description = Column(Text, nullable=True, comment="备注说明")
@@ -56,7 +56,7 @@ class DictDataModel(ModelBase):
css_class = Column(String(100), nullable=True, default=None, comment='样式属性(其他样式扩展)')
list_class = Column(String(100), nullable=True, default=None, comment='表格回显样式')
is_default = Column(Boolean, nullable=True, default='N', comment='是否默认(Y是 N否)')
available = Column(Boolean, nullable=True, default='0', comment='状态(0正常 1停用)')
status = Column(Boolean, nullable=True, default='0', comment='状态(0正常 1停用)')
# 审计字段
description = Column(Text, nullable=True, comment="备注说明")
@@ -26,7 +26,7 @@ class MenuModel(ModelBase):
# 权限相关
permission = Column(String(100), nullable=True, comment="权限标识(如:system:user:list)")
available = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
status = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
# 前端路由相关
icon = Column(String(50), nullable=True, comment="菜单图标")
@@ -38,7 +38,8 @@ class MenuModel(ModelBase):
keep_alive = Column(Boolean, default=True, nullable=False, comment="是否缓存(True:是 False:否)")
always_show = Column(Boolean, default=False, nullable=False, comment="是否始终显示(True:是 False:否)")
title = Column(String(50), nullable=True, comment="菜单标题")
parmas = Column(String(200), nullable=True, comment="路由参数")
params = Column(String(200), nullable=True, comment="路由参数")
affix = Column(Boolean, default=False, nullable=False, comment="是否固定标签页(True:是 False:否)")
# 层级关系
parent_id = Column(
@@ -22,7 +22,7 @@ class NoticeModel(ModelBase):
notice_content = Column(Text, comment='公告内容')
# 状态字段
available = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
status = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
# 审计字段
description = Column(Text, nullable=True, comment="备注说明")
@@ -21,7 +21,7 @@ class PositionModel(ModelBase):
order = Column(Integer, nullable=False, default=1, comment="显示排序")
# 状态字段
available = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
status = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
users = relationship(
"UserModel",
@@ -76,7 +76,7 @@ class RoleModel(ModelBase):
# 权限相关
data_scope = Column(Integer, nullable=False, default=1, comment="数据权限范围")
available = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
status = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
# 关联关系
menus = relationship(
@@ -74,7 +74,7 @@ class UserModel(ModelBase):
avatar = Column(String(255), nullable=True, comment="头像地址")
# 账号状态
available = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
status = Column(Boolean, default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
is_superuser = Column(Boolean, default=False, nullable=False, comment="是否为超级管理员")
last_login = Column(DateTime, nullable=True, comment="最后登录时间")
@@ -3,6 +3,7 @@
from typing import Optional
from fastapi import Query
from app.core.validator import DateTimeStr
class ConfigQueryParams:
"""配置管理查询参数"""
@@ -12,6 +13,8 @@ class ConfigQueryParams:
config_name: Optional[str] = Query(None, description="配置名称"),
config_key: Optional[str] = Query(None, description="配置键名"),
config_type: Optional[bool] = Query(None, description="系统内置((True:是 False:否))"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2023-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2023-12-31 23:59:59"),
) -> None:
super().__init__()
@@ -22,4 +25,10 @@ class ConfigQueryParams:
# 精确查询字段
self.config_type = config_type
# 时间范围查询
if start_time and end_time:
start_datetime = datetime.strptime(str(start_time), '%Y-%m-%d %H:%M:%S')
end_datetime = datetime.strptime(str(end_time), '%Y-%m-%d %H:%M:%S')
self.created_at = ("between", (start_datetime, end_datetime))
+12 -2
View File
@@ -3,6 +3,7 @@
from typing import Optional
from fastapi import Query
from app.core.validator import DateTimeStr
class DeptQueryParams:
"""部门管理查询参数"""
@@ -10,7 +11,9 @@ class DeptQueryParams:
def __init__(
self,
name: Optional[str] = Query(None, description="部门名称"),
available: Optional[bool] = Query(None, description="部门状态(True正常 False停用)"),
status: Optional[bool] = Query(None, description="部门状态(True正常 False停用)"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2023-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2023-12-31 23:59:59"),
) -> None:
super().__init__()
@@ -19,5 +22,12 @@ class DeptQueryParams:
self.name = ("like", name)
# 精确查询字段
self.available = available
self.status = status
# 时间范围查询
if start_time and end_time:
start_datetime = datetime.strptime(str(start_time), '%Y-%m-%d %H:%M:%S')
end_datetime = datetime.strptime(str(end_time), '%Y-%m-%d %H:%M:%S')
self.created_at = ("between", (start_datetime, end_datetime))
@@ -14,7 +14,7 @@ class DictTypeQueryParams:
self,
dict_name: Optional[str] = Query(None, description="字典名称"),
dict_type: Optional[str] = Query(None, description="字典类型"),
available: Optional[bool] = Query(None, description="状态(0正常 1停用)"),
status: Optional[bool] = Query(None, description="状态(0正常 1停用)"),
creator: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2023-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2023-12-31 23:59:59"),
@@ -27,7 +27,7 @@ class DictTypeQueryParams:
# 精确查询字段
self.creator_id = creator
self.dict_type = dict_type
self.available = available
self.status = status
# 时间范围查询
if start_time and end_time:
@@ -43,7 +43,7 @@ class DictDataQueryParams:
self,
dict_label: Optional[str] = Query(None, description="字典标签"),
dict_type: Optional[str] = Query(None, description="字典类型"),
available: Optional[bool] = Query(None, description="状态(0正常 1停用)"),
status: Optional[bool] = Query(None, description="状态(0正常 1停用)"),
creator: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2023-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2023-12-31 23:59:59"),
@@ -56,7 +56,7 @@ class DictDataQueryParams:
# 精确查询字段
self.creator_id = creator
self.dict_type = dict_type
self.available = available
self.status = status
# 时间范围查询
if start_time and end_time:
+12 -2
View File
@@ -3,6 +3,7 @@
from typing import Optional, Literal
from fastapi import Query
from app.core.validator import DateTimeStr
class MenuQueryParams:
"""菜单管理查询参数"""
@@ -14,7 +15,9 @@ class MenuQueryParams:
component_path: Optional[str] = Query(None, description="组件路径"),
type: Optional[Literal['M', 'C', 'F']] = Query(None, description="菜单类型(M目录 C菜单 F按钮)"),
permission: Optional[str] = Query(None, description="权限标识"),
available: Optional[bool] = Query(None, description="菜单状态(True正常 False停用)"),
status: Optional[bool] = Query(None, description="菜单状态(True正常 False停用)"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2023-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2023-12-31 23:59:59"),
) -> None:
super().__init__()
@@ -26,4 +29,11 @@ class MenuQueryParams:
# 精确查询字段
self.type = type
self.available = available
self.status = status
# 时间范围查询
if start_time and end_time:
start_datetime = datetime.strptime(str(start_time), '%Y-%m-%d %H:%M:%S')
end_datetime = datetime.strptime(str(end_time), '%Y-%m-%d %H:%M:%S')
self.created_at = ("between", (start_datetime, end_datetime))
@@ -3,14 +3,19 @@
from typing import Optional
from fastapi import Query
from app.core.validator import DateTimeStr
class NoticeQueryParams:
"""公告通知查询参数"""
def __init__(
self,
notice_title: Optional[str] = Query(None, description="公告标题"),
available: Optional[bool] = Query(None, description="是否可用"),
notice_type: Optional[str] = Query(None, description="公告类型"),
status: Optional[bool] = Query(None, description="是否可用"),
creator: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2023-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2023-12-31 23:59:59"),
) -> None:
super().__init__()
@@ -19,5 +24,12 @@ class NoticeQueryParams:
# 精确查询字段
self.creator_id = creator
self.available = available
self.status = status
# 时间范围查询
if start_time and end_time:
start_datetime = datetime.strptime(str(start_time), '%Y-%m-%d %H:%M:%S')
end_datetime = datetime.strptime(str(end_time), '%Y-%m-%d %H:%M:%S')
self.created_at = ("between", (start_datetime, end_datetime))
@@ -4,13 +4,15 @@ from datetime import datetime
from typing import Optional
from fastapi import Query
from app.core.validator import DateTimeStr
class PositionQueryParams:
"""岗位管理查询参数"""
def __init__(
self,
name: Optional[str] = Query(None, description="岗位名称"),
available: Optional[bool] = Query(None, description="是否可用"),
status: Optional[bool] = Query(None, description="是否可用"),
creator: Optional[int] = Query(None, description="创建人"),
start_time: Optional[str] = Query(None, description="开始时间", example="2023-01-01 00:00:00"),
end_time: Optional[str] = Query(None, description="结束时间", example="2023-12-31 23:59:59"),
@@ -22,7 +24,7 @@ class PositionQueryParams:
# 精确查询字段
self.creator_id = creator
self.available = available
self.status = status
# 时间范围查询
if start_time and end_time:
@@ -4,6 +4,7 @@ from datetime import datetime
from typing import Optional
from fastapi import Query
from app.core.validator import DateTimeStr
class RoleQueryParams:
"""角色管理查询参数"""
@@ -11,7 +12,7 @@ class RoleQueryParams:
def __init__(
self,
name: Optional[str] = Query(None, description="角色名称"),
available: Optional[bool] = Query(None, description="是否可用"),
status: Optional[bool] = Query(None, description="是否可用"),
creator: Optional[int] = Query(None, description="创建人"),
start_time: Optional[str] = Query(None, description="开始时间", example="2023-01-01 00:00:00"),
end_time: Optional[str] = Query(None, description="结束时间", example="2023-12-31 23:59:59"),
@@ -23,7 +24,7 @@ class RoleQueryParams:
# 精确查询字段
self.creator_id = creator
self.available = available
self.status = status
# 时间范围查询
if start_time and end_time:
@@ -4,7 +4,7 @@ from datetime import datetime
from typing import Optional
from fastapi import Query
from app.core.validator import DateTimeStr
class UserQueryParams:
"""用户管理查询参数"""
@@ -16,7 +16,7 @@ class UserQueryParams:
mobile: Optional[str] = Query(None, description="手机号", pattern=r'^1[3-9]\d{9}$'),
email: Optional[str] = Query(None, description="邮箱", pattern=r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'),
dept_id: Optional[int] = Query(None, description="部门ID"),
available: Optional[bool] = Query(None, description="是否可用"),
status: Optional[bool] = Query(None, description="是否可用"),
start_time: Optional[str] = Query(None, description="开始时间"),
end_time: Optional[str] = Query(None, description="结束时间"),
creator: Optional[int] = Query(None, description="创建人"),
@@ -32,7 +32,7 @@ class UserQueryParams:
# 精确查询字段
self.dept_id = dept_id
self.creator_id = creator
self.available = available
self.status = status
# 时间范围查询
if start_time and end_time:
@@ -11,7 +11,7 @@ class DeptCreateSchema(BaseModel):
"""部门创建模型"""
name: str = Field(..., max_length=40, description="部门名称")
order: int = Field(default=1, ge=0, description="显示顺序")
available: bool = Field(default=True, description="是否启用(True:启用 False:禁用)")
status: bool = Field(default=True, description="是否启用(True:启用 False:禁用)")
parent_id: Optional[int] = Field(default=None, ge=0, description="父部门ID")
description: Optional[str] = Field(default=None, max_length=500, description="备注说明")
@@ -12,7 +12,7 @@ class DictTypeCreateSchema(BaseModel):
dict_name: Optional[str] = Field(default=None, description='字典名称')
dict_type: Optional[str] = Field(default=None, description='字典类型')
available: Optional[bool] = Field(default=None, description='状态(0正常 1停用)')
status: Optional[bool] = Field(default=None, description='状态(0正常 1停用)')
description: Optional[str] = Field(None, max_length=255, description="描述")
@NotBlank(field_name='dict_name', message='字典名称不能为空')
@@ -58,7 +58,7 @@ class DictDataCreateSchema(BaseModel):
css_class: Optional[str] = Field(default=None, description='样式属性(其他样式扩展)')
list_class: Optional[str] = Field(default=None, description='表格回显样式')
is_default: Optional[bool] = Field(default=None, description='是否默认(Y是 N否)')
available: Optional[bool] = Field(default=None, description='状态(0正常 1停用)')
status: Optional[bool] = Field(default=None, description='状态(0正常 1停用)')
description: Optional[str] = Field(default=None, max_length=255, description="描述")
@NotBlank(field_name='dict_label', message='字典标签不能为空')
@@ -18,12 +18,13 @@ class MenuCreateSchema(BaseModel):
route_path: Optional[str] = Field(default=None, max_length=200, description="路由地址")
component_path: Optional[str] = Field(default=None, max_length=255, description="组件路径")
redirect: Optional[str] = Field(default=None, max_length=200, description="重定向地址")
available: bool = Field(default=True, description="是否启用(True:启用 False:禁用)")
status: bool = Field(default=True, description="是否启用(True:启用 False:禁用)")
keep_alive: bool = Field(default=True, description="是否缓存(True:是 False:否)")
hidden: bool = Field(default=False, description="是否隐藏(True:是 False:否)")
always_show: bool = Field(default=False, description="是否始终显示(True:是 False:否)")
title: Optional[str] = Field(default=None, max_length=50, description="菜单标题")
parmas: Optional[str] = Field(default=None, max_length=200, description="路由参数")
params: Optional[str] = Field(default=None, max_length=200, description="路由参数")
affix: bool = Field(default=False, description="是否固定标签页(True:是 False:否)")
parent_id: Optional[int] = Field(default=None, ge=0, description="父菜单ID")
description: Optional[str] = Field(default=None, max_length=500, description="备注说明")
@@ -11,7 +11,7 @@ class NoticeCreateSchema(BaseModel):
notice_title: str = Field(..., max_length=50, description='公告标题')
notice_type: str = Field(..., description='公告类型(1通知 2公告)')
notice_content: str = Field(..., description='公告内容')
available: bool = Field(True, description="是否启用(True:启用 False:禁用)")
status: bool = Field(True, description="是否启用(True:启用 False:禁用)")
description: Optional[str] = Field(None, max_length=255, description="公告描述")
@@ -10,7 +10,7 @@ class PositionCreateSchema(BaseModel):
"""岗位创建模型"""
name: str = Field(..., max_length=40, description="岗位名称")
order: Optional[int] = Field(default=1, ge=1, description='显示排序')
available: bool = Field(default=True, description="是否启用(True:启用 False:禁用)")
status: bool = Field(default=True, description="是否启用(True:启用 False:禁用)")
description: Optional[str] = Field(None, description="备注说明")
@@ -14,7 +14,7 @@ class RoleCreateSchema(BaseModel):
name: str = Field(default=None, max_length=15, description="角色名称")
order: Optional[int] = Field(default=1, ge=1, description='显示排序')
data_scope: Optional[int] = Field(default=1, ge=1, le=5, description='数据权限范围')
available: bool = Field(default=True, description="是否启用")
status: bool = Field(default=True, description="是否启用")
description: Optional[str] = Field(None, max_length=255, description="角色描述")
@@ -59,7 +59,7 @@ class UserCreateSchema(CurrentUserUpdateSchema):
username: str = Field(default=None, max_length=15, description="用户名")
password: Optional[str] = Field(default=None, max_length=128, description="密码哈希值")
available: bool = Field(default=True, description="是否可用")
status: bool = Field(default=True, description="是否可用")
is_superuser: bool = Field(default=False, description="是否超管")
description: Optional[str] = Field(None, max_length=255, description="备注")
@@ -76,7 +76,7 @@ class LoginService:
if not PwdUtil.verify_password(plain_password=login_form.password, password_hash=user.password):
raise CustomException(msg="账号或密码错误")
if not user.available:
if not user.status:
raise CustomException(msg="用户已被停用")
# 更新最后登录时间
@@ -85,10 +85,10 @@ class DeptService:
if exist_dept and exist_dept.id != data.id:
raise CustomException(msg='更新失败,部门名称重复')
dept = await DeptCRUD(auth).update(id=data.id, data=data)
if data.available:
await cls.batch_set_available_service(auth=auth, data=BatchSetAvailable(ids=[data.id], available=True))
if data.status:
await cls.batch_set_available_service(auth=auth, data=BatchSetAvailable(ids=[data.id], status=True))
else:
await cls.batch_set_available_service(auth=auth, data=BatchSetAvailable(ids=[data.id], available=False))
await cls.batch_set_available_service(auth=auth, data=BatchSetAvailable(ids=[data.id], status=False))
return DeptOutSchema.model_validate(dept).model_dump()
@classmethod
@@ -115,7 +115,7 @@ class DeptService:
dept_list = await DeptCRUD(auth).get_list_crud()
total_ids = []
if data.available:
if data.status:
id_map = get_parent_id_map(model_list=dept_list)
for dept_id in data.ids:
enable_ids = get_parent_recursion(id=dept_id, id_map=id_map)
@@ -126,4 +126,4 @@ class DeptService:
disable_ids = get_child_recursion(id=dept_id, id_map=id_map)
total_ids.extend(disable_ids)
await DeptCRUD(auth).set_available_crud(ids=total_ids, available=data.available)
await DeptCRUD(auth).set_available_crud(ids=total_ids, status=data.status)
@@ -71,7 +71,7 @@ class DictTypeService:
dict_data_list = []
# 如果字典类型修改或状态变更,则修改对应字典数据的类型和状态,并更新Redis缓存
if exist_obj.dict_type != data.dict_type or exist_obj.available != data.available:
if exist_obj.dict_type != data.dict_type or exist_obj.status != data.status:
# 检查字典数据类型是否被修改
exist_obj_type_list = await DictDataCRUD(auth).list(search={'dict_type': exist_obj.dict_type})
if exist_obj_type_list:
@@ -86,7 +86,7 @@ class DictTypeService:
css_class=item.css_class,
list_class=item.list_class,
is_default=item.is_default,
available=data.available,
status=data.status,
description=item.description
)
obj = await DictDataCRUD(auth).update_obj_crud(id=item.id, data=dict_data)
@@ -141,7 +141,7 @@ class DictTypeService:
'id': '编号',
'dict_name': '字典名称',
'dict_type': '字典类型',
'available': '状态',
'status': '状态',
'description': '备注',
'created_at': '创建时间',
'updated_at': '更新时间',
@@ -153,7 +153,7 @@ class DictTypeService:
data = data_list.copy()
for item in data:
# 处理状态
item['available'] = '正常' if item.get('available') else '停用'
item['status'] = '正常' if item.get('status') else '停用'
return ExcelUtil.export_list2excel(list_data=data_list, mapping_dict=mapping_dict)
@@ -250,14 +250,14 @@ class DictDataService:
raise CustomException(msg='更新失败,数据字典数据重复')
# 如果状态变更,需要同步更新字典类型状态并刷新缓存
if exist_obj.available != data.available:
if exist_obj.status != data.status:
dict_type = await DictTypeCRUD(auth).get(dict_type=exist_obj.dict_type)
if dict_type:
update_data = DictTypeUpdateSchema(
id=dict_type.id,
dict_name=dict_type.dict_name,
dict_type=dict_type.dict_type,
available=data.available,
status=data.status,
description=dict_type.description
)
await DictTypeCRUD(auth).update_obj_crud(id=dict_type.id, data=update_data)
@@ -321,7 +321,7 @@ class DictDataService:
'css_class': '样式属性',
'list_class': '表格回显样式',
'is_default': '是否默认',
'available': '状态',
'status': '状态',
'description': '备注',
'created_at': '创建时间',
'updated_at': '更新时间',
@@ -333,7 +333,7 @@ class DictDataService:
data = data_list.copy()
for item in data:
# 处理状态
item['available'] = '正常' if item.get('available') else '停用'
item['status'] = '正常' if item.get('status') else '停用'
# 处理是否默认
item['is_default'] = '' if item.get('is_default') else ''
@@ -86,7 +86,7 @@ class MenuService:
data.parent_name = parent_menu.name
new_menu = await MenuCRUD(auth).update(id=data.id, data=data)
await cls.set_menu_available_service(auth=auth, data=BatchSetAvailable(ids=[data.id], available=data.available))
await cls.set_menu_available_service(auth=auth, data=BatchSetAvailable(ids=[data.id], status=data.status))
new_menu_dict = MenuOutSchema.model_validate(new_menu).model_dump()
return new_menu_dict
@@ -106,7 +106,7 @@ class MenuService:
menu_list = await MenuCRUD(auth).get_list_crud()
total_ids = []
if data.available:
if data.status:
# 激活,则需要把所有父级菜单都激活
id_map = get_parent_id_map(model_list=menu_list)
for menu_id in data.ids:
@@ -119,4 +119,4 @@ class MenuService:
disable_ids = get_child_recursion(id=menu_id, id_map=id_map)
total_ids.extend(disable_ids)
await MenuCRUD(auth).set_available_crud(ids=total_ids, available=data.available)
await MenuCRUD(auth).set_available_crud(ids=total_ids, status=data.status)
@@ -23,7 +23,7 @@ class NoticeService:
@classmethod
async def get_notice_list_available_service(cls, auth: AuthSchema) -> List[Dict]:
config_obj_list = await NoticeCRUD(auth).get_list_crud(search={'available': True})
config_obj_list = await NoticeCRUD(auth).get_list_crud(search={'status': True})
return [NoticeOutSchema.model_validate(config_obj).model_dump() for config_obj in config_obj_list]
@classmethod
@@ -61,7 +61,7 @@ class NoticeService:
@classmethod
async def set_notice_available_service(cls, auth: AuthSchema, data: BatchSetAvailable) -> None:
await NoticeCRUD(auth).set_available_crud(ids=data.ids, available=data.available)
await NoticeCRUD(auth).set_available_crud(ids=data.ids, status=data.status)
@classmethod
async def export_notice_service(cls, notice_list: List[Dict[str, Any]]) -> bytes:
@@ -71,7 +71,7 @@ class NoticeService:
'notice_title': '公告标题',
'notice_type': '公告类型(1通知 2公告)',
'notice_content': '公告内容',
'available': '状态',
'status': '状态',
'description': '备注',
'created_at': '创建时间',
'updated_at': '更新时间',
@@ -83,7 +83,7 @@ class NoticeService:
data = notice_list.copy()
for item in data:
# 处理状态
item['available'] = '正常' if item.get('available') else '停用'
item['status'] = '正常' if item.get('status') else '停用'
# 处理公告类型
item['notice_type'] = '通知' if item.get('notice_type') == 1 else '公告'
@@ -65,7 +65,7 @@ class PositionService:
@classmethod
async def set_position_available_service(cls, auth: AuthSchema, data: BatchSetAvailable) -> None:
"""设置岗位状态"""
await PositionCRUD(auth).set_available_crud(ids=data.ids, available=data.available)
await PositionCRUD(auth).set_available_crud(ids=data.ids, status=data.status)
@classmethod
async def export_post_list_service(cls, post_list: List[Dict[str, Any]]) -> bytes:
@@ -74,7 +74,7 @@ class PositionService:
'id': '编号',
'name': '岗位名称',
'order': '显示顺序',
'available': '状态',
'status': '状态',
'description': '备注',
'created_at': '创建时间',
'updated_at': '更新时间',
@@ -85,6 +85,6 @@ class PositionService:
# 复制数据并转换状态
data = post_list.copy()
for item in data:
item['available'] = '正常' if item.get('available') else '停用'
item['status'] = '正常' if item.get('status') else '停用'
return ExcelUtil.export_list2excel(list_data=post_list, mapping_dict=mapping_dict)
@@ -82,7 +82,7 @@ class RoleService:
@classmethod
async def set_role_available_service(cls, auth: AuthSchema, data: BatchSetAvailable) -> None:
"""设置角色可用状态"""
await RoleCRUD(auth).set_available_crud(ids=data.ids, available=data.available)
await RoleCRUD(auth).set_available_crud(ids=data.ids, status=data.status)
@classmethod
async def export_role_list_service(cls, role_list: List[Dict[str, Any]]) -> bytes:
@@ -93,7 +93,7 @@ class RoleService:
'name': '角色名称',
'order': '显示顺序',
'data_scope': '数据权限',
'available': '状态',
'status': '状态',
'description': '备注',
'created_at': '创建时间',
'updated_at': '更新时间',
@@ -113,7 +113,7 @@ class RoleService:
# 处理数据
data = role_list.copy()
for item in data:
item['available'] = '正常' if item.get('available') else '停用'
item['status'] = '正常' if item.get('status') else '停用'
item['data_scope'] = data_scope_map.get(item.get('data_scope'))
return ExcelUtil.export_list2excel(list_data=role_list, mapping_dict=mapping_dict)
@@ -109,7 +109,7 @@ class UserService:
dept = await DeptCRUD(auth).get_by_id_crud(id=data.dept_id)
if not dept:
raise CustomException(msg='部门不存在')
if not dept.available:
if not dept.status:
raise CustomException(msg='部门已被禁用')
# 更新密码
@@ -126,7 +126,7 @@ class UserService:
roles = await RoleCRUD(auth).get_list_crud(search={"id": ("in", data.role_ids)})
if len(roles) != len(data.role_ids):
raise CustomException(msg='部分角色不存在')
if not all(role.available for role in roles):
if not all(role.status for role in roles):
raise CustomException(msg='部分角色已被禁用')
await UserCRUD(auth).set_user_roles_crud(user_ids=[data.id], role_ids=data.role_ids)
@@ -135,7 +135,7 @@ class UserService:
positions = await PositionCRUD(auth).list(search={"id": ("in", data.position_ids)})
if len(positions) != len(data.position_ids):
raise CustomException(msg='部分岗位不存在')
if not all(position.available for position in positions):
if not all(position.status for position in positions):
raise CustomException(msg='部分岗位已被禁用')
await UserCRUD(auth).set_user_positions_crud(user_ids=[data.id], position_ids=data.position_ids)
@@ -150,7 +150,7 @@ class UserService:
raise CustomException(msg="用户不存在")
if user.is_superuser:
raise CustomException(msg="超级管理员不能删除")
if user.available:
if user.status:
raise CustomException(msg="用户已启用,不能删除")
if auth.user.id == id:
raise CustomException(msg="不能删除当前登陆用户")
@@ -178,14 +178,14 @@ class UserService:
# 获取菜单权限
if auth.user.is_superuser:
menu_all = await MenuCRUD(auth).get_list_crud(search={'type': ('in', [1, 2]), 'available': True})
menu_all = await MenuCRUD(auth).get_list_crud(search={'type': ('in', [1, 2]), 'status': True})
menus = [MenuOutSchema.model_validate(menu).model_dump() for menu in menu_all]
else:
menus = [
MenuOutSchema.model_validate(menu).model_dump()
for role in auth.user.roles
for menu in role.menus
if menu.available and menu.type in [1, 2]
if menu.status and menu.type in [1, 2]
]
user_dict["menus"] = menus
return user_dict
@@ -208,7 +208,7 @@ class UserService:
raise CustomException(msg=f"用户ID {id} 不存在")
if user.is_superuser:
raise CustomException(msg="超级管理员状态不能修改")
await UserCRUD(auth).set_available_crud(ids=data.ids, available=data.available)
await UserCRUD(auth).set_available_crud(ids=data.ids, status=data.status)
@classmethod
async def upload_avatar_service(cls, base_url: str, file: UploadFile) -> Dict:
@@ -268,7 +268,7 @@ class UserService:
user = await UserCRUD(auth).get_by_username_crud(username=data.username)
if not user:
raise CustomException(msg="用户不存在")
if not user.available:
if not user.status:
raise CustomException(msg="用户已停用")
new_password_hash = PwdUtil.set_password_hash(password=data.new_password)
new_user = await UserCRUD(auth).forget_password_crud(id=user.id, password_hash=new_password_hash)
@@ -285,7 +285,7 @@ class UserService:
'邮箱': 'email',
'手机号': 'mobile',
'性别': 'gender',
'状态': 'available'
'状态': 'status'
}
try:
@@ -333,7 +333,7 @@ class UserService:
# 数据转换
gender = 1 if row['gender'] == '' else (2 if row['gender'] == '' else 1)
available = True if row['available'] == '正常' else False
status = True if row['status'] == '正常' else False
# 构建用户数据
user_data = {
@@ -342,7 +342,7 @@ class UserService:
"email": str(row['email']).strip() if not pd.isna(row['email']) else None,
"mobile": str(row['mobile']).strip() if not pd.isna(row['mobile']) else None,
"gender": gender,
"available": available,
"status": status,
"dept_id": dept_id,
"password": PwdUtil.set_password_hash(password="123456") # 设置默认密码
}
@@ -400,7 +400,7 @@ class UserService:
'email': '邮箱地址',
'mobile': '手机号码',
'gender': '性别',
'available': '状态',
'status': '状态',
'description': '备注',
'created_at': '创建时间',
'updated_at': '更新时间',
@@ -411,7 +411,7 @@ class UserService:
# 复制数据并转换
data = user_list.copy()
for item in data:
item['available'] = '正常' if item.get('available') else '停用'
item['status'] = '正常' if item.get('status') else '停用'
gender = item.get('gender')
item['gender'] = '' if gender == 1 else ('' if gender == 2 else '未知')