feat: 统一状态字段类型为字符串并重构基础类型

refactor: 重构前后端状态字段类型从布尔值改为字符串
feat: 新增基础类型定义和通用类型接口
refactor: 移除不必要的时间范围字段并统一使用created_time
style: 更新前端组件以匹配新的字段命名
docs: 更新接口文档和类型定义
This commit is contained in:
zhangtao
2025-11-27 23:47:23 +08:00
parent 2c9d66e2a7
commit 0c86069efa
73 changed files with 590 additions and 754 deletions
@@ -25,7 +25,7 @@ class JobCreateSchema(BaseModel):
start_date: Optional[str] = Field(default=None, description='开始时间')
end_date: Optional[str] = Field(default=None, description='结束时间')
description: Optional[str] = Field(default=None, max_length=255, description='描述')
status: Optional[bool] = Field(default=False, description='任务状态:启动,停止')
status: Optional[str] = Field(default=False, description='任务状态:启动,停止')
@field_validator('trigger')
@classmethod
@@ -77,7 +77,7 @@ class JobLogCreateSchema(BaseModel):
job_trigger: Optional[str] = Field(default=None, description='任务触发器')
job_message: Optional[str] = Field(default=None, description='日志信息')
exception_info: Optional[str] = Field(default=None, description='异常信息')
status: Optional[bool] = Field(default=False, description='任务状态:正常,失败')
status: Optional[str] = Field(default=False, description='任务状态:正常,失败')
create_time: Optional[DateTimeStr] = Field(default=None, description='创建时间')
@@ -99,10 +99,9 @@ class JobQueryParam:
def __init__(
self,
name: Optional[str] = Query(None, description="任务名称"),
status: Optional[bool] = Query(None, description="状态: 启动,停止"),
status: Optional[str] = Query(None, description="状态: 启动,停止"),
creator: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -113,8 +112,8 @@ class JobQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
class JobLogQueryParam:
@@ -124,9 +123,8 @@ class JobLogQueryParam:
self,
job_id: Optional[int] = Query(None, description="定时任务ID"),
job_name: Optional[str] = Query(None, description="任务名称"),
status: Optional[bool] = Query(None, description="状态: 正常,失败"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
status: Optional[str] = Query(None, description="状态: 正常,失败"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 定时任务ID查询
self.job_id = job_id
@@ -135,5 +133,5 @@ class JobLogQueryParam:
# 精确查询字段
self.status = status
# 时间范围查询
if start_time and end_time:
self.create_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -83,7 +83,7 @@ class ApplicationCRUD(CRUDBase[ApplicationModel, ApplicationCreateSchema, Applic
"""
return await self.delete(ids=ids)
async def set_available_crud(self, ids: List[int], status: bool) -> None:
async def set_available_crud(self, ids: List[int], status: str) -> None:
"""
批量设置可用状态
@@ -14,7 +14,7 @@ class ApplicationCreateSchema(BaseModel):
name: str = Field(..., max_length=64, description='应用名称')
access_url: str = Field(..., max_length=255, description="访问地址")
icon_url: Optional[str] = Field(None, max_length=300, description="应用图标URL")
status: bool = Field(True, description="是否启用(True:启用 False:禁用)")
status: str = Field(True, description="是否启用(True:启用 False:禁用)")
description: Optional[str] = Field(default=None, max_length=255, description="描述")
@field_validator('access_url')
@@ -58,10 +58,9 @@ class ApplicationQueryParam:
def __init__(
self,
name: Optional[str] = Query(None, description="应用名称"),
status: Optional[bool] = Query(None, description="是否启用"),
status: Optional[str] = Query(None, description="是否启用"),
created_id: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -72,5 +71,5 @@ class ApplicationQueryParam:
self.created_id = created_id
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -85,7 +85,7 @@ class DemoCRUD(CRUDBase[DemoModel, DemoCreateSchema, DemoUpdateSchema]):
"""
return await self.delete(ids=ids)
async def set_available_crud(self, ids: List[int], status: bool) -> None:
async def set_available_crud(self, ids: List[int], status: str) -> None:
"""
批量设置可用状态
@@ -11,7 +11,7 @@ from app.core.base_schema import BaseSchema, UserBySchema, TenantSchema, Custome
class DemoCreateSchema(BaseModel):
"""新增模型"""
name: str = Field(..., min_length=2, max_length=50, description='名称')
status: bool = Field(True, description="是否启用(True:启用 False:禁用)")
status: str = Field(True, description="是否启用(True:启用 False:禁用)")
description: Optional[str] = Field(default=None, max_length=255, description="描述")
@field_validator('name')
@@ -56,10 +56,9 @@ class DemoQueryParam:
def __init__(
self,
name: Optional[str] = Query(None, description="名称"),
status: Optional[bool] = Query(None, description="是否启用"),
status: Optional[str] = Query(None, description="是否启用"),
created_id: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -70,7 +69,7 @@ class DemoQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -5,11 +5,11 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship, validates
from sqlalchemy.sql import expression
from app.config.setting import settings
from app.core.base_model import ModelMixin, UserMixin, TenantMixin
from app.core.base_model import ModelMixin
from app.utils.common_util import SqlalchemyUtil
class GenTableModel(ModelMixin, UserMixin, TenantMixin):
class GenTableModel(ModelMixin):
"""
代码生成表
@@ -4,7 +4,7 @@ from typing import List, Optional
from pydantic import BaseModel, ConfigDict, Field, field_validator
from fastapi import Query
from app.core.base_schema import BaseSchema, UserBySchema, TenantSchema
from app.core.base_schema import BaseSchema
class GenDBTableSchema(BaseModel):
@@ -52,7 +52,7 @@ class GenTableSchema(BaseModel):
return v
class GenTableOutSchema(GenTableSchema, BaseSchema, UserBySchema, TenantSchema):
class GenTableOutSchema(GenTableSchema, BaseSchema):
"""业务表输出模型(面向控制器/前端)。
"""
model_config = ConfigDict(from_attributes=True)
@@ -90,7 +90,7 @@ class GenTableColumnSchema(BaseModel):
sort: int = Field(default=0, description='排序')
class GenTableColumnOutSchema(GenTableColumnSchema, BaseSchema, UserBySchema, TenantSchema):
class GenTableColumnOutSchema(GenTableColumnSchema, BaseSchema):
"""
业务表字段输出模型
"""
@@ -84,7 +84,7 @@ class {{ class_name }}CRUD(CRUDBase[{{ class_name }}Model, {{ class_name }}Creat
"""
return await self.delete(ids=ids)
async def set_available_{{ business_name }}_crud(self, ids: List[int], status: bool) -> None:
async def set_available_{{ business_name }}_crud(self, ids: List[int], status: str) -> None:
"""
批量设置可用状态
@@ -77,7 +77,7 @@ const {{ class_name }}API = {
});
},
// 批量启用/停用
batchAvailable{{ class_name }}(body: { ids: number[]; status: boolean }) {
batchAvailable{{ class_name }}(body: { ids: number[]; status: strean }) {
return request<ApiResponse>({
url: `${API_PATH}/available/setting`,
method: "patch",
@@ -577,7 +577,7 @@ async function handleDelete(ids: number[]) {
}
// 批量启用/停用
async function handleMoreClick(status: boolean) {
async function handleMoreClick(status: strean) {
if (selectIds.value.length) {
ElMessageBox.confirm(`确认${status ? '启用' : '停用'}该项数据?`, '警告', {
confirmButtonText: '确定',
@@ -85,7 +85,7 @@ class CustomerCRUD(CRUDBase[CustomerModel, CustomerCreateSchema, CustomerUpdateS
"""
return await self.delete(ids=ids)
async def set_available_crud(self, ids: List[int], status: bool) -> None:
async def set_available_crud(self, ids: List[int], status: str) -> None:
"""
批量设置可用状态
@@ -1,8 +1,7 @@
# -*- coding: utf-8 -*-
from typing import TYPE_CHECKING
from datetime import datetime
from sqlalchemy import DateTime, String
from sqlalchemy import String
from sqlalchemy.orm import Mapped, mapped_column, relationship, validates
from app.core.base_model import ModelMixin, UserMixin, TenantMixin
@@ -32,8 +31,6 @@ class CustomerModel(ModelMixin, UserMixin, TenantMixin):
name: Mapped[str] = mapped_column(String(64), nullable=False, comment='客户名称')
code: Mapped[str] = mapped_column(String(20), nullable=False, index=True, comment='客户编码')
start_time: Mapped[datetime | None] = mapped_column(DateTime, nullable=True, default=None, comment='开始时间')
end_time: Mapped[datetime | None] = mapped_column(DateTime, nullable=True, default=None, comment='结束时间')
users: Mapped[list["UserModel"]] = relationship(
back_populates="customer",
@@ -12,9 +12,7 @@ class CustomerCreateSchema(BaseModel):
"""新增模型"""
name: str = Field(..., max_length=64, description='客户名称')
code: Optional[str] = Field(default=None, max_length=20, description='客户编码')
start_time: Optional[DateTimeStr] = Field(default=None, description="开始时间", example="2025-01-01 00:00:00")
end_time: Optional[DateTimeStr] = Field(default=None, description="结束时间", example="2025-12-31 23:59:59")
status: bool = Field(True, description="是否启用(True:启用 False:禁用)")
status: str = Field(True, description="是否启用(True:启用 False:禁用)")
description: Optional[str] = Field(default=None, max_length=255, description="描述")
@field_validator('name')
@@ -56,10 +54,9 @@ class CustomerQueryParam:
def __init__(
self,
name: Optional[str] = Query(None, description="客户名称"),
status: Optional[bool] = Query(None, description="状态用(True:启用 False:禁用)"),
status: Optional[str] = Query(None, description="状态用(True:启用 False:禁用)"),
created_id: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -70,5 +67,5 @@ class CustomerQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -179,6 +179,7 @@ class CustomerService:
mapping_dict = {
'id': '编号',
'name': '名称',
'code': '编码',
'status': '状态',
'description': '备注',
'created_time': '创建时间',
@@ -61,7 +61,7 @@ class DeptCRUD(CRUDBase[DeptModel, DeptCreateSchema, DeptUpdateSchema]):
"""
return await self.tree_list(search=search, order_by=order_by, children_attr='children', preload=preload)
async def set_available_crud(self, ids: List[int], status: bool) -> None:
async def set_available_crud(self, ids: List[int], status: str) -> None:
"""
批量设置部门可用状态
@@ -17,7 +17,7 @@ class DeptCreateSchema(BaseModel):
phone: Optional[str] = Field(default=None, max_length=11, description="手机")
email: Optional[str] = Field(default=None, max_length=64, description="邮箱")
parent_id: Optional[int] = Field(default=None, ge=0, description="父部门ID")
status: bool = Field(default=True, description="是否启用(True:启用 False:禁用)")
status: str = Field(default=True, description="是否启用(True:启用 False:禁用)")
description: Optional[str] = Field(default=None, max_length=255, description="备注说明")
@field_validator('name')
@@ -58,12 +58,10 @@ class DeptQueryParam:
"""部门管理查询参数"""
def __init__(
self,
name: Optional[str] = Query(None, description="部门名称"),
status: Optional[bool] = Query(None, description="部门状态(True正常 False停用)"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
self,
name: Optional[str] = Query(None, description="部门名称"),
status: Optional[str] = Query(None, description="部门状态(True正常 False停用)"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -73,5 +71,5 @@ class DeptQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -91,7 +91,7 @@ class DictTypeCRUD(CRUDBase[DictTypeModel, DictTypeCreateSchema, DictTypeUpdateS
"""
return await self.delete(ids=ids)
async def set_obj_available_crud(self, ids: List[int], status: bool) -> None:
async def set_obj_available_crud(self, ids: List[int], status: str) -> None:
"""
设置数据字典类型的可用状态
@@ -226,7 +226,7 @@ class DictDataCRUD(CRUDBase[DictDataModel, DictDataCreateSchema, DictDataUpdateS
"""
return await self.delete(ids=ids)
async def set_obj_available_crud(self, ids: List[int], status: bool) -> None:
async def set_obj_available_crud(self, ids: List[int], status: str) -> None:
"""
设置数据字典数据的可用状态
@@ -289,7 +289,7 @@ class DictDataCRUD(CRUDBase[DictDataModel, DictDataCreateSchema, DictDataUpdateS
await self.delete(ids=ids)
return len(ids)
async def get_obj_list_by_dict_type_crud(self, dict_type: str, status: Optional[bool] = True) -> List[DictDataModel]:
async def get_obj_list_by_dict_type_crud(self, dict_type: str, status: Optional[str] = True) -> List[DictDataModel]:
"""
根据字典类型获取字典数据列表
+31 -133
View File
@@ -14,31 +14,10 @@ class DictTypeCreateSchema(BaseModel):
字典类型表对应pydantic模型
"""
dict_name: str = Field(
...,
min_length=1,
max_length=100,
description='字典名称',
example='用户状态'
)
dict_type: str = Field(
...,
min_length=1,
max_length=100,
description='字典类型',
example='sys_user_status'
)
status: Optional[bool] = Field(
default=None,
description='状态(1正常 0停用)',
example=True
)
description: Optional[str] = Field(
default=None,
max_length=255,
description="描述",
example="用户账号状态管理"
)
dict_name: str = Field(..., min_length=1, max_length=100, description='字典名称', example='用户状态')
dict_type: str = Field(..., min_length=1, max_length=100, description='字典类型', example='sys_user_status')
status: Optional[str] = Field(default=None, description='状态(1正常 0停用)', example=True)
description: Optional[str] = Field(default=None, max_length=255, description="描述", example="用户账号状态管理")
@field_validator('dict_name')
def validate_dict_name(cls, value: str):
@@ -63,32 +42,18 @@ class DictTypeUpdateSchema(DictTypeCreateSchema):
class DictTypeOutSchema(DictTypeCreateSchema, BaseSchema):
"""字典类型响应模型"""
model_config = ConfigDict(
from_attributes=True,
json_schema_extra={
"example": {
"id": 1,
"dict_name": "用户状态",
"dict_type": "sys_user_status",
"status": True,
"description": "用户账号状态管理",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
}
)
model_config = ConfigDict(from_attributes=True)
class DictTypeQueryParam:
"""字典类型查询参数"""
def __init__(
self,
dict_name: Optional[str] = Query(None, description="字典名称", max_length=100, example="用户"),
dict_type: Optional[str] = Query(None, description="字典类型", max_length=100, example="sys_user"),
status: Optional[bool] = Query(None, description="状态(1正常 0停用)", example=True),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
self,
dict_name: Optional[str] = Query(None, description="字典名称", max_length=100, example="用户"),
dict_type: Optional[str] = Query(None, description="字典类型", max_length=100, example="sys_user"),
status: Optional[str] = Query(None, description="状态(1正常 0停用)", example=True),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
super().__init__()
@@ -100,71 +65,24 @@ class DictTypeQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
class DictDataCreateSchema(BaseModel):
"""
字典数据表对应pydantic模型
"""
dict_sort: int = Field(
...,
ge=1,
le=999,
description='字典排序',
example=1
)
dict_label: str = Field(
...,
max_length=100,
description='字典标签',
example='正常'
)
dict_value: str = Field(
...,
max_length=100,
description='字典键值',
example='0'
)
dict_type: str = Field(
...,
max_length=100,
description='字典类型',
example='sys_user_status'
)
dict_type_id: int = Field(
...,
description='字典类型ID',
example=1
)
css_class: Optional[str] = Field(
default=None,
max_length=100,
description='样式属性(其他样式扩展)',
example='label-success'
)
list_class: Optional[str] = Field(
default=None,
description='表格回显样式',
example='success'
)
is_default: Optional[bool] = Field(
default=None,
description='是否默认(Y是 N否)',
example=True
)
status: Optional[bool] = Field(
default=None,
description='状态(1正常 0停用)',
example=True
)
description: Optional[str] = Field(
default=None,
max_length=255,
description="描述",
example="正常状态的用户"
)
dict_sort: int = Field(..., ge=1, le=999, description='字典排序', example=1)
dict_label: str = Field(..., max_length=100, description='字典标签', example='正常')
dict_value: str = Field(..., max_length=100, description='字典键值', example='0')
dict_type: str = Field(..., max_length=100, description='字典类型', example='sys_user_status')
dict_type_id: int = Field(..., description='字典类型ID', example=1)
css_class: Optional[str] = Field(default=None, max_length=100, description='样式属性(其他样式扩展)', example='label-success')
list_class: Optional[str] = Field(default=None, description='表格回显样式', example='success')
is_default: Optional[bool] = Field(default=None, description='是否默认(Y是 N否)', example=True)
status: Optional[str] = Field(default=None, description='状态(1正常 0停用)', example=True)
description: Optional[str] = Field(default=None, max_length=255, description="描述", example="正常状态的用户")
@model_validator(mode='after')
def validate_after(self):
@@ -192,39 +110,19 @@ class DictDataUpdateSchema(DictDataCreateSchema):
class DictDataOutSchema(DictDataCreateSchema, BaseSchema):
"""字典数据响应模型"""
model_config = ConfigDict(
from_attributes=True,
json_schema_extra={
"example": {
"id": 1,
"dict_sort": 1,
"dict_label": "正常",
"dict_value": "0",
"dict_type": "sys_user_status",
"dict_type_id": 1,
"css_class": "label-success",
"list_class": "success",
"is_default": True,
"status": True,
"description": "正常状态的用户",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
}
)
model_config = ConfigDict(from_attributes=True)
class DictDataQueryParam:
"""字典数据查询参数"""
def __init__(
self,
dict_label: Optional[str] = Query(None, description="字典标签", max_length=100, example="正常"),
dict_type: Optional[str] = Query(None, description="字典类型", max_length=100, example="sys_user_status"),
dict_type_id: Optional[int] = Query(None, description="字典类型ID", example=1),
status: Optional[bool] = Query(None, description="状态(1正常 0停用)", example=True),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
self,
dict_label: Optional[str] = Query(None, description="字典标签", max_length=100, example="正常"),
dict_type: Optional[str] = Query(None, description="字典类型", max_length=100, example="sys_user_status"),
dict_type_id: Optional[int] = Query(None, description="字典类型ID", example=1),
status: Optional[str] = Query(None, description="状态(1正常 0停用)", example=True),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -236,5 +134,5 @@ class DictDataQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -22,7 +22,7 @@ class OperationLogCreateSchema(BaseModel):
response_code: Optional[int] = Field(default=None, description="响应状态码")
response_json: Optional[str] = Field(default=None, description="响应 JSON 数据")
process_time: Optional[str] = Field(default=None, description="处理时间")
status: Optional[bool] = Field(default=True, description="是否成功")
status: Optional[str] = Field(default=True, description="是否成功")
description: Optional[str] = Field(default=None, max_length=255, description="描述")
created_id: Optional[int] = Field(default=None, description="创建人ID")
@@ -73,8 +73,7 @@ class OperationLogQueryParam:
request_ip: Optional[str] = Query(None, description="请求IP"),
response_code: Optional[int] = Query(None, description="响应状态码"),
created_id: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -88,9 +87,5 @@ class OperationLogQueryParam:
self.type = type
# 时间范围查询 - 增加对单个时间参数的处理
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
elif start_time:
self.created_time = (">=", start_time)
elif end_time:
self.created_time = ("<=", end_time)
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -61,7 +61,7 @@ class MenuCRUD(CRUDBase[MenuModel, MenuCreateSchema, MenuUpdateSchema]):
"""
return await self.tree_list(search=search, order_by=order_by, children_attr='children', preload=preload)
async def set_available_crud(self, ids: List[int], status: bool) -> None:
async def set_available_crud(self, ids: List[int], status: str) -> None:
"""
批量设置菜单可用状态
@@ -27,7 +27,7 @@ class MenuCreateSchema(BaseModel):
params: Optional[list[dict[str, str]]] = Field(default=None, description="路由参数,格式为[{key: string, value: string}]")
affix: bool = Field(default=False, description="是否固定标签页(True:是 False:否)")
parent_id: Optional[int] = Field(default=None, ge=1, description="父菜单ID")
status: bool = Field(default=True, description="是否启用(True:启用 False:禁用)")
status: str = Field(default=True, description="是否启用(True:启用 False:禁用)")
description: Optional[str] = Field(default=None, max_length=255, description="描述")
@model_validator(mode='before')
@@ -87,9 +87,8 @@ class MenuQueryParam:
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="权限标识"),
status: Optional[bool] = Query(None, description="菜单状态(True正常 False停用)"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
status: Optional[str] = Query(None, description="菜单状态(True正常 False停用)"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -103,5 +102,5 @@ class MenuQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -164,9 +164,7 @@ async def export_obj_list_controller(
return StreamResponse(
data=bytes2file_response(export_result),
media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
headers = {
'Content-Disposition': 'attachment; filename=notice.xlsx'
}
headers = {'Content-Disposition': 'attachment; filename=notice.xlsx'}
)
@NoticeRouter.get("/available", summary="获取全局启用公告", description="获取全局启用公告")
@@ -86,7 +86,7 @@ class NoticeCRUD(CRUDBase[NoticeModel, NoticeCreateSchema, NoticeUpdateSchema]):
"""
return await self.delete(ids=ids)
async def set_available_crud(self, ids: List[int], status: bool) -> None:
async def set_available_crud(self, ids: List[int], status: str) -> None:
"""
设置公告的可用状态
@@ -1,7 +1,5 @@
# -*- coding: utf-8 -*-
from datetime import datetime
from typing import Optional
from sqlalchemy import String, Text
from sqlalchemy.orm import Mapped, mapped_column
@@ -38,5 +36,3 @@ class NoticeModel(ModelMixin, UserMixin, TenantMixin, CustomerMixin):
notice_title: Mapped[str] = mapped_column(String(50), nullable=False, comment='公告标题')
notice_type: Mapped[str] = mapped_column(String(50), nullable=False, comment='公告类型(1通知 2公告)')
notice_content: Mapped[str | None] = mapped_column(Text, nullable=True, comment='公告内容')
start_time: Mapped[Optional[datetime]] = mapped_column(nullable=True, comment='开始时间')
end_time: Mapped[Optional[datetime]] = mapped_column(nullable=True, comment='结束时间')
@@ -6,7 +6,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_valida
from fastapi import Query
from app.core.validator import DateTimeStr
from app.core.base_schema import BaseSchema, UserBySchema, TenantSchema
from app.core.base_schema import BaseSchema, UserBySchema, TenantSchema, CustomerSchema
class NoticeCreateSchema(BaseModel):
@@ -14,10 +14,8 @@ class NoticeCreateSchema(BaseModel):
notice_title: str = Field(..., max_length=50, description='公告标题')
notice_type: str = Field(..., description='公告类型(1通知 2公告)')
notice_content: str = Field(..., description='公告内容')
status: bool = Field(default=True, description="是否启用(True:启用 False:禁用)")
status: str = Field(default=True, description="是否启用(True:启用 False:禁用)")
description: Optional[str] = Field(default=None, max_length=255, description="描述")
start_time: Optional[datetime] = Field(default=None, description="开始时间")
end_time: Optional[datetime] = Field(default=None, description="结束时间")
@field_validator("notice_type")
@classmethod
@@ -44,7 +42,7 @@ class NoticeUpdateSchema(NoticeCreateSchema):
...
class NoticeOutSchema(NoticeCreateSchema, BaseSchema, UserBySchema, TenantSchema):
class NoticeOutSchema(NoticeCreateSchema, BaseSchema, UserBySchema, TenantSchema, CustomerSchema):
"""公告通知响应模型"""
model_config = ConfigDict(from_attributes=True)
@@ -56,12 +54,9 @@ class NoticeQueryParam:
self,
notice_title: Optional[str] = Query(None, description="公告标题"),
notice_type: Optional[str] = Query(None, description="公告类型"),
status: Optional[bool] = Query(None, description="是否可用"),
status: Optional[str] = Query(None, description="是否可用"),
created_id: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="创建开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="创建结束时间", example="2025-12-31 23:59:59"),
notice_start_time: Optional[DateTimeStr] = Query(None, description="公告开始时间", example="2025-01-01 00:00:00"),
notice_end_time: Optional[DateTimeStr] = Query(None, description="公告结束时间", example="2025-12-31 23:59:59"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -73,11 +68,5 @@ class NoticeQueryParam:
self.notice_type = notice_type
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
# 公告有效期查询
if notice_start_time:
self.start_time = ("ge", notice_start_time)
if notice_end_time:
self.end_time = ("le", notice_end_time)
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -44,14 +44,8 @@ class NoticeService:
返回:
- List[Dict]: 可用公告详情字典列表
"""
# 构建搜索条件,包括状态为可用和当前时间在有效期内
current_time = datetime.now()
search = {
'status': True,
'and': [
{'or': [{'start_time': None}, {'start_time': {'le': current_time}}]},
{'or': [{'end_time': None}, {'end_time': {'ge': current_time}}]}
]
}
notice_obj_list = await NoticeCRUD(auth).get_list_crud(search=search)
@@ -171,8 +165,6 @@ class NoticeService:
'notice_content': '公告内容',
'status': '状态',
'description': '备注',
'start_time': '开始时间',
'end_time': '结束时间',
'created_time': '创建时间',
'updated_time': '更新时间',
'created_id': '创建者ID',
@@ -14,7 +14,7 @@ class ParamsCreateSchema(BaseModel):
config_key: str = Field(..., max_length=500, description="参数键名")
config_value: Optional[str] = Field(default=None, description="参数键值")
config_type: bool = Field(default=False, description="系统内置(True:是 False:否)")
status: bool = Field(default=True, description="状态(True:正常 False:停用)")
status: str = Field(default=True, description="状态(True:正常 False:停用)")
description: Optional[str] = Field(default=None, max_length=500, description="描述")
@@ -42,12 +42,11 @@ class ParamsQueryParam:
"""配置管理查询参数"""
def __init__(
self,
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="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
self,
config_name: Optional[str] = Query(None, description="配置名称"),
config_key: Optional[str] = Query(None, description="配置键名"),
config_type: Optional[bool] = Query(None, description="系统内置((True:是 False:否))"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -58,7 +57,7 @@ class ParamsQueryParam:
self.config_type = config_type
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -48,7 +48,7 @@ class PositionCRUD(CRUDBase[PositionModel, PositionCreateSchema, PositionUpdateS
"""
return await self.list(search=search, order_by=order_by, preload=preload)
async def set_available_crud(self, ids: List[int], status: bool) -> None:
async def set_available_crud(self, ids: List[int], status: str) -> None:
"""
批量设置岗位可用状态
@@ -12,7 +12,7 @@ class PositionCreateSchema(BaseModel):
"""岗位创建模型"""
name: str = Field(..., max_length=40, description="岗位名称")
order: Optional[int] = Field(default=1, ge=1, description='显示排序')
status: bool = Field(default=True, description="是否启用(True:启用 False:禁用)")
status: str = Field(default=True, description="是否启用(True:启用 False:禁用)")
description: Optional[str] = Field(default=None, max_length=255, description="描述")
@field_validator('name')
@@ -41,10 +41,9 @@ class PositionQueryParam:
def __init__(
self,
name: Optional[str] = Query(None, description="岗位名称"),
status: Optional[bool] = Query(None, description="是否可用"),
status: Optional[str] = Query(None, description="是否可用"),
created_id: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -55,5 +54,5 @@ class PositionQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -104,7 +104,7 @@ class RoleCRUD(CRUDBase[RoleModel, RoleCreateSchema, RoleUpdateSchema]):
relationship.extend(depts)
await self.db.flush()
async def set_available_crud(self, ids: List[int], status: bool) -> None:
async def set_available_crud(self, ids: List[int], status: str) -> None:
"""
设置角色的可用状态
@@ -18,7 +18,7 @@ class RoleCreateSchema(BaseModel):
code: Optional[str] = Field(default=None, max_length=40, description="角色编码")
order: Optional[int] = Field(default=1, ge=1, description='显示排序')
data_scope: Optional[int] = Field(default=1, ge=1, le=5, description='数据权限范围')
status: bool = Field(default=True, description="是否启用")
status: str = Field(default=True, description="是否启用")
description: Optional[str] = Field(default=None, max_length=255, description="描述")
@field_validator("code")
@@ -65,10 +65,9 @@ class RoleQueryParam:
def __init__(
self,
name: Optional[str] = Query(None, description="角色名称"),
status: Optional[bool] = Query(None, description="是否可用"),
status: Optional[str] = Query(None, description="是否可用"),
created_id: Optional[int] = Query(None, description="创建人"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -79,5 +78,5 @@ class RoleQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -85,7 +85,7 @@ class TenantCRUD(CRUDBase[TenantModel, TenantCreateSchema, TenantUpdateSchema]):
"""
return await self.delete(ids=ids)
async def set_available_crud(self, ids: List[int], status: bool) -> None:
async def set_available_crud(self, ids: List[int], status: str) -> None:
"""
批量设置可用状态
@@ -13,7 +13,7 @@ class TenantCreateSchema(BaseModel):
"""新增模型"""
name: str = Field(..., max_length=64, description='租户名称')
code: Optional[str] = Field(default=None, max_length=20, description='租户编码')
status: bool = Field(True, description="是否启用(True:启用 False:禁用)")
status: str = Field(True, description="是否启用(True:启用 False:禁用)")
description: Optional[str] = Field(default=None, max_length=255, description="描述")
start_time: Optional[DateTimeStr] = Field(default=None, description="开始时间")
end_time: Optional[DateTimeStr] = Field(default=None, description="结束时间")
@@ -65,9 +65,8 @@ class TenantQueryParam:
def __init__(
self,
name: Optional[str] = Query(None, description="租户名称"),
status: Optional[bool] = Query(None, description="状态用(True:启用 False:禁用)"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
status: Optional[str] = Query(None, description="状态用(True:启用 False:禁用)"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段
@@ -77,6 +76,6 @@ class TenantQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))
@@ -105,7 +105,7 @@ 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], status: bool) -> None:
async def set_available_crud(self, ids: List[int], status: str) -> None:
"""
批量设置用户可用状态
@@ -94,7 +94,7 @@ class UserCreateSchema(CurrentUserUpdateSchema):
username: Optional[str] = Field(default=None, max_length=32, description="用户名")
password: Optional[str] = Field(default=None, max_length=128, description="密码哈希值")
status: bool = Field(default=True, description="是否可用")
status: str = Field(default=True, description="是否可用")
description: Optional[str] = Field(default=None, max_length=255, description="备注")
user_type: Optional[str] = Field(default="0", max_length=32, description="用户类型")
@@ -136,9 +136,8 @@ class UserQueryParam:
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"),
status: Optional[bool] = Query(None, description="是否可用"),
start_time: Optional[DateTimeStr] = Query(None, description="开始时间", example="2025-01-01 00:00:00"),
end_time: Optional[DateTimeStr] = Query(None, description="结束时间", example="2025-12-31 23:59:59"),
status: Optional[str] = Query(None, description="是否可用"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
created_id: Optional[int] = Query(None, description="创建人"),
) -> None:
@@ -154,5 +153,5 @@ class UserQueryParam:
self.status = status
# 时间范围查询
if start_time and end_time:
self.created_time = ("between", (start_time, end_time))
if created_time and len(created_time) == 2:
self.created_time = ("between", (created_time[0], created_time[1]))