diff --git a/api.json b/api.json index d92294f..fba3228 100644 --- a/api.json +++ b/api.json @@ -5,7 +5,6 @@ "method": "POST", "header": { "Referer": "https://fanyi.caiyunapp.com/", - "Cookie": "UM_distinctid=17fd5c7a9ba69a-0200a7005bf45a-56171958-146d15-17fd5c7a9bb749; _gid=GA1.2.2046680529.1648971157; _gat_gtag_UA_185151443_2=1; _ga=GA1.2.44459633.1648559084; _ga_65TZCJSDBD=GS1.1.1648971156.4.1.1648971164.0; _ga_R9YPR75N68=GS1.1.1648971156.4.1.1648971164.52", "Cy-Token": "token 9876032166" }, "data": { diff --git a/flask_app/__init__.py b/flask_app/__init__.py new file mode 100644 index 0000000..01e1d78 --- /dev/null +++ b/flask_app/__init__.py @@ -0,0 +1,40 @@ +# encoding=utf8 +# app 工厂函数 +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import sys,os +from loguru import logger + + +# 判断系统 +WIN = sys.platform.startswith('win') +if WIN: # 如果是 Windows 系统,使用三个斜线 + prefix = 'sqlite:///' +else: # 否则使用四个斜线 + prefix = 'sqlite:////' + +# 日志处理 +logger.remove() +logger.add( + sink=sys.stdout, + format="{time:YYYY-MM-DD at HH:mm:ss} - {level} - {message}", + colorize=True, + backtrace=True +) + + + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = prefix + \ + os.path.join(app.root_path, 'data.db') +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭对模型修改的监控 +db = SQLAlchemy(app) + +# buleprint +from .views import main as main_blueprint +app.register_blueprint(main_blueprint) + + + + + diff --git a/flask_app/app.py b/flask_app/app.py deleted file mode 100644 index b74fa83..0000000 --- a/flask_app/app.py +++ /dev/null @@ -1,122 +0,0 @@ -# encoding=utf8 -import json -import time -from flask import Flask, make_response, request, jsonify, render_template -from flask_cors import CORS -from urllib3 import disable_warnings - -from utils import * - -disable_warnings() - -app = Flask(__name__) -CORS(app, supports_credentials=True, resources="/*") # 跨域 - -# 解决与 vue 冲突 -app.jinja_env.variable_start_string = '[[' -app.jinja_env.variable_end_string = ']]' - -def request_parse(req_data: request) -> dict: - '''解析请求数据并以字典的形式返回''' - if req_data.method == 'POST': - data = req_data.form - - elif req_data.method == 'GET': - data = req_data.args - - return dict(data) - - -class BaseResponse(BaseModel): - """返回的响应""" - status: int = 0 # 状态码 0-->成功 1-->失败 - msg: str = "前端显示的简短信息" - data: Optional[str] - - @property - def resp(self): - '''BaseModel类型返回json''' - response = make_response( - json.dumps( - self.dict(), - ensure_ascii=False, - sort_keys=False - ), - ) - response.mimetype = 'application/json' - # 跨域设置 - response.headers['Access-Control-Allow-Origin'] = '*' - response.headers['Access-Control-Allow-Methods'] = 'OPTIONS,HEAD,GET,POST' - response.headers['Access-Control-Allow-Headers'] = 'x-requested-with' - return response - - -@app.route("/", methods=['GET']) -def index(): - return render_template('admin.html') - -@app.route("/testapi/", methods=['POST']) -@logger.catch -def testapi(): - brs = BaseResponse() - # 需要传入 json 数据 - try: - jsonData = request.get_json() - api = API(**jsonData) - phone = jsonData.get('phone') - if not phone: - raise ValueError("参数 phone 没有!") - try: - resp = test_resq(api, phone) - brs.status = 0 - brs.msg = f"请求成功!{resp}" - brs.data = resp.text - except Exception as why: - brs.status = 1 - brs.msg = f"请求失败:{why}" - except Exception as why: - brs.status = 1 - brs.msg = f"参数有误:{why}" - return brs.resp - - -@app.route("/submitapi/", methods=['POST']) -def submitapi(): - """提交API到json文件""" - # 需要传入 json 数据 - jsonData = request.get_json() - api = API(**jsonData).handle_API() - data = json.loads(json_path.read_text(encoding='utf8')) - with open(json_path, mode="w", encoding="utf8") as j: - try: - data.append(api.dict()) - json.dump(data, j, ensure_ascii=False, sort_keys=False) - return BaseResponse(status=0, msg="写入成功!").resp - except Exception as why: - return BaseResponse(status=1, msg=f"写入失败!{why}").resp - - -@app.route("/backapi/", methods=['GET', 'POST']) -def backjson(): - """备份json文件""" - try: - timeStruct = time.localtime(int(time.time())) - strTime = time.strftime("%Y_%m_%d_%H_%M_%S", timeStruct) - Path(json_path.parent, 'apiback').mkdir(exist_ok=True) - json_back_path = Path(json_path.parent, 'apiback', - f"api_back_{strTime}.json") - with open(json_back_path, mode="w") as j: - j_data = json.loads(json_path.read_text(encoding='utf8')) - json.dump(j_data, j, ensure_ascii=False, sort_keys=False) - return BaseResponse(status=0, msg="备份成功!").resp - except Exception as why: - return BaseResponse(status=1, msg=f"备份失败{why}").resp - - -@app.route("/downloadapi/", methods=['GET']) -def downloadapi(): - """下载接口文件""" - return json_path.read_text(encoding='utf8') - - -app.run(host="0.0.0.0", port=10981, debug=True) diff --git a/flask_app/data.db b/flask_app/data.db new file mode 100644 index 0000000..ec54978 Binary files /dev/null and b/flask_app/data.db differ diff --git a/flask_app/model.py b/flask_app/model.py new file mode 100644 index 0000000..e03bf1f --- /dev/null +++ b/flask_app/model.py @@ -0,0 +1,13 @@ +# encoding=utf8 +# 储存数据库模型 +from . import db +from datetime import datetime + +class Apis(db.Model): + id = db.Column(db.Integer, primary_key=True) # 主键 + desc = db.Column(db.String(100)) # 描述 + url = db.Column(db.String(100)) # 链接 + method = db.Column(db.String(10)) # 请求方法 + header = db.Column(db.String(9999)) # 请求头 + data = db.Column(db.String(9999)) # 请求数据 + add_time = db.Column(db.DateTime(), default=datetime.now()) # 添加时间 diff --git a/flask_app/views/__init__.py b/flask_app/views/__init__.py new file mode 100644 index 0000000..cd43d14 --- /dev/null +++ b/flask_app/views/__init__.py @@ -0,0 +1,6 @@ +from flask import Blueprint + +main = Blueprint("main",__name__) + +from . import views +from .. import db \ No newline at end of file diff --git a/flask_app/views/views.py b/flask_app/views/views.py new file mode 100644 index 0000000..961f098 --- /dev/null +++ b/flask_app/views/views.py @@ -0,0 +1,9 @@ +# encoding=utf8 +# flask app views +from . import main +from .. import db + +@main.route("/",methods=['GET','POST']) +def index(): + return "index" + diff --git a/run.py b/run.py new file mode 100644 index 0000000..45762ab --- /dev/null +++ b/run.py @@ -0,0 +1,62 @@ +# encoding=utf8 +# flask app 主文件 +import click +from loguru import logger +from pathlib import Path +import json +from flask_app import db, app +from flask_app.model import Apis + + +@click.command() +@click.option('--drop', is_flag=True, help='重建数据库') # 设置选项 +def init(drop): + """初始化数据库""" + if drop: + db.drop_all() + logger.info("删除数据库...准备重建..") + db.create_all() + logger.success("数据库创建成功") + + +@click.command() +@logger.catch() +def json2sqlite(): + """将json数据转为sqlite数据库""" + j = Path(app.root_path).parent.joinpath( + "api.json").read_text(encoding="utf8") + + jss = json.loads(j) + for js in jss: + api = Apis( + desc=str(js['desc']), + url=str(js['url']), + method=str(js['method']), + data=str(js['data']), + header=str(js['header']) + ) + # print(api.desc) + db.session.add(api) + db.session.commit() + logger.success("json To sqlite 成功!") + + +@click.command() +@click.option('--host', '-h', help='监听地址', default="0.0.0.0") +@click.option('--port', '-p', help='监听端口', default=9090) +def start(host, port): + """启动 flask app""" + app.run(host=host, port=port, debug=True) + + +@click.group() +def cli(): + pass + + +cli.add_command(init) +cli.add_command(start) +cli.add_command(json2sqlite) + +if __name__ == "__main__": + cli()