Skip to content

Commit c4f6e41

Browse files
insistencegitee-org
authored andcommitted
!13 Dash-FastAPI-Admin v1.0.7
Merge pull request !13 from insistence/develop
2 parents a3c7c94 + 7b82325 commit c4f6e41

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1199
-418
lines changed

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<p align="center">
22
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
33
</p>
4-
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Dash-FastAPI-Admin v1.0.6</h1>
4+
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Dash-FastAPI-Admin v1.0.7</h1>
55
<h4 align="center">基于Dash+FastAPI前后端分离的纯Python快速开发框架</h4>
66
<p align="center">
77
<a href="https://gitee.com/insistence2022/dash-fastapi-admin/stargazers"><img src="https://gitee.com/insistence2022/dash-fastapi-admin/badge/star.svg?theme=dark"></a>
8-
<a href="https://gitee.com/insistence2022/dash-fastapi-admin"><img src="https://img.shields.io/badge/DashFastAPIAdmin-v1.0.6-brightgreen.svg"></a>
8+
<a href="https://github.com/insistence/Dash-FastAPI-Admin"><img src="https://img.shields.io/github/stars/insistence/Dash-FastAPI-Admin?style=social"></a>
9+
<a href="https://gitee.com/insistence2022/dash-fastapi-admin"><img src="https://img.shields.io/badge/DashFastAPIAdmin-v1.0.7-brightgreen.svg"></a>
910
<a href="https://gitee.com/insistence2022/dash-fastapi-admin/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
1011
<img src="https://img.shields.io/badge/python-3.8 | 3.9-blue">
1112
<img src="https://img.shields.io/badge/MySQL-≥5.7-blue">
@@ -75,7 +76,11 @@ Dash-FastAPI-Admin是一套全部开源的快速开发平台,毫无保留给
7576
<td><img src="https://gitee.com/insistence2022/dash-fastapi-admin/raw/master/demo-pictures/%E7%BC%93%E5%AD%98%E7%9B%91%E6%8E%A7.png"/></td>
7677
</tr>
7778
<tr>
79+
<td><img src="https://gitee.com/insistence2022/dash-fastapi-admin/raw/master/demo-pictures/%E7%BC%93%E5%AD%98%E5%88%97%E8%A1%A8.png"></td>
7880
<td><img src="https://gitee.com/insistence2022/dash-fastapi-admin/raw/master/demo-pictures/%E7%B3%BB%E7%BB%9F%E6%8E%A5%E5%8F%A3.png"></td>
81+
</tr>
82+
<tr>
83+
<td><img src="https://gitee.com/insistence2022/dash-fastapi-admin/raw/master/demo-pictures/%E9%A6%96%E9%A1%B5.png"></td>
7984
<td><img src="https://gitee.com/insistence2022/dash-fastapi-admin/raw/master/demo-pictures/%E4%B8%AA%E4%BA%BA%E8%B5%84%E6%96%99.png"/></td>
8085
</tr>
8186
</table>

dash-fastapi-backend/app.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ async def auth_exception_handler(request: Request, exc: AuthException):
7171
return response_401(data=exc.data, message=exc.message)
7272

7373

