From bd0a5ebb2cbf9ecc2df96fa2e2cb0f1b37a446c9 Mon Sep 17 00:00:00 2001 From: dockermen Date: Thu, 10 Apr 2025 17:29:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E6=94=AF=E6=8C=81=EF=BC=8C=E5=88=9B=E5=BB=BACloudDriveDatabase?= =?UTF-8?q?=E7=B1=BB=E4=BB=A5=E7=AE=A1=E7=90=86=E7=BD=91=E7=9B=98=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8=E5=92=8C=E7=94=A8=E6=88=B7=E7=BD=91=E7=9B=98=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E6=9B=B4=E6=96=B0=E4=B8=BB=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E4=BB=A5=E5=AE=9E=E7=8E=B0=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E5=92=8C=E7=9B=B8=E5=85=B3API=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E5=AE=8C=E5=96=84=E7=AE=A1=E7=90=86=E5=91=98=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=9B=B4=E6=96=B0README?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=BB=A5=E6=8F=8F=E8=BF=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=AE=BE=E8=AE=A1=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++ database.db | Bin 0 -> 28672 bytes main.py | 123 ++++++++++++-- templates/admin.html | 240 +++++++++++++++++++++++++-- utils/detebase.py | 375 +++++++++++++++++++++++++++++++++++++++++++ utils/login.py | 2 +- 6 files changed, 732 insertions(+), 24 deletions(-) create mode 100644 database.db create mode 100644 utils/detebase.py diff --git a/README.md b/README.md index 5d492c9..0fcabb8 100644 --- a/README.md +++ b/README.md @@ -27,3 +27,19 @@ flask ## 用户系统 1. 用户使用外链访问后,页面显示剩余次数,到期时间倒计时 2. 用户每成功登录一次,剩余次数-1 + +## 数据库设计 +1. 网盘驱动表 + 1. 网盘服务商名称-唯一 + 2. 环境变量配置-JSON格式 + 3. 备注 +2. 用户网盘表 + 1. 从#1表里面去重获取 + 2. 登录配置-JSON格式 + 3. 备注 +3. 外链表 + 1. 网盘名称: 从#2里获取已有网盘 + 2. 总额度: 数字 + 3. 已使用额度: 数字 + 4. 外链编码: 随机uuid-不重复 + 5. 备注 \ No newline at end of file diff --git a/database.db b/database.db new file mode 100644 index 0000000000000000000000000000000000000000..8e1cbc9cc8f43e84964065ba524ac325d908877d GIT binary patch literal 28672 zcmeI)&rj1}7zglngHAvwiHBWZM@U#8OeDkvW8%a@7RJU#7vmyWTUjY&HCrWX zhPf%*WSSXfSeCg<2*WTO-D7lbZ&8})X=ms=>q~b^a?E6z9pq0KZlJ~tedON{8G|ze zwW}wcPQY;pKmY;|fB*y_009VelfYhYZ!DfnvipK9KdP$gmaUq)T$QStzF`G(++0ye zivkhT_p$;BmXWc3;@dQZWOAagAQZ`RF|(8|u98Jzm845zK9i%(ED1SrB5;OcY7JHL zotMjtBv;C2gVk)qrk$%h^o`KoWXajp97|QsszvS#^XXDnBsYT1y3tCGLoY814@FYS zWeO#sL))ghDVrOXS2Nhke7-1T7II#wW9@*Fw4d`rQOL~+D}?sTl)Ms)jA=^pCqeQy z$HntWmeF)Y-LmRcx(JeF$2PpY6vURMg8A6fTRpM($O!vv#v4T6ReZ_b!0`DB{&?(a zrqR$88ksI{sx85@hox#%G+ini`kGcbuigcT1J?~WxA5EL)ViJYy69tHj&kwwady>n z`@wFhbw}09YAD+i@Cy}=xuH+cGn2ax8*`i7yY96a>PaXY3A7n1{1@YL?#yltjMR|L z*6hB(2jFx9--&SX!g!|%912aE3LS9Q@>krytAlip3~>w}r7zeZ009U<00Izz00bZa z0SG{#%LR6~BOEijCyXAwes{EgaQxx<@vE0R2}QQ$#4OoKl&hMm+w^u3%_U~0Zzd*4 zVxwkBPb%&KH)pzwc&lB-Jz{AU-B-ajHdMV`yWu9LCcSnVWkXTDg60{mDw?U5ZOJh; zx5~P0*R0u8$}wt_b%)*-nk?(7vTUW~$MROnyWR0Xv)31ER$5mIrrWaUT{qO9ra#Wz zZMGHs=eGx6-n?iBAL@TN+`recbCvy4zcdc^@f4Ouf6Cu%`s3`UGdsc`GW;R`t;;7l z!h-+=AOHafKmY;|fB*y_009VetH5w{l=a{1i15+TKL7gP`~IK*#PDC~3pNNq00Izz z00bZa0SG_<0uX=z1TLGvP$W9i=X>tt8XFyFL(c(3-1R@pN9phXFI#x%F9aX}0SG_< z0uX=z1Rwwb2teSs1b+Vh-~UDV|MKvIyZ)#D^bZ>ZAOHafKmY;|fB*y_009U<00Lbs i;6DG4^?w%+FhYX>1Rwwb2tWV=5P$##AOHafP=W6^6@bM6 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 4b9a1b6..f09b6aa 100644 --- a/main.py +++ b/main.py @@ -1,33 +1,52 @@ import os import requests import sqlite3 +import json from flask import g from flask import Flask, render_template, request, redirect, url_for, session,make_response,send_from_directory,jsonify from flask.views import MethodView from werkzeug.routing import BaseConverter from utils.login import login_quark from utils.tools import get_cnb_weburl +from utils.detebase import CloudDriveDatabase +from functools import wraps # 导入 wraps + + +app = Flask(__name__) +#app = Flask(__name__,template_folder='templates') #修改模板目录 +app.jinja_env.auto_reload = True # 数据库配置 DATABASE = 'database.db' def get_db(): + # 从 Flask 的全局对象 g 中获取数据库连接 + # getattr 函数用于获取对象的属性,如果属性不存在则返回第三个参数作为默认值 + # 这里尝试获取 g._database 属性,如果不存在则返回 None + # 这种模式确保在一个请求中只创建一个数据库连接 db = getattr(g, '_database', None) if db is None: - db = g._database = sqlite3.connect(DATABASE) + db = g._database = CloudDriveDatabase(DATABASE) db.row_factory = sqlite3.Row return db + +# 定义数据库注入装饰器 +def inject_db(f): + @wraps(f) + def decorated_function(*args, **kwargs): + db = get_db() + # 将 db 作为第一个参数传递 + return f(db, *args, **kwargs) + return decorated_function + + @app.teardown_appcontext def close_connection(exception): db = getattr(g, '_database', None) if db is not None: db.close() -app = Flask(__name__) -#app = Flask(__name__,template_folder='templates') #修改模板目录 -app.jinja_env.auto_reload = True - exlink_info = { "exlink_id":"1", @@ -96,16 +115,96 @@ def qrlink(id): @app.route('/admin/') def admin(): - return render_template('admin.html') + db = get_db() + providers = db.get_all_drive_providers() + alluser_drives = db.get_all_user_drives() + print(alluser_drives) + return render_template('admin.html',providers=providers,alluser_drives=alluser_drives) + + +@app.route('/admin/drive_provider/',methods=['POST']) +def drive_provider(metfunc): + db = get_db() + data = {"status":False} + if metfunc == "get": + + alldrive= db.get_all_drive_providers() + if len(alldrive) > 0: + data["status"] = True + data['data'] = alldrive + # 使用jsonify确保中文正确显示 + elif metfunc == "add": + """ + json样板 + body -- { + "config_vars": { + "data": { + "client_id": "532", + "kps_wg": "", + "request_id": "", + "sign_wg": "", + "token": "", + "v": "1.2", + "vcode": "" + }, + "kps_wg": "", + "redirect_uri": "https://uop.quark.cn/cas/ajax/loginWithKpsAndQrcodeToken", + "sign_wg": "" + }, + "provider_name": "夸克网盘", + "remarks": "夸克网盘" + } + Return: status + """ + + body = request.get_json() + print(data) + status = db.add_drive_provider(body.get("provider_name","测试网盘"),body.get("config_vars"),body.get("remarks","测试网盘")) + + if status: + data["status"] = True + data["data"] = body + return data + +@app.route('/admin/user_drive/',methods=['POST']) +def user_drive(metfunc): + db = get_db() + data = {"status":False} + if metfunc == "get": + pass + elif metfunc == "add": + body = request.get_json() + print(body) + status = db.add_user_drive(body.get("provider_name","测试网盘"),body.get("config_vars"),body.get("remarks","测试网盘")) + if status: + data["status"] = True + data["data"] = body + return data class Exlink(MethodView): def get(self): db = get_db() - cursor = db.cursor() - cursor.execute('SELECT * FROM exlinks') - exlinks = cursor.fetchall() - return jsonify([dict(row) for row in exlinks]) + db.add_drive_provider( + "阿里网盘", + { + "sign_wg": "", + "kps_wg": "", + "redirect_uri": "https://uop.quark.cn/cas/ajax/loginWithKpsAndQrcodeToken", + "data":{ + 'client_id': '532', + 'v': '1.2', + 'request_id': "", + 'sign_wg': "", + 'kps_wg': "", + 'vcode': "", + 'token': "" + } + }, + "阿里网盘API配置" + ) + return jsonify({"status": True, "message": "success"}) + def post(self): data = request.json @@ -126,11 +225,15 @@ class Exlink(MethodView): app.add_url_rule('/admin/exlink', view_func=Exlink.as_view('exlink')) + + if __name__ == "__main__": + weburl = get_cnb_weburl(5000) print("Run_url:",weburl) app.config.from_pyfile("config.py") app.run(host="0.0.0.0") + diff --git a/templates/admin.html b/templates/admin.html index 21f6718..1e12c21 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -131,6 +131,18 @@ + + {% for user_drive in alluser_drives %} + {{user_drive.provider_name}} + {{user_drive.provider_name}} + 正常 + 1.5TB / 2TB + + + + + {% endfor %} + @@ -201,23 +213,30 @@
- - - + {% set provider_options = providers %} + {% for provider in provider_options %} + + {% endfor %}
- - -
-
- - -
-
- - + +
+
+ +
+ +
+
+
+
请输入有效的JSON格式配置信息
+
0 行 | 0 字符
+
+
@@ -230,6 +249,43 @@ + + +