Skip to content

Commit ee5beb2

Browse files
committed
重构中,配置存入数据库,第一次智能生成随机后台地址,登录密码
1 parent c19da62 commit ee5beb2

11 files changed

Lines changed: 234 additions & 234 deletions

File tree

.github/FUNDING.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# These are supported funding model platforms
22

3-
github: [vastsa]
4-
custom: [https://share.lanol.cn]
3+
github: [ vastsa ]
4+
custom: [ https://share.lanol.cn ]

core/__init__.py

Whitespace-only changes.

core/database.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import datetime
2+
3+
from sqlalchemy import Boolean, Column, Integer, String, DateTime, JSON, Text, select, insert, delete
4+
from sqlalchemy.ext.declarative import declarative_base
5+
from sqlalchemy.ext.asyncio import create_async_engine
6+
from sqlalchemy.ext.asyncio.session import AsyncSession
7+
from settings import settings
8+
9+
engine = create_async_engine(settings.DATABASE_URL)
10+
11+
Base = declarative_base()
12+
13+
14+
class Options(Base):
15+
__tablename__ = 'options'
16+
id = Column(Integer, primary_key=True, index=True)
17+
key = Column(String, unique=True, index=True)
18+
value = Column(JSON)
19+
20+
21+
class Codes(Base):
22+
__tablename__ = "codes"
23+
id = Column(Integer, primary_key=True, index=True)
24+
code = Column(String(10), unique=True, index=True)
25+
key = Column(String(30), unique=True)
26+
name = Column(String(500))
27+
size = Column(Integer)
28+
type = Column(String(20))
29+
text = Column(Text)
30+
used = Column(Boolean, default=False)
31+
count = Column(Integer, default=-1)
32+
use_time = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now)
33+
exp_time = Column(DateTime, nullable=True)
34+
35+
36+
async def init_models():
37+
async with engine.begin() as conn:
38+
await conn.run_sync(Base.metadata.create_all)
39+
if await conn.scalar(select(Options).filter(Options.key == 'INSTALL')) is None:
40+
# 如果没有存在install,则清空表,并插入默认数据
41+
await conn.execute(delete(table=Options))
42+
await conn.execute(insert(table=Options, values=[
43+
{'key': 'INSTALL', 'value': settings.VERSION},
44+
{'key': 'BANNERS', 'value': settings.BANNERS},
45+
{'key': 'ENABLE_UPLOAD', 'value': settings.ENABLE_UPLOAD},
46+
{'key': 'MAX_DAYS', 'value': settings.MAX_DAYS},
47+
{'key': 'ERROR_COUNT', 'value': settings.ERROR_COUNT},
48+
{'key': 'ERROR_MINUTE', 'value': settings.ERROR_COUNT},
49+
{'key': 'UPLOAD_COUNT', 'value': settings.UPLOAD_COUNT},
50+
{'key': 'UPLOAD_MINUTE', 'value': settings.UPLOAD_MINUTE},
51+
{'key': 'DELETE_EXPIRE_FILES_INTERVAL', 'value': settings.DELETE_EXPIRE_FILES_INTERVAL},
52+
{'key': 'ADMIN_ADDRESS', 'value': settings.ADMIN_ADDRESS},
53+
{'key': 'ADMIN_PASSWORD', 'value': settings.ADMIN_PASSWORD},
54+
{'key': 'FILE_SIZE_LIMIT', 'value': settings.FILE_SIZE_LIMIT},
55+
{'key': 'TITLE', 'value': settings.TITLE},
56+
{'key': 'DESCRIPTION', 'value': settings.DESCRIPTION},
57+
{'key': 'KEYWORDS', 'value': settings.KEYWORDS},
58+
{'key': 'STORAGE_ENGINE', 'value': settings.STORAGE_ENGINE},
59+
{'key': 'STORAGE_CONFIG', 'value': {}},
60+
]))
61+
print(
62+
f'初始化数据库成功!\n'
63+
f'如您未配置.env文件,将为您随机生成信息\n'
64+
f'您的后台地址为:/{settings.ADMIN_ADDRESS}\n'
65+
f'您的管理员密码为:{settings.ADMIN_PASSWORD}\n'
66+
f'请尽快修改后台信息!\n'
67+
f'FileCodeBox https://github.com/vastsa/FileCodeBox'
68+
)
69+
else:
70+
# 从数据库更新缓存中的setting
71+
await settings.update(await conn.execute(select(Options).filter()))
72+
73+
74+
async def get_session():
75+
async with AsyncSession(engine, expire_on_commit=False) as s:
76+
yield s

depends.py renamed to core/depends.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33

44
from fastapi import Header, HTTPException, Request
55

6-
import settings
6+
from settings import settings
77

88

99
async def admin_required(pwd: Union[str, None] = Header(default=None), request: Request = None):
1010
if 'share' in request.url.path:
1111
if pwd != settings.ADMIN_PASSWORD and not settings.ENABLE_UPLOAD:
1212
raise HTTPException(status_code=403, detail='本站上传功能已关闭,仅管理员可用')
1313
else:
14+
print(settings.ADMIN_PASSWORD)
15+
if settings.ADMIN_PASSWORD is None:
16+
raise HTTPException(status_code=404, detail='您未设置管理员密码,无法使用此功能,请更新配置文件后,重启系统')
1417
if not pwd or pwd != settings.ADMIN_PASSWORD:
1518
raise HTTPException(status_code=401, detail="密码错误,请重新登录")
1619

storage.py renamed to core/storage.py

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,19 @@
44
from pathlib import Path
55
from typing import BinaryIO
66
from fastapi import UploadFile
7-
import settings
8-
import oss2
97

8+
from core.database import Codes
9+
from settings import settings
1010

11-
class AliyunFileStore:
11+
if settings.STORAGE_ENGINE == 'aliyunsystem':
12+
try:
13+
import oss2
14+
except ImportError:
15+
os.system('pip install oss2')
16+
import oss2
17+
18+
19+
class AliyunFileStorage:
1220
def __init__(self):
1321
auth = oss2.Auth(settings.KeyId, settings.KeySecret)
1422
self.bucket = oss2.Bucket(auth, settings.OSS_ENDPOINT, settings.BUCKET_NAME)
@@ -21,10 +29,10 @@ async def get_text(self, file: UploadFile, key: str):
2129
now = datetime.now()
2230
path = f"FileCodeBox/upload/{now.year}/{now.month}/{now.day}"
2331
text = f"{path}/{f'{key}.{ext}'}"
24-
return text
32+
return f"https://{settings.BUCKET_NAME}.{settings.OSS_ENDPOINT}/{text}"
2533

26-
async def get_filepath(self, text: str):
27-
text = text.strip(f"https://{settings.BUCKET_NAME}.{settings.OSS_ENDPOINT}/")
34+
async def get_url(self, info: Codes):
35+
text = info.text.strip(f"https://{settings.BUCKET_NAME}.{settings.OSS_ENDPOINT}/")
2836
url = self.bucket.sign_url('GET', text, settings.ACCESSTIME, slash_safe=True)
2937
return url
3038

@@ -47,10 +55,10 @@ def _save(filepath, file: BinaryIO):
4755

4856
async def save_file(self, file: UploadFile, remote_filepath: str):
4957
now = int(datetime.now().timestamp())
50-
upload_filepath = settings.DATA_ROOT+str(now)
58+
upload_filepath = settings.DATA_ROOT + str(now)
5159
await asyncio.to_thread(self._save, upload_filepath, file.file)
52-
self.upload_file(upload_filepath,remote_filepath)
53-
await asyncio.to_thread(os.remove,upload_filepath)
60+
self.upload_file(upload_filepath, remote_filepath)
61+
await asyncio.to_thread(os.remove, upload_filepath)
5462

5563
async def delete_files(self, texts):
5664
tasks = [self.delete_file(text) for text in texts]
@@ -66,10 +74,14 @@ def __init__(self):
6674
self.DATA_ROOT = Path(settings.DATA_ROOT)
6775
self.STATIC_URL = settings.STATIC_URL
6876
self.NAME = "filesystem"
77+
self.DOWN_PATH = '/select'
6978

7079
async def get_filepath(self, text: str):
7180
return self.DATA_ROOT / text.lstrip(self.STATIC_URL + '/')
7281

82+
async def get_url(self, info: Codes):
83+
return f'{self.DOWN_PATH}?code={info.code}'
84+
7385
async def get_text(self, file: UploadFile, key: str):
7486
ext = file.filename.split('.')[-1]
7587
now = datetime.now()
@@ -122,5 +134,5 @@ def judge_delete_folder(self, filepath):
122134

123135
STORAGE_ENGINE = {
124136
"filesystem": FileSystemStorage,
125-
"aliyunsystem": AliyunFileStore
137+
"aliyunsystem": AliyunFileStorage
126138
}

utils.py renamed to core/utils.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import asyncio
44
from sqlalchemy import or_, select, delete
55
from sqlalchemy.ext.asyncio.session import AsyncSession
6-
import settings
7-
from database import Codes, engine
8-
from depends import IPRateLimit
9-
from storage import STORAGE_ENGINE
6+
from .database import Codes, engine
7+
from .depends import IPRateLimit
8+
from .storage import STORAGE_ENGINE
9+
from settings import settings
1010

1111
storage = STORAGE_ENGINE[settings.STORAGE_ENGINE]()
1212

database.py

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)