From df18c6ce0bdbd870c3bbf3cc8a6fc73b7f50654c Mon Sep 17 00:00:00 2001 From: lan Date: Mon, 16 Jan 2023 18:47:19 +0800 Subject: [PATCH] =?UTF-8?q?add:=E5=90=8E=E5=8F=B0=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 60 +++++++++++++++++++++++++++++++++----------- templates/admin.html | 45 +++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 14 deletions(-) diff --git a/main.py b/main.py index ad1fc27..137f9ab 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from starlette.requests import Request from starlette.responses import HTMLResponse, FileResponse from starlette.staticfiles import StaticFiles - +import os, shutil from core.utils import error_ip_limit, upload_ip_limit, get_code, storage from core.depends import admin_required from settings import settings @@ -18,7 +18,7 @@ from core.database import init_models, Options, Codes, get_session app = FastAPI(debug=settings.DEBUG, docs_url=None, redoc_url=None) # 数据存储文件夹 -DATA_ROOT = Path(settings.DATA_ROOT) +DATA_ROOT = Path(settings.DATA_ROOT + '/files') if not DATA_ROOT.exists(): DATA_ROOT.mkdir(parents=True) @@ -54,6 +54,39 @@ async def admin(): return HTMLResponse(admin_html) +@app.get(f'/{settings.ADMIN_ADDRESS}/files', dependencies=[Depends(admin_required)]) +async def get_files(): + files = [] + for i, j, k in os.walk(f'{DATA_ROOT}'): + files.extend([{'name': _.split('/')[-1], 'path': i} for _ in k]) + return {'data': files} + + +@app.post(f'/{settings.ADMIN_ADDRESS}/files', dependencies=[Depends(admin_required)]) +async def share_file(name=Form(...), path=File(...), s: AsyncSession = Depends(get_session)): + file_path = path + f'/{name}' + key = uuid.uuid4().hex + code = await get_code(s) + now = datetime.datetime.now() + path = f"{settings.DATA_ROOT}/upload/{now.year}/{now.month}/{now.day}/" + if not os.path.exists(path): + os.makedirs(path) + text = f"{path}/{f'{key}{name}'}" + exp_time = datetime.datetime.now() + datetime.timedelta(days=1) + s.add(Codes(code=code, text=text.replace(f'{settings.DATA_ROOT}/', ''), type='file', name=name, count=-1, + exp_time=exp_time, key=key)) + await s.commit() + shutil.move(file_path, text) + return { + 'detail': '分享成功!请在24小时内使用分享使用!', + 'data': { + 'code': code, + 'text': text, + 'name': name, + } + } + + @app.post(f'/{settings.ADMIN_ADDRESS}', dependencies=[Depends(admin_required)], description='查询数据库列表') async def admin_post(page: int = Form(default=1), size: int = Form(default=10), s: AsyncSession = Depends(get_session)): infos = (await s.execute(select(Codes).offset((page - 1) * size).limit(size))).scalars().all() @@ -75,17 +108,6 @@ async def admin_post(page: int = Form(default=1), size: int = Form(default=10), }} -@app.patch(f'/{settings.ADMIN_ADDRESS}', dependencies=[Depends(admin_required)], description='修改数据库数据') -async def admin_patch(request: Request, s: AsyncSession = Depends(get_session)): - data = await request.json() - data.pop('INSTALL') - for key, value in data.items(): - await s.execute(update(Options).where(Options.key == key).values(value=value)) - await settings.update(key, value) - await s.commit() - return {'detail': '修改成功'} - - @app.delete(f'/{settings.ADMIN_ADDRESS}', dependencies=[Depends(admin_required)], description='删除数据库记录') async def admin_delete(code: str, s: AsyncSession = Depends(get_session)): # 找到相应记录 @@ -113,10 +135,20 @@ async def config(s: AsyncSession = Depends(get_session)): {'key': 'WEBSITE', 'name': '网站设置'}, {'key': 'SHARE', 'name': '分享设置'}, {'key': 'BANNERS', 'name': 'Banner'}, - {'key': 'WEBSITE', 'name': '网站设置'}, ]} +@app.patch(f'/{settings.ADMIN_ADDRESS}', dependencies=[Depends(admin_required)], description='修改数据库数据') +async def admin_patch(request: Request, s: AsyncSession = Depends(get_session)): + data = await request.json() + data.pop('INSTALL') + for key, value in data.items(): + await s.execute(update(Options).where(Options.key == key).values(value=value)) + await settings.update(key, value) + await s.commit() + return {'detail': '修改成功'} + + @app.get('/') async def index(): return HTMLResponse(index_html) diff --git a/templates/admin.html b/templates/admin.html index bc56891..870090c 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -101,6 +101,24 @@ > + + + + + + +
+
文件名:${ file.name }
+
路径:${ file.path }
+
+
+ + 分享 + +
+
+
+
@@ -215,6 +233,7 @@ 登录 + @@ -234,6 +253,7 @@ menus: [], updateTab: 'INSTALL', files: [], + locals: [], paginate: { page: 1, size: 10, @@ -255,6 +275,7 @@ this.menus = res.data.menus; }); this.loginAdmin(); + this.getLocalFiles(); } }, methods: { @@ -317,6 +338,30 @@ }); }) }, + getLocalFiles: function () { + axios.get(window.location.href + '/files', { + 'headers': { + 'pwd': this.pwd, + 'Content-Type': 'multipart/form-data' + } + }).then(res => { + this.locals = res.data.data; + }) + }, + shareFile: function (file) { + axios.post(window.location.href + '/files', file, { + 'headers': { + 'pwd': this.pwd, + 'Content-Type': 'multipart/form-data' + } + }).then(res => { + this.getLocalFiles() + this.$alert(`请在24小时内使用:${res.data.data.code}`, '分享成功', { + confirmButtonText: '确定', + }); + }) + + } } })