Commit 9f8f3824 authored by wanli's avatar wanli

update

parents 54432ee6 eddff974
{
"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()
This diff is collapsed.
#!/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 diff is collapsed.
'''
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))
This diff is collapsed.
#!/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
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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