From 9275aee9e97d70da373705307a9047afc03cf964 Mon Sep 17 00:00:00 2001
From: insistence <3055204202@qq.com>
Date: Wed, 26 Jun 2024 21:37:17 +0800
Subject: [PATCH 001/247] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=90=84?=
=?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE=E6=97=B6?=
=?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4=E8=AE=B0=E5=BD=95=E5=BC=82?=
=?UTF-8?q?=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../module_admin/controller/config_controller.py | 2 ++
.../module_admin/controller/dept_controller.py | 2 ++
.../module_admin/controller/dict_controller.py | 4 ++++
.../module_admin/controller/job_controller.py | 2 ++
.../module_admin/controller/menu_controller.py | 2 ++
.../module_admin/controller/notice_controller.py | 2 ++
.../module_admin/controller/post_controler.py | 2 ++
.../module_admin/controller/role_controller.py | 2 ++
.../module_admin/controller/user_controller.py | 2 ++
dash-fastapi-backend/module_admin/service/user_service.py | 7 +++++--
10 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/dash-fastapi-backend/module_admin/controller/config_controller.py b/dash-fastapi-backend/module_admin/controller/config_controller.py
index a8286e6..a146fcf 100644
--- a/dash-fastapi-backend/module_admin/controller/config_controller.py
+++ b/dash-fastapi-backend/module_admin/controller/config_controller.py
@@ -35,7 +35,9 @@ async def get_system_config_list(request: Request, config_page_query: ConfigPage
async def add_system_config(request: Request, add_config: ConfigModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
try:
add_config.create_by = current_user.user.user_name
+ add_config.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_config.update_by = current_user.user.user_name
+ add_config.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_config_result = await ConfigService.add_config_services(request, query_db, add_config)
if add_config_result.is_success:
logger.info(add_config_result.message)
diff --git a/dash-fastapi-backend/module_admin/controller/dept_controller.py b/dash-fastapi-backend/module_admin/controller/dept_controller.py
index b51aff6..6b0171f 100644
--- a/dash-fastapi-backend/module_admin/controller/dept_controller.py
+++ b/dash-fastapi-backend/module_admin/controller/dept_controller.py
@@ -53,7 +53,9 @@ async def get_system_dept_list(request: Request, dept_query: DeptModel, query_db
async def add_system_dept(request: Request, add_dept: DeptModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
try:
add_dept.create_by = current_user.user.user_name
+ add_dept.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_dept.update_by = current_user.user.user_name
+ add_dept.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_dept_result = DeptService.add_dept_services(query_db, add_dept)
if add_dept_result.is_success:
logger.info(add_dept_result.message)
diff --git a/dash-fastapi-backend/module_admin/controller/dict_controller.py b/dash-fastapi-backend/module_admin/controller/dict_controller.py
index dcb0906..293f8e3 100644
--- a/dash-fastapi-backend/module_admin/controller/dict_controller.py
+++ b/dash-fastapi-backend/module_admin/controller/dict_controller.py
@@ -46,7 +46,9 @@ async def get_system_all_dict_type(request: Request, dict_type_query: DictTypeQu
async def add_system_dict_type(request: Request, add_dict_type: DictTypeModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
try:
add_dict_type.create_by = current_user.user.user_name
+ add_dict_type.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_dict_type.update_by = current_user.user.user_name
+ add_dict_type.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_dict_type_result = await DictTypeService.add_dict_type_services(request, query_db, add_dict_type)
if add_dict_type_result.is_success:
logger.info(add_dict_type_result.message)
@@ -166,7 +168,9 @@ async def query_system_dict_data_list(request: Request, dict_type: str, query_db
async def add_system_dict_data(request: Request, add_dict_data: DictDataModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
try:
add_dict_data.create_by = current_user.user.user_name
+ add_dict_data.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_dict_data.update_by = current_user.user.user_name
+ add_dict_data.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_dict_data_result = await DictDataService.add_dict_data_services(request, query_db, add_dict_data)
if add_dict_data_result.is_success:
logger.info(add_dict_data_result.message)
diff --git a/dash-fastapi-backend/module_admin/controller/job_controller.py b/dash-fastapi-backend/module_admin/controller/job_controller.py
index adf7ec5..a2dc90c 100644
--- a/dash-fastapi-backend/module_admin/controller/job_controller.py
+++ b/dash-fastapi-backend/module_admin/controller/job_controller.py
@@ -36,7 +36,9 @@ async def get_system_job_list(request: Request, job_page_query: JobPageObject, q
async def add_system_job(request: Request, add_job: JobModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
try:
add_job.create_by = current_user.user.user_name
+ add_job.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_job.update_by = current_user.user.user_name
+ add_job.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_job_result = JobService.add_job_services(query_db, add_job)
if add_job_result.is_success:
logger.info(add_job_result.message)
diff --git a/dash-fastapi-backend/module_admin/controller/menu_controller.py b/dash-fastapi-backend/module_admin/controller/menu_controller.py
index 51c1322..c2630d8 100644
--- a/dash-fastapi-backend/module_admin/controller/menu_controller.py
+++ b/dash-fastapi-backend/module_admin/controller/menu_controller.py
@@ -52,7 +52,9 @@ async def get_system_menu_list(request: Request, menu_query: MenuModel, query_db
async def add_system_menu(request: Request, add_menu: MenuModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
try:
add_menu.create_by = current_user.user.user_name
+ add_menu.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_menu.update_by = current_user.user.user_name
+ add_menu.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_menu_result = MenuService.add_menu_services(query_db, add_menu)
if add_menu_result.is_success:
logger.info(add_menu_result.message)
diff --git a/dash-fastapi-backend/module_admin/controller/notice_controller.py b/dash-fastapi-backend/module_admin/controller/notice_controller.py
index cbda2de..f23c625 100644
--- a/dash-fastapi-backend/module_admin/controller/notice_controller.py
+++ b/dash-fastapi-backend/module_admin/controller/notice_controller.py
@@ -34,7 +34,9 @@ async def get_system_notice_list(request: Request, notice_page_query: NoticePage
async def add_system_notice(request: Request, add_notice: NoticeModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
try:
add_notice.create_by = current_user.user.user_name
+ add_notice.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_notice.update_by = current_user.user.user_name
+ add_notice.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_notice_result = NoticeService.add_notice_services(query_db, add_notice)
if add_notice_result.is_success:
logger.info(add_notice_result.message)
diff --git a/dash-fastapi-backend/module_admin/controller/post_controler.py b/dash-fastapi-backend/module_admin/controller/post_controler.py
index e917826..33180db 100644
--- a/dash-fastapi-backend/module_admin/controller/post_controler.py
+++ b/dash-fastapi-backend/module_admin/controller/post_controler.py
@@ -46,7 +46,9 @@ async def get_system_post_list(request: Request, post_page_query: PostPageObject
async def add_system_post(request: Request, add_post: PostModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
try:
add_post.create_by = current_user.user.user_name
+ add_post.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_post.update_by = current_user.user.user_name
+ add_post.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_post_result = PostService.add_post_services(query_db, add_post)
if add_post_result.is_success:
logger.info(add_post_result.message)
diff --git a/dash-fastapi-backend/module_admin/controller/role_controller.py b/dash-fastapi-backend/module_admin/controller/role_controller.py
index 55e68fd..e43e841 100644
--- a/dash-fastapi-backend/module_admin/controller/role_controller.py
+++ b/dash-fastapi-backend/module_admin/controller/role_controller.py
@@ -46,7 +46,9 @@ async def get_system_role_list(request: Request, role_page_query: RolePageObject
async def add_system_role(request: Request, add_role: AddRoleModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
try:
add_role.create_by = current_user.user.user_name
+ add_role.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_role.update_by = current_user.user.user_name
+ add_role.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_role_result = RoleService.add_role_services(query_db, add_role)
if add_role_result.is_success:
logger.info(add_role_result.message)
diff --git a/dash-fastapi-backend/module_admin/controller/user_controller.py b/dash-fastapi-backend/module_admin/controller/user_controller.py
index 27bc11b..c14d4d2 100644
--- a/dash-fastapi-backend/module_admin/controller/user_controller.py
+++ b/dash-fastapi-backend/module_admin/controller/user_controller.py
@@ -39,7 +39,9 @@ async def add_system_user(request: Request, add_user: AddUserModel, query_db: Se
try:
add_user.password = PwdUtil.get_password_hash(add_user.password)
add_user.create_by = current_user.user.user_name
+ add_user.create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_user.update_by = current_user.user.user_name
+ add_user.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
add_user_result = UserService.add_user_services(query_db, add_user)
if add_user_result.is_success:
logger.info(add_user_result.message)
diff --git a/dash-fastapi-backend/module_admin/service/user_service.py b/dash-fastapi-backend/module_admin/service/user_service.py
index eef7ed4..c0baa8d 100644
--- a/dash-fastapi-backend/module_admin/service/user_service.py
+++ b/dash-fastapi-backend/module_admin/service/user_service.py
@@ -221,7 +221,9 @@ def batch_import_user_services(cls, result_db: Session, user_import: ImportUserM
sex=row['sex'],
status=row['status'],
create_by=current_user.user.user_name,
- update_by=current_user.user.user_name
+ create_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
+ update_by=current_user.user.user_name,
+ update_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
)
)
user_info = UserDao.get_user_by_info(result_db, UserModel(**dict(user_name=row['user_name'])))
@@ -237,7 +239,8 @@ def batch_import_user_services(cls, result_db: Session, user_import: ImportUserM
phonenumber=row['phonenumber'],
sex=row['sex'],
status=row['status'],
- update_by=current_user.user.user_name
+ update_by=current_user.user.user_name,
+ update_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
)
).dict(exclude_unset=True)
UserDao.edit_user_dao(result_db, edit_user)
From b68a3a99f858161a61aa7eec31daf0fb56bea2ac Mon Sep 17 00:00:00 2001
From: insistence <3055204202@qq.com>
Date: Fri, 28 Jun 2024 15:06:28 +0800
Subject: [PATCH 002/247] =?UTF-8?q?chore:=20=E5=8D=87=E7=BA=A7=E7=89=88?=
=?UTF-8?q?=E6=9C=AC=E8=87=B31.4.2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
dash-fastapi-backend/.env.dev | 2 +-
dash-fastapi-backend/.env.prod | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dash-fastapi-backend/.env.dev b/dash-fastapi-backend/.env.dev
index 27b925e..840a1ab 100644
--- a/dash-fastapi-backend/.env.dev
+++ b/dash-fastapi-backend/.env.dev
@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
# 应用端口
APP_PORT = 9099
# 应用版本
-APP_VERSION= '1.4.1'
+APP_VERSION= '1.4.2'
# 应用是否开启热重载
APP_RELOAD = true
# 应用是否开启IP归属区域查询
diff --git a/dash-fastapi-backend/.env.prod b/dash-fastapi-backend/.env.prod
index f73763c..ea8f2b6 100644
--- a/dash-fastapi-backend/.env.prod
+++ b/dash-fastapi-backend/.env.prod
@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
# 应用端口
APP_PORT = 9099
# 应用版本
-APP_VERSION= '1.4.1'
+APP_VERSION= '1.4.2'
# 应用是否开启热重载
APP_RELOAD = false
# 应用是否开启IP归属区域查询
From 36d916612702c2aaa9959e141422d171640fe643 Mon Sep 17 00:00:00 2001
From: insistence <3055204202@qq.com>
Date: Fri, 28 Jun 2024 15:07:18 +0800
Subject: [PATCH 003/247] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0README?=
=?UTF-8?q?=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 35d5ebc..85cc90c 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,12 @@
-Dash-FastAPI-Admin v1.4.1
+Dash-FastAPI-Admin v1.4.2
基于Dash+FastAPI前后端分离的纯Python快速开发框架
-
+
@@ -18,6 +18,7 @@
+
## 平台简介
Dash-FastAPI-Admin是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
From f9380c6330ac9dade261b5698b09d85ea49eb5a8 Mon Sep 17 00:00:00 2001
From: insistence <3055204202@qq.com>
Date: Wed, 28 Aug 2024 16:59:38 +0800
Subject: [PATCH 004/247] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=962.0.?=
=?UTF-8?q?0=E7=89=88=E6=9C=AC=E5=90=8E=E7=AB=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
dash-fastapi-backend/.env.dev | 2 +-
dash-fastapi-backend/.env.prod | 4 +-
dash-fastapi-backend/app.py | 107 +-
.../caches/avatar/admin/admin_avatar.jpeg | Bin 201942 -> 0 bytes
.../caches/avatar/ry/ry_avatar.jpeg | Bin 216574 -> 0 bytes
dash-fastapi-backend/config/constant.py | 152 ++
dash-fastapi-backend/config/database.py | 26 +-
dash-fastapi-backend/config/enums.py | 51 +
dash-fastapi-backend/config/env.py | 84 +-
dash-fastapi-backend/config/get_db.py | 21 +-
dash-fastapi-backend/config/get_redis.py | 42 +-
dash-fastapi-backend/config/get_scheduler.py | 178 +-
dash-fastapi-backend/exceptions/exception.py | 58 +
dash-fastapi-backend/exceptions/handle.py | 71 +
.../middlewares/cors_middleware.py | 25 +
.../middlewares/gzip_middleware.py | 12 +
dash-fastapi-backend/middlewares/handle.py | 13 +
.../module_admin/annotation/log_annotation.py | 322 +++-
.../annotation/pydantic_annotation.py | 81 +
.../module_admin/aspect/data_scope.py | 78 +-
.../module_admin/aspect/interface_auth.py | 41 +-
.../controller/cache_controller.py | 145 +-
.../controller/captcha_controller.py | 49 +-
.../controller/common_controller.py | 109 +-
.../controller/config_controller.py | 244 ++-
.../controller/dept_controller.py | 243 +--
.../controller/dict_controller.py | 477 +++---
.../module_admin/controller/job_controller.py | 388 +++--
.../module_admin/controller/log_controller.py | 310 ++--
.../controller/login_controller.py | 249 +--
.../controller/menu_controller.py | 222 +--
.../controller/notice_controller.py | 179 +-
.../controller/online_controller.py | 95 +-
.../module_admin/controller/post_controler.py | 221 ++-
.../controller/role_controller.py | 479 +++---
.../controller/server_controller.py | 31 +-
.../controller/user_controller.py | 662 ++++----
.../module_admin/dao/config_dao.py | 99 +-
.../module_admin/dao/dept_dao.py | 295 ++--
.../module_admin/dao/dict_dao.py | 207 ++-
.../module_admin/dao/job_dao.py | 92 +-
.../module_admin/dao/job_log_dao.py | 70 +-
.../module_admin/dao/log_dao.py | 163 +-
.../module_admin/dao/login_dao.py | 26 +-
.../module_admin/dao/menu_dao.py | 241 +--
.../module_admin/dao/notice_dao.py | 92 +-
.../module_admin/dao/post_dao.py | 117 +-
.../module_admin/dao/role_dao.py | 287 +++-
.../module_admin/dao/user_dao.py | 610 ++++---
.../module_admin/entity/do/config_do.py | 7 +-
.../module_admin/entity/do/dept_do.py | 5 +-
.../module_admin/entity/do/dict_do.py | 10 +-
.../module_admin/entity/do/job_do.py | 33 +-
.../module_admin/entity/do/log_do.py | 10 +-
.../module_admin/entity/do/menu_do.py | 6 +-
.../module_admin/entity/do/notice_do.py | 5 +-
.../module_admin/entity/do/post_do.py | 5 +-
.../module_admin/entity/do/role_do.py | 13 +-
.../module_admin/entity/do/user_do.py | 7 +-
.../module_admin/entity/vo/cache_vo.py | 29 +-
.../module_admin/entity/vo/common_vo.py | 26 +
.../module_admin/entity/vo/config_vo.py | 84 +-
.../module_admin/entity/vo/dept_vo.py | 88 +-
.../module_admin/entity/vo/dict_vo.py | 168 +-
.../module_admin/entity/vo/job_vo.py | 158 +-
.../module_admin/entity/vo/log_vo.py | 158 +-
.../module_admin/entity/vo/login_vo.py | 92 +-
.../module_admin/entity/vo/menu_vo.py | 125 +-
.../module_admin/entity/vo/notice_vo.py | 77 +-
.../module_admin/entity/vo/online_vo.py | 54 +-
.../module_admin/entity/vo/post_vo.py | 76 +-
.../module_admin/entity/vo/role_vo.py | 177 +-
.../module_admin/entity/vo/server_vo.py | 80 +-
.../module_admin/entity/vo/user_vo.py | 359 ++---
.../module_admin/service/cache_service.py | 66 +-
.../module_admin/service/captcha_service.py | 16 +-
.../module_admin/service/common_service.py | 87 +-
.../module_admin/service/config_service.py | 215 ++-
.../module_admin/service/dept_service.py | 306 ++--
.../module_admin/service/dict_service.py | 434 +++--
.../module_admin/service/job_log_service.py | 144 +-
.../module_admin/service/job_service.py | 249 ++-
.../module_admin/service/log_service.py | 264 +--
.../module_admin/service/login_service.py | 876 ++++++----
.../module_admin/service/menu_service.py | 241 +--
.../module_admin/service/notice_service.py | 127 +-
.../module_admin/service/online_service.py | 43 +-
.../module_admin/service/post_service.py | 187 ++-
.../module_admin/service/role_service.py | 370 +++--
.../module_admin/service/server_service.py | 77 +-
.../module_admin/service/user_service.py | 716 +++++---
dash-fastapi-backend/module_task/__init__.py | 2 +-
.../module_task/scheduler_test.py | 2 +-
dash-fastapi-backend/ruff.toml | 4 +
dash-fastapi-backend/server.py | 83 +
dash-fastapi-backend/sql/dash-fastapi.sql | 1433 ++++++++---------
.../sub_applications/handle.py | 10 +
.../sub_applications/staticfiles.py | 10 +
dash-fastapi-backend/utils/common_util.py | 137 +-
dash-fastapi-backend/utils/cron_util.py | 172 ++
dash-fastapi-backend/utils/log_util.py | 2 +-
dash-fastapi-backend/utils/message_util.py | 2 +-
dash-fastapi-backend/utils/page_util.py | 130 +-
dash-fastapi-backend/utils/pwd_util.py | 4 +-
dash-fastapi-backend/utils/response_util.py | 293 ++--
dash-fastapi-backend/utils/string_util.py | 101 ++
.../utils/time_format_util.py | 1 +
dash-fastapi-backend/utils/upload_util.py | 105 ++
108 files changed, 10030 insertions(+), 6501 deletions(-)
delete mode 100644 dash-fastapi-backend/caches/avatar/admin/admin_avatar.jpeg
delete mode 100644 dash-fastapi-backend/caches/avatar/ry/ry_avatar.jpeg
create mode 100644 dash-fastapi-backend/config/constant.py
create mode 100644 dash-fastapi-backend/config/enums.py
create mode 100644 dash-fastapi-backend/exceptions/exception.py
create mode 100644 dash-fastapi-backend/exceptions/handle.py
create mode 100644 dash-fastapi-backend/middlewares/cors_middleware.py
create mode 100644 dash-fastapi-backend/middlewares/gzip_middleware.py
create mode 100644 dash-fastapi-backend/middlewares/handle.py
create mode 100644 dash-fastapi-backend/module_admin/annotation/pydantic_annotation.py
create mode 100644 dash-fastapi-backend/module_admin/entity/vo/common_vo.py
create mode 100644 dash-fastapi-backend/ruff.toml
create mode 100644 dash-fastapi-backend/server.py
create mode 100644 dash-fastapi-backend/sub_applications/handle.py
create mode 100644 dash-fastapi-backend/sub_applications/staticfiles.py
create mode 100644 dash-fastapi-backend/utils/cron_util.py
create mode 100644 dash-fastapi-backend/utils/string_util.py
create mode 100644 dash-fastapi-backend/utils/upload_util.py
diff --git a/dash-fastapi-backend/.env.dev b/dash-fastapi-backend/.env.dev
index 840a1ab..931468f 100644
--- a/dash-fastapi-backend/.env.dev
+++ b/dash-fastapi-backend/.env.dev
@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
# 应用端口
APP_PORT = 9099
# 应用版本
-APP_VERSION= '1.4.2'
+APP_VERSION= '2.0.0'
# 应用是否开启热重载
APP_RELOAD = true
# 应用是否开启IP归属区域查询
diff --git a/dash-fastapi-backend/.env.prod b/dash-fastapi-backend/.env.prod
index ea8f2b6..c812b1d 100644
--- a/dash-fastapi-backend/.env.prod
+++ b/dash-fastapi-backend/.env.prod
@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
# 应用端口
APP_PORT = 9099
# 应用版本
-APP_VERSION= '1.4.2'
+APP_VERSION= '2.0.0'
# 应用是否开启热重载
APP_RELOAD = false
# 应用是否开启IP归属区域查询
@@ -37,7 +37,7 @@ DB_PORT = 3306
# 数据库用户名
DB_USERNAME = 'root'
# 数据库密码
-DB_PASSWORD = 'mysqlroot'
+DB_PASSWORD = 'root'
# 数据库名称
DB_DATABASE = 'dash-fastapi'
# 是否开启sqlalchemy日志
diff --git a/dash-fastapi-backend/app.py b/dash-fastapi-backend/app.py
index 81d0bce..1ee7695 100644
--- a/dash-fastapi-backend/app.py
+++ b/dash-fastapi-backend/app.py
@@ -1,113 +1,12 @@
-from fastapi import FastAPI, Request
import uvicorn
-from fastapi.exceptions import HTTPException
-from fastapi.middleware.cors import CORSMiddleware
-from module_admin.controller.login_controller import loginController
-from module_admin.controller.captcha_controller import captchaController
-from module_admin.controller.user_controller import userController
-from module_admin.controller.menu_controller import menuController
-from module_admin.controller.dept_controller import deptController
-from module_admin.controller.role_controller import roleController
-from module_admin.controller.post_controler import postController
-from module_admin.controller.dict_controller import dictController
-from module_admin.controller.config_controller import configController
-from module_admin.controller.notice_controller import noticeController
-from module_admin.controller.log_controller import logController
-from module_admin.controller.online_controller import onlineController
-from module_admin.controller.job_controller import jobController
-from module_admin.controller.server_controller import serverController
-from module_admin.controller.cache_controller import cacheController
-from module_admin.controller.common_controller import commonController
-from config.env import AppConfig
-from config.get_redis import RedisUtil
-from config.get_db import init_create_table
-from config.get_scheduler import SchedulerUtil
-from utils.response_util import *
-from utils.log_util import logger
-from utils.common_util import worship
+from server import app, AppConfig # noqa: F401
-app = FastAPI(
- title=AppConfig.app_name,
- description=f'{AppConfig.app_name}接口文档',
- version=AppConfig.app_version,
- root_path=AppConfig.app_root_path,
-)
-
-# 前端页面url
-origins = [
- "http://localhost:8088",
- "http://127.0.0.1:8088",
-]
-
-# 后台api允许跨域
-app.add_middleware(
- CORSMiddleware,
- allow_origins=origins,
- allow_credentials=True,
- allow_methods=["*"],
- allow_headers=["*"],
-)
-
-
-@app.on_event("startup")
-async def startup_event():
- logger.info(f"{AppConfig.app_name}开始启动")
- worship()
- await init_create_table()
- app.state.redis = await RedisUtil.create_redis_pool()
- await RedisUtil.init_sys_dict(app.state.redis)
- await RedisUtil.init_sys_config(app.state.redis)
- await SchedulerUtil.init_system_scheduler()
- logger.info(f"{AppConfig.app_name}启动成功")
-
-
-@app.on_event("shutdown")
-async def shutdown_event():
- await RedisUtil.close_redis_pool(app)
- await SchedulerUtil.close_system_scheduler()
-
-
-# 自定义token检验异常
-@app.exception_handler(AuthException)
-async def auth_exception_handler(request: Request, exc: AuthException):
- return response_401(data=exc.data, message=exc.message)
-
-
-# 自定义权限检验异常
-@app.exception_handler(PermissionException)
-async def permission_exception_handler(request: Request, exc: PermissionException):
- return response_403(data=exc.data, message=exc.message)
-
-
-@app.exception_handler(HTTPException)
-async def http_exception_handler(request: Request, exc: HTTPException):
- return JSONResponse(
- content=jsonable_encoder({"message": exc.detail, "code": exc.status_code}),
- status_code=exc.status_code
- )
-
-
-app.include_router(loginController, prefix="/login", tags=['登录模块'])
-app.include_router(captchaController, prefix="/captcha", tags=['验证码模块'])
-app.include_router(userController, prefix="/system", tags=['系统管理-用户管理'])
-app.include_router(menuController, prefix="/system", tags=['系统管理-菜单管理'])
-app.include_router(deptController, prefix="/system", tags=['系统管理-部门管理'])
-app.include_router(roleController, prefix="/system", tags=['系统管理-角色管理'])
-app.include_router(postController, prefix="/system", tags=['系统管理-岗位管理'])
-app.include_router(dictController, prefix="/system", tags=['系统管理-字典管理'])
-app.include_router(configController, prefix="/system", tags=['系统管理-参数管理'])
-app.include_router(noticeController, prefix="/system", tags=['系统管理-通知公告管理'])
-app.include_router(logController, prefix="/system", tags=['系统管理-日志管理'])
-app.include_router(onlineController, prefix="/monitor", tags=['系统监控-在线用户'])
-app.include_router(jobController, prefix="/monitor", tags=['系统监控-定时任务'])
-app.include_router(serverController, prefix="/monitor", tags=['系统监控-服务监控'])
-app.include_router(cacheController, prefix="/monitor", tags=['系统监控-缓存监控'])
-app.include_router(commonController, prefix="/common", tags=['通用模块'])
if __name__ == '__main__':
uvicorn.run(
app='app:app',
host=AppConfig.app_host,
port=AppConfig.app_port,
- reload=AppConfig.app_reload
+ root_path=AppConfig.app_root_path,
+ reload=AppConfig.app_reload,
)
diff --git a/dash-fastapi-backend/caches/avatar/admin/admin_avatar.jpeg b/dash-fastapi-backend/caches/avatar/admin/admin_avatar.jpeg
deleted file mode 100644
index 6fda0548459e5a43be8be8dfa745bfaabbad6b0c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 201942
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
5;@QeM
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