Skip to content

Commit a891fbe

Browse files
committed
feat: 新增后台选择过期方式
1 parent bea89f9 commit a891fbe

File tree

8 files changed

+45
-39
lines changed

8 files changed

+45
-39
lines changed

apps/admin/views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from apps.admin.depends import admin_required
1010
from apps.admin.pydantics import IDData
11-
from apps.base.models import FileCodes
11+
from apps.base.models import FileCodes, KeyValue
1212
from core.response import APIResponse
1313
from core.settings import settings
1414
from core.storage import file_storage
@@ -44,15 +44,15 @@ async def file_list(page: float = 1, size: int = 10):
4444

4545
@admin_api.get('/config/get', dependencies=[Depends(admin_required)])
4646
async def get_config():
47-
return APIResponse(detail=settings.__dict__)
47+
return APIResponse(detail=settings.items())
4848

4949

5050
@admin_api.patch('/config/update', dependencies=[Depends(admin_required)])
5151
async def update_config(data: dict):
5252
admin_token = data.get('admin_token')
5353
if admin_token is None or admin_token == '':
5454
return APIResponse(code=400, detail='管理员密码不能为空')
55-
55+
await KeyValue.filter(key='settings').update(value=data)
5656
for k, v in data.items():
5757
settings.__setattr__(k, v)
5858
return APIResponse()

apps/base/models.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class FileCodes(Model):
2424
expired_at: Optional[datetime] = fields.DatetimeField(null=True, description='过期时间')
2525
expired_count: Optional[int] = fields.IntField(description='可用次数', default=0)
2626
used_count: Optional[int] = fields.IntField(description='已用次数', default=0)
27-
2827
created_at: Optional[datetime] = fields.DatetimeField(auto_now_add=True, description='创建时间')
2928

3029
async def is_expired(self):
@@ -41,4 +40,11 @@ async def get_file_path(self):
4140
return f"{self.file_path}/{self.uuid_file_name}"
4241

4342

43+
class KeyValue(Model):
44+
id: Optional[int] = fields.IntField(pk=True)
45+
key: Optional[str] = fields.CharField(max_length=255, description='键', index=True, unique=True)
46+
value: Optional[str] = fields.JSONField(description='值', null=True)
47+
created_at: Optional[datetime] = fields.DatetimeField(auto_now_add=True, description='创建时间')
48+
49+
4450
file_codes_pydantic = pydantic_model_creator(FileCodes, name='FileCodes')

core/storage.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,4 +288,5 @@ async def get_file_response(self, file_code: FileCodes):
288288
'onedrive': OneDriveFileStorage,
289289
'opendal': OpenDALFileStorage,
290290
}
291+
291292
file_storage: FileStorageInterface = storages[settings.file_storage]()

