ks3-js-sdk
Version:
js sdk for ks3
471 lines (451 loc) • 18.5 kB
JavaScript
import { apiMenu, apiList } from '../utils/utils.js';
import KS3 from 'ks3-js-sdk';
import { Button, Input, Menu, MenuItem, Form, FormItem, Tooltip, Tab, Tabs, Table, TableColumn, Dialog, Icon, Upload, Pagination, Switch as KSwitch, Progress, Spin, Message } from '@king-design/vue-legacy'
export default {
name: 'Layout',
components: { Button, Input, Menu, MenuItem, Form, FormItem, Tooltip, Tab, Tabs, Table, TableColumn, Dialog, Icon, Upload, Pagination, KSwitch, Progress, Spin },
data() {
return {
ks3: '', // ks3实例化对象
searchApi: '', // 搜索框中的内容
selectedApiName: '', // 选中的api名称
selectedApi: {}, // 选择api的全部信息
result: {}, // api调用结果
must: false, // 只显示必填参数
rightTab: 'result', // 右侧tab栏的值
config: {}, // 初始配置
configForm: {}, // 配置表单
apiList: [], // api列表
apiMenu: [], // 左侧api菜单
recordList: [], // api调用历史记录
recordPageList: [], // api调用历史记录
fileList: [], // 上传的文件列表
resultInfo: {}, // 响应结果信息
responseTab: 'headers', // 响应的tab栏
currentPage: 1, // 当前展示分页
limitPage: 10, // 每页的数据条数
percent: 0, // 上传或下载进度
resultState: 'noResult', // 调用状态
showConfigDialog: false, // 是否展示全局弹窗
timer: null, // 进度条定时器
xhr: null, // 正在执行的xhr实例
abortMulti: {} // 取消分块上传的信息
}
},
mounted() {
// 优先使用localStorage中的数据
if (localStorage.getItem('config')) {
this.config = JSON.parse(localStorage.getItem('config'));
this.ks3 = new KS3(this.config);
} else {
// 如果没有则尝试读取默认配置
this.ks3 = new KS3();
let { bucket, region, AK, SK, securityToken } = this.ks3.config;
this.config = {
bucket, region, AK, SK, securityToken
}
}
//初始化数据
this.apiList = apiList;
this.apiMenu = apiMenu;
this.selectedApiName = 'listObjects';
this.configForm = { ...this.config };
this.selectedApi = this.apiList[0];
this.resultInfo = {
resultFlag: true, // 调试结果成功或者失败的标志位
apiRunStart: 0, // api执行的开始时间
apiRunEnd: 0, // api执行的结束时间
apiRunTime: 0, // api执行耗时
resultCode: '无' // 响应码
};
this.abortMulti = {
uploadId: '',
state: 'noTask',
key: ''
}
},
watch: {
// 选中的api名称
selectedApiName(newValue, oldValue) {
// 改变调用状态
this.resultState = 'noResult';
// 清空表单
this.resetParamsForm();
// 如果有请求在执行,则取消
if (this.xhr) {
this.xhr.abort();
this.xhr = null;
Message.warning('调用已取消!', 1000);
}
if (oldValue === 'uploadMultiPart' && this.abortMulti.state === 'running' && this.abortMulti.uploadId) {
this.ks3.abortMultipartUpload({
key: this.abortMulti.key,
uploadId: this.abortMulti.uploadId
}).then(res => {
this.abortMulti.state = 'cancel';
console.log(res)
})
Message.warning('调用已取消!', 1000);
}
this.apiList.forEach(item => {
if (item.name === newValue) {
this.selectedApi = item;
this.result = {};
return;
}
});
},
// 右侧的tab栏的名称
rightTab(newValue) {
if (newValue === 'config') {
this.configForm = { ...this.config };
}
}
},
computed: {
// 展示的api列表
showApiList() {
let list = [];
this.apiMenu.forEach(item => {
let arr = item.list.filter(api => api.indexOf(this.searchApi) !== -1);
list.push({
type: item.type,
list: arr
})
})
return list;
},
// 是否有需要填写的参数
needParams() {
let paramsNum = [];
if (this.selectedApi.params) {
paramsNum = this.selectedApi.params.filter(item => {
return (this.must ? item.required : true) && item.show;
})
}
return paramsNum.length > 0;
},
// 响应头
responseHeaders() {
let headers = JSON.stringify(this.result.headers, null, 2);
return headers ? headers : '{}';
},
// 响应体
responseBody() {
let body = JSON.stringify(this.result.body, null, 2);
return body ? body : '{}';
},
// 错误信息
responseError() {
let error = JSON.stringify(this.result.error, null, 2);
return error ? error : '{}';
},
// 返回的url
responseUrl() {
if (this.selectedApiName === 'getObjectUrl') {
// 执行了getObjectUrl
return this.result;
} else if (this.selectedApiName === 'putObjectByPresignedUrl') {
// 执行了putObjectByPresignedUrl
return this.result;
}
}
},
methods: {
// 输出结果
logResult(res) {
// 改变调用状态
this.resultState = 'result';
// 切换tab栏
this.responseTab = 'headers';
// 判断调用成功或失败
if (res.error) {
this.resultInfo.resultFlag = 'fail';
} else {
if (this.selectedApiName === 'getObjectUrl' || this.selectedApiName === 'putObjectByPresignedUrl') {
this.resultInfo.resultFlag = 'url';
this.responseTab = 'url';
} else {
this.resultInfo.resultFlag = 'success';
}
}
console.log('res', res);
// xhr 置空
this.xhr = null;
// 计时结束
this.resultInfo.apiRunEnd = Date.now();
// 计算api执行耗时
this.resultInfo.apiRunTime = this.resultInfo.apiRunEnd - this.resultInfo.apiRunStart;
// 判断调用是否成功
if (res.statusCode !== null && res.statusCode !== undefined) {
this.resultInfo.resultCode = res.statusCode;
}
// 添加一条记录
this.recordList.unshift({
time: this.getDay(),
name: this.selectedApi.name,
code: res.statusCode || '无',
message: res.statusMessage || '无'
});
// 结果赋值
this.result = res;
this.recordPageList = this.recordList.slice((this.currentPage - 1) * this.limitPage, this.currentPage * this.limitPage);
},
// 保存全局配置
async submitConfig() {
if (await this.$refs.configForm.validate()) {
this.config = { ... this.configForm };
console.log('config:', this.config);
// 存储在本地
localStorage.setItem('config', JSON.stringify(this.config));
// 关闭弹窗
this.$refs.configDialog.close();
this.ks3 = new KS3(this.config);
Message.success('修改配置成功!', 1000);
}
},
// 调用api
async runApi() {
if (await this.$refs.paramsForm.validate()) {
if (await this.$refs.configForm.validate()) {
// 正在上传
if (this.resultState === 'uploading') {
Message.warning('文件正在上传中,请不要重复调用!', 1000);
return;
}
// 正在执行
if (this.resultState === 'loading') {
Message.warning('正在执行中,请稍后!', 1000);
return;
}
// 计时开始
this.resultInfo.apiRunStart = Date.now();
// 进度清零
this.percent = 0;
// 判断加载的动画
if (this.selectedApiName === 'putObject' || this.selectedApiName === 'uploadMultiPart') {
this.resultState = 'uploading';
} else {
this.resultState = 'loading';
}
// 调用对应的方法
this.xhr = this[this.selectedApiName]();
// 显示结果
this.rightTab = 'result';
} else {
this.$refs.configDialog.show();
}
}
},
// 取消调用
abortApi() {
// 取消调用
if (this.xhr) {
this.xhr.abort();
this.xhr = null;
Message.success('调用已取消!', 1000);
}
if (this.selectedApiName === 'uploadMultiPart' && this.abortMulti.state === 'running' && this.abortMulti.uploadId) {
this.ks3.abortMultipartUpload({
key: this.abortMulti.key,
uploadId: this.abortMulti.uploadId
}, (err, data) => {
this.abortMulti.state = 'cancel';
console.log(err, data);
})
Message.success('调用已取消!', 1000);
}
// 改变tab栏
this.resultState = 'noResult'
},
// 清空表单
resetParamsForm() {
for (let key in this.selectedApi.paramsForm) {
this.selectedApi.paramsForm[key] = '';
}
this.$refs.paramsForm.reset();
this.fileList.pop();
},
// 上传之前
beforeUpload(file, files) {
if (files.length > 0) {
this.fileList.pop()
}
this.fileList.push(file);
this.selectedApi.paramsForm.file = file.raw;
this.selectedApi.paramsForm.key = this.selectedApi.paramsForm.file.name;
return false;
},
// 删除文件之前
beforeRemove() {
this.fileList.pop();
this.selectedApi.paramsForm.file = '';
},
// 改变历史记录表格页码
changePage(obj) {
this.currentPage = obj.value;
this.limitPage = obj.limit;
this.recordPageList = this.recordList.slice((this.currentPage - 1) * this.limitPage, this.currentPage * this.limitPage);
},
// 获取当前时间
getDay() {
let date = new Date();
// yyyy-MM-dd hh:mm:ss
let Y = date.getFullYear() + '-';
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
let D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + ' ';
let h = date.getHours() < 10 ? '0' + date.getHours() + ':' : date.getHours() + ':';
let m = date.getMinutes() < 10 ? '0' + date.getMinutes() + ':' : date.getMinutes() + ':';
let s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
return Y + M + D + ' ' + h + m + s;
},
// 获取对象列表
listObjects() {
return this.ks3.listObjects(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
});
},
// 获取对象信息
headObject() {
return this.ks3.headObject(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 获取对象
getObject() {
return this.ks3.getObject(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 获取对象的Url
getObjectUrl() {
this.ks3.getObjectUrl(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 生成上传外链上传
putObjectByPresignedUrl() {
this.ks3.putObjectByPresignedUrl(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 删除指定对象
delObject() {
return this.ks3.delObject(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 添加对象
putObject() {
this.selectedApi.paramsForm.progress = (e) => {
this.percent = Number.parseInt(e.percent * 100);
}
return this.ks3.putObject(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 获取对象的ACL
getObjectAcl() {
return this.ks3.getObjectAcl(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 设置对象的ACL
putObjectAcl() {
return this.ks3.putObjectAcl(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// post上传对象
postObject() {
let formData = new FormData();
formData.append('key', this.selectedApi.paramsForm.key);
formData.append('file', this.selectedApi.paramsForm.file);
let policy = {
expiration: new Date(Date.now() + 900 * 1000).toISOString(),
conditions: [
["eq", "$bucket", this.selectedApi.paramsForm.bucket || this.ks3.config.bucket],
['eq', '$key', this.selectedApi.paramsForm.key]
]
}
if(this.selectedApi.paramsForm.acl) {
formData.append('acl', this.selectedApi.paramsForm.acl);
policy.conditions.push(['eq', '$acl', this.selectedApi.paramsForm.acl])
}
formData.append('policy', JSON.stringify(policy));
return this.ks3.postObject({
formData
}).then(res => {
this.logResult(res);
})
},
// 分块上传
uploadMultiPart() {
// 设置状态为进行中
this.abortMulti.state = 'running';
this.abortMulti.key = this.selectedApi.paramsForm.key;
this.selectedApi.paramsForm.progress = (e) => {
this.percent = Number.parseInt(e.percent * 100);
this.abortMulti.uploadId = e.uploadId;
}
return this.ks3.uploadMultiPart(this.selectedApi.paramsForm, (res) => {
// 如果任务没有被取消,则输出结果
if (this.abortMulti.state !== 'cancel') {
this.logResult(res);
}
// 改变状态为无任务
this.abortMulti.state = 'noTask';
// 置空uploadId
this.abortMulti.uploadId = '';
})
},
// 查看已上传的分块
listParts() {
return this.ks3.listParts(this.selectedApi.paramsForm).then( res => {
this.logResult(res);
})
},
// 取消已上传块
abortMultipartUpload() {
return this.ks3.abortMultipartUpload(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 查询正在进行的分块上传
listMultipartUploads() {
return this.ks3.listMultipartUploads(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 查询object下的正在上传的分块
getObjectPartUploads() {
return this.ks3.getObjectPartUploads(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 分块复制文件
uploadPartCopy() {
return this.ks3.uploadPartCopy(this.selectedApi.paramsForm,(res) => {
this.logResult(res);
})
},
// 复制小文件
putObjectCopy() {
return this.ks3.putObjectCopy(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 解冻指定对象
restoreObject() {
return this.ks3.restoreObject(this.selectedApi.paramsForm).then(res => {
this.logResult(res);
})
},
// 修改对象的存储类型
modifyStorageClass() {
return this.ks3.modifyStorageClass(this.selectedApi.paramsForm,).then(res => {
this.logResult(res);
})
},
}
}