Skip to content

Commit e77adde

Browse files
committed
add more code
1 parent 4d3bea7 commit e77adde

File tree

7 files changed

+153
-61
lines changed

7 files changed

+153
-61
lines changed

backend/app/admin/api/v1/sys/config.py

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,45 @@
44

55
from fastapi import APIRouter, Depends, Path, Query
66

7-
from backend.app.admin.schema.config import CreateConfigParam, UpdateConfigParam
7+
from backend.app.admin.schema.config import (
8+
CreateAnyConfigParam,
9+
GetAnyConfigListDetails,
10+
SaveConfigParam,
11+
UpdateAnyConfigParam,
12+
)
813
from backend.app.admin.service.config_service import config_service
14+
from backend.common.pagination import DependsPagination, paging_data
915
from backend.common.response.response_schema import ResponseModel, response_base
1016
from backend.common.security.jwt import DependsJwtAuth
1117
from backend.common.security.permission import RequestPermission
1218
from backend.common.security.rbac import DependsRBAC
19+
from backend.database.db_mysql import CurrentSession
1320

1421
router = APIRouter()
1522

1623

1724
@router.get('/website', summary='获取网站配置信息', dependencies=[DependsJwtAuth])
1825
async def get_website_config() -> ResponseModel:
19-
config = config_service.get_website()
26+
config = await config_service.get_website()
2027
return response_base.success(data=config)
2128

2229

2330
@router.post(
2431
'/website',
2532
summary='保存网站配置信息',
2633
dependencies=[
27-
Depends(RequestPermission('sys:config:add')),
34+
Depends(RequestPermission('sys:config:website:add')),
2835
DependsRBAC,
2936
],
3037
)
31-
async def save_website_config() -> ResponseModel:
32-
await config_service.save_website()
38+
async def save_website_config(obj: SaveConfigParam) -> ResponseModel:
39+
await config_service.save_website(obj)
3340
return response_base.success()
3441

3542

3643
@router.get('/protocol', summary='获取用户协议', dependencies=[DependsJwtAuth])
3744
async def get_protocol_config() -> ResponseModel:
38-
config = config_service.get_protocol()
45+
config = await config_service.get_protocol()
3946
return response_base.success(data=config)
4047

4148

@@ -47,14 +54,14 @@ async def get_protocol_config() -> ResponseModel:
4754
DependsRBAC,
4855
],
4956
)
50-
async def save_protocol_config() -> ResponseModel:
51-
await config_service.save_protocol()
57+
async def save_protocol_config(obj: SaveConfigParam) -> ResponseModel:
58+
await config_service.save_protocol(obj)
5259
return response_base.success()
5360

5461

5562
@router.get('/policy', summary='获取用户政策', dependencies=[DependsJwtAuth])
5663
async def get_policy_config() -> ResponseModel:
57-
config = config_service.get_policy()
64+
config = await config_service.get_policy()
5865
return response_base.success(data=config)
5966

6067

@@ -66,39 +73,57 @@ async def get_policy_config() -> ResponseModel:
6673
DependsRBAC,
6774
],
6875
)
69-
async def save_policy_config() -> ResponseModel:
70-
await config_service.save_policy()
76+
async def save_policy_config(obj: SaveConfigParam) -> ResponseModel:
77+
await config_service.save_policy(obj)
7178
return response_base.success()
7279

7380

74-
@router.get('/{pk}', summary='获取系统配置详情', dependencies=[DependsJwtAuth])
81+
@router.get('/{pk}', summary='获取系统参数配置详情', dependencies=[DependsJwtAuth])
7582
async def get_config(pk: Annotated[int, Path(...)]) -> ResponseModel:
7683
config = await config_service.get(pk)
7784
return response_base.success(data=config)
7885

7986

87+
@router.get(
88+
'',
89+
summary='(模糊条件)分页获取所有系统参数配置',
90+
dependencies=[
91+
DependsJwtAuth,
92+
DependsPagination,
93+
],
94+
)
95+
async def get_pagination_config(
96+
db: CurrentSession,
97+
name: Annotated[str | None, Query()] = None,
98+
type: Annotated[str | None, Query()] = None,
99+
) -> ResponseModel:
100+
config_select = await config_service.get_select(name=name, type=type)
101+
page_data = await paging_data(db, config_select, GetAnyConfigListDetails)
102+
return response_base.success(data=page_data)
103+
104+
80105
@router.post(
81106
'',
82-
summary='创建系统配置',
107+
summary='创建系统参数配置',
83108
dependencies=[
84109
Depends(RequestPermission('sys:config:add')),
85110
DependsRBAC,
86111
],
87112
)
88-
async def create_config(obj: CreateConfigParam) -> ResponseModel:
113+
async def create_config(obj: CreateAnyConfigParam) -> ResponseModel:
89114
await config_service.create(obj=obj)
90115
return response_base.success()
91116

92117

93118
@router.put(
94119
'/{pk}',
95-
summary='更新系统配置',
120+
summary='更新系统参数配置',
96121
dependencies=[
97122
Depends(RequestPermission('sys:config:edit')),
98123
DependsRBAC,
99124
],
100125
)
101-
async def update_config(pk: Annotated[int, Path(...)], obj: UpdateConfigParam) -> ResponseModel:
126+
async def update_config(pk: Annotated[int, Path(...)], obj: UpdateAnyConfigParam) -> ResponseModel:
102127
count = await config_service.update(pk=pk, obj=obj)
103128
if count > 0:
104129
return response_base.success()
@@ -107,7 +132,7 @@ async def update_config(pk: Annotated[int, Path(...)], obj: UpdateConfigParam) -
107132