fcb-fronted/src/locals/i18n.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const language = (
44
navigator.language || 'zh_cn'
55
).toLowerCase();
66
const lang = (localStorage.getItem('language') || language).replace(/-/, '_');
7-
console.log(lang)
7+
88
const i18n = createI18n({
99
silentTranslationWarn: true,
1010
globalInjection: true,

fcb-fronted/src/locals/zh.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export default {
5656
background: '背景图片',
5757
admin_token: '管理密码',
5858
uploadSize: '文件大小',
59+
expireStyle: '过期方式',
5960
uploadSizeNote: '最大文件大小,单位:(Bytes),1mb=1 * 1024 * 1024',
6061
openUpload: {
6162
title: '开启上传',

fcb-fronted/src/views/Admin/SettingView.vue

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,28 @@
2323
<template #append>Bytes</template>
2424
<small>{{ t('admin.settings.uploadSizeNote') }}</small>
2525
</el-form-item>
26+
<el-form-item size="large" :label="t('admin.settings.expireStyle')" >
27+
<el-select
28+
v-model="config.expireStyle"
29+
multiple
30+
style="width: 100%"
31+
>
32+
<el-option :label="t('send.expireData.day')" value="day" />
33+
<el-option :label="t('send.expireData.hour')" value="hour" />
34+
<el-option :label="t('send.expireData.minute')" value="minute" />
35+
<el-option :label="t('send.expireData.forever')" value="forever" />
36+
<el-option :label="t('send.expireData.count')" value="count" />
37+
</el-select>
38+
</el-form-item>
2639
<el-form-item size="large" :label="t('admin.settings.openUpload.title')">
27-
<el-select v-model="config.openUpload">
40+
<el-select v-model="config.openUpload" style="width: 80%">
2841
<el-option :label="t('admin.settings.openUpload.open')" :value="1" />
2942
<el-option :label="t('admin.settings.openUpload.close')" :value="0" />
3043
</el-select>
3144
<small style="margin-left: 0.4rem">{{ t('admin.settings.openUpload.note') }}</small>
3245
</el-form-item>
3346
<el-form-item size="large" :label="t('admin.settings.file_storage.title')">
34-
<el-select v-model="config.file_storage">
47+
<el-select v-model="config.file_storage" style="width: 80%">
3548
<el-option :label="t('admin.settings.file_storage.local')" value="local" />
3649
<el-option :label="t('admin.settings.file_storage.s3')" value="s3" />
3750
</el-select>
@@ -105,14 +118,15 @@ const config = ref({
105118
name: '',
106119
description: '',
107120
file_storage: '',
121+
expireStyle: [],
108122
admin_token: '',
109123
keywords: '',
110124
openUpload: 1,
111125
uploadSize: 1,
112126
uploadMinute: 1,
113127
s3_access_key_id: '',
114128
background: '',
115-
page_explain:'',
129+
page_explain: '',
116130
s3_secret_access_key: '',
117131
aws_session_token: '',
118132
s3_signature_version: '',

fcb-fronted/src/views/Share/SendView.vue

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ import { ref } from 'vue'
33
import CardTools from "@/components/CardTools.vue";
44
import UploadFile from "@/components/UploadFile.vue";
55
import UploadText from "@/components/UploadText.vue";
6-
76
import { useI18n } from 'vue-i18n'
7+
import { useConfigStore } from "@/stores/config";
8+
9+
const { config } = useConfigStore();
810
911
const { t } = useI18n()
1012
const shareData = ref({
@@ -27,11 +29,11 @@ const shareData = ref({
2729
>
2830
<template #prepend>
2931
<el-select v-model="shareData.expireStyle" :placeholder="t('send.expireStyle')" style="width: 75px">
30-
<el-option :label="t('send.expireData.day')" value="day" />
31-
<el-option :label="t('send.expireData.hour')" value="hour" />
32-
<el-option :label="t('send.expireData.minute')" value="minute" />
33-
<el-option :label="t('send.expireData.forever')" value="forever" />
34-
<el-option :label="t('send.expireData.count')" value="count" />
32+
<el-option v-for="item in config.expireStyle" :key="item" :label="t(`send.expireData.${item}`)" :value="item" />
33+
<!-- <el-option :label="t('send.expireData.hour')" value="hour" />-->
34+
<!-- <el-option :label="t('send.expireData.minute')" value="minute" />-->
35+
<!-- <el-option :label="t('send.expireData.forever')" value="forever" />-->
36+
<!-- <el-option :label="t('send.expireData.count')" value="count" />-->
3537
</el-select>
3638
</template>
3739
<template #append>

main.py

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@
66
import re
77

88
from fastapi import FastAPI
9-
from starlette.middleware.cors import CORSMiddleware
10-
from starlette.responses import HTMLResponse, FileResponse
9+
from fastapi.middleware.cors import CORSMiddleware
10+
from fastapi.responses import HTMLResponse
1111
from tortoise.contrib.fastapi import register_tortoise
1212

13+
from apps.base.models import KeyValue
1314
from apps.base.views import share_api
1415
from apps.admin.views import admin_api
1516
from core.response import APIResponse
16-
from core.settings import data_root, settings, BASE_DIR
17+
from core.settings import data_root, settings, BASE_DIR, DEFAULT_CONFIG
1718
from core.tasks import delete_expire_files
18-
from core.utils import max_save_times_desc
1919

2020
app = FastAPI()
2121

@@ -27,27 +27,6 @@
2727
allow_headers=["*"],
2828
)
2929

30-
31-
@app.get('/assets/{file_path:path}')
32-
async def assets(file_path: str):
33-
if settings.max_save_seconds > 0:
34-
if re.match(r'SendView-[\d|a-f|A-F]+\.js', file_path):
35-
with open(BASE_DIR / f'fcb-fronted/dist/assets/{file_path}', 'r', encoding='utf-8') as f:
36-
# 删除永久保存选项
37-
content = f.read()
38-
content = content.replace('_(c,{label:e(r)("send.expireData.forever"),value:"forever"},null,8,["label"]),', '')
39-
return HTMLResponse(content=content, media_type='text/javascript')
40-
if re.match(r'index-[\d|a-f|A-F]+\.js', file_path):
41-
with open(BASE_DIR / f'fcb-fronted/dist/assets/{file_path}', 'r', encoding='utf-8') as f:
42-
# 更改本文描述
43-
desc_zh, desc_en = await max_save_times_desc(settings.max_save_seconds)
44-
content = f.read()
45-
content = content.replace('天数<7', desc_zh)
46-
content = content.replace('Days <7', desc_en)
47-
return HTMLResponse(content=content, media_type='text/javascript')
48-
return FileResponse(f'fcb-fronted/dist/assets/{file_path}')
49-
50-
5130
register_tortoise(
5231
app,
5332
generate_schemas=True,
@@ -75,6 +54,8 @@ async def assets(file_path: str):
7554
async def startup_event():
7655
# 启动后台任务,不定时删除过期文件
7756
asyncio.create_task(delete_expire_files())
57+
user_config, created = await KeyValue.get_or_create(key='settings', defaults={'value': DEFAULT_CONFIG})
58+
settings.user_config = user_config.value
7859

7960

8061
@app.get('/')
@@ -94,6 +75,7 @@ async def get_config():
9475
return APIResponse(detail={
9576
'explain': settings.page_explain,
9677
'uploadSize': settings.uploadSize,
78+
'expireStyle': settings.expireStyle,
9779
})
9880

9981

0 commit comments

Comments
 (0)