diff --git a/ruoyi-fastapi-backend/module_admin/controller/post_controler.py b/ruoyi-fastapi-backend/module_admin/controller/post_controler.py index 299d900..f6f2fce 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/post_controler.py +++ b/ruoyi-fastapi-backend/module_admin/controller/post_controler.py @@ -1,24 +1,32 @@ -from fastapi import APIRouter, Request -from fastapi import Depends +from datetime import datetime +from fastapi import APIRouter, Depends, Request from pydantic_validation_decorator import ValidateFields -from config.get_db import get_db -from module_admin.service.login_service import LoginService, CurrentUserModel -from module_admin.service.post_service import * -from module_admin.entity.vo.post_vo import * -from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.annotation.log_annotation import log_decorator +from sqlalchemy.ext.asyncio import AsyncSession from config.enums import BusinessType -from utils.response_util import * -from utils.log_util import * -from utils.page_util import * +from config.get_db import get_db +from module_admin.annotation.log_annotation import log_decorator +from module_admin.aspect.interface_auth import CheckUserInterfaceAuth +from module_admin.service.login_service import LoginService +from module_admin.service.post_service import PostService +from module_admin.entity.vo.post_vo import DeletePostModel, PostModel, PostPageQueryModel +from module_admin.entity.vo.user_vo import CurrentUserModel from utils.common_util import bytes2file_response +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil postController = APIRouter(prefix='/system/post', dependencies=[Depends(LoginService.get_current_user)]) -@postController.get("/list", response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:list'))]) -async def get_system_post_list(request: Request, post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_query), query_db: AsyncSession = Depends(get_db)): +@postController.get( + '/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:list'))] +) +async def get_system_post_list( + request: Request, + post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): # 获取分页数据 post_page_query_result = await PostService.get_post_list_services(query_db, post_page_query, is_page=True) logger.info('获取成功') @@ -26,10 +34,15 @@ async def get_system_post_list(request: Request, post_page_query: PostPageQueryM return ResponseUtil.success(model_content=post_page_query_result) -@postController.post("", dependencies=[Depends(CheckUserInterfaceAuth('system:post:add'))]) +@postController.post('', dependencies=[Depends(CheckUserInterfaceAuth('system:post:add'))]) @ValidateFields(validate_model='add_post') @log_decorator(title='岗位管理', business_type=BusinessType.INSERT) -async def add_system_post(request: Request, add_post: PostModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)): +async def add_system_post( + request: Request, + add_post: PostModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): add_post.create_by = current_user.user.user_name add_post.create_time = datetime.now() add_post.update_by = current_user.user.user_name @@ -40,10 +53,15 @@ async def add_system_post(request: Request, add_post: PostModel, query_db: Async return ResponseUtil.success(msg=add_post_result.message) -@postController.put("", dependencies=[Depends(CheckUserInterfaceAuth('system:post:edit'))]) +@postController.put('', dependencies=[Depends(CheckUserInterfaceAuth('system:post:edit'))]) @ValidateFields(validate_model='edit_post') @log_decorator(title='岗位管理', business_type=BusinessType.UPDATE) -async def edit_system_post(request: Request, edit_post: PostModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)): +async def edit_system_post( + request: Request, + edit_post: PostModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): edit_post.update_by = current_user.user.user_name edit_post.update_time = datetime.now() edit_post_result = await PostService.edit_post_services(query_db, edit_post) @@ -52,7 +70,7 @@ async def edit_system_post(request: Request, edit_post: PostModel, query_db: Asy return ResponseUtil.success(msg=edit_post_result.message) -@postController.delete("/{post_ids}", dependencies=[Depends(CheckUserInterfaceAuth('system:post:remove'))]) +@postController.delete('/{post_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:post:remove'))]) @log_decorator(title='岗位管理', business_type=BusinessType.DELETE) async def delete_system_post(request: Request, post_ids: str, query_db: AsyncSession = Depends(get_db)): delete_post = DeletePostModel(postIds=post_ids) @@ -62,7 +80,9 @@ async def delete_system_post(request: Request, post_ids: str, query_db: AsyncSes return ResponseUtil.success(msg=delete_post_result.message) -@postController.get("/{post_id}", response_model=PostModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:query'))]) +@postController.get( + '/{post_id}', response_model=PostModel, dependencies=[Depends(CheckUserInterfaceAuth('system:post:query'))] +) async def query_detail_system_post(request: Request, post_id: int, query_db: AsyncSession = Depends(get_db)): post_detail_result = await PostService.post_detail_services(query_db, post_id) logger.info(f'获取post_id为{post_id}的信息成功') @@ -70,9 +90,13 @@ async def query_detail_system_post(request: Request, post_id: int, query_db: Asy return ResponseUtil.success(data=post_detail_result) -@postController.post("/export", dependencies=[Depends(CheckUserInterfaceAuth('system:post:export'))]) +@postController.post('/export', dependencies=[Depends(CheckUserInterfaceAuth('system:post:export'))]) @log_decorator(title='岗位管理', business_type=BusinessType.EXPORT) -async def export_system_post_list(request: Request, post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_form), query_db: AsyncSession = Depends(get_db)): +async def export_system_post_list( + request: Request, + post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): # 获取全量数据 post_query_result = await PostService.get_post_list_services(query_db, post_page_query, is_page=False) post_export_result = await PostService.export_post_list_services(post_query_result) diff --git a/ruoyi-fastapi-backend/module_admin/dao/post_dao.py b/ruoyi-fastapi-backend/module_admin/dao/post_dao.py index 6478012..4805306 100644 --- a/ruoyi-fastapi-backend/module_admin/dao/post_dao.py +++ b/ruoyi-fastapi-backend/module_admin/dao/post_dao.py @@ -1,8 +1,8 @@ -from sqlalchemy import select, update, delete, func +from sqlalchemy import delete, func, select, update from sqlalchemy.ext.asyncio import AsyncSession from module_admin.entity.do.post_do import SysPost from module_admin.entity.do.user_do import SysUserPost -from module_admin.entity.vo.post_vo import * +from module_admin.entity.vo.post_vo import PostModel, PostPageQueryModel from utils.page_util import PageUtil @@ -19,11 +19,11 @@ class PostDao: :param post_id: 岗位id :return: 在用岗位信息对象 """ - post_info = (await db.execute( - select(SysPost) - .where(SysPost.post_id == post_id, - SysPost.status == '0') - )).scalars().first() + post_info = ( + (await db.execute(select(SysPost).where(SysPost.post_id == post_id, SysPost.status == '0'))) + .scalars() + .first() + ) return post_info @@ -35,10 +35,7 @@ class PostDao: :param post_id: 岗位id :return: 岗位信息对象 """ - post_info = (await db.execute( - select(SysPost) - .where(SysPost.post_id == post_id) - )).scalars().first() + post_info = (await db.execute(select(SysPost).where(SysPost.post_id == post_id))).scalars().first() return post_info @@ -50,12 +47,19 @@ class PostDao: :param post: 岗位参数对象 :return: 岗位信息对象 """ - post_info = (await db.execute( - select(SysPost) - .where(SysPost.post_name == post.post_name if post.post_name else True, - SysPost.post_code == post.post_code if post.post_code else True, - SysPost.post_sort == post.post_sort if post.post_sort else True) - )).scalars().first() + post_info = ( + ( + await db.execute( + select(SysPost).where( + SysPost.post_name == post.post_name if post.post_name else True, + SysPost.post_code == post.post_code if post.post_code else True, + SysPost.post_sort == post.post_sort if post.post_sort else True, + ) + ) + ) + .scalars() + .first() + ) return post_info @@ -68,12 +72,16 @@ class PostDao: :param is_page: 是否开启分页 :return: 岗位列表信息对象 """ - query = select(SysPost) \ - .where(SysPost.post_code.like(f'%{query_object.post_code}%') if query_object.post_code else True, - SysPost.post_name.like(f'%{query_object.post_name}%') if query_object.post_name else True, - SysPost.status == query_object.status if query_object.status else True) \ - .order_by(SysPost.post_sort) \ + query = ( + select(SysPost) + .where( + SysPost.post_code.like(f'%{query_object.post_code}%') if query_object.post_code else True, + SysPost.post_name.like(f'%{query_object.post_name}%') if query_object.post_name else True, + SysPost.status == query_object.status if query_object.status else True, + ) + .order_by(SysPost.post_sort) .distinct() + ) post_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) return post_list @@ -100,10 +108,7 @@ class PostDao: :param post: 需要更新的岗位字典 :return: """ - await db.execute( - update(SysPost), - [post] - ) + await db.execute(update(SysPost), [post]) @classmethod async def delete_post_dao(cls, db: AsyncSession, post: PostModel): @@ -113,10 +118,7 @@ class PostDao: :param post: 岗位对象 :return: """ - await db.execute( - delete(SysPost) - .where(SysPost.post_id.in_([post.post_id])) - ) + await db.execute(delete(SysPost).where(SysPost.post_id.in_([post.post_id]))) @classmethod async def count_user_post_dao(cls, db: AsyncSession, post_id: int): @@ -126,10 +128,8 @@ class PostDao: :param post_id: 岗位id :return: 岗位关联的用户数量 """ - user_post_count = (await db.execute( - select(func.count('*')) - .select_from(SysUserPost) - .where(SysUserPost.post_id == post_id) - )).scalar() + user_post_count = ( + await db.execute(select(func.count('*')).select_from(SysUserPost).where(SysUserPost.post_id == post_id)) + ).scalar() return user_post_count diff --git a/ruoyi-fastapi-backend/module_admin/entity/do/post_do.py b/ruoyi-fastapi-backend/module_admin/entity/do/post_do.py index c6b189b..54ab38d 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/do/post_do.py +++ b/ruoyi-fastapi-backend/module_admin/entity/do/post_do.py @@ -1,12 +1,13 @@ -from sqlalchemy import Column, Integer, String, DateTime -from config.database import Base from datetime import datetime +from sqlalchemy import Column, DateTime, Integer, String +from config.database import Base class SysPost(Base): """ 岗位信息表 """ + __tablename__ = 'sys_post' post_id = Column(Integer, primary_key=True, autoincrement=True, comment='岗位ID') diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/post_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/post_vo.py index 68dd079..ab85103 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/post_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/post_vo.py @@ -1,15 +1,16 @@ +from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel from pydantic_validation_decorator import NotBlank, Size -from typing import Union, Optional, List, Literal -from datetime import datetime -from module_admin.annotation.pydantic_annotation import as_query, as_form +from typing import Literal, Optional +from module_admin.annotation.pydantic_annotation import as_form, as_query class PostModel(BaseModel): """ 岗位信息表对应pydantic模型 """ + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) post_id: Optional[int] = Field(default=None, description='岗位ID') @@ -47,6 +48,7 @@ class PostQueryModel(PostModel): """ 岗位管理不分页查询模型 """ + begin_time: Optional[str] = Field(default=None, description='开始时间') end_time: Optional[str] = Field(default=None, description='结束时间') @@ -57,6 +59,7 @@ class PostPageQueryModel(PostQueryModel): """ 岗位管理分页查询模型 """ + page_num: int = Field(default=1, description='当前页码') page_size: int = Field(default=10, description='每页记录数') @@ -65,6 +68,7 @@ class DeletePostModel(BaseModel): """ 删除岗位模型 """ + model_config = ConfigDict(alias_generator=to_camel) post_ids: str = Field(description='需要删除的岗位ID') diff --git a/ruoyi-fastapi-backend/module_admin/service/post_service.py b/ruoyi-fastapi-backend/module_admin/service/post_service.py index b9a088c..3ce4a6b 100644 --- a/ruoyi-fastapi-backend/module_admin/service/post_service.py +++ b/ruoyi-fastapi-backend/module_admin/service/post_service.py @@ -1,16 +1,22 @@ -from module_admin.dao.post_dao import * -from module_admin.entity.vo.common_vo import CrudResponseModel +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List from config.constant import CommonConstant from exceptions.exception import ServiceException -from utils.common_util import export_list2excel, CamelCaseUtil +from module_admin.dao.post_dao import PostDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.post_vo import DeletePostModel, PostModel, PostPageQueryModel +from utils.common_util import CamelCaseUtil, export_list2excel class PostService: """ 岗位管理模块服务层 """ + @classmethod - async def get_post_list_services(cls, query_db: AsyncSession, query_object: PostPageQueryModel, is_page: bool = False): + async def get_post_list_services( + cls, query_db: AsyncSession, query_object: PostPageQueryModel, is_page: bool = False + ): """ 获取岗位列表信息service :param query_db: orm对象 @@ -146,16 +152,16 @@ class PostService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "postId": "岗位编号", - "postCode": "岗位编码", - "postName": "岗位名称", - "postSort": "显示顺序", - "status": "状态", - "createBy": "创建者", - "createTime": "创建时间", - "updateBy": "更新者", - "updateTime": "更新时间", - "remark": "备注", + 'postId': '岗位编号', + 'postCode': '岗位编码', + 'postName': '岗位名称', + 'postSort': '显示顺序', + 'status': '状态', + 'createBy': '创建者', + 'createTime': '创建时间', + 'updateBy': '更新者', + 'updateTime': '更新时间', + 'remark': '备注', } data = post_list @@ -165,7 +171,9 @@ class PostService: item['status'] = '正常' else: item['status'] = '停用' - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data