Commit c739dee8 authored by wanli's avatar wanli

update

parent f778c0b8
......@@ -82,7 +82,7 @@ class LoginManager(object):
update_login_information(real_ip, result.id)
# 返回token
token = Auth.encode_auth_token(result.id, result.username) # 生成 token
token = Auth.encode_auth_token(result.id, result.username, str(result.uuid)) # 生成 token
# setattr(result, 'token', token)
return { 'token': token, 'id': result.id, 'username': result.username }, ResponseCode.OK
......
......@@ -5,7 +5,6 @@ import logging
import copy
from datetime import datetime
from pony.orm import *
from flask import request
from model import fullStackDB
from model.user import User
from utils import md5_salt
......@@ -27,7 +26,7 @@ class UserManager(object):
return False
return True
def add(self, data):
def add(self, uuid, data):
'''
添加用户
'''
......@@ -37,7 +36,7 @@ class UserManager(object):
if isExists:
return False, "user already exists"
editor = User.get(id=request.current_user.get("id"))
editor = User.get(uuid=uuid)
if not editor:
return False, "current user is not exists"
......@@ -62,7 +61,7 @@ class UserManager(object):
删除用户
'''
with db_session:
editor = User.get(id=request.current_user.get("id"))
editor = User.get(uuid=uuid)
if not editor:
return False, "current user is not exists"
......@@ -84,7 +83,7 @@ class UserManager(object):
with db_session:
# 查询请求者是否存在
editor = User.get(id=request.current_user.get("id"))
editor = User.get(uuid=uuid)
if not editor:
return False, "current user is not exists"
......@@ -101,12 +100,12 @@ class UserManager(object):
else:
return None, "user does not exists"
def get(self):
def get(self, user):
'''
查询单用户
'''
result = User.get(id=request.current_user.get("id"), is_delete=False)
result = User.get(id=user, is_delete=False)
if result:
temp = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "username", "account", "role", "phone", "email", "gender", "create_at", "update_at"])
temp.update({
......
......@@ -33,7 +33,7 @@ class Auth(object):
return inner
@staticmethod
def encode_auth_token(user_id, username):
def encode_auth_token(user_id, username, uuid):
"""
生成认证Token
:param user_id: int
......@@ -49,6 +49,7 @@ class Auth(object):
'sub': user_id, # token所属者
'data': { # payload
'id': user_id,
'uuid': uuid,
'username': username
}
}
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from pony.orm import PrimaryKey, Required, Optional, LongStr
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, Json
from pony.orm import PrimaryKey, Required, Optional, Json
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from pony.orm import PrimaryKey, Required, Optional, Set
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from pony.orm import PrimaryKey, Required, Optional, Json
from app import config
from . import fullStackDB
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 18:24:18
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\model\device.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, Json
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 18:26:25
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\model\monitor.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
......@@ -14,9 +6,9 @@ import uuid
from app.setting import config
from datetime import datetime
from sqlalchemy import create_engine
from sqlalchemy import func, Column, Integer, String, Float, DateTime, Numeric, Boolean
from sqlalchemy import func, Column, Integer, String, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, class_mapper, object_mapper
from sqlalchemy.orm import sessionmaker, class_mapper
engine = create_engine('sqlite:///{}?check_same_thread=False'.format(config.get("DATABASE")), echo=False)
......@@ -137,6 +129,11 @@ class Image(Base):
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
class User(Base):
__tablename__ = "{}".format(config['TABLE_PREFIX']) + "user"
id = Column(Integer, primary_key=True, autoincrement=True)
uuid = Column(String(64), default=uuid.uuid1, index=True)
class Device(Base):
__tablename__ = "{}".format(config['TABLE_PREFIX']) + "device"
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime, date
from pony.orm import PrimaryKey, Required, Optional, Set, Json
from pony.orm import PrimaryKey, Required, Optional, Set
from app import config
from . import fullStackDB
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 15:37:43
LastEditTime: 2021-07-03 17:26:02
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\start.py
......@@ -12,12 +12,12 @@ import sys
import os
import signal
import json
from typing import ( Any,)
# import tornado.autoreload
from tornado.wsgi import WSGIContainer
from tornado.web import Application, RequestHandler, FallbackHandler
from tornado.ioloop import IOLoop
from tornado.autoreload import watch
from fullstack.log import logger
from view import app
from view.monitor import DeviceMessageHandler, NotifyHandler, WatchHandler
from app import config
......
'''
Author: your name
Date: 2021-06-29 19:33:41
LastEditTime: 2021-07-03 09:33:58
LastEditTime: 2021-07-05 09:26:59
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\view\monitor.py
'''
import tornado.ioloop
import tornado.web
from tornado import httputil
from tornado.web import RequestHandler, StaticFileHandler
from tornado.websocket import WebSocketHandler, WebSocketClosedError
import json
......@@ -17,9 +18,11 @@ import logging
import pprint
import traceback
import jwt
from typing import ( Any,)
from threading import Timer
from datetime import datetime, timedelta
from app import config, signalManager
from app import config
from model.monitor import session, Device, User
from controller.monitor import insert_data, get_monitor_list, get_watch_list
logger = logging.getLogger(__name__)
......@@ -78,11 +81,11 @@ def pushmessage(func):
msg, binary = ret
try:
if isinstance(msg, WebsocketResponse) or isinstance(msg, dict):
self.write_message(json.dumps(msg), binary)
self.write(json.dumps(msg), binary)
elif isinstance(msg, str) or isinstance(msg, str):
self.write_message(msg, binary)
self.write(msg, binary)
else:
self.write_message(repr(msg), binary)
self.write(repr(msg), binary)
except WebSocketClosedError as e:
logger.error(e)
self.on_close()
......@@ -91,6 +94,7 @@ def pushmessage(func):
class BaseWebsocket(WebSocketHandler):
_clients = []
handlers = {}
def open(self):
# 新加入一个连接后,设置一个接收消息时间戳
# 同时查询改用可以查看哪些设备
......@@ -115,6 +119,7 @@ class BaseWebsocket(WebSocketHandler):
className = self.__class__.__name__
logger.warning("websocket of %s is closed" % className)
if className in self.handlers:
print("122 ======>", type(self.handlers), type(className), type(self.handlers[className]))
self.handlers[className].remove(self)
def check_origin(self, origin):
......@@ -123,66 +128,96 @@ class BaseWebsocket(WebSocketHandler):
@classmethod
def broadcastMessage(cls, message, binary=False):
className = cls.__name__
pprint.pprint(cls.handlers)
message = json.dumps(message)
if not message.get("imei"):
return False
for item in cls._clients:
if message.get("imei") in item.get("devices", []):
item.get("context").send(json.dumps(message), binary)
# print(id(item.get("context")))
if className in cls.handlers:
for handler in cls.handlers[className]:
handler.send(message, binary)
# className = cls.__name__
# message = json.dumps(message)
# if className in cls.handlers:
# for handler in cls.handlers[className]:
# # 判断用户能否查看该设备
# handler.send(message, binary)
class NotifyHandler(BaseWebsocket):
"""
建立与web前端的通信连接,发送状态信息报文
"""
_timer = None
def __init__(self, application: tornado.web.Application, request: httputil.HTTPServerRequest, **kwargs: Any) -> None:
super().__init__(application, request, **kwargs)
self.on_heartbeat()
def open(self):
super(NotifyHandler, self).open()
def on_message(self, message):
className = self.__class__.__name__
# 收到心跳包消息,更新接收数据时间
message = json.loads(message)
try:
# 判断消息类型
if message.get("type"):
if message.get("type") == "auth":
# 获取token值,检验正确与否,获取uuid
payload = jwt.decode(message.get("token"), config['SECRET_KEY'], verify=True, algorithms=['HS256'], options={'require': ['exp', 'iss', 'sub', 'aud', 'iat', 'data']}, audience="bytecode")
print(payload)
result = signalManager.actionCheckUser.emit(message.get("uuid"))
# 判断消息类型
# 认证包,认证不通过,则剔除该连接
if message.get("type") == "auth":
if not message.get("token"):
self.write(json.dumps({ "code": 400, "data": None, "msg": "token can not be null" }))
return
user = session.query(User).filter(User.id == payload.get("data").get("id")).all()
if not user:
self.write_message(json.dumps({ "code": 400, "data": None, "msg": "user not exists" }))
# self.close()
return
# 查询该用户可查看设备
devices = session.query(Device).filter(Device.create_by==payload.get("data").get("id")).all()
if len(devices):
self._clients.append({
'uuid': '',
'uuid': payload.get("data").get("uuid"),
'context': self,
'devices': [],
'devices': lambda d:d.imei,
'ts': int(time.time())
})
return result
self.write_message(json.dumps({ 'code': 200, 'data': None, 'msg': 'auth passed' }))
else: # 没有设备,是否断开连接
self.write_message(json.dumps({ 'code': 400, 'data': None, 'msg': 'no devices' }))
# self.close()
elif message.get("type") == "heartbeat": # 心跳包
# 收到心跳包消息,更新接收数据时间
for c in self._clients:
if c.get("uuid") == message.get("uuid"):
if c.get("uuid") == payload.get("data").get("uuid"):
c["ts"] = int(time.time())
self.write(json.dumps({ 'code': 200, 'data': None, 'msg': 'update session timestamp success' }))
self.write_message(json.dumps({ 'code': 200, 'data': None, 'msg': 'update session timestamp success' }))
break
else:
self.write(json.dumps({ 'code': 200, 'data': None, 'msg': 'unkonw message packet, disconnect by server' }))
self.write_message(json.dumps({ 'code': 200, 'data': None, 'msg': 'unkonw message packet, disconnect by server' }))
self.handlers[className].remove(self)
except Exception as e:
self.handlers[className].remove(self)
logger.error(e)
print("hello,world", message)
logger.info(message)
def on_heartbeat(self):
className = self.__class__.__name__
# 心跳定时器,固定间隔扫描连接列表,当连接超时,主动剔除该连接
for i in range(len(self._clients) - 1, -1, -1):
if int(time.time()) - self._clients[i].get("ts") > 5:
self._clients.remove(self._clients[i])
if self.handlers.get(className, None):
self.handlers[className].remove(self)
self._timer = Timer(5, self.on_heartbeat)
self._timer = Timer(1, self.on_heartbeat)
self._timer.start()
class MainHandler(BaseHandler):
......@@ -231,9 +266,7 @@ class WatchHandler(BaseHandler):
def post(self):
data = tornado.escape.json_decode(self.request.body)
print("=====>", data, type(data))
self.write(json.dumps({ 'code': 100, 'msg': 'success' }))
self.write(json.dumps({ 'code': 100, 'data': data, 'msg': 'success' }))
class DeviceMessageHandler(BaseHandler):
def get(self):
......
......@@ -21,7 +21,7 @@ def add():
新增用户
'''
try:
isSuccess, message = signalManager.actionAddUser.emit(request.schema_data)
isSuccess, message = signalManager.actionAddUser.emit(request.current_user.get("id"), request.schema_data)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
......@@ -58,7 +58,7 @@ def get():
查找单个用户
'''
try:
result, message = signalManager.actionGetUser.emit()
result, message = signalManager.actionGetUser.emit(request.current_user.get("id"))
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
......
import router from "./router";
import store from "@/store"; // get token from cookie
import NProgress from "nprogress"; // progress bar
import "nprogress/nprogress.css"; // progress bar style
import router from "@/router";
import store from "@/store";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { getPageTitle } from "@/utils/index";
const whiteList = ["/login", "/register"];
......
/*
* @Author: your name
* @Date: 2021-07-01 15:02:16
* @LastEditTime: 2021-07-01 18:20:04
* @LastEditTime: 2021-07-03 19:50:11
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\utils\eventBus.js
......@@ -15,6 +15,7 @@
* @FilePath: \evm-store\frontend\src\utils\wsNotify.js
*/
import Vue from "vue";
import store from "@/store";
export const wsNotify = new WebSocket(
`ws://${window.location.hostname}:3000/ws/v1/notify`
......@@ -24,9 +25,14 @@ window.wsNotify = wsNotify;
wsNotify.eventBus = new Vue();
let timer = null;
wsNotify.onopen = function (event) {
console.log("websocket is conneted!", event);
wsNotify.eventBus.$emit("open", event);
timer = setInterval(function() {
wsNotify.send(JSON.stringify({ type: 'heartbeat', ts: Date.now(), token: store.getters.token }))
}, 1000)
};
wsNotify.onmessage = function (event) {
......@@ -37,9 +43,11 @@ wsNotify.onmessage = function (event) {
wsNotify.onerror = function (error) {
console.log(error);
wsNotify.eventBus.$emit("error", error);
if (timer) clearInterval(timer);
};
wsNotify.onclose = function (event) {
console.log("websocket is colosed!", event);
wsNotify.eventBus.$emit("close", event);
if (timer) clearInterval(timer);
};
......@@ -246,33 +246,8 @@ export default {
};
},
methods: {
initWebSocket() {
if ("WebSocket" in window) {
this.socket = new WebSocket(
`ws://${window.location.hostname}:3000/ws/v1/notify`
);
this.socket.onopen = () => {
console.log("连接成功");
this.sendMsg();
};
this.socket.onmessage = (evt) => {
var message = evt.data;
message = JSON.parse(message);
console.log(message);
this.handleMessage(message);
};
this.socket.onclose = function (res) {
console.log("断开了连接", res);
};
this.socket.onerror = function (err) {
console.log(err);
};
} else {
console.log("浏览器不支持WebSocket");
}
},
sendMsg() {
var message = "hello,world";
let message = JSON.stringify({ type: "auth", token: this.$store.getters.token });
this.socket.send(message);
},
handleMessage(msg) {
......@@ -311,7 +286,7 @@ export default {
this.image.forEach((img) => {
uris.push(img.uri)
});
msg.image.forEach((item) => {
msg.image && msg.image.forEach((item) => {
if (!uris.includes(item.uri)) {
this.image.push(item)
}
......@@ -344,7 +319,6 @@ export default {
this.handleMessage(message);
});
});
// this.initWebSocket();
},
};
</script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment