Commit fc865dd0 authored by wanli's avatar wanli

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

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