Commit b4570cc6 authored by wanli's avatar wanli

update

parent 4ff82ce3
<!--
* @Author: your name
* @Date: 2021-04-14 14:12:18
* @LastEditTime: 2021-07-03 11:33:36
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\README.md
-->
# evm-store
EVM应用商店
......@@ -25,3 +33,9 @@ pip3 install -r requirements.txt
```
pip freeze > requirements.txt
```
# 应用商店
# 运营平台用户前端
> https://appstore.huawei.com/
{
"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-06-22 12:40:53
LastEditTime: 2021-07-03 11:53:43
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\app\signal_manager.py
......@@ -39,19 +39,13 @@ class SignalManager(object):
actionDeleteBuildLog = PySignal()
# 用户模块
actionCheckUser = PySignal()
actionAddUser = PySignal()
actionDeleteUser = PySignal()
actionGetUser = PySignal()
actionGetUserList = PySignal()
actionUpdateUser = PySignal()
# 文件附件模块
actionAddAnnex = PySignal()
actionDeleteAnnex = PySignal()
actionGetAnnex = PySignal()
actionGetAnnexList = PySignal()
actionUpdateAnnex = PySignal()
# 系统框架模块
actionAddDevice = PySignal()
actionDeleteDevice = PySignal()
......@@ -80,13 +74,6 @@ class SignalManager(object):
actionGetLoginLogsList = PySignal()
actionUpdateLoginLogs = PySignal()
# 系统菜单
actionAddMenu = PySignal()
actionDeleteMenu = PySignal()
actionGetMenu = PySignal()
actionGetMenuList = PySignal()
actionUpdateMenu = PySignal()
def __init__(self):
super(SignalManager, self).__init__()
......
{"lastModifyDateTime": 1624973031}
\ No newline at end of file
{"lastModifyDateTime": 1625808079}
\ No newline at end of file
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-06-29 19:55:00
LastEditTime: 2021-07-03 11:53:04
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\controller\__init__.py
......@@ -14,7 +14,6 @@ from app import signalManager
from .api_manager import apiManager
from .user_manager import userManager
from .login_manager import loginManager
from .annex_manager import annexManager
from .apps_manager import appsManager
from .device_manager import deviceManager
from .download_manager import downloadManager
......@@ -65,19 +64,13 @@ def initConnect():
signalManager.actionUpdateLoginLogs.connect(loginLogsManager.update)
# 用户模块
signalManager.actionCheckUser.connect(userManager.check)
signalManager.actionAddUser.connect(userManager.add)
signalManager.actionDeleteUser.connect(userManager.delete)
signalManager.actionGetUser.connect(userManager.get)
signalManager.actionGetUserList.connect(userManager.getList)
signalManager.actionUpdateUser.connect(userManager.update)
# 文件附件模块
signalManager.actionAddAnnex.connect(annexManager.add)
signalManager.actionDeleteAnnex.connect(annexManager.delete)
signalManager.actionGetAnnex.connect(annexManager.get)
signalManager.actionGetAnnexList.connect(annexManager.getList)
signalManager.actionUpdateAnnex.connect(annexManager.update)
# 应用下载统计模块
signalManager.actionAddDownload.connect(downloadManager.add)
signalManager.actionDeleteDownload.connect(downloadManager.delete)
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from flask import request
from model import fullStackDB
from model.annex import Annex
from model.user import User
from utils import sql_filter
logger = logging.getLogger("AnnexManager")
class AnnexManager(object):
def __init__(self):
super(AnnexManager, self).__init__()
def add(self, data):
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
if data.get("flow"):
flow = Flow.get(uuid=data.get("flow"))
if not flow:
return False, "flow does not exists."
data.update({ "flow": flow })
elif data.get("project"):
project = Project.get(uuid=data.get("project"))
if not project:
return False, "project does not exists."
data.update({ "project": project })
data.update({
'title': data.get("title"),
'path': data.get("path"),
'size': data.get("size"),
'create_by': editor,
'create_at': datetime.now(),
'update_by': editor,
'update_at': datetime.now(),
})
result = fullStackDB.add(Annex, **data)
return result, "add annex {}.".format("success" if result else "fail")
def delete(self, uuid):
result = False
with db_session:
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = Annex.get(uuid=uuid)
if result:
if result.project:
count = Annex.select(project=result.project, remarks=result.remarks, is_delete=False).count()
if count == 1:
project = Project.get(id=result.project.id)
if project:
condition = dict()
if result.remarks == "bidding": # 中标通知书
condition.update({ "is_bidding": False })
elif result.remarks == "acceptance": # 验收表
condition.update({ "is_acceptance": False })
elif result.remarks == "evaluation": # 评价表
condition.update({ "is_evaluation": False })
elif result.remarks == "contract": # 合同
condition.update({ "is_contract": False })
project.extend1.get("uploads").update({ result.remarks: False })
project.set(extend1=project.extend1, **condition)
result.set(is_delete=True, delete_at=datetime.now(), delete_by=editor)
commit()
result = True
return result, "delete annex {}.".format("success" if result else "fail")
def get(self, data):
result = Annex.get(**data)
if result:
result = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "title", "create_at", "update_at", "delete_at"])
return result, "get annex {}.".format("success" if result else "fail")
def getList(self, data):
if not data or len(data) <= 0:
return False, 0, "parameters can not be null."
result = Annex.select().where(is_delete=False, **data)
if len(result):
temp = []
for item in result:
# t = item.to_dict(with_collections=True, only=["uuid", "title", "project", "path", "remarks"])
# temp.append(t)
temp.append({
"uuid": item.uuid,
"name": item.title,
"project": item.project.id,
"url": item.path,
"type": item.remarks
})
result = temp
return result, len(result), "get annex {}.".format("success" if result else "no data")
def update(self, uuid, data):
# 当参数为空时,直接返回错误
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "parameters can not be null."
# 查询请求者是否存在
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = fullStackDB.update(Annex, { 'uuid': uuid }, update_at=datetime.now(), update_by=editor, **data)
return result, "update annex {}.".format("success" if result else "fail")
annexManager = AnnexManager()
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-06-29 20:21:46
LastEditTime: 2021-07-01 11:39:27
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\controller\api_manager.py
......@@ -17,6 +17,7 @@ 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__)
......@@ -51,27 +52,27 @@ class ApiManager(object):
return True, "success"
def get_escape_text(self, data):
fname = "./a.c"
target = os.sep.join(["out", fname])
# fname = "./a.c"
# target = os.sep.join(["out", fname])
if os.path.exists(fname):
os.remove(fname)
# if os.path.exists(fname):
# os.remove(fname)
if os.path.exists(target):
os.remove(target)
# if os.path.exists(target):
# os.remove(target)
with open(fname, "w+") as f:
f.write(data['string'])
# with open(fname, "w+") as f:
# f.write(data['string'])
result = os.system("./opqcp {i} ./out".format(i=fname))
print(result)
# result = os.system("./opqcp {i} ./out".format(i=fname))
# print(result)
with open(target) as f:
result = f.read()
# with open(target) as f:
# result = f.read()
return result
# return result
# return convert_string(data['string'])
return convert_string(data['string'])
def opqcp(self, params):
target_file = os.path.normpath(os.sep.join([config.get("UPLOAD_PATH"), params.get("filename")]))
......
......@@ -2,19 +2,14 @@
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from model import fullStackDB
from model.app_logs import AppLogs
from model.user import User
from utils import sql_filter
logger = logging.getLogger("AppLogsManager")
logger = logging.getLogger(__name__)
class AppLogsManager(object):
def __init__(self):
......
......@@ -17,10 +17,10 @@ from model.apps import Apps
from model.user import User
from model.app_logs import AppLogs
from model.build_logs import BuildLogs
from utils import sql_filter, ThreadMaker
from utils import ThreadMaker
from utils.epk import EpkApp
logger = logging.getLogger("AppsManager")
logger = logging.getLogger(__name__)
@ThreadMaker
def build_application(user, uuid):
......
......@@ -4,13 +4,8 @@
import os
import re
import copy
import time
import types
import json
import shutil
import logging
import traceback
from urllib.parse import urlparse, urljoin
from datetime import datetime
from pony.orm import *
from app.setting import config
......@@ -20,10 +15,9 @@ from model.annex import Annex
from model.app_logs import AppLogs
from model.build_logs import BuildLogs
from model.user import User
from utils import sql_filter
from utils.epk import EpkApp
logger = logging.getLogger("BuildLogsManager")
logger = logging.getLogger(__name__)
class BuildLogsManager(object):
def __init__(self):
......
......@@ -2,19 +2,14 @@
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from model import fullStackDB
from model.device import Device
from model.user import User
from utils import sql_filter
logger = logging.getLogger("DeviceManager")
logger = logging.getLogger(__name__)
class DeviceManager(object):
def __init__(self):
......
......@@ -2,20 +2,15 @@
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import select, desc
from flask import request
from model import fullStackDB
from model.dictionary import Dict
from model.user import User
from utils import sql_filter
logger = logging.getLogger("DictManager")
logger = logging.getLogger(__name__)
class DictManager(object):
def __init__(self):
......
......@@ -2,30 +2,23 @@
# -*- coding: utf_8 -*-
import os
import re
import copy
import time
import types
import json
import logging
import traceback
import shutil
from collections import OrderedDict
import urllib
from pathlib import Path
from urllib import parse, request
from urllib.parse import urlparse, urljoin, urlencode
from urllib.parse import urlparse
from datetime import datetime
from pony.orm import *
from flask import request as flask_request
from app.setting import config, conf
from model import fullStackDB
from app.setting import config
from model.download import AppDownload
from model.device import Device
from model.apps import Apps
from model.user import User
from utils import sql_filter, ThreadMaker
from utils import ThreadMaker
logger = logging.getLogger("DownloadManager")
logger = logging.getLogger(__name__)
@ThreadMaker
def update_download_information(ip, id):
......@@ -141,15 +134,15 @@ class DownloadManager(object):
app = app[:]
epk_path = ""
if app[0].app_build_log:
epk_path = os.sep.join([os.getcwd(), app[0].app_build_log.app_path])
if not os.path.exists(epk_path):
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:
real_ip = flask_request.headers['X-Forwarded-For']
update_download_information(real_ip, down.id)
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")
......
......@@ -2,19 +2,14 @@
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from model import fullStackDB
from model.login_logs import LoginLogs
from model.user import User
from utils import sql_filter
logger = logging.getLogger("LoginLogsManager")
logger = logging.getLogger(__name__)
class LoginLogsManager(object):
def __init__(self):
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
import urllib
from urllib import parse, request
from urllib.parse import urlparse, urljoin, urlencode
from datetime import datetime
from threading import Thread
from werkzeug.security import check_password_hash
from flask import request as flask_request
from pony.orm import *
from model import fullStackDB
from model.user import User
from model.login_logs import LoginLogs
from fullstack.login import Auth
from fullstack.response import ResponseCode
from utils import md5_salt, ThreadMaker
logger = logging.getLogger("LoginManager")
logger = logging.getLogger(__name__)
@ThreadMaker
def update_login_information(ip, user_id):
......@@ -88,7 +82,7 @@ class LoginManager(object):
update_login_information(real_ip, result.id)
# 返回token
token = Auth.encode_auth_token(result.id, result.username) # 生成 token
token = Auth.encode_auth_token(result.id, result.username, str(result.uuid)) # 生成 token
# setattr(result, 'token', token)
return { 'token': token, 'id': result.id, 'username': result.username }, ResponseCode.OK
......
'''
Author: your name
Date: 2021-06-29 19:24:32
LastEditTime: 2021-07-01 10:01:48
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, Watch, Request
from model.monitor import session, System, Lvgl, Evm, Image, Device, Request, User
class SystemResource(object):
def get(self):
......@@ -93,16 +93,17 @@ def insert_data(msg):
# 先判断手表imei是否存在,不存在则先注册手表IMEI
watch_id = -1
if msg.get("imei"):
result = session.query(Watch).filter_by(imei=msg.get("imei")).first()
result = session.query(Device).filter_by(imei=msg.get("imei")).first()
if result:
watch_id = result.id
else:
result = Watch(imei=msg.get("imei"))
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(Watch).filter_by(imei=msg.get("imei")).first()
result = session.query(Device).filter_by(imei=msg.get("imei")).first()
if result:
watch_id = result.id
......@@ -129,7 +130,7 @@ def insert_data(msg):
imageResource.post_array(msg.get("image"), watch_id)
def get_watch_list():
result = session.query(Watch).all()
result = session.query(Device).all()
tmp = []
for item in result:
tmp.append({
......@@ -188,7 +189,7 @@ def image_data(watch, start, end):
def get_monitor_list(watch, category, start, end):
# 判断watch是否存在
w = session.query(Watch).filter(Watch.id==watch).first()
w = session.query(Device).filter(Device.id==watch).first()
if not w:
return []
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from flask import request
from model import fullStackDB
from model.netdisc import Netdisc
from model.user import User
from app.setting import config
logger = logging.getLogger("NetDiscManager")
class NetDiscManager(object):
def __init__(self):
super(NetDiscManager, self).__init__()
def add(self, data):
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
data.update({
'create_by': editor,
'create_at': datetime.now(),
'update_by': editor,
'update_at': datetime.now(),
})
result = fullStackDB.add(Netdisc, **data)
return result, "add netdisc {}.".format("success" if result else "fail")
def delete(self, data):
# 通过uuid查询出所有的文件列表,然后全部删除
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
count = 0
result = []
with db_session:
for uuid in data.get("uuids"):
nd = Netdisc.get(uuid=uuid)
if nd:
# nd.is_delete = True
# nd.delete_at = datetime.now()
# nd.delete_by = editor
nd.set(is_delete = True, delete_at = datetime.now(), delete_by = editor)
count = count + 1
result.append([nd.is_dir, nd.real_path])
commit()
return result, "delete {} netdisc {}.".format(count, "success" if result else "fail")
def get(self, data):
result = Netdisc.get(**data)
if result:
result = result.to_dict(only=["uuid", "name", "real_path"])
return result, "get netdisc {}.".format("success" if result else "no data")
def getList(self, data):
data.update({ "is_delete": False })
count = 0
result = []
with db_session:
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
if editor.role.name != "超级管理员":
data.update({ "create_by": editor })
result = Netdisc.select().where(**data).order_by(Netdisc.name)
count = len(result)
files = []
folders = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, only=["uuid", "name", "size", "is_dir", "parent_dir", "file_type", "create_at", "update_at"])
if item.is_dir:
t.update({
"is_dir": 1 if item.is_dir else 0,
"real_path": os.path.relpath(item.real_path, config.get("UPLOAD_PATH")).replace('\\', '/'),
"create_by": item.create_by.to_dict(only=["uuid", "username"]),
"update_by": item.update_by.to_dict(only=["uuid", "username"]),
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S"),
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S")
})
folders.append(t)
else:
t.update({
"is_dir": 1 if item.is_dir else 0,
"real_path": os.path.relpath(item.real_path, config.get("UPLOAD_PATH")).replace('\\', '/'),
"create_by": item.create_by.to_dict(only=["uuid", "username"]),
"update_by": item.update_by.to_dict(only=["uuid", "username"]),
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S"),
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S")
})
files.append(t)
result = folders + files
return result, count, "get netdisc {}.".format("success" if result else "no data")
def update(self, uuid, data):
# 当参数为空时,直接返回错误
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "parameters can not be null."
result = None
with db_session:
# 查询请求者是否存在
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = Netdisc.get(uuid=uuid)
if result:
_real = result.real_path
result.set(update_at=datetime.now(), update_by=editor, **data)
commit()
_ext = os.path.splitext(result.real_path)[-1]
_dir = os.path.dirname(result.real_path)
filename = data.get("name") + _ext
data.update({ "real_path": os.path.normpath(os.sep.join([_dir, filename])) })
result = { "src": _real, "dst": data.get("real_path") }
return result, "update netdisc {}.".format("success" if result else "fail")
netDiscManager = NetDiscManager()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import copy
import time
import types
import json
import logging
import traceback
from datetime import datetime
from pony.orm import *
from flask import request
from model import fullStackDB
from model.depot import Depot
from model.role import Role
from model.user import User
from utils import sql_filter
logger = logging.getLogger("RoleManager")
class RoleManager(object):
def __init__(self):
super(RoleManager, self).__init__()
def add(self, data):
# 判断角色名是否存在
result = Role.get(name=data.get("name"))
if result:
return False, "role name has been exists."
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
data.update({
'create_by': editor,
'create_at': datetime.now(),
'update_by': editor,
'update_at': datetime.now(),
})
result = fullStackDB.add(Role, **data)
return result, "add role {}.".format("success" if result else "fail")
def delete(self, uuid):
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = fullStackDB.update(Role, { 'uuid': uuid }, is_delete=True, delete_at=datetime.now(), delete_by=editor)
return result, "delete role {}.".format("success" if result else "fail")
def get(self, data):
result = Role.get(**data)
if result:
result = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "name", "create_at", "update_at", "delete_at"])
return result, "get role {}.".format("success" if result else "fail")
def getList(self, data):
if not data or len(data) <= 0:
return False, 0, "parameters can not be null."
temp = copy.deepcopy(data)
if 'pagenum' in temp:
temp.pop('pagenum')
if 'pagesize' in temp:
temp.pop('pagesize')
if 'scope_type' in temp:
temp.pop('scope_type')
temp.setdefault("is_delete", False)
if "scope_type" in data and data.get("scope_type") == "list":
result = Role.select().where(**temp).order_by(desc(Role.create_at))
temp = []
for item in result:
temp.append(item.to_dict(only=["uuid", "name"]))
return temp, len(temp), "get select {}.".format("success" if temp else "no data")
result = fullStackDB.pagination(Role, Role.create_at, pagenum=data.get("pagenum", 1), pagesize=data.get("pagesize", 10), **temp)
count = fullStackDB.count(Role, **temp)
if result and len(result):
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, only=["uuid", "name", "permission", "is_system", "create_by", "update_by"])
t.update({ "create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S") })
t.update({ "update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S") })
t.update({ "create_by": item.create_by.to_dict(only=["uuid", "username"]) })
t.update({ "update_by": item.update_by.to_dict(only=["uuid", "username"]) })
temp.append(t)
result = temp
return result, count, "get role {}.".format("success" if result else "no data")
def update(self, uuid, data):
# 当参数为空时,直接返回错误
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "parameters can not be null."
# 查询请求者是否存在
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = None
with db_session:
result = Role.get(uuid=uuid)
if result:
result.set(update_at=datetime.now(), update_by=editor, **data)
commit()
# result = fullStackDB.update(Role, { 'uuid': uuid }, update_at=datetime.now(), update_by=editor, **data)
return result, "update role {}.".format("success" if result else "fail")
roleManager = RoleManager()
......@@ -2,27 +2,15 @@
# -*- coding: utf_8 -*-
import os
import sys
import copy
import time
import types
import json
import logging
import traceback
import re
import tempfile
import shutil
import base64
import uuid
from hashlib import md5 as fmd5
from urllib import parse
from datetime import datetime
from threading import Thread
from werkzeug.security import check_password_hash
from app.setting import config
from utils import md5_salt, random_string
logger = logging.getLogger("UploadManager")
logger = logging.getLogger(__name__)
FileStoragePath = os.getcwd()
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import time
import json
import logging
import traceback
import copy
import uuid
from datetime import datetime
from pony.orm import *
from flask import request
from app.setting import config
from model import fullStackDB
from model.user import User
from utils import md5_salt, filter_dict, sql_filter
from utils import md5_salt
logger = logging.getLogger("UserManager")
logger = logging.getLogger(__name__)
class UserManager(object):
'''
......@@ -25,7 +19,14 @@ class UserManager(object):
def __init__(self):
super(UserManager, self).__init__()
def add(self, data):
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):
'''
添加用户
'''
......@@ -35,7 +36,7 @@ class UserManager(object):
if isExists:
return False, "user already exists"
editor = User.get(id=request.current_user.get("id"))
editor = User.get(id=uuid)
if not editor:
return False, "current user is not exists"
......@@ -60,7 +61,7 @@ class UserManager(object):
删除用户
'''
with db_session:
editor = User.get(id=request.current_user.get("id"))
editor = User.get(uuid=uuid)
if not editor:
return False, "current user is not exists"
......@@ -82,7 +83,7 @@ class UserManager(object):
with db_session:
# 查询请求者是否存在
editor = User.get(id=request.current_user.get("id"))
editor = User.get(uuid=uuid)
if not editor:
return False, "current user is not exists"
......@@ -99,12 +100,12 @@ class UserManager(object):
else:
return None, "user does not exists"
def get(self):
def get(self, user):
'''
查询单用户
'''
result = User.get(id=request.current_user.get("id"), is_delete=False)
result = User.get(id=user, is_delete=False)
if result:
temp = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "username", "account", "role", "phone", "email", "gender", "create_at", "update_at"])
temp.update({
......
'''
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 sys
import json
import getopt
import shutil
import configparser
from datetime import datetime
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import sys
import re
import logging
import traceback
import time
from datetime import datetime, timedelta, timezone
from datetime import datetime, timedelta
from functools import wraps
import jwt
from flask import jsonify, current_app, request
from flask import current_app, request
logger = logging.getLogger("auth")
logger = logging.getLogger(__name__)
class Auth(object):
......@@ -36,7 +33,7 @@ class Auth(object):
return inner
@staticmethod
def encode_auth_token(user_id, username):
def encode_auth_token(user_id, username, uuid):
"""
生成认证Token
:param user_id: int
......@@ -52,6 +49,7 @@ class Auth(object):
'sub': user_id, # token所属者
'data': { # payload
'id': user_id,
'uuid': uuid,
'username': username
}
}
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from pony.orm import PrimaryKey, Required, Optional, LongStr
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, Json
from pony.orm import PrimaryKey, Required, Optional, Json
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from pony.orm import PrimaryKey, Required, Optional, Set
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from pony.orm import PrimaryKey, Required, Optional, Json
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from pony.orm import PrimaryKey, Required, Optional, Set
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
......
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, Json
from pony.orm import PrimaryKey, Required, Optional
from app import config
from . import fullStackDB
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-06-30 23:52:39
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\model\monitor.py
'''
#!/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, Float, DateTime, Numeric
from sqlalchemy import func, Column, Integer, String, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, class_mapper, object_mapper
from sqlalchemy.orm import sessionmaker, class_mapper
engine = create_engine('sqlite:///{}?check_same_thread=False'.format(config.get("DATABASE")), echo=False)
......@@ -24,6 +17,9 @@ 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))
......@@ -136,6 +132,34 @@ class Image(Base):
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
class User(Base):
__tablename__ = "{}".format(config['TABLE_PREFIX']) + "user"
id = Column(Integer, primary_key=True, autoincrement=True)
uuid = Column(String(64), default=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中创建的连接
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid
from datetime import datetime
from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from app import config
from . import fullStackDB
db = fullStackDB.db
class Netdisc(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "netdisc"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
name = Required(str, max_len=200) # 文件名
size = Required(int, default=0) # 文件大小
file_type = Required(str) # 文件类型
is_dir = Required(bool, default=False) # 是否是目录
parent_dir = Required(str, default='/') # 上级目录
real_path = Required(str) # 真实路径
create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='netdisc_creator') # NetDisc与User一对一关系
update_at = Required(datetime, default=datetime.now)
update_by = Required("User", reverse='netdisc_updater') # NetDisc与User一对一关系
delete_at = Optional(datetime)
delete_by = Optional("User", reverse='netdisc_deleter') # NetDisc与User一对一关系
is_delete = Required(bool, default=False)
sort = Optional(int, size=32, default=0)
remarks = Optional(str, max_len=255, default="", nullable=True)
\ No newline at end of file
......@@ -3,7 +3,7 @@
import uuid
from datetime import datetime, date
from pony.orm import PrimaryKey, Required, Optional, Set, Json
from pony.orm import PrimaryKey, Required, Optional, Set
from app import config
from . import fullStackDB
......
This diff is collapsed.
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-01 00:06:01
LastEditTime: 2021-07-14 21:37:53
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\start.py
......@@ -16,7 +16,6 @@ from tornado.wsgi import WSGIContainer
from tornado.web import Application, RequestHandler, FallbackHandler
from tornado.ioloop import IOLoop
from tornado.autoreload import watch
from fullstack.log import logger
from view import app
from view.monitor import DeviceMessageHandler, NotifyHandler, WatchHandler
from app import config
......@@ -26,9 +25,7 @@ class GracefulExit(SystemExit):
class VueHandler(RequestHandler):
def get(self):
remote_ip = self.request.remote_ip
logger.info("remote_ip %s" % remote_ip)
self.render("index.html")
self.write(json.dumps({ 'code': 200, 'msg': 'success', 'data': self.request.remote_ip }))
def raise_graceful_exit(*args):
IOLoop.current().stop()
......@@ -38,15 +35,14 @@ def raise_graceful_exit(*args):
def start():
settings = {
'debug': config['DEBUG'],
'template_path': config['TEMPLATE_PATH'],
'static_path': config['STATIC_PATH'],
# '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'/index', VueHandler),
(r"/api/v1/evm_store/monitor", DeviceMessageHandler),
(r"/api/v1/evm_store/watch", WatchHandler),
(r"/ws/v1/notify", NotifyHandler),
......
......@@ -13,7 +13,6 @@ import string
import datetime
import threading
import decimal
import uuid
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
......
'''
Author: your name
Date: 2021-04-29 12:12:01
LastEditTime: 2021-07-12 00:56:10
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
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-06-29 19:37:32
LastEditTime: 2021-07-03 11:43:10
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\view\__init__.py
......@@ -18,7 +18,6 @@ from .api import api
from .files import file_api
from .login import login_api
from .user import user_api
from .annex import annex_api
from .apps import apps_api
from .device import device_api
from .download import download_api
......@@ -48,7 +47,6 @@ def create_app():
app.register_blueprint(login_api)
app.register_blueprint(file_api)
app.register_blueprint(user_api)
app.register_blueprint(annex_api)
app.register_blueprint(apps_api)
app.register_blueprint(download_api)
app.register_blueprint(device_api)
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import json
import datetime
import logging
import traceback
from flask import Blueprint, request
from app import config, signalManager
from fullstack.login import Auth
from fullstack.validation import validate_schema
from fullstack.response import ResponseCode, response_result
from schema.annex import AddSchema, DeleteSchema, QuerySchema, UpdateSchema, ResponseSchema
logger = logging.getLogger(__name__)
annex_api = Blueprint("annex_api", __name__, url_prefix="/api/v1/%s/annex" % config['NAME'])
@annex_api.route("/add", methods=['POST'])
@validate_schema(AddSchema)
@Auth.auth_required
def add():
try:
isSuccess, message = signalManager.actionAddAnnex.emit(request.schema_data)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@annex_api.route("/delete/<uuid:id>", methods=['POST'])
@validate_schema(DeleteSchema)
@Auth.auth_required
def delete(id):
try:
isSuccess, message = signalManager.actionDeleteAnnex.emit(id)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR)
@annex_api.route("/get", methods=["POST"])
@validate_schema(QuerySchema)
@Auth.auth_required
def get():
try:
result, message = signalManager.actionGetAnnex.emit(request.schema_data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@annex_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
def get_list():
try:
result, count, message = signalManager.actionGetAnnexList.emit(request.schema_data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message, count=count)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR)
@annex_api.route("/update/<uuid:id>", methods=['POST'])
@validate_schema(UpdateSchema)
@Auth.auth_required
def update(id):
try:
isSuccess, message = signalManager.actionUpdateAnnex.emit(id, request.schema_data)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR)
......@@ -5,6 +5,7 @@ import json
import logging
import traceback
import uuid
import time
import sqlite3
from datetime import datetime
......@@ -55,6 +56,77 @@ def hello_evm():
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
......
'''
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 os
import json
import datetime
import logging
import traceback
from flask import Blueprint, request
......@@ -10,7 +15,7 @@ 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, ResponseSchema
from schema.app_logs import AddSchema, DeleteSchema, QuerySchema, UpdateSchema
logger = logging.getLogger(__name__)
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import json
import logging
import traceback
from datetime import datetime
......@@ -13,7 +12,7 @@ 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, DeleteSchema, QuerySchema, UpdateSchema
from schema.apps import AddSchema, QuerySchema, UpdateSchema
from schema.build_logs import AddSchema as LogAddScheme, QuerySchema as LogQuerySchema
logger = logging.getLogger(__name__)
......
'''
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 os
import json
import datetime
import logging
import traceback
from flask import Blueprint, request
......@@ -10,7 +15,7 @@ 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, DeleteSchema, QuerySchema, UpdateSchema
from schema.device import AddSchema, QuerySchema, UpdateSchema
logger = logging.getLogger(__name__)
......
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import json
import datetime
import logging
import traceback
from flask import Blueprint, request
......@@ -54,15 +51,18 @@ def delete(id):
@validate_schema(DownloadSchema)
def get():
try:
result, message = signalManager.actionGetDownload.emit(request.schema_data)
print(message)
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文件,按照格式返回相应结构体数据
ret = ""
if isinstance(result, str) and os.path.exists(result):
with open(result, "rb") as f:
ret = f.read()
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="file not found")
return response_result(ResponseCode.SERVER_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
......
......@@ -2,15 +2,12 @@
# -*- coding: utf_8 -*-
import os
import re
import sys
import traceback
import tempfile
import shutil
import base64
import logging
from hashlib import md5 as fmd5
from flask import Blueprint, request, redirect, url_for, json
from flask import Blueprint, request, json
from app.setting import config
from pony.orm import *
......
'''
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, json, Response
from flask import Blueprint, request, redirect, url_for
from app import config, signalManager
from fullstack.login import Auth
from fullstack.validation import validate_schema
......
This diff is collapsed.
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import json
import datetime
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.netdisc import AddSchema, DeleteSchema, QuerySchema, UpdateSchema
from utils import random_string
logger = logging.getLogger(__name__)
netdisc_api = Blueprint("netdisc_api", __name__, url_prefix="/api/v1/%s/netdisc" % config['NAME'])
FileStoragePath = os.path.normpath(os.path.join(config.get("UPLOAD_PATH"), config.get("NETDISC")))
if not os.path.exists(FileStoragePath):
os.mkdir(FileStoragePath)
@netdisc_api.route("/add", methods=['POST'])
@validate_schema(AddSchema)
@Auth.auth_required
def add():
try:
binfile = request.files.get("binfile")
information = {
"name": "",
"size": 0,
"is_dir": False,
"file_type": request.schema_data.get("file_type"),
"parent_dir": request.schema_data.get("parent_dir"),
"real_path": "",
}
if not binfile and not request.schema_data.get("file_type") and not request.schema_data.get("parent_dir") and not request.schema_data.get("name"):
return response_result(ResponseCode.NO_DATA, msg="file can not be null")
if os.path.normpath(information['parent_dir']).replace('\\', '/') == "/":
result = { "real_path": FileStoragePath }
else:
t = os.path.normpath(information['parent_dir']).replace('\\', '/')
b = os.path.basename(t)
d = os.path.dirname(t)
result, message = signalManager.actionGetNetDisc.emit({ "name": b, "parent_dir": d })
if not result:
return response_result(ResponseCode.NO_DATA_FOUND, msg="parent directory does not exists.")
if not binfile:
information['is_dir'] = True
information['file_type'] = 'dir'
information['name'] = request.schema_data.get("name")
information['real_path'] = os.path.normpath(os.sep.join([result.get("real_path"), information['name']]))
information['parent_dir'] = os.path.normpath(information['parent_dir']).replace('\\', '/')
# os.path.relpath()
if os.path.exists(information['real_path']):
return response_result(ResponseCode.EXISTS_ERROR, msg="File [%s] is existed! Please remove firstly" % information['real_path'])
print(result.get("real_path"), information['name'])
os.chdir(result.get("real_path")) # 切换目录
os.mkdir(information['name']) # 创建目录
else:
information['name'] = binfile.filename
saveFile = os.path.normpath(os.sep.join([result.get("real_path"), information['name']]))
if os.path.exists(saveFile):
return response_result(ResponseCode.EXISTS_ERROR, msg="File [%s] is existed! Please remove firstly" % saveFile)
with open(saveFile, 'wb') as f:
f.write(binfile.stream.read())
information['size'] = os.path.getsize(saveFile)
if not information['file_type']:
information['file_type'] = os.path.splitext(information['name'])[-1]
information['real_path'] = saveFile
information['parent_dir'] = os.path.normpath(information['parent_dir']).replace('\\', '/')
isSuccess, message = signalManager.actionAddNetDisc.emit(information)
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))
@netdisc_api.route("/delete", methods=['POST'])
@validate_schema(DeleteSchema)
@Auth.auth_required
def delete():
try:
result, message = signalManager.actionDeleteNetDisc.emit(request.schema_data)
if result:
for f in result:
if f[0]: os.rmdir(f[1])
else: os.remove(f[1])
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)
@netdisc_api.route("/get", methods=["POST"])
@validate_schema(QuerySchema)
@Auth.auth_required
def get():
try:
result, message = signalManager.actionGetNetDisc.emit(request.schema_data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
return response_result(ResponseCode.REQUEST_ERROR, msg=message)
except Exception as e:
traceback.print_exc()
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@netdisc_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
def get_list():
try:
result, count, message = signalManager.actionGetNetDiscList.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)
@netdisc_api.route("/update/<uuid:id>", methods=['POST'])
@validate_schema(UpdateSchema)
@Auth.auth_required
def update(id):
try:
result, message = signalManager.actionUpdateNetDisc.emit(id, request.schema_data)
if result:
print(result)
os.rename(result.get("src"), result.get("dst"))
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)
......@@ -2,13 +2,12 @@
# -*- coding: utf_8 -*-
import logging
import traceback
from flask import Blueprint, request, redirect, url_for, json, Response
from flask import Blueprint, request
from app import config, signalManager
from utils import filter_dict
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, ResponseSchema
from schema.user import AddSchema, DeleteSchema, UpdateSchema, QuerySchema
logger = logging.getLogger(__name__)
......@@ -22,14 +21,13 @@ def add():
新增用户
'''
try:
isSuccess, message = signalManager.actionAddUser.emit(request.schema_data)
isSuccess, message = signalManager.actionAddUser.emit(request.current_user.get("id"), request.schema_data)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
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))
......@@ -59,7 +57,7 @@ def get():
查找单个用户
'''
try:
result, message = signalManager.actionGetUser.emit()
result, message = signalManager.actionGetUser.emit(request.current_user.get("id"))
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-06-29 19:39:04
LastEditors: your name
LastEditTime: 2021-07-03 11:57:41
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\backend\view\ws.py
'''
......@@ -36,7 +36,7 @@ def pushmessage(func):
try:
if isinstance(msg, WebsocketResponse) or isinstance(msg, dict):
self.write_message(json.dumps(msg), binary)
elif isinstance(msg, str) or isinstance(msg, unicode):
elif isinstance(msg, str) or isinstance(msg, str):
self.write_message(msg, binary)
else:
self.write_message(repr(msg), binary)
......
......@@ -15,7 +15,6 @@
<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>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.1.1/dist/gsap.min.js"></script>
</body>
</html>
\ No newline at end of file
......@@ -323,37 +323,6 @@ export function getPaybackList(params) {
});
}
export function addAnnex(params) {
return request({
url: "/api/v1/evm_store/annex/add",
method: "post",
data: params,
});
}
export function deleteAnnex(id) {
return request({
url: `/api/v1/evm_store/annex/delete/${id}`,
method: "post",
});
}
export function getAnnexList(params) {
return request({
url: "/api/v1/evm_store/annex/list",
method: "post",
data: params,
});
}
export function updateAnnex(id, params) {
return request({
url: `/api/v1/evm_store/annex/update/${id}`,
method: "post",
data: params,
});
}
export function deleteProjectUser(params) {
return request({
url: "/api/v1/evm_store/system/deleteProjectUser",
......
......@@ -433,7 +433,7 @@
<div class="dropdown" v-show="userShow" style="right: 20px;">
<ul>
<li @click="redirectTo('/profile')">
<li @click="redirectTo('/profile/index')">
<i aria-label="图标: user" class="webicon">
<svg viewBox="64 64 896 896" data-icon="user" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false"><path d="M858.5 763.6a374 374 0 0 0-80.6-119.5 375.63 375.63 0 0 0-119.5-80.6c-.4-.2-.8-.3-1.2-.5C719.5 518 760 444.7 760 362c0-137-111-248-248-248S264 225 264 362c0 82.7 40.5 156 102.8 201.1-.4.2-.8.3-1.2.5-44.8 18.9-85 46-119.5 80.6a375.63 375.63 0 0 0-80.6 119.5A371.7 371.7 0 0 0 136 901.8a8 8 0 0 0 8 8.2h60c4.4 0 7.9-3.5 8-7.8 2-77.2 33-149.5 87.8-204.3 56.7-56.7 132-87.9 212.2-87.9s155.5 31.2 212.2 87.9C779 752.7 810 825 812 902.2c.1 4.4 3.6 7.8 8 7.8h60a8 8 0 0 0 8-8.2c-1-47.8-10.9-94.3-29.5-138.2zM512 534c-45.9 0-89.1-17.9-121.6-50.4S340 407.9 340 362c0-45.9 17.9-89.1 50.4-121.6S466.1 190 512 190s89.1 17.9 121.6 50.4S684 316.1 684 362c0 45.9-17.9 89.1-50.4 121.6S557.9 534 512 534z"></path></svg>
</i>个人中心
......@@ -507,6 +507,8 @@ export default {
if (path == "/login") {
this.$store.dispatch("user/removeRole")
this.$store.dispatch("user/removeToken")
} else if (path == "/profile/index" && this.$route.path == "/profile/index") {
return false;
}
this.$router.push(path)
},
......
/*
* @Author: your name
* @Date: 2021-04-14 14:12:19
* @LastEditTime: 2021-07-01 00:41:19
* @LastEditTime: 2021-07-14 21:29:01
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\main.js
*/
import Vue from "vue";
import "normalize.css/normalize.css"; // A modern alternative to CSS resets
import "normalize.css/normalize.css";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
......
import router from "./router";
import store from "@/store"; // get token from cookie
import NProgress from "nprogress"; // progress bar
import "nprogress/nprogress.css"; // progress bar style
import router from "@/router";
import store from "@/store";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { getPageTitle } from "@/utils/index";
const whiteList = ["/login", "/register"];
......
......@@ -238,7 +238,7 @@ export const constantRoutes = [
path: 'index',
name: 'Monitor',
component: () => import('@/views/system/monitor'),
meta: { title: 'monitor', icon: 'home' }
meta: { title: '资源监视', icon: 'home' }
}]
},
{
......
/*
* @Author: your name
* @Date: 2021-04-14 14:12:19
* @LastEditTime: 2021-07-01 11:26:51
* @LastEditTime: 2021-07-14 21:28:48
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\settings.js
......@@ -71,6 +71,20 @@ export default {
icon: "gongzuotai",
path: "monitor/index",
},
// {
// vue: "system/chart.vue",
// title: "实时曲线",
// name: "AppChart",
// icon: "gongzuotai",
// path: "chart/index",
// },
// {
// vue: "system/history.vue",
// title: "历史曲线",
// name: "AppHistoryChart",
// icon: "gongzuotai",
// path: "history/index",
// },
{
vue: "system/chart.vue",
title: "实时曲线",
......
/*
* @Author: your name
* @Date: 2021-04-14 14:12:19
* @LastEditTime: 2021-07-01 01:11:46
* @LastEditTime: 2021-07-14 21:27:18
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\utils\wsNotify.js
......
This diff is collapsed.
......@@ -31,15 +31,14 @@ module.exports = {
// change xxx-api/login => mock/login
// detail: https://cli.vuejs.org/config/#devserver-proxy
"/api/v1": {
target: "http://127.0.0.1:5001/",
target: "http://127.0.0.1:3000/",
changeOrigin: true,
pathRewrite: {},
},
"/api/v1/kxpms": {
target: "http://192.168.1.106:5000/",
"/api/v1/evm_store": {
target: "http://store.evmiot.com/",
changeOrigin: true,
pathRewrite: {
"^/online": "/",
// 这里理解成用/api代替target里面的地址,后面组件中我们调用接口时直接用api代替
// 比如我要调用'http://40.00.100.100:3002/user/add',直接写'/api/user/add'即可
},
......
'''
Author: your name
Date: 2021-06-30 17:43:46
<<<<<<< HEAD
LastEditTime: 2021-07-09 13:10:51
=======
LastEditTime: 2021-07-14 19:05:56
>>>>>>> eddff974ce207e3e9de5b4a25fc8c30e1d2283ae
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\__init__.py
......
<<<<<<< HEAD
=======
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:06:40
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\area.py
'''
>>>>>>> eddff974ce207e3e9de5b4a25fc8c30e1d2283ae
from datetime import datetime
from application.app import db
from models.area import AreaModel
......
<<<<<<< HEAD
=======
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:08:22
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\package.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import re
import shutil
>>>>>>> eddff974ce207e3e9de5b4a25fc8c30e1d2283ae
from datetime import datetime
from application.app import db
from models.package import PackageModel
......
<<<<<<< HEAD
=======
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:08:34
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\user.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
>>>>>>> eddff974ce207e3e9de5b4a25fc8c30e1d2283ae
from datetime import datetime
from application.app import db
from models.user import UserModel
......
This diff is collapsed.
<<<<<<< HEAD
=======
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:10:44
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\views\login.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
>>>>>>> eddff974ce207e3e9de5b4a25fc8c30e1d2283ae
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
......
<<<<<<< HEAD
=======
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:11:10
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\views\package.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
>>>>>>> eddff974ce207e3e9de5b4a25fc8c30e1d2283ae
from flask import current_app, jsonify, request
from flask_restful import Resource
from flask_restful.reqparse import RequestParser
......
......@@ -103,7 +103,6 @@ import PageHeaderWrapper from "@/components/PageHeaderWrapper";
import DescriptionItem from "@/components/DescriptionItem";
export default {
name: 'BasicForm',
i18n: require('./i18n'),
data () {
return {
value: 1
......
......@@ -131,6 +131,31 @@ def handleModules(config):
else:
log.logger.error("文件:%s 不存在")
def handleModuleConfig(config):
# 处理每一项配置文件
# 入口文件名
# 实例对象,根据这个实例连接对应请求
# 实例方法,需要根据实例方法生成事件函数
'''
'''
pass
def handleModules(config):
global output_dir
# 遍历modules结构,判断文件是否存在,并且enable已经打开
# 如果文件不存在,则直接报错
# 本质上这是一个文件拷贝的操作
for mod in config:
p = Path(mod.get("config"))
if not p.exists() or not mod.get("enable"):
continue
shutil.copyfile(mod.get("config"), os.sep.join([output_dir, "controllers", p.name]))
for d in mod.get("dependencies"):
if Path(d).exists():
shutil.copyfile(d, os.sep.join([output_dir, "controllers", Path(d).name]))
else:
log.logger.error("文件:%s 不存在")
def handleResources(config):
# 处理路由页面
# 遍历config文件,收集所有的action和name,action和name的首字母必须大写
......
......@@ -2,8 +2,14 @@ import pprint
import base64
from pathlib import Path
import json
import mimetypes
from webcreator.log import logger
from application.config import config
from webcreator.response import ResponseCode
disk_root = "D:\\projects\\scriptiot\\evm_app_store_files"
disk_root = config.UPLOAD_ROOT_DIR
logger.info(disk_root)
class FileManager(object):
def __init__(self) -> None:
......@@ -42,7 +48,7 @@ class FileManager(object):
child.name: { "driver": "local" }
})
return result
return result, ResponseCode.HTTP_SUCCESS
'''
@description: 获取当前类别的目录信息
......@@ -89,7 +95,7 @@ class FileManager(object):
disk_path = Path(disk_root).joinpath(disk)
if not disk_path.exists():
return result
target_path = disk_path.joinpath(target_path)
if not target_path.exists():
return result
......@@ -122,7 +128,7 @@ class FileManager(object):
f.write(json.dumps(result, ensure_ascii=True))
pprint.pprint(result)
return result
return result, ResponseCode.HTTP_SUCCESS
'''
@description: 获取目录结构树
......@@ -167,29 +173,86 @@ class FileManager(object):
"timestamp": int(child.stat().st_mtime),
"type": "dir"
})
# print("//////////", child.is_dir(), child.resolve(), child.name, child.parent, child.root, child.relative_to(rp))
pprint.pprint(result)
return result
return result, ResponseCode.HTTP_SUCCESS
def disk(self, disk):
# select-disks
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def upload(self, disk):
# select-disks
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def create_dir(self, disk, target_file):
# create directory
print(disk, target_file)
return True, ResponseCode.HTTP_SUCCESS
def create_file(self, disk, target_file, content):
# create file
print(disk, target_file, content)
return True, ResponseCode.HTTP_SUCCESS
def delete(self, disk):
# delete file
print(disk)
return True
return True, ResponseCode.HTTP_SUCCESS
def download(self, disk):
def copy(self, disk):
# copy file
print(disk)
return True
return True, ResponseCode.HTTP_SUCCESS
def cut(self, disk):
# cut file
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def paste(self, disk):
# paste file
print(disk)
return True, ResponseCode.HTTP_SUCCESS
def download(self, disk, target_file):
# 获取文件内容
if not target_file:
target_file = Path('result.json')
else:
target_file = Path(disk_root).joinpath(disk).joinpath(target_file)
if not target_file.exists():
return False, ResponseCode.HTTP_NOT_FOUND
# with open(target_file.resolve().as_posix(), "r", encoding="utf-8") as f:
# data = f.read()
# logger.info(data)
mime = mimetypes.guess_type(target_file.resolve().as_posix())[0]
content = target_file.read_text(encoding="utf-8")
return (content, mime), ResponseCode.HTTP_SUCCESS
def preview(self, disk, target_file):
# 预览图片
img_stream = None
if not target_file:
target_file = './evue_photo.png'
with open(target_file, 'rb') as img_f:
img_stream = img_f.read()
img_stream = base64.b64encode(img_stream).decode()
print(disk, target_file)
return img_stream
target_file = Path('evue_photo.png')
else:
target_file = Path(disk_root).joinpath(disk).joinpath(target_file)
if not target_file.exists():
return False, ResponseCode.HTTP_NOT_FOUND
mime = mimetypes.guess_type(target_file.resolve().as_posix())[0]
# mime = MimeTypes.guess_type(target_file.resolve().as_posix())
img_stream = target_file.read_bytes()
# with open(target_file, 'rb') as img_f:
# img_stream = img_f.read()
# img_stream = base64.b64encode(img_stream).decode()
return (img_stream, mime), ResponseCode.HTTP_SUCCESS
fileManager = FileManager()
......@@ -204,7 +267,7 @@ if __name__ == "__main__":
result = fileManager.initialize()
print("----->", result)
result = fileManager.content("uploads", "evueapps/evm")
print(">>>>>>", result)
......@@ -212,4 +275,4 @@ if __name__ == "__main__":
print("=====>", result)
result = fileManager.preview("uploads", "evueapps/evm")
print("$$$$$>", result)
\ No newline at end of file
print("$$$$$>", result)
'''
Author: your name
Date: 2021-06-15 17:40:06
LastEditTime: 2021-06-30 18:17:48
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\application\__init__.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
......
'''
Author: your name
Date: 2021-06-15 17:40:09
LastEditTime: 2021-06-30 18:09:51
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\manager.py
'''
# -*- coding: utf-8 -*-
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
......
'''
Author: your name
Date: 2021-04-22 18:04:10
LastEditTime: 2021-06-30 17:22:15
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\models\__init__.py
'''
# -*- coding: utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
......
'''
Author: your name
Date: 2021-06-15 17:40:14
LastEditTime: 2021-06-30 17:22:44
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\webcreator\event.py
'''
# -*- coding: utf_8 -*-
<<<<<<< HEAD
############################
# 信号槽
############################
=======
>>>>>>> 68ec88f3f356b5c61817a0f9df8d40a3e46b4fd0
class PySignal(object):
"""
Simple event class used to provide hooks for different types of events in Locust.
......
'''
Author: your name
Date: 2021-04-22 18:04:15
LastEditTime: 2021-07-09 00:52:08
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\resources\webcreator\log.py
'''
# -*- coding: utf_8 -*-
import os
......
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