Commit 016f1194 authored by wanli's avatar wanli

update

parent 06038fd0
No preview for this file type
...@@ -17,12 +17,12 @@ config = dict( ...@@ -17,12 +17,12 @@ config = dict(
BACKUP_DIR=conf.get('application', 'backup_dir'), BACKUP_DIR=conf.get('application', 'backup_dir'),
NETDISC=conf.get('uploads', 'netdisc'), NETDISC=conf.get('uploads', 'netdisc'),
DATABASE=conf.get('database', 'filename'), DATABASE=conf.get('database', 'filename'),
DATABASE_FILE=conf.get('scheduler', 'db'),
PONY={ PONY={
'provider': conf.get('database', 'provider'), 'provider': conf.get('database', 'provider'),
'filename': "../{}".format(conf.get('database', 'filename')), 'filename': "../{}".format(conf.get('database', 'filename')),
'create_db': True, 'create_db': True,
}, },
DATABASE_FILE=conf.get('scheduler', 'db'),
TABLE_PREFIX='evm_store_', TABLE_PREFIX='evm_store_',
MD5_SALT="EhuqUkwV", MD5_SALT="EhuqUkwV",
UPLOAD_SERVER="{}://{}:{}/".format(conf.get('uploads', 'protocol'), conf.get('uploads', 'host'), conf.get('uploads', 'port')), UPLOAD_SERVER="{}://{}:{}/".format(conf.get('uploads', 'protocol'), conf.get('uploads', 'host'), conf.get('uploads', 'port')),
......
...@@ -53,6 +53,20 @@ class SignalManager(object): ...@@ -53,6 +53,20 @@ class SignalManager(object):
actionGetAnnexList = PySignal() actionGetAnnexList = PySignal()
actionUpdateAnnex = 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): def __init__(self):
super(SignalManager, self).__init__() super(SignalManager, self).__init__()
......
...@@ -18,3 +18,5 @@ name = evm_store ...@@ -18,3 +18,5 @@ name = evm_store
nginx = NginxService nginx = NginxService
backup_dir = backup backup_dir = backup
evueapps_dir = evueapps evueapps_dir = evueapps
launcher_dir = launcher
framework = framework
\ No newline at end of file
...@@ -9,6 +9,8 @@ from .login_manager import loginManager ...@@ -9,6 +9,8 @@ from .login_manager import loginManager
from .annex_manager import annexManager from .annex_manager import annexManager
from .upload_manager import uploadManager from .upload_manager import uploadManager
from .apps_manager import appsManager from .apps_manager import appsManager
from .download_manager import downloadManager
from .framework_manager import frameworkManager
from .build_logs_manager import buildLogsManager from .build_logs_manager import buildLogsManager
logger = logging.getLogger("controller") logger = logging.getLogger("controller")
...@@ -50,4 +52,18 @@ def initConnect(): ...@@ -50,4 +52,18 @@ def initConnect():
signalManager.actionGetAnnexList.connect(annexManager.getList) signalManager.actionGetAnnexList.connect(annexManager.getList)
signalManager.actionUpdateAnnex.connect(annexManager.update) 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() initConnect()
\ No newline at end of file
...@@ -39,16 +39,21 @@ class AppsManager(object): ...@@ -39,16 +39,21 @@ class AppsManager(object):
'update_at': datetime.now(), '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 = [] app_files = []
if data.get("app_files"): if data.get("app_files"):
app_files = data.get("app_files") app_files = data.get("app_files")
data.pop("app_files") data.pop("app_files")
data.update({ "app_icon": icon })
result = Apps(**data) result = Apps(**data)
commit() commit()
if result:
for a in app_files: 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()) 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() flush()
commit() commit()
...@@ -89,15 +94,15 @@ class AppsManager(object): ...@@ -89,15 +94,15 @@ class AppsManager(object):
temp.append(item.to_dict(only=["uuid", "app_name"])) temp.append(item.to_dict(only=["uuid", "app_name"]))
return temp, len(temp), "get app {}.".format("success" if temp else "fail") 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)) 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() count = Apps.select().where(**temp).count()
if result and len(result): if result and len(result):
temp = [] temp = []
for item in result: 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({ t.update({
"app_icon": item.app_icon.to_dict(only=["path"]),
"create_by": item.create_by.to_dict(only=["uuid", "username"]), "create_by": item.create_by.to_dict(only=["uuid", "username"]),
"update_by": item.update_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, "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): ...@@ -113,12 +118,42 @@ class AppsManager(object):
if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data): if len(data) <= 0 or (len(data.keys()) == 1 and "id" in data):
return False, "app can not be null." return False, "app can not be null."
# 查询请求者是否存在 with db_session:
editor = User.get(id=request.current_user.get("id")) editor = User.get(id=request.current_user.get("id"))
if not editor: if not editor:
return False, "current user is not exists" return False, "current user is not exists"
result = fullStackDB.update(Apps, { 'uuid': uuid }, update_at=datetime.now(), update_by=editor, **data) 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()
return result, "update app {}.".format("success" if result else "fail") return result, "update app {}.".format("success" if result else "fail")
appsManager = AppsManager() appsManager = AppsManager()
...@@ -28,26 +28,26 @@ class BuildLogsManager(object): ...@@ -28,26 +28,26 @@ class BuildLogsManager(object):
def __init__(self): def __init__(self):
super(BuildLogsManager, self).__init__() super(BuildLogsManager, self).__init__()
def add(self, app_id): def add(self, app):
with db_session: with db_session:
editor = User.get(id=request.current_user.get("id")) editor = User.get(id=request.current_user.get("id"))
if not editor: if not editor:
return False, "current user is not exists" return False, "current user is not exists"
# 根据app_id查询应用,获取应用有哪些文件 # 根据app查询应用,获取应用有哪些文件
# 按格式创建文件夹,将这些文件移动到这个文件夹 # 按格式创建文件夹,将这些文件移动到这个文件夹
# 将这些零散文件进行打包 # 将这些零散文件进行打包
# 更新数据库对应文件的路径 # 更新数据库对应文件的路径
app = Apps.get(uuid=app_id) app = Apps.get(uuid=app)
if not app: if not app:
return None, "app not found" return None, "app not found"
source_files = Annex.select().filter(app_id=app) source_files = Annex.select().filter(app=app)
if not source_files: if not source_files:
return None, "apps file not found" 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"]) 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]) target_dir = os.sep.join([upload_dir, editor.account, dir_format])
dest_dir = os.sep.join([target_dir, "src"]) dest_dir = os.sep.join([target_dir, "src"])
...@@ -84,7 +84,7 @@ class BuildLogsManager(object): ...@@ -84,7 +84,7 @@ class BuildLogsManager(object):
epk_path = urljoin(config.get("UPLOAD_SERVER"), epk_path.replace('\\', '/')) epk_path = urljoin(config.get("UPLOAD_SERVER"), epk_path.replace('\\', '/'))
app_info['md5'] = str(app_info['md5']) 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() commit()
return epk_path, "add build_logs {}.".format("success" if result else "fail") return epk_path, "add build_logs {}.".format("success" if result else "fail")
...@@ -131,7 +131,7 @@ class BuildLogsManager(object): ...@@ -131,7 +131,7 @@ class BuildLogsManager(object):
for item in result: for item in result:
t = item.to_dict(with_collections=True, related_objects=True, exclude=["is_delete", "delete_by", "delete_at"]) t = item.to_dict(with_collections=True, related_objects=True, exclude=["is_delete", "delete_by", "delete_at"])
t.update({ 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"]), "create_by": item.create_by.to_dict(only=["uuid", "username"]),
"update_by": item.update_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, "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): ...@@ -118,7 +118,7 @@ class UserManager(object):
user = User.get(uuid=uuid) user = User.get(uuid=uuid)
if user: if user:
user.set(update_at=datetime.now(), update_by=editor.id, **data) 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"): if result.get("birthday"):
result.update({ "birthday": result.get("birthday").strftime("%Y-%m-%d") }) result.update({ "birthday": result.get("birthday").strftime("%Y-%m-%d") })
return result, "update user success" return result, "update user success"
...@@ -131,7 +131,7 @@ class UserManager(object): ...@@ -131,7 +131,7 @@ class UserManager(object):
''' '''
result = User.get(id=request.current_user.get("id"), is_delete=False) result = User.get(id=request.current_user.get("id"), is_delete=False)
if result: 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({ temp.update({
"birthday": result.birthday.strftime("%Y-%m-%d") if result.birthday else None, "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, "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): ...@@ -218,7 +218,7 @@ class UserManager(object):
if result and len(result): if result and len(result):
temp = [] temp = []
for item in result: 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({ t.update({
"email": "" if item.email == "user@example.com" else item.email, "email": "" if item.email == "user@example.com" else item.email,
"birthday": item.birthday.strftime("%Y-%m-%d") if item.birthday else None, "birthday": item.birthday.strftime("%Y-%m-%d") if item.birthday else None,
......
...@@ -9,7 +9,7 @@ from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor ...@@ -9,7 +9,7 @@ from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
jobstores = { jobstores = {
# 'mongo': MongoDBJobStore(), # '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 = { executors = {
'default': ThreadPoolExecutor(20), 'default': ThreadPoolExecutor(20),
......
...@@ -13,7 +13,8 @@ class Annex(db.Entity): ...@@ -13,7 +13,8 @@ class Annex(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "annex" _table_ = "{}".format(config['TABLE_PREFIX']) + "annex"
id = PrimaryKey(int, auto=True) id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=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) # 文件名 title = Required(str, max_len=200) # 文件名
path = Required(LongStr) # 文件路径 path = Required(LongStr) # 文件路径
type = Required(int, default=0) # 文件类型 PNG/JPG/GIF/MP3/MP4/DOCX/XLSX/PPT/PDF... 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 ...@@ -7,6 +7,10 @@ from pony.orm import PrimaryKey, Required, Optional, Set, LongStr, Json
from app import config from app import config
from . import fullStackDB from . import fullStackDB
# ********************************
from .app_users import AppUser
# ********************************
db = fullStackDB.db db = fullStackDB.db
class Apps(db.Entity): class Apps(db.Entity):
...@@ -15,10 +19,14 @@ class Apps(db.Entity): ...@@ -15,10 +19,14 @@ class Apps(db.Entity):
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True) uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
app_name = Required(str, max_len=200) app_name = Required(str, max_len=200)
app_version = Optional(str, default="") 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_desc = Optional(str, default="")
app_annex = Set("Annex", reverse="app_id") app_annex = Set("Annex", reverse="app")
app_build_log = Set("BuildLogs", reverse="app_id") 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_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='apps_creator') # BuildLogs与User一对一关系 create_by = Required("User", reverse='apps_creator') # BuildLogs与User一对一关系
update_at = Required(datetime, default=datetime.now) update_at = Required(datetime, default=datetime.now)
......
...@@ -13,7 +13,7 @@ class BuildLogs(db.Entity): ...@@ -13,7 +13,7 @@ class BuildLogs(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "build_logs" _table_ = "{}".format(config['TABLE_PREFIX']) + "build_logs"
id = PrimaryKey(int, auto=True) id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=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_path = Optional(str, default="")
app_info = Optional(Json, default={}) app_info = Optional(Json, default={})
create_at = Required(datetime, default=datetime.now) 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): ...@@ -18,7 +18,7 @@ class User(db.Entity):
password = Required(str, max_len=64) password = Required(str, max_len=64)
gender = Required(int, size=8) # 性别,未知0 男1 女2 gender = Required(int, size=8) # 性别,未知0 男1 女2
birthday = Optional(date, default=date.today()) # 使用age会带来age无法随时间变化问题 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) # 邮箱 email = Optional(str, max_len=100) # 邮箱
hometown = Optional(str, max_len=50) # 籍贯 hometown = Optional(str, max_len=50) # 籍贯
entry_time = Required(datetime, default=datetime.now) # 入职时间 entry_time = Required(datetime, default=datetime.now) # 入职时间
...@@ -38,6 +38,12 @@ class User(db.Entity): ...@@ -38,6 +38,12 @@ class User(db.Entity):
apps_creator = Set('Apps', reverse='create_by') apps_creator = Set('Apps', reverse='create_by')
apps_updater = Set('Apps', reverse='update_by') apps_updater = Set('Apps', reverse='update_by')
apps_deleter = Set('Apps', reverse='delete_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_creator = Set('BuildLogs', reverse='create_by')
build_logs_updater = Set('BuildLogs', reverse='update_by') build_logs_updater = Set('BuildLogs', reverse='update_by')
build_logs_deleter = Set('BuildLogs', reverse='delete_by') 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 ...@@ -3,8 +3,6 @@ from . import BaseSchema
from marshmallow import fields, validate, RAISE, INCLUDE, EXCLUDE from marshmallow import fields, validate, RAISE, INCLUDE, EXCLUDE
class AddSchema(BaseSchema): class AddSchema(BaseSchema):
flow = fields.UUID(required=False)
project = fields.UUID(required=False)
title = fields.String(required=True) title = fields.String(required=True)
path = fields.String(required=True) path = fields.String(required=True)
size = fields.Float(required=True) size = fields.Float(required=True)
...@@ -14,8 +12,6 @@ class AddSchema(BaseSchema): ...@@ -14,8 +12,6 @@ class AddSchema(BaseSchema):
unknown = EXCLUDE unknown = EXCLUDE
class UpdateSchema(BaseSchema): class UpdateSchema(BaseSchema):
flow = fields.UUID(required=False)
title = fields.String(required=False)
path = fields.String(required=False) path = fields.String(required=False)
type = fields.Int(required=False) type = fields.Int(required=False)
size = fields.Float(required=False) size = fields.Float(required=False)
...@@ -31,8 +27,6 @@ class DeleteSchema(BaseSchema): ...@@ -31,8 +27,6 @@ class DeleteSchema(BaseSchema):
class QuerySchema(BaseSchema): class QuerySchema(BaseSchema):
uuid = fields.UUID(required=False) uuid = fields.UUID(required=False)
title = fields.String(required=False) title = fields.String(required=False)
project = fields.Int(required=False)
flow = fields.Int(required=False)
class Meta: class Meta:
unknown = EXCLUDE unknown = EXCLUDE
......
...@@ -5,7 +5,9 @@ from marshmallow import fields, validate, RAISE, INCLUDE, EXCLUDE ...@@ -5,7 +5,9 @@ from marshmallow import fields, validate, RAISE, INCLUDE, EXCLUDE
class AddSchema(BaseSchema): class AddSchema(BaseSchema):
app_name = fields.String(required=True) app_name = fields.String(required=True)
app_version = 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_desc = fields.String(required=False)
app_files = fields.List(fields.Dict, required=False) app_files = fields.List(fields.Dict, required=False)
...@@ -15,7 +17,9 @@ class AddSchema(BaseSchema): ...@@ -15,7 +17,9 @@ class AddSchema(BaseSchema):
class UpdateSchema(BaseSchema): class UpdateSchema(BaseSchema):
app_name = fields.String(required=False) app_name = fields.String(required=False)
app_version = 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_desc = fields.String(required=False)
app_files = fields.List(fields.Dict, 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): ...@@ -12,7 +12,7 @@ class RegisterSchema(BaseSchema):
username = fields.String(required=True, validate=validate.Length(min=3, max=20)) username = fields.String(required=True, validate=validate.Length(min=3, max=20))
password = fields.String(required=True, validate=validate.Length(min=3, max=18)) password = fields.String(required=True, validate=validate.Length(min=3, max=18))
email = fields.Email(required=False, missing="user@example.com") 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,) gender = fields.Int(required=True,)
birthday = fields.DateTime(missing=None) birthday = fields.DateTime(missing=None)
hometown = fields.String(missing="") hometown = fields.String(missing="")
......
...@@ -17,7 +17,7 @@ class AddSchema(BaseSchema): ...@@ -17,7 +17,7 @@ class AddSchema(BaseSchema):
username = fields.String(required=False, validate=validate.Length(min=2, max=20)) username = fields.String(required=False, validate=validate.Length(min=2, max=20))
password = fields.String(required=True, validate=validate.Length(min=6, max=18)) password = fields.String(required=True, validate=validate.Length(min=6, max=18))
email = fields.Email(required=False) 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) gender = fields.Int(required=True)
birthday = fields.Date(missing=None) birthday = fields.Date(missing=None)
hometown = fields.String(missing="") hometown = fields.String(missing="")
...@@ -39,7 +39,7 @@ class UpdateSchema(BaseSchema): ...@@ -39,7 +39,7 @@ class UpdateSchema(BaseSchema):
account = fields.String(required=False, validate=validate.Length(min=2, max=20)) account = fields.String(required=False, validate=validate.Length(min=2, max=20))
username = 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) 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) gender = fields.Int(required=False)
birthday = fields.Date(required=False) birthday = fields.Date(required=False)
hometown = fields.String(required=False) hometown = fields.String(required=False)
...@@ -69,7 +69,7 @@ class ResponseSchema(BaseSchema): ...@@ -69,7 +69,7 @@ class ResponseSchema(BaseSchema):
username = fields.String(required=True, validate=validate.Length(min=2, max=20)) username = fields.String(required=True, validate=validate.Length(min=2, max=20))
password = fields.String(required=True, validate=validate.Length(min=6, max=18)) password = fields.String(required=True, validate=validate.Length(min=6, max=18))
email = fields.Email(required=False) 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) gender = fields.Int(required=True)
birthday = fields.Date(required=False) birthday = fields.Date(required=False)
hometown = fields.String(required=False) hometown = fields.String(required=False)
......
...@@ -12,6 +12,8 @@ from .login import login_api ...@@ -12,6 +12,8 @@ from .login import login_api
from .user import user_api from .user import user_api
from .annex import annex_api from .annex import annex_api
from .apps import apps_api from .apps import apps_api
from .framework import framework_api
from .download import download_api
from .ws import NotifyHandler, ThreadNotifyHandler from .ws import NotifyHandler, ThreadNotifyHandler
from model import fullStackDB from model import fullStackDB
from fullstack.response import ResponseCode, response_result from fullstack.response import ResponseCode, response_result
...@@ -42,6 +44,8 @@ def create_app(): ...@@ -42,6 +44,8 @@ def create_app():
app.register_blueprint(user_api) app.register_blueprint(user_api)
app.register_blueprint(annex_api) app.register_blueprint(annex_api)
app.register_blueprint(apps_api) app.register_blueprint(apps_api)
app.register_blueprint(framework_api)
app.register_blueprint(download_api)
@app.errorhandler(InternalServerError) @app.errorhandler(InternalServerError)
def handle_500(e): def handle_500(e):
......
...@@ -58,4 +58,8 @@ def upload_file(): ...@@ -58,4 +58,8 @@ def upload_file():
@api.route("/system/updateDatabase", methods=['GET']) @api.route("/system/updateDatabase", methods=['GET'])
def update_db(): def update_db():
result = [] result = []
for index in range(16):
print(index)
result.append(str(uuid.uuid1()))
return response_result(ResponseCode.OK, data=result) return response_result(ResponseCode.OK, data=result)
...@@ -11,7 +11,7 @@ from fullstack.login import Auth ...@@ -11,7 +11,7 @@ from fullstack.login import Auth
from fullstack.validation import validate_schema from fullstack.validation import validate_schema
from fullstack.response import ResponseCode, response_result from fullstack.response import ResponseCode, response_result
from schema.apps import AddSchema, DeleteSchema, QuerySchema, UpdateSchema 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") logger = logging.getLogger("appsApi")
...@@ -64,27 +64,6 @@ def get(): ...@@ -64,27 +64,6 @@ def get():
logger.error(str(e)) logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR, msg=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']) @apps_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema) @validate_schema(QuerySchema)
@Auth.auth_required @Auth.auth_required
...@@ -115,3 +94,23 @@ def update(id): ...@@ -115,3 +94,23 @@ def update(id):
traceback.print_exc() traceback.print_exc()
logger.error(str(e)) logger.error(str(e))
return response_result(ResponseCode.SERVER_ERROR) 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 ...@@ -10,18 +10,18 @@ from app import config, signalManager
from fullstack.login import Auth from fullstack.login import Auth
from fullstack.validation import validate_schema from fullstack.validation import validate_schema
from fullstack.response import ResponseCode, response_result 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) @validate_schema(AddSchema)
@Auth.auth_required @Auth.auth_required
def add(): def add():
try: try:
isSuccess, message = signalManager.actionAddSummary.emit(request.schema_data) isSuccess, message = signalManager.actionAddFramework.emit(request.schema_data)
if isSuccess: if isSuccess:
return response_result(ResponseCode.OK, msg=message) return response_result(ResponseCode.OK, msg=message)
else: else:
...@@ -32,12 +32,12 @@ def add(): ...@@ -32,12 +32,12 @@ def add():
return response_result(ResponseCode.SERVER_ERROR, msg=str(e)) 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) @validate_schema(DeleteSchema)
@Auth.auth_required @Auth.auth_required
def delete(id): def delete(id):
try: try:
isSuccess, message = signalManager.actionDeleteSummary.emit(id) isSuccess, message = signalManager.actionDeleteFramework.emit(id)
if isSuccess: if isSuccess:
return response_result(ResponseCode.OK, msg=message) return response_result(ResponseCode.OK, msg=message)
else: else:
...@@ -48,12 +48,12 @@ def delete(id): ...@@ -48,12 +48,12 @@ def delete(id):
return response_result(ResponseCode.SERVER_ERROR) return response_result(ResponseCode.SERVER_ERROR)
@summary_api.route("/get", methods=["POST"]) @framework_api.route("/get", methods=["POST"])
@validate_schema(QuerySchema) @validate_schema(QuerySchema)
@Auth.auth_required @Auth.auth_required
def get(): def get():
try: try:
result, message = signalManager.actionGetSummary.emit(request.schema_data) result, message = signalManager.actionGetFramework.emit(request.schema_data)
if result: if result:
return response_result(ResponseCode.OK, data=result, msg=message) return response_result(ResponseCode.OK, data=result, msg=message)
else: else:
...@@ -64,12 +64,12 @@ def get(): ...@@ -64,12 +64,12 @@ def get():
return response_result(ResponseCode.SERVER_ERROR, msg=str(e)) return response_result(ResponseCode.SERVER_ERROR, msg=str(e))
@summary_api.route("/list", methods=['POST']) @framework_api.route("/list", methods=['POST'])
@validate_schema(QuerySchema) @validate_schema(QuerySchema)
@Auth.auth_required @Auth.auth_required
def get_list(): def get_list():
try: try:
result, count, message = signalManager.actionGetSummaryList.emit(request.schema_data) result, count, message = signalManager.actionGetFrameworkList.emit(request.schema_data)
if result: if result:
return response_result(ResponseCode.OK, data=result, msg=message, count=count) return response_result(ResponseCode.OK, data=result, msg=message, count=count)
else: else:
...@@ -80,12 +80,12 @@ def get_list(): ...@@ -80,12 +80,12 @@ def get_list():
return response_result(ResponseCode.SERVER_ERROR) 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) @validate_schema(UpdateSchema)
@Auth.auth_required @Auth.auth_required
def update(id): def update(id):
try: try:
isSuccess, message = signalManager.actionUpdateSummary.emit(id, request.schema_data) isSuccess, message = signalManager.actionUpdateFramework.emit(id, request.schema_data)
if isSuccess: if isSuccess:
return response_result(ResponseCode.OK, msg=message) return response_result(ResponseCode.OK, msg=message)
else: else:
......
...@@ -45,3 +45,67 @@ export function getBuildLogsList(params) { ...@@ -45,3 +45,67 @@ export function getBuildLogsList(params) {
data: 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 { ...@@ -42,6 +42,20 @@ export default {
icon: "gongzuotai", icon: "gongzuotai",
path: "build", 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", vue: "profile/index.vue",
title: "个人中心", 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 @@ ...@@ -17,9 +17,6 @@
></el-form-item ></el-form-item
> >
<el-form-item><el-button @click="onReset">重置</el-button></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-form>
<el-table <el-table
v-loading="isLoading" v-loading="isLoading"
...@@ -32,7 +29,7 @@ ...@@ -32,7 +29,7 @@
highlight-current-row highlight-current-row
> >
<el-table-column <el-table-column
prop="app_id.app_name" prop="app.app_name"
label="应用名称" label="应用名称"
width="180" width="180"
></el-table-column> ></el-table-column>
...@@ -87,56 +84,6 @@ ...@@ -87,56 +84,6 @@
:total="total" :total="total"
></el-pagination> ></el-pagination>
</div> </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> </div>
</template> </template>
<script> <script>
...@@ -148,7 +95,6 @@ export default { ...@@ -148,7 +95,6 @@ export default {
data() { data() {
return { return {
dialogImageUrl: "", dialogImageUrl: "",
dialogVisible: false,
disabled: false, disabled: false,
total: 0, total: 0,
list: [], list: [],
...@@ -162,20 +108,10 @@ export default { ...@@ -162,20 +108,10 @@ export default {
}, },
currentIndex: 0, currentIndex: 0,
currentValue: null, currentValue: null,
dialogTitle: "",
post: { post: {
name: null, name: null,
year_dispatch_site_days: null,
}, },
rules: { rules: {
year_dispatch_site_days: [
{
type: "number",
required: true,
message: "字段不能为空",
trigger: "blur",
},
],
name: [ name: [
{ {
type: "string", type: "string",
...@@ -227,7 +163,6 @@ export default { ...@@ -227,7 +163,6 @@ export default {
}, },
handlePictureCardPreview(file) { handlePictureCardPreview(file) {
this.dialogImageUrl = file.url; this.dialogImageUrl = file.url;
this.dialogVisible = true;
}, },
handleDownload(index, row) { handleDownload(index, row) {
console.log(index); console.log(index);
...@@ -250,8 +185,6 @@ export default { ...@@ -250,8 +185,6 @@ export default {
this.post = Object.assign(row); this.post = Object.assign(row);
this.currentIndex = index; this.currentIndex = index;
this.currentValue = row; this.currentValue = row;
this.dialogTitle = "编辑";
this.dialogVisible = true;
}, },
handleDelete(index, row) { handleDelete(index, row) {
this.$alert( this.$alert(
...@@ -265,22 +198,6 @@ export default { ...@@ -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() { onSubmit() {
this.form.pagenum = 1; this.form.pagenum = 1;
this.form.pagesize = 15; 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> <template>
<div class="app-container"> <div class="app-container">
<el-form :inline="true" ref="form" :model="form" size="mini"> <el-form :inline="true" ref="form" :model="form" size="mini">
<el-form-item <el-form-item><el-button type="warning" @click="onAdd">添加应用</el-button></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-form>
<el-table <el-table
v-loading="isLoading" v-loading="isLoading"
...@@ -25,6 +24,16 @@ ...@@ -25,6 +24,16 @@
label="应用版本号" label="应用版本号"
width="150" width="150"
></el-table-column> ></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 <el-table-column
prop="app_desc" prop="app_desc"
label="应用描述" label="应用描述"
...@@ -86,37 +95,24 @@ ...@@ -86,37 +95,24 @@
:total="total" :total="total"
></el-pagination> ></el-pagination>
</div> </div>
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="50%"> <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="45%">
<el-form <el-form :model="post" status-icon ref="post" size="medium" label-width="100px">
:model="post"
status-icon
:inline="true"
ref="post"
size="mini"
label-width="200px"
>
<el-form-item label="应用名称" prop="app_name"> <el-form-item label="应用名称" prop="app_name">
<el-input <el-input type="text" v-model="post.app_name" autocomplete="off"></el-input>
type="text"
v-model="post.app_name"
autocomplete="off"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="应用版本号" prop="app_version"> <el-form-item label="应用版本号" prop="app_version">
<el-input <el-input type="text" v-model="post.app_version" autocomplete="off"></el-input>
type="text" </el-form-item>
v-model="post.app_version" <el-form-item label="应用路径" prop="app_url">
autocomplete="off" <el-input type="text" v-model="post.app_url" autocomplete="off"></el-input>
></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>
<el-form-item label="应用描述" prop="app_desc"> <el-form-item label="应用描述" prop="app_desc">
<el-input <el-input type="text" v-model="post.app_desc" autocomplete="off"></el-input>
type="text"
v-model="post.app_desc"
autocomplete="off"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="应用Logo" prop="app_logo"> <el-form-item label="应用Logo" prop="app_icon">
<el-upload <el-upload
class="avatar-uploader" class="avatar-uploader"
:action="`${window.location.protocol}//${window.location.host}/api/v1/evm_store/upload`" :action="`${window.location.protocol}//${window.location.host}/api/v1/evm_store/upload`"
...@@ -149,19 +145,50 @@ ...@@ -149,19 +145,50 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" size="mini" plain @click="submitForm('post')" <el-button type="primary" size="medium" plain @click="submitForm('post')">提交</el-button>
>提交</el-button <el-button type="success" size="medium" plain @click="onReset('form')">重置</el-button>
> <el-button size="medium" @click="dialogVisible = false">关闭</el-button>
<el-button type="success" size="mini" plain @click="onReset('form')" </div>
>重置</el-button </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"
> >
<el-button size="mini" @click="dialogVisible = false">关闭</el-button> <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> </div>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script> <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"; import { mapTrim } from "@/utils/index";
export default { export default {
...@@ -171,6 +198,7 @@ export default { ...@@ -171,6 +198,7 @@ export default {
imageUrl: "", imageUrl: "",
total: 0, total: 0,
list: [], list: [],
fileList: [],
isLoading: false, isLoading: false,
form: { form: {
uuid: null, uuid: null,
...@@ -178,14 +206,26 @@ export default { ...@@ -178,14 +206,26 @@ export default {
pagesize: 15, pagesize: 15,
pagenum: 1, pagenum: 1,
}, },
framework: {
name: null,
url: null,
desc: null,
type: null,
assets: {
files: []
}
},
currentIndex: 0, currentIndex: 0,
currentValue: null, currentValue: null,
frameworkDialog: false,
dialogTitle: "", dialogTitle: "",
dialogVisible: false, dialogVisible: false,
post: { post: {
app_name: null, app_name: null,
app_version: null, app_version: null,
app_logo: null, app_icon: null,
app_url: null,
category: null,
app_desc: null, app_desc: null,
app_files: [], app_files: [],
}, },
...@@ -260,13 +300,11 @@ export default { ...@@ -260,13 +300,11 @@ export default {
); );
}, },
handleAppFilesUploadSuccess(res) { handleAppFilesUploadSuccess(res) {
console.log(res)
this.post.app_files.push(res.data) this.post.app_files.push(res.data)
}, },
handleAvatarSuccess(res, file) { handleAvatarSuccess(res, file) {
console.log(res)
if (res.code == 200) if (res.code == 200)
this.post.app_logo = res.data.filepath this.post.app_icon = res.data
this.imageUrl = URL.createObjectURL(file.raw); this.imageUrl = URL.createObjectURL(file.raw);
}, },
beforeAvatarUpload() { beforeAvatarUpload() {
...@@ -295,6 +333,12 @@ export default { ...@@ -295,6 +333,12 @@ export default {
} }
console.log(file); console.log(file);
}, },
handleFrameworkRemove() {
},
handleFrameworkSuccess(res) {
this.framework.assets.files.push(res.data)
},
submitForm(formName) { submitForm(formName) {
this.$refs[formName].validate((valid) => { this.$refs[formName].validate((valid) => {
let result = true; let result = true;
...@@ -327,6 +371,20 @@ export default { ...@@ -327,6 +371,20 @@ export default {
return result; 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() { onAdd() {
this.dialogTitle = "添加"; this.dialogTitle = "添加";
this.dialogVisible = true; 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.
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
<el-table-column prop="account" label="账号" align="center" width="120"></el-table-column> <el-table-column prop="account" label="账号" align="center" width="120"></el-table-column>
<el-table-column prop="role.name" label="角色" width="120" :show-overflow-tooltip="true"></el-table-column> <el-table-column prop="role.name" label="角色" width="120" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="depot.name" label="部门" width="120" :show-overflow-tooltip="true"></el-table-column> <el-table-column prop="depot.name" label="部门" width="120" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="contact" label="联系方式" width="150"></el-table-column> <el-table-column prop="phone" label="联系方式" width="150"></el-table-column>
<el-table-column prop="birthday" label="出生年月" width="150"></el-table-column> <el-table-column prop="birthday" label="出生年月" width="150"></el-table-column>
<el-table-column prop="email" label="邮箱" width="180" :show-overflow-tooltip="true"></el-table-column> <el-table-column prop="email" label="邮箱" width="180" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="hometown" label="籍贯" min-width="100"></el-table-column> <el-table-column prop="hometown" label="籍贯" min-width="100"></el-table-column>
...@@ -76,8 +76,8 @@ ...@@ -76,8 +76,8 @@
<el-form-item label="籍贯" prop="hometown"> <el-form-item label="籍贯" prop="hometown">
<el-input type="text" v-model="post.hometown" autocomplete="off"></el-input> <el-input type="text" v-model="post.hometown" autocomplete="off"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="联系方式" prop="contact"> <el-form-item label="联系方式" prop="phone">
<el-input type="text" v-model="post.contact" autocomplete="off"></el-input> <el-input type="text" v-model="post.phone" autocomplete="off"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="邮箱" prop="email"> <el-form-item label="邮箱" prop="email">
<el-input type="email" v-model="post.email" autocomplete="off"></el-input> <el-input type="email" v-model="post.email" autocomplete="off"></el-input>
...@@ -137,7 +137,7 @@ export default { ...@@ -137,7 +137,7 @@ export default {
post: { post: {
account: null, account: null,
username: null, username: null,
contact: null, phone: null,
birthday: null, birthday: null,
gender: 1, gender: 1,
email: null, email: null,
...@@ -155,7 +155,7 @@ export default { ...@@ -155,7 +155,7 @@ export default {
{ min: 1, max: 20, message: '字符串长度在 1 到 20 之间', trigger: 'blur' } { min: 1, max: 20, message: '字符串长度在 1 到 20 之间', trigger: 'blur' }
], ],
password: [{ type: 'string', required: true, message: '密码不能为空', trigger: 'blur' }, { min: 6, max: 18, message: '长度在 6 到 18 个字符', trigger: 'blur' }], password: [{ type: 'string', required: true, message: '密码不能为空', trigger: 'blur' }, { min: 6, max: 18, message: '长度在 6 到 18 个字符', trigger: 'blur' }],
contact: [{ type: 'string', required: true, message: '手机号不能为空', trigger: 'blur' }, { len: 11, message: '手机号长度为11', trigger: 'blur' }], phone: [{ type: 'string', required: true, message: '手机号不能为空', trigger: 'blur' }, { len: 11, message: '手机号长度为11', trigger: 'blur' }],
birthday: [{ required: false, message: '出生年月不能为空', trigger: 'blur' }], birthday: [{ required: false, message: '出生年月不能为空', trigger: 'blur' }],
gender: [{ type: 'number', required: true, message: '性别不能为空', trigger: 'blur' }], gender: [{ type: 'number', required: true, message: '性别不能为空', trigger: 'blur' }],
email: [{ type: 'email', required: true, message: '邮箱不能为空', trigger: 'blur' }], email: [{ type: 'email', required: true, message: '邮箱不能为空', trigger: 'blur' }],
...@@ -208,7 +208,7 @@ export default { ...@@ -208,7 +208,7 @@ export default {
handleEdit(index, row) { handleEdit(index, row) {
this.post.account = row.account this.post.account = row.account
this.post.username = row.username this.post.username = row.username
this.post.contact = row.contact this.post.phone = row.phone
this.post.birthday = row.birthday this.post.birthday = row.birthday
this.post.email = row.email this.post.email = row.email
this.post.hometown = row.hometown this.post.hometown = row.hometown
......
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