From 0737adb389f5447175b87ba6f34efc0cd0f9a0b2 Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Wed, 10 Jul 2024 21:00:43 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=A8=A1=E5=9D=97service=E5=B1=82=E5=8F=8A=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/login_controller.py | 119 +++++++----------- .../module_admin/service/login_service.py | 14 +-- 2 files changed, 53 insertions(+), 80 deletions(-) diff --git a/ruoyi-fastapi-backend/module_admin/controller/login_controller.py b/ruoyi-fastapi-backend/module_admin/controller/login_controller.py index 4861ca4..7c769a1 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/login_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/login_controller.py @@ -25,80 +25,60 @@ async def login(request: Request, form_data: CustomOAuth2PasswordRequestForm = D loginInfo=form_data.login_info, captchaEnabled=captcha_enabled ) - try: - result = await LoginService.authenticate_user(request, query_db, user) - except LoginException as e: - return ResponseUtil.failure(msg=e.message) - try: - access_token_expires = timedelta(minutes=JwtConfig.jwt_expire_minutes) - session_id = str(uuid.uuid4()) - access_token = await LoginService.create_access_token( - data={ - "user_id": str(result[0].user_id), - "user_name": result[0].user_name, - "dept_name": result[1].dept_name if result[1] else None, - "session_id": session_id, - "login_info": user.login_info - }, - expires_delta=access_token_expires - ) - if AppConfig.app_same_time_login: - await request.app.state.redis.set(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{session_id}", access_token, - ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes)) - else: - # 此方法可实现同一账号同一时间只能登录一次 - await request.app.state.redis.set(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{result[0].user_id}", access_token, - ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes)) - await UserService.edit_user_services(query_db, EditUserModel(userId=result[0].user_id, loginDate=datetime.now(), type='status')) - logger.info('登录成功') - # 判断请求是否来自于api文档,如果是返回指定格式的结果,用于修复api文档认证成功后token显示undefined的bug - request_from_swagger = request.headers.get('referer').endswith('docs') if request.headers.get('referer') else False - request_from_redoc = request.headers.get('referer').endswith('redoc') if request.headers.get('referer') else False - if request_from_swagger or request_from_redoc: - return {'access_token': access_token, 'token_type': 'Bearer'} - return ResponseUtil.success( - msg='登录成功', - dict_content={'token': access_token} - ) - except Exception as e: - logger.exception(e) - return ResponseUtil.error(msg=str(e)) + result = await LoginService.authenticate_user(request, query_db, user) + access_token_expires = timedelta(minutes=JwtConfig.jwt_expire_minutes) + session_id = str(uuid.uuid4()) + access_token = await LoginService.create_access_token( + data={ + "user_id": str(result[0].user_id), + "user_name": result[0].user_name, + "dept_name": result[1].dept_name if result[1] else None, + "session_id": session_id, + "login_info": user.login_info + }, + expires_delta=access_token_expires + ) + if AppConfig.app_same_time_login: + await request.app.state.redis.set(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{session_id}", access_token, + ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes)) + else: + # 此方法可实现同一账号同一时间只能登录一次 + await request.app.state.redis.set(f"{RedisInitKeyConfig.ACCESS_TOKEN.get('key')}:{result[0].user_id}", access_token, + ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes)) + await UserService.edit_user_services(query_db, EditUserModel(userId=result[0].user_id, loginDate=datetime.now(), type='status')) + logger.info('登录成功') + # 判断请求是否来自于api文档,如果是返回指定格式的结果,用于修复api文档认证成功后token显示undefined的bug + request_from_swagger = request.headers.get('referer').endswith('docs') if request.headers.get('referer') else False + request_from_redoc = request.headers.get('referer').endswith('redoc') if request.headers.get('referer') else False + if request_from_swagger or request_from_redoc: + return {'access_token': access_token, 'token_type': 'Bearer'} + return ResponseUtil.success( + msg='登录成功', + dict_content={'token': access_token} + ) @loginController.get("/getInfo", response_model=CurrentUserModel) async def get_login_user_info(request: Request, current_user: CurrentUserModel = Depends(LoginService.get_current_user)): - try: - logger.info('获取成功') - return ResponseUtil.success(model_content=current_user) - except Exception as e: - logger.exception(e) - return ResponseUtil.error(msg=str(e)) + logger.info('获取成功') + + return ResponseUtil.success(model_content=current_user) @loginController.get("/getRouters") async def get_login_user_routers(request: Request, current_user: CurrentUserModel = Depends(LoginService.get_current_user), query_db: AsyncSession = Depends(get_db)): - try: - logger.info('获取成功') - user_routers = await LoginService.get_current_user_routers(current_user.user.user_id, query_db) - return ResponseUtil.success(data=user_routers) - except Exception as e: - logger.exception(e) - return ResponseUtil.error(msg=str(e)) + logger.info('获取成功') + user_routers = await LoginService.get_current_user_routers(current_user.user.user_id, query_db) + + return ResponseUtil.success(data=user_routers) @loginController.post("/register", response_model=CrudResponseModel) async def register_user(request: Request, user_register: UserRegister, query_db: AsyncSession = Depends(get_db)): - try: - user_register_result = await LoginService.register_user_services(request, query_db, user_register) - if user_register_result.is_success: - logger.info(user_register_result.message) - return ResponseUtil.success(data=user_register_result, msg=user_register_result.message) - else: - logger.warning(user_register_result.message) - return ResponseUtil.failure(msg=user_register_result.message) - except Exception as e: - logger.exception(e) - return ResponseUtil.error(msg=str(e)) + user_register_result = await LoginService.register_user_services(request, query_db, user_register) + logger.info(user_register_result.message) + + return ResponseUtil.success(data=user_register_result, msg=user_register_result.message) # @loginController.post("/getSmsCode", response_model=SmsCode) @@ -133,12 +113,9 @@ async def register_user(request: Request, user_register: UserRegister, query_db: @loginController.post("/logout") async def logout(request: Request, token: Optional[str] = Depends(oauth2_scheme)): - try: - payload = jwt.decode(token, JwtConfig.jwt_secret_key, algorithms=[JwtConfig.jwt_algorithm], options={'verify_exp': False}) - session_id: str = payload.get("session_id") - await LoginService.logout_services(request, session_id) - logger.info('退出成功') - return ResponseUtil.success(msg="退出成功") - except Exception as e: - logger.exception(e) - return ResponseUtil.error(msg=str(e)) + payload = jwt.decode(token, JwtConfig.jwt_secret_key, algorithms=[JwtConfig.jwt_algorithm], options={'verify_exp': False}) + session_id: str = payload.get("session_id") + await LoginService.logout_services(request, session_id) + logger.info('退出成功') + + return ResponseUtil.success(msg="退出成功") diff --git a/ruoyi-fastapi-backend/module_admin/service/login_service.py b/ruoyi-fastapi-backend/module_admin/service/login_service.py index 358d840..f4a96b3 100644 --- a/ruoyi-fastapi-backend/module_admin/service/login_service.py +++ b/ruoyi-fastapi-backend/module_admin/service/login_service.py @@ -9,7 +9,7 @@ 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 exceptions.exception import LoginException, AuthException, ServiceException from config.constant import CommonConstant, MenuConstant from config.env import AppConfig, JwtConfig, RedisInitKeyConfig from config.get_db import get_db @@ -344,11 +344,9 @@ class LoginService: captcha_value = await request.app.state.redis.get( f"{RedisInitKeyConfig.CAPTCHA_CODES.get('key')}:{user_register.uuid}") if not captcha_value: - logger.warning("验证码已失效") - return CrudResponseModel(is_success=False, message='验证码已失效') + raise ServiceException(message='验证码已失效') elif user_register.code != str(captcha_value): - logger.warning("验证码错误") - return CrudResponseModel(is_success=False, message='验证码错误') + raise ServiceException(message='验证码错误') add_user = AddUserModel( userName=user_register.username, nickName=user_register.username, @@ -357,11 +355,9 @@ class LoginService: result = await UserService.add_user_services(query_db, add_user) return result else: - result = dict(is_success=False, message='注册程序已关闭,禁止注册') + raise ServiceException(message='注册程序已关闭,禁止注册') else: - result = dict(is_success=False, message='两次输入的密码不一致') - - return CrudResponseModel(**result) + raise ServiceException(message='两次输入的密码不一致') @classmethod async def get_sms_code_services(cls, request: Request, query_db: AsyncSession, user: ResetUserModel):