Commit 1d83faad authored by wanli's avatar wanli

🐞 fix(): 解决前端两处问题

一、解决JWT过期导致无法接收消息问题;二、解决前端无法选择查看指定页面图片问题
parent a09e6ebb
...@@ -133,8 +133,8 @@ class BaseWebsocket(WebSocketHandler): ...@@ -133,8 +133,8 @@ class BaseWebsocket(WebSocketHandler):
@classmethod @classmethod
def broadcastMessage(cls, message): def broadcastMessage(cls, message):
# pprint.pprint(cls.handlers) # pprint.pprint(cls.handlers)
pprint.pprint(message) # pprint.pprint(message)
print("=======>", cls._clients) logger.info(cls._clients)
if not message.get("imei"): if not message.get("imei"):
return False return False
...@@ -225,9 +225,12 @@ class NotifyHandler(BaseWebsocket): ...@@ -225,9 +225,12 @@ class NotifyHandler(BaseWebsocket):
else: else:
self.write_message(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) self.handlers[className].remove(self)
except jwt.exceptions.InvalidSignatureError as e:
logger.error(e)
self.write_message(json.dumps({ 'code': 401, 'data': None, 'msg': 'auth failed' }))
except Exception as e: except Exception as e:
# 认证失败会导致触发异常,这里不能remove(self),否则会导致on_close方法报错 # 认证失败会导致触发异常,这里不能remove(self),否则会导致on_close方法报错
self.write_message(json.dumps({ 'code': 400, 'data': e.args, 'msg': "server error" })) self.write_message(json.dumps({ 'code': 500, 'data': e.args, 'msg': "server error" }))
logger.error(e) logger.error(e)
traceback.print_exc() traceback.print_exc()
logger.info(message) logger.info(message)
...@@ -247,8 +250,8 @@ class NotifyHandler(BaseWebsocket): ...@@ -247,8 +250,8 @@ class NotifyHandler(BaseWebsocket):
class MainHandler(BaseHandler): class MainHandler(BaseHandler):
def get(self, *args, **kwargs): def get(self, *args, **kwargs):
print("#############", args) print(args)
print("/////////////", kwargs) print(kwargs)
print(self.request.path) # 请求路径 print(self.request.path) # 请求路径
print(self.request.method) # 请求方法 print(self.request.method) # 请求方法
print(self.request.host) # IP地址 print(self.request.host) # IP地址
...@@ -279,8 +282,8 @@ class MainHandler(BaseHandler): ...@@ -279,8 +282,8 @@ class MainHandler(BaseHandler):
class WatchHandler(BaseHandler): class WatchHandler(BaseHandler):
def get(self, *args, **kwargs): def get(self, *args, **kwargs):
# 获取手表列表 # 获取手表列表
print("#############", args) print(args)
print("/////////////", kwargs) print(kwargs)
print(self.request.path) # 请求路径 print(self.request.path) # 请求路径
print(self.request.method) # 请求方法 print(self.request.method) # 请求方法
print(self.request.host) # IP地址 print(self.request.host) # IP地址
......
/* /*
* @Author: your name * @Author: your name
* @Date: 2021-07-01 15:02:16 * @Date: 2021-07-01 15:02:16
* @LastEditTime: 2021-07-25 18:24:48 * @LastEditTime: 2021-07-28 10:42:15
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\utils\eventBus.js * @FilePath: \evm-store\frontend\src\utils\eventBus.js
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
import Vue from "vue"; import Vue from "vue";
import store from "@/store"; import store from "@/store";
export const wsNotify = new WebSocket( export let wsNotify = new WebSocket(
`ws://${window.location.hostname}:3000/ws/v1/notify` `ws://${window.location.hostname}:3000/ws/v1/notify`
); );
...@@ -17,6 +17,12 @@ window.wsNotify = wsNotify; ...@@ -17,6 +17,12 @@ window.wsNotify = wsNotify;
wsNotify.eventBus = new Vue(); wsNotify.eventBus = new Vue();
wsNotify.eventBus.$on("reconnect", () => {
wsNotify = new WebSocket(
`ws://${window.location.hostname}:3000/ws/v1/notify`
);
})
let timer = null; let timer = null;
wsNotify.onopen = function (event) { wsNotify.onopen = function (event) {
......
...@@ -161,7 +161,12 @@ export default { ...@@ -161,7 +161,12 @@ export default {
}); });
}, },
}, },
created() {}, created() {
if (this.$route.query.action && this.$route.query.action === "refresh") {
// 刷新的目的是为了让websocket重新连接
window.location.reload()
}
},
mounted() {}, mounted() {},
beforeMount() {}, beforeMount() {},
}; };
......
...@@ -261,6 +261,7 @@ ...@@ -261,6 +261,7 @@
border border
fit fit
:row-class-name="tableRowClassName" :row-class-name="tableRowClassName"
@row-click="onTableRowClick"
> >
<el-table-column <el-table-column
prop="uri" prop="uri"
...@@ -420,7 +421,8 @@ const dbObject = { ...@@ -420,7 +421,8 @@ const dbObject = {
], ],
}; };
const indexedDb = Database(), jsonFile = "evue-monitor.json"; const indexedDb = Database(),
jsonFile = "evue-monitor.json";
let monitor = new indexedDb(dbObject); let monitor = new indexedDb(dbObject);
function resetResult() { function resetResult() {
...@@ -506,6 +508,7 @@ export default { ...@@ -506,6 +508,7 @@ export default {
lvglList: [], lvglList: [],
image: {}, image: {},
imageList: [], imageList: [],
currentPngList: [],
socket: null, socket: null,
form: { form: {
system: ["free_size", "free_space_size", "used_space_size"], system: ["free_size", "free_space_size", "used_space_size"],
...@@ -542,6 +545,9 @@ export default { ...@@ -542,6 +545,9 @@ export default {
SystemChart, SystemChart,
}, },
methods: { methods: {
onTableRowClick(row) {
this.pngList = this.currentPngList[row.uri]
},
getTemplate() { getTemplate() {
getTemplate() getTemplate()
.then((res) => { .then((res) => {
...@@ -552,6 +558,14 @@ export default { ...@@ -552,6 +558,14 @@ export default {
}); });
}, },
getReport() { getReport() {
setTemplate({ templateName: jsonFile })
.then((res) => {
console.log(res.msg);
})
.catch((err) => {
console.error(err.msg);
});
wsNotify.eventBus.$emit("exportImg"); wsNotify.eventBus.$emit("exportImg");
monitor monitor
.getAllData((params) => { .getAllData((params) => {
...@@ -786,6 +800,12 @@ export default { ...@@ -786,6 +800,12 @@ export default {
this.socket.send(message); this.socket.send(message);
}, },
handleMessage(msg) { handleMessage(msg) {
if (msg.code === 401) {
this.$store.dispatch("user/removeRole");
this.$store.dispatch("user/removeToken");
// this.$router.push("/login?action=refresh");
wsNotify.$emit("reconnect")
}
if (msg.type !== "report" || !msg.imei) return null; if (msg.type !== "report" || !msg.imei) return null;
// 将设备发送过来的消息存储到浏览器中 // 将设备发送过来的消息存储到浏览器中
...@@ -813,6 +833,13 @@ export default { ...@@ -813,6 +833,13 @@ export default {
} }
this.globalData = msg; this.globalData = msg;
deepClone(msg).image.forEach(item => {
if (item.png_detail && item.png_detail.length) {
this.currentPngList[item.uri] = item.png_detail
} else {
this.currentPngList[item.uri] = []
}
})
this.resetData(m); this.resetData(m);
}, },
processData(msg) { processData(msg) {
...@@ -858,8 +885,8 @@ export default { ...@@ -858,8 +885,8 @@ export default {
wsNotify.eventBus.$emit("clear-lvgl-chart"); wsNotify.eventBus.$emit("clear-lvgl-chart");
// 清空各个表格数据 // 清空各个表格数据
this.imageList = [] this.imageList = [];
this.pngList = [] this.pngList = [];
// this.processData(this.devices[this.device]); // this.processData(this.devices[this.device]);
// this.resetData(); // this.resetData();
...@@ -926,7 +953,6 @@ export default { ...@@ -926,7 +953,6 @@ export default {
mounted() { mounted() {
this.socket = wsNotify; this.socket = wsNotify;
wsNotify.eventBus.$on("exported", (res) => { wsNotify.eventBus.$on("exported", (res) => {
console.log(res);
if (res.type === "evm") result.evmImg = res.data; if (res.type === "evm") result.evmImg = res.data;
else if (res.type === "lvgl") result.lvglImg = res.data; else if (res.type === "lvgl") result.lvglImg = res.data;
else if (res.type === "system") result.systemImg = res.data; else if (res.type === "system") result.systemImg = res.data;
...@@ -972,14 +998,8 @@ export default { ...@@ -972,14 +998,8 @@ export default {
} }
}) })
.catch((err) => { .catch((err) => {
console.log(err); console.error(err);
}); });
setTemplate({ templateName: jsonFile }).then(res => {
console.log(res.msg)
}).catch(err => {
console.log(err.msg)
})
}, },
}; };
</script> </script>
......
'''
Author: your name
Date: 2021-07-27 16:19:06
LastEditTime: 2021-07-28 09:28:49
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\menu.py
'''
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf_8 -*- # -*- coding: utf_8 -*-
...@@ -11,11 +19,14 @@ class MenuResource(object): ...@@ -11,11 +19,14 @@ class MenuResource(object):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
def Treelist(self, params={}, jwt={}): def Treelist(self, params={}, jwt={}):
filters = [MenuModel.is_delete==False] filters = [MenuModel.is_delete==False]
result = MenuModel.query.filter(*filters).first() result = MenuModel.query.filter(*filters).all()
if result: if result:
data = []
for item in result:
t = item.dict()
data.append(t)
return result, ResponseCode.HTTP_SUCCESS return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND return None, ResponseCode.HTTP_NOT_FOUND
......
'''
Author: your name
Date: 2021-07-15 09:33:39
LastEditTime: 2021-07-28 09:38:58
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\models\base.py
'''
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf_8 -*- # -*- coding: utf_8 -*-
...@@ -23,6 +31,7 @@ class PrimaryModel(BaseModel): ...@@ -23,6 +31,7 @@ class PrimaryModel(BaseModel):
__abstract__ = True __abstract__ = True
id = db.Column(db.Integer, primary_key=True, autoincrement=True) id = db.Column(db.Integer, primary_key=True, autoincrement=True)
uuid = db.Column(db.String(64), primary_key=False, default=generate_uuid) uuid = db.Column(db.String(64), primary_key=False, default=generate_uuid)
sort = db.Column(db.Integer, default=0)
class AutoBaseModel(BaseModel): class AutoBaseModel(BaseModel):
__abstract__ = True __abstract__ = True
......
'''
Author: your name
Date: 2021-07-27 16:19:06
LastEditTime: 2021-07-28 09:23:23
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\models\menu.py
'''
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf_8 -*- # -*- coding: utf_8 -*-
import copy
from application.app import db, ma from application.app import db, ma
from .base import PrimaryModel from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE from marshmallow import Schema, fields, INCLUDE, EXCLUDE
...@@ -9,11 +18,11 @@ class MenuModel(PrimaryModel): ...@@ -9,11 +18,11 @@ class MenuModel(PrimaryModel):
__tablename__ = 'evm_menu' __tablename__ = 'evm_menu'
name = db.Column(db.String(100), nullable = True) name = db.Column(db.String(100), nullable = True)
parentId = db.Column(db.String(100), nullable = True) parent_id = db.Column(db.Integer, default=0, nullable = True)
path = db.Column(db.String(100), nullable = True) path = db.Column(db.String(100), nullable = True)
disabled = db.Column(db.Boolean, nullable = True, default = False) disabled = db.Column(db.Boolean, nullable = True, default = False)
fixed = db.Column(db.Boolean, nullable = False, default = False) fixed = db.Column(db.Boolean, nullable = False, default = False)
hasChildren = db.Column(db.Boolean, nullable = True, default = False) has_children = db.Column(db.Boolean, nullable = True, default = False)
icon = db.Column(db.String(100), nullable = True, default = '') icon = db.Column(db.String(100), nullable = True, default = '')
# __table_args__ = ( # __table_args__ = (
...@@ -22,11 +31,11 @@ class MenuModel(PrimaryModel): ...@@ -22,11 +31,11 @@ class MenuModel(PrimaryModel):
def __init__(self, name, parentId, path, disabled=False, fixed=False, hasChildren=False, icon=''): def __init__(self, name, parentId, path, disabled=False, fixed=False, hasChildren=False, icon=''):
self.name = name self.name = name
self.parentId = parentId self.parent_id = parentId
self.path = path self.path = path
self.disabled = disabled self.disabled = disabled
self.fixed = fixed self.fixed = fixed
self.hasChildren = hasChildren self.has_children = hasChildren
self.icon = icon self.icon = icon
def __repr__(self): def __repr__(self):
...@@ -34,11 +43,88 @@ class MenuModel(PrimaryModel): ...@@ -34,11 +43,88 @@ class MenuModel(PrimaryModel):
def to_dict(self): def to_dict(self):
return { return {
'id': self.id,
'name': self.name, 'name': self.name,
'parentId': self.parentId, 'parentId': self.parent_id,
'path': self.path, 'path': self.path,
'disabled': self.disabled, 'disabled': self.disabled,
'fixed': self.fixed, 'fixed': self.fixed,
'hasChildren': self.hasChildren, 'hasChildren': self.has_children,
'icon': self.icon, 'icon': self.icon,
'sort': self.sort,
'remark': self.remark,
'deleted': self.is_delete,
'createUser': self.create_by,
'updateUser': self.update_by,
'createTime': self.create_at.strftime("%Y-%m-%d %H:%M:%S") if self.create_at else None,
"updateTime": self.update_at.strftime("%Y-%m-%d %H:%M:%S") if self.update_at else None,
} }
class TreeMenuNode:
"""树形菜单节点"""
def __init__(self, pk, title, code, icon_class, url, order, child, parent):
self.pk = pk
self.title = title
self.code = code
self.icon_class = icon_class
self.url = url
self.order = order
self.child = child
self.parent = parent
def count(self):
if not self.child:
return 0
return len(self.child)
class HandleTreeMenu:
"""处理树形侧边栏菜单"""
def __init__(self, menus):
self.menus = menus
self.tree_menu = []
def __iter__(self):
if self.tree_menu:
return iter(self.tree_menu)
return iter([])
@staticmethod
def get_complete_menu_structure(_menu_list):
"""得到完整的菜单结构"""
menu_list = copy.copy(_menu_list)
for menu in menu_list:
if menu.parent and menu.parent not in menu_list:
menu_list.append(menu.parent)
menu_list.extend(HandleTreeMenu.get_complete_menu_structure(menu_list))
return menu_list
def convert_to_tree(self):
"""转换BaseQuery为MenuTree结构"""
complete_menu = HandleTreeMenu.get_complete_menu_structure(self.menus)
# 所有顶级菜单
top_menu = [menu for menu in complete_menu if not menu.parent]
for menu in top_menu:
current_menu = TreeMenuNode(menu.pk, menu.title, menu.code, menu.icon_class, menu.url, menu.order, [], None)
current_menu = self._recursive_menu(menu, current_menu)
self.tree_menu.append(current_menu)
def _recursive_menu(self, base_menu, base_tree_menu):
"""由上往下递归菜单得到所有菜单并转换为TreeMenuNode格式"""
complete_menu = HandleTreeMenu.get_complete_menu_structure(self.menus)
child_menu = [menu for menu in complete_menu if menu.parent == base_menu] # 父节点为base_menu的子节点
for menu in child_menu:
current_menu = TreeMenuNode(menu.pk, menu.title, menu.code, menu.icon_class, menu.url, menu.order, [], base_tree_menu)
current_menu = self._recursive_menu(menu, current_menu)
base_tree_menu.child.append(current_menu)
return base_tree_menu
if __name__ == '__main__':
# 使用方法
menus = MenuModel.query.all() # 这里是直接在数据库里面查询出来的, 用户私有权限表
tree_menu = HandleTreeMenu(menus)# 创建一个对象
tree_menu.convert_to_tree() # 执行转换方法
print(tree_menu.tree_menu) # 得到已经转换的菜单
...@@ -93,7 +93,7 @@ def send_request(imei): ...@@ -93,7 +93,7 @@ def send_request(imei):
'png_file_size': random.randint(0, 10000) 'png_file_size': random.randint(0, 10000)
}) })
r = requests.post("http://store.evmiot.com/api/v1/evm_store/monitor", data=json.dumps(payload)) r = requests.post("http://localhost:3000/api/v1/evm_store/monitor", data=json.dumps(payload))
print(r.status_code) print(r.status_code)
print(r.json()) print(r.json())
......
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