Commit 016f1194 authored by wanli's avatar wanli

update

parent 06038fd0
No preview for this file type
......@@ -17,12 +17,12 @@ config = dict(
BACKUP_DIR=conf.get('application', 'backup_dir'),
NETDISC=conf.get('uploads', 'netdisc'),
DATABASE=conf.get('database', 'filename'),
DATABASE_FILE=conf.get('scheduler', 'db'),
PONY={
'provider': conf.get('database', 'provider'),
'filename': "../{}".format(conf.get('database', 'filename')),
'create_db': True,
},
DATABASE_FILE=conf.get('scheduler', 'db'),
TABLE_PREFIX='evm_store_',
MD5_SALT="EhuqUkwV",
UPLOAD_SERVER="{}://{}:{}/".format(conf.get('uploads', 'protocol'), conf.get('uploads', 'host'), conf.get('uploads', 'port')),
......
......@@ -53,6 +53,20 @@ class SignalManager(object):
actionGetAnnexList = PySignal()
actionUpdateAnnex = PySignal()
# 系统框架模块
actionAddFramework = PySignal()
actionDeleteFramework = PySignal()
actionGetFramework = PySignal()
actionGetFrameworkList = PySignal()
actionUpdateFramework = PySignal()
# 应用下载统计模块
actionAddDownload = PySignal()
actionDeleteDownload = PySignal()
actionGetDownload = PySignal()
actionGetDownloadList = PySignal()
actionUpdateDownload = PySignal()
def __init__(self):
super(SignalManager, self).__init__()
......
......@@ -17,4 +17,6 @@ db = scheduler.db
name = evm_store
nginx = NginxService
backup_dir = backup
evueapps_dir = evueapps
\ No newline at end of file
evueapps_dir = evueapps
launcher_dir = launcher
framework = framework
\ No newline at end of file
......@@ -9,6 +9,8 @@ from .login_manager import loginManager
from .annex_manager import annexManager
from .upload_manager import uploadManager
from .apps_manager import appsManager
from .download_manager import downloadManager
from .framework_manager import frameworkManager
from .build_logs_manager import buildLogsManager
logger = logging.getLogger("controller")
......@@ -50,4 +52,18 @@ def initConnect():
signalManager.actionGetAnnexList.connect(annexManager.getList)
signalManager.actionUpdateAnnex.connect(annexManager.update)
# 系统框架模块
signalManager.actionAddFramework.connect(frameworkManager.add)
signalManager.actionDeleteFramework.connect(frameworkManager.delete)
signalManager.actionGetFramework.connect(frameworkManager.get)
signalManager.actionGetFrameworkList.connect(frameworkManager.getList)
signalManager.actionUpdateFramework.connect(frameworkManager.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)
initConnect()
\ No newline at end of file
......@@ -39,18 +39,23 @@ class AppsManager(object):
'update_at': datetime.now(),
})
icon = Annex(title=data.get("app_icon").get("filename"), path=data.get("app_icon").get("filepath"), size=data.get("app_icon").get("filesize"), create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now())
commit()
app_files = []
if data.get("app_files"):
app_files = data.get("app_files")
data.pop("app_files")
data.update({ "app_icon": icon })
result = Apps(**data)
commit()
for a in app_files:
Annex(app_id=result, title=a.get("filename"), path=a.get("filepath"), size=a.get("filesize"), create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now())
flush()
commit()
if result:
for a in app_files:
Annex(app=result, title=a.get("filename"), path=a.get("filepath"), size=a.get("filesize"), create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now())
flush()
commit()
return result, "add app {}.".format("success" if result else "fail")
......@@ -89,15 +94,15 @@ class AppsManager(object):
temp.append(item.to_dict(only=["uuid", "app_name"]))
return temp, len(temp), "get app {}.".format("success" if temp else "fail")
result = Apps.select().where(**temp).order_by(desc(Apps.create_at)).page(data.get("pagenum", 1), pagesize=data.get("pagesize", 10))
count = Apps.select().where(**temp).count()
if result and len(result):
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, exclude=["app_annex", "app_build_log", "is_delete", "delete_by", "delete_at"])
t = item.to_dict(with_collections=True, related_objects=True, exclude=["app_annex", "app_build_log", "app_download", "is_delete", "delete_by", "delete_at"])
t.update({
"app_icon": item.app_icon.to_dict(only=["path"]),
"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,
......@@ -113,12 +118,42 @@ class AppsManager(object):
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "app can not be null."
# 查询请求者是否存在
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
with db_session:
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
result = Apps.get(uuid=uuid)
if not result:
return False, "app not found"
if data.get("app_files"):
app_files = data.get("app_files")
for a in app_files:
Annex(app=result, title=a.get("filename"), path=a.get("filepath"), size=a.get("filesize"), create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now())
flush()
commit()
data.pop("app_files")
if data.get("app_icon"):
condition = {
'update_by': editor,
'update_at': datetime.now()
}
if data.get("app_icon").get("filename"):
condition.update({"title": data.get("app_icon").get("filename")})
if data.get("app_icon").get("filepath"):
condition.update({"path": data.get("app_icon").get("filepath")})
if data.get("app_icon").get("filesize"):
condition.update({"size": data.get("app_icon").get("filesize")})
result.app_icon.set(**condition)
commit()
data.pop("app_icon")
result.set(update_at=datetime.now(), update_by=editor, **data)
commit()
result = fullStackDB.update(Apps, { 'uuid': uuid }, update_at=datetime.now(), update_by=editor, **data)
return result, "update app {}.".format("success" if result else "fail")
return result, "update app {}.".format("success" if result else "fail")
appsManager = AppsManager()
......@@ -28,32 +28,32 @@ class BuildLogsManager(object):
def __init__(self):
super(BuildLogsManager, self).__init__()
def add(self, app_id):
def add(self, app):
with db_session:
editor = User.get(id=request.current_user.get("id"))
if not editor:
return False, "current user is not exists"
# 根据app_id查询应用,获取应用有哪些文件
# 根据app查询应用,获取应用有哪些文件
# 按格式创建文件夹,将这些文件移动到这个文件夹
# 将这些零散文件进行打包
# 更新数据库对应文件的路径
app = Apps.get(uuid=app_id)
app = Apps.get(uuid=app)
if not app:
return None, "app not found"
source_files = Annex.select().filter(app_id=app)
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, int(time.time()))
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:
parsed_result = urlparse(sf.path)
......@@ -84,7 +84,7 @@ class BuildLogsManager(object):
epk_path = urljoin(config.get("UPLOAD_SERVER"), epk_path.replace('\\', '/'))
app_info['md5'] = str(app_info['md5'])
result = BuildLogs(app_id=app, app_path=epk_path, app_info=app_info, create_by=editor, create_at=datetime.now(), update_by=editor, update_at=datetime.now())
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()
return epk_path, "add build_logs {}.".format("success" if result else "fail")
......@@ -131,7 +131,7 @@ class BuildLogsManager(object):
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, exclude=["is_delete", "delete_by", "delete_at"])
t.update({
"app_id": item.app_id.to_dict(exclude=["is_delete", "delete_by", "delete_at"]),
"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,
......
This diff is collapsed.
#!/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.framework import Framework
from model.user import User
from utils import sql_filter
logger = logging.getLogger("FrameworkManager")
class FrameworkManager(object):
def __init__(self):
super(FrameworkManager, 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(Framework, **data)
return result, "add framework {}.".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(Framework, { 'uuid': uuid }, is_delete=True, delete_at=datetime.now(), delete_by=editor)
return result, "delete framework {}.".format("success" if result else "fail")
def get(self, data):
result = Framework.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 framework {}.".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 = Framework.select().where(**temp).order_by(desc(Framework.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(Framework, Framework.create_at, pagenum=data.get("pagenum", 1), pagesize=data.get("pagesize", 10), **temp)
count = fullStackDB.count(Framework, **temp)
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 framework {}.".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 = Framework.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")
frameworkManager = FrameworkManager()
......@@ -118,7 +118,7 @@ class UserManager(object):
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", "hometown", "contact", "email",])
result = user.to_dict(only=["account", "gender", "birthday", "hometown", "phone", "email",])
if result.get("birthday"):
result.update({ "birthday": result.get("birthday").strftime("%Y-%m-%d") })
return result, "update user success"
......@@ -131,7 +131,7 @@ class UserManager(object):
'''
result = User.get(id=request.current_user.get("id"), is_delete=False)
if result:
temp = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "username", "account", "contact", "email", "hometown", "gender", "birthday", "entry_time", "expire_date", "create_at", "update_at"])
temp = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "username", "account", "phone", "email", "hometown", "gender", "birthday", "entry_time", "expire_date", "create_at", "update_at"])
temp.update({
"birthday": result.birthday.strftime("%Y-%m-%d") if result.birthday else None,
"create_at": result.create_at.strftime("%Y-%m-%d %H:%M:%S") if result.create_at else None,
......@@ -218,7 +218,7 @@ class UserManager(object):
if result and len(result):
temp = []
for item in result:
t = item.to_dict(with_collections=True, related_objects=True, only=["uuid", "username", "account", "contact", "email", "hometown", "gender", "birthday", "entry_time", "expire_date", "create_at", "update_at", "remarks"])
t = item.to_dict(with_collections=True, related_objects=True, only=["uuid", "username", "account", "phone", "email", "hometown", "gender", "birthday", "entry_time", "expire_date", "create_at", "update_at", "remarks"])
t.update({
"email": "" if item.email == "user@example.com" else item.email,
"birthday": item.birthday.strftime("%Y-%m-%d") if item.birthday else None,
......
......@@ -9,7 +9,7 @@ from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
jobstores = {
# 'mongo': MongoDBJobStore(),
'default': SQLAlchemyJobStore(url='sqlite:///{}'.format(config.get("DATABASE_FILE")), engine_options={ 'connect_args': { 'timeout': 15 } })
'default': SQLAlchemyJobStore(url='sqlite:///{}'.format("scheduler.db", engine_options={ 'connect_args': { 'timeout': 15 } })
}
executors = {
'default': ThreadPoolExecutor(20),
......
......@@ -13,7 +13,8 @@ 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_id = Optional("Apps", reverse="app_annex")
app = Optional("Apps", reverse="app_annex")
app_icon = Optional("Apps", reverse="app_icon")
title = Required(str, max_len=200) # 文件名
path = Required(LongStr) # 文件路径
type = Required(int, default=0) # 文件类型 PNG/JPG/GIF/MP3/MP4/DOCX/XLSX/PPT/PDF...
......
#!/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
# 当前用户拥有哪些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")
imei = Optional(str)
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
......@@ -7,6 +7,10 @@ from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from app import config
from . import fullStackDB
# ********************************
from .app_users import AppUser
# ********************************
db = fullStackDB.db
class Apps(db.Entity):
......@@ -15,10 +19,14 @@ class Apps(db.Entity):
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
app_name = Required(str, max_len=200)
app_version = Optional(str, default="")
app_logo = Optional(str, default="")
app_url = Optional(str, default="")
category = Optional(str, default="")
app_icon = Required("Annex", reverse="app_icon")
app_desc = Optional(str, default="")
app_annex = Set("Annex", reverse="app_id")
app_build_log = Set("BuildLogs", reverse="app_id")
app_annex = Set("Annex", reverse="app")
app_user = Optional("AppUser", reverse="app")
app_build_log = Set("BuildLogs", reverse="app")
app_download = Set("AppDownload", reverse="app")
create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='apps_creator') # BuildLogs与User一对一关系
update_at = Required(datetime, default=datetime.now)
......
......@@ -13,7 +13,7 @@ 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_id = Optional("Apps", reverse="app_build_log")
app = Optional("Apps", reverse="app_build_log")
app_path = Optional(str, default="")
app_info = Optional(Json, default={})
create_at = Required(datetime, default=datetime.now)
......
#!/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 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)
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, Set, LongStr, Json
from app import config
from . import fullStackDB
db = fullStackDB.db
class Framework(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "framework"
id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
name = Required(str) # 名称
url = Required(str) # 路径
desc = Required(str) # 描述信息
type = Required(str) # 模板类型
assets = Optional(Json, default={}) # 静态资源文件
create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='framework_creator')
update_at = Required(datetime, default=datetime.now)
update_by = Required("User", reverse='framework_updater')
delete_at = Optional(datetime)
delete_by = Optional("User", reverse='framework_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
......@@ -18,7 +18,7 @@ class User(db.Entity):
password = Required(str, max_len=64)
gender = Required(int, size=8) # 性别,未知0 男1 女2
birthday = Optional(date, default=date.today()) # 使用age会带来age无法随时间变化问题
contact = Required(str, max_len=11) # 联系方式
phone = Required(str, max_len=11) # 联系方式
email = Optional(str, max_len=100) # 邮箱
hometown = Optional(str, max_len=50) # 籍贯
entry_time = Required(datetime, default=datetime.now) # 入职时间
......@@ -38,6 +38,12 @@ class User(db.Entity):
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')
\ No newline at end of file
build_logs_deleter = Set('BuildLogs', reverse='delete_by')
framework_creator = Set('Framework', reverse='create_by')
framework_updater = Set('Framework', reverse='update_by')
framework_deleter = Set('Framework', reverse='delete_by')
\ No newline at end of file
......@@ -3,8 +3,6 @@ from . import BaseSchema
from marshmallow import fields, validate, RAISE, INCLUDE, EXCLUDE
class AddSchema(BaseSchema):
flow = fields.UUID(required=False)
project = fields.UUID(required=False)
title = fields.String(required=True)
path = fields.String(required=True)
size = fields.Float(required=True)
......@@ -14,8 +12,6 @@ class AddSchema(BaseSchema):
unknown = EXCLUDE
class UpdateSchema(BaseSchema):
flow = fields.UUID(required=False)
title = fields.String(required=False)
path = fields.String(required=False)
type = fields.Int(required=False)
size = fields.Float(required=False)
......@@ -31,8 +27,6 @@ class DeleteSchema(BaseSchema):
class QuerySchema(BaseSchema):
uuid = fields.UUID(required=False)
title = fields.String(required=False)
project = fields.Int(required=False)
flow = fields.Int(required=False)
class Meta:
unknown = EXCLUDE
......
......@@ -5,7 +5,9 @@ from marshmallow import fields, validate, RAISE, INCLUDE, EXCLUDE
class AddSchema(BaseSchema):
app_name = fields.String(required=True)
app_version = fields.String(required=False)
app_logo = fields.String(required=False)
app_icon = fields.Dict(required=True)
app_url = fields.String(required=False)
category = fields.String(required=False)
app_desc = fields.String(required=False)
app_files = fields.List(fields.Dict, required=False)
......@@ -15,7 +17,9 @@ class AddSchema(BaseSchema):
class UpdateSchema(BaseSchema):
app_name = fields.String(required=False)
app_version = fields.String(required=False)
app_logo = fields.String(required=False)
app_icon = fields.Dict(required=True)
app_url = fields.String(required=False)
category = fields.String(required=False)
app_desc = fields.String(required=False)
app_files = fields.List(fields.Dict, required=False)
......
from datetime import datetime
from . import BaseSchema
from marshmallow import fields, validate, RAISE, INCLUDE, EXCLUDE
class AddSchema(BaseSchema):
app = fields.String(required=True)
imei = fields.String(required=True)
class Meta:
unknown = EXCLUDE
class UpdateSchema(BaseSchema):
app = fields.String(required=False)
imei = fields.String(required=False)
class Meta:
unknown = EXCLUDE
class DeleteSchema(BaseSchema):
class Meta:
unknown = EXCLUDE
class DownloadSchema(BaseSchema):
id = fields.String(required=True)
imei = fields.String(required=True)
class Meta:
unknown = EXCLUDE
class QuerySchema(BaseSchema):
uuid = fields.UUID(required=False)
scope_type = fields.String(required=False)
pagenum = fields.Int(required=False)
pagesize = fields.Int(required=False, max=50) # 防止用户传特别大的数,导致数据库查询阻塞
class Meta:
unknown = EXCLUDE
class ResponseSchema(BaseSchema):
uuid = fields.UUID(required=False)
create_at = fields.DateTime(required=False, default=datetime.now)
update_at = fields.DateTime(required=False, default=datetime.now)
class Meta:
unknown = INCLUDE
from datetime import datetime
from . import BaseSchema
from marshmallow import fields, validate, RAISE, INCLUDE, EXCLUDE
class AddSchema(BaseSchema):
name = fields.String(required=True)
url = fields.String(required=True)
desc = fields.String(required=True)
type = fields.String(required=True)
assets = fields.Dict(required=False)
sort = fields.Integer(required=False, default=0, allow_none=True)
remarks = fields.String(required=False, default=" ", allow_none=True)
is_system = fields.Boolean(required=False, default=False, allow_none=True)
class Meta:
unknown = EXCLUDE
class UpdateSchema(BaseSchema):
name = fields.String(required=False)
url = fields.String(required=False)
desc = fields.String(required=False)
type = fields.String(required=False)
assets = fields.Dict(required=False)
sort = fields.Integer(required=False)
remarks = fields.String(required=False)
class Meta:
unknown = EXCLUDE
class DeleteSchema(BaseSchema):
class Meta:
unknown = EXCLUDE
class QuerySchema(BaseSchema):
uuid = fields.UUID(required=False)
scope_type = fields.String(required=False)
type = fields.Integer(required=False)
pagenum = fields.Int(required=False)
pagesize = fields.Int(required=False, max=50) # 防止用户传特别大的数,导致数据库查询阻塞
class Meta:
unknown = EXCLUDE
class ResponseSchema(BaseSchema):
uuid = fields.UUID(required=False)
create_at = fields.DateTime(required=False, default=datetime.now)
update_at = fields.DateTime(required=False, default=datetime.now)
class Meta:
unknown = INCLUDE
......@@ -12,7 +12,7 @@ class RegisterSchema(BaseSchema):
username = fields.String(required=True, validate=validate.Length(min=3, max=20))
password = fields.String(required=True, validate=validate.Length(min=3, max=18))
email = fields.Email(required=False, missing="user@example.com")
contact = fields.String(required=True, validate=validate.Length(min=11, max=11))
phone = fields.String(required=True, validate=validate.Length(min=11, max=11))
gender = fields.Int(required=True,)
birthday = fields.DateTime(missing=None)
hometown = fields.String(missing="")
......
......@@ -17,7 +17,7 @@ class AddSchema(BaseSchema):
username = fields.String(required=False, validate=validate.Length(min=2, max=20))
password = fields.String(required=True, validate=validate.Length(min=6, max=18))
email = fields.Email(required=False)
contact = fields.String(required=True, validate=validate.Length(min=11, max=11))
phone = fields.String(required=True, validate=validate.Length(min=11, max=11))
gender = fields.Int(required=True)
birthday = fields.Date(missing=None)
hometown = fields.String(missing="")
......@@ -39,7 +39,7 @@ class UpdateSchema(BaseSchema):
account = fields.String(required=False, validate=validate.Length(min=2, max=20))
username = fields.String(required=False, validate=validate.Length(min=2, max=20))
email = fields.Email(required=False)
contact = fields.String(required=False, validate=validate.Length(min=11, max=11))
phone = fields.String(required=False, validate=validate.Length(min=11, max=11))
gender = fields.Int(required=False)
birthday = fields.Date(required=False)
hometown = fields.String(required=False)
......@@ -69,7 +69,7 @@ class ResponseSchema(BaseSchema):
username = fields.String(required=True, validate=validate.Length(min=2, max=20))
password = fields.String(required=True, validate=validate.Length(min=6, max=18))
email = fields.Email(required=False)
contact = fields.String(required=True, validate=validate.Length(min=11, max=11))
phone = fields.String(required=True, validate=validate.Length(min=11, max=11))
gender = fields.Int(required=True)
birthday = fields.Date(required=False)
hometown = fields.String(required=False)
......
......@@ -12,6 +12,8 @@ from .login import login_api
from .user import user_api
from .annex import annex_api
from .apps import apps_api
from .framework import framework_api
from .download import download_api
from .ws import NotifyHandler, ThreadNotifyHandler
from model import fullStackDB
from fullstack.response import ResponseCode, response_result
......@@ -42,6 +44,8 @@ def create_app():
app.register_blueprint(user_api)
app.register_blueprint(annex_api)
app.register_blueprint(apps_api)
app.register_blueprint(framework_api)
app.register_blueprint(download_api)
@app.errorhandler(InternalServerError)
def handle_500(e):
......
......@@ -58,4 +58,8 @@ def upload_file():
@api.route("/system/updateDatabase", methods=['GET'])
def update_db():
result = []
for index in range(16):
print(index)
result.append(str(uuid.uuid1()))
return response_result(ResponseCode.OK, data=result)
......@@ -11,7 +11,7 @@ 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.build_logs import AddSchema, QuerySchema
from schema.build_logs import AddSchema as LogAddScheme, QuerySchema as LogQuerySchema
logger = logging.getLogger("appsApi")
......@@ -64,27 +64,6 @@ def get():
logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@apps_api.route("/build/<uuid:id>", methods=['POST'])
@validate_schema(AddSchema)
@Auth.auth_required
def build_app(id):
result, message = signalManager.actionAddBuildLog.emit(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(QuerySchema)
@Auth.auth_required
def get_build_logs():
result, count, message = signalManager.actionGetBuildLogList.emit(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)
@apps_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
......@@ -115,3 +94,23 @@ def update(id):
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):
result, message = signalManager.actionAddBuildLog.emit(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():
result, count, message = signalManager.actionGetBuildLogList.emit(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
#!/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.download import AddSchema, DeleteSchema, QuerySchema, UpdateSchema, DownloadSchema
logger = logging.getLogger("DownloadApi")
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:
isSuccess, message = signalManager.actionAddDownload.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))
@download_api.route("/delete/<uuid:id>", methods=['POST'])
@validate_schema(DeleteSchema)
@Auth.auth_required
def delete(id):
try:
isSuccess, message = signalManager.actionDeleteDownload.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)
@download_api.route("/apps", methods=["POST"])
@validate_schema(DownloadSchema)
@Auth.auth_required
def get():
try:
result, message = signalManager.actionGetDownload.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))
@download_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
def get_list():
try:
result, count, message = signalManager.actionGetDownloadList.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)
@download_api.route("/update/<uuid:id>", methods=['POST'])
@validate_schema(UpdateSchema)
@Auth.auth_required
def update(id):
try:
isSuccess, message = signalManager.actionUpdateDownload.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)
......@@ -10,18 +10,18 @@ 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.summary import AddSchema, DeleteSchema, QuerySchema, UpdateSchema
from schema.framework import AddSchema, DeleteSchema, QuerySchema, UpdateSchema
logger = logging.getLogger("summaryApi")
logger = logging.getLogger("frameworkApi")
summary_api = Blueprint("summary_api", __name__, url_prefix="/api/v1/%s/summary" % config['NAME'])
framework_api = Blueprint("framework_api", __name__, url_prefix="/api/v1/%s/framework" % config['NAME'])
@summary_api.route("/add", methods=['POST'])
@framework_api.route("/add", methods=['POST'])
@validate_schema(AddSchema)
@Auth.auth_required
def add():
try:
isSuccess, message = signalManager.actionAddSummary.emit(request.schema_data)
isSuccess, message = signalManager.actionAddFramework.emit(request.schema_data)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
......@@ -32,12 +32,12 @@ def add():
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@summary_api.route("/delete/<uuid:id>", methods=['POST'])
@framework_api.route("/delete/<uuid:id>", methods=['POST'])
@validate_schema(DeleteSchema)
@Auth.auth_required
def delete(id):
try:
isSuccess, message = signalManager.actionDeleteSummary.emit(id)
isSuccess, message = signalManager.actionDeleteFramework.emit(id)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
......@@ -48,12 +48,12 @@ def delete(id):
return response_result(ResponseCode.SERVER_ERROR)
@summary_api.route("/get", methods=["POST"])
@framework_api.route("/get", methods=["POST"])
@validate_schema(QuerySchema)
@Auth.auth_required
def get():
try:
result, message = signalManager.actionGetSummary.emit(request.schema_data)
result, message = signalManager.actionGetFramework.emit(request.schema_data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message)
else:
......@@ -64,12 +64,12 @@ def get():
return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@summary_api.route("/list", methods=['POST'])
@framework_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema)
@Auth.auth_required
def get_list():
try:
result, count, message = signalManager.actionGetSummaryList.emit(request.schema_data)
result, count, message = signalManager.actionGetFrameworkList.emit(request.schema_data)
if result:
return response_result(ResponseCode.OK, data=result, msg=message, count=count)
else:
......@@ -80,12 +80,12 @@ def get_list():
return response_result(ResponseCode.SERVER_ERROR)
@summary_api.route("/update/<uuid:id>", methods=['POST'])
@framework_api.route("/update/<uuid:id>", methods=['POST'])
@validate_schema(UpdateSchema)
@Auth.auth_required
def update(id):
try:
isSuccess, message = signalManager.actionUpdateSummary.emit(id, request.schema_data)
isSuccess, message = signalManager.actionUpdateFramework.emit(id, request.schema_data)
if isSuccess:
return response_result(ResponseCode.OK, msg=message)
else:
......
......@@ -45,3 +45,67 @@ export function getBuildLogsList(params) {
data: params,
});
}
export function getFrameworkList(params) {
return request({
url: "/api/v1/evm_store/framework/list",
method: "post",
data: params,
});
}
export function addFramework(params) {
return request({
url: "/api/v1/evm_store/framework/add",
method: "post",
data: params,
});
}
export function updateFramework(id, params) {
return request({
url: `/api/v1/evm_store/framework/update/${id}`,
method: "post",
data: params,
});
}
export function deleteFramework(params) {
return request({
url: "/api/v1/evm_store/framework/delete",
method: "post",
data: params,
});
}
export function getDownloadList(params) {
return request({
url: "/api/v1/evm_store/download/list",
method: "post",
data: params,
});
}
export function addDownload(params) {
return request({
url: "/api/v1/evm_store/download/add",
method: "post",
data: params,
});
}
export function updateDownload(id, params) {
return request({
url: `/api/v1/evm_store/download/update/${id}`,
method: "post",
data: params,
});
}
export function deleteDownload(params) {
return request({
url: "/api/v1/evm_store/framework/delete",
method: "post",
data: params,
});
}
......@@ -42,6 +42,20 @@ export default {
icon: "gongzuotai",
path: "build",
},
{
vue: "app-store/download.vue",
title: "下载记录",
name: "AppDownload",
icon: "gongzuotai",
path: "download",
},
{
vue: "app-store/framework.vue",
title: "系统页面",
name: "Framework",
icon: "gongzuotai",
path: "framework",
},
{
vue: "profile/index.vue",
title: "个人中心",
......
<template>
<div class="app-container">
<el-form :inline="true" ref="form" :model="form" size="mini">
<el-form-item label="预警级别" prop="type">
<el-select v-model="form.type" filterable placeholder="请选择预警级别">
<el-option
v-for="(item, index) in ruleTypeList"
:key="index"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="起止时间" prop="start">
<el-date-picker
v-model="datetime"
type="datetimerange"
:picker-options="pickerOptions"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
align="right"
>
</el-date-picker>
</el-form-item>
<el-form-item prop="end">
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
<el-form-item>
<el-button @click="onReset('form')">重置</el-button>
</el-form-item>
</el-form>
<el-table
v-loading="isLoading"
element-loading-text="Loading"
:data="list"
size="mini"
border
stripe
fit
highlight-current-row
>
<el-table-column
prop="title"
label="预警事件"
align="center"
width="300"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column prop="type" label="预警级别" align="center" width="80">
<template slot-scope="scope">
{{ scope.row.type | getLevelDays }}
</template>
</el-table-column>
<el-table-column
prop="color"
label="预警颜色"
align="center"
width="80"
></el-table-column>
<el-table-column
prop="user.username"
label="消息接收者"
align="center"
width="120"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column prop="ignore" label="是否查看" align="center" width="80">
<template slot-scope="scope">
<el-tag v-if="scope.row.ignore" size="small" type="success"
>已查看</el-tag
>
<el-tag v-else size="small" type="warning">未查看</el-tag>
</template>
</el-table-column>
<el-table-column
prop="create_at"
label="预警时间"
align="center"
width="150"
></el-table-column>
<el-table-column
prop="content"
label="预警内容"
align="left"
min-width="150"
:show-overflow-tooltip="true"
></el-table-column>
</el-table>
<div class="page-wrapper">
<el-pagination
@current-change="handleCurrentChange"
:current-page.sync="form.pagenum"
background
small
:page-size="form.pagesize"
:pager-count="5"
layout="pager, prev, next, total"
:total="total"
></el-pagination>
</div>
</div>
</template>
<script>
import { getWarningLogList } from "@/api/warning";
import { mapTrim } from "@/utils/index";
import { formatUTCDateTime } from "@/utils/utils";
const today = new Date();
const yestoday = new Date();
yestoday.setDate(today.getDate() - 1); // 昨天
export default {
name: "WarningLog",
data() {
return {
total: 0,
list: [],
isLoading: false,
datetime: [yestoday, today],
form: {
uuid: null,
type: null,
start: null,
end: null,
user: null,
pagesize: 15,
pagenum: 1,
},
dialogVisible: false,
currentValue: null,
currentIndex: null,
post: {
title: null,
type: 1,
color: "yellow",
time: null,
content: null,
},
rules: {
name: [
{
type: "string",
required: true,
message: "用户名不能为空",
trigger: "blur",
},
{
min: 1,
max: 20,
message: "字符串长度在 1 到 20 之间",
trigger: "blur",
},
],
},
ruleTypeList: [
{ id: 0, name: "一般" },
{ id: 1, name: "重要" },
{ id: 2, name: "紧急" },
],
pickerOptions: {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit("pick", [start, end]);
},
},
],
},
};
},
filters: {
getLevelDays(type) {
if (type == 0) return "一般";
else if (type == 1) return "重要";
else return "紧急";
},
},
methods: {
fetchData(params) {
this.isLoading = true;
getWarningLogList(params)
.then((res) => {
this.total = res.count;
this.list = res.data;
})
.catch((err) => {
this.$message.warning(err.message)
})
.finally(() => {
this.isLoading = false;
});
},
handleSizeChange(e) {
this.form.pagesize = e;
this.fetchData(mapTrim(this.form));
},
handleCurrentChange(e) {
this.form.pagenum = e;
this.fetchData(mapTrim(this.form));
},
onSubmit() {
this.form.pagenum = 1;
this.form.pagesize = 15;
if (this.form.start !== formatUTCDateTime(this.datetime[0]))
this.form.start = formatUTCDateTime(this.datetime[0])
else this.form.start = null
if (this.form.end !== formatUTCDateTime(this.datetime[1]))
this.form.end = formatUTCDateTime(this.datetime[1])
else this.form.end = null
this.fetchData(mapTrim(this.form));
},
onReset(formName) {
this.form.start = null
this.form.end = null
this.$refs[formName].resetFields()
this.form.pagenum = 1
this.form.pagesize = 15
this.fetchData(mapTrim(this.form))
},
},
mounted() {},
created() {
if (this.$route.params.uuid) {
this.form.uuid = this.$route.params.uuid
}
this.fetchData(mapTrim(this.form))
},
};
</script>
<style lang="less" scoped>
.app-container {
& > div.page-wrapper {
margin: 10px 0px;
}
}
</style>
This diff is collapsed.
......@@ -17,9 +17,6 @@
></el-form-item
>
<el-form-item><el-button @click="onReset">重置</el-button></el-form-item>
<el-form-item
><el-button type="warning" @click="onAdd">添加</el-button></el-form-item
>
</el-form>
<el-table
v-loading="isLoading"
......@@ -32,7 +29,7 @@
highlight-current-row
>
<el-table-column
prop="app_id.app_name"
prop="app.app_name"
label="应用名称"
width="180"
></el-table-column>
......@@ -87,56 +84,6 @@
:total="total"
></el-pagination>
</div>
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="50%">
<el-form
:model="post"
status-icon
:rules="rules"
:inline="true"
ref="post"
size="mini"
label-width="200px"
>
<el-form-item label="标题" prop="name">
<el-input
type="text"
v-model="post.name"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="年度调派现场总天数" prop="year_dispatch_site_days">
<el-input
type="number"
v-model.number="post.year_dispatch_site_days"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="应用文件" prop="app_files">
<el-upload
drag
action="https://jsonplaceholder.typicode.com/posts/"
multiple
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
将文件拖到此处,或<em>点击上传</em>
</div>
<div class="el-upload__tip" slot="tip">
只能上传jpg/png文件,且不超过500kb
</div>
</el-upload>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" size="mini" plain @click="submitForm('post')"
>提交</el-button
>
<el-button type="success" size="mini" plain @click="onReset('form')"
>重置</el-button
>
<el-button size="mini" @click="dialogVisible = false">关闭</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
......@@ -148,7 +95,6 @@ export default {
data() {
return {
dialogImageUrl: "",
dialogVisible: false,
disabled: false,
total: 0,
list: [],
......@@ -162,20 +108,10 @@ export default {
},
currentIndex: 0,
currentValue: null,
dialogTitle: "",
post: {
name: null,
year_dispatch_site_days: null,
},
rules: {
year_dispatch_site_days: [
{
type: "number",
required: true,
message: "字段不能为空",
trigger: "blur",
},
],
name: [
{
type: "string",
......@@ -227,7 +163,6 @@ export default {
},
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
handleDownload(index, row) {
console.log(index);
......@@ -250,8 +185,6 @@ export default {
this.post = Object.assign(row);
this.currentIndex = index;
this.currentValue = row;
this.dialogTitle = "编辑";
this.dialogVisible = true;
},
handleDelete(index, row) {
this.$alert(
......@@ -265,22 +198,6 @@ export default {
}
);
},
submitForm(formName) {
this.$refs[formName].validate((valid) => {
let result = true;
if (valid) {
console.log(valid);
} else {
result = false;
}
this.dialogVisible = false;
return result;
});
},
onAdd() {
this.dialogTitle = "添加";
this.dialogVisible = true;
},
onSubmit() {
this.form.pagenum = 1;
this.form.pagesize = 15;
......
<template>
<div class="app-container">
<el-form :inline="true" :model="form" size="mini">
<el-form-item><el-button type="primary" @click="onSubmit">查询</el-button></el-form-item>
<el-form-item><el-button @click="onReset">重置</el-button></el-form-item>
</el-form>
<el-table v-loading="isLoading" element-loading-text="Loading" :data="list" size="mini" border stripe fit highlight-current-row>
<el-table-column prop="app.app_name" label="应用" align="center" min-width="150"></el-table-column>
<el-table-column prop="imei" label="IMEI" align="center" min-width="150"></el-table-column>
<el-table-column prop="download_at" label="下载时间" min-width="150"></el-table-column>
</el-table>
<div class="page-wrapper">
<el-pagination @current-change="handleCurrentChange" :current-page.sync="form.pagenum" background small :page-size="form.pagesize" :pager-count="5" layout="pager, prev, next, total" :total="total"></el-pagination>
</div>
</div>
</template>
<script>
import checkPermission from '@/utils/permission'
import { getDownloadList, deleteDownload } from '@/api/app-store'
import { mapTrim } from '@/utils/index'
import { formatUTCDateTime } from '@/utils/utils'
export default {
name: "AppDownload",
data() {
return {
total: 0,
list: [],
isLoading: false,
form: {
uuid: null,
imei: null,
pagesize: 15,
pagenum: 1
},
}
},
methods: {
checkPermission,
fetchData(params) {
this.isLoading = true
getDownloadList(params).then(res => {
if (res.code == 200) {
this.total = res.count
this.list = res.data.map(item => {
item.create_at = formatUTCDateTime(item.create_at)
item.update_at = formatUTCDateTime(item.update_at)
return item
})
}
}).catch(err => {
// this.$message.error(err.message)
console.log(err.message)
}).finally(() => {
this.isLoading = false
})
},
handleSizeChange(e) {
this.form.pagesize = e
this.fetchData(mapTrim(this.form))
},
handleCurrentChange(e) {
this.form.pagenum = e
this.fetchData(mapTrim(this.form))
},
handleDelete(index, row) {
this.$alert('您确定要删除么?删除操作将不可恢复。如需取消操作,请点击右上角关闭按钮。', '删除提醒', {
confirmButtonText: '确定',
callback: action => {
if (action == 'confirm') deleteDownload(row.id).then(res => {
console.log(res)
this.total -= 1
this.$delete(this.list, index)
this.$message({ type: 'success', message: `成功删除第${ index }行` })
}).catch(err => {
this.$message.error(err.message)
})
}
})
},
onSubmit() {
this.form.pagenum = 1
this.form.pagesize = 15
this.fetchData(mapTrim(this.form))
},
onReset(formName) {
this.form = {
account: null,
username: null,
pagesize: 15,
pagenum: 1
}
this.$refs[formName].resetFields()
this.fetchData(mapTrim(this.form))
}
},
mounted() {},
created() {
this.fetchData(mapTrim(this.form))
}
}
</script>
<style lang="less" scoped>
.app-container {
& > div.page-wrapper {
margin: 10px 0px;
}
}
</style>
This diff is collapsed.
<template>
<div class="app-container">
<el-form :inline="true" ref="form" :model="form" size="mini">
<el-form-item
><el-button type="warning" @click="onAdd">添加</el-button></el-form-item
>
<el-form-item><el-button type="warning" @click="onAdd">添加应用</el-button></el-form-item>
<el-form-item><el-button type="success" @click="onAddFramework">添加系统页面</el-button></el-form-item>
</el-form>
<el-table
v-loading="isLoading"
......@@ -25,6 +24,16 @@
label="应用版本号"
width="150"
></el-table-column>
<el-table-column
prop="category"
label="应用类别"
width="120"
></el-table-column>
<el-table-column
prop="app_url"
label="应用路径"
width="120"
></el-table-column>
<el-table-column
prop="app_desc"
label="应用描述"
......@@ -86,37 +95,24 @@
:total="total"
></el-pagination>
</div>
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="50%">
<el-form
:model="post"
status-icon
:inline="true"
ref="post"
size="mini"
label-width="200px"
>
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="45%">
<el-form :model="post" status-icon ref="post" size="medium" label-width="100px">
<el-form-item label="应用名称" prop="app_name">
<el-input
type="text"
v-model="post.app_name"
autocomplete="off"
></el-input>
<el-input type="text" v-model="post.app_name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="应用版本号" prop="app_version">
<el-input
type="text"
v-model="post.app_version"
autocomplete="off"
></el-input>
<el-input type="text" v-model="post.app_version" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="应用路径" prop="app_url">
<el-input type="text" v-model="post.app_url" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="应用类别" prop="category">
<el-input type="text" v-model="post.category" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="应用描述" prop="app_desc">
<el-input
type="text"
v-model="post.app_desc"
autocomplete="off"
></el-input>
<el-input type="text" v-model="post.app_desc" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="应用Logo" prop="app_logo">
<el-form-item label="应用Logo" prop="app_icon">
<el-upload
class="avatar-uploader"
:action="`${window.location.protocol}//${window.location.host}/api/v1/evm_store/upload`"
......@@ -149,19 +145,50 @@
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" size="mini" plain @click="submitForm('post')"
>提交</el-button
>
<el-button type="success" size="mini" plain @click="onReset('form')"
>重置</el-button
>
<el-button size="mini" @click="dialogVisible = false">关闭</el-button>
<el-button type="primary" size="medium" plain @click="submitForm('post')">提交</el-button>
<el-button type="success" size="medium" plain @click="onReset('form')">重置</el-button>
<el-button size="medium" @click="dialogVisible = false">关闭</el-button>
</div>
</el-dialog>
<el-dialog title="添加系统页面" :visible.sync="frameworkDialog">
<el-form :model="form" label-width="100px">
<el-form-item label="页面名称">
<el-input v-model="framework.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="页面路径">
<el-input v-model="framework.url" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="活动描述">
<el-input v-model="framework.desc" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="活动类型">
<el-input v-model="framework.type" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="资源文件" prop="app_icon">
<el-upload
drag
multiple
name="binfile"
:action="`${window.location.protocol}//${window.location.host}/api/v1/evm_store/upload`"
:on-remove="handleFrameworkRemove"
:on-success="handleFrameworkSuccess"
:file-list="fileList"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="frameworkDialog = false">取 消</el-button>
<el-button type="primary" @click="addFramework">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { getAppsList, deleteApp, addApp, updateApp, buildApp } from "@/api/app-store";
import { getAppsList, deleteApp, addApp, updateApp, buildApp, addFramework } from "@/api/app-store";
import { mapTrim } from "@/utils/index";
export default {
......@@ -171,6 +198,7 @@ export default {
imageUrl: "",
total: 0,
list: [],
fileList: [],
isLoading: false,
form: {
uuid: null,
......@@ -178,14 +206,26 @@ export default {
pagesize: 15,
pagenum: 1,
},
framework: {
name: null,
url: null,
desc: null,
type: null,
assets: {
files: []
}
},
currentIndex: 0,
currentValue: null,
frameworkDialog: false,
dialogTitle: "",
dialogVisible: false,
post: {
app_name: null,
app_version: null,
app_logo: null,
app_icon: null,
app_url: null,
category: null,
app_desc: null,
app_files: [],
},
......@@ -260,13 +300,11 @@ export default {
);
},
handleAppFilesUploadSuccess(res) {
console.log(res)
this.post.app_files.push(res.data)
},
handleAvatarSuccess(res, file) {
console.log(res)
if (res.code == 200)
this.post.app_logo = res.data.filepath
this.post.app_icon = res.data
this.imageUrl = URL.createObjectURL(file.raw);
},
beforeAvatarUpload() {
......@@ -295,6 +333,12 @@ export default {
}
console.log(file);
},
handleFrameworkRemove() {
},
handleFrameworkSuccess(res) {
this.framework.assets.files.push(res.data)
},
submitForm(formName) {
this.$refs[formName].validate((valid) => {
let result = true;
......@@ -327,6 +371,20 @@ export default {
return result;
});
},
submitFramework() {
},
addFramework() {
addFramework(this.framework).then(res => {
this.$message.success(res.message)
this.frameworkDialog = false
}).catch(err => {
this.$message.error(err.message)
})
},
onAddFramework() {
this.frameworkDialog = true;
},
onAdd() {
this.dialogTitle = "添加";
this.dialogVisible = true;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<div>
<el-dialog :visible.sync="isVisible" v-bind="$attrs" v-on="$listeners" @open="onOpen" @close="onClose" :title="title" :width="width">
<formpage ref="formpage"></formpage>
<div slot="footer">
<el-button size="medium" @click="close">取消</el-button>
<el-button size="medium" type="primary" @click="handelConfirm">确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import formpage from './companyForm'
export default {
inheritAttrs: false,
components: {formpage},
props: {
visible: {
type: Boolean,
default() {
return false
}
},
title: {
type: String,
default () {
return "dialog"
}
},
width: {
type: String,
required: false,
default() {
return "30%"
}
}
},
data() {
return {}
},
computed: {
isVisible: {
get: function () {
return this.visible;
},
set: function (newValue) {
return newValue;
}
}
},
watch: {},
created() {},
mounted() {},
methods: {
update(data) {
this.$nextTick(() => {
this.$refs['formpage'].formData = data;
})
},
onOpen() {},
onClose() {
this.close()
},
close() {
this.$emit('close', this.formData)
},
handelConfirm() {
const elform = this.$refs['formpage'].$refs['elForm']
elform.validate(valid => {
if (!valid) return
this.$emit('confirm', elform.model)
this.close()
})
},
}
}
</script>
<style>
</style>
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