Commit f778c0b8 authored by wanli's avatar wanli

update

parent c8ebc791
<!--
* @Author: your name
* @Date: 2021-04-14 14:12:18
* @LastEditTime: 2021-07-03 11:33:36
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\README.md
-->
# evm-store
EVM应用商店
......@@ -25,3 +33,9 @@ pip3 install -r requirements.txt
```
pip freeze > requirements.txt
```
# 应用商店
# 运营平台用户前端
> https://appstore.huawei.com/
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-06-22 12:40:53
LastEditTime: 2021-07-03 11:53:43
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\app\signal_manager.py
......@@ -39,19 +39,13 @@ class SignalManager(object):
actionDeleteBuildLog = PySignal()
# 用户模块
actionCheckUser = PySignal()
actionAddUser = PySignal()
actionDeleteUser = PySignal()
actionGetUser = PySignal()
actionGetUserList = PySignal()
actionUpdateUser = PySignal()
# 文件附件模块
actionAddAnnex = PySignal()
actionDeleteAnnex = PySignal()
actionGetAnnex = PySignal()
actionGetAnnexList = PySignal()
actionUpdateAnnex = PySignal()
# 系统框架模块
actionAddDevice = PySignal()
actionDeleteDevice = PySignal()
......@@ -80,13 +74,6 @@ class SignalManager(object):
actionGetLoginLogsList = PySignal()
actionUpdateLoginLogs = PySignal()
# 系统菜单
actionAddMenu = PySignal()
actionDeleteMenu = PySignal()
actionGetMenu = PySignal()
actionGetMenuList = PySignal()
actionUpdateMenu = PySignal()
def __init__(self):
super(SignalManager, self).__init__()
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-06-29 19:55:00
LastEditTime: 2021-07-03 11:53:04
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\controller\__init__.py
......@@ -14,7 +14,6 @@ from app import signalManager
from .api_manager import apiManager
from .user_manager import userManager
from .login_manager import loginManager
from .annex_manager import annexManager
from .apps_manager import appsManager
from .device_manager import deviceManager
from .download_manager import downloadManager
......@@ -65,19 +64,13 @@ def initConnect():
signalManager.actionUpdateLoginLogs.connect(loginLogsManager.update)
# 用户模块
signalManager.actionCheckUser.connect(userManager.check)
signalManager.actionAddUser.connect(userManager.add)
signalManager.actionDeleteUser.connect(userManager.delete)
signalManager.actionGetUser.connect(userManager.get)
signalManager.actionGetUserList.connect(userManager.getList)
signalManager.actionUpdateUser.connect(userManager.update)
# 文件附件模块
signalManager.actionAddAnnex.connect(annexManager.add)
signalManager.actionDeleteAnnex.connect(annexManager.delete)
signalManager.actionGetAnnex.connect(annexManager.get)
signalManager.actionGetAnnexList.connect(annexManager.getList)
signalManager.actionUpdateAnnex.connect(annexManager.update)
# 应用下载统计模块
signalManager.actionAddDownload.connect(downloadManager.add)
signalManager.actionDeleteDownload.connect(downloadManager.delete)
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from flask import request
from model import fullStackDB
from model.annex import Annex
from model.user import User
from utils import sql_filter
logger = logging.getLogger("AnnexManager")
class AnnexManager(object):
def __init__(self):
super(AnnexManager, self).__init__()
def add(self, data):
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
if data.get("flow"):
flow = Flow.get(uuid=data.get("flow"))
if not flow:
return False, "flow does not exists."
data.update({ "flow": flow })
elif data.get("project"):
project = Project.get(uuid=data.get("project"))
if not project:
return False, "project does not exists."
data.update({ "project": project })
data.update({
'title': data.get("title"),
'path': data.get("path"),
'size': data.get("size"),
'create_by': editor,
'create_at': datetime.now(),
'update_by': editor,
'update_at': datetime.now(),
})
result = fullStackDB.add(Annex, **data)
return result, "add annex {}.".format("success" if result else "fail")
def delete(self, uuid):
result = False
with db_session:
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = Annex.get(uuid=uuid)
if result:
if result.project:
count = Annex.select(project=result.project, remarks=result.remarks, is_delete=False).count()
if count == 1:
project = Project.get(id=result.project.id)
if project:
condition = dict()
if result.remarks == "bidding": # 中标通知书
condition.update({ "is_bidding": False })
elif result.remarks == "acceptance": # 验收表
condition.update({ "is_acceptance": False })
elif result.remarks == "evaluation": # 评价表
condition.update({ "is_evaluation": False })
elif result.remarks == "contract": # 合同
condition.update({ "is_contract": False })
project.extend1.get("uploads").update({ result.remarks: False })
project.set(extend1=project.extend1, **condition)
result.set(is_delete=True, delete_at=datetime.now(), delete_by=editor)
commit()
result = True
return result, "delete annex {}.".format("success" if result else "fail")
def get(self, data):
result = Annex.get(**data)
if result:
result = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "title", "create_at", "update_at", "delete_at"])
return result, "get annex {}.".format("success" if result else "fail")
def getList(self, data):
if not data or len(data) <= 0:
return False, 0, "parameters can not be null."
result = Annex.select().where(is_delete=False, **data)
if len(result):
temp = []
for item in result:
# t = item.to_dict(with_collections=True, only=["uuid", "title", "project", "path", "remarks"])
# temp.append(t)
temp.append({
"uuid": item.uuid,
"name": item.title,
"project": item.project.id,
"url": item.path,
"type": item.remarks
})
result = temp
return result, len(result), "get annex {}.".format("success" if result else "no data")
def update(self, uuid, data):
# 当参数为空时,直接返回错误
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "parameters can not be null."
# 查询请求者是否存在
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = fullStackDB.update(Annex, { 'uuid': uuid }, update_at=datetime.now(), update_by=editor, **data)
return result, "update annex {}.".format("success" if result else "fail")
annexManager = AnnexManager()
......@@ -2,19 +2,14 @@
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from model import fullStackDB
from model.app_logs import AppLogs
from model.user import User
from utils import sql_filter
logger = logging.getLogger("AppLogsManager")
logger = logging.getLogger(__name__)
class AppLogsManager(object):
def __init__(self):
......
......@@ -17,10 +17,10 @@ from model.apps import Apps
from model.user import User
from model.app_logs import AppLogs
from model.build_logs import BuildLogs
from utils import sql_filter, ThreadMaker
from utils import ThreadMaker
from utils.epk import EpkApp
logger = logging.getLogger("AppsManager")
logger = logging.getLogger(__name__)
@ThreadMaker
def build_application(user, uuid):
......
......@@ -4,13 +4,8 @@
import os
import re
import copy
import time
import types
import json
import shutil
import logging
import traceback
from urllib.parse import urlparse, urljoin
from datetime import datetime
from pony.orm import *
from app.setting import config
......@@ -20,10 +15,9 @@ from model.annex import Annex
from model.app_logs import AppLogs
from model.build_logs import BuildLogs
from model.user import User
from utils import sql_filter
from utils.epk import EpkApp
logger = logging.getLogger("BuildLogsManager")
logger = logging.getLogger(__name__)
class BuildLogsManager(object):
def __init__(self):
......
......@@ -2,19 +2,14 @@
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from model import fullStackDB
from model.device import Device
from model.user import User
from utils import sql_filter
logger = logging.getLogger("DeviceManager")
logger = logging.getLogger(__name__)
class DeviceManager(object):
def __init__(self):
......
......@@ -2,20 +2,15 @@
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import select, desc
from flask import request
from model import fullStackDB
from model.dictionary import Dict
from model.user import User
from utils import sql_filter
logger = logging.getLogger("DictManager")
logger = logging.getLogger(__name__)
class DictManager(object):
def __init__(self):
......
......@@ -2,30 +2,23 @@
# -*- coding: utf_8 -*-
import os
import re
import copy
import time
import types
import json
import logging
import traceback
import shutil
from collections import OrderedDict
import urllib
from urllib import parse, request
from urllib.parse import urlparse, urljoin, urlencode
from urllib.parse import urlparse
from datetime import datetime
from pony.orm import *
from flask import request as flask_request
from app.setting import config, conf
from model import fullStackDB
from app.setting import config
from model.download import AppDownload
from model.device import Device
from model.apps import Apps
from model.user import User
from utils import sql_filter, ThreadMaker
from utils import ThreadMaker
logger = logging.getLogger("DownloadManager")
logger = logging.getLogger(__name__)
@ThreadMaker
def update_download_information(ip, id):
......
......@@ -2,19 +2,14 @@
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from model import fullStackDB
from model.login_logs import LoginLogs
from model.user import User
from utils import sql_filter
logger = logging.getLogger("LoginLogsManager")
logger = logging.getLogger(__name__)
class LoginLogsManager(object):
def __init__(self):
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
import urllib
from urllib import parse, request
from urllib.parse import urlparse, urljoin, urlencode
from datetime import datetime
from threading import Thread
from werkzeug.security import check_password_hash
from flask import request as flask_request
from pony.orm import *
from model import fullStackDB
from model.user import User
from model.login_logs import LoginLogs
from fullstack.login import Auth
from fullstack.response import ResponseCode
from utils import md5_salt, ThreadMaker
logger = logging.getLogger("LoginManager")
logger = logging.getLogger(__name__)
@ThreadMaker
def update_login_information(ip, user_id):
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from flask import request
from model import fullStackDB
from model.netdisc import Netdisc
from model.user import User
from app.setting import config
logger = logging.getLogger("NetDiscManager")
class NetDiscManager(object):
def __init__(self):
super(NetDiscManager, self).__init__()
def add(self, data):
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
data.update({
'create_by': editor,
'create_at': datetime.now(),
'update_by': editor,
'update_at': datetime.now(),
})
result = fullStackDB.add(Netdisc, **data)
return result, "add netdisc {}.".format("success" if result else "fail")
def delete(self, data):
# 通过uuid查询出所有的文件列表,然后全部删除
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
count = 0
result = []
with db_session:
for uuid in data.get("uuids"):
nd = Netdisc.get(uuid=uuid)
if nd:
# nd.is_delete = True
# nd.delete_at = datetime.now()
# nd.delete_by = editor
nd.set(is_delete = True, delete_at = datetime.now(), delete_by = editor)
count = count + 1
result.append([nd.is_dir, nd.real_path])
commit()
return result, "delete {} netdisc {}.".format(count, "success" if result else "fail")
def get(self, data):
result = Netdisc.get(**data)
if result:
result = result.to_dict(only=["uuid", "name", "real_path"])
return result, "get netdisc {}.".format("success" if result else "no data")
def getList(self, data):
data.update({ "is_delete": False })
count = 0
result = []
with db_session:
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
if editor.role.name != "超级管理员":
data.update({ "create_by": editor })
result = Netdisc.select().where(**data).order_by(Netdisc.name)
count = len(result)
files = []
folders = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, only=["uuid", "name", "size", "is_dir", "parent_dir", "file_type", "create_at", "update_at"])
if item.is_dir:
t.update({
"is_dir": 1 if item.is_dir else 0,
"real_path": os.path.relpath(item.real_path, config.get("UPLOAD_PATH")).replace('\\', '/'),
"create_by": item.create_by.to_dict(only=["uuid", "username"]),
"update_by": item.update_by.to_dict(only=["uuid", "username"]),
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S"),
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S")
})
folders.append(t)
else:
t.update({
"is_dir": 1 if item.is_dir else 0,
"real_path": os.path.relpath(item.real_path, config.get("UPLOAD_PATH")).replace('\\', '/'),
"create_by": item.create_by.to_dict(only=["uuid", "username"]),
"update_by": item.update_by.to_dict(only=["uuid", "username"]),
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S"),
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S")
})
files.append(t)
result = folders + files
return result, count, "get netdisc {}.".format("success" if result else "no data")
def update(self, uuid, data):
# 当参数为空时,直接返回错误
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "parameters can not be null."
result = None
with db_session:
# 查询请求者是否存在
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = Netdisc.get(uuid=uuid)
if result:
_real = result.real_path
result.set(update_at=datetime.now(), update_by=editor, **data)
commit()
_ext = os.path.splitext(result.real_path)[-1]
_dir = os.path.dirname(result.real_path)
filename = data.get("name") + _ext
data.update({ "real_path": os.path.normpath(os.sep.join([_dir, filename])) })
result = { "src": _real, "dst": data.get("real_path") }
return result, "update netdisc {}.".format("success" if result else "fail")
netDiscManager = NetDiscManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from flask import request
from model import fullStackDB
from model.depot import Depot
from model.role import Role
from model.user import User
from utils import sql_filter
logger = logging.getLogger("RoleManager")
class RoleManager(object):
def __init__(self):
super(RoleManager, self).__init__()
def add(self, data):
# 判断角色名是否存在
result = Role.get(name=data.get("name"))
if result:
return False, "role name has been exists."
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
data.update({
'create_by': editor,
'create_at': datetime.now(),
'update_by': editor,
'update_at': datetime.now(),
})
result = fullStackDB.add(Role, **data)
return result, "add role {}.".format("success" if result else "fail")
def delete(self, uuid):
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = fullStackDB.update(Role, { 'uuid': uuid }, is_delete=True, delete_at=datetime.now(), delete_by=editor)
return result, "delete role {}.".format("success" if result else "fail")
def get(self, data):
result = Role.get(**data)
if result:
result = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "name", "create_at", "update_at", "delete_at"])
return result, "get role {}.".format("success" if result else "fail")
def getList(self, data):
if not data or len(data) <= 0:
return False, 0, "parameters can not be null."
temp = copy.deepcopy(data)
if 'pagenum' in temp:
temp.pop('pagenum')
if 'pagesize' in temp:
temp.pop('pagesize')
if 'scope_type' in temp:
temp.pop('scope_type')
temp.setdefault("is_delete", False)
if "scope_type" in data and data.get("scope_type") == "list":
result = Role.select().where(**temp).order_by(desc(Role.create_at))
temp = []
for item in result:
temp.append(item.to_dict(only=["uuid", "name"]))
return temp, len(temp), "get select {}.".format("success" if temp else "no data")
result = fullStackDB.pagination(Role, Role.create_at, pagenum=data.get("pagenum", 1), pagesize=data.get("pagesize", 10), **temp)
count = fullStackDB.count(Role, **temp)
if result and len(result):
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, only=["uuid", "name", "permission", "is_system", "create_by", "update_by"])
t.update({ "create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S") })
t.update({ "update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S") })
t.update({ "create_by": item.create_by.to_dict(only=["uuid", "username"]) })
t.update({ "update_by": item.update_by.to_dict(only=["uuid", "username"]) })
temp.append(t)
result = temp
return result, count, "get role {}.".format("success" if result else "no data")
def update(self, uuid, data):
# 当参数为空时,直接返回错误
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "parameters can not be null."
# 查询请求者是否存在
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = None
with db_session:
result = Role.get(uuid=uuid)
if result:
result.set(update_at=datetime.now(), update_by=editor, **data)
commit()
# result = fullStackDB.update(Role, { 'uuid': uuid }, update_at=datetime.now(), update_by=editor, **data)
return result, "update role {}.".format("success" if result else "fail")
roleManager = RoleManager()
......@@ -2,27 +2,15 @@
# -*- coding: utf_8 -*-
import os
import sys
import copy
import time
import types
import json
import logging
import traceback
import re
import tempfile
import shutil
import base64
import uuid
from hashlib import md5 as fmd5
from urllib import parse
from datetime import datetime
from threading import Thread
from werkzeug.security import check_password_hash
from app.setting import config
from utils import md5_salt, random_string
logger = logging.getLogger("UploadManager")
logger = logging.getLogger(__name__)
FileStoragePath = os.getcwd()
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import time
import json
import logging
import traceback
import copy
import uuid
from datetime import datetime
from pony.orm import *
from flask import request
from app.setting import config
from model import fullStackDB
from model.user import User
from utils import md5_salt, filter_dict, sql_filter
from utils import md5_salt
logger = logging.getLogger("UserManager")
logger = logging.getLogger(__name__)
class UserManager(object):
'''
......@@ -25,6 +20,13 @@ class UserManager(object):
def __init__(self):
super(UserManager, self).__init__()
def check(self, data):
with db_session:
user = User.get(uuid=data.get("uuid"))
if not user:
return False
return True
def add(self, data):
'''
添加用户
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import sys
import re
import logging
import traceback
import time
from datetime import datetime, timedelta, timezone
from datetime import datetime, timedelta
from functools import wraps
import jwt
from flask import jsonify, current_app, request
from flask import current_app, request
logger = logging.getLogger("auth")
logger = logging.getLogger(__name__)
class Auth(object):
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 17:54:11
LastEditors: your name
LastEditTime: 2021-07-01 18:24:18
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\model\device.py
'''
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 17:55:08
LastEditTime: 2021-07-01 18:26:25
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\model\monitor.py
......@@ -10,10 +10,11 @@ FilePath: \evm-store\backend\model\monitor.py
# -*- coding: utf_8 -*-
import json
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
from sqlalchemy import func, Column, Integer, String, Float, DateTime, Numeric, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, class_mapper, object_mapper
......@@ -137,12 +138,23 @@ class Image(Base):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
class Device(Base):
__tablename__ = 'monitor_system'
__tablename__ = "{}".format(config['TABLE_PREFIX']) + "device"
id = Column(Integer, primary_key=True, autoincrement=True)
watch = Column(Integer) # 手表ID
free_size = Column(Integer) # 单位:字节
timestamp = Column(DateTime(timezone=True), default=get_current_datetime, server_default=func.now(), onupdate=func.now())
uuid = Column(String(64), default=uuid.uuid1, index=True)
name = Column(String)
imei = Column(String)
desc = Column(String)
type = Column(String)
create_at = Column(DateTime(timezone=True), default=get_current_datetime, onupdate=func.now())
create_by = Column(Integer)
update_at = Column(DateTime(timezone=True), default=get_current_datetime, onupdate=func.now())
update_by = Column(Integer)
delete_at = Column(DateTime(timezone=True), default=get_current_datetime, onupdate=func.now())
delete_by = Column(Integer)
is_delete = Column(Boolean, default=False)
sort = Column(Integer)
remarks = Column(String)
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from app import config
from . import fullStackDB
db = fullStackDB.db
class Netdisc(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "netdisc"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
name = Required(str, max_len=200) # 文件名
size = Required(int, default=0) # 文件大小
file_type = Required(str) # 文件类型
is_dir = Required(bool, default=False) # 是否是目录
parent_dir = Required(str, default='/') # 上级目录
real_path = Required(str) # 真实路径
create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='netdisc_creator') # NetDisc与User一对一关系
update_at = Required(datetime, default=datetime.now)
update_by = Required("User", reverse='netdisc_updater') # NetDisc与User一对一关系
delete_at = Optional(datetime)
delete_by = Optional("User", reverse='netdisc_deleter') # NetDisc与User一对一关系
is_delete = Required(bool, default=False)
sort = Optional(int, size=32, default=0)
remarks = Optional(str, max_len=255, default="", nullable=True)
\ No newline at end of file
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-06-29 19:37:32
LastEditTime: 2021-07-03 11:43:10
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\view\__init__.py
......@@ -18,7 +18,6 @@ from .api import api
from .files import file_api
from .login import login_api
from .user import user_api
from .annex import annex_api
from .apps import apps_api
from .device import device_api
from .download import download_api
......@@ -48,7 +47,6 @@ def create_app():
app.register_blueprint(login_api)
app.register_blueprint(file_api)
app.register_blueprint(user_api)
app.register_blueprint(annex_api)
app.register_blueprint(apps_api)
app.register_blueprint(download_api)
app.register_blueprint(device_api)
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 14:45:16
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\backend\view\annex.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import logging
import traceback
from flask import Blueprint, request
from app import config, signalManager
from fullstack.login import Auth
from fullstack.validation import validate_schema
from fullstack.response import ResponseCode, response_result
from schema.annex import AddSchema, DeleteSchema, QuerySchema, UpdateSchema
logger = logging.getLogger(__name__)
annex_api = Blueprint("annex_api", __name__, url_prefix="/api/v1/%s/annex" % config['NAME'])
@annex_api.route("/add", methods=['POST'])
@validate_schema(AddSchema)
@Auth.auth_required
def add():
try:
isSuccess, message = signalManager.actionAddAnnex.emit(request.schema_data)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@annex_api.route("/delete/<uuid:id>", methods=['POST'])
@validate_schema(DeleteSchema)
@Auth.auth_required
def delete(id):
try:
isSuccess, message = signalManager.actionDeleteAnnex.emit(id)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR)
@annex_api.route("/get", methods=["POST"])
@validate_schema(QuerySchema)
@Auth.auth_required
def get():
try:
result, message = signalManager.actionGetAnnex.emit(request.schema_data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@annex_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
def get_list():
try:
result, count, message = signalManager.actionGetAnnexList.emit(request.schema_data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message, count=count)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR)
@annex_api.route("/update/<uuid:id>", methods=['POST'])
@validate_schema(UpdateSchema)
@Auth.auth_required
def update(id):
try:
isSuccess, message = signalManager.actionUpdateAnnex.emit(id, request.schema_data)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR)
'''
Author: your name
Date: 2021-06-29 19:33:41
LastEditTime: 2021-07-01 04:03:21
LastEditTime: 2021-07-03 09:33:58
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\view\monitor.py
......@@ -16,7 +16,10 @@ import time
import logging
import pprint
import traceback
import jwt
from threading import Timer
from datetime import datetime, timedelta
from app import config, signalManager
from controller.monitor import insert_data, get_monitor_list, get_watch_list
logger = logging.getLogger(__name__)
......@@ -86,8 +89,17 @@ def pushmessage(func):
return send
class BaseWebsocket(WebSocketHandler):
_clients = []
handlers = {}
def open(self):
# 新加入一个连接后,设置一个接收消息时间戳
# 同时查询改用可以查看哪些设备
# 当有消息到来时,遍历用户列表,将设备IMEI与每个用户的IMEI列表比对
# 如果用户列表有这个IMEI,则需要向该用户广播消息
# 列表 [里面存放字典]
# 字典 { 'uuid': '', 'context': self, 'devices': ['imei', 'imei'], 'ts': '接收消息时间戳' }
className = self.__class__.__name__
logger.warning("websocket of %s is opened" % className)
if className not in self.handlers:
......@@ -124,13 +136,55 @@ class NotifyHandler(BaseWebsocket):
"""
建立与web前端的通信连接,发送状态信息报文
"""
_timer = None
def open(self):
super(NotifyHandler, self).open()
def on_message(self, message):
className = self.__class__.__name__
# 收到心跳包消息,更新接收数据时间
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"))
# 判断消息类型
# 认证包,认证不通过,则剔除该连接
# 查询该用户可查看设备
self._clients.append({
'uuid': '',
'context': self,
'devices': [],
'ts': int(time.time())
})
return result
elif message.get("type") == "heartbeat": # 心跳包
for c in self._clients:
if c.get("uuid") == message.get("uuid"):
c["ts"] = int(time.time())
self.write(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.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):
# 心跳定时器,固定间隔扫描连接列表,当连接超时,主动剔除该连接
self._timer = Timer(5, self.on_heartbeat)
self._timer.start()
class MainHandler(BaseHandler):
def get(self, *args, **kwargs):
print("#############", args)
......@@ -152,6 +206,7 @@ class MainHandler(BaseHandler):
message = {'imei': '12345678900005', 'system': {'free_size': 0}, 'lvgl': {'total_size': 5242880, 'free_cnt': 31, 'free_size': 1279664, 'free_biggest_size': 1205448, 'used_cnt': 832, 'used_pct': 76, 'frag_pct': 6}, 'evm': {'total_size': 2097152, 'free_size': 0, 'gc_usage': 50}, 'image': [{'uri': 'evue_launcher', 'length': 1043, 'png_total_count': 0, 'png_uncompressed_size': 0, 'png_file_size': 0}, {'uri': 'kdgs_1_storyList', 'length': 9608, 'png_total_count': 193, 'png_uncompressed_size': 370884, 'png_file_size': 209807}]}
insert_data(message)
# 这里不能使用广播,得点对点发送,有此设备的账号才能看到调试信息
NotifyHandler.broadcastMessage(message)
class WatchHandler(BaseHandler):
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-06-29 19:39:04
LastEditors: your name
LastEditTime: 2021-07-03 11:57:41
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\view\ws.py
'''
......@@ -36,7 +36,7 @@ def pushmessage(func):
try:
if isinstance(msg, WebsocketResponse) or isinstance(msg, dict):
self.write_message(json.dumps(msg), binary)
elif isinstance(msg, str) or isinstance(msg, unicode):
elif isinstance(msg, str) or isinstance(msg, str):
self.write_message(msg, binary)
else:
self.write_message(repr(msg), binary)
......
......@@ -323,37 +323,6 @@ export function getPaybackList(params) {
});
}
export function addAnnex(params) {
return request({
url: "/api/v1/evm_store/annex/add",
method: "post",
data: params,
});
}
export function deleteAnnex(id) {
return request({
url: `/api/v1/evm_store/annex/delete/${id}`,
method: "post",
});
}
export function getAnnexList(params) {
return request({
url: "/api/v1/evm_store/annex/list",
method: "post",
data: params,
});
}
export function updateAnnex(id, params) {
return request({
url: `/api/v1/evm_store/annex/update/${id}`,
method: "post",
data: params,
});
}
export function deleteProjectUser(params) {
return request({
url: "/api/v1/evm_store/system/deleteProjectUser",
......
/*
* @Author: your name
* @Date: 2021-07-01 15:02:16
* @LastEditTime: 2021-07-01 15:03:23
* @LastEditTime: 2021-07-01 18:20:04
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\utils\eventBus.js
......
<template>
<div class="app-container">
<el-form :inline="true" :model="form" size="mini">
<el-form :inline="true" :model="form" ref="query" size="mini">
<el-form-item label="设备">
<el-select
v-model="watch_id"
......@@ -21,9 +21,9 @@
>查询</el-button
></el-form-item
>
<el-form-item><el-button @click="onReset">重置</el-button></el-form-item>
<el-form-item><el-button @click="onReset('query')">重置</el-button></el-form-item>
</el-form>
<LineChart :chartData="evm" :dataList="evmList"></LineChart>
<LineChart :chartData="evm"></LineChart>
<LvglChart :chartData="lvgl"></LvglChart>
</div>
</template>
......@@ -104,10 +104,15 @@ export default {
});
},
onChange(res) {
if (!res) return null;
var t = this.watchs.find((item) => {
return item.id == res;
});
if (t) this.device = t.imei;
// 清空之前数据
this.processData();
},
onSubmit() {
......@@ -123,9 +128,11 @@ export default {
this.processData()
},
processData() {
this.evm = this.devices[this.device].evm;
this.lvgl = this.devices[this.device].lvgl;
this.image = this.devices[this.device].image;
if (this.devices[this.device]) {
if (this.devices[this.device].evm) this.evm = this.devices[this.device].evm;
if (this.devices[this.device].lvgl) this.lvgl = this.devices[this.device].lvgl;
if (this.devices[this.device].image) this.image = this.devices[this.device].image;
}
}
},
mounted() {},
......
......@@ -125,37 +125,6 @@ export default {
},
},
mounted() {
// this.timer = setInterval(() => {
// for (var i = 0; i < 5; i++) {
// dataList.shift();
// dataList.push(randomData());
// }
// if (!this.chart) {
// clearInterval(this.timer);
// }
// this.chart &&
// this.chart.setOption({
// series: [
// {
// data: dataList,
// },
// ],
// });
// }, 1000);
// this.loading = this.$loading({
// lock: true,
// text: "Loading",
// spinner: "el-icon-loading",
// background: "rgba(0, 0, 0, 0.7)",
// });
// setTimeout(() => {
// this.loading.close()
// }, 2000)
this.$nextTick(() => {
this.initChart();
});
......@@ -168,22 +137,19 @@ export default {
this.chart = null;
},
methods: {
handleData(data) {
cleanData() {
// 关闭从WebSocket接收数据
// 重置所有数据
Object.keys(seriesData).forEach((key) => {
seriesData[key] = [];
});
// this.series.forEach((item) => {
// item.data = [];
// });
// this.chart.setOption({ series: this.series });
data.forEach((item) => {
this.handleMessage(item);
this.series.forEach((item) => {
item.data = [];
});
this.chart.setOption({ series: this.series });
},
handleMessage(data) {
if (!data || data.length == 0) this.cleanData()
// 这里面应该增加一个数组长度判断,当超过了多少个之后,弹出数组第一项,防止数组内存溢出
// seriesData[k].shift()
Object.keys(data).forEach((k) => {
......
<template>
<div class="app-container">
<el-form :inline="true" :model="form" size="mini">
<el-form :inline="true" :model="form" ref="query" size="mini">
<el-form-item label="设备">
<el-select
v-model="watch_id"
......@@ -35,7 +35,7 @@
>查询</el-button
></el-form-item
>
<el-form-item><el-button @click="onReset">重置</el-button></el-form-item>
<el-form-item><el-button @click="onReset('query')">重置</el-button></el-form-item>
</el-form>
<EvmHistoryChart :dataList="evmList"></EvmHistoryChart>
<LvglHistoryChart :dataList="lvglList"></LvglHistoryChart>
......
......@@ -35,11 +35,10 @@ module.exports = {
changeOrigin: true,
pathRewrite: {},
},
"/api/v1/kxpms": {
target: "http://192.168.1.106:5000/",
"/api/v1/evm_store": {
target: "http://store.evmiot.com/",
changeOrigin: true,
pathRewrite: {
"^/online": "/",
// 这里理解成用/api代替target里面的地址,后面组件中我们调用接口时直接用api代替
// 比如我要调用'http://40.00.100.100:3002/user/add',直接写'/api/user/add'即可
},
......
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