74+
# 自定义权限检验异常
75+
@app.exception_handler(PermissionException)
76+
async def permission_exception_handler(request: Request, exc: PermissionException):
77+
return response_403(data=exc.data, message=exc.message)
78+
79+
7480
@app.exception_handler(HTTPException)
7581
async def http_exception_handler(request: Request, exc: HTTPException):
7682
return JSONResponse(
@@ -97,4 +103,4 @@ async def http_exception_handler(request: Request, exc: HTTPException):
97103
app.include_router(commonController, prefix="/common", tags=['通用模块'])
98104

99105
if __name__ == '__main__':
100-
uvicorn.run(app='app:app', host="127.0.0.1", port=9099, reload=True)
106+
uvicorn.run(app='app:app', host="0.0.0.0", port=9099, reload=True)
197 KB
Loading
-207 KB
Binary file not shown.

dash-fastapi-backend/config/database.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from sqlalchemy import create_engine
22
from sqlalchemy.ext.declarative import declarative_base
33
from sqlalchemy.orm import sessionmaker
4+
from urllib.parse import quote_plus
45
from config.env import DataBaseConfig
56

6-
SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{DataBaseConfig.USERNAME}:{DataBaseConfig.PASSWORD}@" \
7+
SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{DataBaseConfig.USERNAME}:{quote_plus(DataBaseConfig.PASSWORD)}@" \
78
f"{DataBaseConfig.HOST}:{DataBaseConfig.PORT}/{DataBaseConfig.DB}"
89

910
engine = create_engine(

dash-fastapi-backend/config/env.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,16 @@ class CachePathConfig:
3939
"""
4040
PATH = os.path.join(os.path.abspath(os.getcwd()), 'caches')
4141
PATHSTR = 'caches'
42+
43+
44+
class RedisInitKeyConfig:
45+
"""
46+
系统内置Redis键名
47+
"""
48+
ACCESS_TOKEN = {'key': 'access_token', 'remark': '登录令牌信息'}
49+
SYS_DICT = {'key': 'sys_dict', 'remark': '数据字典'}
50+
SYS_CONFIG = {'key': 'sys_config', 'remark': '配置信息'}
51+
CAPTCHA_CODES = {'key': 'captcha_codes', 'remark': '图片验证码'}
52+
ACCOUNT_LOCK = {'key': 'account_lock', 'remark': '用户锁定'}
53+
PASSWORD_ERROR_COUNT = {'key': 'password_error_count', 'remark': '密码错误次数'}
54+
SMS_CODE = {'key': 'sms_code', 'remark': '短信验证码'}

dash-fastapi-backend/module_admin/aspect/data_scope.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ class GetDataScope:
88
"""
99
获取当前用户数据权限对应的查询sql语句
1010
"""
11-
def __init__(self, query_alias: Optional[str] = '', db_alias: Optional[str] = 'db'):
11+
def __init__(self, query_alias: Optional[str] = '', db_alias: Optional[str] = 'db', user_alias: Optional[str] = 'user_id', dept_alias: Optional[str] = 'dept_id'):
1212
self.query_alias = query_alias
1313
self.db_alias = db_alias
14+
self.user_alias = user_alias
15+
self.dept_alias = dept_alias
1416

1517
def __call__(self, current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
1618
user_id = current_user.user.user_id
@@ -22,13 +24,13 @@ def __call__(self, current_user: CurrentUserInfoServiceResponse = Depends(get_cu
2224
if self.query_alias == '' or max_data_scope == 1 or user_id == 1:
2325
param_sql = '1 == 1'
2426
elif max_data_scope == 2:
25-
param_sql = f'{self.query_alias}.dept_id.in_({self.db_alias}.query(SysRoleDept.dept_id).filter(SysRoleDept.role_id == {max_role_id}))'
27+
param_sql = f"{self.query_alias}.{self.dept_alias}.in_({self.db_alias}.query(SysRoleDept.dept_id).filter(SysRoleDept.role_id == {max_role_id})) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1"
2628
elif max_data_scope == 3:
27-
param_sql = f'{self.query_alias}.dept_id == {dept_id}'
29+
param_sql = f"{self.query_alias}.{self.dept_alias} == {dept_id} if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1"
2830
elif max_data_scope == 4:
29-
param_sql = f'{self.query_alias}.dept_id.in_({self.db_alias}.query(SysDept.dept_id).filter(or_(SysDept.dept_id == {dept_id}, func.find_in_set({dept_id}, SysDept.ancestors))))'
31+
param_sql = f"{self.query_alias}.{self.dept_alias}.in_({self.db_alias}.query(SysDept.dept_id).filter(or_(SysDept.dept_id == {dept_id}, func.find_in_set({dept_id}, SysDept.ancestors)))) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1"
3032
elif max_data_scope == 5:
31-
param_sql = f'{self.query_alias}.user_id == {user_id}'
33+
param_sql = f"{self.query_alias}.{self.user_alias} == {user_id} if hasattr({self.query_alias}, '{self.user_alias}') else 1 == 1"
3234
else:
3335
param_sql = '1 == 0'
3436

dash-fastapi-backend/module_admin/aspect/interface_auth.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from fastapi import Depends
22
from module_admin.entity.vo.user_vo import CurrentUserInfoServiceResponse
33
from module_admin.service.login_service import get_current_user
4-
from utils.response_util import AuthException
4+
from utils.response_util import PermissionException
55

66

77
class CheckUserInterfaceAuth:
@@ -16,4 +16,4 @@ def __call__(self, current_user: CurrentUserInfoServiceResponse = Depends(get_cu
1616
user_auth_list.append('common')
1717
if self.perm_str in user_auth_list:
1818
return True
19-
raise AuthException(data="", message="该用户无此接口权限")
19+
raise PermissionException(data="", message="该用户无此接口权限")

dash-fastapi-backend/module_admin/controller/cache_controller.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,75 @@ async def get_monitor_cache_info(request: Request):
2020
except Exception as e:
2121
logger.exception(e)
2222
return response_500(data="", message=str(e))
23+
24+
25+
@cacheController.post("/getNames", response_model=List[CacheInfoModel], dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))])
26+
async def get_monitor_cache_name(request: Request):
27+
try:
28+
# 获取全量数据
29+
cache_name_list_result = CacheService.get_cache_monitor_cache_name_services()
30+
logger.info('获取成功')
31+
return response_200(data=cache_name_list_result, message="获取成功")
32+
except Exception as e:
33+
logger.exception(e)
34+
return response_500(data="", message=str(e))
35+
36+
37+
@cacheController.post("/getKeys/{cache_name}", response_model=List[str], dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))])
38+
async def get_monitor_cache_key(request: Request, cache_name: str):
39+
try:
40+
# 获取全量数据
41+
cache_key_list_result = await CacheService.get_cache_monitor_cache_key_services(request, cache_name)
42+
logger.info('获取成功')
43+
return response_200(data=cache_key_list_result, message="获取成功")
44+
except Exception as e:
45+
logger.exception(e)
46+
return response_500(data="", message=str(e))
47+
48+
49+
@cacheController.post("/getValue/{cache_name}/{cache_key}", response_model=CacheInfoModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))])
50+
async def get_monitor_cache_value(request: Request, cache_name: str, cache_key: str):
51+
try:
52+
# 获取全量数据
53+
cache_value_list_result = await CacheService.get_cache_monitor_cache_value_services(request, cache_name, cache_key)
54+
logger.info('获取成功')
55+
return response_200(data=cache_value_list_result, message="获取成功")
56+
except Exception as e:
57+
logger.exception(e)
58+
return response_500(data="", message=str(e))
59+
60+
61+
@cacheController.post("/clearCacheName/{cache_name}", response_model=CrudCacheResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))])
62+
async def clear_monitor_cache_name(request: Request, cache_name: str):
63+
try:
64+
clear_cache_name_result = await CacheService.clear_cache_monitor_cache_name_services(request, cache_name)
65+
if clear_cache_name_result.is_success:
66+
logger.info(clear_cache_name_result.message)
67+
return response_200(data=clear_cache_name_result, message=clear_cache_name_result.message)
68+
except Exception as e:
69+
logger.exception(e)
70+
return response_500(data="", message=str(e))
71+
72+
73+
@cacheController.post("/clearCacheKey/{cache_name}/{cache_key}", response_model=CrudCacheResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))])
74+
async def clear_monitor_cache_key(request: Request, cache_name: str, cache_key: str):
75+
try:
76+
clear_cache_key_result = await CacheService.clear_cache_monitor_cache_key_services(request, cache_name, cache_key)
77+
if clear_cache_key_result.is_success:
78+
logger.info(clear_cache_key_result.message)
79+
return response_200(data=clear_cache_key_result, message=clear_cache_key_result.message)
80+
except Exception as e:
81+
logger.exception(e)
82+
return response_500(data="", message=str(e))
83+
84+
85+
@cacheController.post("/clearCacheAll", response_model=CrudCacheResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:cache:list'))])
86+
async def clear_monitor_cache_all(request: Request):
87+
try:
88+
clear_cache_all_result = await CacheService.clear_cache_monitor_all_services(request)
89+
if clear_cache_all_result.is_success:
90+
logger.info(clear_cache_all_result.message)
91+
return response_200(data=clear_cache_all_result, message=clear_cache_all_result.message)
92+
except Exception as e:
93+
logger.exception(e)
94+
return response_500(data="", message=str(e))

0 commit comments

Comments
 (0)