From 3e199afd35ff24f0fe3ed44553acfaec7268d32b Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Fri, 26 Jan 2024 09:57:55 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=8B=86=E5=88=86app=E7=BB=93?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E5=B0=86=E4=B8=AD=E9=97=B4=E4=BB=B6=E3=80=81?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E3=80=81=E5=AD=90=E5=BA=94=E7=94=A8=E6=8B=86?= =?UTF-8?q?=E5=88=86=E6=88=90=E5=8D=95=E7=8B=AC=E7=9A=84=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-fastapi-backend/app.py | 120 ++---------------- ruoyi-fastapi-backend/exceptions/exception.py | 28 ++++ ruoyi-fastapi-backend/exceptions/handle.py | 27 ++++ .../middlewares/cors_middleware.py | 18 +++ .../module_admin/aspect/interface_auth.py | 2 +- .../controller/login_controller.py | 16 +-- .../module_admin/service/login_service.py | 3 +- ruoyi-fastapi-backend/server.py | 70 ++++++++++ .../sub_applications/staticfiles.py | 7 + ruoyi-fastapi-backend/utils/response_util.py | 112 ---------------- 10 files changed, 169 insertions(+), 234 deletions(-) create mode 100644 ruoyi-fastapi-backend/exceptions/exception.py create mode 100644 ruoyi-fastapi-backend/exceptions/handle.py create mode 100644 ruoyi-fastapi-backend/middlewares/cors_middleware.py create mode 100644 ruoyi-fastapi-backend/server.py create mode 100644 ruoyi-fastapi-backend/sub_applications/staticfiles.py diff --git a/ruoyi-fastapi-backend/app.py b/ruoyi-fastapi-backend/app.py index 69a8360..7797fa9 100644 --- a/ruoyi-fastapi-backend/app.py +++ b/ruoyi-fastapi-backend/app.py @@ -1,116 +1,12 @@ -from fastapi import FastAPI, Request -from fastapi.exceptions import HTTPException -from fastapi.middleware.cors import CORSMiddleware -from fastapi.staticfiles import StaticFiles import uvicorn -from contextlib import asynccontextmanager -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, UploadConfig -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 -@asynccontextmanager -async def lifespan(app: FastAPI): - 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}启动成功") - yield - await RedisUtil.close_redis_pool(app) - await SchedulerUtil.close_system_scheduler() - - -app = FastAPI( - title=AppConfig.app_name, - description=f'{AppConfig.app_name}接口文档', - version=AppConfig.app_version, - lifespan=lifespan -) - -# 前端页面url -origins = [ - "http://localhost:81", - "http://127.0.0.1:81", -] - -# 后台api允许跨域 -app.add_middleware( - CORSMiddleware, - allow_origins=origins, - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - -# 挂载静态文件路径 -app.mount(f"{UploadConfig.UPLOAD_PREFIX}", StaticFiles(directory=f"{UploadConfig.UPLOAD_PATH}"), name="profile") - - -# 自定义token检验异常 -@app.exception_handler(AuthException) -async def auth_exception_handler(request: Request, exc: AuthException): - return ResponseUtil.unauthorized(data=exc.data, msg=exc.message) - - -# 自定义权限检验异常 -@app.exception_handler(PermissionException) -async def permission_exception_handler(request: Request, exc: PermissionException): - return ResponseUtil.forbidden(data=exc.data, msg=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 - ) - - -controller_list = [ - {'router': loginController, 'tags': ['登录模块']}, - {'router': captchaController, 'tags': ['验证码模块']}, - {'router': userController, 'tags': ['系统管理-用户管理']}, - {'router': roleController, 'tags': ['系统管理-角色管理']}, - {'router': menuController, 'tags': ['系统管理-菜单管理']}, - {'router': deptController, 'tags': ['系统管理-部门管理']}, - {'router': postController, 'tags': ['系统管理-岗位管理']}, - {'router': dictController, 'tags': ['系统管理-字典管理']}, - {'router': configController, 'tags': ['系统管理-参数管理']}, - {'router': noticeController, 'tags': ['系统管理-通知公告管理']}, - {'router': logController, 'tags': ['系统管理-日志管理']}, - {'router': onlineController, 'tags': ['系统监控-在线用户']}, - {'router': jobController, 'tags': ['系统监控-定时任务']}, - {'router': serverController, 'tags': ['系统监控-菜单管理']}, - {'router': cacheController, 'tags': ['系统监控-缓存监控']}, - {'router': commonController, 'tags': ['通用模块']} -] - -for controller in controller_list: - app.include_router(router=controller.get('router'), tags=controller.get('tags')) - if __name__ == '__main__': - uvicorn.run(app='app:app', host=AppConfig.app_host, port=AppConfig.app_port, root_path=AppConfig.app_root_path, reload=AppConfig.app_reload) + uvicorn.run( + app='app:app', + host=AppConfig.app_host, + port=AppConfig.app_port, + root_path=AppConfig.app_root_path, + reload=AppConfig.app_reload + ) diff --git a/ruoyi-fastapi-backend/exceptions/exception.py b/ruoyi-fastapi-backend/exceptions/exception.py new file mode 100644 index 0000000..ef2fda0 --- /dev/null +++ b/ruoyi-fastapi-backend/exceptions/exception.py @@ -0,0 +1,28 @@ +class LoginException(Exception): + """ + 自定义登录异常LoginException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +class AuthException(Exception): + """ + 自定义令牌异常AuthException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message + + +class PermissionException(Exception): + """ + 自定义权限异常PermissionException + """ + + def __init__(self, data: str = None, message: str = None): + self.data = data + self.message = message diff --git a/ruoyi-fastapi-backend/exceptions/handle.py b/ruoyi-fastapi-backend/exceptions/handle.py new file mode 100644 index 0000000..c14b4e5 --- /dev/null +++ b/ruoyi-fastapi-backend/exceptions/handle.py @@ -0,0 +1,27 @@ +from fastapi import Request +from fastapi.exceptions import HTTPException +from server import app +from exceptions.auth_exception import AuthException +from exceptions.permission_exception import PermissionException +from utils.response_util import ResponseUtil, JSONResponse, jsonable_encoder + + +# 自定义token检验异常 +@app.exception_handler(AuthException) +async def auth_exception_handler(request: Request, exc: AuthException): + return ResponseUtil.unauthorized(data=exc.data, msg=exc.message) + + +# 自定义权限检验异常 +@app.exception_handler(PermissionException) +async def permission_exception_handler(request: Request, exc: PermissionException): + return ResponseUtil.forbidden(data=exc.data, msg=exc.message) + + +# 处理其他http请求异常 +@app.exception_handler(HTTPException) +async def http_exception_handler(request: Request, exc: HTTPException): + return JSONResponse( + content=jsonable_encoder({"code": exc.status_code, "msg": exc.detail}), + status_code=exc.status_code + ) diff --git a/ruoyi-fastapi-backend/middlewares/cors_middleware.py b/ruoyi-fastapi-backend/middlewares/cors_middleware.py new file mode 100644 index 0000000..372ff30 --- /dev/null +++ b/ruoyi-fastapi-backend/middlewares/cors_middleware.py @@ -0,0 +1,18 @@ +from fastapi.middleware.cors import CORSMiddleware +from server import app + + +# 前端页面url +origins = [ + "http://localhost:80", + "http://127.0.0.1:80", +] + +# 后台api允许跨域 +app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) diff --git a/ruoyi-fastapi-backend/module_admin/aspect/interface_auth.py b/ruoyi-fastapi-backend/module_admin/aspect/interface_auth.py index 876670a..d91bdb4 100644 --- a/ruoyi-fastapi-backend/module_admin/aspect/interface_auth.py +++ b/ruoyi-fastapi-backend/module_admin/aspect/interface_auth.py @@ -1,7 +1,7 @@ from fastapi import Depends from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.service.login_service import LoginService -from utils.response_util import PermissionException +from exceptions.exception import PermissionException class CheckUserInterfaceAuth: diff --git a/ruoyi-fastapi-backend/module_admin/controller/login_controller.py b/ruoyi-fastapi-backend/module_admin/controller/login_controller.py index 449f97c..2b77f00 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/login_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/login_controller.py @@ -2,10 +2,10 @@ from fastapi import APIRouter from module_admin.service.login_service import * from module_admin.entity.vo.login_vo import * from module_admin.dao.login_dao import * +from module_admin.annotation.log_annotation import log_decorator from config.env import JwtConfig, RedisInitKeyConfig -from utils.response_util import * +from utils.response_util import ResponseUtil from utils.log_util import * -from module_admin.annotation.log_annotation import log_decorator from datetime import timedelta @@ -88,13 +88,13 @@ async def get_sms_code(request: Request, user: ResetUserModel, query_db: Session sms_result = await get_sms_code_services(request, query_db, user) if sms_result.is_success: logger.info('获取成功') - return response_200(data=sms_result, message='获取成功') + return ResponseUtil.success(data=sms_result) else: logger.warning(sms_result.message) - return response_400(data='', message=sms_result.message) + return ResponseUtil.failure(msg=sms_result.message) except Exception as e: logger.exception(e) - return response_500(data="", message=str(e)) + return ResponseUtil.error(msg=str(e)) @loginController.post("/forgetPwd", response_model=CrudResponseModel) @@ -103,13 +103,13 @@ async def forget_user_pwd(request: Request, forget_user: ResetUserModel, query_d forget_user_result = await forget_user_services(request, query_db, forget_user) if forget_user_result.is_success: logger.info(forget_user_result.message) - return response_200(data=forget_user_result, message=forget_user_result.message) + return ResponseUtil.success(data=forget_user_result, msg=forget_user_result.message) else: logger.warning(forget_user_result.message) - return response_400(data="", message=forget_user_result.message) + return ResponseUtil.failure(msg=forget_user_result.message) except Exception as e: logger.exception(e) - return response_500(data="", message=str(e)) + return ResponseUtil.error(msg=str(e)) @loginController.post("/logout") diff --git a/ruoyi-fastapi-backend/module_admin/service/login_service.py b/ruoyi-fastapi-backend/module_admin/service/login_service.py index 363f6ee..d978002 100644 --- a/ruoyi-fastapi-backend/module_admin/service/login_service.py +++ b/ruoyi-fastapi-backend/module_admin/service/login_service.py @@ -9,12 +9,13 @@ from module_admin.service.user_service import * from module_admin.entity.vo.login_vo import * from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.dao.login_dao import * +from exceptions.exception import LoginException, AuthException from config.env import AppConfig, JwtConfig, RedisInitKeyConfig +from config.get_db import get_db from utils.common_util import CamelCaseUtil from utils.pwd_util import * from utils.response_util import * from utils.message_util import * -from config.get_db import get_db oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login") diff --git a/ruoyi-fastapi-backend/server.py b/ruoyi-fastapi-backend/server.py new file mode 100644 index 0000000..6c89870 --- /dev/null +++ b/ruoyi-fastapi-backend/server.py @@ -0,0 +1,70 @@ +from fastapi import FastAPI +from contextlib import asynccontextmanager +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.log_util import logger +from utils.common_util import worship + + +@asynccontextmanager +async def lifespan(app: FastAPI): + 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}启动成功") + yield + await RedisUtil.close_redis_pool(app) + await SchedulerUtil.close_system_scheduler() + + +app = FastAPI( + title=AppConfig.app_name, + description=f'{AppConfig.app_name}接口文档', + version=AppConfig.app_version, + lifespan=lifespan +) + + +controller_list = [ + {'router': loginController, 'tags': ['登录模块']}, + {'router': captchaController, 'tags': ['验证码模块']}, + {'router': userController, 'tags': ['系统管理-用户管理']}, + {'router': roleController, 'tags': ['系统管理-角色管理']}, + {'router': menuController, 'tags': ['系统管理-菜单管理']}, + {'router': deptController, 'tags': ['系统管理-部门管理']}, + {'router': postController, 'tags': ['系统管理-岗位管理']}, + {'router': dictController, 'tags': ['系统管理-字典管理']}, + {'router': configController, 'tags': ['系统管理-参数管理']}, + {'router': noticeController, 'tags': ['系统管理-通知公告管理']}, + {'router': logController, 'tags': ['系统管理-日志管理']}, + {'router': onlineController, 'tags': ['系统监控-在线用户']}, + {'router': jobController, 'tags': ['系统监控-定时任务']}, + {'router': serverController, 'tags': ['系统监控-菜单管理']}, + {'router': cacheController, 'tags': ['系统监控-缓存监控']}, + {'router': commonController, 'tags': ['通用模块']} +] + +for controller in controller_list: + app.include_router(router=controller.get('router'), tags=controller.get('tags')) diff --git a/ruoyi-fastapi-backend/sub_applications/staticfiles.py b/ruoyi-fastapi-backend/sub_applications/staticfiles.py new file mode 100644 index 0000000..bb7da54 --- /dev/null +++ b/ruoyi-fastapi-backend/sub_applications/staticfiles.py @@ -0,0 +1,7 @@ +from fastapi.staticfiles import StaticFiles +from server import app +from config.env import UploadConfig + + +# 挂载静态文件路径 +app.mount(f"{UploadConfig.UPLOAD_PREFIX}", StaticFiles(directory=f"{UploadConfig.UPLOAD_PATH}"), name="profile") diff --git a/ruoyi-fastapi-backend/utils/response_util.py b/ruoyi-fastapi-backend/utils/response_util.py index 4dab253..a741074 100644 --- a/ruoyi-fastapi-backend/utils/response_util.py +++ b/ruoyi-fastapi-backend/utils/response_util.py @@ -187,115 +187,3 @@ class ResponseUtil: status_code=status.HTTP_200_OK, content=data ) - - -def response_200(*, data: Any = None, message="获取成功") -> Response: - return JSONResponse( - status_code=status.HTTP_200_OK, - content=jsonable_encoder( - { - 'code': 200, - 'message': message, - 'data': data, - 'success': 'true', - 'time': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - ) - - -def response_400(*, data: Any = None, message: str = "获取失败") -> Response: - return JSONResponse( - status_code=status.HTTP_400_BAD_REQUEST, - content=jsonable_encoder( - { - 'code': 400, - 'message': message, - 'data': data, - 'success': 'false', - 'time': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - ) - - -def response_401(*, data: Any = None, message: str = "获取失败") -> Response: - return JSONResponse( - status_code=status.HTTP_401_UNAUTHORIZED, - content=jsonable_encoder( - { - 'code': 401, - 'message': message, - 'data': data, - 'success': 'false', - 'time': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - ) - - -def response_403(*, data: Any = None, message: str = "获取失败") -> Response: - return JSONResponse( - status_code=status.HTTP_403_FORBIDDEN, - content=jsonable_encoder( - { - 'code': 403, - 'message': message, - 'data': data, - 'success': 'false', - 'time': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - ) - - -def response_500(*, data: Any = None, message: str = "接口异常") -> Response: - return JSONResponse( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - content=jsonable_encoder( - { - 'code': 500, - 'message': message, - 'data': data, - 'success': 'false', - 'time': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - ) - - -def streaming_response_200(*, data: Any = None): - return StreamingResponse( - status_code=status.HTTP_200_OK, - content=data, - ) - - -class AuthException(Exception): - """ - 自定义令牌异常AuthException - """ - - def __init__(self, data: str = None, message: str = None): - self.data = data - self.message = message - - -class PermissionException(Exception): - """ - 自定义权限异常PermissionException - """ - - def __init__(self, data: str = None, message: str = None): - self.data = data - self.message = message - - -class LoginException(Exception): - """ - 自定义登录异常LoginException - """ - - def __init__(self, data: str = None, message: str = None): - self.data = data - self.message = message