增加集群状态支持

This commit is contained in:
Jalin
2019-01-14 16:06:27 +08:00
parent 26d0f5a1de
commit 550c87d77a
9 changed files with 82 additions and 17 deletions

View File

@@ -16,7 +16,7 @@
- [x] Docker 支持
- [x] 动态修改配置文件
- [x] 邮件通知
- [ ] Web 管理页面
- [x] Web 管理页面
- [ ] 微信消息通知
## 使用
@@ -100,16 +100,38 @@ docker run -d -v $(pwd):/config -v py12306:/data pjialin/py12306
```
当前目录会多一个 12306.log 的日志文件, `tail -f 12306.log`
## 更新
### 19-01-10
* 支持分布式集群
### 19-01-11
* 配置文件支持动态修改
### 19-01-12
* 新增免费打码
## Web 管理页面
## 下单成功截图
![下单成功图片](./data/images/order_success.png)
目前支持用户和任务以及日志日志查看,更多功能后续会不断加入
**使用**
打开 Web 功能需要将配置中的 `WEB_ENABLE` 打开,启动程序后访问当前主机地址 + 端口号 (默认 8008) 即可,如 http://127.0.0.1:8008
## 更新
- 19-01-10
支持分布式集群
- 19-01-11
配置文件支持动态修改
- 19-01-12
新增免费打码
- 19-01-14
新增 Web 页面支持
## 截图
### Web 管理页面
![Web 管理页面图片](https://github.com/pjialin/py12306/blob/master/data/images/web.png)
### 下单成功
![下单成功图片](https://github.com/pjialin/py12306/blob/master/data/images/order_success.png)
### 关于防封
目前查询和登录操作是分开的,查询是不依赖用户是否登录,放在 A 云 T 云容易被限制 ip建议在其它网络环境下运行

BIN
data/images/web.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

View File

@@ -30,7 +30,7 @@ class OrderLog(BaseLog):
MESSAGE_QUERY_ORDER_WAIT_TIME_INFO = '{} 次排队,请耐心等待'
MESSAGE_ORDER_SUCCESS_NOTIFICATION_TITLE = '车票购买成功!'
MESSAGE_ORDER_SUCCESS_NOTIFICATION_CONTENT = '请及时登录12306打开 \'未完成订单\'在30分钟内完成支付!'
MESSAGE_ORDER_SUCCESS_NOTIFICATION_CONTENT = '请及时登录12306打开 \'未完成订单\'在30分钟内完成支付!'
MESSAGE_ORDER_SUCCESS_NOTIFICATION_OF_VOICE_CODE_START_SEND = '正在发送语音通知, 第 {}'
MESSAGE_ORDER_SUCCESS_NOTIFICATION_OF_VOICE_CODE_CONTENT = '你的车票 {}{} 购买成功,请登录 12306 进行支付'

View File

@@ -29,6 +29,7 @@ class UserJob:
user_loaded = False # 用户是否已加载成功
passengers = []
retry_time = 3
login_num = 0 # 尝试登录次数
# Init page
global_repeat_submit_token = None
@@ -101,9 +102,9 @@ class UserJob:
return self.last_heartbeat
def set_last_heartbeat(self):
def set_last_heartbeat(self, time=None):
if Config().is_cluster_enabled():
return self.cluster.session.set(Cluster.KEY_USER_LAST_HEARTBEAT, time_int())
return self.cluster.session.set(Cluster.KEY_USER_LAST_HEARTBEAT, time if time != None else time_int())
self.last_heartbeat = time_int()
# def init_cookies
@@ -184,6 +185,7 @@ class UserJob:
用户登录成功
:return:
"""
self.login_num += 1
self.welcome_user()
self.save_user()
self.get_user_info()
@@ -222,6 +224,7 @@ class UserJob:
self.user_did_load()
else:
UserLog.add_quick_log(UserLog.MESSAGE_LOADED_USER_BUT_EXPIRED).flush()
self.set_last_heartbeat(0)
def user_did_load(self):
"""

View File

@@ -27,3 +27,25 @@ def dashboard():
'user_job_count': user_job_count,
'query_count': query_count
})
@stat.route('/stat/cluster', methods=['GET'])
@jwt_required
def clusters():
"""
节点统计
节点数量,主节点,子节点列表
:return:
"""
from py12306.cluster.cluster import Cluster
nodes = Cluster().nodes
count = len(nodes)
node_lists = list(nodes)
master = [key for key, val in nodes.items() if int(val) == Cluster.KEY_MASTER]
master = master[0] if master else ''
return jsonify({
'master': master,
'count': count,
'node_lists': ', '.join(node_lists)
})

View File

@@ -49,6 +49,7 @@ def user_info():
}
return jsonify(result)
def convert_job_to_info(job: UserJob):
return {
'key': job.key,
@@ -56,5 +57,6 @@ def convert_job_to_info(job: UserJob):
'name': job.get_name(),
'is_ready': job.is_ready,
'is_loaded': job.user_loaded, # 是否成功加载 ready 是当前是否可用
'last_heartbeat': timestamp_to_time(job.last_heartbeat)
'last_heartbeat': timestamp_to_time(job.last_heartbeat),
'login_num': job.login_num
}

View File

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,3 @@
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>py12306 购票助手</title><link href=../../static/css/app.dfb5ffed622907edd7c5f81709f2b782.css rel=stylesheet></head><body><script>window.config = {
API_BASE_URL: 'http://localhost:8080/',
}</script><div id=app></div><script type=text/javascript src=../../static/js/manifest.82f431004cf9bb6ad2cb.js></script><script type=text/javascript src=../../static/js/vendor.aebd1de04bf90e88d9c7.js></script><script type=text/javascript src=../../static/js/app.96ef02c9e5601eb5ebcb.js></script></body></html>
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>py12306 购票助手</title><link href=../../static/css/app.35e2fbd94557d71d1e2bfa0d4bb44d13.css rel=stylesheet></head><body><script>window.config = {
API_BASE_URL: 'http://localhost:8008/',
}</script><div id=app></div><script type=text/javascript src=../../static/js/manifest.82f431004cf9bb6ad2cb.js></script><script type=text/javascript src=../../static/js/vendor.aebd1de04bf90e88d9c7.js></script><script type=text/javascript src=../../static/js/app.7d7d65cccfbfa339beba.js></script></body></html>

View File

File diff suppressed because one or more lines are too long