Skip to content

Commit f87d61b

Browse files
committed
add:后台分享本地文件
1 parent 1fb758a commit f87d61b

File tree

2 files changed

+91
-14
lines changed

2 files changed

+91
-14
lines changed

main.py

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from starlette.requests import Request
77
from starlette.responses import HTMLResponse, FileResponse
88
from starlette.staticfiles import StaticFiles
9-
9+
import os, shutil
1010
from core.utils import error_ip_limit, upload_ip_limit, get_code, storage
1111
from core.depends import admin_required
1212
from settings import settings
@@ -18,7 +18,7 @@
1818
app = FastAPI(debug=settings.DEBUG, docs_url=None, redoc_url=None)
1919

2020
# 数据存储文件夹
21-
DATA_ROOT = Path(settings.DATA_ROOT)
21+
DATA_ROOT = Path(settings.DATA_ROOT + '/files')
2222
if not DATA_ROOT.exists():
2323
DATA_ROOT.mkdir(parents=True)
2424

@@ -54,6 +54,39 @@ async def admin():
5454
return HTMLResponse(admin_html)
5555

5656

57+
@app.get(f'/{settings.ADMIN_ADDRESS}/files', dependencies=[Depends(admin_required)])
58+
async def get_files():
59+
files = []
60+
for i, j, k in os.walk(f'{DATA_ROOT}'):
61+
files.extend([{'name': _.split('/')[-1], 'path': i} for _ in k])
62+
return {'data': files}
63+
64+
65+
@app.post(f'/{settings.ADMIN_ADDRESS}/files', dependencies=[Depends(admin_required)])
66+
async def share_file(name=Form(...), path=File(...), s: AsyncSession = Depends(get_session)):
67+
file_path = path + f'/{name}'
68+
key = uuid.uuid4().hex
69+
code = await get_code(s)
70+
now = datetime.datetime.now()
71+
path = f"{settings.DATA_ROOT}/upload/{now.year}/{now.month}/{now.day}/"
72+
if not os.path.exists(path):
73+
os.makedirs(path)
74+
text = f"{path}/{f'{key}{name}'}"
75+
exp_time = datetime.datetime.now() + datetime.timedelta(days=1)
76+
s.add(Codes(code=code, text=text.replace(f'{settings.DATA_ROOT}/', ''), type='file', name=name, count=-1,
77+
exp_time=exp_time, key=key))
78+
await s.commit()
79+
shutil.move(file_path, text)
80+
return {
81+
'detail': '分享成功!请在24小时内使用分享使用!',
82+
'data': {
83+
'code': code,
84+
'text': text,
85+
'name': name,
86+
}
87+
}
88+
89+
5790
@app.post(f'/{settings.ADMIN_ADDRESS}', dependencies=[Depends(admin_required)], description='查询数据库列表')
5891
async def admin_post(page: int = Form(default=1), size: int = Form(default=10), s: AsyncSession = Depends(get_session)):
5992
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),
75108
}}
76109

77110

78-
@app.patch(f'/{settings.ADMIN_ADDRESS}', dependencies=[Depends(admin_required)], description='修改数据库数据')
79-
async def admin_patch(request: Request, s: AsyncSession = Depends(get_session)):
80-
data = await request.json()
81-
data.pop('INSTALL')
82-
for key, value in data.items():
83-
await s.execute(update(Options).where(Options.key == key).values(value=value))
84-
await settings.update(key, value)
85-
await s.commit()
86-
return {'detail': '修改成功'}
87-
88-
89111
@app.delete(f'/{settings.ADMIN_ADDRESS}', dependencies=[Depends(admin_required)], description='删除数据库记录')
90112
async def admin_delete(code: str, s: AsyncSession = Depends(get_session)):
91113
# 找到相应记录
@@ -113,10 +135,20 @@ async def config(s: AsyncSession = Depends(get_session)):
113135
{'key': 'WEBSITE', 'name': '网站设置'},
114136
{'key': 'SHARE', 'name': '分享设置'},
115137
{'key': 'BANNERS', 'name': 'Banner'},
116-
{'key': 'WEBSITE', 'name': '网站设置'},
117138
]}
118139

119140

141+
@app.patch(f'/{settings.ADMIN_ADDRESS}', dependencies=[Depends(admin_required)], description='修改数据库数据')
142+
async def admin_patch(request: Request, s: AsyncSession = Depends(get_session)):
143+
data = await request.json()
144+
data.pop('INSTALL')
145+
for key, value in data.items():
146+
await s.execute(update(Options).where(Options.key == key).values(value=value))
147+
await settings.update(key, value)
148+
await s.commit()
149+
return {'detail': '修改成功'}
150+
151+
120152
@app.get('/')
121153
async def index():
122154
return HTMLResponse(index_html)

templates/admin.html

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,24 @@
101101
>
102102
</el-pagination>
103103
</el-col>
104+
<el-col v-if="activeIndex === '3'">
105+
<el-card style="height: 80vh;overflow: scroll;margin-bottom: 1rem">
106+
<el-empty v-if="locals.length === 0" description="暂时还没有文件"></el-empty>
107+
<el-card v-for="file in locals" :key="file.code">
108+
<el-row>
109+
<el-col :span="20">
110+
<div style="cursor: pointer;text-align: left">
111+
<div>文件名:${ file.name }</div>
112+
<div>路径:${ file.path }</div>
113+
</div>
114+
</el-col>
115+
<el-col :span="4">
116+
<el-button type="primary" @click="shareFile(file)">分享</el-button>
117+
</el-col>
118+
</el-row>
119+
</el-card>
120+
</el-card>
121+
</el-col>
104122
<el-col v-if="activeIndex === '4'">
105123
<el-row>
106124
<el-col :span="5" style="height: 88vh;overflow: scroll" :gutter="10">
@@ -215,6 +233,7 @@ <h2>Github:<a target="_blank"
215233
<el-button slot="append" type="primary" @click="loginAdmin">登录</el-button>
216234
</el-input>
217235
</div>
236+
218237
</div>
219238

220239
</body>
@@ -234,6 +253,7 @@ <h2>Github:<a target="_blank"
234253
menus: [],
235254
updateTab: 'INSTALL',
236255
files: [],
256+
locals: [],
237257
paginate: {
238258
page: 1,
239259
size: 10,
@@ -255,6 +275,7 @@ <h2>Github:<a target="_blank"
255275
this.menus = res.data.menus;
256276
});
257277
this.loginAdmin();
278+
this.getLocalFiles();
258279
}
259280
},
260281
methods: {
@@ -317,6 +338,30 @@ <h2>Github:<a target="_blank"
317338
});
318339
})
319340
},
341+
getLocalFiles: function () {
342+
axios.get(window.location.href + '/files', {
343+
'headers': {
344+
'pwd': this.pwd,
345+
'Content-Type': 'multipart/form-data'
346+
}
347+
}).then(res => {
348+
this.locals = res.data.data;
349+
})
350+
},
351+
shareFile: function (file) {
352+
axios.post(window.location.href + '/files', file, {
353+
'headers': {
354+
'pwd': this.pwd,
355+
'Content-Type': 'multipart/form-data'
356+
}
357+
}).then(res => {
358+
this.getLocalFiles()
359+
this.$alert(`请在24小时内使用:${res.data.data.code}`, '分享成功', {
360+
confirmButtonText: '确定',
361+
});
362+
})
363+
364+
}
320365
}
321366
})
322367
</script>

0 commit comments

Comments
 (0)