108133
@router.delete(
109134
'',
110-
summary='(批量)删除系统配置',
135+
summary='(批量)删除系统参数配置',
111136
dependencies=[
112137
Depends(RequestPermission('sys:config:del')),
113138
DependsRBAC,

backend/app/admin/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class AdminSettings(BaseSettings):
3131
CAPTCHA_LOGIN_EXPIRE_SECONDS: int = 60 * 5 # 过期时间,单位:秒
3232

3333
# Config
34-
CONFIG_REDIS_KEY: str = 'fba:config'
34+
CONFIG_BUILT_IN_TYPES: list = ['website', 'protocol', 'policy']
3535

3636

3737
@lru_cache

backend/app/admin/crud/crud_config.py

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,62 @@
22
# -*- coding: utf-8 -*-
33
from typing import Sequence
44

5-
from sqlalchemy import select
5+
from sqlalchemy import Select
66
from sqlalchemy.ext.asyncio import AsyncSession
77
from sqlalchemy_crud_plus import CRUDPlus
88

9+
from backend.app.admin.conf import admin_settings
910
from backend.app.admin.model import Config
10-
from backend.app.admin.schema.config import CreateConfigParam, UpdateConfigParam
11+
from backend.app.admin.schema.config import CreateAnyConfigParam, UpdateAnyConfigParam
1112

1213

1314
class CRUDConfig(CRUDPlus[Config]):
14-
async def get_one(self, db: AsyncSession) -> Config | None:
15+
async def get(self, db: AsyncSession, pk: int) -> Config | None:
1516
"""
16-
获取 Config
17+
获取系统参数配置
1718
1819
:param db:
20+
:param pk:
21+
:return:
22+
"""
23+
return await self.select_model_by_column(db, id=pk, type__not_in=admin_settings.CONFIG_BUILT_IN_TYPES)
24+
25+
async def get_by_type(self, db: AsyncSession, type: str) -> Sequence[Config]:
26+
"""
27+
通过 type 获取系统配置参数
28+
29+
:param db:
30+
:param type:
1931
:return:
2032
"""
21-
query = await db.execute(select(self.model).limit(1))
22-
return query.scalars().first()
33+
return await self.select_models(db, type=type)
2334

24-
async def get_all(self, db: AsyncSession) -> Sequence[Config]:
35+
async def get_by_name(self, db: AsyncSession, name: str) -> Config | None:
2536
"""
26-
获取所有 Config
37+
通过 name 获取系统配置参数
2738
2839
:param db:
40+
:param name:
41+
:return:
42+
"""
43+
return await self.select_model_by_column(db, name=name, type__not_in=admin_settings.CONFIG_BUILT_IN_TYPES)
44+
45+
async def get_list(self, name: str = None, type: str = None) -> Select:
46+
"""
47+
获取系统参数配置列表
48+
49+
:param name:
50+
:param type:
2951
:return:
3052
"""
31-
return await self.select_models(db)
53+
filters = {'name__not_in': admin_settings.CONFIG_BUILT_IN_TYPES}
54+
if name is not None:
55+
filters.update(name__like=f'%{name}%')
56+
if type is not None:
57+
filters.update(type__like=f'%{type}%')
58+
return await self.select_order('created_time', 'desc', **filters)
3259

33-
async def create(self, db: AsyncSession, obj_in: CreateConfigParam) -> None:
60+
async def create(self, db: AsyncSession, obj_in: CreateAnyConfigParam) -> None:
3461
"""
3562
创建 Config
3663
@@ -40,7 +67,7 @@ async def create(self, db: AsyncSession, obj_in: CreateConfigParam) -> None:
4067
"""
4168
await self.create_model(db, obj_in)
4269

43-
async def update(self, db: AsyncSession, pk: int, obj_in: UpdateConfigParam) -> int:
70+
async def update(self, db: AsyncSession, pk: int, obj_in: UpdateAnyConfigParam) -> int:
4471
"""
4572
更新 Config
4673

backend/app/admin/model/sys_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Config(Base):
1515
id: Mapped[id_key] = mapped_column(init=False)
1616
name: Mapped[str] = mapped_column(String(20), comment='名称')
1717
type: Mapped[str | None] = mapped_column(String(20), server_default=None, comment='类型')
18-
key: Mapped[str] = mapped_column(String(50), comment='键名')
18+
key: Mapped[str] = mapped_column(String(50), unique=True, comment='键名')
1919
value: Mapped[str] = mapped_column(LONGTEXT, comment='键值')
2020
is_frontend: Mapped[str] = mapped_column(Boolean, default=False, comment='是否前端')
2121
remark: Mapped[str | None] = mapped_column(LONGTEXT, default=None, comment='备注')

backend/app/admin/schema/config.py

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,17 @@
77
from backend.common.schema import SchemaBase
88

99

10-
class ConfigSchemaBase(SchemaBase):
10+
class SaveConfigParam(SchemaBase):
1111
name: str
1212
key: str
1313
value: str
1414

1515

16-
class CreateConfigParam(ConfigSchemaBase):
17-
pass
18-
19-
20-
class UpdateConfigParam(ConfigSchemaBase):
21-
pass
22-
23-
24-
class GetConfigListDetails(ConfigSchemaBase):
25-
model_config = ConfigDict(from_attributes=True)
26-
27-
id: int
28-
created_time: datetime
29-
updated_time: datetime | None = None
30-
31-
32-
class AnyConfigSchemaBase(ConfigSchemaBase):
16+
class AnyConfigSchemaBase(SchemaBase):
17+
name: str
3318
type: str | None
19+
key: str
20+
value: str
3421
is_frontend: bool
3522
remark: str
3623

backend/app/admin/service/api_service.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ async def create(*, obj: CreateApiParam) -> None:
4141
@staticmethod
4242
async def update(*, pk: int, obj: UpdateApiParam) -> int:
4343
async with async_db_session.begin() as db:
44+
api = await api_dao.get(db, pk)
45+
if not api:
46+
raise errors.NotFoundError(msg='接口不存在')
4447
count = await api_dao.update(db, pk, obj)
4548
return count
4649

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,88 @@
11
#!/usr/bin/env python3
22
# -*- coding: utf-8 -*-
3+
from typing import Sequence
4+
5+
from sqlalchemy import Select
6+
7+
from backend.app.admin.conf import admin_settings
38
from backend.app.admin.crud.crud_config import config_dao
49
from backend.app.admin.model import Config
5-
from backend.app.admin.schema.config import CreateConfigParam, UpdateConfigParam
10+
from backend.app.admin.schema.config import (
11+
CreateAnyConfigParam,
12+
SaveConfigParam,
13+
UpdateAnyConfigParam,
14+
)
615
from backend.common.exception import errors
716
from backend.database.db_mysql import async_db_session
817

918

1019
class ConfigService:
1120
@staticmethod
12-
async def get() -> Config | dict:
21+
async def get_website() -> Sequence[Config]:
22+
async with async_db_session() as db:
23+
return await config_dao.get_by_type(db, 'website')
24+
25+
@staticmethod
26+
async def save_website(obj: SaveConfigParam):
27+
async with async_db_session.begin() as db:
28+
config = await config_dao.get_by_name(db, obj.name)
29+
if config is None:
30+
await config_dao.create_models()
31+
32+
@staticmethod
33+
async def get_protocol() -> Sequence[Config]:
34+
async with async_db_session() as db:
35+
return await config_dao.get_by_type(db, 'protocol')
36+
37+
@staticmethod
38+
async def save_protocol(obj: SaveConfigParam):
39+
pass
40+
41+
@staticmethod
42+
async def get_policy() -> Sequence[Config]:
1343
async with async_db_session() as db:
14-
config = await config_dao.get(db)
44+
return await config_dao.get_by_type(db, 'policy')
45+
46+
@staticmethod
47+
async def save_policy(obj: SaveConfigParam):
48+
pass
49+
50+
@staticmethod
51+
async def get(pk) -> Config | dict:
52+
async with async_db_session() as db:
53+
config = await config_dao.get(db, pk)
1554
if not config:
16-
raise errors.NotFoundError(msg='配置不存在')
55+
raise errors.NotFoundError(msg='参数配置不存在')
1756
return config
1857

1958
@staticmethod
20-
async def get_select(): ...
59+
async def get_select(*, name: str = None, type: str = None) -> Select:
60+
return await config_dao.get_list(name=name, type=type)
2161

2262
@staticmethod
23-
async def create(*, obj: CreateConfigParam) -> None:
24-
async with async_db_session.begin():
25-
...
63+
async def create(*, obj: CreateAnyConfigParam) -> None:
64+
async with async_db_session.begin() as db:
65+
config = await config_dao.get_by_name(db, obj.name)
66+
if config:
67+
raise errors.ForbiddenError(msg='参数配置已存在')
68+
if obj.type in admin_settings.CONFIG_BUILT_IN_TYPES:
69+
raise errors.ForbiddenError(msg='非法类型参数')
70+
await config_dao.create(db, obj)
2671

2772
@staticmethod
28-
async def update(*, pk: int, obj: UpdateConfigParam) -> int:
29-
async with async_db_session.begin():
30-
...
73+
async def update(*, pk: int, obj: UpdateAnyConfigParam) -> int:
74+
async with async_db_session.begin() as db:
75+
config = await config_dao.get(db, pk)
76+
if not config:
77+
raise errors.NotFoundError(msg='参数配置不存在')
78+
count = await config_dao.update(db, pk, obj)
79+
return count
3180

3281
@staticmethod
3382
async def delete(*, pk: list[int]) -> int:
34-
async with async_db_session.begin():
35-
...
83+
async with async_db_session.begin() as db:
84+
count = await config_dao.delete(db, pk)
85+
return count
3686

3787

3888
config_service: ConfigService = ConfigService()

0 commit comments

Comments
 (0)