From e722eacbb87a2da8273c2c45f4817ceead6f1201 Mon Sep 17 00:00:00 2001 From: Jalin Date: Sat, 12 Jan 2019 13:09:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7=EF=BC=8C?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=EF=BC=8C=E5=BA=94=E7=94=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- py12306/config.py | 3 +++ py12306/log/query_log.py | 2 +- py12306/web/handler/app.py | 37 ++++++++++++++++++++++++++++ py12306/web/handler/stat.py | 31 +++++++++++++++++++++++ py12306/web/handler/user.py | 32 +++++++++++++++++++++++- py12306/web/web.py | 49 ++++++++++++++++++++++++++++--------- 6 files changed, 141 insertions(+), 13 deletions(-) create mode 100644 py12306/web/handler/app.py create mode 100644 py12306/web/handler/stat.py diff --git a/py12306/config.py b/py12306/config.py index 098b25c..38fa0ba 100644 --- a/py12306/config.py +++ b/py12306/config.py @@ -61,6 +61,9 @@ class Config: EMAIL_SERVER_USER = '' EMAIL_SERVER_PASSWORD = '' + WEB_ENABLE = 0 + WEB_USER = {} + envs = [] retry_time = 5 last_modify_time = 0 diff --git a/py12306/log/query_log.py b/py12306/log/query_log.py index bb64882..5b3b092 100644 --- a/py12306/log/query_log.py +++ b/py12306/log/query_log.py @@ -17,7 +17,7 @@ class QueryLog(BaseLog): quick_log = [] data = { - 'query_count': 1, + 'query_count': 0, 'last_time': '', } data_path = None diff --git a/py12306/web/handler/app.py b/py12306/web/handler/app.py new file mode 100644 index 0000000..7bb7037 --- /dev/null +++ b/py12306/web/handler/app.py @@ -0,0 +1,37 @@ +from flask import Blueprint, request +from flask.json import jsonify +from flask_jwt_extended import ( + JWTManager, jwt_required, create_access_token, + get_jwt_identity) + +from py12306.config import Config +from py12306.query.query import Query +from py12306.user.user import User + +app = Blueprint('app', __name__) + + +@app.route('/app/menus', methods=['GET']) +@jwt_required +def menus(): + """ + 菜单列表 + """ + menus = [ + {"id": 10, "name": "首页", "url": "/", "icon": "fa fa-tachometer-alt"}, + {"id": 40, "name": "数据分析", "url": "/analyze", "icon": "fa fa-signature"}, + {"id": 50, "name": "帮助中心", "url": "/help", "icon": "fa fa-search"} + ] + return jsonify(menus) + + +@app.route('/app/actions', methods=['GET']) +@jwt_required +def actions(): + """ + 操作列表 + """ + actions = [ + {"text": "退出登录", "link": "", "icon": "fa fa-sign-out-alt"} + ] + return jsonify(actions) diff --git a/py12306/web/handler/stat.py b/py12306/web/handler/stat.py new file mode 100644 index 0000000..58387ab --- /dev/null +++ b/py12306/web/handler/stat.py @@ -0,0 +1,31 @@ +from flask import Blueprint, request +from flask.json import jsonify +from flask_jwt_extended import ( + JWTManager, jwt_required, create_access_token, + get_jwt_identity) + +from py12306.config import Config +from py12306.query.query import Query +from py12306.user.user import User + +stat = Blueprint('stat', __name__) + + +@stat.route('/stat/dashboard', methods=['GET']) +@jwt_required +def dashboard(): + """ + 状态统计 + 任务数量,用户数量,查询次数 + 节点信息(TODO) + :return: + """ + from py12306.log.query_log import QueryLog + query_job_count = len(Query().jobs) + user_job_count = len(User().users) + query_count = QueryLog().data.get('query_count') + return jsonify({ + 'query_job_count': query_job_count, + 'user_job_count': user_job_count, + 'query_count': query_count + }) diff --git a/py12306/web/handler/user.py b/py12306/web/handler/user.py index a00f039..98d7fc0 100644 --- a/py12306/web/handler/user.py +++ b/py12306/web/handler/user.py @@ -4,14 +4,44 @@ from flask_jwt_extended import ( JWTManager, jwt_required, create_access_token, get_jwt_identity) +from py12306.config import Config +from py12306.user.job import UserJob +from py12306.user.user import User + user = Blueprint('user', __name__) @user.route('/login', methods=['POST']) def login(): + """ + 用户登录 + :return: + """ username = request.json.get('username', None) password = request.json.get('password', None) - if username and password and username == '1': + if username and password and username == Config().WEB_USER.get('username') and password == Config().WEB_USER.get( + 'password'): access_token = create_access_token(identity=username) return jsonify(access_token=access_token) return jsonify({"msg": "用户名或密码错误"}), 401 + + +@user.route('/users', methods=['GET']) +def users(): + """ + 用户任务列表 + :return: + """ + jobs = User().users + result = map(convert_job_to_info, jobs) + return jsonify(result) + + +def convert_job_to_info(job: UserJob): + return { + 'key': job.key, + 'user_name': job.user_name, + 'is_ready': job.is_ready, + 'is_loaded': job.user_loaded, # 是否成功加载 ready 是当前是否可用 + 'last_heartbeat': job.last_heartbeat + } diff --git a/py12306/web/web.py b/py12306/web/web.py index 8b885c2..f56627d 100644 --- a/py12306/web/web.py +++ b/py12306/web/web.py @@ -5,23 +5,50 @@ from flask_jwt_extended import ( JWTManager, jwt_required, create_access_token, get_jwt_identity) -from py12306.web.handler.user import user +from py12306.helpers.func import * -app = Flask(__name__) -app.register_blueprint(user) # app.config['JWT_TOKEN_LOCATION'] = ['json'] -app.config['JWT_SECRET_KEY'] = 'super-secret' # Change this! -jwt = JWTManager(app) -@app.route('/', methods=['GET']) -def test(): - print(111111) +# @flask.route('/', methods=['GET']) +# def test(): +# print(111111) -def run(port=8080): - app.run(debug=True, port=port if port else 8080, host='0.0.0.0') + +# def run(port=8080): +# flask.run(debug=True, port=port if port else 8080, host='0.0.0.0') + + +@singleton +class Web: + session = None + jwt = None + + def __init__(self): + self.session = Flask(__name__) + self.register_blueprint() + self.session.config['JWT_SECRET_KEY'] = 'super-secret' # Change this! + self.jwt = JWTManager(self.session) + pass + + def register_blueprint(self): + from py12306.web.handler.user import user + from py12306.web.handler.stat import stat + from py12306.web.handler.app import app + self.session.register_blueprint(user) + self.session.register_blueprint(stat) + self.session.register_blueprint(app) + + @classmethod + def run(cls): + self = cls() + self.start() + pass + + def start(self): + self.session.run(debug=True, port=8080, host='0.0.0.0') if __name__ == '__main__': - run() + Web.run()