From a5b6497db72e5f0d1b2de743577c7ad52a855538 Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Tue, 23 Jul 2024 19:46:45 +0800 Subject: [PATCH 1/7] Add page to display dynamic configuration --- backend/app/admin/api/v1/sys/config.py | 79 +++++++++++++++++++++ backend/app/admin/crud/crud_config.py | 66 +++++++++++++++++ backend/app/admin/model/__init__.py | 1 + backend/app/admin/model/sys_config.py | 28 ++++++++ backend/app/admin/schema/config.py | 32 +++++++++ backend/app/admin/service/config_service.py | 48 +++++++++++++ backend/templates/py/crud.jinja | 4 +- backend/templates/py/service.jinja | 4 +- 8 files changed, 258 insertions(+), 4 deletions(-) create mode 100644 backend/app/admin/api/v1/sys/config.py create mode 100644 backend/app/admin/crud/crud_config.py create mode 100644 backend/app/admin/model/sys_config.py create mode 100644 backend/app/admin/schema/config.py create mode 100644 backend/app/admin/service/config_service.py diff --git a/backend/app/admin/api/v1/sys/config.py b/backend/app/admin/api/v1/sys/config.py new file mode 100644 index 00000000..98799995 --- /dev/null +++ b/backend/app/admin/api/v1/sys/config.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from typing import Annotated + +from fastapi import APIRouter, Depends, Path, Query + +from backend.app.admin.schema.config import CreateConfigParam, GetConfigListDetails, UpdateConfigParam +from backend.app.admin.service.config_service import sys_config_service +from backend.common.pagination import DependsPagination, paging_data +from backend.common.response.response_schema import ResponseModel, response_base +from backend.common.security.jwt import DependsJwtAuth +from backend.common.security.permission import RequestPermission +from backend.common.security.rbac import DependsRBAC +from backend.database.db_mysql import CurrentSession + +router = APIRouter() + + +@router.get('/{pk}', summary='获取系统配置详情', dependencies=[DependsJwtAuth]) +async def get_sys_config(pk: Annotated[int, Path(...)]) -> ResponseModel: + sys_config = await sys_config_service.get(pk=pk) + return await response_base.success(data=sys_config) + + +@router.get( + '', + summary='(模糊条件)分页获取所有系统配置', + dependencies=[ + DependsJwtAuth, + DependsPagination, + ], +) +async def get_pagination_sys_config(db: CurrentSession) -> ResponseModel: + sys_config_select = await sys_config_service.get_select() + page_data = await paging_data(db, sys_config_select, GetConfigListDetails) + return await response_base.success(data=page_data) + + +@router.post( + '', + summary='创建系统配置', + dependencies=[ + Depends(RequestPermission('sys:gen:business:add')), + DependsRBAC, + ], +) +async def create_sys_config(obj: CreateConfigParam) -> ResponseModel: + await sys_config_service.create(obj=obj) + return await response_base.success() + + +@router.put( + '/{pk}', + summary='更新系统配置', + dependencies=[ + Depends(RequestPermission('sys:gen:business:edit')), + DependsRBAC, + ], +) +async def update_sys_config(pk: Annotated[int, Path(...)], obj: UpdateConfigParam) -> ResponseModel: + count = await sys_config_service.update(pk=pk, obj=obj) + if count > 0: + return await response_base.success() + return await response_base.fail() + + +@router.delete( + '', + summary='(批量)删除系统配置', + dependencies=[ + Depends(RequestPermission('sys:gen:business:del')), + DependsRBAC, + ], +) +async def delete_sys_config(pk: Annotated[list[int], Query(...)]) -> ResponseModel: + count = await sys_config_service.delete(pk=pk) + if count > 0: + return await response_base.success() + return await response_base.fail() diff --git a/backend/app/admin/crud/crud_config.py b/backend/app/admin/crud/crud_config.py new file mode 100644 index 00000000..cf7f780d --- /dev/null +++ b/backend/app/admin/crud/crud_config.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from typing import Sequence + +from sqlalchemy import delete +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy_crud_plus import CRUDPlus + +from backend.app.admin.model import Config +from backend.app.admin.schema.config import CreateConfigParam, UpdateConfigParam + + +class CRUDConfig(CRUDPlus[Config]): + async def get(self, db: AsyncSession, pk: int) -> Config | None: + """ + 获取 Config + + :param db: + :param pk: + :return: + """ + return await self.select_model_by_id(db, pk) + + async def get_all(self, db: AsyncSession) -> Sequence[Config]: + """ + 获取所有 Config + + :param db: + :return: + """ + return await self.select_models(db) + + async def create(self, db: AsyncSession, obj_in: CreateConfigParam) -> None: + """ + 创建 Config + + :param db: + :param obj_in: + :return: + """ + await self.create_model(db, obj_in) + + async def update(self, db: AsyncSession, pk: int, obj_in: UpdateConfigParam) -> int: + """ + 更新 Config + + :param db: + :param pk: + :param obj_in: + :return: + """ + return await self.update_model(db, pk, obj_in) + + async def delete(self, db: AsyncSession, pk: list[int]) -> int: + """ + 删除 Config + + :param db: + :param pk: + :return: + """ + sys_configs = await db.execute(delete(self.model).where(self.model.id.in_(pk))) + return sys_configs.rowcount + + +config_dao: CRUDConfig = CRUDConfig(Config) diff --git a/backend/app/admin/model/__init__.py b/backend/app/admin/model/__init__.py index fa2b0ccb..345990fd 100644 --- a/backend/app/admin/model/__init__.py +++ b/backend/app/admin/model/__init__.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- from backend.app.admin.model.sys_api import Api from backend.app.admin.model.sys_casbin_rule import CasbinRule +from backend.app.admin.model.sys_config import Config from backend.app.admin.model.sys_dept import Dept from backend.app.admin.model.sys_dict_data import DictData from backend.app.admin.model.sys_dict_type import DictType diff --git a/backend/app/admin/model/sys_config.py b/backend/app/admin/model/sys_config.py new file mode 100644 index 00000000..2da68102 --- /dev/null +++ b/backend/app/admin/model/sys_config.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from sqlalchemy import String +from sqlalchemy.dialects.mysql import LONGTEXT +from sqlalchemy.orm import Mapped, mapped_column + +from backend.common.model import Base, id_key + + +class Config(Base): + """系统配置表""" + + __tablename__ = 'sys_config' + + id: Mapped[id_key] = mapped_column(init=False) + login_title: Mapped[str] = mapped_column(String(20), default='登陆 FBA', comment='登陆页面标题') + login_sub_title: Mapped[str] = mapped_column( + String(50), default='fastapi_best_architecture', comment='登陆页面子标题' + ) + footer: Mapped[str] = mapped_column(String(50), default='FBA', comment='页脚标题') + logo: Mapped[str] = mapped_column(LONGTEXT, default='Arco', comment='Logo') + system_title: Mapped[str] = mapped_column(String(20), default='Arco', comment='系统标题') + system_comment: Mapped[str] = mapped_column( + LONGTEXT, + default='基于 FastAPI 构建的前后端分离 RBAC 权限控制系统,采用独特的伪三层架构模型设计,' + '内置 fastapi-admin 基本实现,并作为模板库免费开源', + comment='系统描述', + ) diff --git a/backend/app/admin/schema/config.py b/backend/app/admin/schema/config.py new file mode 100644 index 00000000..2c9abed5 --- /dev/null +++ b/backend/app/admin/schema/config.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from datetime import datetime + +from pydantic import ConfigDict + +from backend.common.schema import SchemaBase + + +class ConfigSchemaBase(SchemaBase): + login_title: str + login_sub_title: str + footer: str + system_logo: str + system_title: str + system_comment: str + + +class CreateConfigParam(ConfigSchemaBase): + pass + + +class UpdateConfigParam(ConfigSchemaBase): + pass + + +class GetConfigListDetails(ConfigSchemaBase): + model_config = ConfigDict(from_attributes=True) + + id: int + created_time: datetime + updated_time: datetime | None = None diff --git a/backend/app/admin/service/config_service.py b/backend/app/admin/service/config_service.py new file mode 100644 index 00000000..1c128296 --- /dev/null +++ b/backend/app/admin/service/config_service.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from typing import Sequence + +from backend.app.admin.crud.crud_config import config_dao +from backend.app.admin.model import Config +from backend.app.admin.schema.config import CreateConfigParam, UpdateConfigParam +from backend.common.exception import errors +from backend.database.db_mysql import async_db_session + + +class ConfigService: + @staticmethod + async def get(*, pk: int) -> Config: + async with async_db_session() as db: + sys_config = await config_dao.get(db, pk) + if not sys_config: + raise errors.NotFoundError(msg='接口不存在') + return sys_config + + @staticmethod + async def get_all() -> Sequence[Config]: + async with async_db_session() as db: + sys_configs = await config_dao.get_all(db) + return sys_configs + + @staticmethod + async def create(*, obj: CreateConfigParam) -> None: + async with async_db_session.begin() as db: + sys_config = await config_dao.get_by_name(db, obj.name) + if sys_config: + raise errors.ForbiddenError(msg='系统配置已存在') + await config_dao.create(db, obj) + + @staticmethod + async def update(*, pk: int, obj: UpdateConfigParam) -> int: + async with async_db_session.begin() as db: + count = await config_dao.update(db, pk, obj) + return count + + @staticmethod + async def delete(*, pk: list[int]) -> int: + async with async_db_session.begin() as db: + count = await config_dao.delete(db, pk) + return count + + +sys_config_service = ConfigService() diff --git a/backend/templates/py/crud.jinja b/backend/templates/py/crud.jinja index bd2bcc8d..c5e5fed0 100644 --- a/backend/templates/py/crud.jinja +++ b/backend/templates/py/crud.jinja @@ -21,7 +21,7 @@ class CRUD{{ table_name_class }}(CRUDPlus[{{ schema_name }}]): """ return await self.select_model_by_id(db, pk) - async def get_all(self, db: AsyncSession) -> Sequence[{{ schema_name }}]: + async def get_all(self, db: AsyncSession) -> Sequence[{{ table_name_class }}]: """ 获取所有 {{ schema_name }} @@ -63,4 +63,4 @@ class CRUD{{ table_name_class }}(CRUDPlus[{{ schema_name }}]): return {{ table_name_en }}s.rowcount -{{ table_name_en }}_dao: CRUD{{ schema_name }} = CRUD{{ schema_name }}({{ schema_name }}) +{{ table_name_en }}_dao: CRUD{{ table_name_class }} = CRUD{{ table_name_class }}({{ table_name_class }}) diff --git a/backend/templates/py/service.jinja b/backend/templates/py/service.jinja index 664c034f..b75d1bbe 100644 --- a/backend/templates/py/service.jinja +++ b/backend/templates/py/service.jinja @@ -9,7 +9,7 @@ from backend.common.exception import errors from backend.database.db_mysql import async_db_session -class {{ schema_name }}Service: +class {{ table_name_class }}Service: @staticmethod async def get(*, pk: int) -> {{ table_name_class }}: async with async_db_session() as db: @@ -45,4 +45,4 @@ class {{ schema_name }}Service: return count -{{ table_name_en }}_service = {{ schema_name }}Service() +{{ table_name_en }}_service = {{ table_name_class }}Service() From ec58e66a193c400b22280a78c16048b9defbdac9 Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Thu, 25 Jul 2024 04:16:03 +0800 Subject: [PATCH 2/7] update config data and api --- backend/app/admin/api/v1/sys/config.py | 44 +++++++-------------- backend/app/admin/conf.py | 3 ++ backend/app/admin/crud/crud_config.py | 12 +++--- backend/app/admin/schema/config.py | 17 ++++---- backend/app/admin/service/config_service.py | 38 ++++++++++-------- backend/templates/py/service.jinja | 2 +- backend/utils/gen_template.py | 2 +- 7 files changed, 57 insertions(+), 61 deletions(-) diff --git a/backend/app/admin/api/v1/sys/config.py b/backend/app/admin/api/v1/sys/config.py index 98799995..d04b9577 100644 --- a/backend/app/admin/api/v1/sys/config.py +++ b/backend/app/admin/api/v1/sys/config.py @@ -4,48 +4,32 @@ from fastapi import APIRouter, Depends, Path, Query -from backend.app.admin.schema.config import CreateConfigParam, GetConfigListDetails, UpdateConfigParam -from backend.app.admin.service.config_service import sys_config_service -from backend.common.pagination import DependsPagination, paging_data +from backend.app.admin.schema.config import CreateConfigParam, UpdateConfigParam +from backend.app.admin.service.config_service import config_service from backend.common.response.response_schema import ResponseModel, response_base from backend.common.security.jwt import DependsJwtAuth from backend.common.security.permission import RequestPermission from backend.common.security.rbac import DependsRBAC -from backend.database.db_mysql import CurrentSession router = APIRouter() @router.get('/{pk}', summary='获取系统配置详情', dependencies=[DependsJwtAuth]) -async def get_sys_config(pk: Annotated[int, Path(...)]) -> ResponseModel: - sys_config = await sys_config_service.get(pk=pk) - return await response_base.success(data=sys_config) - - -@router.get( - '', - summary='(模糊条件)分页获取所有系统配置', - dependencies=[ - DependsJwtAuth, - DependsPagination, - ], -) -async def get_pagination_sys_config(db: CurrentSession) -> ResponseModel: - sys_config_select = await sys_config_service.get_select() - page_data = await paging_data(db, sys_config_select, GetConfigListDetails) - return await response_base.success(data=page_data) +async def get_config(pk: Annotated[int, Path(...)]) -> ResponseModel: + config = await config_service.get(pk=pk) + return await response_base.success(data=config) @router.post( '', summary='创建系统配置', dependencies=[ - Depends(RequestPermission('sys:gen:business:add')), + Depends(RequestPermission('sys:config:add')), DependsRBAC, ], ) -async def create_sys_config(obj: CreateConfigParam) -> ResponseModel: - await sys_config_service.create(obj=obj) +async def create_config(obj: CreateConfigParam) -> ResponseModel: + await config_service.create(obj=obj) return await response_base.success() @@ -53,12 +37,12 @@ async def create_sys_config(obj: CreateConfigParam) -> ResponseModel: '/{pk}', summary='更新系统配置', dependencies=[ - Depends(RequestPermission('sys:gen:business:edit')), + Depends(RequestPermission('sys:config:edit')), DependsRBAC, ], ) -async def update_sys_config(pk: Annotated[int, Path(...)], obj: UpdateConfigParam) -> ResponseModel: - count = await sys_config_service.update(pk=pk, obj=obj) +async def update_config(pk: Annotated[int, Path(...)], obj: UpdateConfigParam) -> ResponseModel: + count = await config_service.update(pk=pk, obj=obj) if count > 0: return await response_base.success() return await response_base.fail() @@ -68,12 +52,12 @@ async def update_sys_config(pk: Annotated[int, Path(...)], obj: UpdateConfigPara '', summary='(批量)删除系统配置', dependencies=[ - Depends(RequestPermission('sys:gen:business:del')), + Depends(RequestPermission('sys:config:del')), DependsRBAC, ], ) -async def delete_sys_config(pk: Annotated[list[int], Query(...)]) -> ResponseModel: - count = await sys_config_service.delete(pk=pk) +async def delete_config(pk: Annotated[list[int], Query(...)]) -> ResponseModel: + count = await config_service.delete(pk=pk) if count > 0: return await response_base.success() return await response_base.fail() diff --git a/backend/app/admin/conf.py b/backend/app/admin/conf.py index 439902e1..8d19e9d7 100644 --- a/backend/app/admin/conf.py +++ b/backend/app/admin/conf.py @@ -30,6 +30,9 @@ class AdminSettings(BaseSettings): CAPTCHA_LOGIN_REDIS_PREFIX: str = 'fba_login_captcha' CAPTCHA_LOGIN_EXPIRE_SECONDS: int = 60 * 5 # 过期时间,单位:秒 + # Config + CONFIG_REDIS_KEY: str = 'fba_config' + @lru_cache def get_admin_settings() -> AdminSettings: diff --git a/backend/app/admin/crud/crud_config.py b/backend/app/admin/crud/crud_config.py index cf7f780d..92f041b7 100644 --- a/backend/app/admin/crud/crud_config.py +++ b/backend/app/admin/crud/crud_config.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- from typing import Sequence -from sqlalchemy import delete +from sqlalchemy import delete, select from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy_crud_plus import CRUDPlus @@ -11,15 +11,15 @@ class CRUDConfig(CRUDPlus[Config]): - async def get(self, db: AsyncSession, pk: int) -> Config | None: + async def get_one(self, db: AsyncSession) -> Config | None: """ 获取 Config :param db: - :param pk: :return: """ - return await self.select_model_by_id(db, pk) + query = await db.execute(select(self.model).limit(1)) + return query.scalars().first() async def get_all(self, db: AsyncSession) -> Sequence[Config]: """ @@ -59,8 +59,8 @@ async def delete(self, db: AsyncSession, pk: list[int]) -> int: :param pk: :return: """ - sys_configs = await db.execute(delete(self.model).where(self.model.id.in_(pk))) - return sys_configs.rowcount + configs = await db.execute(delete(self.model).where(self.model.id.in_(pk))) + return configs.rowcount config_dao: CRUDConfig = CRUDConfig(Config) diff --git a/backend/app/admin/schema/config.py b/backend/app/admin/schema/config.py index 2c9abed5..0d6eb061 100644 --- a/backend/app/admin/schema/config.py +++ b/backend/app/admin/schema/config.py @@ -2,18 +2,21 @@ # -*- coding: utf-8 -*- from datetime import datetime -from pydantic import ConfigDict +from pydantic import ConfigDict, Field from backend.common.schema import SchemaBase class ConfigSchemaBase(SchemaBase): - login_title: str - login_sub_title: str - footer: str - system_logo: str - system_title: str - system_comment: str + login_title: str = Field(default='登陆 FBA') + login_sub_title: str = Field(default='fastapi_best_architecture') + footer: str = Field(default='FBA') + system_logo: str = Field(default='Arco') + system_title: str = Field(default='Arco') + system_comment: str = Field( + default='基于 FastAPI 构建的前后端分离 RBAC 权限控制系统,采用独特的伪三层架构模型设计,' + '内置 fastapi-admin 基本实现,并作为模板库免费开源' + ) class CreateConfigParam(ConfigSchemaBase): diff --git a/backend/app/admin/service/config_service.py b/backend/app/admin/service/config_service.py index 1c128296..5e7d450b 100644 --- a/backend/app/admin/service/config_service.py +++ b/backend/app/admin/service/config_service.py @@ -1,48 +1,54 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from typing import Sequence - +from backend.app.admin.conf import admin_settings from backend.app.admin.crud.crud_config import config_dao from backend.app.admin.model import Config from backend.app.admin.schema.config import CreateConfigParam, UpdateConfigParam from backend.common.exception import errors from backend.database.db_mysql import async_db_session +from backend.database.db_redis import redis_client +from backend.utils.serializers import select_as_dict class ConfigService: @staticmethod - async def get(*, pk: int) -> Config: - async with async_db_session() as db: - sys_config = await config_dao.get(db, pk) - if not sys_config: - raise errors.NotFoundError(msg='接口不存在') - return sys_config - - @staticmethod - async def get_all() -> Sequence[Config]: + async def get() -> Config | dict: async with async_db_session() as db: - sys_configs = await config_dao.get_all(db) - return sys_configs + cache_config = await redis_client.hgetall(admin_settings.CONFIG_REDIS_KEY) + if not cache_config: + config = await config_dao.get_one(db) + if not config: + raise errors.NotFoundError(msg='系统配置不存在') + await redis_client.hset(admin_settings.CONFIG_REDIS_KEY, mapping=await select_as_dict(config)) + return config + else: + return cache_config @staticmethod async def create(*, obj: CreateConfigParam) -> None: async with async_db_session.begin() as db: - sys_config = await config_dao.get_by_name(db, obj.name) - if sys_config: + config = await config_dao.get_one(db) + if config: raise errors.ForbiddenError(msg='系统配置已存在') + await redis_client.hset(admin_settings.CONFIG_REDIS_KEY, mapping=await select_as_dict(config)) await config_dao.create(db, obj) @staticmethod async def update(*, pk: int, obj: UpdateConfigParam) -> int: async with async_db_session.begin() as db: count = await config_dao.update(db, pk, obj) + await redis_client.hset(admin_settings.CONFIG_REDIS_KEY, mapping=obj.model_dump()) return count @staticmethod async def delete(*, pk: list[int]) -> int: async with async_db_session.begin() as db: + configs = await config_dao.get_all(db) + if len(configs) == 1: + raise errors.ForbiddenError(msg='系统配置无法彻底删除') count = await config_dao.delete(db, pk) + await redis_client.delete(admin_settings.CONFIG_REDIS_KEY) return count -sys_config_service = ConfigService() +config_service = ConfigService() diff --git a/backend/templates/py/service.jinja b/backend/templates/py/service.jinja index b75d1bbe..e392041a 100644 --- a/backend/templates/py/service.jinja +++ b/backend/templates/py/service.jinja @@ -15,7 +15,7 @@ class {{ table_name_class }}Service: async with async_db_session() as db: {{ table_name_en }} = await {{ table_name_en }}_dao.get(db, pk) if not {{ table_name_en }}: - raise errors.NotFoundError(msg='接口不存在') + raise errors.NotFoundError(msg='{{ table_simple_name_zh }}不存在') return {{ table_name_en }} @staticmethod diff --git a/backend/utils/gen_template.py b/backend/utils/gen_template.py index 9efd5c46..90ceee24 100644 --- a/backend/utils/gen_template.py +++ b/backend/utils/gen_template.py @@ -80,7 +80,7 @@ def get_vars(business: GenBusiness, models: list[GenModel]) -> dict: 'table_comment': business.table_comment, 'schema_name': to_pascal(business.schema_name), 'have_datetime_column': business.have_datetime_column, - 'permission_sign': str(business.__tablename__.replace('_', ':')), + 'permission_sign': str(business.table_name_en.replace('_', ':')), 'models': models, } From 852b976e2c1d933bccbba92b0558b655469f972c Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Thu, 25 Jul 2024 04:18:55 +0800 Subject: [PATCH 3/7] add config route --- backend/app/admin/api/v1/sys/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/app/admin/api/v1/sys/__init__.py b/backend/app/admin/api/v1/sys/__init__.py index d757bf1a..00451851 100644 --- a/backend/app/admin/api/v1/sys/__init__.py +++ b/backend/app/admin/api/v1/sys/__init__.py @@ -4,6 +4,7 @@ from backend.app.admin.api.v1.sys.api import router as api_router from backend.app.admin.api.v1.sys.casbin import router as casbin_router +from backend.app.admin.api.v1.sys.config import router as config_router from backend.app.admin.api.v1.sys.dept import router as dept_router from backend.app.admin.api.v1.sys.dict_data import router as dict_data_router from backend.app.admin.api.v1.sys.dict_type import router as dict_type_router @@ -15,6 +16,7 @@ router.include_router(api_router, prefix='/apis', tags=['系统API']) router.include_router(casbin_router, prefix='/casbin', tags=['系统Casbin权限']) +router.include_router(config_router, prefix='/configs', tags=['系统配置']) router.include_router(dept_router, prefix='/depts', tags=['系统部门']) router.include_router(dict_data_router, prefix='/dict_datas', tags=['系统字典数据']) router.include_router(dict_type_router, prefix='/dict_types', tags=['系统字典类型']) From bf2a27545faa48d09d4d273c6f95599be2e01a9e Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Thu, 25 Jul 2024 04:20:22 +0800 Subject: [PATCH 4/7] update config api route --- backend/app/admin/api/v1/sys/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/admin/api/v1/sys/config.py b/backend/app/admin/api/v1/sys/config.py index d04b9577..2e4dd6c8 100644 --- a/backend/app/admin/api/v1/sys/config.py +++ b/backend/app/admin/api/v1/sys/config.py @@ -14,7 +14,7 @@ router = APIRouter() -@router.get('/{pk}', summary='获取系统配置详情', dependencies=[DependsJwtAuth]) +@router.get('', summary='获取系统配置详情', dependencies=[DependsJwtAuth]) async def get_config(pk: Annotated[int, Path(...)]) -> ResponseModel: config = await config_service.get(pk=pk) return await response_base.success(data=config) From 6430e3ba36150c34ca4cafe5727f6271e834d235 Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Thu, 25 Jul 2024 04:21:51 +0800 Subject: [PATCH 5/7] update config api route --- backend/app/admin/api/v1/sys/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/app/admin/api/v1/sys/config.py b/backend/app/admin/api/v1/sys/config.py index 2e4dd6c8..cf3cf95f 100644 --- a/backend/app/admin/api/v1/sys/config.py +++ b/backend/app/admin/api/v1/sys/config.py @@ -15,8 +15,8 @@ @router.get('', summary='获取系统配置详情', dependencies=[DependsJwtAuth]) -async def get_config(pk: Annotated[int, Path(...)]) -> ResponseModel: - config = await config_service.get(pk=pk) +async def get_config() -> ResponseModel: + config = await config_service.get() return await response_base.success(data=config) From dd29c99b424a8ce4ac2d63f0c3bcd8a8b348c2d8 Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Thu, 25 Jul 2024 04:25:15 +0800 Subject: [PATCH 6/7] fix config schema --- backend/app/admin/schema/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/admin/schema/config.py b/backend/app/admin/schema/config.py index 0d6eb061..f9439c09 100644 --- a/backend/app/admin/schema/config.py +++ b/backend/app/admin/schema/config.py @@ -11,7 +11,7 @@ class ConfigSchemaBase(SchemaBase): login_title: str = Field(default='登陆 FBA') login_sub_title: str = Field(default='fastapi_best_architecture') footer: str = Field(default='FBA') - system_logo: str = Field(default='Arco') + logo: str = Field(default='Arco') system_title: str = Field(default='Arco') system_comment: str = Field( default='基于 FastAPI 构建的前后端分离 RBAC 权限控制系统,采用独特的伪三层架构模型设计,' From 4255d828e988eb9f9226416488d54217706d5fd9 Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Thu, 25 Jul 2024 04:49:08 +0800 Subject: [PATCH 7/7] update config services --- backend/app/admin/service/config_service.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/app/admin/service/config_service.py b/backend/app/admin/service/config_service.py index 5e7d450b..070483c8 100644 --- a/backend/app/admin/service/config_service.py +++ b/backend/app/admin/service/config_service.py @@ -19,7 +19,10 @@ async def get() -> Config | dict: config = await config_dao.get_one(db) if not config: raise errors.NotFoundError(msg='系统配置不存在') - await redis_client.hset(admin_settings.CONFIG_REDIS_KEY, mapping=await select_as_dict(config)) + data_map = await select_as_dict(config) + del data_map['created_time'] + del data_map['updated_time'] + await redis_client.hset(admin_settings.CONFIG_REDIS_KEY, mapping=data_map) return config else: return cache_config @@ -30,8 +33,8 @@ async def create(*, obj: CreateConfigParam) -> None: config = await config_dao.get_one(db) if config: raise errors.ForbiddenError(msg='系统配置已存在') - await redis_client.hset(admin_settings.CONFIG_REDIS_KEY, mapping=await select_as_dict(config)) await config_dao.create(db, obj) + await redis_client.hset(admin_settings.CONFIG_REDIS_KEY, mapping=obj.model_dump()) @staticmethod async def update(*, pk: int, obj: UpdateConfigParam) -> int: