You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					77 lines
				
				3.3 KiB
			
		
		
			
		
	
	
					77 lines
				
				3.3 KiB
			| 
								 
											1 year ago
										 
									 | 
							
								import jwt
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								from fastapi import Request
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								from config.enums import RedisInitKeyConfig
							 | 
						||
| 
								 | 
							
								from config.env import JwtConfig
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								from exceptions.exception import ServiceException
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								from module_admin.entity.vo.common_vo import CrudResponseModel
							 | 
						||
| 
								 | 
							
								from module_admin.entity.vo.online_vo import DeleteOnlineModel, OnlineQueryModel
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								from utils.common_util import CamelCaseUtil
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class OnlineService:
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    在线用户管理模块服务层
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    async def get_online_list_services(cls, request: Request, query_object: OnlineQueryModel):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        获取在线用户表信息service
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        :param request: Request对象
							 | 
						||
| 
								 | 
							
								        :param query_object: 查询参数对象
							 | 
						||
| 
								 | 
							
								        :return: 在线用户列表信息
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        access_token_keys = await request.app.state.redis.keys(f'{RedisInitKeyConfig.ACCESS_TOKEN.key}*')
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        if not access_token_keys:
							 | 
						||
| 
								 | 
							
								            access_token_keys = []
							 | 
						||
| 
								 | 
							
								        access_token_values_list = [await request.app.state.redis.get(key) for key in access_token_keys]
							 | 
						||
| 
								 | 
							
								        online_info_list = []
							 | 
						||
| 
								 | 
							
								        for item in access_token_values_list:
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								            payload = jwt.decode(item, JwtConfig.jwt_secret_key, algorithms=[JwtConfig.jwt_algorithm])
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								            online_dict = dict(
							 | 
						||
| 
								 | 
							
								                token_id=payload.get('session_id'),
							 | 
						||
| 
								 | 
							
								                user_name=payload.get('user_name'),
							 | 
						||
| 
								 | 
							
								                dept_name=payload.get('dept_name'),
							 | 
						||
| 
								 | 
							
								                ipaddr=payload.get('login_info').get('ipaddr'),
							 | 
						||
| 
								 | 
							
								                login_location=payload.get('login_info').get('loginLocation'),
							 | 
						||
| 
								 | 
							
								                browser=payload.get('login_info').get('browser'),
							 | 
						||
| 
								 | 
							
								                os=payload.get('login_info').get('os'),
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								                login_time=payload.get('login_info').get('loginTime'),
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								            )
							 | 
						||
| 
								 | 
							
								            if query_object.user_name and not query_object.ipaddr:
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								                if query_object.user_name == payload.get('user_name'):
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								                    online_info_list = [online_dict]
							 | 
						||
| 
								 | 
							
								                    break
							 | 
						||
| 
								 | 
							
								            elif not query_object.user_name and query_object.ipaddr:
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								                if query_object.ipaddr == payload.get('login_info').get('ipaddr'):
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								                    online_info_list = [online_dict]
							 | 
						||
| 
								 | 
							
								                    break
							 | 
						||
| 
								 | 
							
								            elif query_object.user_name and query_object.ipaddr:
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								                if query_object.user_name == payload.get('user_name') and query_object.ipaddr == payload.get(
							 | 
						||
| 
								 | 
							
								                    'login_info'
							 | 
						||
| 
								 | 
							
								                ).get('ipaddr'):
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								                    online_info_list = [online_dict]
							 | 
						||
| 
								 | 
							
								                    break
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                online_info_list.append(online_dict)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return CamelCaseUtil.transform_result(online_info_list)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    async def delete_online_services(cls, request: Request, page_object: DeleteOnlineModel):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        强退在线用户信息service
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        :param request: Request对象
							 | 
						||
| 
								 | 
							
								        :param page_object: 强退在线用户对象
							 | 
						||
| 
								 | 
							
								        :return: 强退在线用户校验结果
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        if page_object.token_ids:
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								            token_id_list = page_object.token_ids.split(',')
							 | 
						||
| 
								 | 
							
								            for token_id in token_id_list:
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								                await request.app.state.redis.delete(f'{RedisInitKeyConfig.ACCESS_TOKEN.key}:{token_id}')
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								            return CrudResponseModel(is_success=True, message='强退成功')
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        else:
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								            raise ServiceException(message='传入session_id为空')
							 |