diff --git a/ruoyi-fastapi-backend/module_admin/controller/config_controller.py b/ruoyi-fastapi-backend/module_admin/controller/config_controller.py index 3c26783..cee889d 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/config_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/config_controller.py @@ -1,23 +1,32 @@ -from fastapi import APIRouter -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.config_service 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.entity.vo.config_vo import ConfigModel, ConfigPageQueryModel, DeleteConfigModel +from module_admin.entity.vo.user_vo import CurrentUserModel +from module_admin.service.config_service import ConfigService +from module_admin.service.login_service import LoginService 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 configController = APIRouter(prefix='/system/config', dependencies=[Depends(LoginService.get_current_user)]) -@configController.get("/list", response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:config:list'))]) -async def get_system_config_list(request: Request, config_page_query: ConfigPageQueryModel = Depends(ConfigPageQueryModel.as_query), query_db: AsyncSession = Depends(get_db)): +@configController.get( + '/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:config:list'))] +) +async def get_system_config_list( + request: Request, + config_page_query: ConfigPageQueryModel = Depends(ConfigPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): # 获取分页数据 config_page_query_result = await ConfigService.get_config_list_services(query_db, config_page_query, is_page=True) logger.info('获取成功') @@ -25,10 +34,15 @@ async def get_system_config_list(request: Request, config_page_query: ConfigPage return ResponseUtil.success(model_content=config_page_query_result) -@configController.post("", dependencies=[Depends(CheckUserInterfaceAuth('system:config:add'))]) +@configController.post('', dependencies=[Depends(CheckUserInterfaceAuth('system:config:add'))]) @ValidateFields(validate_model='add_config') @log_decorator(title='参数管理', business_type=BusinessType.INSERT) -async def add_system_config(request: Request, add_config: ConfigModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)): +async def add_system_config( + request: Request, + add_config: ConfigModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): add_config.create_by = current_user.user.user_name add_config.create_time = datetime.now() add_config.update_by = current_user.user.user_name @@ -39,10 +53,15 @@ async def add_system_config(request: Request, add_config: ConfigModel, query_db: return ResponseUtil.success(msg=add_config_result.message) -@configController.put("", dependencies=[Depends(CheckUserInterfaceAuth('system:config:edit'))]) +@configController.put('', dependencies=[Depends(CheckUserInterfaceAuth('system:config:edit'))]) @ValidateFields(validate_model='edit_config') @log_decorator(title='参数管理', business_type=BusinessType.UPDATE) -async def edit_system_config(request: Request, edit_config: ConfigModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)): +async def edit_system_config( + request: Request, + edit_config: ConfigModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): edit_config.update_by = current_user.user.user_name edit_config.update_time = datetime.now() edit_config_result = await ConfigService.edit_config_services(request, query_db, edit_config) @@ -51,7 +70,7 @@ async def edit_system_config(request: Request, edit_config: ConfigModel, query_d return ResponseUtil.success(msg=edit_config_result.message) -@configController.delete("/refreshCache", dependencies=[Depends(CheckUserInterfaceAuth('system:config:remove'))]) +@configController.delete('/refreshCache', dependencies=[Depends(CheckUserInterfaceAuth('system:config:remove'))]) @log_decorator(title='参数管理', business_type=BusinessType.UPDATE) async def refresh_system_config(request: Request, query_db: AsyncSession = Depends(get_db)): refresh_config_result = await ConfigService.refresh_sys_config_services(request, query_db) @@ -60,7 +79,7 @@ async def refresh_system_config(request: Request, query_db: AsyncSession = Depen return ResponseUtil.success(msg=refresh_config_result.message) -@configController.delete("/{config_ids}", dependencies=[Depends(CheckUserInterfaceAuth('system:config:remove'))]) +@configController.delete('/{config_ids}', dependencies=[Depends(CheckUserInterfaceAuth('system:config:remove'))]) @log_decorator(title='参数管理', business_type=BusinessType.DELETE) async def delete_system_config(request: Request, config_ids: str, query_db: AsyncSession = Depends(get_db)): delete_config = DeleteConfigModel(configIds=config_ids) @@ -70,7 +89,9 @@ async def delete_system_config(request: Request, config_ids: str, query_db: Asyn return ResponseUtil.success(msg=delete_config_result.message) -@configController.get("/{config_id}", response_model=ConfigModel, dependencies=[Depends(CheckUserInterfaceAuth('system:config:query'))]) +@configController.get( + '/{config_id}', response_model=ConfigModel, dependencies=[Depends(CheckUserInterfaceAuth('system:config:query'))] +) async def query_detail_system_config(request: Request, config_id: int, query_db: AsyncSession = Depends(get_db)): config_detail_result = await ConfigService.config_detail_services(query_db, config_id) logger.info(f'获取config_id为{config_id}的信息成功') @@ -78,7 +99,7 @@ async def query_detail_system_config(request: Request, config_id: int, query_db: return ResponseUtil.success(data=config_detail_result) -@configController.get("/configKey/{config_key}") +@configController.get('/configKey/{config_key}') async def query_system_config(request: Request, config_key: str): # 获取全量数据 config_query_result = await ConfigService.query_config_list_from_cache_services(request.app.state.redis, config_key) @@ -87,9 +108,13 @@ async def query_system_config(request: Request, config_key: str): return ResponseUtil.success(msg=config_query_result) -@configController.post("/export", dependencies=[Depends(CheckUserInterfaceAuth('system:config:export'))]) +@configController.post('/export', dependencies=[Depends(CheckUserInterfaceAuth('system:config:export'))]) @log_decorator(title='参数管理', business_type=BusinessType.EXPORT) -async def export_system_config_list(request: Request, config_page_query: ConfigPageQueryModel = Depends(ConfigPageQueryModel.as_form), query_db: AsyncSession = Depends(get_db)): +async def export_system_config_list( + request: Request, + config_page_query: ConfigPageQueryModel = Depends(ConfigPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): # 获取全量数据 config_query_result = await ConfigService.get_config_list_services(query_db, config_page_query, is_page=False) config_export_result = await ConfigService.export_config_list_services(config_query_result) diff --git a/ruoyi-fastapi-backend/module_admin/dao/config_dao.py b/ruoyi-fastapi-backend/module_admin/dao/config_dao.py index 79304c2..df3e3f4 100644 --- a/ruoyi-fastapi-backend/module_admin/dao/config_dao.py +++ b/ruoyi-fastapi-backend/module_admin/dao/config_dao.py @@ -1,9 +1,9 @@ -from sqlalchemy import select, update, delete +from datetime import datetime, time +from sqlalchemy import delete, select, update from sqlalchemy.ext.asyncio import AsyncSession from module_admin.entity.do.config_do import SysConfig -from module_admin.entity.vo.config_vo import * +from module_admin.entity.vo.config_vo import ConfigModel, ConfigPageQueryModel from utils.page_util import PageUtil -from datetime import datetime, time class ConfigDao: @@ -19,10 +19,7 @@ class ConfigDao: :param config_id: 参数配置id :return: 参数配置信息对象 """ - config_info = (await db.execute( - select(SysConfig) - .where(SysConfig.config_id == config_id) - )).scalars().first() + config_info = (await db.execute(select(SysConfig).where(SysConfig.config_id == config_id))).scalars().first() return config_info @@ -34,11 +31,18 @@ class ConfigDao: :param config: 参数配置参数对象 :return: 参数配置信息对象 """ - config_info = (await db.execute( - select(SysConfig) - .where(SysConfig.config_key == config.config_key if config.config_key else True, - SysConfig.config_value == config.config_value if config.config_value else True) - )).scalars().first() + config_info = ( + ( + await db.execute( + select(SysConfig).where( + SysConfig.config_key == config.config_key if config.config_key else True, + SysConfig.config_value == config.config_value if config.config_value else True, + ) + ) + ) + .scalars() + .first() + ) return config_info @@ -51,15 +55,21 @@ class ConfigDao: :param is_page: 是否开启分页 :return: 参数配置列表信息对象 """ - query = select(SysConfig) \ - .where(SysConfig.config_name.like(f'%{query_object.config_name}%') if query_object.config_name else True, - SysConfig.config_key.like(f'%{query_object.config_key}%') if query_object.config_key else True, - SysConfig.config_type == query_object.config_type if query_object.config_type else True, - SysConfig.create_time.between( - datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.begin_time and query_object.end_time else True) \ + query = ( + select(SysConfig) + .where( + SysConfig.config_name.like(f'%{query_object.config_name}%') if query_object.config_name else True, + SysConfig.config_key.like(f'%{query_object.config_key}%') if query_object.config_key else True, + SysConfig.config_type == query_object.config_type if query_object.config_type else True, + SysConfig.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) + if query_object.begin_time and query_object.end_time + else True, + ) .distinct() + ) config_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) return config_list @@ -86,10 +96,7 @@ class ConfigDao: :param config: 需要更新的参数配置字典 :return: """ - await db.execute( - update(SysConfig), - [config] - ) + await db.execute(update(SysConfig), [config]) @classmethod async def delete_config_dao(cls, db: AsyncSession, config: ConfigModel): @@ -99,7 +106,4 @@ class ConfigDao: :param config: 参数配置对象 :return: """ - await db.execute( - delete(SysConfig) - .where(SysConfig.config_id.in_([config.config_id])) - ) + await db.execute(delete(SysConfig).where(SysConfig.config_id.in_([config.config_id]))) diff --git a/ruoyi-fastapi-backend/module_admin/entity/do/config_do.py b/ruoyi-fastapi-backend/module_admin/entity/do/config_do.py index 5fb6476..32af3b0 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/do/config_do.py +++ b/ruoyi-fastapi-backend/module_admin/entity/do/config_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 SysConfig(Base): """ 参数配置表 """ + __tablename__ = 'sys_config' config_id = Column(Integer, primary_key=True, autoincrement=True, comment='参数主键') @@ -18,4 +19,4 @@ class SysConfig(Base): create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间') update_by = Column(String(64), nullable=True, default='', comment='更新者') update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间') - remark = Column(String(500), nullable=True, default='', comment='备注') \ No newline at end of file + remark = Column(String(500), nullable=True, default='', comment='备注') diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/config_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/config_vo.py index c749190..c398d23 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/config_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/config_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 ConfigModel(BaseModel): """ 参数配置表对应pydantic模型 """ + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) config_id: Optional[int] = Field(default=None, description='参数主键') @@ -48,6 +49,7 @@ class ConfigQueryModel(ConfigModel): """ 参数配置管理不分页查询模型 """ + begin_time: Optional[str] = Field(default=None, description='开始时间') end_time: Optional[str] = Field(default=None, description='结束时间') @@ -58,6 +60,7 @@ class ConfigPageQueryModel(ConfigQueryModel): """ 参数配置管理分页查询模型 """ + page_num: int = Field(default=1, description='当前页码') page_size: int = Field(default=10, description='每页记录数') @@ -66,6 +69,7 @@ class DeleteConfigModel(BaseModel): """ 删除参数配置模型 """ + model_config = ConfigDict(alias_generator=to_camel) config_ids: str = Field(description='需要删除的参数主键') diff --git a/ruoyi-fastapi-backend/module_admin/service/config_service.py b/ruoyi-fastapi-backend/module_admin/service/config_service.py index 6759a8b..8d3b9e6 100644 --- a/ruoyi-fastapi-backend/module_admin/service/config_service.py +++ b/ruoyi-fastapi-backend/module_admin/service/config_service.py @@ -1,10 +1,13 @@ from fastapi import Request -from module_admin.dao.config_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 config.env import RedisInitKeyConfig from exceptions.exception import ServiceException -from utils.common_util import export_list2excel, CamelCaseUtil +from module_admin.dao.config_dao import ConfigDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.config_vo import ConfigModel, ConfigPageQueryModel, DeleteConfigModel +from utils.common_util import CamelCaseUtil, export_list2excel class ConfigService: @@ -13,7 +16,9 @@ class ConfigService: """ @classmethod - async def get_config_list_services(cls, query_db: AsyncSession, query_object: ConfigPageQueryModel, is_page: bool = False): + async def get_config_list_services( + cls, query_db: AsyncSession, query_object: ConfigPageQueryModel, is_page: bool = False + ): """ 获取参数配置列表信息service :param query_db: orm对象 @@ -40,7 +45,10 @@ class ConfigService: await redis.delete(*keys) config_all = await ConfigDao.get_config_list(query_db, ConfigPageQueryModel(**dict()), is_page=False) for config_obj in config_all: - await redis.set(f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{config_obj.get('configKey')}", config_obj.get('configValue')) + await redis.set( + f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{config_obj.get('configKey')}", + config_obj.get('configValue'), + ) @classmethod async def query_config_list_from_cache_services(cls, redis, config_key: str): @@ -83,7 +91,9 @@ class ConfigService: try: await ConfigDao.add_config_dao(query_db, page_object) await query_db.commit() - await request.app.state.redis.set(f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{page_object.config_key}", page_object.config_value) + await request.app.state.redis.set( + f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{page_object.config_key}", page_object.config_value + ) return CrudResponseModel(is_success=True, message='新增成功') except Exception as e: await query_db.rollback() @@ -108,8 +118,12 @@ class ConfigService: await ConfigDao.edit_config_dao(query_db, edit_config) await query_db.commit() if config_info.config_key != page_object.config_key: - await request.app.state.redis.delete(f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{config_info.config_key}") - await request.app.state.redis.set(f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{page_object.config_key}", page_object.config_value) + await request.app.state.redis.delete( + f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{config_info.config_key}" + ) + await request.app.state.redis.set( + f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{page_object.config_key}", page_object.config_value + ) return CrudResponseModel(is_success=True, message='更新成功') except Exception as e: await query_db.rollback() @@ -136,7 +150,9 @@ class ConfigService: raise ServiceException(message=f'内置参数{config_info.config_key}不能删除') else: await ConfigDao.delete_config_dao(query_db, ConfigModel(configId=int(config_id))) - delete_config_key_list.append(f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{config_info.config_key}") + delete_config_key_list.append( + f"{RedisInitKeyConfig.SYS_CONFIG.get('key')}:{config_info.config_key}" + ) await query_db.commit() if delete_config_key_list: await request.app.state.redis.delete(*delete_config_key_list) @@ -172,16 +188,16 @@ class ConfigService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "configId": "参数主键", - "configName": "参数名称", - "configKey": "参数键名", - "configValue": "参数键值", - "configType": "系统内置", - "createBy": "创建者", - "createTime": "创建时间", - "updateBy": "更新者", - "updateTime": "更新时间", - "remark": "备注", + 'configId': '参数主键', + 'configName': '参数名称', + 'configKey': '参数键名', + 'configValue': '参数键值', + 'configType': '系统内置', + 'createBy': '创建者', + 'createTime': '创建时间', + 'updateBy': '更新者', + 'updateTime': '更新时间', + 'remark': '备注', } data = config_list @@ -191,7 +207,9 @@ class ConfigService: item['configType'] = '是' else: item['configType'] = '否' - 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