Commit fc865dd0 authored by wanli's avatar wanli

feat(应用打包模块、文件管理模块):

应用打包模块完善所有页面可用功能;文件管理模块移动GET和POST接口文件;
parent 9d898628
...@@ -76,7 +76,7 @@ class AppResource(object): ...@@ -76,7 +76,7 @@ class AppResource(object):
shutil.copy(target_file.resolve().as_posix(), dst_file.resolve().as_posix()) shutil.copy(target_file.resolve().as_posix(), dst_file.resolve().as_posix())
app_files.append([sf.id, dst_file.resolve().as_posix()]) app_files.append([sf.id, dst_file.resolve().as_posix()])
target_dir.joinpath("epk.json").write_text(json.dumps(app.to_dict()), encoding="utf-8") target_dir.joinpath("epk.json").write_text(json.dumps(app.to_dict(), ensure_ascii=False), encoding="utf-8")
# 打包成EPK文件 # 打包成EPK文件
app_info = {} app_info = {}
...@@ -100,8 +100,12 @@ class AppResource(object): ...@@ -100,8 +100,12 @@ class AppResource(object):
db.session.commit() db.session.commit()
# 新增一条AppLogs # 新增一条AppLogs
package = PackageModel(app=app.app_name, app_version=app.app_version, file_path=epk_path, package_info=json.dumps(app_info), create_by=user.id, create_at=datetime.now()) package = PackageModel(app=app.app_name, app_version=app.app_version, file_path=epk_path, package_info=json.dumps(app_info, ensure_ascii=False), create_by=user.id, create_at=datetime.now())
db.session.add(package) db.session.add(package)
app.update_by = user.id
app.update_at = datetime.now()
app.app_file_size = app_info.get("buff_length", 0)
app.download_url = epk_path
db.session.commit() db.session.commit()
return { 'app_name': app.app_name, 'app_path': epk_path }, ResponseCode.HTTP_SUCCESS return { 'app_name': app.app_name, 'app_path': epk_path }, ResponseCode.HTTP_SUCCESS
...@@ -118,19 +122,22 @@ class AppResource(object): ...@@ -118,19 +122,22 @@ class AppResource(object):
else: else:
filters.append(AppModel.create_by==user.id) filters.append(AppModel.create_by==user.id)
temp.update({ "create_by": user.id, "is_delete": False }) temp.update({ "create_by": user.id, "is_delete": False })
logger.info(params)
if "scope_type" in params and params.get("scope_type") == "list": if "scope" in params and params.get("scope") == "list":
result = AppModel.query.filter_by(**temp).order_by(AppModel.create_at.desc()) result = AppModel.query.filter_by(**temp).order_by(AppModel.create_at.desc())
temp = [] temp = []
for item in result: for item in result:
temp.append(item.to_dict(only=["uuid", "app_name"])) temp.append({
return (temp, len(temp)), ResponseCode.HTTP_SUCCESS "uuid": item.uuid,
elif "scope_type" in params and params.get("scope_type") == "distinct": "app_name": item.app_name
})
return temp, ResponseCode.HTTP_SUCCESS
elif "scope" in params and params.get("scope") == "distinct":
result = db.session.query(AppModel, func.count(distinct(AppModel.name))).all() result = db.session.query(AppModel, func.count(distinct(AppModel.name))).all()
temp = [] temp = []
for item in result: for item in result:
temp.append(item) temp.append(item)
return (temp, len(temp)), ResponseCode.HTTP_SUCCESS return temp, ResponseCode.HTTP_SUCCESS
for p in params: for p in params:
if hasattr(AppModel, p) and params[p] != None: if hasattr(AppModel, p) and params[p] != None:
...@@ -148,9 +155,6 @@ class AppResource(object): ...@@ -148,9 +155,6 @@ class AppResource(object):
# handle business # handle business
# 应用打包 # 应用打包
# 插入一条打包记录 # 插入一条打包记录
logger.info(jwt)
user = UserModel.query.filter(UserModel.uuid==jwt.get('uuid')).one_or_none() user = UserModel.query.filter(UserModel.uuid==jwt.get('uuid')).one_or_none()
if not user: if not user:
return False, ResponseCode.USER_NOT_EXISTS return False, ResponseCode.USER_NOT_EXISTS
...@@ -187,12 +191,13 @@ class AppResource(object): ...@@ -187,12 +191,13 @@ class AppResource(object):
db.session.add(app) db.session.add(app)
db.session.commit() db.session.commit()
logger.info(params)
# 在EPK目录下生成JSON文件 # 在EPK目录下生成JSON文件
epk_path.joinpath("epk.json").write_text(json.dumps(app.to_dict()), encoding="utf-8") epk_path.joinpath("epk.json").write_text(json.dumps(app.to_dict(), ensure_ascii=False), encoding="utf-8")
# with open(os.sep.join([os.path.dirname(epk_path), "epk.json"]), "w") as f: # with open(os.sep.join([os.path.dirname(epk_path), "epk.json"]), "w") as f:
# json.dump(app.to_dict(), f) # json.dump(app.to_dict(), f)
logger.info(app_files)
for a in app_files: for a in app_files:
t = Path(config.UPLOAD_ROOT_DIR).joinpath(a) t = Path(config.UPLOAD_ROOT_DIR).joinpath(a)
res = AnnexModel(app=app.id, title=t.name, path=a, size=t.stat().st_size, create_by=user.id, create_at=datetime.now(), update_by=user.id, update_at=datetime.now()) res = AnnexModel(app=app.id, title=t.name, path=a, size=t.stat().st_size, create_by=user.id, create_at=datetime.now(), update_by=user.id, update_at=datetime.now())
...@@ -211,7 +216,7 @@ class AppResource(object): ...@@ -211,7 +216,7 @@ class AppResource(object):
epk = EpkApp(**params) epk = EpkApp(**params)
app_info = epk.pack() app_info = epk.pack()
epk_filename = epk_path.relative_to(config.UPLOAD_ROOT_DIR).joinpath("{}.epk".format(app.app_name)).resolve().as_posix() epk_filename = epk_path.parent.relative_to(config.UPLOAD_ROOT_DIR).joinpath("{}.epk".format(app.app_name)).resolve().as_posix()
if app_info: if app_info:
app_info['md5'] = str(app_info['md5']) app_info['md5'] = str(app_info['md5'])
...@@ -219,7 +224,7 @@ class AppResource(object): ...@@ -219,7 +224,7 @@ class AppResource(object):
app.download_url = epk_filename app.download_url = epk_filename
db.session.commit() db.session.commit()
package = PackageModel(app=app.id, file_path=epk_filename, app_version=params.get("appVersion"), package_info=json.dumps(app_info), source=1, create_by=user.id, create_at=datetime.now(), update_by=user.id, update_at=datetime.now(), remarks=json.dumps(params)) package = PackageModel(app=app.id, file_path=epk_filename, app_version=params.get("appVersion"), package_info=json.dumps(app_info, ensure_ascii=False), source=1, create_by=user.id, create_at=datetime.now(), update_by=user.id, update_at=datetime.now(), remarks=json.dumps(params, ensure_ascii=False))
db.session.add(package) db.session.add(package)
db.session.commit() db.session.commit()
......
''' '''
Author: your name Author: your name
Date: 2021-06-30 18:03:41 Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-15 17:10:22 LastEditTime: 2021-07-17 13:47:11
LastEditors: Please set LastEditors LastEditors: Please set LastEditors
Description: In User Settings Edit Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\package.py FilePath: \evm-store\tools\build_out\controllers\package.py
...@@ -12,6 +12,7 @@ FilePath: \evm-store\tools\build_out\controllers\package.py ...@@ -12,6 +12,7 @@ FilePath: \evm-store\tools\build_out\controllers\package.py
import os import os
import re import re
import shutil import shutil
from pathlib import Path
from datetime import datetime from datetime import datetime
from application.app import db, config from application.app import db, config
from models.annex import AnnexModel from models.annex import AnnexModel
...@@ -26,7 +27,7 @@ class PackageResource(object): ...@@ -26,7 +27,7 @@ class PackageResource(object):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
def get(self, uuid, params): def get(self, uuid, jwt):
# handle business # handle business
filters = [PackageModel.is_delete==False, PackageModel.uuid==uuid] filters = [PackageModel.is_delete==False, PackageModel.uuid==uuid]
result = PackageModel.query.filter(*filters).first() result = PackageModel.query.filter(*filters).first()
...@@ -34,48 +35,60 @@ class PackageResource(object): ...@@ -34,48 +35,60 @@ class PackageResource(object):
return result, ResponseCode.HTTP_SUCCESS return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params): def getList(self, params, jwt):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [PackageModel.is_delete==False] # filters = [PackageModel.is_delete==False]
result = PackageModel.query.filter(*filters).order_by(PackageModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) # result = PackageModel.query.filter(*filters).order_by(PackageModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
# if result:
# return result, ResponseCode.HTTP_SUCCESS
if result: user = UserModel.query.filter(UserModel.uuid==jwt.get('uuid')).one_or_none()
return result, ResponseCode.HTTP_SUCCESS
user = UserModel.query.filter(id=params.get('user')).onr_or_none()
if not user: if not user:
return False, ResponseCode.USER_NOT_EXISTS return False, ResponseCode.USER_NOT_EXISTS
temp = {} temp = {}
if user.role == "administrator": if user.role == 1:
temp.update({"is_delete": False}) temp.update({ "is_delete": False })
else: else:
temp.update({ "create_by": user.id, "is_delete": False }) temp.update({ "create_by": user.id, "is_delete": False })
if "scope_type" in params and params.get("scope_type") == "list": if "scope" in params and params.get("scope") == "list":
result = PackageModel.query.filter_by(**temp).order_by(PackageModel.create_at.desc()) result = PackageModel.query.filter_by(**temp).order_by(PackageModel.create_at.desc())
temp = [] temp = []
for item in result: for item in result:
temp.append({ "name": item.app.app_name, "uuid": str(item.uuid) }) temp.append({ "name": item.app.app_name, "uuid": str(item.uuid) })
return temp, len(temp), "get build_logs {}.".format("success" if temp else "fail") return temp, len(temp), "get build_logs {}.".format("success" if temp else "fail")
result = PackageModel.query.filter_by(**temp).order_by(PackageModel.create_at.desc()).paginate(params.get("pagenum", 1), params.get("pagesize", 10), error_out=False) temp = [PackageModel.is_delete==False]
if params.get("app") and isinstance(params.get("app"), str):
logger.info(params.get("app"))
app = AppModel.query.filter(AppModel.uuid==params.get("app")).one_or_none()
if app:
params.update({ "app": app.id })
temp.append(PackageModel.app==app.id)
else:
return None, ResponseCode.HTTP_NOT_FOUND
if params.get("app_version"):
temp.append(PackageModel.app_version==params.get("app_version"))
if params.get("algorithm"):
temp.append(PackageModel.algorithm==params.get("algorithm"))
if params.get("source"):
temp.append(PackageModel.source==params.get("source"))
# for p in params:
# if hasattr(PackageModel, p) and params[p] != None:
# logger.info(p)
# temp[p] = params[p]
logger.info(temp)
result = db.session.query(PackageModel).join(AppModel, PackageModel.app==AppModel.id).filter(*temp).order_by(PackageModel.create_at.desc()).add_entity(AppModel).paginate(params.get("page", 1), params.get("pageSize", 15), error_out=False)
if result.total and len(result.items): if result.total and len(result.items):
temp = [] return result, ResponseCode.HTTP_SUCCESS
for item in result.items:
t = item.to_dict()
t.update({
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S") if item.create_at else None,
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S") if item.update_at else None,
})
temp.append(t)
return (temp, result.total), ResponseCode.HTTP_SUCCESS
return result, ResponseCode.HTTP_NO_DATA return result, ResponseCode.HTTP_NO_DATA
def post(self, params, jwt={}): def post(self, params, jwt={}):
# 判断用户是否存在 # 判断用户是否存在
user = UserModel.query.filter(UserModel.id==params.get('user')) user = UserModel.query.filter(UserModel.uuid==jwt.get('uuid'))
if not user: if not user:
return False, ResponseCode.USER_NOT_EXISTS return False, ResponseCode.USER_NOT_EXISTS
...@@ -90,26 +103,28 @@ class PackageResource(object): ...@@ -90,26 +103,28 @@ class PackageResource(object):
return None, ResponseCode.HTTP_NO_DATA return None, ResponseCode.HTTP_NO_DATA
dir_format = "{}-{}-{}".format(app.app_name, app.app_version, datetime.now().strftime("%Y%m%d%H%M%S")) dir_format = "{}-{}-{}".format(app.app_name, app.app_version, datetime.now().strftime("%Y%m%d%H%M%S"))
upload_dir = os.sep.join([config.UPLOAD_ROOT_DIR, "uploads", "evueapps"]) upload_dir = Path(config.UPLOAD_ROOT_DIR).joinpath("uploads").joinpath("evueapps")
target_dir = os.sep.join([upload_dir, user.account, dir_format]) # upload_dir = os.sep.join([config.UPLOAD_ROOT_DIR, "uploads", "evueapps"])
dest_dir = os.sep.join([target_dir, "src"]) target_dir = upload_dir.joinpath(user.account).joinpath(dir_format)
if not os.path.exists(dest_dir): # target_dir = os.sep.join([upload_dir, user.account, dir_format])
os.makedirs(dest_dir) dest_dir = target_dir.joinpath("src")
# dest_dir = os.sep.join([target_dir, "src"])
if not dest_dir.exists():
os.makedirs(dest_dir.resolve().as_posix())
app_files = [] app_files = []
for sf in source_files: for sf in source_files:
target_file = os.sep.join([config.UPLOAD_ROOT_DIR, sf.path]) target_file = Path(config.UPLOAD_ROOT_DIR).joinpath(sf.path)
filename = os.path.basename(target_file) name = re.sub(r"_\d{14}$", "", target_file.stem)
name, suffix = os.path.splitext(filename) suffix = target_file.suffix
name = re.sub(r"_\d{14}$", "", name) dst_file = dest_dir.joinpath(name + suffix)
dst_file = os.path.normpath(os.sep.join([dest_dir, name + suffix])) shutil.move(target_file.resolve().as_posix(), dst_file.resolve().as_posix())
shutil.move(os.path.normpath(target_file), dst_file) app_files.append([sf.id, dst_file.resolve().as_posix()])
app_files.append([sf.id, dst_file])
# 打包成EPK文件 # 打包成EPK文件
app_info = {} app_info = {}
params = { 'appName': app.app_name, 'appDir': dest_dir, 'appVersion': app.app_version, 'output': target_dir } params = { 'appName': app.app_name, 'appDir': dest_dir, 'appVersion': app.app_version, 'output': target_dir.resolve().as_posix() }
if user.role == "administrator" or user.role == "community": if user.role == 1:
params['algorithm'] = "h" params['algorithm'] = "h"
epk = EpkApp(**params) epk = EpkApp(**params)
app_info = epk.pack() app_info = epk.pack()
...@@ -125,7 +140,7 @@ class PackageResource(object): ...@@ -125,7 +140,7 @@ class PackageResource(object):
# db.session.flush() # db.session.flush()
# db.session.commit() # db.session.commit()
epk_path = os.sep.join([target_dir.replace(config.UPLOAD_ROOT_DIR, ""), "{}.epk".format(app.app_name)]).replace('\\', '/') epk_path = target_dir.relative_to(config.UPLOAD_ROOT_DIR).joinpath("{}.epk".format(app.app_name)).resolve().as_posix()
# handle business # handle business
# result = PackageModel.query.filter(PackageModel.app == params.get('app')).first() # result = PackageModel.query.filter(PackageModel.app == params.get('app')).first()
# if result and result.is_delete: # if result and result.is_delete:
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from application.app import db, ma from application.app import db, ma
from .base import PrimaryModel from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class AppModel(PrimaryModel): class AppModel(PrimaryModel):
...@@ -103,6 +103,7 @@ class GetListAppSchema(ma.SQLAlchemySchema): ...@@ -103,6 +103,7 @@ class GetListAppSchema(ma.SQLAlchemySchema):
uuid = fields.String(required=False, nullable=True) uuid = fields.String(required=False, nullable=True)
page = fields.Integer(required=False, default=1, nullable=True) page = fields.Integer(required=False, default=1, nullable=True)
pageSize = fields.Integer(required=False, default=15, nullable=True) pageSize = fields.Integer(required=False, default=15, nullable=True)
scope = fields.String(required=False, nullable=True)
app_name = fields.String(required=False, nullable=True) app_name = fields.String(required=False, nullable=True)
app_icon = fields.String(required=False, nullable=True) app_icon = fields.String(required=False, nullable=True)
app_version = fields.String(required=False, nullable=True) app_version = fields.String(required=False, nullable=True)
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# -*- coding: utf_8 -*- # -*- coding: utf_8 -*-
from application.app import db, ma from application.app import db, ma
from .base import PrimaryModel from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class PackageModel(PrimaryModel): class PackageModel(PrimaryModel):
...@@ -46,18 +46,25 @@ class PackageModel(PrimaryModel): ...@@ -46,18 +46,25 @@ class PackageModel(PrimaryModel):
return '<PackageModel %r>' % (self.app) return '<PackageModel %r>' % (self.app)
def to_dict(self): def to_dict(self):
source = 'Frontend'
if self.source == 1:
source = 'API'
return { return {
'uuid': self.uuid,
'app_version': self.app_version, 'app_version': self.app_version,
'package_info': self.package_info, 'package_info': self.package_info,
'algorithm': self.algorithm, 'algorithm': self.algorithm,
'file_path': self.file_path, 'file_path': self.file_path,
'source': self.source, 'source': source,
'user_agent': self.user_agent, 'user_agent': self.user_agent,
'download_url': self.download_url, 'download_url': self.download_url,
'ip': self.ip, 'ip': self.ip,
'geo_location': self.geo_location, 'geo_location': self.geo_location,
'operator': self.operator, 'operator': self.operator,
'remarks': self.remarks 'remarks': self.remarks,
"create_at": self.create_at.strftime("%Y-%m-%d %H:%M:%S") if self.create_at else None,
"update_at": self.update_at.strftime("%Y-%m-%d %H:%M:%S") if self.update_at else None,
} }
...@@ -67,17 +74,19 @@ class GetListPackageSchema(ma.SQLAlchemySchema): ...@@ -67,17 +74,19 @@ class GetListPackageSchema(ma.SQLAlchemySchema):
unknown = EXCLUDE # 未知字段默认排除 unknown = EXCLUDE # 未知字段默认排除
model = PackageModel model = PackageModel
id = fields.Integer(required=False, nullable=True)
uuid = fields.String(required=False, nullable=True)
page = fields.Integer(required=False) page = fields.Integer(required=False)
pageSize = fields.Integer(required=False) pageSize = fields.Integer(required=False)
app = ma.auto_field() app = fields.String(required=False)
app_version = ma.auto_field() app_version = ma.auto_field()
package_info = ma.auto_field() package_info = fields.String(required=False)
file_path = ma.auto_field() file_path = ma.auto_field()
source = ma.auto_field() source = ma.auto_field()
user_agent = ma.auto_field() user_agent = ma.auto_field()
download_url = ma.auto_field() download_url = ma.auto_field()
ip = ma.auto_field() ip = ma.auto_field()
geo_location = ma.auto_field() geo_location = fields.String(required=False)
operator = ma.auto_field() operator = ma.auto_field()
getListPackageSchema = GetListPackageSchema() getListPackageSchema = GetListPackageSchema()
......
...@@ -22,6 +22,8 @@ class AppResourceList(Resource): ...@@ -22,6 +22,8 @@ class AppResourceList(Resource):
@jwt_required(locations=["headers"]) @jwt_required(locations=["headers"])
def get(self): def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开 # 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
self.parser.add_argument("app", type=str, location="args", nullable=True, required=False)
self.parser.add_argument("scope", type=str, location="args", nullable=True, required=False)
self.parser.add_argument("app_name", type=str, location="args", nullable=True, required=False) self.parser.add_argument("app_name", type=str, location="args", nullable=True, required=False)
self.parser.add_argument("app_version", type=str, location="args", nullable=True, required=False) self.parser.add_argument("app_version", type=str, location="args", nullable=True, required=False)
self.parser.add_argument("category", type=str, location="args", nullable=True, required=False) self.parser.add_argument("category", type=str, location="args", nullable=True, required=False)
...@@ -41,8 +43,12 @@ class AppResourceList(Resource): ...@@ -41,8 +43,12 @@ class AppResourceList(Resource):
result, message = signalManager.actionGetListApp.emit(data, jwt) result, message = signalManager.actionGetListApp.emit(data, jwt)
json_dumps = getListAppSchema.dump(result) json_dumps = getListAppSchema.dump(result)
if result: if result:
json_dumps = getListAppsSchema.dump(result.items) if isinstance(result, list):
return response_result(ResponseCode.HTTP_SUCCESS, data=json_dumps, total=result.total, pageSize=args.pageSize) json_dumps = result
return response_result(ResponseCode.HTTP_SUCCESS, data=json_dumps)
else:
json_dumps = getListAppsSchema.dump(result.items)
return response_result(ResponseCode.HTTP_SUCCESS, data=json_dumps, total=result.total, pageSize=args.pageSize)
return response_result(message) return response_result(message)
except Exception as e: except Exception as e:
traceback.print_exc() traceback.print_exc()
...@@ -73,7 +79,6 @@ class AppResourceList(Resource): ...@@ -73,7 +79,6 @@ class AppResourceList(Resource):
# 获取相对路径 # 获取相对路径
dirname = "{}-{}-{}-{}".format(params["app_name"], params["app_version"], params["category"], now_str) dirname = "{}-{}-{}-{}".format(params["app_name"], params["app_version"], params["category"], now_str)
relative_path = Path(config.UPLOAD_ROOT_DIR) relative_path = Path(config.UPLOAD_ROOT_DIR)
logger.info(dirname)
# 获取最终存储的绝对路径 # 获取最终存储的绝对路径
upload_path = Path(config.EPK_DIR).joinpath(dirname) upload_path = Path(config.EPK_DIR).joinpath(dirname)
...@@ -105,8 +110,7 @@ class AppResourceList(Resource): ...@@ -105,8 +110,7 @@ class AppResourceList(Resource):
params.update({ "fileList": files, "epk_path": upload_path, 'real_ip': request.headers.get('X-Forwarded-For', '127.0.0.1') }) params.update({ "fileList": files, "epk_path": upload_path, 'real_ip': request.headers.get('X-Forwarded-For', '127.0.0.1') })
result, message = signalManager.actionPostApp.emit(params, jwt) result, message = signalManager.actionPostApp.emit(params, jwt)
if result: if result:
logger.warn(result) return response_result(ResponseCode.HTTP_SUCCESS, data=result)
return response_result(ResponseCode.HTTP_SUCCESS, data=result, msg=message)
return response_result(message) return response_result(message)
except Exception as e: except Exception as e:
traceback.print_exc() traceback.print_exc()
......
'''
Author: your name
Date: 2021-07-15 09:33:39
LastEditTime: 2021-07-16 19:27:36
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\views\package.20210715165358.py
'''
from flask import current_app, jsonify, request from flask import current_app, jsonify, request
from flask_restful import Resource from flask_restful import Resource
from flask_restful.reqparse import RequestParser from flask_restful.reqparse import RequestParser
...@@ -11,7 +19,7 @@ class PackageResourceList(Resource): ...@@ -11,7 +19,7 @@ class PackageResourceList(Resource):
def __init__(self): def __init__(self):
pass pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开 # 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser() self.parser = RequestParser()
def get(self): def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开 # 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
......
'''
Author: your name
Date: 2021-07-15 09:33:39
LastEditTime: 2021-07-17 13:29:31
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\views\package.py
'''
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf_8 -*- # -*- coding: utf_8 -*-
import os
import json
import traceback
from flask import current_app, jsonify, request from flask import current_app, jsonify, request
from flask_restful import Resource from flask_restful import Resource
from flask_restful.reqparse import RequestParser from flask_restful.reqparse import RequestParser
...@@ -12,36 +23,53 @@ from webcreator.response import ResponseCode, response_result ...@@ -12,36 +23,53 @@ from webcreator.response import ResponseCode, response_result
class PackageResourceList(Resource): class PackageResourceList(Resource):
def __init__(self): def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开 # 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser() self.parser = RequestParser()
@jwt_required(locations=["headers"])
def get(self): def get(self):
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开 # 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser.add_argument("page", type=int, location="args", default=1) self.parser.add_argument("app", type=str, location="args", nullable=True, required=False)
# self.parser.add_argument("pageSize", type=int, location="args", default=15) self.parser.add_argument("page", type=int, location="args", default=1)
# args = self.parser.parse_args() self.parser.add_argument("pageSize", type=int, location="args", default=15)
args = self.parser.parse_args()
try: try:
json_payload = request.json jwt = get_jwt_identity()
logger.warn(json_payload) data = dict()
data = getListPackageSchema.load(json_payload) for key, value in args.items():
result, message = signalManager.actionGetListPackage.emit(data) if value != None:
json_dumps = getListPackageSchema.dump(result) data[key] = value
result, message = signalManager.actionGetListPackage.emit(data, jwt)
if result: if result:
json_dumps = getListPackagesSchema.dump(result.items) # json_dumps = getListPackagesSchema.dump(result.items)
logger.warn(json_dumps) replace_key = '******'
return response_result(message, data=json_dumps, count=result.total) response = []
for p, a in result.items:
t = p.to_dict()
if p.geo_location != "" and isinstance(p.geo_location, str):
t['geo_location'] = json.loads(p.geo_location)
if p.remarks != "" and isinstance(p.remarks, str):
t['remarks'] = json.loads(p.remarks)
t['remarks']['appDir'] = replace_key + t['remarks']['appDir'][len(replace_key):]
t['app_name'] = a.app_name
t['file_dir'] = os.path.dirname(p.file_path)
t['application'] = a.to_dict()
t['package_info'] = json.loads(p.package_info)
t['package_info']['epkfile'] = replace_key + t['package_info']['epkfile'][len(replace_key):]
response.append(t)
return response_result(message, data=response, total=result.total, pageSize=args.pageSize)
return response_result(message) return response_result(message)
except Exception as e: except Exception as e:
traceback.print_exc()
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
class PackageResource(Resource): class PackageResource(Resource):
def __init__(self): def __init__(self):
pass
# 特殊参数,即不是从json获取参数的接口,可以将这个注释打开 # 特殊参数,即不是从json获取参数的接口,可以将这个注释打开
# self.parser = RequestParser() self.parser = RequestParser()
@jwt_required(locations=["headers"]) @jwt_required(locations=["headers"])
def get(self, uuid): def get(self, uuid):
...@@ -51,14 +79,15 @@ class PackageResource(Resource): ...@@ -51,14 +79,15 @@ class PackageResource(Resource):
# args = self.parser.parse_args() # args = self.parser.parse_args()
try: try:
jwt = get_jwt_identity()
json_payload = request.json json_payload = request.json
print("========>", uuid, json_payload) print("========>", uuid, json_payload)
data = getPackageSchema.load(json_payload) result, message = signalManager.actionGetPackage.emit(uuid, jwt)
result, message = signalManager.actionGetPackage.emit(uuid, data)
if result: if result:
json_dumps = getPackageSchema.dump(result) json_dumps = getPackageSchema.dump(result)
return response_result(message, data=json_dumps) return response_result(message, data=json_dumps)
return response_result(message) return response_result(message)
except Exception as e: except Exception as e:
traceback.print_exc()
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.HTTP_SERVER_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
import request from './axios'; import request from '@/utils/axios';
export default { export default {
/** /**
......
/* /*
* @Author: your name * @Author: your name
* @Date: 2021-07-15 09:33:39 * @Date: 2021-07-15 09:33:39
* @LastEditTime: 2021-07-16 18:28:38 * @LastEditTime: 2021-07-16 20:19:01
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @FilePath: \evm-store\tools\frontend\src\api\openapi.js * @FilePath: \evm-store\tools\frontend\src\api\openapi.js
...@@ -53,3 +53,11 @@ export function deleteApplication(uuid) { ...@@ -53,3 +53,11 @@ export function deleteApplication(uuid) {
method: "delete" method: "delete"
}) })
} }
export function getPackageList(params) {
return request({
url: "/api/v1/package",
method: "get",
params
})
}
import request from './axios'; import request from '@/utils/axios';
export default { export default {
/** /**
......
...@@ -187,6 +187,11 @@ const router = new Router({ ...@@ -187,6 +187,11 @@ const router = new Router({
path: "/application/form", path: "/application/form",
component: () => import("@/views/Application/Form"), component: () => import("@/views/Application/Form"),
}, },
{
path: "/application/source",
name: "FileManager",
component: () => import("@/views/FileManager/FileManager"),
},
], ],
}, },
], ],
......
/* eslint-disable max-len,prefer-destructuring,object-curly-newline */ /* eslint-disable max-len,prefer-destructuring,object-curly-newline */
import GET from '@/utils/get'; import GET from '@/api/get';
import POST from '@/utils/post'; import POST from '@/api/post';
export default { export default {
/** /**
......
/* eslint-disable object-curly-newline */ /* eslint-disable object-curly-newline */
import GET from '@/utils/get'; import GET from '@/api/get';
export default { export default {
/** /**
......
import GET from '@/utils/get'; import GET from '@/api/get';
export default { export default {
/** /**
......
...@@ -272,3 +272,11 @@ export function download(name, url) { ...@@ -272,3 +272,11 @@ export function download(name, url) {
}); });
} }
export function saveFile(d, a) {
var b = document.createElement('a');
b.href = d;
b.download = a;
var c = document.createEvent("MouseEvents");
c.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
b.dispatchEvent(c);
}
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<span class="submitButtons"> <span class="submitButtons">
<a-button type="primary" htmlType="submit" @click="onQuery"> <a-button type="primary" htmlType="submit" @click="getApplicationList">
查询 查询
</a-button> </a-button>
<a-button :style="{ marginLeft: '8px' }" @click="resetForm"> 重置 </a-button> <a-button :style="{ marginLeft: '8px' }" @click="resetForm"> 重置 </a-button>
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
</a-row> </a-row>
<div style="overflow: hidden"> <div style="overflow: hidden">
<div :style="{ float: 'right', marginBottom: '24px' }"> <div :style="{ float: 'right', marginBottom: '24px' }">
<a-button type="primary" htmlType="submit" @click="onQuery"> <a-button type="primary" htmlType="submit" @click="getApplicationList">
查询 查询
</a-button> </a-button>
<a-button :style="{ marginLeft: '8px' }" @click="resetForm"> 重置 </a-button> <a-button :style="{ marginLeft: '8px' }" @click="resetForm"> 重置 </a-button>
...@@ -408,9 +408,6 @@ export default { ...@@ -408,9 +408,6 @@ export default {
toggleForm() { toggleForm() {
this.expandForm = !this.expandForm; this.expandForm = !this.expandForm;
}, },
onQuery() {
this.getApplicationList();
},
onSelectChange(selectedRowKeys) { onSelectChange(selectedRowKeys) {
window.console.log("selectedRowKeys changed: ", selectedRowKeys); window.console.log("selectedRowKeys changed: ", selectedRowKeys);
this.selectedRowKeys = selectedRowKeys; this.selectedRowKeys = selectedRowKeys;
...@@ -438,6 +435,7 @@ export default { ...@@ -438,6 +435,7 @@ export default {
// ); // );
}, },
getApplicationList() { getApplicationList() {
this.loading = true
let opts = mapTrim(this.query); let opts = mapTrim(this.query);
opts = Object.assign(opts, this.post); opts = Object.assign(opts, this.post);
...@@ -452,6 +450,8 @@ export default { ...@@ -452,6 +450,8 @@ export default {
}) })
.catch((err) => { .catch((err) => {
message.error(err.msg); message.error(err.msg);
}).finally(() => {
this.loading = false
}); });
}, },
rebuildApplication(record) { rebuildApplication(record) {
......
...@@ -3,117 +3,64 @@ ...@@ -3,117 +3,64 @@
<a-card :bordered="false"> <a-card :bordered="false">
<div class="tableList"> <div class="tableList">
<div class="tableListForm"> <div class="tableListForm">
<a-form v-show="!expandForm" layout="inline"> <a-form layout="inline">
<a-row :gutter="{ md: 8, lg: 24, xl: 48 }"> <a-row :gutter="{ md: 8, lg: 24, xl: 48 }">
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="用户" v-decorator="['username']"> <a-form-item label="版本号" v-decorator="['app_version']">
<a-input placeholder="请输入" /> <a-input v-model="query.app_version" placeholder="请输入" />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="性别" v-decorator="['gender']"> <a-form-item label="应用名称" v-decorator="['app_name']">
<a-select placeholder="请选择" style="width: 100%"> <a-select
<a-option value="male">male</a-option> v-model="query.app"
<a-option value="female">female</a-option> placeholder="请选择"
style="width: 100%"
>
<a-option
v-for="item in appList"
:key="item.uuid"
:value="item.uuid"
>{{ item.app_name }}</a-option
>
</a-select> </a-select>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<span class="submitButtons"> <span class="submitButtons">
<a-button type="primary" htmlType="submit"> 查询 </a-button> <a-button
<a-button :style="{ marginLeft: '8px' }"> 重置 </a-button> type="primary"
<a :style="{ marginLeft: '8px' }" @click="toggleForm"> htmlType="submit"
展开 <a-icon type="down" /> @click="getPackageList"
</a> >
查询
</a-button>
<a-button :style="{ marginLeft: '8px' }" @click="resetForm">
重置
</a-button>
</span> </span>
</a-col> </a-col>
</a-row> </a-row>
</a-form> </a-form>
<a-form v-show="expandForm" layout="inline">
<a-row :gutter="{ md: 8, lg: 24, xl: 48 }">
<a-col :md="8" :sm="24">
<a-form-item label="用户" v-decorator="['username']">
<a-input placeholder="请输入" />
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<a-form-item label="性别" v-decorator="['gender']">
<a-select placeholder="请选择" style="width: 100%">
<a-option value="male">male</a-option>
<a-option value="female">female</a-option>
</a-select>
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<a-form-item label="姓名" v-decorator="['name']">
<a-input placeholder="请输入" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="{ md: 8, lg: 24, xl: 48 }">
<a-col :md="8" :sm="24">
<a-form-item label="时间" v-decorator="['registered']">
<a-range-picker style="width: 100%" />
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<a-form-item label="邮箱" v-decorator="['email']">
<a-input placeholder="请输入" />
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<a-form-item label="国籍" v-decorator="['nat']">
<a-input placeholder="请输入" />
</a-form-item>
</a-col>
</a-row>
<div style="overflow: hidden">
<div :style="{ float: 'right', marginBottom: '24px' }">
<a-button type="primary" htmlType="submit"> 查询 </a-button>
<a-button :style="{ marginLeft: '8px' }"> 重置 </a-button>
<a :style="{ marginLeft: '8px' }" @click="toggleForm">
收起 <a-icon type="up" />
</a>
</div>
</div>
</a-form>
</div> </div>
<div class="tableListOperator"> <div class="tableListOperator">
<a-button icon="plus" type="primary"> 新建 </a-button>
<span v-show="selectedRowKeys.length > 0"> <span v-show="selectedRowKeys.length > 0">
<a-button>批量操作</a-button> <a-button>批量操作</a-button>
<!-- <a-dropdown overlay={menu}> <a-dropdown overlay="{menu}">
<a-button> <a-button> 更多操作 <icon type="down" /> </a-button>
更多操作 <icon type="down" /> </a-dropdown>
</a-button>
</a-dropdown> -->
</span> </span>
</div> </div>
<!-- <StandardTable
selectedRows={selectedRows}
loading={loading}
data={data}
columns={this.columns}
onSelectRow={this.handleSelectRows}
onChange={this.handleStandardTableChange}
/> -->
<a-table <a-table
:columns="columns" :columns="columns"
:rowKey="(record) => record.login.uuid" :rowKey="(record) => record.uuid"
:dataSource="users.data" :dataSource="tableData.list"
:pagination="users.pagination" :pagination="tableData.pagination"
:loading="loading" :loading="loading"
@change="handleTableChange" @change="handleTableChange"
> >
<!-- :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" --> <template slot="record" slot-scope="record">
<template slot="login" slot-scope="login"> {{ record.create_at }}
{{ login.username }}
</template>
<template slot="name" slot-scope="name">
{{ name.first }} {{ name.last }}
</template>
<template slot="registered" slot-scope="registered">
{{ registered.date }} ({{ registered.age }})
</template> </template>
<template <template
slot="expandedRowRender" slot="expandedRowRender"
...@@ -122,97 +69,43 @@ ...@@ -122,97 +69,43 @@
> >
<p :style="[sya, syb]"> <p :style="[sya, syb]">
<a-avatar <a-avatar
:src="record.picture.large" :src="record.application.app_icon"
shape="square" shape="square"
:size="128" :size="128"
/> />
</p> </p>
<p :style="[sya]">Personal</p> <p :style="[sya]">EPK File Info</p>
<a-row> <a-row>
<a-col :span="6"> <a-col :span="6">
<a-description-item <a-description-item
title="Name" title="Buffer Length"
:content="record.name.first + ' ' + record.name.last" :content="record.package_info.buff_length"
/> />
</a-col> </a-col>
<a-col :span="6"> <a-col :span="6">
<a-description-item <a-description-item
title="Account" title="Compress Level"
:content="record.login.username" :content="record.package_info.compress_level"
/> />
</a-col> </a-col>
<a-col :span="6"> <a-col :span="6">
<a-description-item <a-description-item
title="City" title="EPK Size"
:content="record.location.city" :content="record.package_info.epk_filecontent_size"
/>
</a-col>
<a-col :span="6">
<a-description-item
title="Postcode"
:content="record.location.postcode"
/>
</a-col>
</a-row>
<a-row>
<a-col :span="6">
<a-description-item title="Country" :content="record.nat" />
</a-col>
<a-col :span="6">
<a-description-item
title="Birthday"
:content="record.dob.date + ' (' + record.dob.age + ')'"
/>
</a-col>
<a-col :span="12">
<a-description-item
title="Timezone"
:content="record.location.timezone.description"
/> />
</a-col> </a-col>
</a-row>
<a-row>
<a-col :span="12"> </a-col>
<a-col :span="12"> </a-col>
</a-row>
<a-divider />
<p :style="[sya]">Contacts</p>
<a-row>
<a-col :span="6">
<a-description-item title="Email" :content="record.email" />
</a-col>
<a-col :span="6">
<a-description-item title="Cell" :content="record.cell" />
</a-col>
<a-col :span="6">
<a-description-item title="Phone" :content="record.phone" />
</a-col>
<a-col :span="6"> <a-col :span="6">
<a-description-item <a-description-item
title="Coordinates" title="File Count"
:content=" :content="record.package_info.file_count"
record.location.coordinates.latitude +
' ' +
record.location.coordinates.longitude
"
/>
</a-col>
</a-row>
<a-row>
<a-col :span="12">
<a-description-item
title="Registered"
:content="
record.registered.date + ' (' + record.registered.age + ')'
"
/> />
</a-col> </a-col>
</a-row> </a-row>
</template> </template>
<template slot="action" slot-scope="text, record"> <template slot="action" slot-scope="text, record">
<a href="javascript:;">查看</a> <a href="javascript:;" @click="edit(record)">编辑源文件</a>
<a-divider type="vertical" /> <a-divider type="vertical" />
<a href="javascript:;">配置</a> <a href="javascript:;" @click="download(record)">下载EPK</a>
</template> </template>
</a-table> </a-table>
</div> </div>
...@@ -236,44 +129,38 @@ import { ...@@ -236,44 +129,38 @@ import {
Input, Input,
Select, Select,
DatePicker, DatePicker,
message,
} from "ant-design-vue"; } from "ant-design-vue";
import PageHeaderWrapper from "@/components/PageHeaderWrapper"; import PageHeaderWrapper from "@/components/PageHeaderWrapper";
import DescriptionItem from "@/components/DescriptionItem"; import DescriptionItem from "@/components/DescriptionItem";
const columns = [ const columns = [
{ {
title: "用户名", title: "应用名称",
dataIndex: "login", dataIndex: "app_name",
sorter: true, width: "15%",
width: "12%", scopedSlots: { customRender: "pack" },
scopedSlots: { customRender: "login" },
}, },
{ {
title: "姓名", title: "版本号",
dataIndex: "name", dataIndex: "app_version",
sorter: true, sorter: true,
width: "15%",
scopedSlots: { customRender: "name" }, scopedSlots: { customRender: "name" },
}, },
{ {
title: "性别", title: "打包算法",
dataIndex: "gender", dataIndex: "algorithm",
filters: [ filters: [
{ text: "Male", value: "male" }, { text: "zlib", value: "zlib" },
{ text: "Female", value: "female" }, { text: "heatshrink", value: "heatshrink" },
], ],
}, },
{ {
title: "邮箱", title: "打包来源",
dataIndex: "email", dataIndex: "source",
}, filters: [
{ { text: "API", value: 0 },
title: "国籍", { text: "Frontend", value: 1 },
dataIndex: "nat", ],
},
{
title: "Registered",
dataIndex: "registered",
scopedSlots: { customRender: "registered" },
}, },
{ {
title: "Action", title: "Action",
...@@ -281,12 +168,13 @@ const columns = [ ...@@ -281,12 +168,13 @@ const columns = [
scopedSlots: { customRender: "action" }, scopedSlots: { customRender: "action" },
}, },
]; ];
import { mapGetters } from "vuex"; // import { mapGetters } from "vuex";
import { mapTrim, download } from "@/utils/index";
import { getPackageList, getApplicationList } from "@/api/openapi";
export default { export default {
name: "ApplicationManager", name: "ApplicationManager",
data: () => ({ data: () => ({
expandForm: false,
selectedRowKeys: [], selectedRowKeys: [],
columns, columns,
sya: { sya: {
...@@ -299,20 +187,27 @@ export default { ...@@ -299,20 +187,27 @@ export default {
syb: { syb: {
marginBottom: "24px", marginBottom: "24px",
}, },
loading: false,
query: {
app: null,
app_name: null,
app_version: null,
},
appList: [],
post: {
page: 1,
pageSize: 15,
},
tableData: {
list: [],
pagination: {
pageSize: 15,
total: 200,
},
},
}), }),
async asyncData({ store, route }, config = { results: 15 }) {
await store.dispatch("frontend/openapi/getUsers", {
...config,
path: route.path,
});
},
computed: {
...mapGetters({
loading: "frontend/openapi/loading",
users: "frontend/openapi/getUsers",
}),
},
components: { components: {
Icon,
APageHeaderWrapper: PageHeaderWrapper, APageHeaderWrapper: PageHeaderWrapper,
AAvatar: Avatar, AAvatar: Avatar,
ARow: Row, ARow: Row,
...@@ -335,34 +230,72 @@ export default { ...@@ -335,34 +230,72 @@ export default {
ARangePicker: DatePicker.RangePicker, ARangePicker: DatePicker.RangePicker,
}, },
methods: { methods: {
toggleForm() { download(record) {
this.expandForm = !this.expandForm; console.log(record);
download(`${record.app_name}_${record.app_version}.epk`, record.file_path)
.then((res) => {
message.success(res.msg);
})
.catch((err) => {
message.error(err.msg);
});
},
edit(record) {
this.$router.push({ name: "FileManager", params: { directory: record.file_dir } })
},
resetForm() {
this.query = {
app: null,
app_name: null,
app_version: null,
};
this.getPackageList()
},
getPackageList() {
this.loading = true;
let opts = mapTrim(this.query);
opts = Object.assign(opts, this.post);
getPackageList(opts)
.then((res) => {
message.success(res.msg);
if (res.code == 200) {
this.tableData.list = res.data;
this.tableData.pagination.pageSize = res.pageSize;
this.tableData.pagination.total = res.total;
}
})
.catch((err) => {
message.error(err.msg);
})
.finally(() => {
this.loading = false;
});
},
getApplicationList() {
getApplicationList({ scope: "list" })
.then((res) => {
message.success(res.msg);
this.appList = res.data;
})
.catch((err) => {
message.error(err.msg);
});
}, },
onSelectChange(selectedRowKeys) { onSelectChange(selectedRowKeys) {
window.console.log("selectedRowKeys changed: ", selectedRowKeys); window.console.log("selectedRowKeys changed: ", selectedRowKeys);
this.selectedRowKeys = selectedRowKeys; this.selectedRowKeys = selectedRowKeys;
}, },
handleTableChange(pagination, filters, sorter) { handleTableChange(pagination, filters, sorter) {
const pager = { ...this.users.pagination }; console.log(pagination, filters, sorter);
pager.current = pagination.current; this.post.page = pagination.current;
this.users.pagination = pager; this.post.pageSize = pagination.pageSize;
this.$options.asyncData( this.getPackageList();
{ store: this.$store, route: this.$route },
{
results: pagination.pageSize,
page: pagination.current,
sortField: sorter.field,
sortOrder: sorter.order,
...filters,
}
);
}, },
}, },
mounted() { created() {
this.$options.asyncData( this.getApplicationList();
{ store: this.$store, route: this.$route }, this.getPackageList();
{ results: 15 }
);
}, },
}; };
</script> </script>
......
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
</template> </template>
<script> <script>
/* eslint-disable import/no-duplicates, no-param-reassign */
import { mapState } from "vuex"; import { mapState } from "vuex";
// Axios // Axios
import request from "@/utils/axios"; import request from "@/utils/axios";
...@@ -85,6 +84,8 @@ export default { ...@@ -85,6 +84,8 @@ export default {
}; };
}, },
created() { created() {
console.log(this.$route.params)
// manual settings // manual settings
this.$store.commit("fm/settings/manualSettings", this.settings); this.$store.commit("fm/settings/manualSettings", this.settings);
......
import HTTP from '@/utils/get'; import HTTP from '@/api/get';
/** /**
* Context menu actions * Context menu actions
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
</template> </template>
<script> <script>
import GET from '@/utils/get'; import GET from '@/api/get';
export default { export default {
name: 'Thumbnail', name: 'Thumbnail',
......
...@@ -60,7 +60,7 @@ import CropperModule from "../additions/Cropper.vue"; ...@@ -60,7 +60,7 @@ import CropperModule from "../additions/Cropper.vue";
import modal from "../mixins/modal"; import modal from "../mixins/modal";
import translate from "@/utils/translate"; import translate from "@/utils/translate";
import helper from "@/utils/helper"; import helper from "@/utils/helper";
import GET from "@/utils/get"; import GET from "@/api/get";
export default { export default {
name: "Preview", name: "Preview",
......
import store from '@/store/file-manager';
import FileManager from './FileManager.vue';
/**
* Install
*
* @param Vue
* @param options
*/
export default function install(Vue, options = {}) {
if (!options.store) window.console.error('Please provide a store!!');
Vue.component('file-manager', FileManager);
options.store.registerModule('fm', store);
}
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