From 9afea367873da00da799052d9d3bb8449e0e8d67 Mon Sep 17 00:00:00 2001 From: CMHopeSunshine <277073121@qq.com> Date: Thu, 10 Nov 2022 22:33:27 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E4=BC=98=E5=8C=96`Web=20UI`Cookie?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LittlePaimon/web/api/cookie.py | 106 ++++++++++++++--------- LittlePaimon/web/pages/private_cookie.py | 36 ++++++-- LittlePaimon/web/pages/public_cookie.py | 6 +- 3 files changed, 94 insertions(+), 54 deletions(-) diff --git a/LittlePaimon/web/api/cookie.py b/LittlePaimon/web/api/cookie.py index 7994942..a70a392 100644 --- a/LittlePaimon/web/api/cookie.py +++ b/LittlePaimon/web/api/cookie.py @@ -13,7 +13,8 @@ route = APIRouter() class BindCookie(BaseModel): - user_id: int + id: Optional[int] + user_id: Optional[int] uid: Optional[int] mys_id: Optional[int] cookie: str @@ -49,18 +50,26 @@ async def get_public_cookies(status: Optional[int] = None): @route.get('/get_private_cookies', response_class=JSONResponse, dependencies=[authentication()]) -async def get_private_cookies(page: int = 1, perPage: int = 10, user_id: Optional[str] = None, - uid: Optional[str] = None, mys_id: Optional[str] = None, status: Optional[int] = None): - query = {'user_id__contains': user_id} if user_id else {'uid__contains': uid} if uid else { - 'mys_id__contains': mys_id} if mys_id else {} +async def get_private_cookies( + page: int = 1, + perPage: int = 10, + orderBy: str = 'id', + orderDir: str = 'asc', + status: Optional[int] = None, + user_id: Optional[int] = None, + uid: Optional[int] = None, + mys_id: Optional[int] = None): + orderBy = orderBy if orderDir == 'asc' else f'-{orderBy}' if orderBy else 'id' + query = {f'{k}__contains': v for k, v in {'user_id': user_id, 'uid': uid, 'mys_id': mys_id}.items() if + v is not None} if status is not None: query['status'] = status - data = await PrivateCookie.filter(**query).offset((page - 1) * perPage).limit(perPage).values() return { 'status': 0, 'msg': 'ok', 'data': { - 'items': data, + 'items': await PrivateCookie.filter(**query).order_by(orderBy).offset((page - 1) * perPage).limit( + perPage).values(), 'total': await PrivateCookie.filter(**query).count() } } @@ -71,39 +80,51 @@ async def get_private_cookie(id: int): return await PrivateCookie.get_or_none(id=id).values() -@route.delete('/delete_public_cookie', response_class=JSONResponse, dependencies=[authentication()]) -async def delete_public_cookie(id: int): - await PublicCookie.filter(id=id).delete() - return {'status': 0, 'msg': f'{id}号公共Cookie删除成功'} - - -@route.delete('/delete_private_cookie', response_class=JSONResponse, dependencies=[authentication()]) -async def delete_private_cookie(id: int): - await PrivateCookie.filter(id=id).delete() - return {'status': 0, 'msg': f'{id}号私人Cookie删除成功'} - - -@route.post('/add_public_cookie', response_class=JSONResponse, dependencies=[authentication()]) -async def add_public_cookie(force: bool, data: dict): - cookie = data.get('cookie') - if not cookie: - return {'status': 100, 'msg': '参数错误'} - if not force: - if await get_bind_game_info(cookie, True): - new_cookie = await PublicCookie.create(cookie=cookie) - return {'status': 0, 'msg': f'{new_cookie.id}号公共Cookie添加成功'} - else: - return {'status': 200, 'msg': '该Cookie无效'} +@route.delete('/delete_cookie', response_class=JSONResponse, dependencies=[authentication()]) +async def delete_public_cookie(cookie_type: str, id: int): + if cookie_type == 'public': + await PublicCookie.filter(id=id).delete() + return {'status': 0, 'msg': f'{id}号公共Cookie删除成功'} else: - new_cookie = await PublicCookie.create(cookie=cookie) - return {'status': 0, 'msg': f'{new_cookie.id}号公共Cookie添加成功'} + await PrivateCookie.filter(id=id).delete() + return {'status': 0, 'msg': f'{id}号私人Cookie删除成功'} -@route.post('/save_private_cookie', response_class=JSONResponse, dependencies=[authentication()]) -async def save_private_cookie(force: bool, data: BindCookie): +@route.post('/add_cookie', response_class=JSONResponse, dependencies=[authentication()]) +async def add_public_cookie(cookie_type: str, force: bool, data: BindCookie): + if cookie_type == 'public': + if force or await get_bind_game_info(data.cookie, True): + new_cookie = await PublicCookie.create(cookie=data.cookie) + return {'status': 0, 'msg': f'{new_cookie.id}号公共Cookie添加成功'} + elif not force: + return {'status': 200, 'msg': '该Cookie无效,请根据教程重新获取'} + else: + if force: + await PrivateCookie.update_or_create(user_id=data.user_id, uid=data.uid, mys_id=data.mys_id, + defaults={'cookie': data.cookie, 'stoken': data.stoken}) + return {'status': 0, 'msg': f'QQ{data.user_id}的UID{data.uid}的Cookie强制修改成功。'} + elif game_info := await get_bind_game_info(data.cookie): + game_uid = game_info['game_role_id'] + mys_id = game_info['mys_id'] + await LastQuery.update_or_create(user_id=data.user_id, + defaults={'uid': game_uid, 'last_time': datetime.datetime.now()}) + if 'login_ticket' in data.cookie and (stoken := await get_stoken_by_cookie(data.cookie)): + await PrivateCookie.update_or_create(user_id=data.user_id, uid=game_uid, mys_id=mys_id, + defaults={'cookie': data.cookie, + 'stoken': f'stuid={mys_id};stoken={stoken};'}) + return {'status': 0, 'msg': f'QQ{data.user_id}的UID{game_uid}的Cookie以及Stoken添加/保存成功。'} + else: + await PrivateCookie.update_or_create(user_id=data.user_id, uid=game_uid, mys_id=mys_id, + defaults={'cookie': data.cookie}) + return {'status': 0, 'msg': f'QQ{data.user_id}的UID{game_uid}的Cookie添加/保存成功,但未绑定stoken。'} + else: + return {'status': 200, 'msg': '该Cookie无效,请根据教程重新获取'} + + +@route.post('/update_private_cookie', response_class=JSONResponse, dependencies=[authentication()]) +async def update_cookie(force: bool, data: BindCookie): if force: - await PrivateCookie.update_or_create(user_id=data.user_id, uid=data.uid, mys_id=data.mys_id, - defaults={'cookie': data.cookie, 'stoken': data.stoken}) + await PrivateCookie.filter(id=data.id).update(**data.dict(exclude={'id'})) return {'status': 0, 'msg': f'QQ{data.user_id}的UID{data.uid}的Cookie强制修改成功。'} elif game_info := await get_bind_game_info(data.cookie): game_uid = game_info['game_role_id'] @@ -111,13 +132,12 @@ async def save_private_cookie(force: bool, data: BindCookie): await LastQuery.update_or_create(user_id=data.user_id, defaults={'uid': game_uid, 'last_time': datetime.datetime.now()}) if 'login_ticket' in data.cookie and (stoken := await get_stoken_by_cookie(data.cookie)): - await PrivateCookie.update_or_create(user_id=data.user_id, uid=game_uid, mys_id=mys_id, - defaults={'cookie': data.cookie, - 'stoken': f'stuid={mys_id};stoken={stoken};'}) + await PrivateCookie.filter(id=data.id).update(user_id=data.user_id, uid=game_uid, mys_id=mys_id, + cookie=data.cookie, stoken=f'stuid={mys_id};stoken={stoken};') return {'status': 0, 'msg': f'QQ{data.user_id}的UID{game_uid}的Cookie以及Stoken添加/保存成功。'} else: - await PrivateCookie.update_or_create(user_id=data.user_id, uid=game_uid, mys_id=mys_id, - defaults={'cookie': data.cookie}) - return {'status': 0, 'msg': f'QQ{data.user_id}的UID{game_uid}的Cookie添加/保存成功,但未绑定stoken。'} + await PrivateCookie.filter(id=data.id).update(user_id=data.user_id, uid=game_uid, mys_id=mys_id, + cookie=data.cookie, stoken=None) + return {'status': 0, 'msg': f'QQ{data.user_id}的UID{game_uid}的Cookie添加/保存成功,但未获取到stoken。'} else: - return {'status': 200, 'msg': '该Cookie无效,请根据教程重新获取'} + return {'status': 200, 'msg': '该Cookie无效,请根据教程重新获取'} \ No newline at end of file diff --git a/LittlePaimon/web/pages/private_cookie.py b/LittlePaimon/web/pages/private_cookie.py index 782e8d5..c4e2ee0 100644 --- a/LittlePaimon/web/pages/private_cookie.py +++ b/LittlePaimon/web/pages/private_cookie.py @@ -5,20 +5,35 @@ from .constants import status_map, status_filter add_button = ActionType.Dialog(label='添加私人Cookie', level=LevelEnum.primary, dialog=Dialog(title='添加私人Cookie', - body=Form(api='post:/LittlePaimon/api/save_private_cookie?force=false', + body=Form( + api='post:/LittlePaimon/api/add_cookie?cookie_type=private&force=false', + body=[InputNumber(name='user_id', label='QQ号', required=True), + Textarea(name='cookie', label='Cookie', required=True, + showCounter=False)]))) +force_add_button = ActionType.Dialog(label='强制添加私人Cookie', + level=LevelEnum.warning, + confirmText='强制修改Cookie不会对Cookie有效性和与uid的关联性进行校验,如果你不确定是否正确有效,请不要强制修改。', + dialog=Dialog(title='强制添加私人Cookie', + body=Form( + api='post:/LittlePaimon/api/add_cookie?cookie_type=private&force=true', body=[InputNumber(name='user_id', label='QQ号', required=True), + InputNumber(name='uid', label='UID', required=True), + InputNumber(name='mys_id', label='米游社ID', + required=True), Textarea(name='cookie', label='Cookie', required=True, - showCounter=False)]))) + showCounter=False), + Textarea(name='stoken', label='Stoken', showCounter=False) + ]))) delete_button = ActionType.Ajax(label='删除', level=LevelEnum.danger, confirmText='确认删除该私人Cookie', - api='delete:/LittlePaimon/api/delete_private_cookie?id=${id}') + api='delete:/LittlePaimon/api/delete_cookie?cookie_type=private&id=${id}') save_action_button = Action(label='保存修改', level=LevelEnum.warning, type='submit') cancel_action_button = Action(label='关闭', level=LevelEnum.default, actionType='close') detail_button = ActionType.Dialog(label='修改', level=LevelEnum.info, dialog=Dialog(title='Cookie详情', body=Form( - api='post:/LittlePaimon/api/save_private_cookie', + api='post:/LittlePaimon/api/update_private_cookie?force=false', body=[Static(name='id', label='ID'), InputNumber(name='user_id', label='QQ号', required=True), Static(name='uid', label='UID'), @@ -32,7 +47,7 @@ force_button = ActionType.Dialog(label='强制修改', confirmText='强制修改Cookie不会对Cookie有效性和与uid的关联性进行校验,如果你不确定是否正确有效,请不要强制修改。', dialog=Dialog(title='Cookie详情强制修改', body=Form( - api='post:/LittlePaimon/api/save_private_cookie?force=true', + api='post:/LittlePaimon/api/update_private_cookie?force=true', body=[Static(name='id', label='ID'), InputNumber(name='user_id', label='QQ号', required=True), InputNumber(name='uid', label='UID', required=True), @@ -40,19 +55,24 @@ force_button = ActionType.Dialog(label='强制修改', Textarea(name='cookie', label='Cookie', required=True, showCounter=False), Textarea(name='stoken', label='Stoken', showCounter=False)]), - actions=[cancel_action_button, Action(label='保存修改', level=LevelEnum.warning, type='submit', confirmText='强制修改Cookie不会对Cookie有效性和与uid的关联性进行校验,如果你不确定是否正确有效,请不要强制修改。')])) + actions=[cancel_action_button, + save_action_button])) table = TableCRUD(mode='table', title='', syncLocation=False, api='/LittlePaimon/api/get_private_cookies', + footable=True, columns=[TableColumn(label='ID', name='id'), TableColumn(label='QQ号', name='user_id', searchable=True), TableColumn(label='UID', name='uid', searchable=True), TableColumn(label='米游社ID', name='mys_id', searchable=True), TableColumn(type='mapping', label='状态', name='status', filterable=status_filter, map=status_map), + TableColumn(label='Cookie', name='cookie', breakpoint='*'), + TableColumn(label='Stoken', name='stoken', breakpoint='*'), ColumnOperation(label='操作', buttons=[detail_button, force_button, delete_button])], - headerToolbar=[add_button], + headerToolbar=[add_button, force_add_button], footerToolbar=['switch-per-page', 'pagination']) -page = PageSchema(url='/cookie/private', icon='fa fa-key', label='私人Cookie', schema=Page(title='私人Cookie', body=table)) +page = PageSchema(url='/cookie/private', icon='fa fa-key', label='私人Cookie', + schema=Page(title='私人Cookie', body=table)) diff --git a/LittlePaimon/web/pages/public_cookie.py b/LittlePaimon/web/pages/public_cookie.py index fdb4bcd..3fb5929 100644 --- a/LittlePaimon/web/pages/public_cookie.py +++ b/LittlePaimon/web/pages/public_cookie.py @@ -5,20 +5,20 @@ from .constants import status_map, status_filter add_button = ActionType.Dialog(label='添加公共Cookie', level=LevelEnum.primary, dialog=Dialog(title='添加公共Cookie', - body=Form(api='post:/LittlePaimon/api/add_public_cookie?force=false', + body=Form(api='post:/LittlePaimon/api/add_cookie?cookie_type=public&force=false', body=[Textarea(name='cookie', label='Cookie', required=True, showCounter=False)]))) add_button_force = ActionType.Dialog(label='强制添加公共Cookie', level=LevelEnum.warning, confirmText='强制添加公共Cookie不会对Cookie有效性进行校验,如果你不确定是否正确有效,请不要强制添加。', dialog=Dialog(title='强制添加公共Cookie', - body=Form(api='post:/LittlePaimon/api/add_public_cookie?force=true', + body=Form(api='post:/LittlePaimon/api/add_cookie?cookie_type=public&force=true', body=[ Textarea(name='cookie', label='Cookie', required=True, showCounter=False)]))) delete_button = ActionType.Ajax(label='删除', level=LevelEnum.danger, confirmText='确认删除该公共Cookie', - api='delete:/LittlePaimon/api/delete_public_cookie?id=${id}') + api='delete:/LittlePaimon/api/delete_cookie?cookie_type=public&id=${id}') table = TableCRUD(mode='table', title='', syncLocation=False,