diff --git a/backend/app/api/v1/__init__.py b/backend/app/api/v1/__init__.py index 3ba9f25e..39c8e11b 100644 --- a/backend/app/api/v1/__init__.py +++ b/backend/app/api/v1/__init__.py @@ -10,7 +10,7 @@ from .module_system.user.controller import UserRouter from .module_system.log.controller import LogRouter from .module_system.position.controller import PositionRouter from .module_system.notice.controller import NoticeRouter -from .module_system.config.controller import ConfigRouter +from .module_system.params.controller import ParamsRouter from .module_system.dict.controller import DictRouter from .module_monitor.cache.controller import CacheRouter @@ -41,7 +41,7 @@ SYSTEM_MODULES = [ {"router": LogRouter}, {"router": PositionRouter}, {"router": NoticeRouter}, - {"router": ConfigRouter}, + {"router": ParamsRouter}, {"router": DictRouter}, ] diff --git a/backend/app/api/v1/module_system/config/__init__.py b/backend/app/api/v1/module_system/params/__init__.py similarity index 100% rename from backend/app/api/v1/module_system/config/__init__.py rename to backend/app/api/v1/module_system/params/__init__.py diff --git a/backend/app/api/v1/module_system/config/controller.py b/backend/app/api/v1/module_system/params/controller.py similarity index 52% rename from backend/app/api/v1/module_system/config/controller.py rename to backend/app/api/v1/module_system/params/controller.py index 2b4cf1ea..b0a166b5 100644 --- a/backend/app/api/v1/module_system/config/controller.py +++ b/backend/app/api/v1/module_system/params/controller.py @@ -13,102 +13,122 @@ from app.core.dependencies import AuthPermission, redis_getter from app.core.router_class import OperationLogRoute from app.core.logger import logger from ..auth.schema import AuthSchema -from .param import ConfigQueryParams -from .schema import ConfigCreateSchema, ConfigUpdateSchema -from .service import ConfigService +from .param import ParamsQueryParams +from .schema import ParamsCreateSchema, ParamsUpdateSchema +from .service import ParamsService -ConfigRouter = APIRouter(route_class=OperationLogRoute, prefix="/param", tags=["参数管理"]) +ParamsRouter = APIRouter(route_class=OperationLogRoute, prefix="/param", tags=["参数管理"]) -@ConfigRouter.get("/detail/{id}", summary="获取参数详情", description="获取参数详情") +@ParamsRouter.get("/detail/{id}", summary="获取参数详情", description="获取参数详情") async def get_type_detail_controller( id: int = Path(..., description="参数ID"), auth: AuthSchema = Depends(AuthPermission(permissions=["system:param:query"])) ) -> JSONResponse: - result_dict = await ConfigService.get_obj_detail_service(id=id, auth=auth) + result_dict = await ParamsService.get_obj_detail_service(id=id, auth=auth) logger.info(f"获取参数详情成功 {id}") return SuccessResponse(data=result_dict, msg="获取参数详情成功") -@ConfigRouter.get("/list", summary="获取配置", description="获取配置") +@ParamsRouter.get("/key/{config_key}", summary="根据配置键获取参数详情", description="根据配置键获取参数详情") +async def get_obj_by_key_controller( + config_key: str = Path(..., description="配置键"), + auth: AuthSchema = Depends(AuthPermission(permissions=["system:param:query"])) +) -> JSONResponse: + result_dict = await ParamsService.get_obj_by_key_service(config_key=config_key, auth=auth) + logger.info(f"根据配置键获取参数详情成功 {config_key}") + return SuccessResponse(data=result_dict, msg="根据配置键获取参数详情成功") + + +@ParamsRouter.get("/value/{config_key}", summary="根据配置键获取参数值", description="根据配置键获取参数值") +async def get_config_value_by_key_controller( + config_key: str = Path(..., description="配置键"), + auth: AuthSchema = Depends(AuthPermission(permissions=["system:param:query"])) +) -> JSONResponse: + result_value = await ParamsService.get_config_value_by_key_service(config_key=config_key, auth=auth) + logger.info(f"根据配置键获取参数值成功 {config_key}") + return SuccessResponse(data=result_value, msg="根据配置键获取参数值成功") + + +@ParamsRouter.get("/list", summary="获取参数列表", description="获取参数列表") async def get_obj_list_controller( auth: AuthSchema = Depends(AuthPermission(permissions=["system:param:query"])), page: PaginationQueryParams = Depends(), - search: ConfigQueryParams = Depends(), + search: ParamsQueryParams = Depends(), ) -> JSONResponse: - result_dict_list = await ConfigService.get_obj_list_service(auth=auth, search=search, order_by=page.order_by) + result_dict_list = await ParamsService.get_obj_list_service(auth=auth, search=search, order_by=page.order_by) result_dict = await PaginationService.get_page_obj(data_list= result_dict_list, page_no= page.page_no, page_size = page.page_size) - logger.info(f"获取配置成功") - return SuccessResponse(data=result_dict, msg="查询配置列表成功") + logger.info(f"获取参数列表成功") + return SuccessResponse(data=result_dict, msg="查询参数列表成功") -@ConfigRouter.post("/create", summary="创建参数", description="创建参数") +@ParamsRouter.post("/create", summary="创建参数", description="创建参数") async def create_obj_controller( - data: ConfigCreateSchema, + data: ParamsCreateSchema, redis: Redis = Depends(redis_getter), auth: AuthSchema = Depends(AuthPermission(permissions=["system:param:create"])) ) -> JSONResponse: - result_dict = await ConfigService.create_obj_service(auth=auth, redis=redis, data=data) + result_dict = await ParamsService.create_obj_service(auth=auth, redis=redis, data=data) logger.info(f"创建参数成功: {result_dict}") return SuccessResponse(data=result_dict, msg="创建参数成功") -@ConfigRouter.put("/update/{id}", summary="修改配置", description="修改配置") +@ParamsRouter.put("/update/{id}", summary="修改参数", description="修改参数") async def update_objs_controller( - data: ConfigUpdateSchema, + data: ParamsUpdateSchema, id: int = Path(..., description="参数ID"), redis: Redis = Depends(redis_getter), auth: AuthSchema = Depends(AuthPermission(permissions=["system:param:update"])) ) -> JSONResponse: - result_dict = await ConfigService.update_obj_service(auth=auth, redis=redis, id=id, data=data) - logger.info(f"更新配置成功 {result_dict}") - return SuccessResponse(data=result_dict, msg="更新配置成功") + result_dict = await ParamsService.update_obj_service(auth=auth, redis=redis, id=id, data=data) + logger.info(f"更新参数成功 {result_dict}") + return SuccessResponse(data=result_dict, msg="更新参数成功") -@ConfigRouter.delete("/delete", summary="删除参数", description="删除参数") +@ParamsRouter.delete("/delete", summary="删除参数", description="删除参数") async def delete_obj_controller( redis: Redis = Depends(redis_getter), ids: list[int] = Body(..., description="ID列表"), auth: AuthSchema = Depends(AuthPermission(permissions=["system:param:delete"])) ) -> JSONResponse: - await ConfigService.delete_obj_service(auth=auth, redis=redis, ids=ids) + await ParamsService.delete_obj_service(auth=auth, redis=redis, ids=ids) logger.info(f"删除参数成功: {ids}") return SuccessResponse(msg="删除参数成功") -@ConfigRouter.post('/export', summary="导出参数", description="导出参数") +@ParamsRouter.post('/export', summary="导出参数", description="导出参数") async def export_obj_list_controller( - search: ConfigQueryParams = Depends(), + search: ParamsQueryParams = Depends(), auth: AuthSchema = Depends(AuthPermission(permissions=["system:param:export"])) ) -> StreamingResponse: # 获取全量数据 - result_dict_list = await ConfigService.get_obj_list_service(search=search, auth=auth) - export_result = await ConfigService.export_obj_service(data_list=result_dict_list) + result_dict_list = await ParamsService.get_obj_list_service(search=search, auth=auth) + export_result = await ParamsService.export_obj_service(data_list=result_dict_list) logger.info('导出参数成功') return StreamResponse( data=bytes2file_response(export_result), media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', headers = { - 'Content-Disposition': 'attachment; filename=config.xlsx' + 'Content-Disposition': 'attachment; filename=params.xlsx' } ) -@ConfigRouter.post("/upload", summary="上传文件", dependencies=[Depends(AuthPermission(permissions=["system:config:upload"]))]) +@ParamsRouter.post("/upload", summary="上传文件", dependencies=[Depends(AuthPermission(permissions=["system:param:upload"]))]) async def upload_file_controller( file: UploadFile, request: Request ) -> JSONResponse: - result_str = await ConfigService.upload_service(base_url=str(request.base_url), file=file) + result_str = await ParamsService.upload_service(base_url=str(request.base_url), file=file) logger.info(f"上传文件: {result_str}") return SuccessResponse(data=result_str, msg='上传文件成功') -@ConfigRouter.get("/info", summary="获取初始化缓存参数", description="获取初始化缓存参数") +@ParamsRouter.get("/info", summary="获取初始化缓存参数", description="获取初始化缓存参数") async def get_init_obj_controller( redis: Redis = Depends(redis_getter), ) -> JSONResponse: - result_dict = await ConfigService.get_init_config_service(redis=redis) + result_dict = await ParamsService.get_init_config_service(redis=redis) logger.info(f"获取初始化缓存参数成功 {result_dict}") - return SuccessResponse(data=result_dict, msg="获取初始化缓存参数成功") + return SuccessResponse(data=result_dict, msg="获取初始化缓存参数成功") \ No newline at end of file diff --git a/backend/app/api/v1/module_system/config/crud.py b/backend/app/api/v1/module_system/params/crud.py similarity index 56% rename from backend/app/api/v1/module_system/config/crud.py rename to backend/app/api/v1/module_system/params/crud.py index 48b245b4..0a24df13 100644 --- a/backend/app/api/v1/module_system/config/crud.py +++ b/backend/app/api/v1/module_system/params/crud.py @@ -4,35 +4,35 @@ from typing import Dict, List, Optional, Sequence from app.core.base_crud import CRUDBase from ..auth.schema import AuthSchema -from .model import ConfigModel -from .schema import ConfigCreateSchema,ConfigUpdateSchema +from .model import ParamsModel +from .schema import ParamsCreateSchema, ParamsUpdateSchema -class ConfigCRUD(CRUDBase[ConfigModel, ConfigCreateSchema, ConfigUpdateSchema]): +class ParamsCRUD(CRUDBase[ParamsModel, ParamsCreateSchema, ParamsUpdateSchema]): """配置管理数据层""" def __init__(self, auth: AuthSchema) -> None: """初始化配置CRUD""" self.auth = auth - super().__init__(model=ConfigModel, auth=auth) + super().__init__(model=ParamsModel, auth=auth) - async def get_obj_by_id_crud(self, id: int) -> Optional[ConfigModel]: + async def get_obj_by_id_crud(self, id: int) -> Optional[ParamsModel]: """获取配置管理型详情""" return await self.get(id=id) - async def get_obj_by_key_crud(self, key: str) -> Optional[ConfigModel]: + async def get_obj_by_key_crud(self, key: str) -> Optional[ParamsModel]: """根据key获取配置管理型详情""" - return await self.get(key=key) + return await self.get(config_key=key) - async def get_obj_list_crud(self, search: Dict = None, order_by: List[Dict[str, str]] = None) -> Sequence[ConfigModel]: + async def get_obj_list_crud(self, search: Dict = None, order_by: List[Dict[str, str]] = None) -> Sequence[ParamsModel]: """获取配置管理型列表""" return await self.list(search=search, order_by=order_by) - async def create_obj_crud(self, data: ConfigCreateSchema) -> Optional[ConfigModel]: - """创配置管理型""" + async def create_obj_crud(self, data: ParamsCreateSchema) -> Optional[ParamsModel]: + """创建配置管理型""" return await self.create(data=data) - async def update_obj_crud(self, id: int, data: ConfigUpdateSchema) -> Optional[ConfigModel]: + async def update_obj_crud(self, id: int, data: ParamsUpdateSchema) -> Optional[ParamsModel]: """更新配置管理型""" return await self.update(id=id, data=data) diff --git a/backend/app/api/v1/module_system/config/model.py b/backend/app/api/v1/module_system/params/model.py similarity index 95% rename from backend/app/api/v1/module_system/config/model.py rename to backend/app/api/v1/module_system/params/model.py index da836061..c432e5a7 100644 --- a/backend/app/api/v1/module_system/config/model.py +++ b/backend/app/api/v1/module_system/params/model.py @@ -7,7 +7,7 @@ from sqlalchemy.orm import Mapped, mapped_column from app.core.base_model import CreatorMixin -class ConfigModel(CreatorMixin): +class ParamsModel(CreatorMixin): """ 系统配置表 """ diff --git a/backend/app/api/v1/module_system/config/param.py b/backend/app/api/v1/module_system/params/param.py similarity index 98% rename from backend/app/api/v1/module_system/config/param.py rename to backend/app/api/v1/module_system/params/param.py index a15abd98..fe306829 100644 --- a/backend/app/api/v1/module_system/config/param.py +++ b/backend/app/api/v1/module_system/params/param.py @@ -6,7 +6,7 @@ from fastapi import Query from app.core.validator import DateTimeStr -class ConfigQueryParams: +class ParamsQueryParams: """配置管理查询参数""" def __init__( diff --git a/backend/app/api/v1/module_system/config/schema.py b/backend/app/api/v1/module_system/params/schema.py similarity index 64% rename from backend/app/api/v1/module_system/config/schema.py rename to backend/app/api/v1/module_system/params/schema.py index 5cd1ec6d..b26a607b 100644 --- a/backend/app/api/v1/module_system/config/schema.py +++ b/backend/app/api/v1/module_system/params/schema.py @@ -6,26 +6,27 @@ from pydantic import BaseModel, ConfigDict, Field from app.core.base_schema import BaseSchema -class ConfigCreateSchema(BaseModel): +class ParamsCreateSchema(BaseModel): """配置创建模型""" - config_name: str = Field(..., max_length=255, description="参数名称") - config_key: str = Field(..., max_length=255, description="参数键名") - config_value: str = Field(..., max_length=255, description="参数键值") - config_type: bool = Field(..., description="系统内置((True:是 False:否))") - description: Optional[str] = Field(default=None, max_length=255, description="描述") + config_name: str = Field(..., max_length=500, description="参数名称") + 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:停用)") + description: Optional[str] = Field(default=None, max_length=500, description="描述") -class ConfigUpdateSchema(ConfigCreateSchema): +class ParamsUpdateSchema(ParamsCreateSchema): """配置更新模型""" ... -class ConfigOutSchema(ConfigCreateSchema, BaseSchema): +class ParamsOutSchema(ParamsCreateSchema, BaseSchema): """配置响应模型""" model_config = ConfigDict(from_attributes=True) -class UpdataSystemConfigSchema(BaseModel): +class UpdateSystemParamsSchema(BaseModel): """更新系统配置""" sys_web_title: str = Field(description="网站标题") sys_web_description: str = Field(description="网站描述") diff --git a/backend/app/api/v1/module_system/config/service.py b/backend/app/api/v1/module_system/params/service.py similarity index 77% rename from backend/app/api/v1/module_system/config/service.py rename to backend/app/api/v1/module_system/params/service.py index c5c97475..fe3c300c 100644 --- a/backend/app/api/v1/module_system/config/service.py +++ b/backend/app/api/v1/module_system/params/service.py @@ -1,11 +1,10 @@ # -*- coding: utf-8 -*- import json -from typing import Any, Dict, List, Union +from typing import Any, Dict, List from redis.asyncio.client import Redis from fastapi import UploadFile -from sqlalchemy.ext.asyncio import AsyncSession from redis.asyncio.client import Redis from app.common.enums import RedisInitKeyConfig @@ -17,40 +16,55 @@ from app.core.base_schema import UploadResponseSchema from app.core.exceptions import CustomException from app.core.logger import logger from ..auth.schema import AuthSchema -from .param import ConfigQueryParams -from .schema import ConfigOutSchema, ConfigUpdateSchema, ConfigCreateSchema, UpdataSystemConfigSchema -from .crud import ConfigCRUD +from .param import ParamsQueryParams +from .schema import ParamsOutSchema, ParamsUpdateSchema, ParamsCreateSchema, UpdateSystemParamsSchema +from .crud import ParamsCRUD -class ConfigService: +class ParamsService: """ 配置管理模块服务层 """ @classmethod async def get_obj_detail_service(cls, auth: AuthSchema, id: int) -> Dict: - obj = await ConfigCRUD(auth).get_obj_by_id_crud(id=id) - return ConfigOutSchema.model_validate(obj).model_dump() + obj = await ParamsCRUD(auth).get_obj_by_id_crud(id=id) + return ParamsOutSchema.model_validate(obj).model_dump() + @classmethod + async def get_obj_by_key_service(cls, auth: AuthSchema, config_key: str) -> Dict: + """根据配置键获取配置详情""" + obj = await ParamsCRUD(auth).get_obj_by_key_crud(key=config_key) + if not obj: + raise CustomException(msg=f'配置键 {config_key} 不存在') + return ParamsOutSchema.model_validate(obj).model_dump() + + @classmethod + async def get_config_value_by_key_service(cls, auth: AuthSchema, config_key: str) -> str: + """根据配置键获取配置值""" + obj = await ParamsCRUD(auth).get_obj_by_key_crud(key=config_key) + if not obj: + raise CustomException(msg=f'配置键 {config_key} 不存在') + return obj.config_value @classmethod - async def get_obj_list_service(cls, auth: AuthSchema, search: ConfigQueryParams = None, order_by: List[Dict[str, str]] = None) -> List[Dict]: + async def get_obj_list_service(cls, auth: AuthSchema, search: ParamsQueryParams = None, order_by: List[Dict[str, str]] = None) -> List[Dict]: if order_by: order_by = eval(order_by) obj_list = None if search: - obj_list = await ConfigCRUD(auth).get_obj_list_crud(search=search.__dict__, order_by=order_by) + obj_list = await ParamsCRUD(auth).get_obj_list_crud(search=search.__dict__, order_by=order_by) else: - obj_list = await ConfigCRUD(auth).get_obj_list_crud() - return [ConfigOutSchema.model_validate(obj).model_dump() for obj in obj_list] + obj_list = await ParamsCRUD(auth).get_obj_list_crud() + return [ParamsOutSchema.model_validate(obj).model_dump() for obj in obj_list] @classmethod - async def create_obj_service(cls, auth: AuthSchema, redis: Redis, data: ConfigCreateSchema) -> Dict: - exist_obj = await ConfigCRUD(auth).get(config_key=data.config_key) + async def create_obj_service(cls, auth: AuthSchema, redis: Redis, data: ParamsCreateSchema) -> Dict: + exist_obj = await ParamsCRUD(auth).get(config_key=data.config_key) if exist_obj: raise CustomException(msg='创建失败,该配置key已存在') - obj = await ConfigCRUD(auth).create_obj_crud(data=data) + obj = await ParamsCRUD(auth).create_obj_crud(data=data) - new_obj_dict = ConfigOutSchema.model_validate(obj).model_dump() + new_obj_dict = ParamsOutSchema.model_validate(obj).model_dump() # 同步redis redis_key = f"{RedisInitKeyConfig.SYSTEM_CONFIG.key}:{data.config_key}" @@ -69,15 +83,15 @@ class ConfigService: return new_obj_dict @classmethod - async def update_obj_service(cls, auth: AuthSchema, redis: Redis, id:int, data: ConfigUpdateSchema) -> Dict: - exist_obj = await ConfigCRUD(auth).get_obj_by_id_crud(id=id) + async def update_obj_service(cls, auth: AuthSchema, redis: Redis, id:int, data: ParamsUpdateSchema) -> Dict: + exist_obj = await ParamsCRUD(auth).get_obj_by_id_crud(id=id) if not exist_obj: raise CustomException(msg='更新失败,该数系统配置不存在') if exist_obj.config_key != data.config_key: raise CustomException(msg='更新失败,系统配置key不允许修改') - new_obj = await ConfigCRUD(auth).update_obj_crud(id=id, data=data) - new_obj_dict = ConfigOutSchema.model_validate(new_obj).model_dump() + new_obj = await ParamsCRUD(auth).update_obj_crud(id=id, data=data) + new_obj_dict = ParamsOutSchema.model_validate(new_obj).model_dump() # 同步redis redis_key = f"{RedisInitKeyConfig.SYSTEM_CONFIG.key}:{new_obj.config_key}" @@ -101,7 +115,7 @@ class ConfigService: if len(ids) < 1: raise CustomException(msg='删除失败,删除对象不能为空') for id in ids: - exist_obj = await ConfigCRUD(auth).get_obj_by_id_crud(id=id) + exist_obj = await ParamsCRUD(auth).get_obj_by_id_crud(id=id) if not exist_obj: raise CustomException(msg='删除失败,该数据字典类型不存在') # 检查是否是否初始化类型 @@ -109,7 +123,7 @@ class ConfigService: # 如果有字典数据,不能删除 raise CustomException(msg=f'{exist_obj.config_name} 删除失败,系统初始化配置不可以删除') - await ConfigCRUD(auth).delete_obj_crud(ids=ids) + await ParamsCRUD(auth).delete_obj_crud(ids=ids) # 同步删除Redis缓存 redis_key = f"{RedisInitKeyConfig.SYSTEM_CONFIG.key}:{exist_obj.config_key}" try: @@ -163,14 +177,14 @@ class ConfigService: async with AsyncSessionLocal() as session: async with session.begin(): auth = AuthSchema(db=session) - config_obj = await ConfigCRUD(auth).get_obj_list_crud() + config_obj = await ParamsCRUD(auth).get_obj_list_crud() if not config_obj: raise CustomException(msg="系统配置不存在") try: # 保存到Redis并设置过期时间 for config in config_obj: redis_key = (f"{RedisInitKeyConfig.SYSTEM_CONFIG.key}:{config.config_key}") - config_obj_dict = ConfigOutSchema.model_validate(config).model_dump() + config_obj_dict = ParamsOutSchema.model_validate(config).model_dump() value = json.dumps(config_obj_dict, ensure_ascii=False) result = await RedisCURD(redis).set( key=redis_key, @@ -199,4 +213,4 @@ class ConfigService: logger.error(f"解析系统配置数据失败: {e}") continue - return configs + return configs \ No newline at end of file diff --git a/backend/app/scripts/data/system_param.json b/backend/app/scripts/data/system_param.json index 88661667..04d31c77 100644 --- a/backend/app/scripts/data/system_param.json +++ b/backend/app/scripts/data/system_param.json @@ -4,6 +4,7 @@ "config_key": "sys_web_title", "config_value": "FastAPI Vue3 Admin", "config_type": true, + "status": true, "description": "网站名称", "creator_id": 1 }, @@ -12,6 +13,7 @@ "config_key": "sys_web_description", "config_value": "FastAPI Vue3 Admin 是完全开源的权限管理系统", "config_type": true, + "status": true, "description": "网站描述", "creator_id": 1 }, @@ -20,6 +22,7 @@ "config_key": "sys_web_favicon", "config_value": "https://service.fastapiadmin.com/api/v1/static/image/favicon.png", "config_type": true, + "status": true, "description": "网页图标", "creator_id": 1 }, @@ -28,6 +31,7 @@ "config_key": "sys_web_logo", "config_value": "https://service.fastapiadmin.com/api/v1/static/image/logo.png", "config_type": true, + "status": true, "description": "网站Logo", "creator_id": 1 }, @@ -36,6 +40,7 @@ "config_key": "sys_login_background", "config_value": "https://service.fastapiadmin.com/api/v1/static/image/background.svg", "config_type": true, + "status": true, "description": "登录背景", "creator_id": 1 }, @@ -44,6 +49,7 @@ "config_key": "sys_web_copyright", "config_value": "Copyright © 2025-2026 service.fastapiadmin.com 版权所有", "config_type": true, + "status": true, "description": "版权信息", "creator_id": 1 }, @@ -52,6 +58,7 @@ "config_key": "sys_keep_record", "config_value": "陕ICP备2025069493号-1", "config_type": true, + "status": true, "description": "备案信息", "creator_id": 1 }, @@ -60,6 +67,7 @@ "config_key": "sys_help_doc", "config_value": "https://service.fastapiadmin.com", "config_type": true, + "status": true, "description": "帮助文档", "creator_id": 1 }, @@ -68,6 +76,7 @@ "config_key": "sys_web_privacy", "config_value": "https://github.com/1014TaoTao/fastapi_vue3_admin/blob/master/LICENSE", "config_type": true, + "status": true, "description": "隐私政策", "creator_id": 1 }, @@ -76,6 +85,7 @@ "config_key": "sys_web_clause", "config_value": "https://github.com/1014TaoTao/fastapi_vue3_admin/blob/master/LICENSE", "config_type": true, + "status": true, "description": "用户协议", "creator_id": 1 }, @@ -84,6 +94,7 @@ "config_key": "sys_git_code", "config_value": "https://github.com/1014TaoTao/fastapi_vue3_admin.git", "config_type": true, + "status": true, "description": "源码代码", "creator_id": 1 }, @@ -92,7 +103,98 @@ "config_key": "sys_web_version", "config_value": "2.0.0", "config_type": true, + "status": true, "description": "项目版本", "creator_id": 1 + }, + { + "config_name": "白名单接口", + "config_key": "white_api_list_path", + "config_value": "[\"/api/v1/system/auth/login\", \"/api/v1/system/auth/token/refresh\", \"/api/v1/system/auth/captcha/get\", \"/api/v1/system/auth/logout\", \"/api/v1/system/config/info\", \"/api/v1/system/user/current/info\", \"/api/v1/system/notice/available\"]", + "config_type": true, + "status": true, + "description": "演示模式白名单路径列表", + "creator_id": 1 + }, + { + "config_name": "黑名单接口", + "config_key": "black_api_list_path", + "config_value": "[\"/auth/login\"]", + "config_type": true, + "status": true, + "description": "演示模式黑名单路径列表", + "creator_id": 1 + }, + { + "config_name": "访问IP白名单", + "config_key": "ip_white_list", + "config_value": "[\"127.0.0.1\", \"117.10.167.220\", \"223.104.208.30\", \"42.80.102.171\"]", + "config_type": true, + "status": true, + "description": "演示模式IP白名单列表", + "creator_id": 1 + }, + { + "config_name": "权限认证白名单接口", + "config_key": "token_request_path_exclude", + "config_value": "[\"api/v1/auth/login\"]", + "config_type": true, + "status": true, + "description": "无需JWT认证的路径白名单", + "creator_id": 1 + }, + { + "config_name": "允许上传文件类型", + "config_key": "allowed_extensions", + "config_value": "[\".bmp\", \".gif\", \".jpg\", \".jpeg\", \".png\", \".ico\", \".svg\", \".csv\", \".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\", \".html\", \".htm\", \".txt\", \".pdf\", \".rar\", \".zip\", \".gz\", \".bz2\", \".mp4\", \".avi\", \".rmvb\"]", + "config_type": true, + "status": true, + "description": "允许上传的文件类型列表", + "creator_id": 1 + }, + { + "config_name": "最大文件上传大小", + "config_key": "max_file_size", + "config_value": "10485760", + "config_type": true, + "status": true, + "description": "最大文件上传大小(字节),默认10MB", + "creator_id": 1 + }, + { + "config_name": "操作日志记录开关", + "config_key": "operation_log_record", + "config_value": "True", + "config_type": true, + "status": true, + "description": "是否记录操作日志", + "creator_id": 1 + }, + { + "config_name": "操作日志记录方法", + "config_key": "operation_record_method", + "config_value": "[\"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\", \"OPTIONS\"]", + "config_type": true, + "status": true, + "description": "需要记录操作日志的HTTP方法列表", + "creator_id": 1 + }, + { + "config_name": "忽略操作日志函数", + "config_key": "ignore_operation_function", + "config_value": "[\"get_captcha_for_login\"]", + "config_type": true, + "status": true, + "description": "忽略记录操作日志的函数列表", + "creator_id": 1 + }, + { + "config_name": "演示模式启用", + "config_key": "demo_enable", + "config_value": "False", + "config_type": true, + "status": true, + "description": "是否开启演示模式", + "creator_id": 1 } -] +] \ No newline at end of file diff --git a/backend/app/scripts/initialize.py b/backend/app/scripts/initialize.py index cf9a00e7..5c5752e4 100644 --- a/backend/app/scripts/initialize.py +++ b/backend/app/scripts/initialize.py @@ -15,7 +15,7 @@ from app.api.v1.module_system.role.model import RoleModel, RoleDeptsModel, RoleM from app.api.v1.module_system.position.model import PositionModel from app.api.v1.module_system.dept.model import DeptModel from app.api.v1.module_system.menu.model import MenuModel -from app.api.v1.module_system.config.model import ConfigModel +from app.api.v1.module_system.params.model import ParamsModel from app.api.v1.module_system.dict.model import DictTypeModel, DictDataModel @@ -38,7 +38,7 @@ class InitializeData: # 岗位表(无外键依赖) PositionModel, # 基础表(无外键依赖) - ConfigModel, + ParamsModel, DictTypeModel, DictDataModel, # 关联表(依赖基础表) diff --git a/fastdocs/src/public/group.jpg b/fastdocs/src/public/group.jpg index f0312a8a..826fd1a2 100644 Binary files a/fastdocs/src/public/group.jpg and b/fastdocs/src/public/group.jpg differ diff --git a/frontend/src/api/system/config.ts b/frontend/src/api/system/params.ts similarity index 97% rename from frontend/src/api/system/config.ts rename to frontend/src/api/system/params.ts index c4c86adf..faa1034c 100644 --- a/frontend/src/api/system/config.ts +++ b/frontend/src/api/system/params.ts @@ -1,6 +1,6 @@ import request from "@/utils/request"; -const ConfigAPI = { +const ParamsAPI = { uploadFile(body: any) { return request>({ url: `/system/param/upload`, @@ -66,7 +66,7 @@ const ConfigAPI = { }, }; -export default ConfigAPI; +export default ParamsAPI; export interface ConfigPageQuery extends PageQuery { /** 配置名称 */ diff --git a/frontend/src/components/Upload/SingleImageUpload.vue b/frontend/src/components/Upload/SingleImageUpload.vue index 8e5bc4f4..270b21e1 100644 --- a/frontend/src/components/Upload/SingleImageUpload.vue +++ b/frontend/src/components/Upload/SingleImageUpload.vue @@ -35,7 +35,7 @@