Commit db173d95 authored by wanli's avatar wanli

update

parent 9f8f3824
{
"appList": [
{
"uuid": "001",
"img": "alipay.png",
"title": "支付宝",
"arrow": "setup.png",
"download": 120,
"like": 76,
"category": "1016",
"details": {
"version": "1.0.1",
"update": "2021-04-01",
"size": 20,
"log": "优化性能,提高稳定性和安全性",
"desc": "生活好,支付宝"
}
},
{
"uuid": "123",
"img": "qq.png",
"title": "腾讯QQ",
"arrow": "setup.png",
"download": 111,
"like": 70,
"category": "1016",
"details": {
"version": "0.0.2",
"update": "2021-04-02",
"size": 22,
"log": "修复若干已知问题",
"desc": "QQ,乐在沟通"
}
},
{
"uuid": "456",
"img": "qq_music.png",
"title": "QQ音乐",
"arrow": "setup.png",
"download": 100,
"like": 71,
"category": "1012",
"details": {
"version": "0.0.3",
"update": "2021-04-03",
"size": 32,
"log": "优化性能,提高稳定性和安全性",
"desc": "十五年的陪伴,国民音乐平台"
}
},
{
"uuid": "789",
"img": "360kids.png",
"title": "360儿童卫士",
"arrow": "setup.png",
"download": 100,
"like": 56,
"category": "1016",
"details": {
"version": "0.0.5",
"update": "2021-04-05",
"size": 36,
"log": "优化性能,提高稳定性和安全性",
"desc": "千万家长信任的育学助手"
}
},
{
"uuid": "1011",
"img": "baidutieba.png",
"title": "百度贴吧",
"arrow": "setup.png",
"download": 100,
"like": 78,
"category": "1016",
"details": {
"version": "0.0.4",
"update": "2021-04-04",
"size": 25,
"log": "优化性能,提高稳定性和安全性",
"desc": "聊兴趣,上贴吧"
}
},
{
"uuid": "1012",
"img": "aiqiyi.png",
"title": "爱奇艺",
"arrow": "setup.png",
"download": 79,
"like": 76,
"category": "1013",
"details": {
"version": "0.0.3",
"update": "2021-04-03",
"size": 41,
"log": "优化性能,提高稳定性和安全性",
"desc": "欧洲杯免费直播"
}
},
{
"uuid": "1013",
"img": "yy.png",
"title": "YY语音",
"arrow": "setup.png",
"download": 120,
"like": 45,
"category": "1015",
"details": {
"version": "0.0.3",
"update": "2021-04-03",
"size": 32,
"log": "优化性能,提高稳定性和安全性",
"desc": "和附近的聊天看直播"
}
},
{
"uuid": "1014",
"img": "didi.png",
"title": "滴滴打车",
"arrow": "setup.png",
"download": 34,
"like": 55,
"category": "1016",
"details": {
"version": "0.0.3",
"update": "2021-04-03",
"size": 32,
"log": "优化性能,提高稳定性和安全性",
"desc": "滴滴一下,美好出行"
}
},
{
"uuid": "1015",
"img": "gaode.png",
"title": "高德地图",
"arrow": "setup.png",
"download": 29,
"like": 59,
"category": "1016",
"details": {
"version": "0.0.3",
"update": "2021-04-03",
"size": 32,
"log": "优化性能,提高稳定性和安全性",
"desc": "专享88元打车礼包"
}
}
],
"categoryList": [
{
"uuid": "1012",
"img": "music.png",
"title": "音乐"
},
{
"uuid": "1013",
"img": "movie.png",
"title": "视频"
},
{
"uuid": "1014",
"img": "camera.png",
"title": "相机"
},
{
"uuid": "1015",
"img": "voice.png",
"title": "语音"
},
{
"uuid": "1016",
"img": "tool.png",
"title": "工具"
}
],
"downloadList": [
{
"icon": "360kids.png",
"time": 1625648308210,
"iconUrl": "http://store.evmiot.com/application/360kids.png",
"apkId": "789",
"version": "v1.0",
"homePage": "evue_album",
"apkDownloadUrl": "evue_album",
"fileList": "360kids"
},
{
"icon": "qq_music.png",
"time": 1625648308210,
"iconUrl": "http://store.evmiot.com/application/qq_music.png",
"apkId": "456",
"version": "v1.0",
"homePage": "evue_music",
"apkDownloadUrl": "evue_music",
"fileList": "qq_music"
},
{
"icon": "gaode.png",
"time": 1625648308210,
"iconUrl": "http://store.evmiot.com/application/gaode.png",
"apkId": "1015",
"version": "v1.0",
"homePage": "evue_dial",
"apkDownloadUrl": "evue_dial",
"fileList": "gaode"
},
{
"icon": "didi.png",
"time": 1625648308210,
"iconUrl": "http://store.evmiot.com/application/didi.png",
"apkId": "1014",
"version": "v1.0",
"homePage": "evue_setting",
"apkDownloadUrl": "evue_setting",
"fileList": "didi"
},
{
"icon": "alipay.png",
"time": 1625648308210,
"iconUrl": "http://store.evmiot.com/application/zhifubao.png",
"apkId": "001",
"version": "v1.0",
"homePage": "evue_calculator",
"apkDownloadUrl": "evue_calculator",
"fileList": "alipay"
}
]
}
\ No newline at end of file
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-03 11:53:43
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\app\signal_manager.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from fullstack.event import PySignal
class SignalManager(object):
# 接口模块
actionUpdatePassword = PySignal()
actionBackupDatabase = PySignal()
actionApplicationBuild = PySignal()
actionGetConvertString = PySignal()
actionOpqcp = PySignal()
# 登录模块
actionLogin = PySignal()
actionLogout = PySignal()
actionRegister = PySignal()
# 应用管理
actionAddApp = PySignal()
actionGetApp = PySignal()
actionGetAppList = PySignal()
actionUpdateApp = PySignal()
actionDeleteApp = PySignal()
# 应用打包记录
actionAddBuildLog = PySignal()
actionGetBuildLog = PySignal()
actionGetBuildLogList = PySignal()
actionUpdateBuildLog = PySignal()
actionDeleteBuildLog = PySignal()
# 用户模块
actionCheckUser = PySignal()
actionAddUser = PySignal()
actionDeleteUser = PySignal()
actionGetUser = PySignal()
actionGetUserList = PySignal()
actionUpdateUser = PySignal()
# 系统框架模块
actionAddDevice = PySignal()
actionDeleteDevice = PySignal()
actionGetDevice = PySignal()
actionGetDeviceList = PySignal()
actionUpdateDevice = PySignal()
# 应用下载统计模块
actionAddDownload = PySignal()
actionDeleteDownload = PySignal()
actionGetDownload = PySignal()
actionGetDownloadList = PySignal()
actionUpdateDownload = PySignal()
# 应用打包日志
actionAddAppLogs = PySignal()
actionDeleteAppLogs = PySignal()
actionGetAppLogs = PySignal()
actionGetAppLogsList = PySignal()
actionUpdateAppLogs = PySignal()
# 用户登录日志
actionAddLoginLogs = PySignal()
actionDeleteLoginLogs = PySignal()
actionGetLoginLogs = PySignal()
actionGetLoginLogsList = PySignal()
actionUpdateLoginLogs = PySignal()
def __init__(self):
super(SignalManager, self).__init__()
signalManager = SignalManager()
{"lastModifyDateTime": 1625808079}
\ No newline at end of file
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-03 11:53:04
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\controller\__init__.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import logging
from app import signalManager
from .api_manager import apiManager
from .user_manager import userManager
from .login_manager import loginManager
from .apps_manager import appsManager
from .device_manager import deviceManager
from .download_manager import downloadManager
from .login_logs_manager import loginLogsManager
from .app_logs_manager import appLogsManager
from .build_logs_manager import buildLogsManager
logger = logging.getLogger(__name__)
def initConnect():
# 系统模块
signalManager.actionApplicationBuild.connect(appsManager.build)
signalManager.actionGetConvertString.connect(apiManager.get_escape_text)
signalManager.actionUpdatePassword.connect(apiManager.update_user_password)
signalManager.actionOpqcp.connect(apiManager.opqcp)
# 登录模块
signalManager.actionLogin.connect(loginManager.login)
signalManager.actionLogout.connect(loginManager.logout)
signalManager.actionRegister.connect(loginManager.register)
# 应用管理
signalManager.actionAddApp.connect(appsManager.add)
signalManager.actionDeleteApp.connect(appsManager.delete)
signalManager.actionGetApp.connect(appsManager.get)
signalManager.actionGetAppList.connect(appsManager.getList)
signalManager.actionUpdateApp.connect(appsManager.update)
# 设备管理
signalManager.actionAddDevice.connect(deviceManager.add)
signalManager.actionDeleteDevice.connect(deviceManager.delete)
signalManager.actionGetDevice.connect(deviceManager.get)
signalManager.actionGetDeviceList.connect(deviceManager.getList)
signalManager.actionUpdateDevice.connect(deviceManager.update)
# 打包记录
signalManager.actionAddBuildLog.connect(buildLogsManager.add)
signalManager.actionDeleteBuildLog.connect(buildLogsManager.delete)
signalManager.actionGetBuildLog.connect(buildLogsManager.get)
signalManager.actionGetBuildLogList.connect(buildLogsManager.getList)
signalManager.actionUpdateBuildLog.connect(buildLogsManager.update)
# 用户登录记录
signalManager.actionAddLoginLogs.connect(loginLogsManager.add)
signalManager.actionDeleteLoginLogs.connect(loginLogsManager.delete)
signalManager.actionGetLoginLogs.connect(loginLogsManager.get)
signalManager.actionGetLoginLogsList.connect(loginLogsManager.getList)
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.actionAddDownload.connect(downloadManager.add)
signalManager.actionDeleteDownload.connect(downloadManager.delete)
signalManager.actionGetDownload.connect(downloadManager.get)
signalManager.actionGetDownloadList.connect(downloadManager.getList)
signalManager.actionUpdateDownload.connect(downloadManager.update)
# 应用打包日志
signalManager.actionAddAppLogs.connect(appLogsManager.add)
signalManager.actionDeleteAppLogs.connect(appLogsManager.delete)
signalManager.actionGetAppLogs.connect(appLogsManager.get)
signalManager.actionGetAppLogsList.connect(appLogsManager.getList)
signalManager.actionUpdateAppLogs.connect(appLogsManager.update)
initConnect()
\ No newline at end of file
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 11:39:27
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\controller\api_manager.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import logging
import shutil
from datetime import datetime
from pony.orm import *
from app.setting import config
from model.user import User
from utils import md5_salt
from utils.ccode import convert_string
logger = logging.getLogger(__name__)
class ApiManager(object):
def __init__(self):
super(ApiManager, self).__init__()
def update_user_password(self, user, data):
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
result = User.get(uuid=data.get("uuid"), password=md5_salt(data['password']))
if not result:
return None, "user does not exists"
data.pop("uuid")
data['password'] = md5_salt(data['newPassword'])
data.pop('newPassword')
data.update({
"create_by": editor.id,
"create_at": datetime.now(),
"update_by": editor.id,
"update_at": datetime.now()
})
result = result.set(**data)
commit()
return True, "success"
def get_escape_text(self, data):
# fname = "./a.c"
# target = os.sep.join(["out", fname])
# if os.path.exists(fname):
# os.remove(fname)
# if os.path.exists(target):
# os.remove(target)
# with open(fname, "w+") as f:
# f.write(data['string'])
# result = os.system("./opqcp {i} ./out".format(i=fname))
# print(result)
# with open(target) as f:
# result = f.read()
# return result
return convert_string(data['string'])
def opqcp(self, params):
target_file = os.path.normpath(os.sep.join([config.get("UPLOAD_PATH"), params.get("filename")]))
shutil.copy(target_file, os.getcwd())
# dtNowString = datetime.now().strftime("%Y%m%d%H%M%S%f")
# fn, ex = os.path.splitext(params.get("filename"))
output_path = os.sep.join([os.path.dirname(target_file), "out"])
if not os.path.exists(output_path):
os.makedirs(output_path)
print("#######", output_path)
# print(os.path.dirname(os.getcwd()), os.path.abspath("../opqcp/opqcp"))
result = os.system("./opqcp {i} ./out".format(i=os.path.basename(target_file)))
print(result)
# command = ["./opqcp", os.path.basename(target_file), "./"]
fname = os.sep.join([os.getcwd(), "out", os.path.basename(target_file)])
shutil.copy(fname, output_path)
os.remove(fname)
# ret = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", timeout=5)
# if ret.returncode == 0:
# print("success:", ret)
# else:
# print("error:", ret)
# ret = target_file
return True, os.sep.join([output_path.replace(config.get("UPLOAD_PATH"), ""), params.get("filename")])
apiManager = ApiManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import copy
import logging
from datetime import datetime
from pony.orm import *
from model import fullStackDB
from model.app_logs import AppLogs
from model.user import User
logger = logging.getLogger(__name__)
class AppLogsManager(object):
def __init__(self):
super(AppLogsManager, self).__init__()
def add(self, user, data):
# 判断角色名是否存在
result = AppLogs.get(name=data.get("name"))
if result:
return False, "app logs name has been exists."
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
data.update({
'create_by': editor,
'create_at': datetime.now(),
})
result = fullStackDB.add(AppLogs, **data)
return result, "add app logs {}.".format("success" if result else "fail")
def delete(self, user, uuid):
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
result = AppLogs.get(uuid=uuid)
if result:
result.delete()
return result, "delete app logs {}.".format("success" if result else "fail")
def get(self, data):
result = AppLogs.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 app logs {}.".format("success" if result else "fail")
def getList(self, user, 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')
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
if editor.role != "administrator":
temp.update({ 'create_by': editor })
if "scope_type" in data and data.get("scope_type") == "list":
result = AppLogs.select().where(**temp).order_by(desc(AppLogs.create_at))
temp = []
for item in result:
temp.append(item.to_dict(only=["uuid", "app_name"]))
return temp, len(temp), "get select {}.".format("success" if temp else "no data")
result = AppLogs.select().where(**temp).order_by(desc(AppLogs.create_at)).page(data.get("pagenum", 1), data.get("pagesize", 10))
count = AppLogs.select().where(**temp).count()
if result and len(result):
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True)
t.update({
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S"),
"create_by": item.create_by.to_dict(only=["uuid", "username"]),
})
temp.append(t)
result = temp
return result, count, "get app logs {}.".format("success" if result else "no data")
def update(self, user, 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=user)
if not editor:
return False, "current user is not exists"
return True, "update app logs {}.".format("success" if True else "fail")
appLogsManager = AppLogsManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import re
import shutil
import copy
import json
import logging
from urllib import parse
from datetime import datetime
from pony.orm import *
from app import signalManager, config
from model.annex import Annex
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 ThreadMaker
from utils.epk import EpkApp
logger = logging.getLogger(__name__)
@ThreadMaker
def build_application(user, uuid):
signalManager.actionAddBuildLog.emit(user, uuid, isMove=False)
class AppsManager(object):
def __init__(self):
super(AppsManager, self).__init__()
def add(self, user, data):
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
# result = Apps.select(app_name=data.get("app_name"), is_delete=False).count()
# if result < 1:
# return False, "app_name has been exists."
data.update({
'app_icon': data["app_icon"].replace(config.get("UPLOAD_PATH"), ""),
'create_by': editor,
'create_at': datetime.now(),
'update_by': editor,
'update_at': datetime.now(),
})
app_files = []
epk_path = ""
if data.get("fileList"):
app_files = data.get("fileList")
data.pop("fileList")
epk_path = data.get("epk_path")
data.pop("epk_path")
app = Apps(**data)
commit()
# 在EPK目录下生成JSON文件
with open(os.sep.join([os.path.dirname(epk_path), "epk.json"]), "w") as f:
json.dump(app.to_dict(exclude=["uuid", "create_at", "update_at", "delete_at"]), f)
for a in app_files:
Annex(app=app, title=os.path.basename(a), path=a, size=os.path.getsize(a), create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now())
flush()
commit()
app_info = {}
params = { 'appName': app.app_name, 'appDir': epk_path, 'appVersion': app.app_version, 'output': os.path.dirname(epk_path) }
if editor.role == "administrator" or editor.role == "community":
params['algorithm'] ="h"
epk = EpkApp(**params)
app_info = epk.pack()
epk_filename = os.sep.join([os.path.dirname(epk_path).replace(config.get("UPLOAD_PATH"), ""), "{}.epk".format(app.app_name)]).replace('\\', '/')
if app_info:
app_info['md5'] = str(app_info['md5'])
result = BuildLogs(app=app, app_path=epk_filename, app_info=app_info, source=1, create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now())
commit()
AppLogs(app_name=app.app_name, app_path=epk_filename, app_version=data.get("app_version"), app_info=app_info, create_by=editor, create_at=datetime.now())
commit()
return result, "add app {}".format("success" if result else "fail")
def delete(self, user, uuid):
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
result = Apps.get(uuid=uuid)
if result:
result.delete()
return result, "delete app {}.".format("success" if result else "fail")
def get(self, user, data):
if not data.get("uuid"):
return False, "app uuid can not be null"
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
# 根据app查询应用,获取应用有哪些文件
# 按格式创建文件夹,将这些文件移动到这个文件夹
# 将这些零散文件进行打包
# 更新数据库对应文件的路径
app = Apps.get(uuid=data.get("uuid"))
if not app:
return None, "app not found"
source_files = Annex.select().filter(app=app)
if not source_files:
return None, "apps file not found"
dtNowString = datetime.now().strftime("%Y%m%d%H%M%S")
dirname = "{}-{}-{}-{}".format(app.app_name, app.app_version, app.category, dtNowString)
upload_dir = os.sep.join([config.get("UPLOAD_PATH"), config.get("EPK_DIR")])
target_dir = os.sep.join([upload_dir, dirname])
dest_dir = os.sep.join([target_dir, "src"])
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
app_files = []
for sf in source_files:
target_file = sf.path
if not os.path.exists(sf.path):
target_file = os.sep.join([config.get("UPLOAD_PATH"), sf.path])
filename = os.path.basename(target_file)
name, suffix = os.path.splitext(filename)
name = re.sub(r"_\d{14}$", "", name)
dst_file = os.path.normpath(os.sep.join([dest_dir, name + suffix]))
shutil.copy(os.path.normpath(target_file), dst_file)
app_files.append([sf.id, dst_file])
with open(os.sep.join([target_dir, "epk.json"]), "w") as f:
json.dump(app.to_dict(exclude=["uuid", "create_at", "update_at", "delete_at"]), f)
# 打包成EPK文件
app_info = {}
params = { 'appName': app.app_name, 'appDir': dest_dir, 'appVersion': app.app_version, 'output': target_dir }
if editor.role == "administrator" or editor.role == "community":
params['algorithm'] = "h"
epk = EpkApp(**params)
app_info = epk.pack()
app_info['md5'] = str(app_info['md5'])
# 更新数据库对应文件路径
# 将文件拷贝过去后,需要重新更新数据库文件记录
epk_path = os.sep.join([target_dir.replace(config.get("UPLOAD_PATH"), ""), "{}.epk".format(app.app_name)]).replace('\\', '/')
build = BuildLogs.get(app=app)
if build:
build.set(app_path=epk_path, app_info=app_info, update_by=editor, update_at=datetime.now())
commit()
# 新增一条AppLogs
AppLogs(app_name=app.app_name, app_path=epk_path, app_version=app.app_version, app_info=app_info, create_by=editor, create_at=datetime.now())
commit()
return { 'app_name': app.app_name, 'app_path': epk_path }, "rebuild app {}.".format("success" if app_info else "fail")
def getList(self, user, 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')
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
if editor.role == "administrator":
temp.update({"is_delete": False})
else:
temp.update({ "create_by": editor, "is_delete": False })
if "scope_type" in data and data.get("scope_type") == "list":
result = Apps.select().where(**temp).order_by(desc(Apps.create_at))
temp = []
for item in result:
temp.append(item.to_dict(only=["uuid", "app_name"]))
return temp, len(temp), "get app {}.".format("success" if temp else "fail")
elif "scope_type" in data and data.get("scope_type") == "distinct":
result = select(p.category for p in Apps)
temp = []
for item in result:
temp.append(item)
return temp, len(temp), "success"
result = Apps.select().where(**temp).order_by(Apps.sort).sort_by(desc(Apps.create_at)).page(data.get("pagenum", 1), pagesize=data.get("pagesize", 10))
count = Apps.select().where(**temp).count()
if result and len(result):
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, exclude=["app_annex", "app_download", "is_delete", "delete_by", "delete_at"])
t.update({
"app_build_log": item.app_build_log.to_dict(exclude=["is_delete", "delete_by", "delete_at", "create_by", "update_by"]) if item.app_build_log else None,
"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") if item.create_at else None,
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S") if item.update_at else None,
})
temp.append(t)
result = temp
return result, count, "get app {}.".format("success" if result else "no data")
def update(self, user, uuid, data):
# 当参数为空时,直接返回错误
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "app can not be null."
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
result = Apps.get(uuid=uuid)
if not result:
return False, "app not found"
if data.get("app_files"):
app_files = data.get("app_files")
for a in app_files:
Annex(app=result, title=a.get("filename"), path=a.get("filepath"), size=a.get("filesize"), create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now())
flush()
commit()
data.pop("app_files")
if data.get("app_icon"):
condition = {
'update_by': editor,
'update_at': datetime.now()
}
if data.get("app_icon").get("filename"):
condition.update({"title": data.get("app_icon").get("filename")})
if data.get("app_icon").get("filepath"):
condition.update({"path": data.get("app_icon").get("filepath")})
if data.get("app_icon").get("filesize"):
condition.update({"size": data.get("app_icon").get("filesize")})
result.app_icon.set(**condition)
commit()
data.pop("app_icon")
result.set(update_at=datetime.now(), update_by=editor, **data)
commit()
build_application(user, str(result.uuid))
return result, "update app {}.".format("success" if result else "fail")
def build(self, files, data):
with db_session:
user = User.get(uuid=data['access_key'])
if not user:
return False, "user does not exists"
if data.get("access_key"):
data.pop("access_key")
data.update({
'create_by': user,
'create_at': datetime.now(),
'update_by': user,
'update_at': datetime.now(),
})
app = Apps(**data)
commit()
dir_format = "{}-{}-{}".format(app.app_name, app.app_version, datetime.now().strftime("%Y%m%d%H%M%S"))
upload_dir = os.sep.join([config.get("UPLOAD_PATH"), "evueapps"])
target_dir = os.sep.join([upload_dir, user.account, dir_format])
dest_dir = os.sep.join([target_dir, "src"])
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
for target_file in files:
filename = os.path.basename(target_file)
name, suffix = os.path.splitext(filename)
name = re.sub(r"_\d{14}$", "", name)
dst_file = os.path.normpath(os.sep.join([dest_dir, name + suffix]))
shutil.copy(os.path.normpath(target_file), dst_file)
Annex(app=app, title=filename, path=dst_file.replace(config.get("UPLOAD_PATH"), ""), size=os.path.getsize(dst_file), create_by=user, create_at=datetime.now(), update_by=user, update_at=datetime.now())
flush()
commit()
# 打包成EPK文件
app_info = {}
params = { 'appName': app.app_name, 'appDir': dest_dir, 'appVersion': app.app_version, 'output': target_dir }
if user.role == "administrator" or user.role == "community":
params['algorithm'] = "h"
epk = EpkApp(**params)
app_info = epk.pack()
app_info['md5'] = str(app_info['md5'])
# 更新数据库对应文件路径
# 将文件拷贝过去后,需要重新更新数据库文件记录
epk_path = os.sep.join([target_dir.replace(config.get("UPLOAD_PATH"), ""), "{}.epk".format(app.app_name)]).replace('\\', '/')
build = BuildLogs.get(app=app)
if build:
build.set(app_path=epk_path, app_info=app_info, update_by=user, update_at=datetime.now())
commit()
else:
BuildLogs(app=app, app_path=epk_path, app_info=app_info, source=2, create_by=user, create_at=datetime.now(), update_by=user, update_at=datetime.now())
commit()
# 新增一条AppLogs
AppLogs(app_name=app.app_name, app_path=epk_path, app_version=app.app_version, app_info=app_info, create_by=user, create_at=datetime.now())
commit()
with open(os.sep.join([target_dir, "epk.json"]), "w") as f:
json.dump(app.to_dict(exclude=["uuid", "create_at", "update_at", "delete_at"]), f)
return { 'app_name': app.app_name, 'app_file': "{}.epk".format(app.app_name), 'app_url': parse.urljoin(config['UPLOAD_SERVER'], epk_path) }, "application build {}.".format("success" if app_info else "fail")
appsManager = AppsManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import re
import copy
import shutil
import logging
from datetime import datetime
from pony.orm import *
from app.setting import config
from model import fullStackDB
from model.apps import Apps
from model.annex import Annex
from model.app_logs import AppLogs
from model.build_logs import BuildLogs
from model.user import User
from utils.epk import EpkApp
logger = logging.getLogger(__name__)
class BuildLogsManager(object):
def __init__(self):
super(BuildLogsManager, self).__init__()
def add(self, user, app):
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
# 根据app查询应用,获取应用有哪些文件
# 按格式创建文件夹,将这些文件移动到这个文件夹
# 将这些零散文件进行打包
# 更新数据库对应文件的路径
app = Apps.get(uuid=app)
if not app:
return None, "app not found"
source_files = Annex.select().filter(app=app)
if not source_files:
return None, "apps file not found"
dir_format = "{}-{}-{}".format(app.app_name, app.app_version, datetime.now().strftime("%Y%m%d%H%M%S"))
upload_dir = os.sep.join([config.get("UPLOAD_PATH"), config.get("UPLOAD_DIR"), "evueapps"])
target_dir = os.sep.join([upload_dir, editor.account, dir_format])
dest_dir = os.sep.join([target_dir, "src"])
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
app_files = []
for sf in source_files:
target_file = os.sep.join([config.get("UPLOAD_PATH"), sf.path])
filename = os.path.basename(target_file)
name, suffix = os.path.splitext(filename)
name = re.sub(r"_\d{14}$", "", name)
dst_file = os.path.normpath(os.sep.join([dest_dir, name + suffix]))
shutil.move(os.path.normpath(target_file), dst_file)
app_files.append([sf.id, dst_file])
# 打包成EPK文件
app_info = {}
params = { 'appName': app.app_name, 'appDir': dest_dir, 'appVersion': app.app_version, 'output': target_dir }
if editor.role == "administrator" or editor.role == "community":
params['algorithm'] = "h"
epk = EpkApp(**params)
app_info = epk.pack()
if app_info:
app_info['md5'] = str(app_info['md5'])
# 更新数据库对应文件路径
for sf in source_files:
for af in app_files:
if sf.id == af[0]:
t = os.path.normpath(af[1].replace(config.get("UPLOAD_PATH"), "")).replace('\\', '/')
sf.set(path=t)
flush()
commit()
epk_path = os.sep.join([target_dir.replace(config.get("UPLOAD_PATH"), ""), "{}.epk".format(app.app_name)]).replace('\\', '/')
# 新增一条BuildLogs
result = BuildLogs(app=app, app_path=epk_path, app_info=app_info, create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now())
commit()
# 新增一条AppLogs
AppLogs(app_name=app.app_name, app_path=epk_path, app_version=app.app_version, app_info=app_info, create_by=editor, create_at=datetime.now())
commit()
return epk_path, "add build_logs {}.".format("success" if result else "fail")
def delete(self, user, uuid):
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
result = fullStackDB.update(BuildLogs, { 'uuid': uuid }, is_delete=True, delete_at=datetime.now(), delete_by=editor)
return result, "delete build_logs {}.".format("success" if result else "fail")
def get(self, user, app_id):
with db_session:
app = Apps.get(uuid=app_id)
if not app:
return False, "app not found"
result = BuildLogs.select().where(app=app).order_by(desc(BuildLogs.create_at)).first()
if result:
result = result.to_dict(only=["uuid", "app_path"])
result.update({ "app_name": app.app_name })
return result, "get build logs {}.".format("success" if result else "no data")
def getList(self, user, 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')
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
if editor.role == "administrator":
temp.update({"is_delete": False})
else:
temp.update({ "create_by": editor, "is_delete": False })
if "scope_type" in data and data.get("scope_type") == "list":
result = BuildLogs.select().where(**temp).order_by(desc(BuildLogs.create_at))
temp = []
for item in result:
temp.append({ "name": item.app.app_name, "uuid": str(item.uuid) })
return temp, len(temp), "get build_logs {}.".format("success" if temp else "fail")
result = BuildLogs.select().where(**temp).order_by(desc(BuildLogs.create_at)).page(data.get("pagenum", 1), pagesize=data.get("pagesize", 10))
count = BuildLogs.select().where(**temp).count()
if result and len(result):
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, exclude=["is_delete", "delete_by", "delete_at"])
t.update({
"app": item.app.to_dict(exclude=["is_delete", "delete_by", "delete_at"]),
"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") if item.create_at else None,
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S") if item.update_at else None,
})
temp.append(t)
result = temp
return result, count, "get build_logs {}.".format("success" if result else "no data")
def update(self, user, 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=user)
if not editor:
return False, "current user is not exists"
result = fullStackDB.update(BuildLogs, { 'uuid': uuid }, update_at=datetime.now(), update_by=editor, **data)
return result, "update build log {}.".format("success" if result else "fail")
buildLogsManager = BuildLogsManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import copy
import logging
from datetime import datetime
from pony.orm import *
from model import fullStackDB
from model.device import Device
from model.user import User
logger = logging.getLogger(__name__)
class DeviceManager(object):
def __init__(self):
super(DeviceManager, self).__init__()
def add(self, user, data):
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
device = Device.select().where(imei=data.get("imei")).first()
if device:
return False, "device has been exists"
data.update({
'create_by': editor,
'create_at': datetime.now(),
'update_by': editor,
'update_at': datetime.now(),
})
result = Device(**data)
commit()
return result, "add Device {}.".format("success" if result else "fail")
def delete(self, user, uuid):
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
result = fullStackDB.update(Device, { 'uuid': uuid }, is_delete=True, delete_at=datetime.now(), delete_by=editor)
return result, "delete Device {}.".format("success" if result else "fail")
def get(self, user, data):
result = Device.get(**data)
if result:
result = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "create_at", "update_at", "delete_at"])
return result, "get Device {}.".format("success" if result else "fail")
def getList(self, user, 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')
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
if editor.role == "administrator":
temp.update({ "is_delete": False })
else:
temp.update({"create_by": editor, "is_delete": False})
if "scope_type" in data and data.get("scope_type") == "list":
result = Device.select().where(**temp).order_by(desc(Device.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 = Device.select().where(**temp).order_by(desc(Device.create_at)).page(data.get("pagenum", 1), data.get("pagesize", 10))
count = Device.select().where(**temp).count()
if result and len(result):
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, exclude=["is_delete", "delete_at", "delete_by"])
t.update({
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S"),
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S"),
"create_by": item.create_by.to_dict(only=["uuid", "username"]),
"update_by": item.update_by.to_dict(only=["uuid", "username"])
})
temp.append(t)
result = temp
return result, count, "get Device {}.".format("success" if result else "no data")
def update(self, user, uuid, data):
# 当参数为空时,直接返回错误
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "parameters can not be null."
with db_session:
# 查询请求者是否存在
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
if data.get("imei"):
device = Device.select().where(imei=data.get("imei")).first()
if device:
return False, "device has been exists"
result = Device.get(uuid=uuid)
if result:
result.set(update_at=datetime.now(), update_by=editor, **data)
commit()
return result, "update role {}.".format("success" if result else "fail")
deviceManager = DeviceManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import copy
import logging
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
logger = logging.getLogger(__name__)
class DictManager(object):
def __init__(self):
super(DictManager, self).__init__()
def add(self, data):
# 判断相同的类别和标签是否存在
result = Dict.get(label=data.get("label"), value=data.get("value"), category=data.get("category"))
if result:
return False, "dictionary 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(Dict, **data)
return result, "add dictionary {}.".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 = Dict.get(uuid=uuid)
if not result:
return False, "dict does not exists"
else:
if result.is_system:
return False, "dict can not delete"
result = fullStackDB.update(Dict, { 'uuid': uuid }, is_delete=True, delete_at=datetime.now(), delete_by=editor)
return result, "delete dictionary {}.".format("success" if result else "fail")
def get(self, data):
result = Dict.get(**data)
if result:
result = result.to_dict(only=["uuid", "label", "create_at", "update_at"])
return result, "get dictionary {}.".format("success" if result else "no data")
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')
if 'is_category' in temp:
temp.pop('is_category')
if 'category' in temp and isinstance(data.get("category"), list):
temp.pop("category")
temp.setdefault("is_delete", False)
if "scope_type" in data and data.get("scope_type") == "list":
result = Dict.select().where(**temp).order_by(Dict.sort)
temp = []
for item in result:
if item.category in data.get("category"):
temp.append(item.to_dict(only=["uuid", "label", "value", "category"]))
return temp, len(temp), "get dictionary list {}.".format("success" if temp else "no data")
elif "is_category" in data and data.get("is_category") == 1:
result = select(d.category for d in Dict)
# result = Dict.select_by_sql("SELECT DISTINCT(`category`) FROM `{}`".format(Dict._table_))
return list(result), len(result), "get select {}.".format("success" if result else "fail")
result = Dict.select().where(**temp).order_by(desc(Dict.create_at)).page(data.get("pagenum", 1), data.get("pagesize", 10))
count = Dict.select().where(**temp).count()
if result:
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True,)
t.update({
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S"),
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S"),
"create_by": item.create_by.to_dict(only=["uuid", "username"]),
"update_by": item.update_by.to_dict(only=["uuid", "username"])
})
temp.append(t)
result = temp
return result, count, "get dictionary {}.".format("success" if result else "fail")
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(Dict, { 'uuid': uuid }, update_at=datetime.now(), update_by=editor, **data)
return result, "update dictionary {}.".format("success" if result else "fail")
dictManager = DictManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import copy
import json
import logging
import urllib
from pathlib import Path
from urllib import parse, request
from urllib.parse import urlparse
from datetime import datetime
from pony.orm import *
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 ThreadMaker
logger = logging.getLogger(__name__)
@ThreadMaker
def update_download_information(ip, id):
params = { 'ak': 'aZEAgYG8wKuLd6DS9BmCloGtfnGGkRMn', 'coor': 'bd09ll' }
parameters = urllib.parse.urlencode(params)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'
}
if ip != '127.0.0.1':
params.update({'ip': ip})
parameters = urllib.parse.urlencode(params)
url = 'http://api.map.baidu.com/location/ip'
req = request.Request(url='%s%s%s' % (url, '?', parameters), headers=headers)
ret = request.urlopen(req).read()
jsonData = json.loads(ret)
logger.info(jsonData)
if (0 != jsonData['status']):
return None
with db_session:
down = AppDownload.get(id=id)
if down:
down.set(address=jsonData['address'], ip=ip, remarks=json.dumps(jsonData['content'], ensure_ascii=False))
commit()
def convert_url_to_local_path(url):
parsed_result = urlparse(url)
target_file = os.sep.join([config.get("UPLOAD_PATH").replace('\\', '/'), parsed_result.path])
target_file = os.path.normpath(target_file)
return target_file
class DownloadManager(object):
def __init__(self):
super(DownloadManager, self).__init__()
def add(self, user, data):
with db_session:
app = Apps.get(id=data.get("app"), is_delete=False)
if not app:
return False, "app does not found"
editor = User.get(id=user)
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 = AppDownload(app=app, imei=data.get("imei"), **data)
commit()
return result, "add dictionary {}.".format("success" if result else "fail")
def delete(self, user, uuid):
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
result = AppDownload.get(uuid=uuid)
if not result:
return False, "dict does not exists"
result.set(is_delete=True, delete_at=datetime.now(), delete_by=editor)
commit()
return result, "delete dictionary {}.".format("success" if result else "fail")
def get(self, data):
# 流程如下:
# 获取前端传来的应用UUID和IMEI
# 根据应用UUID查找应用信息,找不到返回失败信息
# 如果应用ID是evue_launcher,则进行如下处理
# 遍历系统所有应用,将相关应用根据4个一组拼接到一个数组里面去
# 最后将这些信息导出为一个JSON文件
# 将evue_launcher.evue和evue_dock.evue以及相关资源文件进行打包
# 以上文件全部是复制处理,最后根据格式生成文件夹,将epk文件写入到这里
# 读取这个epk文件,以encoding='utf8'格式返回字节流
# 否则就是普通应用
# 查找出这个应用路径以及依赖文件
# 将这些文件进行打包
# 读取这个epk文件,以encoding='utf8'格式返回字节流
# 此次下载将生成一次下载记录
# 当前还没有校验前端传来的IMEI是否是合法的
# 根据IMEI查找设备,根据设备查找用户,根据用户查找应用
app = None
with db_session:
# 根据IMEI查找设备
# device = Device.select().where(imei=data.get("imei")).first()
# logger.info(data)
# if not device:
# return False, "device not found"
# if not device.create_by:
# return False, "create user is null"
app = Apps.select(app_name=data.get("id")).order_by(desc(Apps.create_at))
if len(app) > 1:
app = Apps.select(lambda p: p.app_name == data.get("id") and p.create_by.account == 'evm').order_by(desc(Apps.create_at))
if not app:
return False, "app not found"
app = app[:]
epk_path = ""
if app[0].app_build_log:
epk_path = os.path.normpath(os.sep.join([config.get("UPLOAD_PATH"), app[0].app_build_log.app_path]))
epk_path = Path(epk_path)
if not epk_path.exists():
return False, "epk file not found"
down = AppDownload(app=app[0], imei=data.get("imei"))
commit()
if down:
update_download_information(data.get('real_ip', '127.0.0.1'), down.id)
return epk_path, "get dictionary {}.".format("success" if epk_path else "no data")
def getList(self, user, 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)
with db_session:
if "scope_type" in data and data.get("scope_type") == "list":
result = AppDownload.select().where(**temp).order_by(AppDownload.sort)
temp = []
for item in result:
temp.append(item.to_dict(only=["uuid"]))
return temp, len(temp), "get dictionary list {}.".format("success" if temp else "no data")
result = AppDownload.select().where(**temp).order_by(desc(AppDownload.download_at)).page(data.get("pagenum", 1), data.get("pagesize", 10))
count = AppDownload.select().where(**temp).count()
if result:
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True)
t.update({
"app": item.app.to_dict(exclude=["create_by", "update_by", "delete_by", "is_delete"]),
"download_at": item.download_at.strftime("%Y-%m-%d %H:%M:%S")
})
temp.append(t)
result = temp
return result, count, "get dictionary {}.".format("success" if result else "fail")
def update(self, user, uuid, data):
# 当参数为空时,直接返回错误
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "parameters can not be null."
with db_session:
# 查询请求者是否存在
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
result = AppDownload.get(uuid=uuid)
if not result:
return False, "app does not found"
result.set(update_at=datetime.now(), update_by=editor, **data)
commit()
return result, "update dictionary {}.".format("success" if result else "fail")
downloadManager = DownloadManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import copy
import logging
from datetime import datetime
from pony.orm import *
from model import fullStackDB
from model.login_logs import LoginLogs
from model.user import User
logger = logging.getLogger(__name__)
class LoginLogsManager(object):
def __init__(self):
super(LoginLogsManager, self).__init__()
def add(self, user, data):
# 判断角色名是否存在
result = LoginLogs.get(name=data.get("name"))
if result:
return False, "app logs name has been exists."
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
data.update({
'create_by': editor,
'create_at': datetime.now(),
})
result = fullStackDB.add(LoginLogs, **data)
return result, "add app logs {}.".format("success" if result else "fail")
def delete(self, user, uuid):
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
result = LoginLogs.get(uuid=uuid)
if result:
result.delete()
return result, "delete app logs {}.".format("success" if result else "fail")
def get(self, data):
result = LoginLogs.get(**data)
if result:
result = result.to_dict(with_collections=True, related_objects=True)
return result, "get app logs {}.".format("success" if result else "fail")
def getList(self, user, 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')
with db_session:
editor = User.get(id=user)
if not editor:
return False, "current user is not exists"
temp.update({ 'create_by': editor })
if "scope_type" in data and data.get("scope_type") == "list":
result = LoginLogs.select().where(**temp).order_by(desc(LoginLogs.create_at))
temp = []
for item in result:
temp.append(item.to_dict(only=["uuid"]))
return temp, len(temp), "get select {}.".format("success" if temp else "no data")
result = LoginLogs.select().where(**temp).order_by(desc(LoginLogs.create_at)).page(data.get("pagenum", 1), data.get("pagesize", 10))
count = LoginLogs.select().where(**temp).count()
if result and len(result):
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True)
t.update({
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S"),
"create_by": item.create_by.to_dict(only=["uuid", "username"]),
})
temp.append(t)
result = temp
return result, count, "get app logs {}.".format("success" if result else "no data")
def update(self, user, 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=user)
if not editor:
return False, "current user is not exists"
return True, "update app logs {}.".format("success" if True else "fail")
loginLogsManager = LoginLogsManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import json
import logging
import urllib
from urllib import parse, request
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.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(__name__)
@ThreadMaker
def update_login_information(ip, user_id):
params = { 'ak': 'aZEAgYG8wKuLd6DS9BmCloGtfnGGkRMn', 'coor': 'bd09ll' }
parameters = urllib.parse.urlencode(params)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'
}
if ip != '127.0.0.1':
params.update({'ip': ip})
parameters = urllib.parse.urlencode(params)
url = 'http://api.map.baidu.com/location/ip'
req = request.Request(url='%s%s%s' % (url, '?', parameters), headers=headers)
ret = request.urlopen(req).read()
jsonData = json.loads(ret)
logger.info(jsonData)
if (0 != jsonData['status']):
return None
with db_session:
user = User.get(id=user_id)
if not user:
return
LoginLogs(username=user.username, ip=ip, address=jsonData['address'], create_by=user, remarks=json.dumps(jsonData['content'], ensure_ascii=False))
commit()
class LoginManager(object):
'''
用户管理的单例类
'''
def __init__(self):
super(LoginManager, self).__init__()
# Thread(target=self.dashboard).start()
def login(self, data):
'''
用户登录
:param data:登录的用户信息json如 { "account": "xx", "password": "xx" }
:return ret: dict类型的登录相关信息
'''
with db_session:
# 判断用户名是否存在
result = User.get(account=data.get("account"))
if not result:
return False, ResponseCode.NO_DATA_FOUND
# 判断密码是否正确
result = User.get(account=data.get("account"), password=md5_salt(data.get("password")))
if not result:
return False, ResponseCode.PASSWORD_ERROR
# 判断用户是否禁用
if result.is_delete:
return False, ResponseCode.ACCOUNT_DISABLED
real_ip = flask_request.headers['X-Forwarded-For']
update_login_information(real_ip, result.id)
# 返回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
def logout(self):
'''
用户登出
'''
return True, "user logout success."
def register(self, data):
'''
用户注册
'''
with db_session:
# 判断账号是否存在
editor = User.get(account=data.get("account"))
if editor:
return False, "user already exists"
data.update({
"password": md5_salt(data['password']),
"create_by": 0,
"create_at": datetime.now(),
"update_by": 0,
"update_at": datetime.now()
})
result = User(**data)
commit()
result.create_by = result.id
result.update_by = result.id
commit()
return result, "user register {}.".format("success" if result else "fail")
loginManager = LoginManager()
'''
Author: your name
Date: 2021-06-29 19:24:32
LastEditTime: 2021-07-14 21:25:39
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\controller\monitor.py
'''
from model.monitor import session, System, Lvgl, Evm, Image, Device, Request, User
class SystemResource(object):
def get(self):
result = session.query(System).all()
print(result)
return result
def post(self, params):
result = System(**params)
session.add(result)
return session.commit()
def put(self):
pass
def delete(self):
pass
class LvglResource(object):
def get(self):
result = session.query(Lvgl).all()
print(result)
return result
def post(self, params):
result = Lvgl(**params)
session.add(result)
return session.commit()
def put(self):
pass
def delete(self):
pass
class EvmResource(object):
def get(self):
result = session.query(Evm).all()
print(result)
return result
def post(self, params):
result = Evm(**params)
session.add(result)
return session.commit()
def put(self):
pass
def delete(self):
pass
class ImageResource(object):
def get(self):
result = session.query(Image).all()
print(result)
return result
def post(self, params):
result = Image(**params)
session.add(result)
return session.commit()
def post_array(self, array, watch):
t = []
for a in array:
a.update({ "watch": watch })
t.append(Image(**a))
session.add_all(t)
return session.commit()
def put(self):
pass
def delete(self):
pass
systemResource = SystemResource()
lvglResource = LvglResource()
evmResource = EvmResource()
imageResource = ImageResource()
def insert_data(msg):
# 先判断手表imei是否存在,不存在则先注册手表IMEI
watch_id = -1
if msg.get("imei"):
result = session.query(Device).filter_by(imei=msg.get("imei")).first()
if result:
watch_id = result.id
else:
user = session.query(User).filter(User.account=="evm").first()
result = Device(imei=msg.get("imei"), name="watch_{}".format(msg.get("imei")), type="watch", create_by=user.id, update_by=user.id)
session.add(result)
session.flush()
session.commit()
result = session.query(Device).filter_by(imei=msg.get("imei")).first()
if result:
watch_id = result.id
if msg.get("request"):
msg.get("request").update({ "watch": watch_id })
result = Request(**msg.get("request"))
session.add(result)
session.flush()
session.commit()
if msg.get("system"):
msg.get("system").update({ "watch": watch_id })
systemResource.post(msg.get("system"))
if msg.get("lvgl"):
msg.get("lvgl").update({ "watch": watch_id })
lvglResource.post(msg.get("lvgl"))
if msg.get("evm"):
msg.get("evm").update({ "watch": watch_id })
evmResource.post(msg.get("evm"))
if msg.get("image"):
imageResource.post_array(msg.get("image"), watch_id)
def get_watch_list():
result = session.query(Device).all()
tmp = []
for item in result:
tmp.append({
'id': item.id,
'imei': item.imei
})
return tmp
def evm_data(watch, start, end):
filters = [Evm.watch==watch]
if start:
filters.append(Evm.timestamp >= start)
if end:
filters.append(Evm.timestamp <= end)
result = session.query(Evm).filter(*filters).order_by(Evm.timestamp).all()
temp = []
for item in result:
t = item.to_dict()
if t.get("timestamp"):
t.update({ 'timestamp': t.get("timestamp").strftime("%Y-%m-%d %H:%M:%S") })
temp.append(t)
return temp
def lvgl_data(watch, start, end):
filters = [Lvgl.watch==watch]
if start:
filters.append(Lvgl.timestamp>=start)
if end:
filters.append(Lvgl.timestamp<=end)
result = session.query(Lvgl).filter(*filters).order_by(Lvgl.timestamp).all()
temp = []
for item in result:
t = item.to_dict()
if t.get("timestamp"):
t.update({ 'timestamp': t.get("timestamp").strftime("%Y-%m-%d %H:%M:%S") })
temp.append(t)
return temp
def image_data(watch, start, end):
filters = [Image.watch==watch]
if start:
filters.append(Image.timestamp>=start)
if end:
filters.append(Image.timestamp<=end)
result = session.query(Image).filter(*filters).order_by(Image.timestamp).all()
temp = []
for item in result:
t = item.to_dict()
if t.get("timestamp"):
t.update({ 'timestamp': t.get("timestamp").strftime("%Y-%m-%d %H:%M:%S") })
temp.append(t)
return temp
def get_monitor_list(watch, category, start, end):
# 判断watch是否存在
w = session.query(Device).filter(Device.id==watch).first()
if not w:
return []
if category == "system":
return []
elif category == "image":
return image_data(watch, start, end)
elif category == "lvgl":
return lvgl_data(watch, start, end)
elif category == "evm":
return evm_data(watch, start, end)
else:
return {
'evm': evm_data(watch, start, end),
'lvgl': lvgl_data(watch, start, end),
'image': image_data(watch, start, end)
}
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import json
import logging
import traceback
import tempfile
import base64
from hashlib import md5 as fmd5
from werkzeug.security import check_password_hash
logger = logging.getLogger(__name__)
FileStoragePath = os.getcwd()
# 判断目录是否存在,不存在则创建
# if not os.path.exists(os.path.join(FileStoragePath, config.get("UPLOAD_DIR"))):
# os.makedirs(os.path.join(FileStoragePath, config.get("UPLOAD_DIR")))
def ajaxCheckAccess(path):
realpath = os.path.realpath(path)
if not realpath.startswith(FileStoragePath):
return False
return True
def checkPath(path):
if not path:
return False, {"code": -1, "data": None, "message": "[%s] arg missed!" % path}
fpath = os.path.abspath(os.sep.join(
[os.path.abspath(FileStoragePath), path]))
if not ajaxCheckAccess(fpath):
return False, {"code": -1, "data": None, "message": "You have no access to [%s]!" % fpath}
if not os.path.exists(fpath):
return False, {"code": -1, "data": None, "message": "[%s] is not existed!" % fpath}
return True, os.path.abspath(fpath)
def saveToFile(saveFile, content):
try:
tfn = tempfile.mktemp()
tf = open(tfn, 'w+b')
tf.write(content)
tf.close()
os.rename(tfn, saveFile)
return True
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return False
def getFileInfo(infofile):
info = dict()
info.update({
"isfile": os.path.isfile(infofile),
"isdir": os.path.isdir(infofile),
"size": os.path.getsize(infofile),
"atime": os.path.getatime(infofile),
"mtime": os.path.getmtime(infofile),
"ctime": os.path.getctime(infofile),
"name": os.path.basename(infofile)
})
return info
class UploadManager(object):
def __init__(self):
super(UploadManager, self).__init__()
def download(self, data):
obj = json.loads(data)
isAccessed, path = checkPath(obj["path"])
if not isAccessed:
return {"code": -1, "data": None, "message": "invaild access"}
if not os.path.isfile(path):
return {"code": -1, "data": None, "message": "Path [%s] is not a valid file!" % path}
try:
with open(path, "rb") as f:
content = base64.b64encode(f.read())
md5code = fmd5(content).hexdigest()
return {
"data": {
"content": content,
"md5": md5code,
"filename": os.path.basename(path)
},
"code": 0,
"message": "download file [%s] successfully!" % obj['path']
}
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return {
"data": None,
"code": -1,
"message": "upload file [%s] failed!\n %s" % (obj['path'], repr(e))
}
def delete(self, data):
try:
isAccessed, path = checkPath(data["path"])
if not isAccessed:
return {"code": -1, "data": None, "message": "invaild access"}
if os.path.isfile(path):
os.remove(path)
return {"code": 0, "data": None, "message": "delete file [%s] successfully!" % path}
elif os.path.isdir(path):
os.rmdir(path)
return {"code": 0, "data": None, "message": "delete dir [%s] successfully!" % path}
else:
return {"code": 0, "data": None, "message": "Path [%s] is not a valid file or path!" % path}
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return {"code": -1, "data": None, "message": repr(e)}
def dirlist(self, data):
obj = json.loads(data)
isAccessed, path = checkPath(obj["path"])
if not isAccessed:
return {"code": -1, "data": None, "message": "invaild access"}
result = []
for p in os.listdir(path):
result.append(getFileInfo(os.path.join(FileStoragePath, p)))
return {"code": 0, "result": result, "message": "Get [%s] successfully!" % path}
def filemd5(self, data):
obj = json.loads(data)
isAccessed, path = checkPath(obj["path"])
if not isAccessed:
return {"code": -1, "data": None, "message": "invaild access"}
if not os.path.isfile(path):
return {"code": -1, "data": None, "message": "Path [%s] is not a valid file!" % path}
with open(path, "rb") as f:
filemd5 = fmd5(f.read()).hexdigest()
return {"code": 0, "result": filemd5, "message": "Get md5 of [%s] successfully!" % path}
def fileinfo(self, data):
obj = json.loads(data)
isAccessed, path = checkPath(obj["path"])
if not isAccessed:
return {"code": -1, "data": None, "message": "invaild access"}
if not os.path.isfile(path):
return {"code": -1, "data": None, "message": "Path [%s] is not a valid file!" % path}
return {"code": 0, "result": getFileInfo(path), "message": "Get md5 of [%s] successfully!" % path}
uploadManager = UploadManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import logging
import copy
from datetime import datetime
from pony.orm import *
from model import fullStackDB
from model.user import User
from utils import md5_salt
logger = logging.getLogger(__name__)
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, uuid, data):
'''
添加用户
'''
# 判断账号是否存在
isExists = select(u for u in User if u.account == data['account'] and u.is_delete == False).exists()
if isExists:
return False, "user already exists"
editor = User.get(id=uuid)
if not editor:
return False, "current user is not exists"
if "username" not in data or not data.get("username"):
data.update({ "username": data.get("account") })
# 密码加密
data['password'] = md5_salt(data['password'])
data.update({
"create_by": editor.id,
"create_at": datetime.now(),
"update_by": editor.id,
"update_at": datetime.now()
})
# 添加用户时,是否考虑将该用户的过期时间加入预警
result = fullStackDB.add(User, **data)
return result, "add user {}.".format("success" if result else "fail")
def delete(self, uuid):
'''
删除用户
'''
with db_session:
editor = User.get(uuid=uuid)
if not editor:
return False, "current user is not exists"
result = User.get(uuid=uuid)
if result:
result.delete()
commit()
result = True
return result, "delete user {}.".format("success" if result else "fail")
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."
with db_session:
# 查询请求者是否存在
editor = User.get(uuid=uuid)
if not editor:
return False, "current user is not exists"
if "password" in data:
data["password"] = md5_salt(data['password'])
user = User.get(uuid=uuid)
if user:
user.set(update_at=datetime.now(), update_by=editor.id, **data)
result = user.to_dict(only=["account", "gender", "birthday", "phone", "email",])
if result.get("birthday"):
result.update({ "birthday": result.get("birthday").strftime("%Y-%m-%d") })
return result, "update user success"
else:
return None, "user does not exists"
def get(self, user):
'''
查询单用户
'''
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({
"create_at": result.create_at.strftime("%Y-%m-%d %H:%M:%S") if result.create_at else None,
"update_at": result.update_at.strftime("%Y-%m-%d %H:%M:%S") if result.update_at else None,
})
result = temp
return result, "get user {}.".format("success" if result else "not found")
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 = User.select().where(**temp).order_by(desc(User.create_at))
temp = []
for item in result:
t = item.to_dict(only=["id", "uuid", "username", "account"])
temp.append(t)
return temp, len(temp), "get select {}.".format("success" if temp else "no data")
result = User.select().where(**temp).order_by(desc(User.create_at)).page(data.get("pagenum", 1), data.get("pagesize", 10))
count = User.select().where(**temp).count()
if result and len(result):
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, only=["uuid", "username", "account", "phone", "email", "gender", "create_at", "update_at", "remarks"])
t.update({
"email": "" if item.email == "user@example.com" else item.email,
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S"),
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S"),
})
temp.append(t)
result = temp
return result, count, "get users {}.".format("success" if result else "no data")
userManager = UserManager()
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 14:46:22
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\backend\deploy.py
'''
import os
import json
import shutil
import configparser
from datetime import datetime
from operator import itemgetter
# 应用和数据分离
# 数据库文件备份在evm_app_store_files/epkdb
# 探测文件变化,定时备份到 epkdb
config = configparser.ConfigParser()
config.read(os.path.join(os.getcwd(), "config.ini"))
# 根据文件最后修改时间排序文件
def getSortDir(path):
lists = os.listdir(path)
print(lists)
lists.sort(key=lambda fn: os.path.getmtime(os.sep.join([path, fn])))
filepath = os.path.join(path, lists[-1])
print(filepath)
return lists
def isFileChange(dt):
f = os.sep.join([os.getcwd(), config.get("database", "filename")])
if dt:
return dt != int(os.path.getmtime(f))
else:
return int(os.path.getctime(f)) != int(os.path.getmtime(f))
def backupDatabase():
src = config.get("database", "filename")
dst = os.path.abspath(config.get("uploads", "upload_path"))
dst = os.path.normpath(os.sep.join([dst, config.get("uploads", "db_dir")]))
if not os.path.exists(dst):
os.makedirs(dst)
# 判断文件创建时间和修改时间是否一致,不一致则备份
shutil.copy(src, dst)
src = os.sep.join([dst, src])
dst = os.sep.join([dst, f"{datetime.now().strftime('%Y%m%d%H%M%S')}-{config.get('database', 'filename')}"])
os.rename(src, dst)
def removeExpiredFiles():
path = os.path.abspath(config.get("uploads", "upload_path"))
path = os.path.normpath(os.sep.join([path, config.get("uploads", "db_dir")]))
if not os.path.exists(path):
os.makedirs(path)
file_count = len(os.listdir(path))
if file_count > 10:
file_list = getSortDir(path)[:-10]
for f in file_list:
os.remove(os.sep.join([path, f]))
def getModifyTime():
result = {}
with open("./backupData.json", "r+") as f:
result = json.loads(f.read())
return result
def saveMofidyTime(result):
db = config.get("database", "filename")
result["lastModifyDateTime"] = int(os.path.getmtime(db))
with open("./backupData.json", "w+") as f:
f.write(json.dumps(result))
return result
def main():
removeExpiredFiles()
result = getModifyTime()
if isFileChange(result["lastModifyDateTime"]):
saveMofidyTime(result)
backupDatabase()
if __name__ == "__main__":
main()
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import logging
import traceback
from datetime import datetime, timedelta
from functools import wraps
import jwt
from flask import current_app, request
logger = logging.getLogger(__name__)
class Auth(object):
def __init__(self):
super(Auth, self).__init__()
@staticmethod
def auth_required(func):
'''
api接口的登录鉴权装饰器
包括cookie和jwt_token鉴权
'''
@wraps(func)
def inner(*args, **kwargs):
if current_app.config.get('LOGIN_DISABLED'):
return func(*args, **kwargs)
auth = Auth()
isSuccess, message = auth.identify(request)
if isSuccess:
return func(*args, **kwargs)
return current_app.unauthorized(message)
return inner
@staticmethod
def encode_auth_token(user_id, username, uuid):
"""
生成认证Token
:param user_id: int
:param username: str
:return: bytes
"""
payload = {
'iat': datetime.now(),
'exp': datetime.now() + timedelta(hours=2), # 两个小时后过期
'iss': 'bytecode', # token签发者
'aud': 'bytecode', # token接收者
'sub': user_id, # token所属者
'data': { # payload
'id': user_id,
'uuid': uuid,
'username': username
}
}
token = jwt.encode(payload, current_app.config['SECRET_KEY'], algorithm='HS256')
if isinstance(token, bytes): # dict 转成json传输时, value中为byte类型会报错
token = str(token, 'utf8')
return token
@staticmethod
def decode_auth_token(auth_token):
"""
验证Token
:param auth_token:
:return: dict|string
"""
try:
# result = re.match(r'[+-/*\w]+\.[+-/*\w]+\.[+/*-\w]+', auth_token, re.I)
# if not result or not result.group():
# return False, "token invaild"
payload = jwt.decode(auth_token, current_app.config['SECRET_KEY'], verify=True, algorithms=['HS256'], options={'require': ['exp', 'iss', 'sub', 'aud', 'iat', 'data']}, audience="bytecode")
if payload:
return True, payload
else:
return False, "payload invaild"
# except jwt.ExpiredSignatureError:
# return 'token expire'
# except jwt.InvalidTokenError:
# return 'token invaild'
except Exception as e:
traceback.print_exc()
return False, str(e)
def identify(self, request):
"""
用户鉴权
:param request: flask的requst全局对象
:return: bool
"""
try:
auth_token = request.headers.get('Authorization')
if auth_token:
isSuccess, result = self.decode_auth_token(auth_token)
print(result)
if isSuccess:
if "data" in result and "id" in result["data"] and "username" in result["data"]:
setattr(request, 'current_user', result['data'])
return True, result['data']
return False, "data invaild"
else:
return False, result
return False, "authorization token can not be none"
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return False, str(e)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, LongStr
from app import config
from . import fullStackDB
db = fullStackDB.db
class Annex(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "annex"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
app = Optional("Apps", reverse="app_annex")
title = Required(str, max_len=200) # 文件名
path = Required(LongStr) # 文件路径
type = Required(int, default=0) # 文件类型 PNG/JPG/GIF/MP3/MP4/DOCX/XLSX/PPT/PDF...
size = Required(float, default=0) # 文件大小
create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse="annex_creator") # Annex与User一对一关系
update_at = Required(datetime, default=datetime.now)
update_by = Required("User", reverse="annex_updater") # Annex与User一对一关系
delete_at = Optional(datetime)
delete_by = Optional("User", reverse="annex_deleter") # Annex与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
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Json
from app import config
from . import fullStackDB
db = fullStackDB.db
class AppLogs(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "app_logs"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
app_name = Optional(str)
app_path = Optional(str, default="")
app_version = Optional(str, default="")
app_info = Optional(Json, default={})
create_at = Required(datetime, default=datetime.now)
create_by = Optional("User", reverse='app_logs_creater')
sort = Optional(int, size=32, default=0)
remarks = Optional(str, max_len=255, default="", nullable=True)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
db = fullStackDB.db
# 当前用户拥有哪些APP
class AppUser(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "app_user"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
app = Required("Apps", reverse="app_user")
device = Required("Device", reverse="app_user")
create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='app_users_creator')
update_at = Required(datetime, default=datetime.now)
update_by = Required("User", reverse='app_users_updater')
delete_at = Optional(datetime)
delete_by = Optional("User", reverse='app_users_deleter')
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
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set
from app import config
from . import fullStackDB
# ********************************
from .app_users import AppUser
# ********************************
db = fullStackDB.db
class Apps(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "apps"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
app_name = Required(str, max_len=200)
app_version = Optional(str, default="")
app_url = Optional(str, default="")
category = Optional(str, default="")
app_icon = Optional(str)
app_desc = Optional(str, default="")
app_annex = Set("Annex", reverse="app", cascade_delete=True)
app_user = Optional("AppUser", reverse="app", cascade_delete=True)
app_build_log = Optional("BuildLogs", reverse="app", cascade_delete=True)
app_download = Set("AppDownload", reverse="app", cascade_delete=True)
create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='apps_creator') # BuildLogs与User一对一关系
update_at = Required(datetime, default=datetime.now)
update_by = Required("User", reverse='apps_updater') # BuildLogs与User一对一关系
delete_at = Optional(datetime)
delete_by = Optional("User", reverse='apps_deleter') # BuildLogs与User一对一关系
is_delete = Required(bool, default=False)
sort = Optional(int, size=32, default=0)
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Json
from app import config
from . import fullStackDB
db = fullStackDB.db
class BuildLogs(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "build_logs"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
app = Required("Apps", reverse="app_build_log")
app_path = Optional(str, default="")
app_info = Optional(Json, default={})
source = Optional(int, default=0) # 打包来源 1管理中心 2后端接口
create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='build_logs_creator') # BuildLogs与User一对一关系
update_at = Required(datetime, default=datetime.now)
update_by = Required("User", reverse='build_logs_updater') # BuildLogs与User一对一关系
delete_at = Optional(datetime)
delete_by = Optional("User", reverse='build_logs_deleter') # BuildLogs与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
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set
from app import config
from . import fullStackDB
db = fullStackDB.db
class Device(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "device"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
name = Required(str) # 名称
imei = Required(str) # IMEI
desc = Optional(str) # 描述信息
type = Optional(str) # 设备类型
app_user = Set("AppUser", reverse="device")
create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='device_creator')
update_at = Required(datetime, default=datetime.now)
update_by = Required("User", reverse='device_updater')
delete_at = Optional(datetime)
delete_by = Optional("User", reverse='device_deleter')
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
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
db = fullStackDB.db
class Dict(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "dictionary"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
label = Required(str)
value = Required(str)
category = Required(str)
is_system = Required(bool, default=False) # 能否删除
create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='dict_creator') # Dict与User一对一关系
update_at = Required(datetime, default=datetime.now)
update_by = Required("User", reverse='dict_updater') # Dict与User一对一关系
delete_at = Optional(datetime)
delete_by = Optional("User", reverse='dict_deleter') # Dict与User一对一关系
is_delete = Required(bool, default=False)
sort = Optional(int, size=32, default=0)
remarks = Optional(str, max_len=255, default="", nullable=True)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
db = fullStackDB.db
class AppDownload(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "download"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
app = Optional("Apps", reverse="app_download")
imei = Required(str)
ip = Optional(str)
address = Optional(str)
download_at = Required(datetime, default=datetime.now)
is_delete = Required(bool, default=False)
sort = Optional(int, size=32, default=0)
remarks = Optional(str, max_len=255, default="", nullable=True)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
db = fullStackDB.db
class LoginLogs(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "login_logs"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
username = Optional(str)
ip = Optional(str)
address = Optional(str)
create_at = Required(datetime, default=datetime.now)
create_by = Optional("User", reverse='login_logs_creater')
sort = Optional(int, size=32, default=0)
remarks = Optional(str, default="", nullable=True)
#!/usr/bin/env python
# -*- 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, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, class_mapper
engine = create_engine('sqlite:///{}?check_same_thread=False'.format(config.get("DATABASE")), echo=False)
Base = declarative_base()
def get_current_datetime():
return datetime.now()
def gen_id():
return uuid.uuid4().hex
def object_to_dict(obj):
columns = [column.key for column in class_mapper(obj.__class__).columns]
get_key_value = lambda c: (c, getattr(obj, c).isoformat()) if isinstance(getattr(obj, c), datetime) else (c, getattr(obj, c))
return dict(map(get_key_value, columns))
class WatchTest(Base):
__tablename__ = 'monitor_watch_test'
id = Column(Integer, primary_key=True, autoincrement=True)
imei = Column(String)
create_at = Column(DateTime(timezone=True), default=get_current_datetime, server_default=func.now(), onupdate=func.now())
class Watch(Base):
__tablename__ = 'monitor_watch'
id = Column(Integer, primary_key=True, autoincrement=True)
imei = Column(String)
create_at = Column(DateTime(timezone=True), default=get_current_datetime, server_default=func.now(), onupdate=func.now())
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
class Request(Base):
__tablename__ = 'monitor_request'
id = Column(Integer, primary_key=True, autoincrement=True)
watch = Column(Integer) # 手表ID
host = Column(String)
path = Column(String)
protocol = Column(String)
create_at = Column(DateTime(timezone=True), default=get_current_datetime, server_default=func.now(), onupdate=func.now())
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
class System(Base):
__tablename__ = 'monitor_system'
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())
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
class Lvgl(Base):
__tablename__ = 'monitor_lvgl'
id = Column(Integer, primary_key=True, autoincrement=True)
watch = Column(Integer) # 手表ID
total_size = Column(Integer) # 单位:字节
free_cnt = Column(Integer)
free_size = Column(Integer)
free_biggest_size = Column(Integer)
used_cnt = Column(Integer)
used_pct = Column(Integer)
frag_pct = Column(Integer)
timestamp = Column(DateTime(timezone=True), default=get_current_datetime, server_default=func.now(), onupdate=func.now())
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
class Evm(Base):
__tablename__ = 'monitor_evm'
id = Column(Integer, primary_key=True, autoincrement=True)
watch = Column(Integer) # 手表ID
# total_size = Column(Integer) # 单位:字节
# free_size = Column(Integer)
# gc_usage = Column(Integer)
heap_map_size = Column(Integer)
heap_total_size = Column(Integer)
heap_used_size = Column(Integer)
stack_total_size = Column(Integer)
stack_used_size = Column(Integer)
timestamp = Column(DateTime(timezone=True), default=get_current_datetime, server_default=func.now(), onupdate=func.now())
def to_dict(self):
# def convert_datetime(value):
# if value:
# return value.strftime("%Y-%m-%d %H:%M:%S")
# else:
# return ""
# for col in self.__table__.columns:
# if isinstance(col.type, DateTime):
# value = convert_datetime(getattr(self, col.name))
# elif isinstance(col.type, Numeric):
# value = float(getattr(self, col.name))
# else:
# value = getattr(self, col.name)
# yield {col.name: value}
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
def to_json(self):
d = dict(self.__todict__())
return json.dumps(d)
class Image(Base):
__tablename__ = 'monitor_image'
id = Column(Integer, primary_key=True, autoincrement=True)
watch = Column(Integer) # 手表ID
uri = Column(String(50))
length = Column(Integer)
png_uncompressed_size = Column(Integer)
png_total_count = Column(Integer)
png_file_size = Column(Integer)
timestamp = Column(DateTime(timezone=True), default=get_current_datetime, server_default=func.now(), onupdate=func.now())
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=gen_id, index=True)
account = Column(String(256))
class Device(Base):
__tablename__ = "{}".format(config['TABLE_PREFIX']) + "device"
id = Column(Integer, primary_key=True, autoincrement=True)
uuid = Column(String(64), default=gen_id, index=True)
name = Column(String, default="")
imei = Column(String)
desc = Column(String, default="")
type = Column(String, default="watch")
create_at = Column(DateTime(timezone=True), default=get_current_datetime, onupdate=func.now())
create_by = Column(Integer, default=None, nullable=True)
update_at = Column(DateTime(timezone=True), default=get_current_datetime, onupdate=func.now())
update_by = Column(Integer, default=None)
delete_at = Column(DateTime(timezone=True), default=get_current_datetime, onupdate=func.now())
delete_by = Column(Integer, default=None)
is_delete = Column(Boolean, default=False)
sort = Column(Integer, default=1)
remarks = Column(String, default="")
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
Base.metadata.create_all(engine, checkfirst=True)
# engine是2.2中创建的连接
Session = sessionmaker(bind=engine)
# 创建Session类实例
session = Session()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime, date
from pony.orm import PrimaryKey, Required, Optional, Set
from app import config
from . import fullStackDB
db = fullStackDB.db
class User(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "user"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
role = Required(str, default="community") # 角色,管理员[administrator]、企业用户[enterprise]、社区用户[community]
account = Required(str, unique=True) # 账号
username = Required(str, max_len=100) # 用户名
password = Required(str, max_len=64) # 密码
gender = Optional(int, size=8, default=1) # 性别,未知0 男1 女2
birthday = Optional(date, default=date.today()) # 使用age会带来age无法随时间变化问题
phone = Optional(str, max_len=11, default="") # 联系方式
email = Optional(str, max_len=100, default="") # 邮箱
create_at = Required(datetime, default=datetime.now)
create_by = Required(int)
update_at = Required(datetime, default=datetime.now)
update_by = Required(int)
delete_at = Optional(datetime)
delete_by = Optional(int)
is_delete = Required(bool, default=False)
sort = Optional(int, size=32, default=0)
remarks = Optional(str, max_len=255, default="", nullable=True)
app_logs_creater = Set('AppLogs', reverse='create_by')
login_logs_creater = Set('LoginLogs', reverse='create_by')
annex_creator = Set('Annex', reverse='create_by')
annex_updater = Set('Annex', reverse='update_by')
annex_deleter = Set('Annex', reverse='delete_by')
apps_creator = Set('Apps', reverse='create_by')
apps_updater = Set('Apps', reverse='update_by')
apps_deleter = Set('Apps', reverse='delete_by')
app_users_creator = Set('AppUser', reverse='create_by')
app_users_updater = Set('AppUser', reverse='update_by')
app_users_deleter = Set('AppUser', reverse='delete_by')
build_logs_creator = Set('BuildLogs', reverse='create_by')
build_logs_updater = Set('BuildLogs', reverse='update_by')
build_logs_deleter = Set('BuildLogs', reverse='delete_by')
device_creator = Set('Device', reverse='create_by')
device_updater = Set('Device', reverse='update_by')
device_deleter = Set('Device', reverse='delete_by')
This source diff could not be displayed because it is too large. You can view the blob instead.
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-14 21:37:53
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\start.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import sys
import os
import signal
# 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 view import app
from view.monitor import DeviceMessageHandler, NotifyHandler, WatchHandler
from app import config
class GracefulExit(SystemExit):
code = 1
class VueHandler(RequestHandler):
def get(self):
self.write(json.dumps({ 'code': 200, 'msg': 'success', 'data': self.request.remote_ip }))
def raise_graceful_exit(*args):
IOLoop.current().stop()
print("Gracefully shutdown", args)
raise GracefulExit()
def start():
settings = {
'debug': config['DEBUG'],
# 'template_path': config['TEMPLATE_PATH'],
# 'static_path': config['STATIC_PATH'],
'static_url_path': '',
}
watch(os.sep.join([os.getcwd(), "restart.json"]))
wsgi_app = WSGIContainer(app)
application = Application([
(r'/', VueHandler),
(r"/api/v1/evm_store/monitor", DeviceMessageHandler),
(r"/api/v1/evm_store/watch", WatchHandler),
(r"/ws/v1/notify", NotifyHandler),
(r'.*', FallbackHandler, dict(fallback=wsgi_app))
], **settings)
if len(sys.argv) == 2:
port = int(sys.argv[1])
application.listen(port, address=config['HOST'], xheaders=True)
else:
port = config['PORT']
application.listen(port, address=config['HOST'], xheaders=True)
print(config['LOGO'])
print("server running at %s:%d" % (config['HOST'], port))
# 主进程退出信号
signal.signal(signal.SIGINT, raise_graceful_exit)
signal.signal(signal.SIGTERM, raise_graceful_exit)
# instance = tornado.ioloop.IOLoop.instance()
# tornado.autoreload.start(instance)
# instance.start()
IOLoop.instance().start()
if __name__ == '__main__':
start()
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import shutil
import time
import re
import os
import json
import functools
import hashlib
import random
import string
import datetime
import threading
import decimal
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return float(o)
super(DecimalEncoder, self).default(o)
class ObjectDict(dict):
"""Makes a dictionary behave like an object, with attribute-style access.
"""
def __getattr__(self, name):
try:
return self[name]
except KeyError:
raise AttributeError(name)
def __setattr__(self, name, value):
self[name] = value
def ThreadMaker(f):
def runner(*args, **argv):
t = threading.Thread(target=f, args=args, kwargs=argv)
t.start()
return t
return runner
def copytree(src, dst, symlinks=False, ignore=None):
names = os.listdir(src)
if ignore is not None:
ignored_names = ignore
else:
ignored_names = set()
if not os.path.exists(dst):
os.makedirs(dst)
errors = []
for name in names:
if name in ignored_names:
continue
if re.match(r'.*?.pyc$', name):
continue
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
try:
if symlinks and os.path.islink(srcname):
linkto = os.readlink(srcname)
os.symlink(linkto, dstname)
elif os.path.isdir(srcname):
copytree(srcname, dstname, symlinks, ignore)
else:
shutil.copy2(srcname, dstname)
# XXX What about devices, sockets etc.?
except (IOError, os.error) as why:
errors.append((srcname, dstname, str(why)))
# catch the Error from the recursive copytree so that we can
# continue with other files
except Exception as e:
errors.extend(e.args[0])
try:
shutil.copystat(src, dst)
except WindowsError:
# can't copy file access times on Windows
pass
except OSError as why:
errors.extend((src, dst, str(why)))
if errors:
raise Exception(errors)
def timing(f):
@functools.wraps(f)
def inner(*args, **kwargs):
startTime = time.time()
f(*args, **kwargs)
print("[function]: %s [finished in]: %fs" %
(f.__name__, time.time()-startTime))
return inner
def timeToSeconds(t, sep=":"):
if t == "":
t = "0:0:0"
ts = [int(i) for i in t.split(sep)]
return ts[0] * 60 * 60 + ts[1] * 60 + ts[2]
def secondsToTime(seconds, sep=":"):
h = seconds / 3600
m = seconds % 3600 / 60
s = (seconds - h * 3600 - m * 60) % 60
return sep.join([str(i) for i in [h, m, s]])
def md5_salt(s):
md5 = hashlib.md5("EhuqUkwV".encode("utf-8"))
md5.update(s.encode('utf-8'))
return md5.hexdigest()
def filter_dict(source: dict, rules_list: list):
# 如果source中的词典数量过多,请使用itertools模块的ifilter。 它会返回一个迭代器,而不是立即用整个列表填充系统的内存
result = dict()
# res = [d for d in source.keys() if d in rules_list]
# res = list(filter(lambda d: d in rules_list, source.keys()))
for k in source.keys():
if k in rules_list:
result.update(k, source[k])
return result
def sql_filter(sql):
return re.sub(r"[\"\\/*\'=\-#;<>+%$()!@]", "", sql)
def random_string(length=32):
return ''.join(random.sample(string.ascii_letters + string.digits, length))
def get_days_before_datetime(dt, dayAgo):
if not isinstance(dt, datetime.datetime):
dt = datetime.datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")
# 先获得时间数组格式的日期
dayAgo = (dt - datetime.timedelta(days = dayAgo))
# 转换为其他字符串格式
return dayAgo.strftime("%Y-%m-%d %H:%M:%S")
if __name__ == "__main__":
print(os.path.abspath(__file__))
print(random_string(7))
\ No newline at end of file
'''
Author: your name
Date: 2021-04-29 12:12:01
LastEditTime: 2021-07-14 21:26:39
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\backend\utils\ccode.py
'''
# -*- coding: utf-8 -*-
import sys
header = \
u'''
/****************************************************************************
**
** Copyright (C) 2021 @scriptiot
**
** EVM是一款通用化设计的虚拟机引擎,拥有语法解析前端接口、编译器、虚拟机和虚拟机扩展接口框架。
** 支持js、python、qml、lua等多种脚本语言,纯C开发,零依赖,支持主流 ROM > 50KB, RAM > 2KB的MCU;
** 自带垃圾回收(GC)先进的内存管理,采用最复杂的压缩算法,无内存碎片(大部分解释器都存在内存碎片)
** Version : 3.0
** Email : scriptiot@aliyun.com
** Website : https://github.com/scriptiot
** Licence: MIT Licence
****************************************************************************/
'''
def cstr_encode(text, splitLines=True, escapePercent=False):
output = "\""
count = len(text)
for i in range(count):
if text[i] == '\f':
output += "\\f"
elif text[i] == '\n':
if splitLines:
output += "\\n\"\n\""
else:
output += "\\n";
elif text[i] == '\r':
output += "\\r"
elif text[i] == '\t':
output += "\\t"
elif text[i] == '\"':
output += "\\\""
elif text[i] == '\\':
output += "\\\\"
elif text[i] == '%':
if escapePercent:
output += "%%"
else:
output += "%"
else:
output += text[i]
output += "\""
return output
def convert(fpath):
with open(fpath, "r") as f:
content = f.read()
ret = cstr_encode(content)
ccode = "%s\nconst char * appjs_content=\\\n%s;" % (header, ret)
with open("appjs.c", "w", encoding="utf-8") as f:
f.write(ccode)
return ccode
def convert_string(string):
return "%s\nconst char * appjs_content=\\\n%s;" % (header, cstr_encode(string))
if __name__ == '__main__':
ret = convert(sys.argv[1])
print(ret)
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-03 11:43:10
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\view\__init__.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import logging
import traceback
from flask import Flask, Response, jsonify
from flask_cors import CORS
from werkzeug.exceptions import HTTPException, InternalServerError
from .api import api
from .files import file_api
from .login import login_api
from .user import user_api
from .apps import apps_api
from .device import device_api
from .download import download_api
from .app_logs import appLogs_api
from model import fullStackDB
from fullstack.response import ResponseCode, response_result
from app import config
logger = logging.getLogger(__name__)
class JsonResponse(Response):
@classmethod
def force_type(cls, response, environ=None):
if isinstance(response, (list, dict)):
response = jsonify(response)
return super(cls, Response).force_type(response, environ)
class FlaskAPP(Flask):
response_class = JsonResponse
def unauthorized(self, message):
return response_result(ResponseCode.AUTHORIZATION_ERROR, msg=message)
def create_app():
app = FlaskAPP(__name__)
app.register_blueprint(api)
app.register_blueprint(login_api)
app.register_blueprint(file_api)
app.register_blueprint(user_api)
app.register_blueprint(apps_api)
app.register_blueprint(download_api)
app.register_blueprint(device_api)
app.register_blueprint(appLogs_api)
@app.errorhandler(InternalServerError)
def handle_500(e):
logger.error(str(e))
traceback.print_exc()
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@app.errorhandler(HTTPException)
def handle_http_exception(e):
logger.error(str(e))
traceback.print_exc()
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@app.errorhandler(Exception)
def handle_exception(e):
logger.error(str(e))
traceback.print_exc()
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
CORS(app, supports_credentials=True, origins='*')
app.config.update(config)
fullStackDB(app, drop_tables=[])
return app
app = create_app()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import json
import logging
import traceback
import uuid
import time
import sqlite3
from datetime import datetime
from flask import Blueprint, request, json
from werkzeug.utils import secure_filename
from app import config, signalManager
from fullstack.login import Auth
from fullstack.response import ResponseCode, response_result
from fullstack.validation import validate_schema
from schema.api import UpdatePasswordSchema, ApplicationBuildSchema, ConvertString
logger = logging.getLogger(__name__)
api = Blueprint("api", __name__, url_prefix="/api/v1/%s" % config['NAME'])
def stopApp():
fpath = os.sep.join([os.getcwd(), "restart.json"])
with open(fpath, "w+") as f:
ret = json.loads(f.read())
ret["count"] = ret["count"] + 1
f.write(json.dumps(ret, indent=4))
return ret
@api.route("/evm", methods=['GET','POST'])
def hello_evm():
def check(p):
if hasattr(request, p):
return getattr(request, p)
else:
return None
print(request.method)
print(request.headers)
print(request.data)
print(request.stream.read())
print(request.get_data())
if request.method == "GET":
result = { "args": request.args }
else:
result = {
'args': check('args'),
'json': check('json'),
'data': check('values'),
'form': check('form')
}
return json.dumps(result)
@api.route("/store", methods=['GET', 'POST'])
def get_store():
result = {}
with open("./apiData.json", "r", encoding="utf-8") as f:
result = json.loads(f.read())
logger.info(request.args)
# logger.info(request.query_string)
if request.args and request.args.get("category"):
res = []
for item in result.get("appList", []):
if item.get("category") == request.args.get("category"):
res.append(item)
result["appList"] = res
result = {
'appList': result["appList"],
'categoryList': result["categoryList"]
}
return response_result(ResponseCode.OK, data=result)
@api.route("/store/app/<uuid>", methods=['GET', 'POST'])
def get_store_app(uuid):
logger.info(uuid)
result = {}
with open("./apiData.json", "r", encoding="utf-8") as f:
result = json.loads(f.read())
res = {}
for item in result.get("appList", []):
if item.get("uuid") == uuid:
res = item
break
return response_result(ResponseCode.OK, data=res)
@api.route("/store/appInfo/<uuid>", methods=['GET', 'POST'])
def get_app_info(uuid):
result = {}
with open("./apiData.json", "r", encoding="utf-8") as f:
result = json.loads(f.read())
res = None
for item in result.get("downloadList", []):
if item.get("apkId") == uuid:
res = item
break
print(res)
return response_result(ResponseCode.OK, data=res)
@api.route("/store/downloadEpk/<uuid>", methods=['GET', 'POST'])
def download_epk(uuid):
# 这里要做一些业务处理,根据应用ID和版本号,判断是否有新的应用更新
result = {}
with open("./apiData.json", "r", encoding="utf-8") as f:
result = json.loads(f.read())
res = {}
for item in result.get("downloadList", []):
if item.get("apkId") == uuid:
res.update(item)
break
res.update({
'status': 0,
'time': int(time.time())
})
print(res)
return response_result(ResponseCode.OK, data=res)
@api.route("/opqcp", methods=['POST'])
def action_opqcp():
params = request.json
result, message = signalManager.actionOpqcp.emit(params)
print(result)
return response_result(ResponseCode.OK, msg=message)
@api.route("/monitor", methods=['GET', 'POST'])
def action_monitor():
print(request.json)
print(request.data)
print(request.form)
print(type(request.json))
return response_result(ResponseCode.OK)
@api.route("/updatePassword", methods=['POST'])
@validate_schema(UpdatePasswordSchema)
@Auth.auth_required
def update_password():
result, message = signalManager.actionUpdatePassword.emit(request.current_user.get("id"), request.schema_data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
return response_result(ResponseCode.NOTHING_CHANGE, msg=message)
@api.route("/upload", methods=['POST']) # 上传文件
def upload_file():
try:
result = None
binfile = request.files.get("binfile")
if not binfile:
return response_result(ResponseCode.REQUEST_ERROR, msg="upload field name error")
obj = dict()
obj['filename'] = binfile.filename
obj['content'] = binfile.stream.read()
dtNowString = datetime.now().strftime("%Y%m%d%H%M%S%f")
# 文件名构成:文件名_时间日期.文件后缀
filename = os.path.splitext(obj['filename'])[0] + "_{}".format(dtNowString) + os.path.splitext(obj['filename'])[-1]
# 获取相对路径
relative_path = os.sep.join([config.get("TEMP_DIR"), dtNowString])
# 获取最终存储的绝对路径
savePath = os.path.normpath(os.sep.join([config.get("UPLOAD_PATH"), relative_path]))
# 获取最终存储的文件路径
saveFile = os.path.normpath(os.sep.join([savePath, filename]))
if not os.path.exists(savePath):
os.makedirs(savePath)
with open(saveFile, 'wb') as f: # 保存文件
f.write(obj['content'])
result = {
"uuid": str(uuid.uuid4()), # 附件唯一编号
"filename": obj['filename'], # 附件名称
"filesize": os.path.getsize(saveFile), # 附件大小
"filepath": os.sep.join([relative_path, filename]).replace("\\", "/"), # 附件存储路径
}
return response_result(ResponseCode.OK, data=result, msg="upload file [%s] successfully!" % obj['filename'])
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@api.route("/system/updateDatabase", methods=['GET'])
def update_db():
result = []
for index in range(16):
print(index)
result.append(str(uuid.uuid1()))
# conn = sqlite3.connect('./app-store.db')
# cur = conn.cursor()
# update_sql = """update test set name = 'noname' where id = ?"""
# x = (1, )
# cur.execute(update_sql, x)
# # commit()提交事务
# conn.commit()
# # 关闭游标
# cur.close()
# # 关闭连接
# conn.close()
return response_result(ResponseCode.OK, data=result)
@api.route("/system/convertString", methods=['POST'])
@validate_schema(ConvertString)
def convert_string():
result = signalManager.actionGetConvertString.emit(request.schema_data)
return response_result(ResponseCode.OK, data=result)
@api.route("/application/build", methods=["post"])
@validate_schema(ApplicationBuildSchema)
def application_build():
try:
if request.method == 'POST' and 'binfiles' in request.files:
files = []
data = request.schema_data
dt = datetime.now().strftime("%Y%m%d%H%M%S")
upload_path = os.sep.join([config["UPLOAD_PATH"], config["TEMP_DIR"], str(data['access_key']), dt])
if not os.path.exists(upload_path):
os.makedirs(upload_path)
for f in request.files.getlist('binfiles'):
filename = secure_filename(f.filename)
file_path = os.sep.join([upload_path, filename])
f.save(file_path)
files.append(file_path)
result, message = signalManager.actionApplicationBuild.emit(files, data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg="files can not be null")
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 14:45:00
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\backend\view\app_logs.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.app_logs import AddSchema, DeleteSchema, QuerySchema, UpdateSchema
logger = logging.getLogger(__name__)
appLogs_api = Blueprint("appLogs_api", __name__, url_prefix="/api/v1/%s/appLogs" % config['NAME'])
@appLogs_api.route("/add", methods=['POST'])
@validate_schema(AddSchema)
@Auth.auth_required
def add():
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionAddAppLogs.emit(user, 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))
@appLogs_api.route("/delete/<uuid:id>", methods=['POST'])
@validate_schema(DeleteSchema)
@Auth.auth_required
def delete(id):
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionDeleteAppLogs.emit(user, 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)
@appLogs_api.route("/get", methods=["POST"])
@validate_schema(QuerySchema)
@Auth.auth_required
def get():
try:
user = request.current_user.get("id")
result, message = signalManager.actionGetAppLogs.emit(user, 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))
@appLogs_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
def get_list():
try:
user = request.current_user.get("id")
result, count, message = signalManager.actionGetAppLogsList.emit(user, 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)
@appLogs_api.route("/update/<uuid:id>", methods=['POST'])
@validate_schema(UpdateSchema)
@Auth.auth_required
def update(id):
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionUpdateAppLogs.emit(user, 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)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import logging
import traceback
from datetime import datetime
from flask import Blueprint, request
from werkzeug.utils import secure_filename
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.apps import AddSchema, QuerySchema, UpdateSchema
from schema.build_logs import AddSchema as LogAddScheme, QuerySchema as LogQuerySchema
logger = logging.getLogger(__name__)
apps_api = Blueprint("apps_api", __name__, url_prefix="/api/v1/%s/apps" % config['NAME'])
@apps_api.route("/add", methods=['POST'])
@validate_schema(AddSchema)
@Auth.auth_required
def add():
try:
params = request.schema_data
dtNowString = datetime.now().strftime("%Y%m%d%H%M%S")
# 获取相对路径
dirname = "{}-{}-{}-{}".format(params["app_name"], params["app_version"], params["category"], dtNowString)
relative_path = os.sep.join([config.get("EPK_DIR"), dirname])
# 获取最终存储的绝对路径
upload_path = os.path.normpath(os.sep.join([config.get("UPLOAD_PATH"), relative_path]))
if not os.path.exists(upload_path):
os.makedirs(upload_path)
files = []
logo = request.files.get("logo")
if logo:
filename = secure_filename(logo.filename)
file_path = os.sep.join([upload_path, filename])
file_path = os.path.normpath(file_path)
logo.save(file_path)
params.update({ "app_icon": file_path })
fileList = request.files.getlist('fileList')
if fileList:
upload_path = os.sep.join([upload_path, "src"])
if not os.path.exists(upload_path):
os.mkdir(upload_path)
for f in fileList:
filename = secure_filename(f.filename)
file_path = os.sep.join([upload_path, filename])
file_path = os.path.normpath(file_path)
f.save(file_path)
files.append(file_path)
# obj = dict()
# obj['filename'] = binfile.filename
# obj['content'] = binfile.stream.read()
params.update({ "fileList": files, "epk_path": upload_path })
user = request.current_user.get("id")
isSuccess, message = signalManager.actionAddApp.emit(user, params)
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))
@apps_api.route("/delete/<uuid:id>", methods=['POST'])
@Auth.auth_required
def delete(id):
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionDeleteApp.emit(user, 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)
@apps_api.route("/get", methods=["POST"])
@validate_schema(QuerySchema)
@Auth.auth_required
def get():
try:
user = request.current_user.get("id")
result, message = signalManager.actionGetApp.emit(user, 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))
@apps_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
def get_list():
try:
user = request.current_user.get("id")
result, count, message = signalManager.actionGetAppList.emit(user, 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)
@apps_api.route("/update/<uuid:id>", methods=['POST'])
@validate_schema(UpdateSchema)
@Auth.auth_required
def update(id):
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionUpdateApp.emit(user, 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)
@apps_api.route("/build/<uuid:id>", methods=['POST'])
@validate_schema(LogAddScheme)
@Auth.auth_required
def build_app(id):
user = request.current_user.get("id")
result, message = signalManager.actionAddBuildLog.emit(user, id)
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
return response_result(ResponseCode.NOTHING_CHANGE, msg=message)
@apps_api.route("/getBuildApp/<uuid:id>", methods=['POST'])
@Auth.auth_required
def get_build_app(id):
user = request.current_user.get("id")
result, message = signalManager.actionGetBuildLog.emit(user, id)
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
return response_result(ResponseCode.NOTHING_CHANGE, msg=message)
@apps_api.route("/buildLogs", methods=['POST'])
@validate_schema(LogQuerySchema)
@Auth.auth_required
def get_build_logs():
user = request.current_user.get("id")
result, count, message = signalManager.actionGetBuildLogList.emit(user, request.schema_data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message, count=count)
else:
return response_result(ResponseCode.NOTHING_CHANGE, msg=message)
\ No newline at end of file
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 14:44:36
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\backend\view\device.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.device import AddSchema, QuerySchema, UpdateSchema
logger = logging.getLogger(__name__)
device_api = Blueprint("device_api", __name__, url_prefix="/api/v1/%s/device" % config['NAME'])
@device_api.route("/add", methods=['POST'])
@validate_schema(AddSchema)
@Auth.auth_required
def add():
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionAddDevice.emit(user, 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))
@device_api.route("/delete/<uuid:id>", methods=['POST'])
@Auth.auth_required
def delete(id):
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionDeleteDevice.emit(user, 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)
@device_api.route("/get", methods=["POST"])
@validate_schema(QuerySchema)
@Auth.auth_required
def get():
try:
user = request.current_user.get("id")
result, message = signalManager.actionGetDevice.emit(user, 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))
@device_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
def get_list():
try:
user = request.current_user.get("id")
result, count, message = signalManager.actionGetDeviceList.emit(user, 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)
@device_api.route("/update/<uuid:id>", methods=['POST'])
@validate_schema(UpdateSchema)
@Auth.auth_required
def update(id):
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionUpdateDevice.emit(user, 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)
#!/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.download import AddSchema, DeleteSchema, QuerySchema, UpdateSchema, DownloadSchema
logger = logging.getLogger(__name__)
download_api = Blueprint("download_api", __name__, url_prefix="/api/v1/%s/download" % config['NAME'])
@download_api.route("/add", methods=['POST'])
@validate_schema(AddSchema)
@Auth.auth_required
def add():
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionAddDownload.emit(user, 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))
@download_api.route("/delete/<uuid:id>", methods=['POST'])
@validate_schema(DeleteSchema)
@Auth.auth_required
def delete(id):
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionDeleteDownload.emit(user, 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)
@download_api.route("/apps", methods=["POST"])
@validate_schema(DownloadSchema)
def get():
try:
data = request.schema_data
data.update({ 'real_ip': request.headers.get('X-Forwarded-For', '127.0.0.1') })
result, message = signalManager.actionGetDownload.emit(data)
# 读取epk文件,按照格式返回相应结构体数据
logger.info(data)
if result:
ret = result.read_bytes()
# with open(result.as_posix(), "rb") as f:
# ret = f.read()
# logger.info(type(ret))
return ret
return response_result(ResponseCode.SERVER_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@download_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
def get_list():
try:
user = request.current_user.get("id")
result, count, message = signalManager.actionGetDownloadList.emit(user, 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)
@download_api.route("/update/<uuid:id>", methods=['POST'])
@validate_schema(UpdateSchema)
@Auth.auth_required
def update(id):
try:
user = request.current_user.get("id")
isSuccess, message = signalManager.actionUpdateDownload.emit(user, 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)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import traceback
import tempfile
import base64
import logging
from hashlib import md5 as fmd5
from flask import Blueprint, request, json
from app.setting import config
from pony.orm import *
from model.annex import Annex
from model.app_logs import AppLogs
from model.build_logs import BuildLogs
def do_something():
with db_session:
ls = Annex.select()
for item in ls:
if item.path.startswith("/home/projects/evm-store/backend/uploads"):
item.path = item.path.replace("/home/projects/evm-store/backend/uploads", "")
flush()
commit()
ls = AppLogs.select()
for item in ls:
if item.app_path.startswith("/uploads"):
item.app_path = item.app_path.replace("/uploads", "")
flush()
commit()
ls = BuildLogs.select()
for item in ls:
if item.app_path.startswith("/uploads"):
item.app_path = item.app_path.replace("/uploads", "")
flush()
commit()
return True
logger = logging.getLogger(__name__)
file_api = Blueprint("file_api", __name__, url_prefix="/api/v1/file")
FileStoragePath = os.path.join(config.get("UPLOAD_PATH"))
def ajaxCheckAcess(path):
realpath = os.path.realpath(path)
if not realpath.startswith(FileStoragePath):
return False
return True
def checkPath(path):
if not path:
return False, {"code": -1, "data": {}, "message": "[%s] arg missed!" % path}
fpath = os.path.abspath(os.sep.join([os.path.abspath(FileStoragePath), path]))
if not ajaxCheckAcess(fpath):
return False, {"code": -1, "data": {}, "message": "You have no access to [%s]!" % fpath}
if not os.path.exists(fpath):
return False, {"code": -1, "data": {}, "message": "[%s] is not existed!" % fpath}
return True, os.path.abspath(fpath)
def saveToFile(saveFile, content):
try:
tfn = tempfile.mktemp()
tf = open(tfn, 'wb+')
tf.write(content)
tf.close()
os.rename(tfn, saveFile)
return True
except Exception as e:
traceback.format_exc()
logger.error(str(e))
return False
def getFileInfo(infofile):
return {
"isfile": os.path.isfile(infofile),
"isdir": os.path.isdir(infofile),
"size": os.path.getsize(infofile),
"atime": os.path.getatime(infofile),
"mtime": os.path.getmtime(infofile),
"ctime": os.path.getctime(infofile),
"name": os.path.basename(infofile)
}
# 参数 {"path":"/xxx/xxx.png"}
# path 需要下载的文件名
@file_api.route("/download", methods=["POST"])
def download():
try:
obj = json.loads(request.data)
isAcessed, path = checkPath(obj["path"])
if not isAcessed:
return { "code": -1, "data": {}, "message": "invaild access" }
if not os.path.isfile(path):
return {"code": -1, "data": {}, "message": "Path [%s] is not a valid file!" % path}
with open(path, "rb") as f:
content = base64.b64encode(f.read())
md5code = fmd5(content).hexdigest()
return {
"code": 0,
"data": {
"content": content,
"md5": md5code,
"filename": os.path.basename(path)
},
"message": "download file [%s] successfully!" % obj['path']
}
except Exception as e:
return {"code": -1, "data": {}, "message": "upload file [%s] failed!\n %s" % (obj['path'], repr(e))}
# 参数 {"filename":"xxx.jpg","path":"/upload/","content":"xxxxxxx","md5":"xxxxxxxxxxxxxx"}
# filename 保存的文件名,不带路径
# path 保存的路径
# content 文件的内容,采用base64编码
# md5 文件的MD5校验值
@file_api.route("/upload", methods=["POST"])
def upload():
try:
obj = json.loads(request.data)
if not obj['filename'] or not obj['content']:
return {"code": -1, "data": {}, "message": "filename、path、content and md5 is not completed"}
saveFile = os.path.normpath(os.sep.join([FileStoragePath, obj['filename']]))
if not ajaxCheckAcess(saveFile):
return {"code": -1, "data": {}, "message": "You have no access to [%s]!" % saveFile}
if os.path.exists(saveFile):
return {"code": -1, "data": {}, "message": "File [%s] is existed! Please remove firstly" % saveFile}
fr = base64.b64decode(obj['content'])
md5code = fmd5(obj['content']).hexdigest()
if obj['md5'] != md5code:
return {"code": -1, "data": {}, "message": "File md5 [%s] != [%s]" % (obj['md5'], md5code)}
if saveToFile(saveFile, fr):
return {"code": 0, "data": {}, "message": "upload file [%s] successfully!" % obj['filename']}
else:
return {"code": -1, "data": {}, "message": "upload file [%s] failed!" % obj['filename']}
except Exception as e:
logger.error(str(e))
binfile = request.files.get("binfile")
obj = {}
obj['filename'] = binfile.filename
obj['content'] = binfile.stream.read()
saveFile = os.path.normpath(os.sep.join([FileStoragePath, obj['filename']]))
with open(saveFile, 'wb') as f:
f.write(obj['content'])
return {"code": 0, "data": {}, "message": "upload file by ElementUI[%s] successfully!" % obj['filename']}
# 参数 {"path":"/xxx/xxx.png"}
# path 需要删除的文件名或者目录名
@file_api.route("/remove", methods=["POST"])
def delete():
obj = json.loads(request.data)
isAcessed, path = checkPath(obj["path"])
if not isAcessed:
return { "code": -1, "data": {}, "message": "invaild access" }
try:
if os.path.isfile(path):
os.remove(path)
return {"code": 0, "data": {}, "message": "delete file [%s] successfully!" % path}
elif os.path.isdir(path):
os.rmdir(path)
return {"code": 0, "data": {}, "message": "delete dir [%s] successfully!" % path}
else:
return {"code": 0, "data": {}, "message": "Path [%s] is not a valid file or path!" % path}
except Exception as e:
return {"code": -1, "data": {}, "message": repr(e)}
# 参数 {"path":"/"}
# path 路径
@file_api.route("/getDirectoryList", methods=["POST"])
def dirlist():
obj = json.loads(request.data)
isAcessed, path = checkPath(obj["path"])
if not isAcessed:
return { "code": -1, "data": {}, "message": "invaild access" }
result = []
for p in os.listdir(path):
result.append(getFileInfo(os.path.join(FileStoragePath, p)))
return {"code": 0, "data": result, "message": "Get [%s] successfully!" % path}
# 参数 {"path":"/xe/xxx.png"}
# file 需求获取MD5的文件
@file_api.route("/getFileMD5", methods=["POST"])
def filemd5():
obj = json.loads(request.data)
isAcessed, path = checkPath(obj["path"])
if not isAcessed:
return { "code": -1, "data": {}, "message": "invaild access" }
if not os.path.isfile(path):
return {"code": -1, "data": {}, "message": "Path [%s] is not a valid file!" % path}
with open(path, "rb") as f:
filemd5 = fmd5(f.read()).hexdigest()
return {"code": 0, "data": filemd5, "message": "Get md5 of [%s] successfully!" % path}
# 参数 {"path":"/xe/xxx.png"}
# file 需要获取信息的文件或目录
@file_api.route("/getFileInfo", methods=["GET", "POST"])
def fileinfo():
if do_something():
return { "code": 1, "data": {}, "message": "success" }
obj = json.loads(request.data)
isAcessed, path = checkPath(obj["path"])
if not isAcessed:
return { "code": -1, "data": {}, "message": "invaild access" }
if not os.path.isfile(path):
return {"code": -1, "data": {}, "message": "Path [%s] is not a valid file!" % path}
return {"code": 0, "result": getFileInfo(path), "message": "Get md5 of [%s] successfully!" % path}
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 14:45:53
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\backend\view\login.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import logging
import traceback
from flask import Blueprint, request, redirect, url_for
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.login import LoginSchema, RegisterSchema
logger = logging.getLogger(__name__)
login_api = Blueprint("login_api", __name__, url_prefix="/api/v1/%s/login" % config['NAME'])
@login_api.route("/", methods=['GET'])
def index():
return redirect(url_for('/'))
@login_api.route("/login", methods=['POST'])
@validate_schema(LoginSchema)
def login():
'''
用户登录
data: { "username": "xx", "password": "xx" }
'''
try:
result, message = signalManager.actionLogin.emit(request.schema_data)
if result:
return response_result(message, data=result)
else:
return response_result(message)
except Exception as e:
traceback.format_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@login_api.route('/logout', methods=['POST'])
@Auth.auth_required
def logout():
'''
用户登出
'''
try:
isSuccess, message = signalManager.actionLogout.emit()
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.format_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@login_api.route('/register', methods=['POST'])
@validate_schema(RegisterSchema)
def register():
'''
用户注册
'''
try:
isSuccess, message = signalManager.actionRegister.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.format_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
'''
Author: your name
Date: 2021-06-29 19:33:41
LastEditTime: 2021-07-14 21:26:12
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
import signal
import time
import pprint
import traceback
import jwt
from typing import ( Any,)
from threading import Timer
from datetime import datetime, timedelta
from app import config
from fullstack.log import logger
from model.monitor import session, Device, User
from controller.monitor import insert_data, get_monitor_list, get_watch_list
def datetime2secs(mydate):
return time.mktime(mydate.timetuple())
def secs2datetime(ts):
return datetime.fromtimestamp(ts)
class ObjectDict(dict):
"""
Makes a dictionary behave like an object, with attribute-style access.
"""
def __getattr__(self, name):
try:
return self[name]
except KeyError:
raise AttributeError(name)
def __setattr__(self, name, value):
self[name] = value
class GracefulExit(SystemExit):
code = 1
def raise_graceful_exit(*args):
tornado.ioloop.IOLoop.current().stop()
print("Gracefully shutdown", args)
raise GracefulExit()
class BaseHandler(RequestHandler):
"""解决JS跨域请求问题"""
def set_default_headers(self):
self.set_header('Access-Control-Allow-Origin', '*')
self.set_header('Access-Control-Allow-Methods', 'POST, GET')
self.set_header('Access-Control-Max-Age', 1000)
self.set_header('Access-Control-Allow-Headers', '*')
self.set_header('Content-type', 'application/json')
class WebsocketResponse(ObjectDict):
def __init__(self, type="Response", api_code=-1, message='fail', data=None, traceback=""):
super(WebsocketResponse, self).__init__()
self.type = type
self.code = api_code
self.message = message
self.data = data
self.traceback = traceback
if isinstance(self.data, list):
self.count = len(self.data)
def pushmessage(func):
def send(*agrs, **kwargs):
self = agrs[0]
ret = func(*agrs, **kwargs)
if ret:
msg, binary = ret
try:
if isinstance(msg, WebsocketResponse) or isinstance(msg, dict):
self.write_message(json.dumps(msg), binary)
elif isinstance(msg, str):
self.write_message(msg, binary)
else:
self.write_message(repr(msg), binary)
except WebSocketClosedError as e:
logger.error(e)
traceback.print_exc()
self.on_close()
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:
self.handlers[className] = set()
self.handlers[className].add(self)
logger.info(self.handlers[className])
pprint.pprint(self.handlers)
@pushmessage
def send(self, message, binary=False):
return message, binary
def on_close(self):
className = self.__class__.__name__
logger.warning("websocket of %s is closed" % className)
if className in self.handlers and self in self.handlers[className]:
# 更加健壮的处理是,这里需要增加一个self是否存在的判断
self.handlers[className].remove(self)
for i, c in enumerate(self._clients):
if id(self) == id(c.get("context")):
del self._clients[i]
def check_origin(self, origin):
logger.info(origin)
return True
@classmethod
def broadcastMessage(cls, message):
# pprint.pprint(cls.handlers)
pprint.pprint(message)
print("=======>", cls._clients)
if not message.get("imei"):
return False
for item in cls._clients:
if message.get("imei") in item.get("devices", []):
item.get("context").write_message(json.dumps(message))
# 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):
try:
className = self.__class__.__name__
message = json.loads(message)
# 判断消息类型
if message.get("type"):
# 获取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")
# 认证包,认证不通过,则剔除该连接
if message.get("type") == "auth":
if not message.get("token"):
self.write_message(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': payload.get("data").get("uuid"),
'context': self,
'devices': list(map(lambda d:d.imei, devices)),
'ts': int(time.time())
})
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") == payload.get("data").get("uuid"):
c["ts"] = int(time.time())
self.write_message(json.dumps({ 'code': 200, 'data': None, 'msg': 'update session timestamp success' }))
else:
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:
# 认证失败会导致触发异常,这里不能remove(self),否则会导致on_close方法报错
self.write_message(json.dumps({ 'code': 400, 'data': e.args, 'msg': "server error" }))
logger.error(e)
traceback.print_exc()
logger.info(message)
def on_heartbeat(self):
# 心跳定时器,固定间隔扫描连接列表,当连接超时,主动剔除该连接
for i in range(len(self._clients) - 1, -1, -1):
if int(time.time()) - self._clients[i].get("ts") > 5:
# self._clients.pop(i)
del self._clients[i]
className = self.__class__.__name__
if self.handlers.get(className, None) and self in self.handlers[className]:
self.handlers[className].remove(self)
self._timer = Timer(1, self.on_heartbeat)
self._timer.start()
class MainHandler(BaseHandler):
def get(self, *args, **kwargs):
print("#############", args)
print("/////////////", kwargs)
print(self.request.path) # 请求路径
print(self.request.method) # 请求方法
print(self.request.host) # IP地址
print(self.request.protocol)
# self.get_query_argument('a', value)
# self.get_body_argument()
# self.request.files
self.write(json.dumps({ "msg": "Hello, world" }))
def post(self):
data = tornado.escape.json_decode(self.request.body)
self.write(json.dumps({ 'code': 100, 'data': data, 'msg': 'success' }))
message = {'imei': '12345678900005', 'type': 'report', '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):
def get(self, *args, **kwargs):
# 获取手表列表
print("#############", args)
print("/////////////", kwargs)
print(self.request.path) # 请求路径
print(self.request.method) # 请求方法
print(self.request.host) # IP地址
print(self.request.protocol)
try:
result = get_watch_list()
if result:
self.write(json.dumps({ 'code': 200, 'data': result, 'msg': 'success' }))
else:
self.write(json.dumps({ 'code': 204, 'data': None, 'msg': 'no data' }))
except Exception as e:
logger.error(e)
self.write(json.dumps({ 'code': 500, 'data': None, 'msg': 'server error' }))
def post(self):
data = tornado.escape.json_decode(self.request.body)
self.write(json.dumps({ 'code': 100, 'data': data, 'msg': 'success' }))
class DeviceMessageHandler(BaseHandler):
def get(self):
if not self.get_argument('watch', None):
self.write(json.dumps({ 'code': 400, 'msg': 'params error, watch can not be null' }))
return
try:
watch = self.get_query_argument('watch')
category = self.get_query_argument('category', 'all')
start = self.get_query_argument('start', None)
end = self.get_query_argument('end', None)
if start and start.isdigit():
start = int(start)
start = time.localtime(start)
start = time.strftime("%Y-%m-%d %H:%M:%S", start)
else:
start = (datetime.now()-timedelta(minutes=10)).strftime("%Y-%m-%d %H:%M:%S")
if end and end.isdigit():
end = time.localtime(int(end))
end = time.strftime("%Y-%m-%d %H:%M:%S", end)
result = get_monitor_list(int(watch), category, start, end)
if result:
self.write(json.dumps({ 'code': 200, 'data': result, 'msg': 'success', 'type': 'array' if isinstance(result, list) else 'object' }))
else:
self.write(json.dumps({ 'code': 204, 'data': None, 'msg': 'no data' }))
except Exception as e:
logger.error(e)
traceback.print_exc()
self.write(json.dumps({ 'code': 500, 'data': None, 'msg': 'server error' }))
def post(self):
data = tornado.escape.json_decode(self.request.body)
data.update({ 'request': {
'host': self.request.remote_ip,
'path': self.request.path,
'protocol': self.request.protocol
} })
insert_data(data)
data['type'] = 'report'
data['request'].update({ 'timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S") })
NotifyHandler.broadcastMessage(data)
self.write(json.dumps({ 'code': 100, 'message': 'success' }))
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
(r"/api/v1/evm_store/monitor", DeviceMessageHandler),
(r"/api/v1/evm_store/watch", WatchHandler),
(r"/ws/v1/notify", NotifyHandler),
(r"/dist/(.*)", StaticFileHandler, { "path": "dist" }),
])
if __name__ == "__main__":
app = make_app()
app.listen(5001)
signal.signal(signal.SIGINT, raise_graceful_exit)
signal.signal(signal.SIGTERM, raise_graceful_exit)
tornado.ioloop.IOLoop.current().start()
#!/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.user import AddSchema, DeleteSchema, UpdateSchema, QuerySchema
logger = logging.getLogger(__name__)
user_api = Blueprint("user_api", __name__, url_prefix="/api/v1/%s/user" % config['NAME'])
@user_api.route("/add", methods=['POST'])
@validate_schema(AddSchema)
@Auth.auth_required
def add():
'''
新增用户
'''
try:
isSuccess, message = signalManager.actionAddUser.emit(request.current_user.get("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()
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@user_api.route('/delete/<uuid:id>', methods=['POST'])
@validate_schema(DeleteSchema)
@Auth.auth_required
def delete(id):
'''
删除用户
'''
try:
isSuccess, message = signalManager.actionDeleteUser.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)
@user_api.route('/get', methods=['POST'])
@Auth.auth_required
def get():
'''
查找单个用户
'''
try:
result, message = signalManager.actionGetUser.emit(request.current_user.get("id"))
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
if result == None:
return response_result(ResponseCode.NO_DATA_FOUND)
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))
@user_api.route('/list', methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
def getList():
'''
查询用户列表
'''
try:
result, count, message = signalManager.actionGetUserList.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)
@user_api.route('/update/<uuid:id>', methods=['POST'])
@validate_schema(UpdateSchema)
@Auth.auth_required
def update(id):
'''
更新用户
'''
try:
result, message = signalManager.actionUpdateUser.emit(id, request.schema_data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
return response_result(ResponseCode.NOTHING_CHANGE, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR)
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-03 11:57:41
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\view\ws.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import logging
from flask import json
from tornado.websocket import WebSocketHandler, WebSocketClosedError
from utils import ObjectDict
logger = logging.getLogger(__name__)
class WebsocketResponse(ObjectDict):
def __init__(self, type="Response", api_code=-1, message='fail', data=None, traceback=""):
super(WebsocketResponse, self).__init__()
self.type = type
self.code = api_code
self.message = message
self.data = data
self.traceback = traceback
if isinstance(self.data, list):
self.count = len(self.data)
def pushmessage(func):
def send(*agrs, **kwargs):
self = agrs[0]
ret = func(*agrs, **kwargs)
if ret:
msg, binary = ret
try:
if isinstance(msg, WebsocketResponse) or isinstance(msg, dict):
self.write_message(json.dumps(msg), binary)
elif isinstance(msg, str) or isinstance(msg, str):
self.write_message(msg, binary)
else:
self.write_message(repr(msg), binary)
except WebSocketClosedError as e:
print(e)
self.on_close()
return send
class BaseWebsocket(WebSocketHandler):
handlers = {}
def open(self):
logger.warn("websocket of %s is opened", repr(self))
className = self.__class__.__name__
if className not in self.handlers:
self.handlers[className] = set()
self.handlers[className].add(self)
@pushmessage
def send(self, message, binary=False):
return message, binary
def on_close(self):
logger.warn("websocket of %s is closed", repr(self))
className = self.__class__.__name__
if className in self.handlers:
self.handlers[className].remove(self)
def check_origin(self, origin):
return True
@classmethod
def boardcastMessage(cls, message, binary=False):
className = cls.__name__
if className in cls.handlers:
for handler in cls.handlers[className]:
handler.send(message, binary)
class NotifyHandler(BaseWebsocket):
"""
建立与web前端的通信连接,发送状态信息报文
"""
def open(self):
super(NotifyHandler, self).open()
def on_message(self, message):
print(message)
class ThreadNotifyHandler(BaseWebsocket):
"""
建立与tornado主线程与子线程之间的通信连接
"""
def open(self):
super(ThreadNotifyHandler, self).open()
def on_message(self, message):
NotifyHandler.boardcastMessage(message)
\ No newline at end of file
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="shortcut icon" href="<%= BASE_URL %>favicon.ico" type="image/x-icon">
<link rel="png" href="<%= BASE_URL %>favicon.png">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
</body>
</html>
\ No newline at end of file
import request from "@/utils/request";
export function getWorkbenckData(params) {
return request({
url: "/api/v1/evm_store/workbench/query",
method: "post",
data: params,
});
}
export function doLogin(params) {
return request({
url: "/api/v1/evm_store/login/login",
method: "post",
data: params,
});
}
export function doLogout(params) {
return request({
url: "/api/v1/evm_store/login/logout",
method: "post",
data: params,
});
}
export function doRegister(params) {
return request({
url: "/api/v1/evm_store/login/register",
method: "post",
data: params,
});
}
export function addUser(params) {
// 增
return request({
url: "/api/v1/evm_store/user/add",
method: "post",
data: params,
});
}
export function deleteUser(id) {
// 删
return request({
url: `/api/v1/evm_store/user/delete/${id}`,
method: "post",
});
}
export function getUser(params) {
return request({
url: "/api/v1/evm_store/user/get",
method: "post",
data: params,
});
}
export function getUserList(params) {
// 查
return request({
url: "/api/v1/evm_store/user/list",
method: "post",
data: params,
});
}
export function updateUser(id, params) {
// 改
return request({
url: `/api/v1/evm_store/user/update/${id}`,
method: "post",
data: params,
});
}
export function updateUserPassword(params) {
return request({
url: "/api/v1/evm_store/updatePassword",
method: "post",
data: params,
});
}
export function addDepot(params) {
return request({
url: "/api/v1/evm_store/depot/add",
method: "post",
data: params,
});
}
export function deleteDepot(id) {
return request({
url: `/api/v1/evm_store/depot/delete/${id}`,
method: "post",
});
}
export function getDepotList(params) {
return request({
url: "/api/v1/evm_store/depot/list",
method: "post",
data: params,
});
}
export function updateDepot(id, params) {
return request({
url: `/api/v1/evm_store/depot/update/${id}`,
method: "post",
data: params,
});
}
export function getDictsList(params) {
return request({
url: "/api/v1/evm_store/dict/list",
method: "post",
data: params,
});
}
export function addDict(params) {
return request({
url: "/api/v1/evm_store/dict/add",
method: "post",
data: params,
});
}
export function updateDict(id, params) {
return request({
url: `/api/v1/evm_store/dict/update/${id}`,
method: "post",
data: params,
});
}
export function deleteDict(id) {
return request({
url: `/api/v1/evm_store/dict/delete/${id}`,
method: "post",
});
}
export function getProject(params) {
return request({
url: "/api/v1/evm_store/project/get",
method: "post",
data: params,
});
}
export function getProjectList(params) {
return request({
url: "/api/v1/evm_store/project/list",
method: "post",
data: params,
});
}
export function addProject(params) {
return request({
url: "/api/v1/evm_store/project/add",
method: "post",
data: params,
});
}
export function updateProject(id, params) {
return request({
url: `/api/v1/evm_store/project/update/${id}`,
method: "post",
data: params,
});
}
export function deleteProject(id) {
return request({
url: `/api/v1/evm_store/project/delete/${id}`,
method: "post",
});
}
export function getRoleList(params) {
return request({
url: "/api/v1/evm_store/role/list",
method: "post",
data: params,
});
}
export function addRole(params) {
return request({
url: "/api/v1/evm_store/role/add",
method: "post",
data: params,
});
}
export function updateRole(id, params) {
return request({
url: `/api/v1/evm_store/role/update/${id}`,
method: "post",
data: params,
});
}
export function deleteRole(id) {
return request({
url: `/api/v1/evm_store/role/delete/${id}`,
method: "delete",
});
}
export function getWatchList() {
return request({
url: "/api/v1/evm_store/watch",
method: "get",
});
}
export function getMonitorData(params) {
return request({
url: "/api/v1/evm_store/monitor",
method: "get",
params,
});
}
export function updatePermission(id, params) {
return request({
url: `/api/v1/evm_store/permission/update/${id}`,
method: "post",
data: params,
});
}
export function deletePermission(id) {
return request({
url: `/api/v1/evm_store/permission/delete/${id}`,
method: "post",
});
}
export function addNewProject(params) {
return request({
url: "/api/v1/evm_store/system/addProject",
method: "post",
data: params,
});
}
export function exportProject(params) {
return request({
url: "/api/v1/evm_store/system/exportProject",
method: "post",
data: params,
});
}
export function addFlow(params) {
return request({
url: "/api/v1/evm_store/flow/add",
method: "post",
data: params,
});
}
export function updateFlow(id, params) {
return request({
url: `/api/v1/evm_store/flow/update/${id}`,
method: "post",
data: params,
});
}
export function deleteFlow(id) {
return request({
url: `/api/v1/evm_store/flow/delete/${id}`,
method: "delete",
});
}
export function getFlowList(params) {
return request({
url: "/api/v1/evm_store/system/getFlowList",
method: "post",
data: params,
});
}
export function addPayback(params) {
return request({
url: "/api/v1/evm_store/payback/add",
method: "post",
data: params,
});
}
export function updatePayback(id, params) {
return request({
url: `/api/v1/evm_store/payback/update/${id}`,
method: "post",
data: params,
});
}
export function deletePayback(id) {
return request({
url: `/api/v1/evm_store/payback/delete/${id}`,
method: "post",
});
}
export function getPaybackList(params) {
return request({
url: "/api/v1/evm_store/system/getPaybackList",
method: "post",
data: params,
});
}
export function deleteProjectUser(params) {
return request({
url: "/api/v1/evm_store/system/deleteProjectUser",
method: "post",
data: params,
});
}
export function modifyProjectUser(params) {
return request({
url: "/api/v1/evm_store/system/modifyProjectUser",
method: "post",
data: params,
});
}
export function updateFlowList(params) {
return request({
url: "/api/v1/evm_store/system/updateFlow",
method: "post",
data: params,
});
}
export function updatePaybackList(params) {
return request({
url: "/api/v1/evm_store/system/updatePayback",
method: "post",
data: params,
});
}
export function updateProduction(params) {
return request({
url: "/api/v1/evm_store/system/updateProductionPlan",
method: "post",
data: params,
});
}
export function getCalendarList(params) {
return request({
url: "/api/v1/evm_store/calendar/list",
method: "post",
data: params,
});
}
export function addCalendar(params) {
return request({
url: "/api/v1/evm_store/calendar/add",
method: "post",
data: params,
});
}
export function updateCalendar(id, params) {
return request({
url: `/api/v1/evm_store/calendar/update/${id}`,
method: "post",
data: params,
});
}
export function deleteCalendar(id) {
return request({
url: `/api/v1/evm_store/calendar/delete/${id}`,
method: "post",
});
}
export function getRoleUser(params) {
return request({
url: '/api/v1/evm_store/system/getRoleUsers',
method: 'post',
data: params,
})
}
export function getSummaryList(params) {
return request({
url: "/api/v1/evm_store/summary/list",
method: 'post',
data: params,
});
}
export function addSummary(params) {
return request({
url: "/api/v1/evm_store/summary/add",
method: "post",
data: params,
});
}
export function updateSummary(id, params) {
return request({
url: `/api/v1/evm_store/summary/update/${id}`,
method: "post",
data: params,
});
}
export function deleteSummary(id) {
return request({
url: `/api/v1/evm_store/summary/delete/${id}`,
method: "post",
});
}
export function getProductionPlanList(params) {
return request({
url: "/api/v1/evm_store/productionPlan/list",
method: 'post',
data: params,
});
}
export function addProductionPlan(params) {
return request({
url: "/api/v1/evm_store/productionPlan/add",
method: "post",
data: params,
});
}
export function updateProductionPlan(id, params) {
return request({
url: `/api/v1/evm_store/productionPlan/update/${id}`,
method: "post",
data: params,
});
}
export function deleteProductionPlan(id) {
return request({
url: `/api/v1/evm_store/productionPlan/delete/${id}`,
method: "post",
});
}
export function getFileList(params) {
return request({
url: "/api/v1/evm_store/netdisc/list",
method: "post",
data: params,
});
}
export function addFile(params) {
return request({
url: "/api/v1/evm_store/netdisc/add",
method: "post",
data: params,
});
}
export function updateFile(id, params) {
return request({
url: `/api/v1/evm_store/netdisc/update/${id}`,
method: "post",
data: params,
});
}
export function deleteFile(params) {
return request({
url: "/api/v1/evm_store/netdisc/delete",
method: "post",
data: params,
});
}
This source diff could not be displayed because it is too large. You can view the blob instead.
/*
* @Author: your name
* @Date: 2021-04-14 14:12:19
* @LastEditTime: 2021-07-14 21:29:01
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\main.js
*/
import Vue from "vue";
import "normalize.css/normalize.css";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
import "@/styles/index.scss";
import "@/styles/theme-blue/index.css";
import App from "./App";
import store from "./store";
import router from "./router";
import "@/icons";
import "@/permission";
import "@/icons/icon.js";
import "@/icons/icon-color.js";
import IconFont from "@/components/IconFont";
import myCharts from '@/utils/myCharts.js';
Vue.use(myCharts)
/**
* If you don't want to use mock-server
* you want to use MockJs for mock api
* you can execute: mockXHR()
*
* Currently MockJs will be used in the production environment,
* please remove it before going online! ! !
*/
// import { mockXHR } from '../mock'
// if (process.env.NODE_ENV === 'production') {
// mockXHR()
// }
// import CollapseTransition from "element-ui/lib/transitions/collapse-transition";
// The second argument is optional and sets the default config values for every player.
// Vue.component(CollapseTransition.name, CollapseTransition);
Vue.component("IconFont", IconFont);
// set ElementUI lang to EN
// Vue.use(ElementUI, { locale })
// 如果想要中文版 element-ui,按如下方式声明
Vue.use(ElementUI);
Vue.config.productionTip = false;
new Vue({
el: "#app",
router,
store,
render: (h) => h(App),
});
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"];
NProgress.configure({ showSpinner: false }); // NProgress Configuration
router.beforeEach(async (to, from, next) => {
// start progress bar
NProgress.start();
// set page title
document.title = getPageTitle(to.meta.title);
// determine whether the user has logged in
const hasToken = store.getters.token;
if (hasToken) {
if (to.path === "/login") {
// if is logged in, redirect to the home page
next({ path: "/" });
NProgress.done();
} else {
next();
}
} else {
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
// in the free login whitelist, go directly
next();
} else {
// other pages that do not have permission to access are redirected to the login page.
next(`/login?redirect=${to.path}`);
NProgress.done();
}
}
});
router.afterEach(() => {
// finish progress bar
NProgress.done();
});
import Vue from "vue";
import Router from "vue-router";
Vue.use(Router);
/* Layout */
import Layout from "@/layout";
import StoreLayout from "@/layout/store";
/**
* Note: sub-menu only appear when route children.length >= 1
* Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
*
* hidden: true if set true, item will not show in the sidebar(default is false)
* alwaysShow: true if set true, will always show the root menu
* if not set alwaysShow, when item has more than one children route,
* it will becomes nested mode, otherwise not show the root menu
* redirect: noRedirect if set noRedirect will no redirect in the breadcrumb
* name:'router-name' the name is used by <keep-alive> (must set!!!)
* meta : {
roles: ['admin','editor'] control the page roles (you can set multiple roles)
title: 'title' the name show in sidebar and breadcrumb (recommend set)
icon: 'svg-name' the icon show in the sidebar
breadcrumb: false if set false, the item will hidden in breadcrumb(default is true)
activeMenu: '/example/list' if set path, the sidebar will highlight the path you set
}
*/
/**
* constantRoutes
* a base page that does not have permission requirements
* all roles can be accessed
*/
export const constantRoutes = [
{
path: "/login",
component: () => import("@/views/system/login"),
hidden: true,
},
{
path: "/register",
component: () => import("@/views/system/register"),
hidden: true,
},
{
path: '/gallery',
redirect: '/gallery/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'Gallery',
component: () => import('@/views/app-store/gallery'),
meta: { title: '商店首页', icon: 'home' }
}]
},
{
path: '/application',
redirect: '/application/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'Application',
component: () => import('@/views/app-store/app'),
meta: { title: '应用详情', icon: 'home' }
}]
},
{
path: '/list',
redirect: '/list/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'AppList',
component: () => import('@/views/app-store/list'),
meta: { title: '游戏', icon: 'home' }
}]
},
{
path: '/category',
redirect: '/category/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'AppCategory',
component: () => import('@/views/app-store/category'),
meta: { title: '应用分类', icon: 'home' }
}]
},
{
path: '/rank',
redirect: '/rank/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'AppRank',
component: () => import('@/views/app-store/rank'),
meta: { title: '应用排行', icon: 'home' }
}]
},
{
path: '/topic',
redirect: '/topic/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'AppTopic',
component: () => import('@/views/app-store/topic'),
meta: { title: '应用排行', icon: 'home' }
}]
},
{
path: '/search',
redirect: '/search/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'AppSearch',
component: () => import('@/views/app-store/search'),
meta: { title: '搜索应用', icon: 'home' }
}]
},
{
path: '/my',
redirect: '/my/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'AppProfile',
component: () => import('@/views/app-store/profile'),
meta: { title: '个人中心', icon: 'shangcheng' }
}]
},
{
path: '/auth',
redirect: '/auth/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'AppAuth',
component: () => import('@/views/app-store/auth'),
meta: { title: '账号认证', icon: 'shangcheng' }
}]
},
{
path: '/developer',
redirect: '/developer/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'Developer',
component: () => import('@/views/app-store/developer'),
meta: { title: '开发者中心', icon: 'home' }
}]
},
{
path: '/docs',
redirect: '/docs/index',
component: Layout,
children: [{
path: 'index',
name: 'Document',
component: () => import('@/views/app-store/docs'),
meta: { title: '开发文档', icon: 'shangcheng' }
}]
},
{
path: '/home',
redirect: '/home/index',
component: Layout,
children: [{
path: 'index',
name: 'AppIndex',
component: () => import('@/views/system/apps'),
meta: { title: '应用管理', icon: 'home' }
}]
},
{
path: '/chart',
redirect: '/chart/index',
component: Layout,
children: [{
path: 'index',
name: 'AppChart',
component: () => import('@/views/system/chart'),
meta: { title: '实时曲线', icon: 'home' }
}]
},
{
path: '/history',
redirect: '/history/index',
component: Layout,
children: [{
path: 'index',
name: 'AppHistoryChart',
component: () => import('@/views/system/history'),
meta: { title: '历史曲线', icon: 'home' }
}]
},
{
path: '/tool',
redirect: '/tool/index',
component: Layout,
children: [{
path: 'index',
name: 'AppTool',
component: () => import('@/views/system/tool'),
meta: { title: '工具', icon: 'home' }
}]
},
{
path: '/build',
redirect: '/build/index',
component: Layout,
children: [{
path: 'index',
name: 'AppBuild',
component: () => import('@/views/system/build'),
meta: { title: '打包日志', icon: 'home' }
}]
},
{
path: '/opqcp',
redirect: '/opqcp/index',
component: Layout,
children: [{
path: 'index',
name: 'Opqcp',
component: () => import('@/views/system/opqcp'),
meta: { title: 'opqcp', icon: 'home' }
}]
},
{
path: '/monitor',
redirect: '/monitor/index',
component: Layout,
children: [{
path: 'index',
name: 'Monitor',
component: () => import('@/views/system/monitor'),
meta: { title: '资源监视', icon: 'home' }
}]
},
{
path: '/device',
redirect: '/device/index',
component: Layout,
children: [{
path: 'index',
name: 'Device',
component: () => import('@/views/system/device'),
meta: { title: '设备管理', icon: 'gongzuotai' }
}]
},
{
path: '/profile',
redirect: '/profile/index',
component: Layout,
children: [{
path: 'index',
name: 'Profile',
component: () => import('@/views/system/profile'),
meta: { title: '个人中心', icon: 'shangcheng' }
}]
},
{
path: '/user',
redirect: '/user/index',
component: Layout,
children: [{
path: 'index',
name: 'UserIndex',
component: () => import('@/views/system/users'),
meta: { title: '用户管理', icon: 'shangcheng' }
}]
},
{
path: '/404',
redirect: '/404/index',
component: Layout,
children: [{
path: 'index',
name: 'Page404',
component: () => import('@/views/error-pages/404'),
meta: { title: '404', icon: 'home' }
}]
},
{
path: '/403',
redirect: '/403/index',
component: Layout,
children: [{
path: 'index',
name: 'Page403',
component: () => import('@/views/error-pages/403'),
meta: { title: '403', icon: 'home' }
}]
},
{
path: '/not-found',
redirect: '/not-found/index',
component: StoreLayout,
children: [{
path: 'index',
name: 'NotFound',
component: () => import('@/views/error-pages/not-found'),
meta: { title: 'not-found', icon: 'home' }
}]
},
{ path: '*', redirect: '/404', hidden: true }
];
// 404 page must be placed at the end !!!
export const notFound = { path: '*', redirect: '/404', hidden: true }
const createRouter = () =>
new Router({
// mode: 'history', // require service support, 后台部署在/static 目录
// base: "/static", // 应用的基础路径: 默认为'/',修改为'/static'
scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes,
});
const router = createRouter();
// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() {
const newRouter = createRouter();
router.matcher = newRouter.matcher; // reset router
}
export default router;
/*
* @Author: your name
* @Date: 2021-04-14 14:12:19
* @LastEditTime: 2021-07-14 21:28:48
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\settings.js
*/
export default {
name: {
zh: "EVM应用商店",
en: "EVM App Store",
},
author: "武汉市字节码科技有限公司",
logo: "",
officialWeb: "https://www.baidu.com",
// hostname: "127.0.0.1",
// port: window.location.port,
port: 9999,
/**
* @type {boolean} true | false
* @description Whether fix the header
*/
fixedHeader: true,
/**
* @type {boolean} true | false
* @description Whether show the logo in sidebar
*/
sidebarLogo: false,
userblockShow: true, // 用户中心
isFullScreen: false, // 配置放大按钮初始值
fullScreenShow: true, // 放大按钮是否显示
svgFilePath: "@/assets/icons/svg",
pageInfos: [
{
vue: "app-store/index.vue",
title: "应用管理",
name: "AppIndex",
icon: "gongzuotai",
path: "home/index",
},
{
vue: "app-store/build.vue",
title: "打包日志",
name: "AppBuild",
icon: "gongzuotai",
path: "build/index",
},
{
vue: "app-store/device.vue",
title: "设备管理",
name: "Device",
icon: "gongzuotai",
path: "device/index",
},
{
vue: "profile/docs.vue",
title: "个人中心",
name: "Profile",
icon: "gongzuotai",
path: "profile/index",
},
{
vue: "system/monitor.vue",
title: "资源监视",
name: "Monitor",
icon: "gongzuotai",
path: "monitor/index",
},
// {
// vue: "system/chart.vue",
// title: "实时曲线",
// name: "AppChart",
// icon: "gongzuotai",
// path: "chart/index",
// },
// {
// vue: "system/history.vue",
// title: "历史曲线",
// name: "AppHistoryChart",
// icon: "gongzuotai",
// path: "history/index",
// },
{
vue: "system/chart.vue",
title: "实时曲线",
name: "AppChart",
icon: "gongzuotai",
path: "chart/index",
},
{
vue: "system/history.vue",
title: "历史曲线",
name: "AppHistoryChart",
icon: "gongzuotai",
path: "history/index",
},
{
vue: "system/tool.vue",
title: "工具",
name: "AppTool",
icon: "gongzuotai",
path: "tool/index",
},
{
vue: "app-store/docs.vue",
title: "开发文档",
name: "Document",
icon: "gongzuotai",
path: "docs/index",
},
],
};
/*
* @Author: your name
* @Date: 2021-04-14 14:12:19
* @LastEditTime: 2021-07-14 21:27:18
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\utils\wsNotify.js
*/
import Vue from "vue";
export const wsNotify = new WebSocket(
`ws://${window.location.hostname}:5001/ws/v1/notify`
);
window.wsNotify = wsNotify;
wsNotify.eventBus = new Vue();
wsNotify.onopen = function (event) {
console.log("websocket is conneted!", event);
wsNotify.eventBus.$emit("open", event);
};
wsNotify.onmessage = function (event) {
var message = JSON.parse(event.data);
wsNotify.eventBus.$emit("message", message);
};
wsNotify.onerror = function (error) {
console.log(error);
wsNotify.eventBus.$emit("error", error);
};
wsNotify.onclose = function (event) {
console.log("websocket is colosed!", event);
wsNotify.eventBus.$emit("close", event);
};
<template>
<div class="app-container">
<div style="margin-top: 10px">
<grid-layout
:layout.sync="layout"
:col-num="12"
:row-height="30"
:is-draggable="draggable"
:is-resizable="resizable"
:vertical-compact="true"
:use-css-transforms="true"
@layout-created="layoutCreatedEvent"
@layout-before-mount="layoutBeforeMountEvent"
@layout-mounted="layoutMountedEvent"
@layout-ready="layoutReadyEvent"
@layout-updated="layoutUpdatedEvent"
>
<grid-item
:x="0"
:y="0"
:w="6"
:h="5"
i="1"
@resize="resizeEvent"
@move="moveEvent"
@resized="resizedEvent"
@container-resized="containerResizedEvent"
@moved="movedEvent"
>
<p class="item-title">DEVICE</p>
<div style="padding: 15px">
<el-select
size="mini"
v-model="device"
@change="onSelectChange"
placeholder="请选择设备"
>
<el-option
v-for="(item, index) in deviceList"
:key="index"
:label="item"
:value="item"
></el-option>
</el-select>
</div>
</grid-item>
<grid-item
:x="6"
:y="0"
:w="6"
:h="5"
i="2"
@resize="resizeEvent"
@move="moveEvent"
@resized="resizedEvent"
@container-resized="containerResizedEvent"
@moved="movedEvent"
>
<p class="item-title">SYSTEM</p>
<el-table
element-loading-text="Loading"
:data="system"
size="mini"
border
stripe
fit
highlight-current-row
>
<el-table-column
prop="host"
label="host"
min-width="150"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="path"
label="path"
min-width="150"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop="timestamp"
label="timestamp"
min-width="150"
show-overflow-tooltip
></el-table-column>
<el-table-column label="imei" min-width="150" show-overflow-tooltip>
<template slot-scope="scope">{{ scope.row.imei }}</template>
</el-table-column>
<el-table-column
label="free_size"
min-width="100"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.free_size }}(KB)</template
>
</el-table-column>
</el-table>
</grid-item>
<grid-item
:x="0"
:y="5"
:w="6"
:h="5"
i="3"
@resize="resizeEvent"
@move="moveEvent"
@resized="resizedEvent"
@container-resized="containerResizedEvent"
@moved="movedEvent"
>
<p class="item-title">EVM</p>
<el-table
element-loading-text="Loading"
:data="evmList"
size="mini"
border
stripe
fit
highlight-current-row
>
<el-table-column
label="heap_map_size"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.heap_map_size }}(KB)</template
>
</el-table-column>
<el-table-column
label="heap_total_size"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.heap_total_size }}(KB)</template
>
</el-table-column>
<el-table-column
label="heap_used_size"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.heap_used_size }}(KB)</template
>
</el-table-column>
<el-table-column
label="stack_total_size"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.stack_total_size }}(KB)</template
>
</el-table-column>
<el-table-column
label="stack_used_size"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.stack_used_size }}(KB)</template
>
</el-table-column>
</el-table>
</grid-item>
<grid-item
:x="6"
:y="5"
:w="6"
:h="5"
i="4"
@resize="resizeEvent"
@move="moveEvent"
@resized="resizedEvent"
@container-resized="containerResizedEvent"
@moved="movedEvent"
>
<p class="item-title">LVGL</p>
<el-table
element-loading-text="Loading"
:data="lvglList"
size="mini"
border
stripe
fit
highlight-current-row
>
<el-table-column
label="total_size"
min-width="100"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.total_size }}(KB)</template
>
</el-table-column>
<el-table-column
prop="free_cnt"
label="free_cnt"
min-width="100"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="free_size"
min-width="120"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.free_size }}(KB)</template
>
</el-table-column>
<el-table-column label="free_biggest_size" min-width="120">
<template slot-scope="scope"
>{{ scope.row.free_biggest_size }}(KB)</template
>
</el-table-column>
<el-table-column label="used_cnt" min-width="100">
<template slot-scope="scope">{{ scope.row.used_cnt }}</template>
</el-table-column>
<el-table-column label="used_pct" min-width="100">
<template slot-scope="scope"
>{{ scope.row.used_pct }}(%)</template
>
</el-table-column>
<el-table-column label="frag_pct" min-width="100">
<template slot-scope="scope"
>{{ scope.row.frag_pct }}(%)</template
>
</el-table-column>
</el-table>
</grid-item>
<grid-item
:x="0"
:y="10"
:w="12"
:h="10"
i="5"
@resize="resizeEvent"
@move="moveEvent"
@resized="resizedEvent"
@container-resized="containerResizedEvent"
@moved="movedEvent"
>
<div style="width: 100%; height: 100%; overflow-y: auto">
<p class="item-title">APP</p>
<el-table
element-loading-text="Loading"
:data="imageList"
size="mini"
border
stripe
fit
highlight-current-row
>
<el-table-column
prop="uri"
label="uri"
min-width="150"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="length"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.length }}(KB)</template
>
</el-table-column>
<el-table-column
label="png_file_size"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.png_file_size }}(KB)</template
>
</el-table-column>
<el-table-column
prop="png_total_count"
label="png_total_count"
min-width="150"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="png_uncompressed_size"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"
>{{ scope.row.png_uncompressed_size }}(KB)</template
>
</el-table-column>
</el-table>
</div>
</grid-item>
<grid-item
:x="0"
:y="20"
:w="12"
:h="7"
i="6"
@resize="resizeEvent"
@move="moveEvent"
@resized="resizedEvent"
@container-resized="containerResizedEvent"
@moved="movedEvent"
>
<EvmChart :chartData="evm"></EvmChart>
</grid-item>
<grid-item
:x="0"
:y="27"
:w="12"
:h="7"
i="7"
@resize="resizeEvent"
@move="moveEvent"
@resized="resizedEvent"
@container-resized="containerResizedEvent"
@moved="movedEvent"
>
<LvglChart :chartData="lvgl"></LvglChart>
</grid-item>
</grid-layout>
</div>
</div>
</template>
<script>
import { getWatchList, getMonitorData } from "@/api/index";
import EvmChart from "./components/EvmChart";
import LvglChart from "./components/LvglChart";
import { GridLayout, GridItem } from "vue-grid-layout";
import { wsNotify } from "@/utils/eventBus.js";
export default {
name: "Monitor",
data() {
return {
watchs: [],
device: null,
devices: {},
deviceList: null,
system: [],
evm: {},
evmList: [],
lvgl: {},
lvglList: [],
image: {},
imageList: [],
socket: null,
form: {
system: ["free_size"],
lvgl: ["total_size", "free_size", "free_biggest_size"],
evm: [
"total_size",
"free_size",
"heap_map_size",
"heap_total_size",
"heap_used_size",
"stack_total_size",
"stack_used_size",
],
image: ["png_uncompressed_size", "png_file_size", "length"],
},
layout: [
{ x: 0, y: 0, w: 6, h: 5, i: "0", static: false },
{ x: 6, y: 0, w: 6, h: 5, i: "1", static: true },
{ x: 0, y: 5, w: 6, h: 5, i: "2", static: false },
{ x: 6, y: 5, w: 6, h: 5, i: "3", static: false },
{ x: 0, y: 10, w: 12, h: 10, i: "4", static: false },
{ x: 0, y: 20, w: 12, h: 7, i: "5", static: false },
{ x: 0, y: 27, w: 12, h: 7, i: "6", static: false },
],
draggable: true,
resizable: true,
};
},
components: {
GridLayout,
GridItem,
EvmChart,
LvglChart,
},
methods: {
moveEvent(i, newX, newY) {
const msg = "MOVE i=" + i + ", X=" + newX + ", Y=" + newY;
console.log(msg);
},
movedEvent(i, newX, newY) {
const msg = "MOVED i=" + i + ", X=" + newX + ", Y=" + newY;
console.log(msg);
},
resizeEvent(i, newH, newW, newHPx, newWPx) {
const msg =
"RESIZE i=" +
i +
", H=" +
newH +
", W=" +
newW +
", H(px)=" +
newHPx +
", W(px)=" +
newWPx;
console.log(msg);
},
resizedEvent(i, newX, newY, newHPx, newWPx) {
const msg =
"RESIZED i=" +
i +
", X=" +
newX +
", Y=" +
newY +
", H(px)=" +
newHPx +
", W(px)=" +
newWPx;
console.log(msg);
},
containerResizedEvent(i, newH, newW, newHPx, newWPx) {
const msg =
"CONTAINER RESIZED i=" +
i +
", H=" +
newH +
", W=" +
newW +
", H(px)=" +
newHPx +
", W(px)=" +
newWPx;
console.log(msg);
},
layoutCreatedEvent(newLayout) {
console.log("Created layout: ", newLayout);
},
layoutBeforeMountEvent(newLayout) {
console.log("beforeMount layout: ", newLayout);
},
layoutMountedEvent(newLayout) {
console.log("Mounted layout: ", newLayout);
},
layoutReadyEvent(newLayout) {
console.log("Ready layout: ", newLayout);
},
layoutUpdatedEvent(newLayout) {
console.log("Updated layout: ", newLayout);
},
fetchData() {
this.isLoading = true;
getWatchList()
.then((res) => {
if (res.code == 200) this.watchs = res.data;
})
.catch((err) => {
this.$message.warning(err.msg);
})
.finally(() => {
this.isLoading = false;
});
},
queryData() {
getMonitorData({
watch: this.device,
})
.then((res) => {
if (res.type == "object") {
this.evmList = res.data.evm;
this.lvglList = res.data.lvgl;
this.imageList = res.data.image;
}
})
.catch((err) => {
this.$message.warning(err.msg);
});
},
onChange(res) {
if (!res) return null;
var t = this.watchs.find((item) => {
return item.id == res;
});
if (t) this.device = t.imei;
// 清空之前数据
this.resetData();
},
onSubmit() {
this.queryData();
},
onReset(formName) {
this.$refs[formName].resetFields();
this.fetchData();
},
sendMsg() {
let message = JSON.stringify({
type: "auth",
token: this.$store.getters.token,
});
this.socket.send(message);
},
handleMessage(msg) {
if (msg.type !== "report" || !msg.imei) return false;
if (!this.deviceList) {
this.deviceList = [];
}
if (!this.deviceList.includes(msg.imei)) {
this.deviceList.push(msg.imei);
}
if (!this.device) {
if (this.deviceList && this.deviceList.length) this.device = this.deviceList[0];
else this.device = msg.imei;
}
this.devices[msg.imei] = msg;
this.processData(msg);
this.resetData();
},
processData(msg) {
if (!msg) return null;
Object.keys(msg).forEach((item) => {
if (this.form[item]) {
var keys = this.form[item];
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
if (item == "image") {
for (var j = 0; j < msg[item].length; j++) {
msg[item][j][k] = Math.ceil(msg[item][j][k] / 1024);
}
} else {
msg[item][k] = Math.ceil(msg[item][k] / 1024);
}
}
}
});
},
onSelectChange(res) {
this.device = res;
this.processData(this.devices[this.device]);
this.resetData();
console.log(res);
},
resetData() {
wsNotify.eventBus.$emit("resize");
this.evmList = [{ ...this.devices[this.device].evm }];
this.lvglList = [{ ...this.devices[this.device].lvgl }];
this.system = [{ imei: this.devices[this.device].imei, ...this.devices[this.device].system, ...this.devices[this.device].request }];
// 这里需要特殊处理下,先判断uri是否存在,不存在则添加,存在则更新
let uris = [];
this.imageList.forEach((img) => {
uris.push(img.uri);
});
this.devices[this.device].image &&
this.devices[this.device].image.forEach((item) => {
if (!uris.includes(item.uri)) {
this.imageList.push(item);
}
});
// this.imageList = msg.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() {},
created() {
this.socket = wsNotify;
wsNotify.eventBus.$on("open", (message) => {
this.sendMsg();
this.$nextTick(() => {
console.log(message);
});
// 这里启动一个定时器,10秒钟后,如果没有消息进来,说明当前没有在线设备
});
wsNotify.eventBus.$on("close", (message) => {
this.$nextTick(() => {
console.log(message);
});
});
wsNotify.eventBus.$on("message", (message) => {
this.$nextTick(() => {
this.handleMessage(message);
});
});
},
};
</script>
<style lang="scss" scoped>
.app-container {
& > div.page-wrapper {
margin: 10px 0px;
}
}
.vue-grid-layout {
background: none;
}
.vue-grid-item:not(.vue-grid-placeholder) {
background: #fff;
border: 0px solid #eee;
}
.vue-grid-item .resizing {
opacity: 0.9;
}
.vue-grid-item .static {
background: #cce;
}
.vue-grid-item .text {
font-size: 24px;
text-align: center;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
height: 100%;
width: 100%;
}
.vue-grid-item .item-title {
margin-left: 15px;
}
.vue-grid-item .no-drag {
height: 100%;
width: 100%;
}
.vue-grid-item .minMax {
font-size: 12px;
}
.vue-grid-item .add {
cursor: pointer;
}
.vue-draggable-handle {
position: absolute;
width: 20px;
height: 20px;
top: 0;
left: 0;
background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>")
no-repeat;
background-position: bottom right;
padding: 0 8px 8px 0;
background-repeat: no-repeat;
background-origin: content-box;
box-sizing: border-box;
cursor: pointer;
}
</style>
"use strict";
const path = require("path");
function resolve(dir) {
return path.join(__dirname, dir);
}
// All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = {
/**
* You will need to set publicPath if you plan to deploy your site under a sub path,
* for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
* then publicPath should be set to "/bar/".
* In most cases please use '/' !!!
* Detail: https://cli.vuejs.org/config/#publicpath
*/
publicPath: "/",
outputDir: "dist",
productionSourceMap: false,
css: {
sourceMap: true,
},
devServer: {
port: 8080,
open: true,
overlay: {
warnings: false,
errors: true,
},
proxy: {
// change xxx-api/login => mock/login
// detail: https://cli.vuejs.org/config/#devserver-proxy
"/api/v1": {
target: "http://127.0.0.1:3000/",
changeOrigin: true,
pathRewrite: {},
},
"/api/v1/evm_store": {
target: "http://store.evmiot.com/",
changeOrigin: true,
pathRewrite: {
// 这里理解成用/api代替target里面的地址,后面组件中我们调用接口时直接用api代替
// 比如我要调用'http://40.00.100.100:3002/user/add',直接写'/api/user/add'即可
},
},
"/uowap/": {
target: "https://web-drcn.hispace.dbankcloud.cn/",
changeOrigin: true,
pathRewrite: {},
},
},
// after: require("./mock/mock-server.js"),
},
configureWebpack: (config) => {
// debug JS
config.devtool = "source-map";
config.externals = {
'gsap': 'gsap'
}
},
chainWebpack(config) {
config.plugins.delete("preload"); // TODO: need test
config.plugins.delete("prefetch"); // TODO: need test
// set svg-sprite-loader
config.module.rule("svg").exclude.add(resolve("src/icons")).end();
config.module
.rule("icons")
.test(/\.svg$/)
.include.add(resolve("src/icons"))
.end()
.use("svg-sprite-loader")
.loader("svg-sprite-loader")
.options({
symbolId: "icon-[name]",
})
.end();
// set preserveWhitespace
config.module
.rule("vue")
.use("vue-loader")
.loader("vue-loader")
.tap((options) => {
options.compilerOptions.preserveWhitespace = true;
return options;
})
.end();
config.when(process.env.NODE_ENV !== "development", (config) => {
config
.plugin("ScriptExtHtmlWebpackPlugin")
.after("html")
.use("script-ext-html-webpack-plugin", [
{
// `runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/,
},
])
.end();
config.optimization.splitChunks({
chunks: "all",
cacheGroups: {
libs: {
name: "chunk-libs",
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: "initial", // only package third parties that are initially dependent
},
elementUI: {
name: "chunk-elementUI", // split elementUI into a single package
priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
},
commons: {
name: "chunk-commons",
test: resolve("src/components"), // can customize your rules
minChunks: 3, // minimum common number
priority: 5,
reuseExistingChunk: true,
},
},
});
config.optimization.runtimeChunk("single");
});
},
};
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from webcreator.event import PySignal
class SignalManager(object):
actionPostArea = PySignal()
actionDeleteArea = PySignal()
actionGetListArea = PySignal()
actionGetArea = PySignal()
actionPutArea = PySignal()
actionPostApp = PySignal()
actionDeleteApp = PySignal()
actionGetListApp = PySignal()
actionGetApp = PySignal()
actionPutApp = PySignal()
actionGetListPackage = PySignal()
actionGetPackage = PySignal()
actionPostUser = PySignal()
actionDeleteUser = PySignal()
actionGetListUser = PySignal()
actionGetUser = PySignal()
actionPutUser = PySignal()
actionPostLogin = PySignal()
actionGetListLogin = PySignal()
actionGetLogin = PySignal()
# file manager api
actionGetFileInit = PySignal()
actionGetFileContent = PySignal()
actionGetFileTree = PySignal()
actionGetFileDisk = PySignal()
actionGetFileDown = PySignal()
actionGetFilePreview = PySignal()
def __init__(self):
super().__init__()
signalManager = SignalManager()
\ No newline at end of file
'''
Author: your name
Date: 2021-06-30 17:43:46
LastEditTime: 2021-07-14 19:05:56
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\__init__.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.signal_manager import signalManager
from .area import areaManager
from .app import appManager
from .package import packageManager
from .user import userManager
from .login import loginManager
from .device import deviceManager
from .annex import annexManager
from .monitorWatch import monitorWatchManager
from .monitorSystem import monitorSystemManager
from .monitorLvgl import monitorLvglManager
from .monitorImage import monitorImageManager
from .monitorEvm import monitorEvmManager
from .file import fileManager
def initConnect():
signalManager.actionPostArea.connect(areaManager.post)
signalManager.actionDeleteArea.connect(areaManager.delete)
signalManager.actionGetListArea.connect(areaManager.getList)
signalManager.actionGetArea.connect(areaManager.get)
signalManager.actionPutArea.connect(areaManager.put)
signalManager.actionPostApp.connect(appManager.post)
signalManager.actionDeleteApp.connect(appManager.delete)
signalManager.actionGetListApp.connect(appManager.getList)
signalManager.actionGetApp.connect(appManager.get)
signalManager.actionPutApp.connect(appManager.put)
signalManager.actionGetListPackage.connect(packageManager.getList)
signalManager.actionGetPackage.connect(packageManager.get)
signalManager.actionPostUser.connect(userManager.post)
signalManager.actionDeleteUser.connect(userManager.delete)
signalManager.actionGetListUser.connect(userManager.getList)
signalManager.actionGetUser.connect(userManager.get)
signalManager.actionPutUser.connect(userManager.put)
signalManager.actionPostLogin.connect(loginManager.post)
signalManager.actionGetListLogin.connect(loginManager.getList)
signalManager.actionGetLogin.connect(loginManager.get)
signalManager.actionPostDevice.connect(deviceManager.post)
signalManager.actionDeleteDevice.connect(deviceManager.delete)
signalManager.actionGetListDevice.connect(deviceManager.getList)
signalManager.actionGetDevice.connect(deviceManager.get)
signalManager.actionPutDevice.connect(deviceManager.put)
signalManager.actionDeleteAnnex.connect(annexManager.delete)
signalManager.actionGetListAnnex.connect(annexManager.getList)
signalManager.actionGetAnnex.connect(annexManager.get)
signalManager.actionGetListMonitorWatch.connect(monitorWatchManager.getList)
signalManager.actionGetMonitorWatch.connect(monitorWatchManager.get)
signalManager.actionGetListMonitorSystem.connect(monitorSystemManager.getList)
signalManager.actionGetMonitorSystem.connect(monitorSystemManager.get)
signalManager.actionGetListMonitorLvgl.connect(monitorLvglManager.getList)
signalManager.actionGetMonitorLvgl.connect(monitorLvglManager.get)
signalManager.actionGetListMonitorImage.connect(monitorImageManager.getList)
signalManager.actionGetMonitorImage.connect(monitorImageManager.get)
signalManager.actionGetListMonitorEvm.connect(monitorEvmManager.getList)
signalManager.actionGetMonitorEvm.connect(monitorEvmManager.get)
# file manager api
signalManager.actionGetFileContent.connect(fileManager.content)
signalManager.actionGetFileDisk.connect(fileManager.disk)
signalManager.actionGetFileDown.connect(fileManager.download)
signalManager.actionGetFileInit.connect(fileManager.initialize)
signalManager.actionGetFilePreview.connect(fileManager.preview)
signalManager.actionGetFileTree.connect(fileManager.tree)
'''
Author: your name
Date: 2021-07-11 01:47:14
LastEditTime: 2021-07-12 11:31:33
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\annex.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from datetime import datetime
from application.app import db
from models.annex import AnnexModel
from webcreator.log import logger
from webcreator.response import ResponseCode
class AnnexResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [AnnexModel.is_delete==False, AnnexModel.uuid==uuid]
result = AnnexModel.query.filter(*filters).first()
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params):
# handle business
logger.warn(params)
filters = [AnnexModel.is_delete==False]
result = AnnexModel.query.filter(*filters).order_by(AnnexModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}):
# handle business
result = AnnexModel.query.filter(AnnexModel.app == params.get('app')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False:
return False, ResponseCode.HTTP_INVAILD_REQUEST
result = AnnexModel(**params)
db.session.add(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}):
# handle business
result = AnnexModel.query.filter(AnnexModel.uuid==uuid).first()
if not result:
return None, ResponseCode.HTTP_NOT_FOUND
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
else:
return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}):
# handle business
result = AnnexModel.query.filter(AnnexModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
annexManager = AnnexResource()
\ No newline at end of file
'''
Author: your name
Date: 2021-07-12 11:14:48
LastEditTime: 2021-07-12 11:29:36
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\appi.py
'''
import os
import re
import json
import shutil
from urllib import parse
from datetime import datetime
from application.app import db, config
from models.annex import AnnexModel
from models.app import AppModel
from models.user import UserModel
from models.package import PackageModel
from webcreator.log import logger
from webcreator import utils
from webcreator.utils.epk import EpkApp
from webcreator.response import ResponseCode
class BuildAppResource(object):
def __init__(self):
super().__init__()
def post(self, params, jwt={}):
logger.info(params)
user = UserModel.query.filter(UserModel.id==jwt['id'])
if not user:
return False, ResponseCode.USER_NOT_EXISTS
if params.get("access_key"):
params.pop("access_key")
params.update({
'create_by': user,
'create_at': datetime.now(),
'update_by': user,
'update_at': datetime.now(),
})
app = AppModel(**params)
db.session.add(app)
db.session.commit()
dir_format = "{}-{}-{}".format(app.app_name, app.app_version, datetime.now().strftime("%Y%m%d%H%M%S"))
upload_dir = os.sep.join([config.UPLOAD_ROOT_DIR, "evueapps"])
target_dir = os.sep.join([upload_dir, user.account, dir_format])
dest_dir = os.sep.join([target_dir, "src"])
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
for target_file in params.get('files'):
filename = os.path.basename(target_file)
name, suffix = os.path.splitext(filename)
name = re.sub(r"_\d{14}$", "", name)
dst_file = os.path.normpath(os.sep.join([dest_dir, name + suffix]))
shutil.copy(os.path.normpath(target_file), dst_file)
res = AnnexModel(app=app, title=filename, path=dst_file.replace(config.UPLOAD_ROOT_DIR, ""), size=os.path.getsize(dst_file), create_by=user, create_at=datetime.now(), update_by=user, update_at=datetime.now())
db.session.add(res)
db.session.flush()
db.session.commit()
# 打包成EPK文件
app_info = {}
params = { 'appName': app.app_name, 'appDir': dest_dir, 'appVersion': app.app_version, 'output': target_dir }
if user.role == "administrator" or user.role == "community":
params['algorithm'] = "h"
epk = EpkApp(**params)
app_info = epk.pack()
app_info['md5'] = str(app_info['md5'])
# 更新数据库对应文件路径
# 将文件拷贝过去后,需要重新更新数据库文件记录
epk_path = os.sep.join([target_dir.replace(config.UPLOAD_ROOT_DIR, ""), "{}.epk".format(app.app_name)]).replace('\\', '/')
result = PackageModel.query.filter(PackageModel.app==app.id).one_or_none()
if result:
result.app_path = epk_path
result.app_info = app_info
result.update_by = user
result.update_at = datetime.now()
db.session.commit()
else:
result = PackageModel(app=app.id, file_path=epk_path, package_info=app_info, app_version=params.get("app_version"), source=2, create_by=user, create_at=datetime.now(), update_by=user, update_at=datetime.now())
db.session.add(result)
db.session.commit()
with open(os.sep.join([target_dir, "epk.json"]), "w") as f:
json.dump(app.to_dict(), f)
return { 'app_name': app.app_name, 'app_file': "{}.epk".format(app.app_name), 'app_url': parse.urljoin(config['UPLOAD_SERVER'], epk_path) }, ResponseCode.HTTP_SUCCESS
buildAppResource = BuildAppResource()
from datetime import datetime
from application.app import db
from models.app import AppModel
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class AppResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [AppModel.is_delete==False, AppModel.uuid==uuid]
result = AppModel.query.filter(*filters).first()
if result:
return (True, result)
return (False, result)
def getList(self, params):
# handle business
logger.warn(params)
filters = [AppModel.is_delete==False]
result = AppModel.query.filter(*filters).order_by(AppModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return (True, result.items, result.total)
def post(self, params, jwt={}):
# handle business
result = AppModel.query.filter(AppModel.app_name == params.get('app_name')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
elif result and result.is_delete == False:
return (False, "record code exists")
result = AppModel(**params)
db.session.add(result)
db.session.commit()
return (True, None)
def put(self, uuid, params, jwt={}):
# handle business
result = AppModel.query.filter(AppModel.uuid==uuid).first()
if not result:
return (False, "record not exists")
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
else:
return (False, "params is null")
def delete(self, uuid, jwt={}):
# handle business
result = AppModel.query.filter(AppModel.uuid==uuid).first()
if not result:
return (False, "record not exists")
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return (True, None)
appManager = AppResource()
\ No newline at end of file
from datetime import datetime
from application.app import db
from models.area import AreaModel
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class AreaResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [AreaModel.is_delete==False, AreaModel.uuid==uuid]
result = AreaModel.query.filter(*filters).first()
if result:
return (True, result)
return (False, result)
def getList(self, params):
# handle business
logger.warn(params)
filters = [AreaModel.is_delete==False]
result = AreaModel.query.filter(*filters).order_by(AreaModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return (True, result.items, result.total)
def post(self, params, jwt={}):
# handle business
result = AreaModel.query.filter(AreaModel.areaCode == params.get('areaCode')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
elif result and result.is_delete == False:
return (False, "record code exists")
result = AreaModel(**params)
db.session.add(result)
db.session.commit()
return (True, None)
def put(self, uuid, params, jwt={}):
# handle business
result = AreaModel.query.filter(AreaModel.uuid==uuid).first()
if not result:
return (False, "record not exists")
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
else:
return (False, "params is null")
def delete(self, uuid, jwt={}):
# handle business
result = AreaModel.query.filter(AreaModel.uuid==uuid).first()
if not result:
return (False, "record not exists")
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return (True, None)
areaManager = AreaResource()
\ No newline at end of file
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:06:40
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\area.py
'''
from datetime import datetime
from application.app import db
from models.area import AreaModel
from webcreator.log import logger
from webcreator.response import ResponseCode
class AreaResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [AreaModel.is_delete==False, AreaModel.uuid==uuid]
result = AreaModel.query.filter(*filters).first()
if result:
return result, ResponseCode.HTTP_SUCCESS
return result, ResponseCode.HTTP_NOT_FOUND
def getList(self, params):
# handle business
logger.warn(params)
filters = [AreaModel.is_delete==False]
result = AreaModel.query.filter(*filters).order_by(AreaModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}):
# handle business
result = AreaModel.query.filter(AreaModel.areaCode == params.get('areaCode')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False:
return False, ResponseCode.HTTP_INVAILD_REQUEST
result = AreaModel(**params)
db.session.add(result)
db.session.commit()
return (True, None)
def put(self, uuid, params, jwt={}):
# handle business
result = AreaModel.query.filter(AreaModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
else:
return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}):
# handle business
result = AreaModel.query.filter(AreaModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
areaManager = AreaResource()
'''
Author: your name
Date: 2021-07-11 01:47:14
LastEditTime: 2021-07-12 18:18:21
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\device.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from datetime import datetime
from application.app import db
from models.device import DeviceModel
from webcreator.log import logger
from webcreator.response import ResponseCode
class DeviceResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [DeviceModel.is_delete==False, DeviceModel.uuid==uuid]
result = DeviceModel.query.filter(*filters).first()
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params):
# handle business
logger.warn(params)
filters = [DeviceModel.is_delete==False]
result = DeviceModel.query.filter(*filters).order_by(DeviceModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}):
# handle business
result = DeviceModel.query.filter(DeviceModel.imei==params.get('imei')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False:
return False, ResponseCode.HTTP_INVAILD_REQUEST
result = DeviceModel(**params)
db.session.add(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}):
# handle business
result = DeviceModel.query.filter(DeviceModel.uuid==uuid).first()
if not result:
return None, ResponseCode.HTTP_NOT_FOUND
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
else:
return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}):
# handle business
result = DeviceModel.query.filter(DeviceModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
deviceManager = DeviceResource()
\ No newline at end of file
import pprint
import base64
from pathlib import Path
import json
import mimetypes
from webcreator.log import logger
from application.config import config
from webcreator.response import ResponseCode
disk_root = config.UPLOAD_ROOT_DIR
logger.info(disk_root)
class FileManager(object):
def __init__(self) -> None:
pass
'''
@description: 根据前端传递的路径参数,获取该路径的目录以及文件信息,文件类别,可以看做是一个盘符
@param {*} self
@return {*}
'''
def initialize(self):
'''
disks: {
files: {driver: "local"},
images: {driver: "local"}
}
lang: "en"
leftDisk: null
rightDisk: null
windowsConfig: 2
'''
result = {
"disks": {},
"lang": "zh",
"leftDisk": None,
"rightDisk": None,
"windowsConfig": 1
}
# 这里需要过滤,有些目录只能管理员才能查看
p = Path(disk_root)
for child in p.iterdir():
if child.is_dir():
result["disks"].update({
child.name: { "driver": "local" }
})
return result, ResponseCode.HTTP_SUCCESS
'''
@description: 获取当前类别的目录信息
@param {*} self
@return {*}
'''
def content(self, disk, target_path='/'):
'''
目录信息结构体:
{
basename: "docs"
dirname: ""
path: "docs"
timestamp: 1556821372
type: "dir"
},
{
basename: "cars"
dirname: "wallpapers"
path: "wallpapers/cars"
timestamp: 1544277291
type: "dir"
}
文件信息结构体:
{
basename: "alfa.sql"
dirname: "code"
extension: "sql"
filename: "alfa"
path: "code/alfa.sql"
size: 3208
timestamp: 1544277274
type: "file"
}
'''
target_path = Path(target_path)
result = {
"directories": [],
"files": []
}
disk_path = Path(disk_root).joinpath(disk)
if not disk_path.exists():
return result
target_path = disk_path.joinpath(target_path)
if not target_path.exists():
return result
for child in target_path.iterdir():
if child.is_dir():
result["directories"].append({
"basename": child.name,
"dirname": child.parent.relative_to(disk_path).as_posix(),
"path": child.resolve().relative_to(disk_path).as_posix(),
"timestamp": int(child.stat().st_mtime),
"type": "dir"
})
else:
result["files"].append({
"basename": child.name,
"dirname": child.parent,
"extension": child.suffix[1:],
"filename": child.stem,
"path": child.resolve().relative_to(disk_path).as_posix(),
"size": child.stat().st_size,
"timestamp": int(child.stat().st_mtime),
"type": "file"
})
with open("result.json", "w") as f:
json.dump(result, f)
f.seek(0)
f.truncate()
f.write(json.dumps(result, ensure_ascii=True))
pprint.pprint(result)
return result, ResponseCode.HTTP_SUCCESS
'''
@description: 获取目录结构树
@param {*} self
@return {*}
'''
def tree(self, disk, target_path="/"):
'''
{
basename: "trees"
dirname: "wallpapers/nature"
path: "wallpapers/nature/trees"
props: {
hasSubdirectories: false
}
timestamp: 1544277291
type: "dir"
}
'''
target_path = Path(target_path)
result = []
rp = Path(disk_root)
disk_path = rp / disk
if not disk_path.exists():
return result
temp_path = disk_path.joinpath(target_path)
if not temp_path.exists():
return result
p = Path(disk_path)
for child in p.iterdir():
if child.is_dir():
result.append({
"basename": child.name,
"dirname": child.parent.relative_to(rp).as_posix(),
"path": child.relative_to(rp).as_posix(),
"props": {
"hasSubdirectories": True if child.iterdir() else False
},
"timestamp": int(child.stat().st_mtime),
"type": "dir"
})
pprint.pprint(result)
return result, ResponseCode.HTTP_SUCCESS
def disk(self, disk):
# select-disks
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def upload(self, disk):
# select-disks
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def create_dir(self, disk, target_file):
# create directory
print(disk, target_file)
return True, ResponseCode.HTTP_SUCCESS
def create_file(self, disk, target_file, content):
# create file
print(disk, target_file, content)
return True, ResponseCode.HTTP_SUCCESS
def delete(self, disk):
# delete file
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def copy(self, disk):
# copy file
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def cut(self, disk):
# cut file
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def paste(self, disk):
# paste file
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def download(self, disk, target_file):
# 获取文件内容
if not target_file:
target_file = Path('result.json')
else:
target_file = Path(disk_root).joinpath(disk).joinpath(target_file)
if not target_file.exists():
return False, ResponseCode.HTTP_NOT_FOUND
# with open(target_file.resolve().as_posix(), "r", encoding="utf-8") as f:
# data = f.read()
# logger.info(data)
mime = mimetypes.guess_type(target_file.resolve().as_posix())[0]
content = target_file.read_text(encoding="utf-8")
return (content, mime), ResponseCode.HTTP_SUCCESS
def preview(self, disk, target_file):
# 预览图片
if not target_file:
target_file = Path('evue_photo.png')
else:
target_file = Path(disk_root).joinpath(disk).joinpath(target_file)
if not target_file.exists():
return False, ResponseCode.HTTP_NOT_FOUND
mime = mimetypes.guess_type(target_file.resolve().as_posix())[0]
# mime = MimeTypes.guess_type(target_file.resolve().as_posix())
img_stream = target_file.read_bytes()
# with open(target_file, 'rb') as img_f:
# img_stream = img_f.read()
# img_stream = base64.b64encode(img_stream).decode()
return (img_stream, mime), ResponseCode.HTTP_SUCCESS
fileManager = FileManager()
if __name__ == "__main__":
'''
python -m memory_profiler example.py
'''
# from memory_profiler import profile
# @profile
# def test():
# pass
result = fileManager.initialize()
print("----->", result)
result = fileManager.content("uploads", "evueapps/evm")
print(">>>>>>", result)
result = fileManager.tree("uploads", "evueapps/evm")
print("=====>", result)
result = fileManager.preview("uploads", "evueapps/evm")
print("$$$$$>", result)
from datetime import datetime
from application.app import db
from models.login import LoginModel
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class LoginResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [LoginModel.is_delete==False, LoginModel.uuid==uuid]
result = LoginModel.query.filter(*filters).first()
if result:
return (True, result)
return (False, result)
def getList(self, params):
# handle business
logger.warn(params)
filters = [LoginModel.is_delete==False]
result = LoginModel.query.filter(*filters).order_by(LoginModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return (True, result.items, result.total)
def post(self, params, jwt={}):
# handle business
result = LoginModel.query.filter(LoginModel.user == params.get('user')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
elif result and result.is_delete == False:
return (False, "record code exists")
result = LoginModel(**params)
db.session.add(result)
db.session.commit()
return (True, None)
def put(self, uuid, params, jwt={}):
# handle business
result = LoginModel.query.filter(LoginModel.uuid==uuid).first()
if not result:
return (False, "record not exists")
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
else:
return (False, "params is null")
def delete(self, uuid, jwt={}):
# handle business
result = LoginModel.query.filter(LoginModel.uuid==uuid).first()
if not result:
return (False, "record not exists")
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return (True, None)
loginManager = LoginResource()
\ No newline at end of file
'''
Author: your name
Date: 2021-06-29 19:24:32
LastEditTime: 2021-07-12 12:09:34
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\controller\monitor.py
'''
from application.app import db
from models.monitorEvm import MonitorEvmModel
from models.monitorImage import MonitorImageModel
from models.monitorLvgl import MonitorLvglModel
from models.monitorSystem import MonitorSystemModel
from models.monitorWatch import MonitorWatchModel
class SystemResource(object):
def get(self):
return MonitorSystemModel.query.all()
def post(self, params):
result = MonitorSystemModel(**params)
db.session.add(result)
db.session.commit()
return True
class LvglResource(object):
def get(self):
return MonitorLvglModel.query.all()
def post(self, params):
result = MonitorLvglModel(**params)
db.session.add(result)
db.session.commit()
return True
class EvmResource(object):
def get(self):
return MonitorEvmModel.query.all()
def post(self, params):
result = MonitorEvmModel(**params)
db.session.add(result)
db.session.commit()
return True
class ImageResource(object):
def get(self):
return MonitorImageModel.query.all()
def post(self, params):
result = MonitorImageModel(**params)
db.session.add(result)
db.session.commit()
return True
def post_array(self, array, watch):
t = []
for a in array:
a.update({ "watch": watch })
t.append(**a)
db.session.execute(MonitorImageModel.__table__.insert(), t)
db.session.commit()
return True
systemResource = SystemResource()
lvglResource = LvglResource()
evmResource = EvmResource()
imageResource = ImageResource()
def insert_data(msg):
# 先判断手表imei是否存在,不存在则先注册手表IMEI
watch_id = -1
if msg.get("imei"):
result = MonitorWatchModel.query.filter_by(imei=msg.get("imei")).one_or_none()
if result:
watch_id = result.id
else:
result = MonitorWatchModel.query.filter(MonitorWatchModel.imei==msg.get("imei")).one_or_none()
db.session.add(result)
db.session.commit()
watch_id = result.id
if msg.get("system") or msg.get("request"):
msg.get("system", {}).update({ "watch": watch_id })
msg.get("system").update(msg.get("request", {}))
systemResource.post(msg.get("system"))
if msg.get("lvgl"):
msg.get("lvgl").update({ "watch": watch_id })
lvglResource.post(msg.get("lvgl"))
if msg.get("evm"):
msg.get("evm").update({ "watch": watch_id })
evmResource.post(msg.get("evm"))
if msg.get("image"):
imageResource.post_array(msg.get("image"), watch_id)
def get_watch_list():
result = MonitorWatchModel.query.all()
tmp = []
for item in result:
tmp.append({
'id': item.id,
'imei': item.imei
})
return tmp
def evm_data(watch, start, end):
filters = [MonitorEvmModel.watch==watch]
if start:
filters.append(MonitorEvmModel.timestamp >= start)
if end:
filters.append(MonitorEvmModel.timestamp <= end)
result = MonitorEvmModel.query.filter(*filters).order_by(MonitorEvmModel.timestamp).all()
temp = []
for item in result:
t = item.to_dict()
if t.get("timestamp"):
t.update({ 'timestamp': t.get("timestamp").strftime("%Y-%m-%d %H:%M:%S") })
temp.append(t)
return temp
def lvgl_data(watch, start, end):
filters = [MonitorLvglModel.watch==watch]
if start:
filters.append(MonitorLvglModel.timestamp>=start)
if end:
filters.append(MonitorLvglModel.timestamp<=end)
result = MonitorLvglModel.query.filter(*filters).order_by(MonitorLvglModel.timestamp).all()
temp = []
for item in result:
t = item.to_dict()
if t.get("timestamp"):
t.update({ 'timestamp': t.get("timestamp").strftime("%Y-%m-%d %H:%M:%S") })
temp.append(t)
return temp
def image_data(watch, start, end):
filters = [MonitorImageModel.watch==watch]
if start:
filters.append(MonitorImageModel.timestamp>=start)
if end:
filters.append(MonitorImageModel.timestamp<=end)
result = MonitorImageModel.query.filter(*filters).order_by(MonitorImageModel.timestamp).all()
temp = []
for item in result:
t = item.to_dict()
if t.get("timestamp"):
t.update({ 'timestamp': t.get("timestamp").strftime("%Y-%m-%d %H:%M:%S") })
temp.append(t)
return temp
def get_monitor_list(watch, category, start, end):
# 判断watch是否存在
w = MonitorWatchModel.query.filter(MonitorWatchModel.id==watch).first()
if not w:
return []
if category == "system":
return []
elif category == "image":
return image_data(watch, start, end)
elif category == "lvgl":
return lvgl_data(watch, start, end)
elif category == "evm":
return evm_data(watch, start, end)
else:
return {
'evm': evm_data(watch, start, end),
'lvgl': lvgl_data(watch, start, end),
'image': image_data(watch, start, end)
}
'''
Author: your name
Date: 2021-07-11 01:47:14
LastEditTime: 2021-07-12 18:19:09
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\monitorEvm.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from datetime import datetime
from application.app import db
from models.monitorEvm import MonitorEvmModel
from webcreator.log import logger
from webcreator.response import ResponseCode
class MonitorEvmResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [MonitorEvmModel.is_delete==False, MonitorEvmModel.uuid==uuid]
result = MonitorEvmModel.query.filter(*filters).first()
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params):
# handle business
logger.warn(params)
filters = [MonitorEvmModel.is_delete==False]
result = MonitorEvmModel.query.filter(*filters).order_by(MonitorEvmModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}):
# handle business
result = MonitorEvmModel.query.filter(MonitorEvmModel.watch == params.get('watch')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False:
return False, ResponseCode.HTTP_INVAILD_REQUEST
result = MonitorEvmModel(**params)
db.session.add(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}):
# handle business
result = MonitorEvmModel.query.filter(MonitorEvmModel.uuid==uuid).first()
if not result:
return None, ResponseCode.HTTP_NOT_FOUND
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
else:
return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}):
# handle business
result = MonitorEvmModel.query.filter(MonitorEvmModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
monitorEvmManager = MonitorEvmResource()
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from datetime import datetime
from application.app import db
from models.monitorImage import MonitorImageModel
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class MonitorImageResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [MonitorImageModel.is_delete==False, MonitorImageModel.uuid==uuid]
result = MonitorImageModel.query.filter(*filters).first()
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params):
# handle business
logger.warn(params)
filters = [MonitorImageModel.is_delete==False]
result = MonitorImageModel.query.filter(*filters).order_by(MonitorImageModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}):
# handle business
result = MonitorImageModel.query.filter(MonitorImageModel.watch == params.get('watch')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False:
return False, ResponseCode.HTTP_INVAILD_REQUEST
result = MonitorImageModel(**params)
db.session.add(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}):
# handle business
result = MonitorImageModel.query.filter(MonitorImageModel.uuid==uuid).first()
if not result:
return None, ResponseCode.HTTP_NOT_FOUND
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
else:
return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}):
# handle business
result = MonitorImageModel.query.filter(MonitorImageModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
monitorImageManager = MonitorImageResource()
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from datetime import datetime
from application.app import db
from models.monitorLvgl import MonitorLvglModel
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class MonitorLvglResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [MonitorLvglModel.is_delete==False, MonitorLvglModel.uuid==uuid]
result = MonitorLvglModel.query.filter(*filters).first()
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params):
# handle business
logger.warn(params)
filters = [MonitorLvglModel.is_delete==False]
result = MonitorLvglModel.query.filter(*filters).order_by(MonitorLvglModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}):
# handle business
result = MonitorLvglModel.query.filter(MonitorLvglModel.watch == params.get('watch')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False:
return False, ResponseCode.HTTP_INVAILD_REQUEST
result = MonitorLvglModel(**params)
db.session.add(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}):
# handle business
result = MonitorLvglModel.query.filter(MonitorLvglModel.uuid==uuid).first()
if not result:
return None, ResponseCode.HTTP_NOT_FOUND
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
else:
return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}):
# handle business
result = MonitorLvglModel.query.filter(MonitorLvglModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
monitorLvglManager = MonitorLvglResource()
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from datetime import datetime
from application.app import db
from models.monitorSystem import MonitorSystemModel
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class MonitorSystemResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [MonitorSystemModel.is_delete==False, MonitorSystemModel.uuid==uuid]
result = MonitorSystemModel.query.filter(*filters).first()
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params):
# handle business
logger.warn(params)
filters = [MonitorSystemModel.is_delete==False]
result = MonitorSystemModel.query.filter(*filters).order_by(MonitorSystemModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}):
# handle business
result = MonitorSystemModel.query.filter(MonitorSystemModel.watch == params.get('watch')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False:
return False, ResponseCode.HTTP_INVAILD_REQUEST
result = MonitorSystemModel(**params)
db.session.add(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}):
# handle business
result = MonitorSystemModel.query.filter(MonitorSystemModel.uuid==uuid).first()
if not result:
return None, ResponseCode.HTTP_NOT_FOUND
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
else:
return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}):
# handle business
result = MonitorSystemModel.query.filter(MonitorSystemModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
monitorSystemManager = MonitorSystemResource()
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from datetime import datetime
from application.app import db
from models.monitorWatch import MonitorWatchModel
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class MonitorWatchResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [MonitorWatchModel.is_delete==False, MonitorWatchModel.uuid==uuid]
result = MonitorWatchModel.query.filter(*filters).first()
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params):
# handle business
logger.warn(params)
filters = [MonitorWatchModel.is_delete==False]
result = MonitorWatchModel.query.filter(*filters).order_by(MonitorWatchModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}):
# handle business
result = MonitorWatchModel.query.filter(MonitorWatchModel.imei == params.get('imei')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False:
return False, ResponseCode.HTTP_INVAILD_REQUEST
result = MonitorWatchModel(**params)
db.session.add(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}):
# handle business
result = MonitorWatchModel.query.filter(MonitorWatchModel.uuid==uuid).first()
if not result:
return None, ResponseCode.HTTP_NOT_FOUND
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
else:
return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}):
# handle business
result = MonitorWatchModel.query.filter(MonitorWatchModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
monitorWatchManager = MonitorWatchResource()
\ No newline at end of file
from datetime import datetime
from application.app import db
from models.package import PackageModel
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class PackageResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [PackageModel.is_delete==False, PackageModel.uuid==uuid]
result = PackageModel.query.filter(*filters).first()
if result:
return (True, result)
return (False, result)
def getList(self, params):
# handle business
logger.warn(params)
filters = [PackageModel.is_delete==False]
result = PackageModel.query.filter(*filters).order_by(PackageModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return (True, result.items, result.total)
def post(self, params, jwt={}):
# handle business
result = PackageModel.query.filter(PackageModel.app == params.get('app')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
elif result and result.is_delete == False:
return (False, "record code exists")
result = PackageModel(**params)
db.session.add(result)
db.session.commit()
return (True, None)
def put(self, uuid, params, jwt={}):
# handle business
result = PackageModel.query.filter(PackageModel.uuid==uuid).first()
if not result:
return (False, "record not exists")
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
else:
return (False, "params is null")
def delete(self, uuid, jwt={}):
# handle business
result = PackageModel.query.filter(PackageModel.uuid==uuid).first()
if not result:
return (False, "record not exists")
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return (True, None)
packageManager = PackageResource()
\ No newline at end of file
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:08:22
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\package.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import re
import shutil
from datetime import datetime
from application.app import db, config
from models.annex import AnnexModel
from models.app import AppModel
from models.user import UserModel
from models.package import PackageModel
from webcreator.utils.epk import EpkApp
from webcreator.log import logger
from webcreator.response import ResponseCode
class PackageResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [PackageModel.is_delete==False, PackageModel.uuid==uuid]
result = PackageModel.query.filter(*filters).first()
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params):
# handle business
logger.warn(params)
filters = [PackageModel.is_delete==False]
result = PackageModel.query.filter(*filters).order_by(PackageModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
if result:
return result, ResponseCode.HTTP_SUCCESS
user = UserModel.query.filter(id=params.get('user')).onr_or_none()
if not user:
return False, ResponseCode.USER_NOT_EXISTS
temp = {}
if user.role == "administrator":
temp.update({"is_delete": False})
else:
temp.update({ "create_by": user.id, "is_delete": False })
if "scope_type" in params and params.get("scope_type") == "list":
result = PackageModel.query.filter_by(**temp).order_by(PackageModel.create_at.desc())
temp = []
for item in result:
temp.append({ "name": item.app.app_name, "uuid": str(item.uuid) })
return temp, len(temp), "get build_logs {}.".format("success" if temp else "fail")
result = PackageModel.query.filter_by(**temp).order_by(PackageModel.create_at.desc()).paginate(params.get("pagenum", 1), params.get("pagesize", 10), error_out=False)
if result.total and len(result.items):
temp = []
for item in result.items:
t = item.to_dict()
t.update({
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S") if item.create_at else None,
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S") if item.update_at else None,
})
temp.append(t)
return (temp, result.total), ResponseCode.HTTP_SUCCESS
return result, ResponseCode.HTTP_NO_DATA
def post(self, params, jwt={}):
# 判断用户是否存在
user = UserModel.query.filter(UserModel.id==params.get('user'))
if not user:
return False, ResponseCode.USER_NOT_EXISTS
# 判断app是否存在
app = AppModel.query.filter(AppModel.id==params.get("app"))
if not app:
return False, ResponseCode.HTTP_NOT_FOUND
# 根据应用查找有哪些源文件
source_files = AnnexModel.query.filter(AnnexModel.app==app.id).all()
if not source_files:
return None, ResponseCode.HTTP_NO_DATA
dir_format = "{}-{}-{}".format(app.app_name, app.app_version, datetime.now().strftime("%Y%m%d%H%M%S"))
upload_dir = os.sep.join([config.UPLOAD_ROOT_DIR, "uploads", "evueapps"])
target_dir = os.sep.join([upload_dir, user.account, dir_format])
dest_dir = os.sep.join([target_dir, "src"])
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
app_files = []
for sf in source_files:
target_file = os.sep.join([config.UPLOAD_ROOT_DIR, sf.path])
filename = os.path.basename(target_file)
name, suffix = os.path.splitext(filename)
name = re.sub(r"_\d{14}$", "", name)
dst_file = os.path.normpath(os.sep.join([dest_dir, name + suffix]))
shutil.move(os.path.normpath(target_file), dst_file)
app_files.append([sf.id, dst_file])
# 打包成EPK文件
app_info = {}
params = { 'appName': app.app_name, 'appDir': dest_dir, 'appVersion': app.app_version, 'output': target_dir }
if user.role == "administrator" or user.role == "community":
params['algorithm'] = "h"
epk = EpkApp(**params)
app_info = epk.pack()
if app_info:
app_info['md5'] = str(app_info['md5'])
# 更新数据库对应文件路径
# for sf in source_files:
# for af in app_files:
# if sf.id == af[0]:
# t = os.path.normpath(af[1].replace(config.UPLOAD_ROOT_DIR, "")).replace('\\', '/')
# sf.set(path=t)
# db.session.flush()
# db.session.commit()
epk_path = os.sep.join([target_dir.replace(config.UPLOAD_ROOT_DIR, ""), "{}.epk".format(app.app_name)]).replace('\\', '/')
# handle business
# result = PackageModel.query.filter(PackageModel.app == params.get('app')).first()
# if result and result.is_delete:
# result.is_delete = False
# result.update_by = jwt.get("id", "")
# result.update_date = datetime.now()
# db.session.commit()
# return True, ResponseCode.HTTP_SUCCESS
# elif result and result.is_delete == False:
# return False, ResponseCode.HTTP_INVAILD_REQUEST
result = PackageModel(app=app.id, file_path=epk_path, package_info=app_info, app_version=params.get("app_version"), create_by=user.id, create_at=datetime.now(), update_by=user.id, update_at=datetime.now())
db.session.add(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}):
# handle business
result = PackageModel.query.filter(PackageModel.uuid==uuid).first()
if not result:
return None, ResponseCode.HTTP_NOT_FOUND
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
else:
return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}):
# handle business
result = PackageModel.query.filter(PackageModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
packageManager = PackageResource()
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import json
import traceback
import tempfile
import base64
from hashlib import md5
from application.config import config
from webcreator.log import logger
# 判断目录是否存在,不存在则创建
# if not os.path.exists(os.path.join(config.UPLOAD_ROOT_DIR, config.get("UPLOAD_DIR"))):
# os.makedirs(os.path.join(config.UPLOAD_ROOT_DIR, config.get("UPLOAD_DIR")))
def checkAccess(path):
realpath = os.path.realpath(path)
if not realpath.startswith(config.UPLOAD_ROOT_DIR):
return False
return True
def checkPath(path):
if not path:
return False, {"code": -1, "data": None, "message": "[%s] arg missed!" % path}
fpath = os.path.abspath(os.sep.join(
[os.path.abspath(config.UPLOAD_ROOT_DIR), path]))
if not checkAccess(fpath):
return False, {"code": -1, "data": None, "message": "You have no access to [%s]!" % fpath}
if not os.path.exists(fpath):
return False, {"code": -1, "data": None, "message": "[%s] is not existed!" % fpath}
return True, os.path.abspath(fpath)
def saveToFile(saveFile, content):
try:
tfn = tempfile.mktemp()
tf = open(tfn, 'w+b')
tf.write(content)
tf.close()
os.rename(tfn, saveFile)
return True
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return False
def getFileInfo(infofile):
info = dict()
info.update({
"isfile": os.path.isfile(infofile),
"isdir": os.path.isdir(infofile),
"size": os.path.getsize(infofile),
"atime": os.path.getatime(infofile),
"mtime": os.path.getmtime(infofile),
"ctime": os.path.getctime(infofile),
"name": os.path.basename(infofile)
})
return info
class UploadResource(object):
def __init__(self):
super(UploadResource, self).__init__()
def download(self, data):
obj = json.loads(data)
isAccessed, path = checkPath(obj["path"])
if not isAccessed:
return {"code": -1, "data": None, "message": "invaild access"}
if not os.path.isfile(path):
return {"code": -1, "data": None, "message": "Path [%s] is not a valid file!" % path}
try:
with open(path, "rb") as f:
content = base64.b64encode(f.read())
md5code = md5(content).hexdigest()
return {
"data": {
"content": content,
"md5": md5code,
"filename": os.path.basename(path)
},
"code": 0,
"message": "download file [%s] successfully!" % obj['path']
}
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return {
"data": None,
"code": -1,
"message": "upload file [%s] failed!\n %s" % (obj['path'], repr(e))
}
def delete(self, data):
try:
isAccessed, path = checkPath(data["path"])
if not isAccessed:
return {"code": -1, "data": None, "message": "invaild access"}
if os.path.isfile(path):
os.remove(path)
return {"code": 0, "data": None, "message": "delete file [%s] successfully!" % path}
elif os.path.isdir(path):
os.rmdir(path)
return {"code": 0, "data": None, "message": "delete dir [%s] successfully!" % path}
else:
return {"code": 0, "data": None, "message": "Path [%s] is not a valid file or path!" % path}
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return {"code": -1, "data": None, "message": repr(e)}
def dirlist(self, data):
obj = json.loads(data)
isAccessed, path = checkPath(obj["path"])
if not isAccessed:
return {"code": -1, "data": None, "message": "invaild access"}
result = []
for p in os.listdir(path):
result.append(getFileInfo(os.path.join(config.UPLOAD_ROOT_DIR, p)))
return {"code": 0, "result": result, "message": "Get [%s] successfully!" % path}
def filemd5(self, data):
obj = json.loads(data)
isAccessed, path = checkPath(obj["path"])
if not isAccessed:
return {"code": -1, "data": None, "message": "invaild access"}
if not os.path.isfile(path):
return {"code": -1, "data": None, "message": "Path [%s] is not a valid file!" % path}
with open(path, "rb") as f:
filemd5 = md5(f.read()).hexdigest()
return {"code": 0, "result": filemd5, "message": "Get md5 of [%s] successfully!" % path}
def fileinfo(self, data):
obj = json.loads(data)
isAccessed, path = checkPath(obj["path"])
if not isAccessed:
return {"code": -1, "data": None, "message": "invaild access"}
if not os.path.isfile(path):
return {"code": -1, "data": None, "message": "Path [%s] is not a valid file!" % path}
return {"code": 0, "result": getFileInfo(path), "message": "Get md5 of [%s] successfully!" % path}
uploadResource = UploadResource()
from datetime import datetime
from application.app import db
from models.user import UserModel
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class UserResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [UserModel.is_delete==False, UserModel.uuid==uuid]
result = UserModel.query.filter(*filters).first()
if result:
return (True, result)
return (False, result)
def getList(self, params):
# handle business
logger.warn(params)
filters = [UserModel.is_delete==False]
result = UserModel.query.filter(*filters).order_by(UserModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return (True, result.items, result.total)
def post(self, params, jwt={}):
# handle business
result = UserModel.query.filter(UserModel.app_name == params.get('app_name')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
elif result and result.is_delete == False:
return (False, "record code exists")
result = UserModel(**params)
db.session.add(result)
db.session.commit()
return (True, None)
def put(self, uuid, params, jwt={}):
# handle business
result = UserModel.query.filter(UserModel.uuid==uuid).first()
if not result:
return (False, "record not exists")
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
else:
return (False, "params is null")
def delete(self, uuid, jwt={}):
# handle business
result = UserModel.query.filter(UserModel.uuid==uuid).first()
if not result:
return (False, "record not exists")
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return (True, None)
userManager = UserResource()
\ No newline at end of file
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:08:34
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\user.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from datetime import datetime
from application.app import db
from models.user import UserModel
from webcreator.log import logger
from webcreator.response import ResponseCode
class UserResource(object):
def __init__(self):
super().__init__()
def get(self, uuid, params):
# handle business
filters = [UserModel.is_delete==False, UserModel.uuid==uuid]
result = UserModel.query.filter(*filters).first()
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params):
# handle business
logger.warn(params)
filters = [UserModel.is_delete==False]
result = UserModel.query.filter(*filters).order_by(UserModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}):
# handle business
result = UserModel.query.filter(UserModel.account == params.get('account')).first()
if result and result.is_delete:
result.is_delete = False
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False:
return False, ResponseCode.USER_EXISTS
# 密码使用md5加密,可以使用元编程模式劫持,不用手动一个个修改了
# params.update({ "password": utils.md5_encryption(params.get("password")) })
result = UserModel(**params)
db.session.add(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}):
logger.info(uuid)
logger.info(params)
# handle business
result = UserModel.query.filter(UserModel.uuid==uuid).first()
if not result:
return None, ResponseCode.HTTP_NOT_FOUND
if params:
for key, value in params.items():
if value != None: setattr(result, key, value)
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
else:
return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}):
# handle business
result = UserModel.query.filter(UserModel.uuid==uuid).first()
if not result:
return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
result.is_delete = True
db.session.delete(result)
db.session.commit()
return True, ResponseCode.HTTP_SUCCESS
userManager = UserResource()
This source diff could not be displayed because it is too large. You can view the blob instead.
'''
Author: your name
Date: 2021-06-15 17:40:09
LastEditTime: 2021-06-30 18:09:51
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\manager.py
'''
# -*- coding: utf-8 -*-
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from flask_script import Manager
from flask_migrate import Migrate
from application.app import create_app, db
from application.config import config
# 根据配置初始化app
app = create_app(config)
migrate = Migrate(app, db)
manager = Manager(app)
@manager.command
def run():
"""
生产模式启动命令函数
To use: python3 manager.py run
"""
# app.logger.setLevel(app.config.get('LOG_LEVEL', logging.INFO))
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(3000, address='127.0.0.1', xheaders=True)
IOLoop.instance().start()
@manager.command
def debug():
"""
debug模式启动命令函数
To use: python3 manager.py debug
"""
# app.logger.setLevel(logging.DEBUG)
app.run(debug=True, port=3000, host='127.0.0.1')
if __name__ == '__main__':
manager.run()
'''
Author: your name
Date: 2021-07-11 01:47:14
LastEditTime: 2021-07-12 01:56:38
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\models\annex.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma
from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class AnnexModel(PrimaryModel):
__tablename__ = 'evm_annex'
app = db.Column(db.Integer, nullable = False)
title = db.Column(db.String(100), index = True, nullable = False, default = '')
path = db.Column(db.String(256), index = True, nullable = False, default = '')
size = db.Column(db.Integer, nullable = True, default = 0)
# __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# )
def __init__(self, app, title='', path='', size=0, create_by=None, create_at=None, update_by=None, update_at=None):
self.app = app
self.title = title
self.path = path
self.size = size
self.create_by = create_by
self.create_at = create_at
self.update_by = update_by
self.update_at = update_at
def __repr__(self):
return '<AnnexModel %r>' % (self.app)
def to_dict(self):
return {
'app': self.app,
'title': self.title,
'path': self.path,
'size': self.size,
}
class DeleteAnnexSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = AnnexModel
deleteAnnexSchema = DeleteAnnexSchema()
class GetListAnnexSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = AnnexModel
page = fields.Integer(required=False)
pageSize = fields.Integer(required=False)
title = ma.auto_field()
app = ma.auto_field()
getListAnnexSchema = GetListAnnexSchema()
getListAnnexsSchema = GetListAnnexSchema(many=True)
class GetAnnexSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = AnnexModel
app = ma.auto_field()
getAnnexSchema = GetAnnexSchema()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma
from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class DeviceModel(PrimaryModel):
__tablename__ = 'evm_device'
imei = db.Column(db.String(20), index = True, nullable = False)
name = db.Column(db.String(20), index = True, nullable = False, default = '')
type = db.Column(db.String(20), nullable = False, default = '')
desc = db.Column(db.String(20), index = True, nullable = False, default = '')
# __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# )
def __init__(self, imei, name='', type='', desc=''):
self.imei = imei
self.name = name
self.type = type
self.desc = desc
def __repr__(self):
return '<DeviceModel %r>' % (self.imei)
def to_dict(self):
return {
'imei': self.imei,
'name': self.name,
'type': self.type,
'desc': self.desc,
}
class PostDeviceSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = DeviceModel
imei = ma.auto_field()
name = ma.auto_field()
type = ma.auto_field()
desc = ma.auto_field()
postDeviceSchema = PostDeviceSchema()
class DeleteDeviceSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = DeviceModel
deleteDeviceSchema = DeleteDeviceSchema()
class GetListDeviceSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = DeviceModel
page = fields.Integer(required=False)
pageSize = fields.Integer(required=False)
imei = ma.auto_field()
name = ma.auto_field()
getListDeviceSchema = GetListDeviceSchema()
getListDevicesSchema = GetListDeviceSchema(many=True)
class GetDeviceSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = DeviceModel
imei = ma.auto_field()
name = ma.auto_field()
type = ma.auto_field()
getDeviceSchema = GetDeviceSchema()
class PutDeviceSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = DeviceModel
imei = fields.String(required=False, length=None)
name = fields.String(required=False, length=None)
type = fields.String(required=False, length=None)
desc = fields.String(required=False, length=None)
putDeviceSchema = PutDeviceSchema()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma
from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class MonitorEvmModel(PrimaryModel):
__tablename__ = 'evm_monitor_evm'
watch = db.Column(db.Integer, nullable = False)
heap_map_size = db.Column(db.Integer, nullable = True, default = 0)
heap_total_size = db.Column(db.Integer, nullable = False, default = 0)
heap_used_size = db.Column(db.Integer, nullable = True, default = 0)
stack_total_size = db.Column(db.Integer, nullable = True, default = 0)
stack_used_size = db.Column(db.Integer, nullable = False, default = 0)
# __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# )
def __init__(self, watch, heap_map_size=0, heap_total_size=0, heap_used_size=0, stack_total_size=0, stack_used_size=0):
self.watch = watch
self.heap_map_size = heap_map_size
self.heap_total_size = heap_total_size
self.heap_used_size = heap_used_size
self.stack_total_size = stack_total_size
self.stack_used_size = stack_used_size
def __repr__(self):
return '<MonitorEvmModel %r>' % (self.watch)
def to_dict(self):
return {
'watch': self.watch,
'heap_map_size': self.heap_map_size,
'heap_total_size': self.heap_total_size,
'heap_used_size': self.heap_used_size,
'stack_total_size': self.stack_total_size,
'stack_used_size': self.stack_used_size,
}
class GetListMonitorEvmSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = MonitorEvmModel
page = fields.Integer(required=False)
pageSize = fields.Integer(required=False)
watch = ma.auto_field()
getListMonitorEvmSchema = GetListMonitorEvmSchema()
getListMonitorEvmsSchema = GetListMonitorEvmSchema(many=True)
class GetMonitorEvmSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = MonitorEvmModel
watch = ma.auto_field()
getMonitorEvmSchema = GetMonitorEvmSchema()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma
from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class MonitorImageModel(PrimaryModel):
__tablename__ = 'evm_monitor_image'
watch = db.Column(db.Integer, nullable = False)
length = db.Column(db.Integer, nullable = True, default = 0)
png_uncompressed_size = db.Column(db.Integer, nullable = False, default = 0)
png_total_count = db.Column(db.Integer, nullable = True, default = 0)
png_file_size = db.Column(db.Integer, nullable = True, default = 0)
uri = db.Column(db.String(20), index = True, nullable = False, default = '')
# __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# )
def __init__(self, watch, length=0, png_uncompressed_size=0, png_total_count=0, png_file_size=0, uri=''):
self.watch = watch
self.length = length
self.png_uncompressed_size = png_uncompressed_size
self.png_total_count = png_total_count
self.png_file_size = png_file_size
self.uri = uri
def __repr__(self):
return '<MonitorImageModel %r>' % (self.watch)
def to_dict(self):
return {
'watch': self.watch,
'length': self.length,
'png_uncompressed_size': self.png_uncompressed_size,
'png_total_count': self.png_total_count,
'png_file_size': self.png_file_size,
'uri': self.uri,
}
class GetListMonitorImageSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = MonitorImageModel
page = fields.Integer(required=False)
pageSize = fields.Integer(required=False)
watch = ma.auto_field()
getListMonitorImageSchema = GetListMonitorImageSchema()
getListMonitorImagesSchema = GetListMonitorImageSchema(many=True)
class GetMonitorImageSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = MonitorImageModel
watch = ma.auto_field()
getMonitorImageSchema = GetMonitorImageSchema()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma
from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class MonitorLvglModel(PrimaryModel):
__tablename__ = 'evm_monitor_lvgl'
watch = db.Column(db.Integer, nullable = False)
total_size = db.Column(db.Integer, nullable = True, default = 0)
free_cnt = db.Column(db.Integer, nullable = False, default = 0)
free_size = db.Column(db.Integer, nullable = True, default = 0)
free_biggest_size = db.Column(db.Integer, nullable = False, default = 0)
used_cnt = db.Column(db.Integer, nullable = False, default = 0)
used_pct = db.Column(db.Integer, nullable = False, default = 0)
frag_pct = db.Column(db.Integer, nullable = False, default = 0)
# __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# )
def __init__(self, watch, total_size=0, free_cnt=0, free_size=0, free_biggest_size=0, used_cnt=0, used_pct=0, frag_pct=0):
self.watch = watch
self.total_size = total_size
self.free_cnt = free_cnt
self.free_size = free_size
self.free_biggest_size = free_biggest_size
self.used_cnt = used_cnt
self.used_pct = used_pct
self.frag_pct = frag_pct
def __repr__(self):
return '<MonitorLvglModel %r>' % (self.watch)
def to_dict(self):
return {
'watch': self.watch,
'total_size': self.total_size,
'free_cnt': self.free_cnt,
'free_size': self.free_size,
'free_biggest_size': self.free_biggest_size,
'used_cnt': self.used_cnt,
'used_pct': self.used_pct,
'frag_pct': self.frag_pct,
}
class GetListMonitorLvglSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = MonitorLvglModel
page = fields.Integer(required=False)
pageSize = fields.Integer(required=False)
watch = ma.auto_field()
getListMonitorLvglSchema = GetListMonitorLvglSchema()
getListMonitorLvglsSchema = GetListMonitorLvglSchema(many=True)
class GetMonitorLvglSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = MonitorLvglModel
watch = ma.auto_field()
getMonitorLvglSchema = GetMonitorLvglSchema()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma
from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class MonitorSystemModel(PrimaryModel):
__tablename__ = 'evm_monitor_system'
watch = db.Column(db.Integer, nullable = False)
free_size = db.Column(db.Integer, nullable = True, default = 0)
host = db.Column(db.String(20), index = True, nullable = False, default = '')
path = db.Column(db.String(20), index = True, nullable = False, default = '')
protocol = db.Column(db.String(20), index = True, nullable = False, default = '')
# __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# )
def __init__(self, watch, free_size=0, host='', path='', protocol=''):
self.watch = watch
self.free_size = free_size
self.host = host
self.path = path
self.protocol = protocol
def __repr__(self):
return '<MonitorSystemModel %r>' % (self.watch)
def to_dict(self):
return {
'watch': self.watch,
'free_size': self.free_size,
'host': self.host,
'path': self.path,
'protocol': self.protocol,
}
class GetListMonitorSystemSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = MonitorSystemModel
page = fields.Integer(required=False)
pageSize = fields.Integer(required=False)
watch = ma.auto_field()
getListMonitorSystemSchema = GetListMonitorSystemSchema()
getListMonitorSystemsSchema = GetListMonitorSystemSchema(many=True)
class GetMonitorSystemSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = MonitorSystemModel
watch = ma.auto_field()
getMonitorSystemSchema = GetMonitorSystemSchema()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma
from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class MonitorWatchModel(PrimaryModel):
__tablename__ = 'evm_monitor_watch'
imei = db.Column(db.String(20), index = True, nullable = False, default = '')
# __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# )
def __init__(self, imei=''):
self.imei = imei
def __repr__(self):
return '<MonitorWatchModel %r>' % (self.imei)
def to_dict(self):
return {
'imei': self.imei,
}
class GetListMonitorWatchSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = MonitorWatchModel
page = fields.Integer(required=False)
pageSize = fields.Integer(required=False)
imei = ma.auto_field()
getListMonitorWatchSchema = GetListMonitorWatchSchema()
getListMonitorWatchsSchema = GetListMonitorWatchSchema(many=True)
class GetMonitorWatchSchema(ma.SQLAlchemySchema):
class Meta:
# unknown = INCLUDE # 未知字段默认包含
unknown = EXCLUDE # 未知字段默认排除
model = MonitorWatchModel
imei = ma.auto_field()
getMonitorWatchSchema = GetMonitorWatchSchema()
{"directories": [{"basename": "evue_launcher-1.0-20210420145404", "dirname": "evueapps/evm", "path": "evueapps/evm/evue_launcher-1.0-20210420145404", "timestamp": 1618901645, "type": "dir"}], "files": []}
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from application.signal_manager import signalManager
from models.annex import deleteAnnexSchema, getListAnnexSchema, getListAnnexsSchema, getAnnexSchema
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class AnnexResourceList(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
logger.warn(json_payload)
data = getListAnnexSchema.load(json_payload)
result, message = signalManager.actionGetListAnnex.emit(data)
json_dumps = getListAnnexSchema.dump(result)
if result:
json_dumps = getListAnnexsSchema.dump(result.items)
logger.warn(json_dumps)
return response_result(message, data=json_dumps, count=result.total)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
class AnnexResource(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self, uuid):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = getAnnexSchema.load(json_payload)
result, message = signalManager.actionGetAnnex.emit(uuid, data)
if result:
json_dumps = getAnnexSchema.dump(result)
return response_result(message, data=json_dumps)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"])
def delete(self, uuid):
try:
json_payload = request.json
print("========>", uuid, json_payload)
# data = deleteAnnexSchema.load(json_payload)
result, message = signalManager.actionDeleteAnnex.emit(uuid)
return response_result(message, data=result)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from application.signal_manager import signalManager
from models.device import postDeviceSchema, deleteDeviceSchema, getListDeviceSchema, getListDevicesSchema, getDeviceSchema, putDeviceSchema
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class DeviceResourceList(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
logger.warn(json_payload)
data = getListDeviceSchema.load(json_payload)
result, message = signalManager.actionGetListDevice.emit(data)
json_dumps = getListDeviceSchema.dump(result)
if result:
json_dumps = getListDevicesSchema.dump(result.items)
logger.warn(json_dumps)
return response_result(message, data=json_dumps, count=result.total)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"])
def post(self):
try:
json_payload = request.json
data = postDeviceSchema.load(json_payload)
result, message = signalManager.actionPostDevice.emit(data)
logger.info(result)
logger.warn(message)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
class DeviceResource(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self, uuid):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = getDeviceSchema.load(json_payload)
result, message = signalManager.actionGetDevice.emit(uuid, data)
if result:
json_dumps = getDeviceSchema.dump(result)
return response_result(message, data=json_dumps)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"])
def put(self, uuid):
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = putDeviceSchema.load(json_payload)
result, message = signalManager.actionPutDevice.emit(uuid, data)
logger.info(result)
logger.info(message)
return response_result(message, data=result)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"])
def delete(self, uuid):
try:
json_payload = request.json
print("========>", uuid, json_payload)
# data = deleteDeviceSchema.load(json_payload)
result, message = signalManager.actionDeleteDevice.emit(uuid)
return response_result(message, data=result)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
'''
Author: your name
Date: 2021-07-09 12:39:40
LastEditTime: 2021-07-09 12:40:18
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\views\file.py
'''
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from application.signal_manager import signalManager
from models.login import postLoginSchema, getListLoginSchema, getListLoginsSchema, getLoginSchema
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class FileResourceList(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
logger.warn(json_payload)
data = getListLoginSchema.load(json_payload)
result = signalManager.actionGetListLogin.emit(data)
json_dumps = getListLoginSchema.dump(result)
if result[0]:
json_dumps = getListLoginsSchema.dump(result[1])
logger.warn(json_dumps)
return response_result(ResponseCode.OK, data=json_dumps, count=result[2])
return response_result(ResponseCode.REQUEST_ERROR)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR)
def post(self):
try:
json_payload = request.json
data = postLoginSchema.load(json_payload)
result = signalManager.actionPostLogin.emit(data)
if result[0] == False:
# json_dumps = postLoginSchema.dump(result)
return response_result(ResponseCode.REQUEST_ERROR, msg=result[1])
logger.warn(result)
return response_result(ResponseCode.OK)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR)
class FileResource(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self, uuid):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = getLoginSchema.load(json_payload)
result = signalManager.actionGetLogin.emit(uuid, data)
if result[0]:
json_dumps = getLoginSchema.dump(result[1])
return response_result(ResponseCode.OK, data=json_dumps)
return response_result(ResponseCode.NO_DATA)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR)
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:10:44
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\views\login.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from marshmallow.exceptions import ValidationError
from application.signal_manager import signalManager
from models.login import postLoginSchema, getListLoginSchema, getListLoginsSchema, getLoginSchema
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class LoginResourceList(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
logger.warn(json_payload)
data = getListLoginSchema.load(json_payload)
result, message = signalManager.actionGetListLogin.emit(data)
json_dumps = getListLoginSchema.dump(result)
if result:
json_dumps = getListLoginsSchema.dump(result.items)
return response_result(message, data=json_dumps, count=result.total)
return response_result(message)
except ValidationError as e:
return response_result(ResponseCode.HTTP_INVAILD_REQUEST, data=e.messages)
except Exception as e:
data = None
if hasattr(e, 'args'):
data = e.args
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR, data=data)
def post(self):
try:
json_payload = request.json
data = postLoginSchema.load(json_payload)
# 更新data,插入ip信息,如果没有转发ip,那么则获取请求ip
data.update({ "ip": request.headers.get('X-Forwarded-For', request.remote_addr), "user_agent": request.headers.get('User-Agent', "") })
result, message = signalManager.actionPostLogin.emit(data)
return response_result(message, data=result)
except ValidationError as e:
return response_result(ResponseCode.HTTP_INVAILD_REQUEST, data=e.messages)
except Exception as e:
data = None
if hasattr(e, 'args'):
data = e.args
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR, data=data)
class LoginResource(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self, uuid):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = getLoginSchema.load(json_payload)
result, message = signalManager.actionGetLogin.emit(uuid, data)
if result:
json_dumps = getLoginSchema.dump(result)
return response_result(message, data=json_dumps)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from application.signal_manager import signalManager
from models.monitorEvm import getListMonitorEvmSchema, getListMonitorEvmsSchema, getMonitorEvmSchema
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class MonitorEvmResourceList(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
logger.warn(json_payload)
data = getListMonitorEvmSchema.load(json_payload)
result, message = signalManager.actionGetListMonitorEvm.emit(data)
json_dumps = getListMonitorEvmSchema.dump(result)
if result:
json_dumps = getListMonitorEvmsSchema.dump(result.items)
logger.warn(json_dumps)
return response_result(message, data=json_dumps, count=result.total)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
class MonitorEvmResource(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self, uuid):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = getMonitorEvmSchema.load(json_payload)
result, message = signalManager.actionGetMonitorEvm.emit(uuid, data)
if result:
json_dumps = getMonitorEvmSchema.dump(result)
return response_result(message, data=json_dumps)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from application.signal_manager import signalManager
from models.monitorImage import getListMonitorImageSchema, getListMonitorImagesSchema, getMonitorImageSchema
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class MonitorImageResourceList(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
logger.warn(json_payload)
data = getListMonitorImageSchema.load(json_payload)
result, message = signalManager.actionGetListMonitorImage.emit(data)
json_dumps = getListMonitorImageSchema.dump(result)
if result:
json_dumps = getListMonitorImagesSchema.dump(result.items)
logger.warn(json_dumps)
return response_result(message, data=json_dumps, count=result.total)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
class MonitorImageResource(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self, uuid):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = getMonitorImageSchema.load(json_payload)
result, message = signalManager.actionGetMonitorImage.emit(uuid, data)
if result:
json_dumps = getMonitorImageSchema.dump(result)
return response_result(message, data=json_dumps)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from application.signal_manager import signalManager
from models.monitorLvgl import getListMonitorLvglSchema, getListMonitorLvglsSchema, getMonitorLvglSchema
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class MonitorLvglResourceList(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
logger.warn(json_payload)
data = getListMonitorLvglSchema.load(json_payload)
result, message = signalManager.actionGetListMonitorLvgl.emit(data)
json_dumps = getListMonitorLvglSchema.dump(result)
if result:
json_dumps = getListMonitorLvglsSchema.dump(result.items)
logger.warn(json_dumps)
return response_result(message, data=json_dumps, count=result.total)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
class MonitorLvglResource(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self, uuid):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = getMonitorLvglSchema.load(json_payload)
result, message = signalManager.actionGetMonitorLvgl.emit(uuid, data)
if result:
json_dumps = getMonitorLvglSchema.dump(result)
return response_result(message, data=json_dumps)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from application.signal_manager import signalManager
from models.monitorSystem import getListMonitorSystemSchema, getListMonitorSystemsSchema, getMonitorSystemSchema
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class MonitorSystemResourceList(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
logger.warn(json_payload)
data = getListMonitorSystemSchema.load(json_payload)
result, message = signalManager.actionGetListMonitorSystem.emit(data)
json_dumps = getListMonitorSystemSchema.dump(result)
if result:
json_dumps = getListMonitorSystemsSchema.dump(result.items)
logger.warn(json_dumps)
return response_result(message, data=json_dumps, count=result.total)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
class MonitorSystemResource(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self, uuid):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = getMonitorSystemSchema.load(json_payload)
result, message = signalManager.actionGetMonitorSystem.emit(uuid, data)
if result:
json_dumps = getMonitorSystemSchema.dump(result)
return response_result(message, data=json_dumps)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from application.signal_manager import signalManager
from models.monitorWatch import getListMonitorWatchSchema, getListMonitorWatchsSchema, getMonitorWatchSchema
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class MonitorWatchResourceList(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
logger.warn(json_payload)
data = getListMonitorWatchSchema.load(json_payload)
result, message = signalManager.actionGetListMonitorWatch.emit(data)
json_dumps = getListMonitorWatchSchema.dump(result)
if result:
json_dumps = getListMonitorWatchsSchema.dump(result.items)
logger.warn(json_dumps)
return response_result(message, data=json_dumps, count=result.total)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
class MonitorWatchResource(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self, uuid):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = getMonitorWatchSchema.load(json_payload)
result, message = signalManager.actionGetMonitorWatch.emit(uuid, data)
if result:
json_dumps = getMonitorWatchSchema.dump(result)
return response_result(message, data=json_dumps)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:11:10
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\views\package.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from application.signal_manager import signalManager
from models.package import getListPackageSchema, getListPackagesSchema, getPackageSchema
from webcreator.log import logger
from webcreator.response import ResponseCode, response_result
class PackageResourceList(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
logger.warn(json_payload)
data = getListPackageSchema.load(json_payload)
result, message = signalManager.actionGetListPackage.emit(data)
json_dumps = getListPackageSchema.dump(result)
if result:
json_dumps = getListPackagesSchema.dump(result.items)
logger.warn(json_dumps)
return response_result(message, data=json_dumps, count=result.total)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
class PackageResource(Resource):
def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self, uuid):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1)
# self.parser.add_argument("pageSize", type=int, location="args", default=15)
# args = self.parser.parse_args()
try:
json_payload = request.json
print("========>", uuid, json_payload)
data = getPackageSchema.load(json_payload)
result, message = signalManager.actionGetPackage.emit(uuid, data)
if result:
json_dumps = getPackageSchema.dump(result)
return response_result(message, data=json_dumps)
return response_result(message)
except Exception as e:
current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR)
'''
Author: your name
Date: 2021-06-15 17:40:14
LastEditTime: 2021-06-30 17:22:44
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\webcreator\event.py
'''
# -*- coding: utf_8 -*-
class PySignal(object):
"""
Simple event class used to provide hooks for different types of events in Locust.
Here's how to use the EventHook class::
my_event = PySignal()
def on_my_event(a, b, **kw):
print "Event was fired with arguments: %s, %s" % (a, b)
my_event += on_my_event
my_event.fire(a="foo", b="bar")
my_event.emit(a="foo", b="bar")
"""
def __init__(self):
self._handlers = []
def __iadd__(self, handler):
return self.connect(handler)
def __isub__(self, handler):
return self.disconnect(handler)
def connect(self, handler):
self._handlers.append(handler)
return self
def disconnect(self, handler):
self._handlers.remove(handler)
return self
def fire(self, *args, **kwargs):
return self.emit(*args, **kwargs)
def emit(self, *args, **kwargs):
rets = {}
for handler in self._handlers:
ret = handler(*args, **kwargs)
rets[handler.__name__] = ret
if len(rets) == 1:
return list(rets.values())[0] # list()用来兼容python3
return rets
if __name__ == '__main__':
my_event = PySignal()
def on_my_event(a, b, **kw):
print(a, b)
print(kw)
my_event.connect(on_my_event)
my_event.fire(1, 2, c="foo", d="bar")
my_event.emit(3, 4, e="foo", f="bar")
'''
Author: your name
Date: 2021-04-22 18:04:15
LastEditTime: 2021-07-09 00:52:08
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\webcreator\log.py
'''
# -*- coding: utf_8 -*-
import os
import logging
from logging.handlers import RotatingFileHandler
logPath = os.getcwd() + os.path.sep + "logs"
if not os.path.exists(logPath):
os.makedirs(logPath)
fh = RotatingFileHandler("logs/running.log", maxBytes=10 * 1024 * 1024, backupCount=100)
fh.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s][%(levelname)7s][in %(pathname)s -> %(funcName)s line:%(lineno)s] %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger = logging.root
logger.setLevel(logging.DEBUG)
logger.addHandler(fh)
logger.addHandler(ch)
'''
Author: your name
Date: 2021-04-29 12:12:01
LastEditTime: 2021-07-12 00:56:10
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\backend\utils\ccode.py
'''
# -*- coding: utf-8 -*-
import sys
header = \
u'''
/****************************************************************************
**
** Copyright (C) 2021 @scriptiot
**
** EVM是一款通用化设计的虚拟机引擎,拥有语法解析前端接口、编译器、虚拟机和虚拟机扩展接口框架。
** 支持js、python、qml、lua等多种脚本语言,纯C开发,零依赖,支持主流 ROM > 50KB, RAM > 2KB的MCU;
** 自带垃圾回收(GC)先进的内存管理,采用最复杂的压缩算法,无内存碎片(大部分解释器都存在内存碎片)
** Version : 3.0
** Email : scriptiot@aliyun.com
** Website : https://github.com/scriptiot
** Licence: MIT Licence
****************************************************************************/
'''
def cstr_encode(text, splitLines=True, escapePercent=False):
output = "\""
count = len(text)
for i in range(count):
if text[i] == '\f':
output += "\\f"
elif text[i] == '\n':
if splitLines:
output += "\\n\"\n\""
else:
output += "\\n";
elif text[i] == '\r':
output += "\\r"
elif text[i] == '\t':
output += "\\t"
elif text[i] == '\"':
output += "\\\""
elif text[i] == '\\':
output += "\\\\"
elif text[i] == '%':
if escapePercent:
output += "%%"
else:
output += "%"
else:
output += text[i]
output += "\""
return output
def convert(fpath):
with open(fpath, "r") as f:
content = f.read()
ret = cstr_encode(content)
ccode = "%s\nconst char * appjs_content=\\\n%s;" % (header, ret)
with open("appjs.c", "w", encoding="utf-8") as f:
f.write(ccode)
return ccode
def convert_string(string):
return "%s\nconst char * appjs_content=\\\n%s;" % (header, cstr_encode(string))
if __name__ == '__main__':
ret = convert(sys.argv[1])
print(ret)
#-*- coding: UTF-8 -*-
#!/usr/bin/python
import os
import sys
import fs
import struct
import json
from collections import OrderedDict
import zlib
import pprint
import hashlib
from ctypes import *
import platform
lib_path = os.path.dirname(os.path.abspath(__file__))
if platform.system() == 'Windows':
pDll = CDLL(os.sep.join([lib_path, "lib", "eheatshrink.dll"]))
elif platform.system() == 'Linux':
pDll = CDLL(os.sep.join([lib_path, "lib", "libeheatshrink.so"]))
pDll.ecompress_size.restype = c_uint32
pDll.ecompress_size.argtypes = [c_void_p, c_uint32]
pDll.ecompress.restype = POINTER(c_uint8)
pDll.ecompress.argtypes = [c_void_p, c_uint32]
def heatshrink_compress(buf:bytes, level:int):
count = len(buf)
size = pDll.ecompress_size(buf, count)
pDll.ecompress.restype = POINTER(c_uint8)
pDll.ecompress.argtypes = [c_void_p, c_uint32]
ret = pDll.ecompress(buf, count)
arr = bytearray(size)
i = 0
while i < size:
arr[i] = ret[i]
i = i+1
return arr
def str_to_hex(s):
return ' '.join([hex(ord(c)).replace('0x', '') for c in s])
def hex_to_str(s):
return ''.join([chr(i) for i in [int(b, 16) for b in s.split(' ')]])
def str_to_bin(s):
return ' '.join([bin(ord(c)).replace('0b', '') for c in s])
def bin_to_str(s):
return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])
def eprint(*args, **kwargs):
# print(*args, **kwargs)
pass
class EpkApp(object):
def __init__(self, appName, appDir, algorithm='zlib',appVersion="1.0", output="epks"):
super(EpkApp, self).__init__()
self._appName = appName
self._appDir = os.path.abspath(appDir)
self.algorithm = algorithm
eprint(sys.argv)
eprint(appName)
eprint(appDir)
eprint(self._appDir)
self._appVersion = appVersion
self._appCRCCode = None
self._files = []
self._infoPath = os.sep.join([self._appDir, "%s.json" % self._appName])
self._epksDir = output
if not os.path.exists(self._epksDir):
fs.open_fs(os.getcwd()).makedirs(output)
self._epkName = os.sep.join([self._epksDir, "%s.epk" % self._appName])
def compress(self):
if self.algorithm == 'h':
return heatshrink_compress
return zlib.compress
def epkInfo(self):
epkInfo = OrderedDict({
"appName": self._appName,
"appVersion": self._appVersion,
"files": self.fileinfos(self._appDir),
})
infocontent = json.dumps(epkInfo)
with open(self._infoPath, "w", encoding='utf-8') as f:
f.write(infocontent)
return epkInfo
def fileinfos(self, path):
path = os.path.abspath(path)
home_fs = fs.open_fs(path)
files = []
for jspath in home_fs.glob('*', namespaces=['details']):
fpath = "C:/%s" % jspath.info.name
fname = jspath.info.name
fsize = jspath.info.size
fbasename, fext = os.path.splitext(jspath.info.name)
if fext in ["", ".exe", ".dll", ".nv", ".conf"]:
continue
finfo = {
"path": fpath,
"name": fname,
"size": fsize,
"basename": fbasename,
"ext": fext
}
if self._infoPath == os.sep.join([path, fname]):
eprint(finfo)
files.insert(0, finfo)
else:
files.append(finfo)
if fext == ".evue":
self.fileMD5(finfo)
return files
def header(self, epk_start=0xAA, md5_offset=0, file_count=0):
if self.algorithm == 'zlib':
bytes_header = struct.pack("<BBLH", epk_start, 1 ,md5_offset, file_count)
else:
bytes_header = struct.pack("<BBLH", epk_start, 2 ,md5_offset, file_count)
return bytes_header
def fileMD5(self, info):
md5path = os.sep.join([self._appDir, "%s.md5" % info["basename"]])
fpath = os.sep.join([self._appDir, info["name"]])
with open(fpath, "rb") as f:
filecontent = f.read()
newmd5 = self.md5(filecontent)
with open(md5path, "wb") as f:
f.write(newmd5)
return newmd5
def sign(self, content):
ret = b""
for i in range(int(len(content) / 2 )):
ret += struct.pack("<B", int("0x%s" % (content[i*2:i*2+2]), 16))
ret = ret + b'EVM is NB ++!'
return ret
def md5(self, filecontent):
newmd5 = ''
content = filecontent
for i in range(3):
md5 = hashlib.md5() #获取一个md5加密算法对象
md5.update(content) #指定需要加密的字符串
newmd5 = md5.hexdigest() #获取加密后的16进制字符串
eprint("md5 == ",newmd5)
content = self.sign(newmd5)
ret = b""
for i in range(int(len(newmd5) / 2 )):
ret += struct.pack("<B", int("0x%s" % (newmd5[i*2:i*2+2]), 16))
return ret
def packFile(self, info, level=9):
fname = info["name"]
fpath = os.sep.join([self._appDir, fname])
fext = info["ext"]
fileBytes = b""
if fext == "md5":
fileBytes += struct.pack("<B", 1)
else:
fileBytes += struct.pack("<B", 2)
_name = fname + "\0"
fileBytes += struct.pack("<B", len(_name))
fileBytes += struct.pack("<%ds" % len(_name), fname.encode("utf-8"))
with open(fpath, "rb") as fc:
fileContentBytes = fc.read()
eprint(info["name"])
eprint(len(fileContentBytes))
fileBytes += struct.pack("<L", len(fileContentBytes))
if fext == "md5":
fileCompressBytes = fileContentBytes
else:
fileCompressBytes = self.compress()(fileContentBytes, level)
eprint("===",fileCompressBytes[0])
eprint(fileCompressBytes)
fileBytes += struct.pack("<L", len(fileCompressBytes))
eprint(fileBytes)
fileBytes += fileCompressBytes
return fileBytes
def pack(self, level=9):
for i in range(10):
infos = self.epkInfo()
# infos = self.epkInfo()
# infos = self.epkInfo()
epkFileBytes = b""
ret = None
epkFileContentBytes = b""
file_count = len(infos["files"])
with open(self._epkName, "wb") as f:
for info in infos["files"]:
epkFileContentBytes += self.packFile(info)
epkFileContentLength = len(epkFileContentBytes)
epkFileBytes += self.header(md5_offset= 8 + epkFileContentLength, file_count=file_count)
epkFileBytes += epkFileContentBytes
epkmd5Bytes = self.md5(epkFileBytes)
epkFileBytes += struct.pack("<H", len(epkmd5Bytes))
epkFileBytes += epkmd5Bytes
crcBytes = zlib.crc32(epkFileBytes)
epkFileBytes += struct.pack("<L", crcBytes)
f.write(epkFileBytes)
ret = {
"epkfile": self._epkName,
"epk_filecontent_size": epkFileContentLength,
"md5_offset": 10 + epkFileContentLength,
"file_count": file_count,
"md5_length": len(epkmd5Bytes),
"md5": epkmd5Bytes,
"raw_crc": hex(crcBytes),
"compress_level": level,
"buff_length": len(epkFileBytes)
}
pprint.pprint(ret)
return ret
def main(path, appName, algorithm):
epk = EpkApp(appName, path, algorithm)
epk.pack()
if __name__ == '__main__':
main(sys.argv[1], sys.argv[2], sys.argv[3])
#-*- coding: UTF-8 -*-
#!/usr/bin/python
import os
import sys
import fs
import struct
import json
from collections import OrderedDict
import zlib
import pprint
import hashlib
from ctypes import *
import platform
current_abspath = os.path.dirname(os.path.realpath(__file__))
if platform.system() == 'Windows':
pDll = CDLL(os.sep.join([current_abspath, "lib", "eheatshrink.dll"]))
elif platform.system() == 'Linux':
pDll = CDLL(os.sep.join([current_abspath, "lib", "libeheatshrink.so"]))
pDll.ecompress_size.restype = c_uint32
pDll.ecompress_size.argtypes = [c_void_p, c_uint32]
pDll.ecompress.restype = POINTER(c_uint8)
pDll.ecompress.argtypes = [c_void_p, c_uint32]
def heatshrink_compress(buf:bytes, level:int):
count = len(buf)
size = pDll.ecompress_size(buf, count)
pDll.ecompress.restype = POINTER(c_uint8)
pDll.ecompress.argtypes = [c_void_p, c_uint32]
ret = pDll.ecompress(buf, count)
arr = bytearray(size)
i = 0
while i < size:
arr[i] = ret[i]
i = i+1
return arr
def str_to_hex(s):
return ' '.join([hex(ord(c)).replace('0x', '') for c in s])
def hex_to_str(s):
return ''.join([chr(i) for i in [int(b, 16) for b in s.split(' ')]])
def str_to_bin(s):
return ' '.join([bin(ord(c)).replace('0b', '') for c in s])
def bin_to_str(s):
return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])
class EpkApp(object):
def __init__(self, appName, appDir, algorithm='zlib',appVersion="1.0", output="epks"):
super(EpkApp, self).__init__()
self._appName = appName
self._appDir = os.path.abspath(appDir)
self.algorithm = algorithm
self._appVersion = appVersion
self._appCRCCode = None
self._files = []
self._infoPath = os.sep.join([self._appDir, "%s.json" % self._appName])
self._epksDir = output
if not os.path.exists(self._epksDir):
fs.open_fs(os.getcwd()).makedirs(output)
self._epkName = os.sep.join([self._epksDir, "%s.epk" % self._appName])
def compress(self):
if self.algorithm == 'h':
return heatshrink_compress
return zlib.compress
def epkInfo(self):
epkInfo = OrderedDict({
"appName": self._appName,
"appVersion": self._appVersion,
"files": self.fileinfos(self._appDir),
})
infocontent = json.dumps(epkInfo)
with open(self._infoPath, "w", encoding='utf-8') as f:
f.write(infocontent)
return epkInfo
def fileinfos(self, path):
path = os.path.abspath(path)
home_fs = fs.open_fs(path)
files = []
for jspath in home_fs.glob('*', namespaces=['details']):
fpath = "C:/%s" % jspath.info.name
fname = jspath.info.name
fsize = jspath.info.size
fbasename, fext = os.path.splitext(jspath.info.name)
if fext in ["", ".exe", ".dll", ".nv", ".conf"]:
continue
finfo = {
"path": fpath,
"name": fname,
"size": fsize,
"basename": fbasename,
"ext": fext
}
if self._infoPath == os.sep.join([path, fname]):
files.insert(0, finfo)
else:
files.append(finfo)
if fext == ".evue":
self.fileMD5(finfo)
return files
def header(self, epk_start=0xAAAA, md5_offset=0, file_count=0):
bytes_header = struct.pack("<HLH", epk_start, md5_offset, file_count)
return bytes_header
def fileMD5(self, info):
md5path = os.sep.join([self._appDir, "%s.md5" % info["basename"]])
fpath = os.sep.join([self._appDir, info["name"]])
with open(fpath, "rb") as f:
filecontent = f.read()
newmd5 = self.md5(filecontent)
with open(md5path, "wb") as f:
f.write(newmd5)
return newmd5
def sign(self, content):
ret = b""
for i in range(int(len(content) / 2 )):
ret += struct.pack("<B", int("0x%s" % (content[i*2:i*2+2]), 16))
ret = ret + b'EVM is NB ++!'
return ret
def md5(self, filecontent):
newmd5 = ''
content = filecontent
for i in range(3):
md5 = hashlib.md5() #获取一个md5加密算法对象
md5.update(content) #指定需要加密的字符串
newmd5 = md5.hexdigest() #获取加密后的16进制字符串
content = self.sign(newmd5)
ret = b""
for i in range(int(len(newmd5) / 2 )):
ret += struct.pack("<B", int("0x%s" % (newmd5[i*2:i*2+2]), 16))
return ret
def packFile(self, info, level=9):
fname = info["name"]
fpath = os.sep.join([self._appDir, fname])
fext = info["ext"]
fileBytes = b""
if fext == "md5":
fileBytes += struct.pack("<B", 1)
else:
fileBytes += struct.pack("<B", 2)
_name = fname + "\0"
fileBytes += struct.pack("<B", len(_name))
fileBytes += struct.pack("<%ds" % len(_name), fname.encode("utf-8"))
with open(fpath, "rb") as fc:
fileContentBytes = fc.read()
fileBytes += struct.pack("<L", len(fileContentBytes))
if fext == "md5":
fileCompressBytes = fileContentBytes
else:
fileCompressBytes = self.compress()(fileContentBytes, level)
fileBytes += struct.pack("<L", len(fileCompressBytes))
fileBytes += fileCompressBytes
return fileBytes
def pack(self, level=9):
for i in range(10):
infos = self.epkInfo()
# infos = self.epkInfo()
# infos = self.epkInfo()
epkFileBytes = b""
epkFileContentBytes = b""
file_count = len(infos["files"])
with open(self._epkName, "wb") as f:
for info in infos["files"]:
epkFileContentBytes += self.packFile(info)
epkFileContentLength = len(epkFileContentBytes)
epkFileBytes += self.header(md5_offset= 8 + epkFileContentLength, file_count=file_count)
epkFileBytes += epkFileContentBytes
epkmd5Bytes = self.md5(epkFileBytes)
epkFileBytes += struct.pack("<H", len(epkmd5Bytes))
epkFileBytes += epkmd5Bytes
crcBytes = zlib.crc32(epkFileBytes)
epkFileBytes += struct.pack("<L", crcBytes)
f.write(epkFileBytes)
ret = {
"epkfile": self._epkName,
"epk_filecontent_size": epkFileContentLength,
"md5_offset": 10 + epkFileContentLength,
"file_count": file_count,
"md5_length": len(epkmd5Bytes),
"md5": epkmd5Bytes,
"raw_crc": hex(crcBytes),
"compress_level": level,
"buff_length": len(epkFileBytes)
}
pprint.pprint(ret)
return ret
def main(path, appName, algorithm):
epk = EpkApp(appName, path, algorithm)
epk.pack()
if __name__ == '__main__':
main(sys.argv[1], sys.argv[2], sys.argv[3])
#-*- coding: UTF-8 -*-
#!/usr/bin/python
import os
import sys
import fs
import struct
import json
from collections import OrderedDict
import zlib
import pprint
import hashlib
def str_to_hex(s):
return ' '.join([hex(ord(c)).replace('0x', '') for c in s])
def hex_to_str(s):
return ''.join([chr(i) for i in [int(b, 16) for b in s.split(' ')]])
def str_to_bin(s):
return ' '.join([bin(ord(c)).replace('0b', '') for c in s])
def bin_to_str(s):
return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])
class EpkApp(object):
def __init__(self, appName, appDir, appVersion="1.0", output="epks"):
super(EpkApp, self).__init__()
self._appName = appName
self._appDir = os.path.abspath(appDir)
self._appVersion = appVersion
self._appCRCCode = None
self._files = []
self._infoPath = os.sep.join([self._appDir, "%s.json" % self._appName])
self._epksDir = output
if not os.path.exists(self._epksDir):
fs.open_fs(os.getcwd()).makedirs(output)
self._epkName = os.sep.join([self._epksDir, "%s.epk" % self._appName])
def epkInfo(self):
epkInfo = OrderedDict({
"appName": self._appName,
"appVersion": self._appVersion,
"files": self.fileinfos(self._appDir),
})
infocontent = json.dumps(epkInfo)
with open(self._infoPath, "w", encoding='utf-8') as f:
f.write(infocontent)
return epkInfo
def fileinfos(self, path):
path = os.path.abspath(path)
home_fs = fs.open_fs(path)
files = []
for jspath in home_fs.glob('*', namespaces=['details']):
fpath = "C:/%s" % jspath.info.name
fname = jspath.info.name
fsize = jspath.info.size
fbasename = jspath.info.name.split(".")[0]
fext = jspath.info.name.split(".")[1]
if fext in ["exe", "dll", "nv", "conf"]:
continue
finfo = {
"path": fpath,
"name": fname,
"size": fsize,
"basename": fbasename,
"ext": fext
}
if self._infoPath == os.sep.join([path, fname]):
files.insert(0, finfo)
else:
files.append(finfo)
if fext == "evue":
self.fileMD5(finfo)
return files
def header(self, epk_start=0xAAAA, md5_offset=0, file_count=0):
bytes_header = struct.pack("<HLH", epk_start, md5_offset, file_count)
return bytes_header
def fileMD5(self, info):
md5path = os.sep.join([self._appDir, "%s.md5" % info["basename"]])
fpath = os.sep.join([self._appDir, info["name"]])
with open(fpath, "rb") as f:
filecontent = f.read()
print(fpath)
newmd5 = self.md5(filecontent)
print(md5path)
with open(md5path, "wb") as f:
f.write(newmd5)
return newmd5
def sign(self, content):
ret = b""
for i in range(int(len(content) / 2 )):
ret += struct.pack("<B", int("0x%s" % (content[i*2:i*2+2]), 16))
ret = ret + b'EVM is NB ++!'
return ret
def md5(self, filecontent):
newmd5 = ''
content = filecontent
for i in range(3):
md5 = hashlib.md5() #获取一个md5加密算法对象
md5.update(content) #指定需要加密的字符串
newmd5 = md5.hexdigest() #获取加密后的16进制字符串
print(newmd5)
content = self.sign(newmd5)
ret = b""
for i in range(int(len(newmd5) / 2 )):
ret += struct.pack("<B", int("0x%s" % (newmd5[i*2:i*2+2]), 16))
return ret
def packFile(self, info, level=9):
fname = info["name"]
fpath = os.sep.join([self._appDir, fname])
fext = info["ext"]
fileBytes = b""
if fext == "md5":
fileBytes += struct.pack("<B", 1)
else:
fileBytes += struct.pack("<B", 2)
_name = fname + "\0"
fileBytes += struct.pack("<B", len(_name))
fileBytes += struct.pack("<%ds" % len(_name), fname.encode("utf-8"))
with open(fpath, "rb") as fc:
fileContentBytes = fc.read()
print(info["name"])
print(len(fileContentBytes))
fileBytes += struct.pack("<L", len(fileContentBytes))
if fext == "md5":
fileCompressBytes = fileContentBytes
else:
fileCompressBytes = zlib.compress(fileContentBytes, level)
print(len(fileCompressBytes))
fileBytes += struct.pack("<L", len(fileCompressBytes))
fileBytes += fileCompressBytes
return fileBytes
def pack(self, level=9):
for i in range(10):
infos = self.epkInfo()
# infos = self.epkInfo()
# infos = self.epkInfo()
result = {}
epkFileBytes = b""
epkFileContentBytes = b""
file_count = len(infos["files"])
with open(self._epkName, "wb") as f:
for info in infos["files"]:
epkFileContentBytes += self.packFile(info)
epkFileContentLength = len(epkFileContentBytes)
epkFileBytes += self.header(md5_offset= 8 + epkFileContentLength, file_count=file_count)
epkFileBytes += epkFileContentBytes
epkmd5Bytes = self.md5(epkFileBytes)
epkFileBytes += struct.pack("<H", len(epkmd5Bytes))
epkFileBytes += epkmd5Bytes
crcBytes = zlib.crc32(epkFileBytes)
epkFileBytes += struct.pack("<L", crcBytes)
f.write(epkFileBytes)
ret = {
"epkfile": self._epkName,
"epk_filecontent_size": epkFileContentLength,
"md5_offset": 10 + epkFileContentLength,
"file_count": file_count,
"md5_length": len(epkmd5Bytes),
"md5": epkmd5Bytes,
"raw_crc": hex(crcBytes),
"compress_level": level,
"buff_length": len(epkFileBytes)
}
result = ret
return result
def main(path, appName):
epk = EpkApp(appName, path)
epk.pack()
if __name__ == '__main__':
main(sys.argv[1], sys.argv[2])
<template>
<a-card :body-style="{padding: '24px 32px'}" :bordered="false">
<a-form>
<a-form-item
label="标题"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
>
<a-input placeholder="给目标起个名字" />
</a-form-item>
<a-form-item
label="起止日期"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
>
<a-range-picker style="width: 100%" />
</a-form-item>
<a-form-item
label="目标描述"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
>
<a-textarea rows="4" placeholder="请输入你阶段性工作目标"/>
</a-form-item>
<a-form-item
label="衡量标准"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
>
<a-textarea rows="4" placeholder="请输入衡量标准"/>
</a-form-item>
<a-form-item
label="客户"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
:required="false"
>
<a-input placeholder="请描述你服务的客户,内部客户直接 @姓名/工号"/>
</a-form-item>
<a-form-item
label="邀评人"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
:required="false"
>
<a-input placeholder="请直接 @姓名/工号,最多可邀请 5 人"/>
</a-form-item>
<a-form-item
label="权重"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
:required="false"
>
<a-input-number :min="0" :max="100"/>
<span>%</span>
</a-form-item>
<a-form-item
label="目标公开"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
:required="false"
help="客户、邀评人默认被分享"
>
<a-radio-group v-model="value">
<a-radio :value="1">公开</a-radio>
<a-radio :value="2">部分公开</a-radio>
<a-radio :value="3">不公开</a-radio>
</a-radio-group>
<a-select mode="multiple" v-if="value === 2">
<a-select-option value="4">同事甲</a-select-option>
<a-select-option value="5">同事乙</a-select-option>
<a-select-option value="6">同事丙</a-select-option>
</a-select>
</a-form-item>
<a-form-item style="margin-top: 24px" :wrapperCol="{span: 10, offset: 7}">
<a-button type="primary">提交</a-button>
<a-button style="margin-left: 8px">保存</a-button>
</a-form-item>
</a-form>
</a-card>
</template>
<script>
import {
Avatar,
Row,
Col,
Card,
List,
Button,
Form,
Icon,
Table,
Divider,
Dropdown,
Input,
Select,
Radio,
DatePicker,
InputNumber
} from "ant-design-vue";
import PageHeaderWrapper from "@/components/PageHeaderWrapper";
import DescriptionItem from "@/components/DescriptionItem";
export default {
name: 'BasicForm',
data () {
return {
value: 1
}
},
components: {
Icon,
ATextarea: Input.TextArea,
ARadio: Radio,
ARadioGroup: Radio.Group,
AInputNumber: InputNumber,
AAvatar: Avatar,
ARow: Row,
ACol: Col,
ACard: Card,
ACardGrid: Card.Grid,
ACardMeta: Card.Meta,
AList: List,
AButton: Button,
AForm: Form,
AFormItem: Form.Item,
AIcon: Icon,
ATable: Table,
ADivider: Divider,
ADropdown: Dropdown,
AInput: Input,
ASelect: Select,
AOption: Select.Option,
ADescriptionItem: DescriptionItem,
APageHeaderWrapper: PageHeaderWrapper,
ARangePicker: DatePicker.RangePicker,
},
computed: {
desc() {
return this.$t('pageDesc')
}
},
}
</script>
<style scoped>
</style>
\ No newline at end of file
from pprint import pprint
from pathlib import Path
from difflib import Differ
import fs
import json
import os
import re
import hashlib
import time
import shutil
from jinja2 import Environment, FileSystemLoader
from resources.webcreator import log
'''
流程:
一、将resources里面所有文件夹拷贝到当前目录下
二、解析json配置文件,遍历每一项生成/model/view/controller
三、自动运行项目
'''
# 比较两个文件内容是否相同,这里没有使用md5内容摘要算法,MD5算法的缺点是,针对大文件,计算耗时。虽然咱们这里不存在大文件,但是条条大路通罗马嘛,试试其他方法也挺好。
def cmp_file(file1, file2):
f1 = os.stat(file1)
f2 = os.stat(file2)
if f1.st_size != f2.st_size:
return False
buf_size = 8 * 1024
with open(file1, "rb") as fp1, open(file2, "rb") as fp2:
while True:
buf1 = fp1.read(buf_size)
buf2 = fp2.read(buf_size)
if buf1 != buf2:
return False
# 这里表示文件读完了
if not buf1 or not buf2:
return True
def compare_file(file1, file2):
with open(file1) as f1,open(file2) as f2:
content1 = f1.read().splitlines(keepends=True)
content2 = f2.read().splitlines(keepends=True)
d = Differ()
result = d.compare(content1, content2)
return list(result)
def cmp_md5(contnet1, content2):
m1 = hashlib.md5()
m1.update(bytearray(contnet1, 'utf-8'))
m2 = hashlib.md5()
m2.update(bytearray(content2, 'utf-8'))
return m1.hexdigest() == m2.hexdigest()
# 将字符串首字母转换成大写字母
def convertFirstLetterUpper(text_str):
# return text_str.capitalize()
# print("////////////////////>>>>", text_str)
return re.sub("([a-zA-Z])", lambda x: x.groups()[0].upper(), text_str, 1)
# ROOT = os.path.abspath(os.getcwd())
jinja_env = Environment(loader=FileSystemLoader(os.path.join(os.getcwd(), 'templates')))
jinja_env.filters['letterUpper'] = convertFirstLetterUpper
input_dir = None
output_dir = None
events = []
def copyFiles(src_dir, dst_dir):
if not os.path.exists(src_dir):
log.logger.error("%s 目录不存在" % src_dir)
return None
# 复制文件之前需要判断文件是否存在
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
# root 所指的是当前正在遍历的这个文件夹的本身的地址
# dirs 是一个 list,内容是该文件夹中所有的目录的名字(不包括子目录)
# files 同样是 list, 内容是该文件夹中所有的文件(不包括子目录)
for root, dirs, files in os.walk(src_dir):
save_path = dst_dir
if os.path.basename(root) == "__pycache__":
continue
for file in files:
if file == '__init__.py':
continue
src_file = os.path.join(root, file)
relative_path = os.path.relpath(src_file, src_dir)
if relative_path != file:
save_path = os.path.normpath(os.sep.join([dst_dir, relative_path]))
if not os.path.exists(save_path):
os.makedirs(save_path)
shutil.copy(src_file, save_path)
log.logger.info('copy files finished!')
def handleModuleConfig(config):
# 处理每一项配置文件
# 入口文件名
# 实例对象,根据这个实例连接对应请求
# 实例方法,需要根据实例方法生成事件函数
'''
'''
pass
def handleModules(config):
global output_dir
# 遍历modules结构,判断文件是否存在,并且enable已经打开
# 如果文件不存在,则直接报错
# 本质上这是一个文件拷贝的操作
for mod in config:
p = Path(mod.get("config"))
if not p.exists() or not mod.get("enable"):
continue
shutil.copyfile(mod.get("config"), os.sep.join([output_dir, "controllers", p.name]))
for d in mod.get("dependencies"):
if Path(d).exists():
shutil.copyfile(d, os.sep.join([output_dir, "controllers", Path(d).name]))
else:
log.logger.error("文件:%s 不存在")
def handleModuleConfig(config):
# 处理每一项配置文件
# 入口文件名
# 实例对象,根据这个实例连接对应请求
# 实例方法,需要根据实例方法生成事件函数
'''
'''
pass
def handleModules(config):
global output_dir
# 遍历modules结构,判断文件是否存在,并且enable已经打开
# 如果文件不存在,则直接报错
# 本质上这是一个文件拷贝的操作
for mod in config:
p = Path(mod.get("config"))
if not p.exists() or not mod.get("enable"):
continue
shutil.copyfile(mod.get("config"), os.sep.join([output_dir, "controllers", p.name]))
for d in mod.get("dependencies"):
if Path(d).exists():
shutil.copyfile(d, os.sep.join([output_dir, "controllers", Path(d).name]))
else:
log.logger.error("文件:%s 不存在")
def handleResources(config):
# 处理路由页面
# 遍历config文件,收集所有的action和name,action和name的首字母必须大写
# 然后才生成路由配置页面
target_file = os.sep.join(["views", "__init__.py"])
handleRender(config, 'router.tpl', target_file)
def handleSignal(config):
# 生成信号槽模块
if config.get("framework").get("signal").get("regenerate"):
target_file = os.sep.join(["application", "signal_manager.py"])
handleRender(config.get("apis"), 'signal_manager.tpl', target_file)
if config.get("framework").get("controllerInit").get("regenerate"):
target_file = os.sep.join(["controllers", "__init__.py"])
handleRender(config.get("apis"), 'signal_manager_init.tpl', target_file)
def handleModel(config, application):
# 判断是否有model字段,没有直接退出
if not config.get("model"):
return None
# 将所有有默认值的字段分为一组,没有默认值的字段分为另一组
# 生成模板代码时,无默认值的字段在前,有默认值的字段字在后
# 收集表字段信息
fields = []
extend = False
for m in config.get("model").get("fields"):
fields.append(m.get("name"))
extend = True
print(m)
target_file = os.sep.join(["models", "{}.py".format(config.get("name"))])
handleRender(config, 'model.tpl', target_file, fields=fields, extend=extend, application=application)
# 多次复制时,会报文件已存在错误,因此要先删除
target_file = os.sep.join(["models", "base.py"])
if os.path.exists(target_file):
os.remove(target_file)
handleRender(config, 'base.tpl', target_file, application=application)
def handleView(config):
target_file = os.sep.join(["views", "{}.py".format(config.get("name"))])
handleRender(config, 'view.tpl', target_file)
def handleController(config):
# 根据模型字段自动从models列表中取出file name信息和class name信息
target_file = os.sep.join(["controllers", "{}.py".format(config.get("name"))])
handleRender(config, 'controller.tpl', target_file)
def handleRender(result, tpl, target_file, **kwargs):
global output_dir
# print("=========>", result.get("name"), "{}.py".format(result.get("name")))
jinja_tpl = jinja_env.get_template(tpl)
content = jinja_tpl.render({ "config": result, **kwargs })
# print("############", output_dir)
target_file = os.sep.join([output_dir, target_file])
if not os.path.exists(os.path.dirname(target_file)):
os.makedirs(os.path.dirname(target_file))
# 这里需要比较目标文件夹是否已经存在同名文件,如果存在,则需要比较两个文件内容是否一致
# 如果不一致时,则需要给旧的文件打上时间戳,作为备份文件
# 具体流程:
# 先将原来文件重命名,然后新的内容写入到重命名的文件中
# 最后比较两个文件内容是否一致,如果一致,则删除重命名的那个旧的备份文件
tmp_file = ""
if os.path.exists(target_file) and os.stat(target_file).st_size > 0:
n, e = os.path.splitext(target_file)
tmp_file = "{}.{}{}".format(n, time.strftime("%Y%m%d%H%M%S", time.localtime()), e)
if os.path.exists(tmp_file):
os.remove(tmp_file)
os.rename(target_file, tmp_file)
with open(target_file, 'w', encoding='utf-8') as f:
f.write(content)
if len(tmp_file) > 0 and cmp_file(tmp_file, target_file) == True:
os.remove(tmp_file)
def parseConfig(config):
# 解析配置文件
for cfg in config.get("apis"):
if not cfg.get("enable"):
continue
handleModel(cfg, config.get("application"))
handleView(cfg)
handleController(cfg)
# 全局配置
handleResources(config.get("apis"))
handleSignal(config)
handleModules(config.get("modules"))
def readConfig():
result = {}
with open("config.json", "r+") as f:
result = json.loads(f.read())
return result
# 备份数据库,判断目标文件夹下是否有.db文件,有的话,先备份到临时目录,待文件复制完成后,再放回原来位置
def backup_database():
global output_dir
target_dir = os.sep.join([os.path.dirname(output_dir), "tmp"])
if not os.path.exists(target_dir):
os.makedirs(target_dir)
home_fs = fs.open_fs(output_dir)
for file in home_fs.glob('*.db', namespaces=['details']):
# print(file.path, os.path.normpath(os.sep.join([output_dir, file.path])))
# copyFiles(os.path.normpath(os.sep.join([output_dir, file.path])), target_dir)
shutil.copy(os.path.normpath(os.sep.join([output_dir, file.path])), target_dir)
# 恢复数据库,代码生成完成后,需要把之前复制的数据库文件,恢复到原来位置
def restore_database():
global output_dir
target_dir = os.sep.join([os.path.dirname(output_dir), "tmp"])
if not os.path.exists(target_dir):
return
home_fs = fs.open_fs(target_dir)
for file in home_fs.glob('*.db', namespaces=['details']):
# copyFiles(os.path.normpath(os.sep.join([target_dir, file.path])), output_dir)
shutil.copy(os.path.normpath(os.sep.join([target_dir, file.path])), output_dir)
home_fs = fs.open_fs(target_dir)
home_fs.removetree("/")
if home_fs.exists("/"):
os.removedirs(target_dir)
def run():
global input_dir
global output_dir
input_dir = os.sep.join([os.getcwd(), "resources"])
output_dir = os.sep.join([os.getcwd(), "build_out"])
backup_database()
# 复制文件到输出目录
copyFiles(input_dir, output_dir)
config = readConfig()
parseConfig(config)
restore_database()
print("success ......")
if __name__ == "__main__":
run()
\ No newline at end of file
import pprint
import base64
from pathlib import Path
import json
import mimetypes
from webcreator.log import logger
from application.config import config
from webcreator.response import ResponseCode
disk_root = config.UPLOAD_ROOT_DIR
logger.info(disk_root)
class FileManager(object):
def __init__(self) -> None:
pass
'''
@description: 根据前端传递的路径参数,获取该路径的目录以及文件信息,文件类别,可以看做是一个盘符
@param {*} self
@return {*}
'''
def initialize(self):
'''
disks: {
files: {driver: "local"},
images: {driver: "local"}
}
lang: "en"
leftDisk: null
rightDisk: null
windowsConfig: 2
'''
result = {
"disks": {},
"lang": "zh",
"leftDisk": None,
"rightDisk": None,
"windowsConfig": 1
}
# 这里需要过滤,有些目录只能管理员才能查看
p = Path(disk_root)
for child in p.iterdir():
if child.is_dir():
result["disks"].update({
child.name: { "driver": "local" }
})
return result, ResponseCode.HTTP_SUCCESS
'''
@description: 获取当前类别的目录信息
@param {*} self
@return {*}
'''
def content(self, disk, target_path='/'):
'''
目录信息结构体:
{
basename: "docs"
dirname: ""
path: "docs"
timestamp: 1556821372
type: "dir"
},
{
basename: "cars"
dirname: "wallpapers"
path: "wallpapers/cars"
timestamp: 1544277291
type: "dir"
}
文件信息结构体:
{
basename: "alfa.sql"
dirname: "code"
extension: "sql"
filename: "alfa"
path: "code/alfa.sql"
size: 3208
timestamp: 1544277274
type: "file"
}
'''
target_path = Path(target_path)
result = {
"directories": [],
"files": []
}
disk_path = Path(disk_root).joinpath(disk)
if not disk_path.exists():
return result
target_path = disk_path.joinpath(target_path)
if not target_path.exists():
return result
for child in target_path.iterdir():
if child.is_dir():
result["directories"].append({
"basename": child.name,
"dirname": child.parent.relative_to(disk_path).as_posix(),
"path": child.resolve().relative_to(disk_path).as_posix(),
"timestamp": int(child.stat().st_mtime),
"type": "dir"
})
else:
result["files"].append({
"basename": child.name,
"dirname": child.parent,
"extension": child.suffix[1:],
"filename": child.stem,
"path": child.resolve().relative_to(disk_path).as_posix(),
"size": child.stat().st_size,
"timestamp": int(child.stat().st_mtime),
"type": "file"
})
with open("result.json", "w") as f:
json.dump(result, f)
f.seek(0)
f.truncate()
f.write(json.dumps(result, ensure_ascii=True))
pprint.pprint(result)
return result, ResponseCode.HTTP_SUCCESS
'''
@description: 获取目录结构树
@param {*} self
@return {*}
'''
def tree(self, disk, target_path="/"):
'''
{
basename: "trees"
dirname: "wallpapers/nature"
path: "wallpapers/nature/trees"
props: {
hasSubdirectories: false
}
timestamp: 1544277291
type: "dir"
}
'''
target_path = Path(target_path)
result = []
rp = Path(disk_root)
disk_path = rp / disk
if not disk_path.exists():
return result
temp_path = disk_path.joinpath(target_path)
if not temp_path.exists():
return result
p = Path(disk_path)
for child in p.iterdir():
if child.is_dir():
result.append({
"basename": child.name,
"dirname": child.parent.relative_to(rp).as_posix(),
"path": child.relative_to(rp).as_posix(),
"props": {
"hasSubdirectories": True if child.iterdir() else False
},
"timestamp": int(child.stat().st_mtime),
"type": "dir"
})
pprint.pprint(result)
return result, ResponseCode.HTTP_SUCCESS
def disk(self, disk):
# select-disks
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def upload(self, disk):
# select-disks
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def create_dir(self, disk, target_file):
# create directory
print(disk, target_file)
return True, ResponseCode.HTTP_SUCCESS
def create_file(self, disk, target_file, content):
# create file
print(disk, target_file, content)
return True, ResponseCode.HTTP_SUCCESS
def delete(self, disk):
# delete file
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def copy(self, disk):
# copy file
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def cut(self, disk):
# cut file
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def paste(self, disk):
# paste file
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def download(self, disk, target_file):
# 获取文件内容
if not target_file:
target_file = Path('result.json')
else:
target_file = Path(disk_root).joinpath(disk).joinpath(target_file)
if not target_file.exists():
return False, ResponseCode.HTTP_NOT_FOUND
# with open(target_file.resolve().as_posix(), "r", encoding="utf-8") as f:
# data = f.read()
# logger.info(data)
mime = mimetypes.guess_type(target_file.resolve().as_posix())[0]
content = target_file.read_text(encoding="utf-8")
return (content, mime), ResponseCode.HTTP_SUCCESS
def preview(self, disk, target_file):
# 预览图片
if not target_file:
target_file = Path('evue_photo.png')
else:
target_file = Path(disk_root).joinpath(disk).joinpath(target_file)
if not target_file.exists():
return False, ResponseCode.HTTP_NOT_FOUND
mime = mimetypes.guess_type(target_file.resolve().as_posix())[0]
# mime = MimeTypes.guess_type(target_file.resolve().as_posix())
img_stream = target_file.read_bytes()
# with open(target_file, 'rb') as img_f:
# img_stream = img_f.read()
# img_stream = base64.b64encode(img_stream).decode()
return (img_stream, mime), ResponseCode.HTTP_SUCCESS
fileManager = FileManager()
if __name__ == "__main__":
'''
python -m memory_profiler example.py
'''
# from memory_profiler import profile
# @profile
# def test():
# pass
result = fileManager.initialize()
print("----->", result)
result = fileManager.content("uploads", "evueapps/evm")
print(">>>>>>", result)
result = fileManager.tree("uploads", "evueapps/evm")
print("=====>", result)
result = fileManager.preview("uploads", "evueapps/evm")
print("$$$$$>", result)
'''
Author: your name
Date: 2021-06-15 17:40:06
LastEditTime: 2021-06-30 18:17:48
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\application\__init__.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import sys
sys.path.append("..")
from controllers import initConnect
initConnect()
'''
Author: your name
Date: 2021-06-15 17:40:09
LastEditTime: 2021-06-30 18:09:51
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\manager.py
'''
# -*- coding: utf-8 -*-
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from flask_script import Manager
from flask_migrate import Migrate
from application.app import create_app, db
from application.config import config
# 根据配置初始化app
app = create_app(config)
migrate = Migrate(app, db)
manager = Manager(app)
@manager.command
def run():
"""
生产模式启动命令函数
To use: python3 manager.py run
"""
# app.logger.setLevel(app.config.get('LOG_LEVEL', logging.INFO))
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(3000, address='127.0.0.1', xheaders=True)
IOLoop.instance().start()
@manager.command
def debug():
"""
debug模式启动命令函数
To use: python3 manager.py debug
"""
# app.logger.setLevel(logging.DEBUG)
app.run(debug=True, port=3000, host='127.0.0.1')
if __name__ == '__main__':
manager.run()
'''
Author: your name
Date: 2021-04-22 18:04:10
LastEditTime: 2021-06-30 17:22:15
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\models\__init__.py
'''
# -*- coding: utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declared_attr, declarative_base
class BaseModelMixin(object):
@declared_attr
def __tablename__(self):
return self.__name__.lower()
# __table_args__ = {'mysql_engine': 'InnoDB'}
id = Column(Integer, primary_key=True)
BaseModel = declarative_base(cls=BaseModelMixin)
class MyMixin(object):
@declared_attr
def __tablename__(self):
return self.__name__.lower()
# __table_args__ = {'mysql_engine': 'InnoDB'}
__mapper_args__= {'always_refresh': True}
id = Column(Integer, primary_key=True)
# example:
class MyModel(MyMixin, BaseModel):
__tablename__ = 'mymodel'
name = Column(String(20))
fullname = Column(String(32))
password = Column(String(32))
# if __name__ == "__main__":
engine = create_engine('sqlite:///test.db')
BaseModel.metadata.create_all(engine, checkfirst=True)
Session = sessionmaker(bind=engine)
session = Session()
ed_user = MyModel(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
session.add_all(
[
MyModel(name='wendy', fullname='Wendy Williams', password='foobar'),
MyModel(name='mary', fullname='Mary Contrary', password='xxg527'),
MyModel(name='fred', fullname='Fred Flinstone', password='blah')
]
)
session.commit()
# our_user = session.query(MyModel).filter_by(name='ed').first()
# print(our_user)
'''
Author: your name
Date: 2021-06-15 17:40:14
LastEditTime: 2021-06-30 17:22:44
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\webcreator\event.py
'''
# -*- coding: utf_8 -*-
<<<<<<< HEAD
############################
# 信号槽
############################
=======
>>>>>>> 68ec88f3f356b5c61817a0f9df8d40a3e46b4fd0
class PySignal(object):
"""
Simple event class used to provide hooks for different types of events in Locust.
Here's how to use the EventHook class::
my_event = PySignal()
def on_my_event(a, b, **kw):
print "Event was fired with arguments: %s, %s" % (a, b)
my_event += on_my_event
my_event.fire(a="foo", b="bar")
my_event.emit(a="foo", b="bar")
"""
def __init__(self):
self._handlers = []
def __iadd__(self, handler):
return self.connect(handler)
def __isub__(self, handler):
return self.disconnect(handler)
def connect(self, handler):
self._handlers.append(handler)
return self
def disconnect(self, handler):
self._handlers.remove(handler)
return self
def fire(self, *args, **kwargs):
return self.emit(*args, **kwargs)
def emit(self, *args, **kwargs):
rets = {}
for handler in self._handlers:
ret = handler(*args, **kwargs)
rets[handler.__name__] = ret
if len(rets) == 1:
return list(rets.values())[0] # list()用来兼容python3
return rets
if __name__ == '__main__':
my_event = PySignal()
def on_my_event(a, b, **kw):
print(a, b)
print(kw)
my_event.connect(on_my_event)
my_event.fire(1, 2, c="foo", d="bar")
my_event.emit(3, 4, e="foo", f="bar")
'''
Author: your name
Date: 2021-04-22 18:04:15
LastEditTime: 2021-07-09 00:52:08
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\webcreator\log.py
'''
# -*- coding: utf_8 -*-
import os
import logging
from logging.handlers import RotatingFileHandler
logPath = os.getcwd() + os.path.sep + "logs"
if not os.path.exists(logPath):
os.makedirs(logPath)
fh = RotatingFileHandler("logs/running.log", maxBytes=10 * 1024 * 1024, backupCount=100)
fh.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s][%(levelname)7s][in %(pathname)s -> %(funcName)s line:%(lineno)s] %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger = logging.root
logger.setLevel(logging.DEBUG)
logger.addHandler(fh)
logger.addHandler(ch)
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