Commit aa44f802 authored by zhangtong5@yidian-inc.com's avatar zhangtong5@yidian-inc.com

update:参数优化

parents 9ce14e21 607f50b0
const Koa = require('koa'); const Koa = require('koa');
const views = require('koa-views'); const views = require('koa-views');
const serve = require('koa-static'); const serve = require('koa-static');
const koaBody = require('koa-body');
const bodyParser = require('koa-bodyparser'); const bodyParser = require('koa-bodyparser');
const path = require('path'); const path = require('path');
const router = require('./server/router'); const router = require('./server/router');
...@@ -12,6 +13,7 @@ const app = new Koa(); ...@@ -12,6 +13,7 @@ const app = new Koa();
app.use(serve(path.join(__dirname, './public'))); app.use(serve(path.join(__dirname, './public')));
app.use(bodyParser()); app.use(bodyParser());
// app.use(koaBody({multipart: true}));
app.use(router.routes(), router.allowedMethods()); app.use(router.routes(), router.allowedMethods());
app.listen(config.port, () => { app.listen(config.port, () => {
......
(function KS3JsSDK (win) {
var ks3FileUploader = function(ks3PostOptions, pluploadOptions){
this.defaultKS3Options = {
KSSAccessKeyId: "",
policy: "", //请求中用于描述获准行为的安全策略。没有安全策略的请求被认为是匿名请求,只能访问公共可写空间。
signature: "", //根据Access Key Secret和policy计算的签名信息,KS3验证该签名信息从而验证该Post请求的合法性。
bucket_name: "", //上传的空间名
key: "", //被上传键值的名称。如果用户想要使用文件名作为键值,可以使用${filename} 变量。例如:如果用户想要上传文件local.jpg,需要指明specify /user/betty/${filename},那么键值就会为/user/betty/local.jpg。
acl: "private", //上传文件访问权限,有效值: private | public-read
uploadDomain: "", //上传域名,http://destination-bucket.kss.ksyun.com 或者 http://kssws.ks-cdn.com/destination-bucket
autoStart: false, //是否在文件添加完毕后自动上传
onInitCallBack: function(){}, //上传初始化时调用的回调函数
onErrorCallBack: function(){}, //发生错误时调用的回调函数
onFilesAddedCallBack: function(){}, //文件添加到浏览器时调用的回调函数
onBeforeUploadCallBack: function(){}, //文件上传之前时调用的回调函数
onStartUploadFileCallBack: function(){}, //文件开始上传时调用的回调函数
onUploadProgressCallBack: function(){}, //上传进度时调用的回调函数
onFileUploadedCallBack: function(){}, //文件上传完成时调用的回调函数
onUploadCompleteCallBack: function(){} //所有上传完成时调用的回调函数
};
if (ks3PostOptions){
//用ks3PostOptions覆盖 defaultKS3Options
plupload.extend(this.defaultKS3Options, ks3PostOptions);
}
var multipartParams = {};
if (this.defaultKS3Options.signature&&this.defaultKS3Options.policy){
multipartParams = {
"key": this.defaultKS3Options.key,
"acl": this.defaultKS3Options.acl,
"signature" : this.defaultKS3Options.signature,
"KSSAccessKeyId": this.defaultKS3Options.KSSAccessKeyId,
"policy": this.defaultKS3Options.policy
,'Cache-Control':this.defaultKS3Options['Cache-Control']
,'Expires': this.defaultKS3Options['Expires']
,'Content-Disposition': this.defaultKS3Options['Content-Disposition']
,'Content-Encoding': this.defaultKS3Options['Content-Encoding']
,'Content-Type': this.defaultKS3Options['Content-Type']
,'Content-Encoding': this.defaultKS3Options['Content-Encoding']
}
} else {
multipartParams = {
"key": this.defaultKS3Options.key,
"acl": this.defaultKS3Options.acl,
"KSSAccessKeyId": this.defaultKS3Options.KSSAccessKeyId
}
}
for(var prop in this.defaultKS3Options) {
if(typeof this.defaultKS3Options[prop] == 'string' && prop.indexOf('x-kss-meta-') !== -1 || prop == "x-kss-newfilename-in-body") {
multipartParams[prop] = this.defaultKS3Options[prop];
}
}
this.defaultPluploadOptions = {
runtimes : 'html5,flash,silverlight,html4', //上传模式,依次退化;
url: this.defaultKS3Options.uploadDomain,
browse_button: 'browse', //触发对话框的DOM元素自身或者其ID
flash_swf_url : 'js/Moxie.swf', //Flash组件的相对路径
silverlight_xap_url : 'js/Moxie.xap', //Silverlight组件的相对路径;
drop_element: undefined, //触发拖动上传的元素或者其ID
multipart: true,
multipart_params: multipartParams
};
if (pluploadOptions){
plupload.extend(this.defaultPluploadOptions, pluploadOptions);
}
this.uploader = new plupload.Uploader(this.defaultPluploadOptions);
this.uploader.bind("Init", this.onInit, this);
this.uploader.bind("Error", this.onUploadError, this);
this.uploader.init();
this.uploader.bind("FilesAdded", this.onFilesAdded, this)
this.uploader.bind("BeforeUpload", this.onBeforeUpload, this)
this.uploader.bind("UploadFile", this.onStartUploadFile, this)
this.uploader.bind("UploadProgress", this.onUploadProgress, this)
this.uploader.bind("FileUploaded", this.onFileUploaded, this)
};
ks3FileUploader.prototype.onInit = function(uploader, obj){
this.defaultKS3Options.onInitCallBack&&
this.defaultKS3Options.onInitCallBack.apply(this, [uploader, obj]);
};
ks3FileUploader.prototype.onUploadError = function(uploader, obj) {
this.defaultKS3Options.onErrorCallBack&&
this.defaultKS3Options.onErrorCallBack.apply(this, [uploader, obj]);
};
ks3FileUploader.prototype.onFilesAdded = function(uploader, obj) {
if (this.defaultKS3Options.autoStart)
this.uploader.start();
this.defaultKS3Options.onFilesAddedCallBack&&
this.defaultKS3Options.onFilesAddedCallBack.apply(this, [uploader, obj]);
};
ks3FileUploader.prototype.onBeforeUpload = function(uploader, obj) {
this.defaultKS3Options.onBeforeUploadCallBack&&
this.defaultKS3Options.onBeforeUploadCallBack.apply(this, [uploader, obj]);
};
ks3FileUploader.prototype.onStartUploadFile = function(uploader, obj) {
this.defaultKS3Options.onStartUploadFileCallBack&&
this.defaultKS3Options.onStartUploadFileCallBack.apply(this, [uploader, obj]);
};
ks3FileUploader.prototype.onUploadProgress = function(uploader, obj) {
this.defaultKS3Options.onUploadProgressCallBack&&
this.defaultKS3Options.onUploadProgressCallBack.apply(this, [uploader, obj]);
};
ks3FileUploader.prototype.onFileUploaded = function(uploader, obj, resObj) {
this.defaultKS3Options.onFileUploadedCallBack&&
this.defaultKS3Options.onFileUploadedCallBack.apply(this, [uploader, obj, resObj]);
};
ks3FileUploader.prototype.onUploadComplete = function(uploader, obj) {
this.defaultKS3Options.onUploadCompleteCallBack&&
this.defaultKS3Options.onUploadCompleteCallBack.apply(this, [uploader, obj]);
};
return win.ks3FileUploader = ks3FileUploader;
})(window);
//create namespace
var Ks3 = {};
/**
* 给url添加请求参数
* @param url
* @param obj
* @returns {string} 带请求参数的url
*/
Ks3.addURLParam = function(url, obj) {
url += url.indexOf("?") == -1 ? "?" : "";
var ret = [];
for(var key in obj){
key = encodeURIComponent(key);
var value = obj[key];
if(value && Object.prototype.toString.call(value) == '[object String]'){
ret.push(key + '=' + encodeURIComponent(value));
}
}
return url + ret.join('&');
}
/**
* Changes XML DOM to JSON (xml 不带属性)
* @param xml
* @returns {{}} js对象
*/
Ks3.xmlToJson = function (xml) {
// Create the return object
var obj = {};
if (xml.nodeType == Node.TEXT_NODE) { // text
obj = xml.nodeValue;
}
// do children
if (xml.hasChildNodes()) {
for(var i = 0; i < xml.childNodes.length; i++) {
var item = xml.childNodes.item(i);
var nodeName = item.nodeName;
if (typeof(obj[nodeName]) == "undefined") {
if( nodeName === '#text'){
obj = item.nodeValue;
}else{
obj[nodeName] = Ks3.xmlToJson(item);
}
} else {//同级同标签转化为数组
if (typeof(obj[nodeName].length) == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(Ks3.xmlToJson(item));
}
}
}
return obj;
};
/*基于Javascript的Base64加解密算法*/
Ks3.Base64 = {
encTable :[ /*Base64编码表*/
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O' ,'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', '+', '/'
],
decTable:[ /*Base64解码表*/
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 62, -1, -1, -1, 63, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, -1, -1,
-1, -1, -1, -1, -1, 00, 01, 02, 03, 04,
05, 06, 07, 08, 09, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, -1, -1, -1, -1, -1, -1, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, -1, -1, -1, -1, -1
],
encUTF8: function(str) { /*将任意字符串按UTF8编码*/
var code, res =[], len =str.length;
var byte1, byte2, byte3, byte4, byte5, byte6;
for (var i = 0; i < len; i++) {
//Unicode码:按范围确定字节数
code = str.charCodeAt(i);
//单字节ascii字符:U+00000000 – U+0000007F 0xxxxxxx
if (code > 0x0000 && code <= 0x007F) res.push(code);
//双字节字符:U+00000080 – U+000007FF 110xxxxx 10xxxxxx
else if (code >= 0x0080 && code <= 0x07FF) {
byte1 = 0xC0 | ((code >> 6) & 0x1F);
byte2 = 0x80 | (code & 0x3F);
res.push(byte1, byte2);
}
//三字节字符:U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
else if (code >= 0x0800 && code <= 0xFFFF) {
byte1 = 0xE0 | ((code >> 12) & 0x0F);
byte2 = 0x80 | ((code >> 6) & 0x3F);
byte3 = 0x80 | (code & 0x3F);
res.push(byte1, byte2, byte3);
}
//四字节字符:U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
else if (code >= 0x00010000 && code <= 0x001FFFFF) {
byte1 =0xF0 | ((code>>18) & 0x07);
byte2 =0x80 | ((code>>12) & 0x3F);
byte3 =0x80 | ((code>>6) & 0x3F);
byte4 =0x80 | (code & 0x3F);
res.push(byte1, byte2, byte3, byte4);
}
//五字节字符:U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
else if (code >= 0x00200000 && code <= 0x03FFFFFF) {
byte1 =0xF0 | ((code>>24) & 0x03);
byte2 =0xF0 | ((code>>18) & 0x3F);
byte3 =0x80 | ((code>>12) & 0x3F);
byte4 =0x80 | ((code>>6) & 0x3F);
byte5 =0x80 | (code & 0x3F);
res.push(byte1, byte2, byte3, byte4, byte5);
}
//六字节字符:U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
else if (code >= 0x04000000 && code <= 0x7FFFFFFF) {
byte1 =0xF0 | ((code>>30) & 0x01);
byte2 =0xF0 | ((code>>24) & 0x3F);
byte3 =0xF0 | ((code>>18) & 0x3F);
byte4 =0x80 | ((code>>12) & 0x3F);
byte5 =0x80 | ((code>>6) & 0x3F);
byte6 =0x80 | (code & 0x3F);
res.push(byte1, byte2, byte3, byte4, byte5, byte6);
}
}
return res;
},
encode: function(str) {
/**
* 将任意字符串用Base64加密
* str:要加密的字符串
* utf8编码格式
*/
if (!str) return '';
var bytes = this.encUTF8(str);
var i = 0, len = bytes.length, res = [];
var c1, c2, c3;
while (i < len) {
c1 = bytes[i++] & 0xFF;
res.push(this.encTable[c1 >> 2]);
//结尾剩一个字节补2个=
if (i == len) {
res.push(this.encTable[(c1 & 0x03) << 4], '==');
break;
}
c2 = bytes[i++];
//结尾剩两个字节补1个=
if (i == len) {
res.push(this.encTable[((c1 & 0x03) << 4) | ((c2 >> 4) & 0x0F)]);
res.push(this.encTable[(c2 & 0x0F) << 2], '=');
break;
}
c3 = bytes[i++];
res.push(this.encTable[((c1 & 0x3) << 4) | ((c2 >> 4) & 0x0F)]);
res.push(this.encTable[((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6)]);
res.push(this.encTable[c3 & 0x3F]);
}
return res.join('');
}
};
Ks3.chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
Ks3.b64pad = "="; /* base-64 pad character. "=" for strict RFC compliance */
/*
* //使用hmac_sha1算法计算字符串的签名
* return base-64 encoded strings
*/
Ks3.b64_hmac_sha1 = function(key, data) {
return Ks3.binb2b64(Ks3.core_hmac_sha1(key, data));
}
/*
* Calculate the HMAC-SHA1 of a key and some data
*/
Ks3.core_hmac_sha1 = function(key, data)
{
var bkey = Ks3.str2binb(key);
if(bkey.length > 16) bkey = Ks3.core_sha1(bkey, key.length * Ks3.chrsz);
var ipad = Array(16), opad = Array(16);
for(var i = 0; i < 16; i++)
{
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5C5C5C5C;
}
var hash = Ks3.core_sha1(ipad.concat(Ks3.str2binb(data)), 512 + data.length * Ks3.chrsz);
return Ks3.core_sha1(opad.concat(hash), 512 + 160);
}
/*
* Convert an array of big-endian words to a base-64 string
*/
Ks3.binb2b64 = function(binarray)
{
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var str = "";
for(var i = 0; i < binarray.length * 4; i += 3)
{
var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16)
| (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
| ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
for(var j = 0; j < 4; j++)
{
if(i * 8 + j * 6 > binarray.length * 32) str += Ks3.b64pad;
else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
}
}
return str;
}
/*
* Convert an 8-bit or 16-bit string to an array of big-endian words
* In 8-bit function, characters >255 have their hi-byte silently ignored.
*/
Ks3.str2binb = function(str)
{
var bin = Array();
var mask = (1 << Ks3.chrsz) - 1;
for(var i = 0; i < str.length * Ks3.chrsz; i += Ks3.chrsz)
bin[i>>5] |= (str.charCodeAt(i / Ks3.chrsz) & mask) << (32 - Ks3.chrsz - i%32);
return bin;
}
/*
* Calculate the SHA-1 of an array of big-endian words, and a bit length
*/
Ks3.core_sha1 = function(x, len)
{
/* append padding */
x[len >> 5] |= 0x80 << (24 - len % 32);
x[((len + 64 >> 9) << 4) + 15] = len;
var w = Array(80);
var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;
var e = -1009589776;
for(var i = 0; i < x.length; i += 16)
{
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
var olde = e;
for(var j = 0; j < 80; j++)
{
if(j < 16) w[j] = x[i + j];
else w[j] = Ks3.rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
var t = Ks3.safe_add(Ks3.safe_add(Ks3.rol(a, 5), Ks3.sha1_ft(j, b, c, d)),
Ks3.safe_add(Ks3.safe_add(e, w[j]), Ks3.sha1_kt(j)));
e = d;
d = c;
c = Ks3.rol(b, 30);
b = a;
a = t;
}
a = Ks3.safe_add(a, olda);
b = Ks3.safe_add(b, oldb);
c = Ks3.safe_add(c, oldc);
d = Ks3.safe_add(d, oldd);
e = Ks3.safe_add(e, olde);
}
return Array(a, b, c, d, e);
}
/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
Ks3.safe_add =function(x, y)
{
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
/*
* Bitwise rotate a 32-bit number to the left.
*/
Ks3.rol = function(num, cnt)
{
return (num << cnt) | (num >>> (32 - cnt));
}
/*
* Perform the appropriate triplet combination function for the current
* iteration
*/
Ks3.sha1_ft = function(t, b, c, d)
{
if(t < 20) return (b & c) | ((~b) & d);
if(t < 40) return b ^ c ^ d;
if(t < 60) return (b & c) | (b & d) | (c & d);
return b ^ c ^ d;
}
/*
* Determine the appropriate additive constant for the current iteration
*/
Ks3.sha1_kt = function(t)
{
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
(t < 60) ? -1894007588 : -899497514;
}
/**
* 产生headers
* CanonicalizedKssHeaders
*/
Ks3.generateHeaders =function(header) {
var str = '';
var arr = [];
if(header){
var prefix = 'x-kss';
for(var it in header){
// step1 : 所有`x-kss`的属性都转换为小写
if(it.indexOf(prefix) == 0){
arr.push((it.toLowerCase() +':'+header[it]));
}
}
// step2 : 根据属性名排序
arr.sort();
// step3 : 拼接起来
str = arr.join('\n');
}
return str;
}
/**
* 根据SK和请求生成Signature(用于Authorization头部)
* @param sk secrete key
* @param bucket bucket name
* @param resource ObjectKey[?subResource]
* @param http_verb PUT/GET/POST/DELETE
* @param content_type Content-Type request header
* @param headers headers of request
* @returns {*}
*/
Ks3.generateToken = function (sk, bucket, resource, http_verb, content_type, headers, time_stamp){
// Content-MD5, Content-Type, CanonicalizedKssHeaders都为空
var canonicalized_Kss_Headers = Ks3.generateHeaders(headers);
var canonicalized_Resource = '/' + bucket + '/' + resource;
if (canonicalized_Kss_Headers !== '') {
var string2Sign = http_verb + '\n' + '' + '\n' + content_type + '\n' + time_stamp + '\n' + canonicalized_Kss_Headers + '\n' + canonicalized_Resource;
} else {
var string2Sign = http_verb + '\n' + '' + '\n' + content_type + '\n' + time_stamp + '\n' + canonicalized_Resource;
}
//console.log('string2Sign:' + string2Sign);
var signature = Ks3.b64_hmac_sha1(sk, string2Sign);
//console.log('signature:' + signature);
return signature;
}
/**
* 获取过期时间戳
* @param seconds 多少秒后过期
*/
function getExpires(seconds) {
return Math.round(new Date().getTime()/1000) + seconds;
};
/*
* url endpoints for different regions
*/
Ks3.ENDPOINT = {
HANGZHOU : 'kss.ksyun.com',
AMERICA: 'ks3-us-west-1.ksyun.com',
BEIJING : 'ks3-cn-beijing.ksyun.com',
HONGKONG: 'ks3-cn-hk-1.ksyun.com',
SHANGHAI: 'ks3-cn-shanghai.ksyun.com'
};
Ks3.config = {
AK: '',
SK: '',
protocol:'http',
baseUrl:'',
region: '',
bucket: '',
prefix:'kss',
// 分块上传的最小单位
chunkSize:5*1024*1024,
// 分块上传重试次数
retries:20,
currentUploadId: '',
stopFlag: false // for multipart upload
}
/**
* Get Bucket( List Object) 获取bucket下的objects
* @param bucket : bucket name
* @param url : 如:http://kss.ksyun.com/
* @param cb : callback function
*
* @param {object} params
* {
* Bucket: '', // 非必传
* delimiter: '', //分隔符,用于对一组参数进行分割的字符。
* 'encoding-type': '', //指明请求KS3与KS3响应使用的编码方式。
* maker: '', //指定列举指定空间中对象的起始位置。KS3按照字母排序方式返回结果,将从给定的 marker 开始返回列表。如果相应内容中IsTruncated为true,则可以使用返回的Contents中的最后一个key作为下次list的marker参数
* 'max-keys': 0, //设置响应体中返回的最大记录数(最后实际返回可能小于该值)。默认为1000。如果你想要的结果在1000条以后,你可以设定 marker 的值来调整起始位置。
* prefix: '', //限定响应结果列表使用的前缀
* Signature: '' not required, 请求签名,从服务端获取
* }
*/
Ks3.listObject = function(params, cb) {
var xhr = new XMLHttpRequest();
var listObjectParams = {
delimiter: params['delimiter'],
'encoding-type': params['encoding-type'],
marker: params['marker'],
'max-keys': params['max-keys'],
prefix: params['prefix']
};
var bucketName = params.Bucket || Ks3.config.bucket;
var region = params.region || Ks3.config.region;
if (region ) {
Ks3.config.baseUrl = Ks3.ENDPOINT[region];
}
var url = Ks3.config.protocol + '://' + Ks3.config.baseUrl + '/' + bucketName; //元数据获取不要走cdn
url = Ks3.addURLParam(url, listObjectParams);
xhr.overrideMimeType('text/xml'); //兼容火狐
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
//xml转为json格式方便js读取
cb(Ks3.xmlToJson(xhr.responseXML));
} else {
alert('Request was unsuccessful: ' + xhr.status);
console.log('status: ' + xhr.status);
}
}
};
//在金山云存储控制台(ks3.ksyun.com)中的”空间设置"页面需要设置对应空间(bucket)的CORS配置,允许请求来源(Allow Origin: * )和请求头(Allow Header: * )的GET请求,否则浏览器会报跨域错误
xhr.open('GET', url, true);
var signature = params.Signature || Ks3.generateToken(Ks3.config.SK, bucketName, '', 'GET', '' ,'', '');
xhr.setRequestHeader('Authorization','KSS ' + Ks3.config.AK + ':' + signature );
xhr.send(null);
}
/**
* Delete Object
* @param {object} params
* {
* Bucket: '' not required, bucket name
* Key : '' Required , object key
* region : '' not required bucket所在region
* Signature: '' not required, 请求签名,从服务端获取
* }
* @param cb : callback function
*/
Ks3.delObject = function(params, cb) {
var bucketName = params.Bucket || Ks3.config.bucket;
var key = Ks3.encodeKey(params.Key);
var region = params.region || Ks3.config.region;
if (region ) {
Ks3.config.baseUrl = Ks3.ENDPOINT[region];
}
var url = Ks3.config.protocol + '://' + Ks3.config.baseUrl + '/' + bucketName + '/' + key;
var signature = params.Signature || Ks3.generateToken(Ks3.config.SK, bucketName, key, 'DELETE', '' ,'', '');
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
cb(xhr.status);
}else {
alert('Request was unsuccessful: ' + xhr.status);
console.log('status: ' + xhr.status);
}
}
};
xhr.open("DELETE", url, true);
xhr.setRequestHeader('Authorization','KSS ' + Ks3.config.AK + ':' + signature );
xhr.send(null);
};
/**
* key 进行encodeURIComponent编码,'/'不能被编码
*/
Ks3.encodeKey = function (key) {
if(key == null) {
return '';
}
var newKey = encodeURIComponent(key);
newKey = newKey.replace(/\+/g,'%20').replace(/\*/g,'%2A').replace(/%7E/g,'~').replace(/%2F/g, '/');
return newKey;
}
/**
* 获取指定object的元数据
* params {
* Bucket: '' not required, bucket name
* Key: '' Required object key
* region : '' not required bucket所在region
* Signature: '' not required, 请求签名,从服务端获取
* }
*/
Ks3.headObject = function(params, cb) {
if (params.Key === null || params.Key === undefined) {
alert('require the Key');
}
var key = Ks3.encodeKey(params.Key);
var region = params.region || Ks3.config.region;
if (region ) {
Ks3.config.baseUrl = Ks3.ENDPOINT[region];
}
var bucketName = params.Bucket || Ks3.config.bucket || '';
if(!bucketName) {
alert('require the bucket name');
}
var url = Ks3.config.protocol + '://' + Ks3.config.baseUrl + '/' + bucketName + '/' + key;
var type = 'HEAD';
var signature = params.Signature ||Ks3.generateToken(Ks3.config.SK, bucketName, key, type, '' ,'', '');
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
//前端需要访问的头需要在CORS设置的Exposed Header中显式列出
cb(null, xhr);
}else {
console.log('status: ' + xhr.status);
cb({"msg":"request failed"}, xhr);
}
}
};
xhr.open(type, url, true);
xhr.setRequestHeader('Authorization','KSS ' + Ks3.config.AK + ':' + signature );
xhr.send(null);
}
/**
* 获取指定object
* params {
* Bucket: '' not required, bucket name
* Key: '' Required object key
* region : '' not required bucket所在region
* range : '' not required for range request
* Signature: '' not required, 请求签名,从服务端获取
* }
*/
Ks3.getObject = function(params, cb) {
if (params.Key === null || params.Key === undefined) {
alert('require the Key');
}
var key = Ks3.encodeKey(params.Key);
var region = params.region || Ks3.config.region;
if (region ) {
Ks3.config.baseUrl = Ks3.ENDPOINT[region];
}
var bucketName = params.Bucket || Ks3.config.bucket || '';
if(!bucketName) {
alert('require the bucket name');
}
var range = params.range || '';
var url = Ks3.config.protocol + '://' + Ks3.config.baseUrl + '/' + bucketName + '/' + key;
var type = 'GET';
var signature = params.Signature || Ks3.generateToken(Ks3.config.SK, bucketName, key, type, '' ,'', '');
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
var bb = new Blob([this.response],{type: this.getResponseHeader('Content-Type')}); //from IE 10
cb(null, bb, xhr);
}else {
console.log('status: ' + xhr.status);
cb({"msg":"request failed"}, bb, xhr);
}
}
};
xhr.open(type, url, true);
xhr.responseType = 'arraybuffer';
var reRange = /^bytes=(\d+)-(\d+)$/i;
if(range!==''&& reRange.test(range)){
xhr.setRequestHeader('Range',range);
}
xhr.setRequestHeader('Authorization','KSS ' + Ks3.config.AK + ':' + signature );
xhr.send(null);
}
/**
* put object上传文件
* params {
* Bucket: '' not required, bucket name
* Key: '' Required object key
* region : '' not required bucket所在region
* ACL: '' not required private | public-read
* File: Object required 上传的文件
* ProgressListener: Function, not required 上传进度监听函数
* Signature: '' not required, 请求签名,从服务端获取
* }
*/
Ks3.putObject = function(params, cb) {
if (params.Key === null || params.Key === undefined) {
alert('require the Key');
}
var key = Ks3.encodeKey(params.Key);
var region = params.region || Ks3.config.region;
if (region ) {
Ks3.config.baseUrl = Ks3.ENDPOINT[region];
}
var bucketName = params.Bucket || Ks3.config.bucket || '';
if(!bucketName) {
alert('require the bucket name');
}
var url = Ks3.config.protocol + '://' + Ks3.config.baseUrl + '/' + bucketName + '/' + key;
var type = 'PUT';
var xhr = new XMLHttpRequest();
xhr.open(type, url, true);
var headers = {};
var acl = params.ACL;
if (acl == 'private' || acl == 'public-read') {
var attr_Acl = 'x-' + Ks3.config.prefix + '-acl';
xhr.setRequestHeader(attr_Acl, acl);
headers[attr_Acl] = acl;
}
var signature = params.Signature ||Ks3.generateToken(Ks3.config.SK, bucketName, key, type, params.File.type ,headers, '');
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
cb(null);
}else if(xhr.status === 413 || xhr.status === 415) {
var errMsg = Ks3.xmlToJson(xhr.responseXML)['Error']['Message'];
cb({"msg":errMsg});
}else {
console.log('status: ' + xhr.status);
cb({"msg":"request failed"});
}
}
};
xhr.upload.addEventListener("progress", params.ProgressListener, false);
xhr.setRequestHeader('Authorization','KSS ' + Ks3.config.AK + ':' + signature );
xhr.send(params.File);
}
/**
* 下面这些部分都是关于分块上传的
*/
/**
* 初始化
* params {
* Bucket: '' not required, bucket name
* Key: '' Required object key
* region : '' not required bucket所在region
* ContentType: '' not required content type of object key
* ACL: '' not required private | public-read
* TotalSize: '' not required, 分块上传文件总大小
* Signature: '' not required, 请求签名,从服务端获取
* }
*/
Ks3.multitpart_upload_init = function(params, cb) {
var bucketName = params.Bucket || Ks3.config.bucket || '';
var Key = Ks3.encodeKey(params.Key) || null;
if (!bucketName) {
throw new Error('require the bucketName');
}
if (!Key) {
throw new Error('require the object Key');
}
var region = params.region || Ks3.config.region;
if (region ) {
Ks3.config.baseUrl = Ks3.ENDPOINT[region];
}
var resource = Key + '?uploads';
resource = resource.replace(/\/\//g, "/%2F");
var contentType = params.ContentType || '';
var type = 'POST';
var url = Ks3.config.protocol + '://' + Ks3.config.baseUrl + '/' + bucketName + '/' + resource;
var xhr = new XMLHttpRequest();
xhr.open(type, url, true);
var headers = {};
var acl = params.ACL;
if (acl == 'private' || acl == 'public-read') {
var attr_Acl = 'x-' + Ks3.config.prefix + '-acl';
xhr.setRequestHeader(attr_Acl, acl);
headers[attr_Acl] = acl;
}
var totalSize = params.TotalSize;
if(totalSize) {
var attr_content_length = 'x-' + Ks3.config.prefix + '-meta-' + 'content-length';
xhr.setRequestHeader(attr_content_length, totalSize);
headers[attr_content_length] = totalSize;
}
var signature = params.Signature || Ks3.generateToken(Ks3.config.SK, bucketName, resource, type, contentType ,headers, '');
xhr.overrideMimeType('text/xml'); //兼容火狐
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
var uploadId = Ks3.xmlToJson(xhr.responseXML)['InitiateMultipartUploadResult']['UploadId'];
cb(null, uploadId);
}else if(xhr.status === 413 || xhr.status === 415) {
cb({"status":xhr.status, "msg": Ks3.xmlToJson(xhr.responseXML)['Error']['Message']},null);
} else {
console.log('status: ' + xhr.status);
cb({"msg":"request failed"}, null);
}
}
};
xhr.setRequestHeader('Authorization','KSS ' + Ks3.config.AK + ':' + signature );
if(contentType) {
xhr.setRequestHeader('Content-Type', contentType);
}
xhr.send(null);
}
/**
* 上传分块
* params {
* Bucket: '' not required, bucket name
* Key: '' Required object key
* ContentType: '' not required content type of object key
* PartNumber: '' Required 分块的序号
* UploadId: '' Required 初始化分块上传时获取的上传id
* body: 表示上传内容的blob对象
* Signature: '' not required, 请求签名,从服务端获取
* }
*/
Ks3.upload_part = function(params, cb){
var bucketName = params.Bucket || Ks3.config.bucket || '';
var Key = Ks3.encodeKey(params.Key) || null;
var contentType = params.ContentType || '';
var partNumber = (typeof params.PartNumber!=='undefined') ?params.PartNumber: '';
var uploadId = params.UploadId || '';
if (!bucketName || !Key) {
throw new Error('require the bucketName and object key');
}
if (partNumber==='' || !uploadId) {
throw new Error('require the partNumber and uploadId');
}
var body = params.body || '';
var resource = Key + '?partNumber='+partNumber+'&uploadId='+uploadId;
resource = resource.replace(/\/\//g, "/%2F");
var url = Ks3.config.protocol + '://' + Ks3.config.baseUrl + '/' + bucketName + '/' + resource;
var type = 'PUT';
var signature = params.Signature || Ks3.generateToken(Ks3.config.SK, bucketName, resource, type, contentType ,'', '');
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
var etag = xhr.getResponseHeader('Etag');
cb(null, partNumber,etag);
}else if(xhr.status === 413 || xhr.status === 415) {
cb({"status":xhr.status,"msg": Ks3.xmlToJson(xhr.responseXML)['Error']['Message']},null);
} else {
console.log('status: ' + xhr.status);
cb({"msg":"request failed"}, null);
}
}
};
xhr.open(type, url, true);
xhr.setRequestHeader('Authorization','KSS ' + Ks3.config.AK + ':' + signature );
if(contentType) {
xhr.setRequestHeader('Content-Type', contentType);
}
if(body) {
//var contentLength = body.byteLength;
//xhr.setRequestHeader('Content-Length', contentLength);
xhr.send(body);
}
}
/**
* 完成上传(发送合并分块命令)
* @param params
* {
* Bucket: '' not required, bucket name
* Key: '' Required object key
* UploadId: '' Required 初始化分块上传时获取的上传id
* body: '' Required 描述的分块列表的xml文档
* Signature: '' not required, 请求签名,从服务端获取
* }
* @param cb
*/
Ks3.upload_complete = function(params,cb){
var bucketName = params.Bucket || Ks3.config.bucket || '';
var key = Ks3.encodeKey(params.Key) || null;
var uploadId = params.UploadId || '';
var callbackurl = params.callbackurl || '';
var callbackbody = params.callbackbody || '';
if (!bucketName || !key) {
throw new Error('require the bucketName and object key');
}
if (!uploadId) {
throw new Error('require the uploadId');
}
var body = params.body || '';
var resource = key + '?uploadId='+uploadId;
resource = resource.replace(/\/\//g, "/%2F");
var contentType = 'text/plain;charset=UTF-8';
var headers = {};
if(callbackurl) {
var attr_url = 'x-' + Ks3.config.prefix + '-callbackurl';
headers[attr_url] = callbackurl;
};
if(callbackbody) {
var attr_body = 'x-' + Ks3.config.prefix + '-callbackbody';
headers[attr_body] = callbackbody;
};
var url = Ks3.config.protocol + '://' + Ks3.config.baseUrl + '/' + bucketName + '/' + resource;
var type = 'POST';
var signature = params.Signature || Ks3.generateToken(Ks3.config.SK, bucketName, resource, type, contentType,'', '');
if(headers) {
signature = params.Signature || Ks3.generateToken(Ks3.config.SK, bucketName, resource, type, contentType ,headers, '');
};
var xhr = new XMLHttpRequest();
xhr.overrideMimeType('text/xml'); //兼容火狐
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
var res = Ks3.xmlToJson(xhr.responseXML);
cb(null, res);
}else {
console.log('status: ' + xhr.status);
cb({"msg":"request failed","status": xhr.status}, res);
}
}
};
xhr.open(type, url, true);
xhr.setRequestHeader('Authorization','KSS ' + Ks3.config.AK + ':' + signature );
if(callbackurl) {
xhr.setRequestHeader('x-kss-callbackurl',callbackurl );
}
if(callbackbody) {
xhr.setRequestHeader('x-kss-callbackbody',callbackbody );
}
if(body) {
xhr.send(body);
}
}
/**
* 取消分块上传
* @param params
* {
* Bucket: '' not required, bucket name
* Key: '' Required object key
* UploadId: '' Required 初始化分块上传时获取的上传id,
* Signature: '' not required, 请求签名,从服务端获取
* }
* @param cb
*/
Ks3.abort_multipart_upload = function(params, cb) {
var bucketName = params.Bucket || Ks3.config.bucket || '';
var key = Ks3.encodeKey(params.Key) || null;
var uploadId = params.UploadId || '';
if (!bucketName || !key) {
throw new Error('require the bucketName and object key');
}
if (!uploadId) {
throw new Error('require the uploadId');
}
var resource = key + '?uploadId='+uploadId;
resource = resource.replace(/\/\//g, "/%2F");
var url = Ks3.config.protocol + '://' + Ks3.config.baseUrl + '/' + bucketName + '/' + resource;
var type = 'DELETE';
var signature = params.Signature || Ks3.generateToken(Ks3.config.SK, bucketName, resource, type, '','', '');
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status == 204 ){
cb(null, {"status":xhr.status});
}else {
console.log('status: ' + xhr.status);
cb({"msg":"request failed","status": xhr.status});
}
}
};
xhr.open(type, url, true);
xhr.setRequestHeader('Authorization','KSS ' + Ks3.config.AK + ':' + signature );
xhr.send(null);
}
/**
*
* @param params
* {
* Bucket: '' not required, bucket name
* Key: '' Required object key
* UploadId: '' Required 初始化分块上传时获取的上传id
* Signature: '' not required, 请求签名,从服务端获取
* }
* @param cb
*/
Ks3.upload_list_part = function(params,cb){
var bucketName = params.Bucket || Ks3.config.bucket || '';
var key = Ks3.encodeKey(params.Key) || null;
var uploadId = params.UploadId || '';
if (!bucketName || !key) {
throw new Error('require the bucketName and object key');
}
if (!uploadId) {
throw new Error('require the uploadId');
}
var resource = key + '?uploadId='+uploadId;
resource = resource.replace(/\/\//g, "/%2F");
var url = Ks3.config.protocol + '://' + Ks3.config.baseUrl + '/' + bucketName + '/' + resource;
var type = 'GET';
var signature = params.Signature || Ks3.generateToken(Ks3.config.SK, bucketName, resource, type, '','', '');
var xhr = new XMLHttpRequest();
xhr.overrideMimeType('text/xml'); //兼容火狐
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
var res = Ks3.xmlToJson(xhr.responseXML);
cb(null, res);
}else {
console.log('status: ' + xhr.status);
cb({"msg":"request failed","status": xhr.status}, res);
}
}
};
xhr.open(type, url, true);
xhr.setRequestHeader('Authorization','KSS ' + Ks3.config.AK + ':' + signature );
xhr.send(null);
}
/**
* 判断字符串是否以给定的字符串结尾
* @param str
* @returns {boolean}
*/
String.prototype.endWith = function(str){
var reg=new RegExp(str+"$");
return reg.test(this);
}
/**
* change string to XML DOM
* @param oString
* @returns {*}
*/
Ks3.parseStringToXML = function(oString) {
if (document.implementation && document.implementation.createDocument) {
var xmlDoc = new DOMParser().parseFromString(oString, 'text/xml');
}
else if (window.ActiveXObject) {
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.loadXML(oString);
}
else
{
alert('浏览器不支持xml解析,请升级浏览器');
return null;
}
return xmlDoc;
}
/*! ks3jssdk 14-12-2017 */
function getExpires(a){return Math.round((new Date).getTime()/1e3)+a}!function(a){var b=function(a,b){this.defaultKS3Options={KSSAccessKeyId:"",policy:"",signature:"",bucket_name:"",key:"",acl:"private",uploadDomain:"",autoStart:!1,onInitCallBack:function(){},onErrorCallBack:function(){},onFilesAddedCallBack:function(){},onBeforeUploadCallBack:function(){},onStartUploadFileCallBack:function(){},onUploadProgressCallBack:function(){},onFileUploadedCallBack:function(){},onUploadCompleteCallBack:function(){}},a&&plupload.extend(this.defaultKS3Options,a);var c={};c=this.defaultKS3Options.signature&&this.defaultKS3Options.policy?{key:this.defaultKS3Options.key,acl:this.defaultKS3Options.acl,signature:this.defaultKS3Options.signature,KSSAccessKeyId:this.defaultKS3Options.KSSAccessKeyId,policy:this.defaultKS3Options.policy,"Cache-Control":this.defaultKS3Options["Cache-Control"],Expires:this.defaultKS3Options.Expires,"Content-Disposition":this.defaultKS3Options["Content-Disposition"],"Content-Encoding":this.defaultKS3Options["Content-Encoding"],"Content-Type":this.defaultKS3Options["Content-Type"],"Content-Encoding":this.defaultKS3Options["Content-Encoding"]}:{key:this.defaultKS3Options.key,acl:this.defaultKS3Options.acl,KSSAccessKeyId:this.defaultKS3Options.KSSAccessKeyId};for(var d in this.defaultKS3Options)("string"==typeof this.defaultKS3Options[d]&&-1!==d.indexOf("x-kss-meta-")||"x-kss-newfilename-in-body"==d)&&(c[d]=this.defaultKS3Options[d]);this.defaultPluploadOptions={runtimes:"html5,flash,silverlight,html4",url:this.defaultKS3Options.uploadDomain,browse_button:"browse",flash_swf_url:"js/Moxie.swf",silverlight_xap_url:"js/Moxie.xap",drop_element:void 0,multipart:!0,multipart_params:c},b&&plupload.extend(this.defaultPluploadOptions,b),this.uploader=new plupload.Uploader(this.defaultPluploadOptions),this.uploader.bind("Init",this.onInit,this),this.uploader.bind("Error",this.onUploadError,this),this.uploader.init(),this.uploader.bind("FilesAdded",this.onFilesAdded,this),this.uploader.bind("BeforeUpload",this.onBeforeUpload,this),this.uploader.bind("UploadFile",this.onStartUploadFile,this),this.uploader.bind("UploadProgress",this.onUploadProgress,this),this.uploader.bind("FileUploaded",this.onFileUploaded,this)};return b.prototype.onInit=function(a,b){this.defaultKS3Options.onInitCallBack&&this.defaultKS3Options.onInitCallBack.apply(this,[a,b])},b.prototype.onUploadError=function(a,b){this.defaultKS3Options.onErrorCallBack&&this.defaultKS3Options.onErrorCallBack.apply(this,[a,b])},b.prototype.onFilesAdded=function(a,b){this.defaultKS3Options.autoStart&&this.uploader.start(),this.defaultKS3Options.onFilesAddedCallBack&&this.defaultKS3Options.onFilesAddedCallBack.apply(this,[a,b])},b.prototype.onBeforeUpload=function(a,b){this.defaultKS3Options.onBeforeUploadCallBack&&this.defaultKS3Options.onBeforeUploadCallBack.apply(this,[a,b])},b.prototype.onStartUploadFile=function(a,b){this.defaultKS3Options.onStartUploadFileCallBack&&this.defaultKS3Options.onStartUploadFileCallBack.apply(this,[a,b])},b.prototype.onUploadProgress=function(a,b){this.defaultKS3Options.onUploadProgressCallBack&&this.defaultKS3Options.onUploadProgressCallBack.apply(this,[a,b])},b.prototype.onFileUploaded=function(a,b,c){this.defaultKS3Options.onFileUploadedCallBack&&this.defaultKS3Options.onFileUploadedCallBack.apply(this,[a,b,c])},b.prototype.onUploadComplete=function(a,b){this.defaultKS3Options.onUploadCompleteCallBack&&this.defaultKS3Options.onUploadCompleteCallBack.apply(this,[a,b])},a.ks3FileUploader=b}(window);var Ks3={};Ks3.addURLParam=function(a,b){a+=-1==a.indexOf("?")?"?":"";var c=[];for(var d in b){d=encodeURIComponent(d);var e=b[d];e&&"[object String]"==Object.prototype.toString.call(e)&&c.push(d+"="+encodeURIComponent(e))}return a+c.join("&")},Ks3.xmlToJson=function(a){var b={};if(a.nodeType==Node.TEXT_NODE&&(b=a.nodeValue),a.hasChildNodes())for(var c=0;c<a.childNodes.length;c++){var d=a.childNodes.item(c),e=d.nodeName;if("undefined"==typeof b[e])"#text"===e?b=d.nodeValue:b[e]=Ks3.xmlToJson(d);else{if("undefined"==typeof b[e].length){var f=b[e];b[e]=[],b[e].push(f)}b[e].push(Ks3.xmlToJson(d))}}return b},Ks3.Base64={encTable:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"],decTable:[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1],encUTF8:function(a){for(var b,c,d,e,f,g,h,i=[],j=a.length,k=0;j>k;k++)b=a.charCodeAt(k),b>0&&127>=b?i.push(b):b>=128&&2047>=b?(c=192|b>>6&31,d=128|63&b,i.push(c,d)):b>=2048&&65535>=b?(c=224|b>>12&15,d=128|b>>6&63,e=128|63&b,i.push(c,d,e)):b>=65536&&2097151>=b?(c=240|b>>18&7,d=128|b>>12&63,e=128|b>>6&63,f=128|63&b,i.push(c,d,e,f)):b>=2097152&&67108863>=b?(c=240|b>>24&3,d=240|b>>18&63,e=128|b>>12&63,f=128|b>>6&63,g=128|63&b,i.push(c,d,e,f,g)):b>=67108864&&2147483647>=b&&(c=240|b>>30&1,d=240|b>>24&63,e=240|b>>18&63,f=128|b>>12&63,g=128|b>>6&63,h=128|63&b,i.push(c,d,e,f,g,h));return i},encode:function(a){if(!a)return"";for(var b,c,d,e=this.encUTF8(a),f=0,g=e.length,h=[];g>f;){if(b=255&e[f++],h.push(this.encTable[b>>2]),f==g){h.push(this.encTable[(3&b)<<4],"==");break}if(c=e[f++],f==g){h.push(this.encTable[(3&b)<<4|c>>4&15]),h.push(this.encTable[(15&c)<<2],"=");break}d=e[f++],h.push(this.encTable[(3&b)<<4|c>>4&15]),h.push(this.encTable[(15&c)<<2|(192&d)>>6]),h.push(this.encTable[63&d])}return h.join("")}},Ks3.chrsz=8,Ks3.b64pad="=",Ks3.b64_hmac_sha1=function(a,b){return Ks3.binb2b64(Ks3.core_hmac_sha1(a,b))},Ks3.core_hmac_sha1=function(a,b){var c=Ks3.str2binb(a);c.length>16&&(c=Ks3.core_sha1(c,a.length*Ks3.chrsz));for(var d=Array(16),e=Array(16),f=0;16>f;f++)d[f]=909522486^c[f],e[f]=1549556828^c[f];var g=Ks3.core_sha1(d.concat(Ks3.str2binb(b)),512+b.length*Ks3.chrsz);return Ks3.core_sha1(e.concat(g),672)},Ks3.binb2b64=function(a){for(var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c="",d=0;d<4*a.length;d+=3)for(var e=(a[d>>2]>>8*(3-d%4)&255)<<16|(a[d+1>>2]>>8*(3-(d+1)%4)&255)<<8|a[d+2>>2]>>8*(3-(d+2)%4)&255,f=0;4>f;f++)c+=8*d+6*f>32*a.length?Ks3.b64pad:b.charAt(e>>6*(3-f)&63);return c},Ks3.str2binb=function(a){for(var b=Array(),c=(1<<Ks3.chrsz)-1,d=0;d<a.length*Ks3.chrsz;d+=Ks3.chrsz)b[d>>5]|=(a.charCodeAt(d/Ks3.chrsz)&c)<<32-Ks3.chrsz-d%32;return b},Ks3.core_sha1=function(a,b){a[b>>5]|=128<<24-b%32,a[(b+64>>9<<4)+15]=b;for(var c=Array(80),d=1732584193,e=-271733879,f=-1732584194,g=271733878,h=-1009589776,i=0;i<a.length;i+=16){for(var j=d,k=e,l=f,m=g,n=h,o=0;80>o;o++){16>o?c[o]=a[i+o]:c[o]=Ks3.rol(c[o-3]^c[o-8]^c[o-14]^c[o-16],1);var p=Ks3.safe_add(Ks3.safe_add(Ks3.rol(d,5),Ks3.sha1_ft(o,e,f,g)),Ks3.safe_add(Ks3.safe_add(h,c[o]),Ks3.sha1_kt(o)));h=g,g=f,f=Ks3.rol(e,30),e=d,d=p}d=Ks3.safe_add(d,j),e=Ks3.safe_add(e,k),f=Ks3.safe_add(f,l),g=Ks3.safe_add(g,m),h=Ks3.safe_add(h,n)}return Array(d,e,f,g,h)},Ks3.safe_add=function(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c},Ks3.rol=function(a,b){return a<<b|a>>>32-b},Ks3.sha1_ft=function(a,b,c,d){return 20>a?b&c|~b&d:40>a?b^c^d:60>a?b&c|b&d|c&d:b^c^d},Ks3.sha1_kt=function(a){return 20>a?1518500249:40>a?1859775393:60>a?-1894007588:-899497514},Ks3.generateHeaders=function(a){var b="",c=[];if(a){var d="x-kss";for(var e in a)0==e.indexOf(d)&&c.push(e.toLowerCase()+":"+a[e]);c.sort(),b=c.join("\n")}return b},Ks3.generateToken=function(a,b,c,d,e,f,g){var h=Ks3.generateHeaders(f),i="/"+b+"/"+c;if(""!==h)var j=d+"\n\n"+e+"\n"+g+"\n"+h+"\n"+i;else var j=d+"\n\n"+e+"\n"+g+"\n"+i;var k=Ks3.b64_hmac_sha1(a,j);return k},Ks3.ENDPOINT={HANGZHOU:"kss.ksyun.com",AMERICA:"ks3-us-west-1.ksyun.com",BEIJING:"ks3-cn-beijing.ksyun.com",HONGKONG:"ks3-cn-hk-1.ksyun.com",SHANGHAI:"ks3-cn-shanghai.ksyun.com"},Ks3.config={AK:"",SK:"",protocol:"http",baseUrl:"",region:"",bucket:"",prefix:"kss",chunkSize:5242880,retries:20,currentUploadId:"",stopFlag:!1},Ks3.listObject=function(a,b){var c=new XMLHttpRequest,d={delimiter:a.delimiter,"encoding-type":a["encoding-type"],marker:a.marker,"max-keys":a["max-keys"],prefix:a.prefix},e=a.Bucket||Ks3.config.bucket,f=a.region||Ks3.config.region;f&&(Ks3.config.baseUrl=Ks3.ENDPOINT[f]);var g=Ks3.config.protocol+"://"+Ks3.config.baseUrl+"/"+e;g=Ks3.addURLParam(g,d),c.overrideMimeType("text/xml"),c.onreadystatechange=function(){4==c.readyState&&(c.status>=200&&c.status<300||304==c.status?b(Ks3.xmlToJson(c.responseXML)):(alert("Request was unsuccessful: "+c.status),console.log("status: "+c.status)))},c.open("GET",g,!0);var h=a.Signature||Ks3.generateToken(Ks3.config.SK,e,"","GET","","","");c.setRequestHeader("Authorization","KSS "+Ks3.config.AK+":"+h),c.send(null)},Ks3.delObject=function(a,b){var c=a.Bucket||Ks3.config.bucket,d=Ks3.encodeKey(a.Key),e=a.region||Ks3.config.region;e&&(Ks3.config.baseUrl=Ks3.ENDPOINT[e]);var f=Ks3.config.protocol+"://"+Ks3.config.baseUrl+"/"+c+"/"+d,g=a.Signature||Ks3.generateToken(Ks3.config.SK,c,d,"DELETE","","",""),h=new XMLHttpRequest;h.onreadystatechange=function(){4==h.readyState&&(h.status>=200&&h.status<300||304==h.status?b(h.status):(alert("Request was unsuccessful: "+h.status),console.log("status: "+h.status)))},h.open("DELETE",f,!0),h.setRequestHeader("Authorization","KSS "+Ks3.config.AK+":"+g),h.send(null)},Ks3.encodeKey=function(a){if(null==a)return"";var b=encodeURIComponent(a);return b=b.replace(/\+/g,"%20").replace(/\*/g,"%2A").replace(/%7E/g,"~").replace(/%2F/g,"/")},Ks3.headObject=function(a,b){(null===a.Key||void 0===a.Key)&&alert("require the Key");var c=Ks3.encodeKey(a.Key),d=a.region||Ks3.config.region;d&&(Ks3.config.baseUrl=Ks3.ENDPOINT[d]);var e=a.Bucket||Ks3.config.bucket||"";e||alert("require the bucket name");var f=Ks3.config.protocol+"://"+Ks3.config.baseUrl+"/"+e+"/"+c,g="HEAD",h=a.Signature||Ks3.generateToken(Ks3.config.SK,e,c,g,"","",""),i=new XMLHttpRequest;i.onreadystatechange=function(){4==i.readyState&&(i.status>=200&&i.status<300||304==i.status?b(null,i):(console.log("status: "+i.status),b({msg:"request failed"},i)))},i.open(g,f,!0),i.setRequestHeader("Authorization","KSS "+Ks3.config.AK+":"+h),i.send(null)},Ks3.getObject=function(a,b){(null===a.Key||void 0===a.Key)&&alert("require the Key");var c=Ks3.encodeKey(a.Key),d=a.region||Ks3.config.region;d&&(Ks3.config.baseUrl=Ks3.ENDPOINT[d]);var e=a.Bucket||Ks3.config.bucket||"";e||alert("require the bucket name");var f=a.range||"",g=Ks3.config.protocol+"://"+Ks3.config.baseUrl+"/"+e+"/"+c,h="GET",i=a.Signature||Ks3.generateToken(Ks3.config.SK,e,c,h,"","",""),j=new XMLHttpRequest;j.onreadystatechange=function(){if(4==j.readyState)if(j.status>=200&&j.status<300||304==j.status){var a=new Blob([this.response],{type:this.getResponseHeader("Content-Type")});b(null,a,j)}else console.log("status: "+j.status),b({msg:"request failed"},a,j)},j.open(h,g,!0),j.responseType="arraybuffer";var k=/^bytes=(\d+)-(\d+)$/i;""!==f&&k.test(f)&&j.setRequestHeader("Range",f),j.setRequestHeader("Authorization","KSS "+Ks3.config.AK+":"+i),j.send(null)},Ks3.putObject=function(a,b){(null===a.Key||void 0===a.Key)&&alert("require the Key");var c=Ks3.encodeKey(a.Key),d=a.region||Ks3.config.region;d&&(Ks3.config.baseUrl=Ks3.ENDPOINT[d]);var e=a.Bucket||Ks3.config.bucket||"";e||alert("require the bucket name");var f=Ks3.config.protocol+"://"+Ks3.config.baseUrl+"/"+e+"/"+c,g="PUT",h=new XMLHttpRequest;h.open(g,f,!0);var i={},j=a.ACL;if("private"==j||"public-read"==j){var k="x-"+Ks3.config.prefix+"-acl";h.setRequestHeader(k,j),i[k]=j}var l=a.Signature||Ks3.generateToken(Ks3.config.SK,e,c,g,a.File.type,i,"");h.onreadystatechange=function(){if(4==h.readyState)if(h.status>=200&&h.status<300||304==h.status)b(null);else if(413===h.status||415===h.status){var a=Ks3.xmlToJson(h.responseXML).Error.Message;b({msg:a})}else console.log("status: "+h.status),b({msg:"request failed"})},h.upload.addEventListener("progress",a.ProgressListener,!1),h.setRequestHeader("Authorization","KSS "+Ks3.config.AK+":"+l),h.send(a.File)},Ks3.multitpart_upload_init=function(a,b){var c=a.Bucket||Ks3.config.bucket||"",d=Ks3.encodeKey(a.Key)||null;if(!c)throw new Error("require the bucketName");if(!d)throw new Error("require the object Key");var e=a.region||Ks3.config.region;e&&(Ks3.config.baseUrl=Ks3.ENDPOINT[e]);var f=d+"?uploads";f=f.replace(/\/\//g,"/%2F");var g=a.ContentType||"",h="POST",i=Ks3.config.protocol+"://"+Ks3.config.baseUrl+"/"+c+"/"+f,j=new XMLHttpRequest;j.open(h,i,!0);var k={},l=a.ACL;if("private"==l||"public-read"==l){var m="x-"+Ks3.config.prefix+"-acl";j.setRequestHeader(m,l),k[m]=l}var n=a.TotalSize;if(n){var o="x-"+Ks3.config.prefix+"-meta-content-length";j.setRequestHeader(o,n),k[o]=n}var p=a.Signature||Ks3.generateToken(Ks3.config.SK,c,f,h,g,k,"");j.overrideMimeType("text/xml"),j.onreadystatechange=function(){if(4==j.readyState)if(j.status>=200&&j.status<300||304==j.status){var a=Ks3.xmlToJson(j.responseXML).InitiateMultipartUploadResult.UploadId;b(null,a)}else 413===j.status||415===j.status?b({status:j.status,msg:Ks3.xmlToJson(j.responseXML).Error.Message},null):(console.log("status: "+j.status),b({msg:"request failed"},null))},j.setRequestHeader("Authorization","KSS "+Ks3.config.AK+":"+p),g&&j.setRequestHeader("Content-Type",g),j.send(null)},Ks3.upload_part=function(a,b){var c=a.Bucket||Ks3.config.bucket||"",d=Ks3.encodeKey(a.Key)||null,e=a.ContentType||"",f="undefined"!=typeof a.PartNumber?a.PartNumber:"",g=a.UploadId||"";if(!c||!d)throw new Error("require the bucketName and object key");if(""===f||!g)throw new Error("require the partNumber and uploadId");var h=a.body||"",i=d+"?partNumber="+f+"&uploadId="+g;i=i.replace(/\/\//g,"/%2F");var j=Ks3.config.protocol+"://"+Ks3.config.baseUrl+"/"+c+"/"+i,k="PUT",l=a.Signature||Ks3.generateToken(Ks3.config.SK,c,i,k,e,"",""),m=new XMLHttpRequest;m.onreadystatechange=function(){if(4==m.readyState)if(m.status>=200&&m.status<300||304==m.status){var a=m.getResponseHeader("Etag");b(null,f,a)}else 413===m.status||415===m.status?b({status:m.status,msg:Ks3.xmlToJson(m.responseXML).Error.Message},null):(console.log("status: "+m.status),b({msg:"request failed"},null))},m.open(k,j,!0),m.setRequestHeader("Authorization","KSS "+Ks3.config.AK+":"+l),e&&m.setRequestHeader("Content-Type",e),h&&m.send(h)},Ks3.upload_complete=function(a,b){var c=a.Bucket||Ks3.config.bucket||"",d=Ks3.encodeKey(a.Key)||null,e=a.UploadId||"",f=a.callbackurl||"",g=a.callbackbody||"";if(!c||!d)throw new Error("require the bucketName and object key");if(!e)throw new Error("require the uploadId");var h=a.body||"",i=d+"?uploadId="+e;i=i.replace(/\/\//g,"/%2F");var j="text/plain;charset=UTF-8",k={};if(f){var l="x-"+Ks3.config.prefix+"-callbackurl";k[l]=f}if(g){var m="x-"+Ks3.config.prefix+"-callbackbody";k[m]=g}var n=Ks3.config.protocol+"://"+Ks3.config.baseUrl+"/"+c+"/"+i,o="POST",p=a.Signature||Ks3.generateToken(Ks3.config.SK,c,i,o,j,"","");k&&(p=a.Signature||Ks3.generateToken(Ks3.config.SK,c,i,o,j,k,""));var q=new XMLHttpRequest;q.overrideMimeType("text/xml"),q.onreadystatechange=function(){if(4==q.readyState)if(q.status>=200&&q.status<300||304==q.status){var a=Ks3.xmlToJson(q.responseXML);b(null,a)}else console.log("status: "+q.status),b({msg:"request failed",status:q.status},a)},q.open(o,n,!0),q.setRequestHeader("Authorization","KSS "+Ks3.config.AK+":"+p),f&&q.setRequestHeader("x-kss-callbackurl",f),g&&q.setRequestHeader("x-kss-callbackbody",g),h&&q.send(h)},Ks3.abort_multipart_upload=function(a,b){var c=a.Bucket||Ks3.config.bucket||"",d=Ks3.encodeKey(a.Key)||null,e=a.UploadId||"";if(!c||!d)throw new Error("require the bucketName and object key");if(!e)throw new Error("require the uploadId");var f=d+"?uploadId="+e;f=f.replace(/\/\//g,"/%2F");var g=Ks3.config.protocol+"://"+Ks3.config.baseUrl+"/"+c+"/"+f,h="DELETE",i=a.Signature||Ks3.generateToken(Ks3.config.SK,c,f,h,"","",""),j=new XMLHttpRequest;j.onreadystatechange=function(){4==j.readyState&&(204==j.status?b(null,{status:j.status}):(console.log("status: "+j.status),b({msg:"request failed",status:j.status})))},j.open(h,g,!0),j.setRequestHeader("Authorization","KSS "+Ks3.config.AK+":"+i),j.send(null)},Ks3.upload_list_part=function(a,b){var c=a.Bucket||Ks3.config.bucket||"",d=Ks3.encodeKey(a.Key)||null,e=a.UploadId||"";if(!c||!d)throw new Error("require the bucketName and object key");if(!e)throw new Error("require the uploadId");var f=d+"?uploadId="+e;f=f.replace(/\/\//g,"/%2F");var g=Ks3.config.protocol+"://"+Ks3.config.baseUrl+"/"+c+"/"+f,h="GET",i=a.Signature||Ks3.generateToken(Ks3.config.SK,c,f,h,"","",""),j=new XMLHttpRequest;j.overrideMimeType("text/xml"),j.onreadystatechange=function(){if(4==j.readyState)if(j.status>=200&&j.status<300||304==j.status){var a=Ks3.xmlToJson(j.responseXML);b(null,a)}else console.log("status: "+j.status),b({msg:"request failed",status:j.status},a)},j.open(h,g,!0),j.setRequestHeader("Authorization","KSS "+Ks3.config.AK+":"+i),j.send(null)},String.prototype.endWith=function(a){var b=new RegExp(a+"$");return b.test(this)},Ks3.parseStringToXML=function(a){if(document.implementation&&document.implementation.createDocument)var b=(new DOMParser).parseFromString(a,"text/xml");else{if(!window.ActiveXObject)return alert("浏览器不支持xml解析,请升级浏览器"),null;var b=new ActiveXObject("Microsoft.XMLDOM");b.loadXML(a)}return b};
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -19,10 +19,17 @@ const API_INTERNAL_URI = { ...@@ -19,10 +19,17 @@ const API_INTERNAL_URI = {
'production': "http://bp-test.go2yd.com" 'production': "http://bp-test.go2yd.com"
} }
const IDGEN_URI = {
'development': "https://bp-test.go2yd.com",
'test': "http://idgen-test.ini.yidian-inc.com",
'production': "http://idgen-test.ini.yidian-inc.com"
}
module.exports = { module.exports = {
env: env, env: env,
port: port, port: port,
LOGIN_URI: LOGIN_URI[env], LOGIN_URI: LOGIN_URI[env],
API_INTERNAL_URI: API_INTERNAL_URI[env], API_INTERNAL_URI: API_INTERNAL_URI[env],
PANDORA_URI: PANDORA_URI[env] PANDORA_URI: PANDORA_URI[env],
IDGEN_URI: IDGEN_URI[env]
}; };
exports.KS3_CONFIG = {
AK: 'AKLTTpZx6fNBQsGSKe5chqHdXA',
SK: 'OG9Bk93RUHwaH71U9K+OtWkvx44AdMheywjFlifILikvh96jNGgznJm+AyR5l4wPhw==',
DOMAIN: 'ks3-cn-beijing.ksyun.com',
protocol:'http',
baseUrl:'',
region: '',
bucket: '',
prefix:'kss',
// 分块上传的最小单位
chunkSize:5*1024*1024,
// 分块上传重试次数
retries:20,
currentUploadId: '',
stopFlag: false // for multipart upload
}
\ No newline at end of file
const fsPromise = require("fs/promises");
const FormData = require('form-data');
const crypto = require('crypto');
const IDGEN_URI = require('../config.js').IDGEN_URI
const Ks3Util = require('../utils/ksUtil').Ks3Util
const KS3_CONFIG = require('../constant').KS3_CONFIG
const req = require("../utils/request").httpReq;
const _get_obj_id = async (ctx, next) => {
var url = `${IDGEN_URI}/Ksy/ksyun/buildObectid`;
var opts = {
url: url,
qs: {
appid: 'merchant-b',
},
method: 'GET',
}
return await req(ctx, opts);
}
const _get_bucket = async (ctx, next) => {
var url = `${IDGEN_URI}/Ksy/ksyun/getBucket`;
var opts = {
url: url,
qs: {
appid: 'merchant-b',
},
method: 'GET',
}
// console.log(await req(ctx, opts))
return await req(ctx, opts)
}
const _get_token = async (ctx, next) => {
var url = `${IDGEN_URI}/Ksy/ksyun/getToken`;
var opts = {
url: url,
data: {
appid: 'merchant-b',
},
method: 'POST',
}
return await req(ctx, opts)
}
exports.get_obj_id = async (ctx, next) => {
ctx.body = _get_obj_id(ctx, next)
}
exports.get_bucket = async (ctx, next) => {
ctx.body = await _get_bucket(ctx, next)
}
exports.get_token = async (ctx, next) => {
ctx.body = await _get_token(ctx, next)
}
exports.get_ks3_config = async (ctx, next) => {
console.log(8888, await _get_bucket(ctx, next))
const { result: { bucket } } = JSON.parse(await _get_bucket(ctx, next))
const { result: { objectId } } = JSON.parse(await _get_obj_id(ctx, next))
console.log(888834333, bucket, objectId)
const getExpires = (seconds) => {
return Math.round(new Date().getTime() / 1000) + seconds;
};
const policy = {
"expiration": new Date(getExpires(3600) * 1000).toISOString(), //一小时后
"conditions": [
["eq", "$bucket", bucket],
["starts-with", "$acl", "public-read"],
// ["starts-with", "$key", ""],
// ["starts-with", "$name", ""], //表单中传了name字段,也需要加到policy中
// ["starts-with", "$x-kss-meta-custom-param1",""],
// ["starts-with", "$x-kss-newfilename-in-body",""],//必须只包含小写字符
// ["starts-with", "$Cache-Control",""],
// ["starts-with", "$Expires", ""],
// ["starts-with", "$Content-Disposition", ""],
// ["starts-with", "$Content-Type",""],
// ["starts-with", "$Content-Encoding",""]
]
}
const stringToSign = Ks3Util.Base64.encode(JSON.stringify(policy))
console.log('stringToSign:::', stringToSign)
// const signature = Ks3Util.b64_hmac_sha1(KS3_CONFIG.AccessKeySecret, stringToSign)
const signature = crypto.createHmac('sha1', KS3_CONFIG.SK).update(stringToSign).digest().toString('base64');
console.log("signature::::::", signature)
ctx.body = {
bucket,
objectId,
policy: stringToSign,
signature,
}
}
exports.upload_ks3_image = async (ctx, next) => {
// console.log('upload_ks3_image::::::', ctx.request.files)
const file = ctx.request.files && ctx.request.files.file;
console.log(888899, await _get_bucket(ctx, next))
const { result: { bucket } } = JSON.parse(await _get_bucket(ctx, next))
const { result: { objectId } } = JSON.parse(await _get_obj_id(ctx, next))
console.log(3334444, file.type)
const getExpires = (seconds) => {
return Math.round(new Date().getTime() / 1000) + seconds;
};
const acl = 'public-read';
const policy = {
"expiration": new Date(getExpires(3600) * 1000).toISOString(), //一小时后
"conditions": [
["eq", "$bucket", bucket],
["starts-with", "$acl", "public-read"],
]
}
const stringToSign = Ks3Util.Base64.encode(JSON.stringify(policy))
console.log('stringToSign:::', stringToSign)
const signature = Ks3Util.b64_hmac_sha1(KS3_CONFIG.SK, stringToSign)
// const reader = fs.createReadStream(file.path);
const reader = await fsPromise.readFile(file.path);
const formData = new FormData()
// formData.append('acl', acl)
// formData.append('key', objectId)
// formData.append('signature', signature)
// formData.append('KSSAccessKeyId', KS3_CONFIG.AK)
// formData.append('policy', stringToSign)
// formData.append('bucket_name', stringToSign)
formData.append('file', reader)
const attrAcl = `x-${KS3_CONFIG.prefix}-acl`;
const date = new Date().toGMTString();
console.log('!!!!!', date)
const headersForSign = {
// ...formData.getHeaders(),
// 'content-length': formData.getLengthSync(),
'x-kss-date': date,
[attrAcl]: acl
}
const headerSignature = Ks3Util.generateToken(KS3_CONFIG.SK, bucket, objectId, 'PUT', file.type, headersForSign, date)
const hmac = crypto.createHmac('sha256', KS3_CONFIG.SK);
hmac.update(headerSignature);
console.log(hmac.digest('hex'));
console.log('headerSignature::::', headerSignature)
const headers = {
...headersForSign,
'Authorization': `KSS ${KS3_CONFIG.AK}:${headerSignature}`
}
console.log('before send::::::', headers)
var opts = {
url: `http://${KS3_CONFIG.DOMAIN}/${bucket}/${objectId}`,
method: 'PUT',
headers,
data: file
}
console.log(3333333333, formData.getLengthSync());
const res = await req(ctx, opts);
console.log('sever ks3 image::::::', res)
ctx.body = res;
// const url = `http://${KS3_CONFIG.DOMAIN}/${bucket}/${objectId}`
// var xhr = new XMLHttpRequest();
// xhr.open('PUT', url, true);
// var headers = {};
// var acl = 'public-read';
// if (acl == 'private' || acl == 'public-read') {
// var attr_Acl = 'x-' + KS3_CONFIG.prefix + '-acl';
// xhr.setRequestHeader(attr_Acl, acl);
// headers[attr_Acl] = acl;
// }
// var signature = Ks3Util.generateToken(KS3_CONFIG.SK, bucket, objectId, 'PUT', file.type, headers, '');
// xhr.onreadystatechange = function() {
// if (xhr.readyState == 4) {
// if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
// cb(null);
// }else if(xhr.status === 413 || xhr.status === 415) {
// // var errMsg = Ks3.xmlToJson(xhr.responseXML)['Error']['Message'];
// // cb({"msg":errMsg});
// console.log('image::::', xhr.responseXML);
// }else {
// console.log('status: ' + xhr.status);
// cb({"msg":"request failed"});
// }
// }
// };
// // xhr.upload.addEventListener("progress", params.ProgressListener, false);
// xhr.setRequestHeader('Authorization','KSS ' + KS3_CONFIG.AK + ':' + signature );
// xhr.send(file);
}
\ No newline at end of file
...@@ -52,6 +52,8 @@ exports.getUpdate_role = async (ctx, next) => { ...@@ -52,6 +52,8 @@ exports.getUpdate_role = async (ctx, next) => {
json: true, json: true,
body: ctx.request.body body: ctx.request.body
} }
console.log(opts, 'optsoptsoptsopts888888')
console.log(ctx.request.query, 'pppp')
ctx.body = await req(ctx, opts) ctx.body = await req(ctx, opts)
} }
exports.getDelete_role = async (ctx, next) => { exports.getDelete_role = async (ctx, next) => {
......
const LOGIN_URI = require("../config.js").LOGIN_URI;
const PANDORA_URI = require("../config.js").PANDORA_URI; const PANDORA_URI = require("../config.js").PANDORA_URI;
const req = require("../utils/request").httpReq; const req = require("../utils/request").httpReq;
// exports.login = async (ctx, next) => {
// const url = `${LOGIN_URI}/api/v1/pandora/auth`;
// const opts = {
// url: url,
// method: 'POST',
// json: true,
// body : ctx.request.body
// }
// console.log("koa login:::::", ctx.request)
// ctx.body = await req(ctx, opts)
// }
exports.fetch_user = async (ctx, next) => { exports.fetch_user = async (ctx, next) => {
const url = `${PANDORA_URI}/api/user/getuser`; const url = `${PANDORA_URI}/api/user/getuser`;
const cookie = ctx.request.header.cookie; const cookie = ctx.request.header.cookie;
......
...@@ -17,7 +17,6 @@ var query = { ...@@ -17,7 +17,6 @@ var query = {
async get_permissions (ctx) { async get_permissions (ctx) {
// http://bp-test.ini.yidian-inc.com/merchant/authority/get_role_list?user_email=jianghaiming@126.com // http://bp-test.ini.yidian-inc.com/merchant/authority/get_role_list?user_email=jianghaiming@126.com
const url = `${API_INTERNAL_URI}/merchant/authority/get_role_list`; const url = `${API_INTERNAL_URI}/merchant/authority/get_role_list`;
console.log(44444, ctx.request.query.email);
const { email } = ctx.request.query; const { email } = ctx.request.query;
const opts = { const opts = {
url, url,
...@@ -30,9 +29,10 @@ var query = { ...@@ -30,9 +29,10 @@ var query = {
ctx.body = await req(ctx, opts); ctx.body = await req(ctx, opts);
} }
}; };
exports.query = async (ctx, next) => { exports.query = async (ctx, next) => {
var type = ctx.params.type; var type = ctx.params.type;
console.log("koa user::::::", type);
if (query[type]) { if (query[type]) {
try { try {
ctx.set("Content-Type", "application/json; charset=utf-8"); ctx.set("Content-Type", "application/json; charset=utf-8");
...@@ -49,3 +49,45 @@ exports.query = async (ctx, next) => { ...@@ -49,3 +49,45 @@ exports.query = async (ctx, next) => {
} }
}; };
exports.user_list = async (ctx, next) => {
const url = `${API_INTERNAL_URI}/merchant/authority/get_user_list`;
const opts = {
url: url,
method: "GET",
qs: ctx.request.query,
};
ctx.body = await req(ctx, opts);
};
exports.user_detail = async (ctx, next) => {
const url = `${API_INTERNAL_URI}/merchant/authority/get_user_info`;
const opts = {
url: url,
method: "GET",
qs: ctx.request.query,
};
ctx.body = await req(ctx, opts);
};
exports.user_edit = async (ctx, next) => {
const url = `${API_INTERNAL_URI}/merchant/authority/update_user`;
const opts = {
url: url,
method: "POST",
json: true,
body: ctx.request.body,
};
ctx.body = await req(ctx, opts);
};
exports.user_new = async (ctx, next) => {
const url = `${API_INTERNAL_URI}/merchant/authority/add_user_role`;
const opts = {
url: url,
method: "POST",
json: true,
body: ctx.request.body,
};
ctx.body = await req(ctx, opts);
};
...@@ -4,14 +4,20 @@ const user = require("./controllers/user"); ...@@ -4,14 +4,20 @@ const user = require("./controllers/user");
const enterprise = require("./controllers/enterprise"); const enterprise = require("./controllers/enterprise");
const role = require('./controllers/role') const role = require('./controllers/role')
const life = require('./controllers/life-no') const life = require('./controllers/life-no')
const image = require('./controllers/image')
const router = Router(); const router = Router();
const API_VERSION = "/api/v1"; const API_VERSION = "/api/v1";
// router.post(`${API_VERSION}/login`, system.login); // router.post(`${API_VERSION}/login`, system.login);
router.get(`${API_VERSION}/fetch_user`, system.fetch_user); router.get(`${API_VERSION}/fetch_user`, system.fetch_user);
router.get(`${API_VERSION}/user/:type`, user.query); router.get(`${API_VERSION}/user/:type`, user.query)
//角色
router.get(`${API_VERSION}/users`, user.user_list);
router.get(`${API_VERSION}/users/detail`, user.user_detail);
router.post(`${API_VERSION}/users/edit`, user.user_edit);
router.post(`${API_VERSION}/users/new`, user.user_new);
router.post(`${API_VERSION}/merchant/authority/role_list`, role.getRole_list) router.post(`${API_VERSION}/merchant/authority/role_list`, role.getRole_list)
router.post(`${API_VERSION}/merchant/authority/add_role`, role.getAdd_role) router.post(`${API_VERSION}/merchant/authority/add_role`, role.getAdd_role)
router.post(`${API_VERSION}/merchant/authority/update_role`, role.getUpdate_role) router.post(`${API_VERSION}/merchant/authority/update_role`, role.getUpdate_role)
...@@ -26,6 +32,11 @@ router.post(`${API_VERSION}/check_code`, enterprise.checkCode); ...@@ -26,6 +32,11 @@ router.post(`${API_VERSION}/check_code`, enterprise.checkCode);
router.post(`${API_VERSION}/get_record_info`, enterprise.getRecordInfo); router.post(`${API_VERSION}/get_record_info`, enterprise.getRecordInfo);
router.post(`${API_VERSION}/get_log`, enterprise.getLog); router.post(`${API_VERSION}/get_log`, enterprise.getLog);
router.get(`${API_VERSION}/image/get_image_id`, image.get_obj_id)
router.get(`${API_VERSION}/image/get_bucket`, image.get_bucket)
router.get(`${API_VERSION}/image/get_token`, image.get_token)
router.post(`${API_VERSION}/image/upload_ks3_image`, image.upload_ks3_image)
router.get(`${API_VERSION}/image/get_ks3_config`, image.get_ks3_config)
//生活号 //生活号
router.post(`${API_VERSION}/merchant/lifeinner/life_info`, life.get_life_info) router.post(`${API_VERSION}/merchant/lifeinner/life_info`, life.get_life_info)
router.get(`${API_VERSION}/merchant/lifeinner/life_list`, life.get_life_list) router.get(`${API_VERSION}/merchant/lifeinner/life_list`, life.get_life_list)
......
Ks3 = {}
/*
* //使用hmac_sha1算法计算字符串的签名
* return base-64 encoded strings
*/
Ks3.b64_hmac_sha1 = function (key, data) {
return Ks3.binb2b64(Ks3.core_hmac_sha1(key, data));
}
/*
* Convert an array of big-endian words to a base-64 string
*/
Ks3.binb2b64 = function (binarray) {
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var str = "";
for (var i = 0; i < binarray.length * 4; i += 3) {
var triplet = (((binarray[i >> 2] >> 8 * (3 - i % 4)) & 0xFF) << 16)
| (((binarray[i + 1 >> 2] >> 8 * (3 - (i + 1) % 4)) & 0xFF) << 8)
| ((binarray[i + 2 >> 2] >> 8 * (3 - (i + 2) % 4)) & 0xFF);
for (var j = 0; j < 4; j++) {
if (i * 8 + j * 6 > binarray.length * 32) str += Ks3.b64pad;
else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);
}
}
return str;
}
/*
* Calculate the HMAC-SHA1 of a key and some data
*/
Ks3.core_hmac_sha1 = function (key, data) {
var bkey = Ks3.str2binb(key);
if (bkey.length > 16) bkey = Ks3.core_sha1(bkey, key.length * Ks3.chrsz);
var ipad = Array(16), opad = Array(16);
for (var i = 0; i < 16; i++) {
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5C5C5C5C;
}
var hash = Ks3.core_sha1(ipad.concat(Ks3.str2binb(data)), 512 + data.length * Ks3.chrsz);
return Ks3.core_sha1(opad.concat(hash), 512 + 160);
}
/*
* Convert an 8-bit or 16-bit string to an array of big-endian words
* In 8-bit function, characters >255 have their hi-byte silently ignored.
*/
Ks3.str2binb = function (str) {
var bin = Array();
var mask = (1 << Ks3.chrsz) - 1;
console.log('str2binb::::', str)
for (var i = 0; i < str.length * Ks3.chrsz; i += Ks3.chrsz)
bin[i >> 5] |= (str.charCodeAt(i / Ks3.chrsz) & mask) << (32 - Ks3.chrsz - i % 32);
return bin;
}
/*
* Calculate the SHA-1 of an array of big-endian words, and a bit length
*/
Ks3.core_sha1 = function (x, len) {
/* append padding */
x[len >> 5] |= 0x80 << (24 - len % 32);
x[((len + 64 >> 9) << 4) + 15] = len;
var w = Array(80);
var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;
var e = -1009589776;
for (var i = 0; i < x.length; i += 16) {
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
var olde = e;
for (var j = 0; j < 80; j++) {
if (j < 16) w[j] = x[i + j];
else w[j] = Ks3.rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
var t = Ks3.safe_add(Ks3.safe_add(Ks3.rol(a, 5), Ks3.sha1_ft(j, b, c, d)),
Ks3.safe_add(Ks3.safe_add(e, w[j]), Ks3.sha1_kt(j)));
e = d;
d = c;
c = Ks3.rol(b, 30);
b = a;
a = t;
}
a = Ks3.safe_add(a, olda);
b = Ks3.safe_add(b, oldb);
c = Ks3.safe_add(c, oldc);
d = Ks3.safe_add(d, oldd);
e = Ks3.safe_add(e, olde);
}
return Array(a, b, c, d, e);
}
/*
* Bitwise rotate a 32-bit number to the left.
*/
Ks3.rol = function(num, cnt)
{
return (num << cnt) | (num >>> (32 - cnt));
}
/*
* Perform the appropriate triplet combination function for the current
* iteration
*/
Ks3.sha1_ft = function(t, b, c, d)
{
if(t < 20) return (b & c) | ((~b) & d);
if(t < 40) return b ^ c ^ d;
if(t < 60) return (b & c) | (b & d) | (c & d);
return b ^ c ^ d;
}
/*
* Determine the appropriate additive constant for the current iteration
*/
Ks3.sha1_kt = function(t)
{
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
(t < 60) ? -1894007588 : -899497514;
}
/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
Ks3.safe_add = function (x, y) {
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
/**
* 产生headers
* CanonicalizedKssHeaders
*/
Ks3.generateHeaders =function(header) {
var str = '';
var arr = [];
if(header){
var prefix = 'x-kss';
for(var it in header){
// step1 : 所有`x-kss`的属性都转换为小写
if(it.indexOf(prefix) == 0){
arr.push((it.toLowerCase() +':'+header[it]));
}
}
// step2 : 根据属性名排序
arr.sort();
// step3 : 拼接起来
str = arr.join('\n');
}
return str;
}
/**
* 根据SK和请求生成Signature(用于Authorization头部)
* @param sk secrete key
* @param bucket bucket name
* @param resource ObjectKey[?subResource]
* @param http_verb PUT/GET/POST/DELETE
* @param content_type Content-Type request header
* @param headers headers of request
* @returns {*}
*/
Ks3.generateToken = function (sk, bucket, resource, http_verb, content_type, headers, time_stamp){
// Content-MD5, Content-Type, CanonicalizedKssHeaders都为空
var canonicalized_Kss_Headers = Ks3.generateHeaders(headers);
var canonicalized_Resource = '/' + bucket + '/' + resource;
if (canonicalized_Kss_Headers !== '') {
var string2Sign = http_verb + '\n' + '' + '\n' + content_type + '\n' + time_stamp + '\n' + canonicalized_Kss_Headers + '\n' + canonicalized_Resource;
} else {
var string2Sign = http_verb + '\n' + '' + '\n' + content_type + '\n' + time_stamp + '\n' + canonicalized_Resource;
}
// console.log('string2Sign::::::' + string2Sign);
// var signature = Ks3.b64_hmac_sha1(sk, string2Sign);
// console.log('signature:::::::::' + signature);
return string2Sign;
}
/*
* url endpoints for different regions
*/
Ks3.ENDPOINT = {
HANGZHOU : 'kss.ksyun.com',
AMERICA: 'ks3-us-west-1.ksyun.com',
BEIJING : 'ks3-cn-beijing.ksyun.com',
HONGKONG: 'ks3-cn-hk-1.ksyun.com',
SHANGHAI: 'ks3-cn-shanghai.ksyun.com'
};
/*基于Javascript的Base64加解密算法*/
Ks3.Base64 = {
encTable :[ /*Base64编码表*/
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O' ,'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', '+', '/'
],
decTable:[ /*Base64解码表*/
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 62, -1, -1, -1, 63, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, -1, -1,
-1, -1, -1, -1, -1, 00, 01, 02, 03, 04,
05, 06, 07, 08, 09, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, -1, -1, -1, -1, -1, -1, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, -1, -1, -1, -1, -1
],
encUTF8: function(str) { /*将任意字符串按UTF8编码*/
var code, res =[], len =str.length;
var byte1, byte2, byte3, byte4, byte5, byte6;
for (var i = 0; i < len; i++) {
//Unicode码:按范围确定字节数
code = str.charCodeAt(i);
//单字节ascii字符:U+00000000 – U+0000007F 0xxxxxxx
if (code > 0x0000 && code <= 0x007F) res.push(code);
//双字节字符:U+00000080 – U+000007FF 110xxxxx 10xxxxxx
else if (code >= 0x0080 && code <= 0x07FF) {
byte1 = 0xC0 | ((code >> 6) & 0x1F);
byte2 = 0x80 | (code & 0x3F);
res.push(byte1, byte2);
}
//三字节字符:U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
else if (code >= 0x0800 && code <= 0xFFFF) {
byte1 = 0xE0 | ((code >> 12) & 0x0F);
byte2 = 0x80 | ((code >> 6) & 0x3F);
byte3 = 0x80 | (code & 0x3F);
res.push(byte1, byte2, byte3);
}
//四字节字符:U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
else if (code >= 0x00010000 && code <= 0x001FFFFF) {
byte1 =0xF0 | ((code>>18) & 0x07);
byte2 =0x80 | ((code>>12) & 0x3F);
byte3 =0x80 | ((code>>6) & 0x3F);
byte4 =0x80 | (code & 0x3F);
res.push(byte1, byte2, byte3, byte4);
}
//五字节字符:U+00200000 – U+03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
else if (code >= 0x00200000 && code <= 0x03FFFFFF) {
byte1 =0xF0 | ((code>>24) & 0x03);
byte2 =0xF0 | ((code>>18) & 0x3F);
byte3 =0x80 | ((code>>12) & 0x3F);
byte4 =0x80 | ((code>>6) & 0x3F);
byte5 =0x80 | (code & 0x3F);
res.push(byte1, byte2, byte3, byte4, byte5);
}
//六字节字符:U+04000000 – U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
else if (code >= 0x04000000 && code <= 0x7FFFFFFF) {
byte1 =0xF0 | ((code>>30) & 0x01);
byte2 =0xF0 | ((code>>24) & 0x3F);
byte3 =0xF0 | ((code>>18) & 0x3F);
byte4 =0x80 | ((code>>12) & 0x3F);
byte5 =0x80 | ((code>>6) & 0x3F);
byte6 =0x80 | (code & 0x3F);
res.push(byte1, byte2, byte3, byte4, byte5, byte6);
}
}
return res;
},
encode: function(str) {
/**
* 将任意字符串用Base64加密
* str:要加密的字符串
* utf8编码格式
*/
if (!str) return '';
var bytes = this.encUTF8(str);
var i = 0, len = bytes.length, res = [];
var c1, c2, c3;
while (i < len) {
c1 = bytes[i++] & 0xFF;
res.push(this.encTable[c1 >> 2]);
//结尾剩一个字节补2个=
if (i == len) {
res.push(this.encTable[(c1 & 0x03) << 4], '==');
break;
}
c2 = bytes[i++];
//结尾剩两个字节补1个=
if (i == len) {
res.push(this.encTable[((c1 & 0x03) << 4) | ((c2 >> 4) & 0x0F)]);
res.push(this.encTable[(c2 & 0x0F) << 2], '=');
break;
}
c3 = bytes[i++];
res.push(this.encTable[((c1 & 0x3) << 4) | ((c2 >> 4) & 0x0F)]);
res.push(this.encTable[((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6)]);
res.push(this.encTable[c3 & 0x3F]);
}
return res.join('');
}
};
module.exports.Ks3Util = Ks3;
\ No newline at end of file
const { options } = require('less');
const request = require('request') const request = require('request')
exports.httpReq = (ctx, opts) => { exports.httpReq = (ctx, opts) => {
opts.timeout = opts.timeout || 1000 opts.timeout = opts.timeout || 1000
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// var time_start = +new Date() // var time_start = +new Date()
// opts.qs = {...ctx.request.query, ...opts.qs};
request(opts, (err, res, body) => { request(opts, (err, res, body) => {
//console.info(`[Api] httpReq (${opts.url},${opts.headers && opts.headers.cookie}) spent: ${+new Date() - time_start}ms`) //console.info(`[Api] httpReq (${opts.url},${opts.headers && opts.headers.cookie}) spent: ${+new Date() - time_start}ms`)
if (!err) { if (!err) {
resolve(body) resolve(body)
} else { } else {
...@@ -14,4 +18,25 @@ exports.httpReq = (ctx, opts) => { ...@@ -14,4 +18,25 @@ exports.httpReq = (ctx, opts) => {
} }
}) })
}) })
} }
\ No newline at end of file
// const axios = require('axios')
// const instance = axios.create({})
// exports.httpReq = (ctx, opts) => {
// opts.timeout = opts.timeout || 1000
// return new Promise((resolve, reject) => {
// instance(opts).then((res) => {
// console.log(res);
// resolve(res.data);
// }).catch(({response}) => {
// // console.log(88888, response)
// reject(response.data.message)
// })
// })
// }
\ No newline at end of file
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
> >
{{ item.name }} {{ item.name }}
</el-menu-item> </el-menu-item>
<el-menu-item key="usermenu" class="user-menu"> <el-menu-item key="usermenu" index="usermenu" class="user-menu">
<user></user> <user></user>
</el-menu-item> </el-menu-item>
</el-menu> </el-menu>
...@@ -28,8 +28,6 @@ ...@@ -28,8 +28,6 @@
import { HEADER_CONFIG } from "@/config/pageconfig"; import { HEADER_CONFIG } from "@/config/pageconfig";
import User from './User.vue'; import User from './User.vue';
import { getModulePermissions } from '@/utils/authUtil'
const { menuItems } = HEADER_CONFIG; const { menuItems } = HEADER_CONFIG;
export default { export default {
...@@ -44,10 +42,12 @@ export default { ...@@ -44,10 +42,12 @@ export default {
}, },
computed: { computed: {
menuItemsWithAuth: function () { menuItemsWithAuth: function () {
return this.menuItems.filter(ele => getModulePermissions().includes(ele.key)) const keys = Object.keys(this.$store.getters.subPermissions)
return this.menuItems.filter(ele => keys.includes(ele.key))
}, },
activeMenu: function () { activeMenu: function () {
console.log(988888, this.$route.path)
return this.$route.path; return this.$route.path;
}, },
}, },
......
...@@ -13,17 +13,24 @@ ...@@ -13,17 +13,24 @@
</template> </template>
<script> <script>
export default { export default {
props: ['data', 'totalNum'], props: {
data: Object,
totalNum: Number,
pageSize: {
type: Number,
default: 20,
}
},
data () { data () {
return { return {
currentPage: 5, currentPage: 5
pageSize: 20
} }
}, },
methods: { methods: {
handleSizeChange (size) { handleSizeChange (size) {
console.log(`每页 ${size} 条`); console.log(`每页 ${size} 条`);
this.$emit('update', { pageSize: size }) this.$emit('update', { pageSize: size, })
}, },
handleCurrentChange (pageIndex) { handleCurrentChange (pageIndex) {
console.log(`当前页: ${pageIndex}`); console.log(`当前页: ${pageIndex}`);
......
exports.KS3_CONST = {
AccessKeyID: 'AKLTTpZx6fNBQsGSKe5chqHdXA',
AccessKeySecret: 'OG9Bk93RUHwaH71U9K+OtWkvx44AdMheywjFlifILikvh96jNGgznJm+AyR5l4wPhw==',
DOMAIN: 'ks3-cn-beijing.ksyun.com'
}
\ No newline at end of file
...@@ -38,7 +38,7 @@ export const PAGEMODULE_PERMISSIONNAME = { ...@@ -38,7 +38,7 @@ export const PAGEMODULE_PERMISSIONNAME = {
enterprise: 'enterprise_certification_management', enterprise: 'enterprise_certification_management',
lifeNo: 'life_official_account_management', lifeNo: 'life_official_account_management',
role: 'role_management', role: 'role_management',
roleAddRole: 'role_addRole', // roleAddRole: 'role_addRole',
user: 'user_management' user: 'user_management'
} }
...@@ -60,6 +60,6 @@ export const PATH_PERMISSION_NAME = { ...@@ -60,6 +60,6 @@ export const PATH_PERMISSION_NAME = {
'/enterprise/establish': 'enterprise_certification_management.create', '/enterprise/establish': 'enterprise_certification_management.create',
'/lifeNo': 'life_official_account_management', '/lifeNo': 'life_official_account_management',
'/roleManageRole': 'role_management', '/roleManageRole': 'role_management',
'/roleAddRole': 'role_addRole', // '/roleAddRole': 'role_addRole',
'/user': 'user_management' '/user': 'user_management'
} }
\ No newline at end of file
<template>
<el-upload
class="upload-demo"
action="https://jsonplaceholder.typicode.com/posts/"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:limit="3"
:on-exceed="handleExceed"
:file-list="fileList"
>
<el-button size="small" type="primary">点击上传</el-button>
<template #tip>
<div class="el-upload__tip">只能上传 jpg/png 文件,且不超过 500kb</div>
</template>
</el-upload>
<input type="file" id="imgFile2">
<button @click="handleclick">Put上传</button>
</template>
<script>
import { ksOssUpload } from '@/service/ks3Image'
// import { uploadImageToKs3 } from '@/service/image'
export default {
data () {
return {
fileList: [{name: 'food.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}, {name: 'food2.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}]
}
},
beforeMount() {
},
methods: {
handleclick() {
var file = document.getElementById('imgFile2').files[0];
debugger;
console.log(33334444, file);
},
handleRemove(file, fileList) {
console.log(file, fileList);
},
handlePreview(file) {
const { raw } = file;
console.log('handlePreview:::', file, typeof File);
console.log(222, raw)
// uploadImageToKs3(raw)
ksOssUpload(raw)
},
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
// beforeRemove(file, fileList) {
// return this.$confirm(`确定移除 ${ file.name }?`);
// },
}
}
</script>
<style lang="less" scoped>
</style>
...@@ -234,14 +234,20 @@ export default { ...@@ -234,14 +234,20 @@ export default {
checkIsCode: "" // 用户修改操作的验证码 checkIsCode: "" // 用户修改操作的验证码
}; };
}, },
computed: {
},
created () { created () {
this.getEnterpriseList(); this.getEnterpriseList();
}, },
computed: {
// 使用示例: permission.get("audit") 获取是否有审核权限
permission() {
const modulePermissions = this.$store.getters.moduleSubPermissions('enterprise') || [];
console.log('Current page func-permissions:', modulePermissions);
return new Map(modulePermissions.map(ele => [ele.name, true]))
}
},
methods: { methods: {
// 获取商户认证检查信息 // 获取商户认证检查信息
async getEnterpriseList () { async getEnterpriseList () {
......
...@@ -40,39 +40,15 @@ export default { ...@@ -40,39 +40,15 @@ export default {
methods: { methods: {
async login () { async login () {
const { email, password } = this.userInfo; const { email, password } = this.userInfo;
console.log(34333, email, password);
if (!email) { if (!email) {
console.error("请输入用户邮箱"); console.error("请输入用户邮箱");
return; return;
} }
// if (urlParams.auth && !pwdSec.value) {
// message.error("请输入二次验证码!")
// return
// }
try { try {
const emailAddress = const emailAddress =
email.indexOf("@") === -1 ? email + "@yidian-inc.com" : email; email.indexOf("@") === -1 ? email + "@yidian-inc.com" : email;
const res = await reqLogin(emailAddress, password); const res = await reqLogin(emailAddress, password);
console.log(111111, res);
if (!res || !res.token) return; if (!res || !res.token) return;
// const storage = window.localStorage
// storage["YD_PANDORA_auth"] = JSON.stringify(res.auth || {})
// storage["YD_PANDORA_JWT_TOKEN"] = (res.type + " " + res.token) || ''
// storage["YD_PANDORA_user"] = JSON.stringify(res.userInfo || {})
// setCookie('uid', res.userInfo && res.userInfo.id, 16)
// setCookie('YD_PANDORA_UID', res.userInfo && res.userInfo.id, 16)
// setCookie('userid', res.userInfo && res.userInfo.id, 16)
// setCookie('username', res.userInfo && res.userInfo.email, 16)
// setCookie('nickname', res.userInfo && res.userInfo.displayName, 16)
// setCookie('YD_PANDORA_JWT_TOKEN', (res.type + " " + res.token) || '', 16)
// if (urlParams.callback) {
// // window.location.href = `${callback}${callback.indexOf('?') >= 0 ? '&' : '?'}token=${res.token}`
// window.location.href = `${urlParams.callback}`
// } else {
// window.location.href = `/?tid=${toolId}`
// }
} catch (e) { } catch (e) {
console.log(e); console.log(e);
// message.error("登录不成功,请检查登录信息后重试!") // message.error("登录不成功,请检查登录信息后重试!")
......
<template> <template>
<div class="addRole"> <div class="addRole">
<el-button type="primary" @click="newAddRole">新增</el-button> <el-button
type="primary"
v-if="permission.get('create')"
@click="newAddRole"
>新增</el-button
>
<!-- 角色列表 --> <!-- 角色列表 -->
<el-table <el-table
:data="roleDataList" :data="roleDataList"
...@@ -66,15 +71,22 @@ import { ...@@ -66,15 +71,22 @@ import {
} from "../../service/role"; } from "../../service/role";
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
export default { export default {
name: 'KeepaddRole',
components: { components: {
page, page,
roleInfo roleInfo
}, },
computed: {
permission () {
const modulePermissions = this.$store.getters.moduleSubPermissions('role') || [];
return new Map(modulePermissions.map(ele => [ele.name, true]))
},
},
data () { data () {
return { return {
parmas: { parmas: {
page: 1, page: 1,
page_size: 10 page_size: 20
}, },
user_info: { user_info: {
name: "jianghaiming", name: "jianghaiming",
...@@ -121,8 +133,8 @@ export default { ...@@ -121,8 +133,8 @@ export default {
}, },
getPermissionsAll () { getPermissionsAll () {
// this.user_info = this.$store.state.userInfo // this.user_info = this.$store.state.userInfo
let { name, email } = this.user_info let { email } = this.user_info
reqGetAll_role_list(name, email).then(res => { reqGetAll_role_list(email).then(res => {
this.permissionsAll = res this.permissionsAll = res
}) })
}, },
...@@ -137,7 +149,11 @@ export default { ...@@ -137,7 +149,11 @@ export default {
//获取角色列表 //获取角色列表
getGetRole_list () { getGetRole_list () {
let { page, page_size } = this.parmas let { page, page_size } = this.parmas
reqGetRole_list(page, page_size).then(res => { let parmasRole_list = {
page,
page_size,
}
reqGetRole_list(parmasRole_list).then(res => {
this.roleDataList = res.result this.roleDataList = res.result
this.totalNum = res.count this.totalNum = res.count
}) })
...@@ -154,8 +170,13 @@ export default { ...@@ -154,8 +170,13 @@ export default {
this.checkFn() this.checkFn()
return false return false
} }
let role_name = this.roleName, permissions = this.currentRolePrivilege let { email } = this.$store.state.userInfo //当前登陆人
reqGetAdd_role(role_name, permissions).then(res => { let parmasAdd_role = {
op_cur_user: email,
role_name: this.roleName,
permissions: this.currentRolePrivilege
}
reqGetAdd_role(parmasAdd_role).then(res => {
if (res.status === "success") { if (res.status === "success") {
this.dialogFormVisible = false this.dialogFormVisible = false
this.getGetRole_list() this.getGetRole_list()
...@@ -214,10 +235,16 @@ export default { ...@@ -214,10 +235,16 @@ export default {
this.checkFn() this.checkFn()
return false return false
} }
let { role_name, role_id, role_status } = this.role_info_detail let { role_id, role_status } = this.role_info_detail
let { email } = this.user_info let { email } = this.$store.state.userInfo//当前登陆人
role_name = this.roleName let parmasUpdate_role = {
reqGetUpdate_role(email, role_name, role_id, role_status, this.permissionsUpdate).then(res => { op_cur_user: email,
role_name: this.roleName,
role_id,
role_status,
permissions: this.permissionsUpdate
}
reqGetUpdate_role(parmasUpdate_role).then(res => {
if (res.status === "success") { if (res.status === "success") {
this.dialogFormVisible = false this.dialogFormVisible = false
this.edit = true this.edit = true
......
...@@ -52,7 +52,10 @@ ...@@ -52,7 +52,10 @@
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="center">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-if="!(scope.row.role_status == 2 || scope.row.role_status == 3)" v-if="
!(scope.row.role_status == 2 || scope.row.role_status == 3) &&
permission.get('edit')
"
size="mini" size="mini"
@click.stop="handelModify(scope.row)" @click.stop="handelModify(scope.row)"
type="primary" type="primary"
...@@ -60,18 +63,21 @@ ...@@ -60,18 +63,21 @@
> >
<el-button <el-button
size="mini" size="mini"
v-if="permission.get('delete')"
@click.stop="handelDelete(scope.row)" @click.stop="handelDelete(scope.row)"
type="warning" type="warning"
>删除</el-button >删除</el-button
> >
<el-button <el-button
size="mini" size="mini"
v-if="permission.get('disable')"
@click.stop="handelDisable(scope.row)" @click.stop="handelDisable(scope.row)"
type="danger" type="danger"
>禁用</el-button >禁用</el-button
> >
<el-button <el-button
size="mini" size="mini"
v-if="permission.get('enable')"
@click.stop="handelEnable(scope.row)" @click.stop="handelEnable(scope.row)"
type="success" type="success"
>启用</el-button >启用</el-button
...@@ -117,11 +123,17 @@ import { ...@@ -117,11 +123,17 @@ import {
getDelete_role as reqGetDelete_role getDelete_role as reqGetDelete_role
} from "../../service/role"; } from "../../service/role";
export default { export default {
name: 'RoleManagement', name: 'KeepRoleManagement',
components: { components: {
Layout, Layout,
page, page,
}, },
computed: {
permission () {
const modulePermissions = this.$store.getters.moduleSubPermissions('role') || [];
return new Map(modulePermissions.map(ele => [ele.name, true]))
},
},
data () { data () {
return { return {
searchForm: { searchForm: {
...@@ -135,7 +147,7 @@ export default { ...@@ -135,7 +147,7 @@ export default {
}, },
parmas: { parmas: {
page: 1, page: 1,
page_size: 10 page_size: 20
}, },
totalNum: null, totalNum: null,
props: { props: {
...@@ -166,19 +178,24 @@ export default { ...@@ -166,19 +178,24 @@ export default {
return statusText[row.role_status - 1] return statusText[row.role_status - 1]
}, },
toRoleDetail (row) { toRoleDetail (row) {
// this.$store.commit('update', '0000');
this.$router.push({ name: 'RoleDetail', query: { roleId: row.role_id } }); this.$router.push({ name: 'RoleDetail', query: { roleId: row.role_id } });
}, },
getPermissionsAll () { getPermissionsAll () {
let { name, email } = this.user_info let { email } = this.user_info
reqGetAll_role_list(name, email).then(res => { reqGetAll_role_list(email).then(res => {
this.permissionsAll = res this.permissionsAll = res
}) })
}, },
//获取角色列表 //获取角色列表
getGetRole_list () { getGetRole_list () {
let { page, page_size } = this.parmas let { page, page_size } = this.parmas
reqGetRole_list(page, page_size, this.searchForm.roleStatus, this.searchForm.roleName).then(res => { let parmasRole_list = {
page,
page_size,
role_status: this.searchForm.roleStatus,
role_name: this.searchForm.roleName
}
reqGetRole_list(parmasRole_list).then(res => {
this.managementList = res.result this.managementList = res.result
this.totalNum = res.count this.totalNum = res.count
}) })
...@@ -234,7 +251,7 @@ export default { ...@@ -234,7 +251,7 @@ export default {
role_name, role_name,
} }
this.permissionsUpdate = permissions this.permissionsUpdate = permissions
let { email } = this.user_info //当前用户 let { email } = this.$store.state.userInfo //当前用户
let role_status let role_status
if (type === "disable") { if (type === "disable") {
role_status = 2 role_status = 2
...@@ -290,8 +307,15 @@ export default { ...@@ -290,8 +307,15 @@ export default {
this.openBounced("disable", row.role_id) this.openBounced("disable", row.role_id)
}, },
//编辑列表操作 //编辑列表操作
getUpdate_role (op_cur_user, role_name, role_id, role_status, permissions) { getUpdate_role (email, role_name, role_id, role_status, permissions) {
reqGetUpdate_role(op_cur_user, role_name, role_id, role_status, permissions).then(res => { let parmasUpdate_role = {
op_cur_user: email,
role_name: role_name,
role_id,
role_status,
permissions,
}
reqGetUpdate_role(parmasUpdate_role).then(res => {
if (res.status === "success") { if (res.status === "success") {
this.dialogVisible = false this.dialogVisible = false
this.getGetRole_list() this.getGetRole_list()
...@@ -311,7 +335,7 @@ export default { ...@@ -311,7 +335,7 @@ export default {
}, },
//确认修改 //确认修改
confirm () { confirm () {
let { email } = this.user_info let { email } = this.$store.state.userInfo
let { role_id, role_name } = this.role_info_detail let { role_id, role_name } = this.role_info_detail
let role_status = '' let role_status = ''
this.getUpdate_role(email, role_name, role_id, role_status, this.currentRolePrivilege) this.getUpdate_role(email, role_name, role_id, role_status, this.currentRolePrivilege)
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item> <el-descriptions-item>
<template #label> 创建人账号 </template> <template #label> 创建人账号 </template>
{{ role_info_detail.update_user_name }} {{ role_info_detail.create_user_name }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item> <el-descriptions-item>
<template #label> 创建时间 </template> <template #label> 创建时间 </template>
...@@ -57,7 +57,6 @@ ...@@ -57,7 +57,6 @@
</template> </template>
<script> <script>
import { get_role_info as reqGet_role_info, getAll_role_list as reqGetAll_role_list, } from '../../service/role' import { get_role_info as reqGet_role_info, getAll_role_list as reqGetAll_role_list, } from '../../service/role'
export default { export default {
data () { data () {
return { return {
...@@ -88,8 +87,8 @@ export default { ...@@ -88,8 +87,8 @@ export default {
created () { created () {
// this.user_info = this.$store.state.userInfo // this.user_info = this.$store.state.userInfo
this.roleId = this.$route.query.roleId this.roleId = this.$route.query.roleId
let { name, email } = this.user_info let { email } = this.user_info
reqGetAll_role_list(name, email).then(res => { reqGetAll_role_list(email).then(res => {
this.permissionsAll = res this.permissionsAll = res
}) })
reqGet_role_info(this.roleId).then((res) => { reqGet_role_info(this.roleId).then((res) => {
......
<template>
<div class="user-container">
<el-dialog :title="mode==='edit' ? '编辑用户':'创建用户'" v-model="modalVisable">
<el-form :model="userInfo">
<el-form-item label="用户ID" :label-width="formLabelWidth">
<el-input class="form-val" v-model="userInfo.user_id" size="medium" disabled></el-input>
</el-form-item>
<el-form-item label="状态" :label-width="formLabelWidth">
<!-- <el-input class="form-val">{{data.user_status===1?'启用':'禁用'}}</el-input> -->
<el-switch
class="form-val"
v-model="userInfo.user_status"
active-value=1
inactive-value=0
active-text="启用"
inactive-text="禁用"
>
</el-switch>
</el-form-item>
<el-form-item label="姓名" :label-width="formLabelWidth">
<el-input class="form-val" v-model="userInfo.user_name" disabled></el-input>
</el-form-item>
<el-form-item label="账号" :label-width="formLabelWidth">
<el-input class="form-val" v-model="userInfo.user_email" disabled></el-input>
</el-form-item>
<el-form-item label="手机号" :label-width="formLabelWidth">
<el-input class="form-val" v-model="userInfo.user_mobile"></el-input>
</el-form-item>
<el-form-item label="所属组织" :label-width="formLabelWidth">
<el-input class="form-val" v-model="userInfo.organization" disabled></el-input>
</el-form-item>
<el-form-item label="授权角色信息" :label-width="formLabelWidth">
<!-- <el-input class="form-val" v-model="userInfo.roles"></el-input> -->
<el-select v-model="userInfo.roles" multiple placeholder="请选择">
<el-option
v-for="item in roles"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="敏感词权限" :label-width="formLabelWidth">
<!-- <el-input class="form-val">{{userInfo.is_sensitive_authority === 1 ? '是' : '否'}}</el-input> -->
<el-switch
v-model="userInfo.is_sensitive_authority"
class="form-val"
active-value=1
inactive-value=0
active-text="开启"
inactive-text="关闭"
>
</el-switch>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button>取 消</el-button>
<el-button type="primary" @click="confirm">确 定</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { getRole_list as reqGetRoles } from '@/service/role';
export default {
name: 'UserInfoEditModal',
props: {
mode: {
type: String,
default: 'edit',
},
data: Object,
// title: {
// type: String,
// default: "用户信息",
// },
visable: {
type: Boolean,
default: false
}
},
data () {
return {
formLabelWidth: '120px',
userInfo: {},
roles: null,
modalVisable: false
}
},
watch: {
data(val) {
this.userInfo = val;
},
visable(val) {
this.modalVisable = val;
}
},
beforeMount(){
this.getRoles();
},
methods: {
async getRoles() {
const roles = await reqGetRoles();
console.log(67777, roles)
},
confirm() {
this.$emit('confirm', this.userInfo);
},
cancel() {
this.$emit('cancel');
}
},
}
</script>
<style lang="less">
.form-val {
margin-left: 20px;
width: 300px;
}
.form-val.el-input {
width: 80%;
}
</style>
\ No newline at end of file
<template>
<div class="user-container">
<el-dialog :title="title" v-model="modalVisable">
<el-form :model="data">
<el-form-item label="用户ID" :label-width="formLabelWidth">
<text class="form-val">{{data.user_id}}</text>
</el-form-item>
<el-form-item label="状态" :label-width="formLabelWidth">
<text class="form-val">{{data.user_status===1?'启用':'禁用'}}</text>
</el-form-item>
<el-form-item label="姓名" :label-width="formLabelWidth">
<text class="form-val">{{data.user_name}}</text>
</el-form-item>
<el-form-item label="账号" :label-width="formLabelWidth">
<text class="form-val">{{data.user_email}}</text>
</el-form-item>
<el-form-item label="手机号" :label-width="formLabelWidth">
<text class="form-val">{{data.user_mobile}}</text>
</el-form-item>
<el-form-item label="所属组织" :label-width="formLabelWidth">
<text class="form-val">{{data.organization}}</text>
</el-form-item>
<el-form-item label="添加账号人" :label-width="formLabelWidth">
<text class="form-val">{{data.create_user_name}}</text>
</el-form-item>
<el-form-item label="添加时间" :label-width="formLabelWidth">
<text class="form-val">{{data.create_time}}</text>
</el-form-item>
<el-form-item label="最后修改人账号" :label-width="formLabelWidth">
<text class="form-val">{{data.update_user_name}}</text>
</el-form-item>
<el-form-item label="最后修改时间" :label-width="formLabelWidth">
<text class="form-val">{{data.update_time}}</text>
</el-form-item>
<el-form-item label="授权角色信息" :label-width="formLabelWidth">
<text class="form-val">{{data.roles.map(ele => ele.name).join(',')}}</text>
</el-form-item>
<el-form-item label="敏感词权限" :label-width="formLabelWidth">
<text class="form-val">{{data.is_sensitive_authority === 1 ? '是' : '否'}}</text>
</el-form-item>
</el-form>
</el-dialog>
</div>
</template>
<script>
export default {
name: 'UserInfoModal',
props: {
mode: {
type: String,
default: 'check',
},
data: Object,
title: {
type: String,
default: "用户信息",
},
visable: {
type: Boolean,
default: false
}
},
data () {
return {
formLabelWidth: '180px',
modalVisable: false,
}
},
watch: {
visable(val) {
this.modalVisable = val;
}
},
methods: {
},
}
</script>
<style lang="less">
.form-val {
margin-left: 20px;
}
</style>
\ No newline at end of file
...@@ -2,117 +2,242 @@ ...@@ -2,117 +2,242 @@
<template> <template>
<layout> <layout>
<div class="user"> <div class="user">
<el-form :inline="true" :model="formInline" class="demo-form-inline"> <el-form :inline="true" :model="pageParams" class="demo-form-inline">
<el-form-item label="生活号名称/企业名称"> <el-form-item label="用户姓名">
<el-input <el-input
class="search_life"
maxlength="15" maxlength="15"
v-model="formInline.user" v-model="pageParams.user_name"
placeholder="生活号名称/企业名称" placeholder="用户姓名"
></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="类型"> <el-form-item label="用户账号">
<el-select v-model="formInline.region" placeholder="类型"> <el-input
<el-option value="shanghai"></el-option> v-model="pageParams.user_email"
<el-option value="beijing"></el-option> placeholder="用户账号"
></el-input>
</el-form-item>
<el-form-item label="手机号">
<el-input
v-model="pageParams.user_mobile"
placeholder="手机号"
></el-input>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="pageParams.user_status" placeholder="状态">
<el-option value="1" label="启用"></el-option>
<el-option value="2" label="禁用"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item class="func-btn">
<el-button type="primary" @click="onSearchSubmit">查询</el-button> <el-button type="primary" @click="getUserList">查询</el-button>
<el-button @click="onReset">重置</el-button> <el-button @click="onReset">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-table <el-table :data="renderUserList" border style="width: 100%">
:data="tableData" <el-table-column prop="user_id" label="ID" width="70">
border </el-table-column>
style="width: 100%" <el-table-column prop="user_name" label="用户姓名"> </el-table-column>
@row-click="toUserDetail" <el-table-column prop="user_email" label="用户账号"> </el-table-column>
> <el-table-column prop="user_status" label="状态"> </el-table-column>
<el-table-column prop="id" label="ID"> </el-table-column> <el-table-column prop="user_mobile" label="手机号"> </el-table-column>
<el-table-column prop="name" label="用户姓名"> </el-table-column> <el-table-column prop="update_time" label="最后修改日期">
<el-table-column prop="address" label="用户账号"> </el-table-column> </el-table-column>
<el-table-column prop="name" label="状态"> </el-table-column> <el-table-column prop="update_user_name" label="最后修改人账号">
<el-table-column prop="date" label="手机号"> </el-table-column> </el-table-column>
<el-table-column prop="date" label="最后修改日期"> </el-table-column> <el-table-column fixed="right" label="操作" width="140">
<el-table-column prop="date" label="最后修改人账号"> </el-table-column> <template #default="scope">
<el-button type="text" size="small" @click="checkUser(scope.row)"
>查看</el-button
>
<el-button @click="editUser(scope.row)" type="text" size="small"
>修改</el-button
>
<el-button
v-if="scope.row.user_status === '启用'"
type="text"
size="small"
@click="enableUser"
>禁用</el-button
>
<el-button
v-if="scope.row.user_status === '禁用'"
type="text"
size="small"
@click="disableUser"
>启用</el-button
>
</template>
</el-table-column>
</el-table> </el-table>
<page :totalNum="totalNum" @update="update" /> <page
:totalNum="totalNum"
:pageSize="pageParams.size"
@update="updatePage"
/>
</div> </div>
<user-info-modal
:data="curUserInfo"
:visable="modalVisable.info"
></user-info-modal>
<user-info-edit-modal
:data="curUserInfo"
:visable="modalVisable.edit"
:mode="curOperateMode"
@confirm="confirmEditModal"
@cancel="cancelEditModal"
></user-info-edit-modal>
</layout> </layout>
</template> </template>
<script> <script>
import Layout from '@/layouts' import Layout from "@/layouts";
import page from "@/components/Pagination" import page from "@/components/Pagination";
import UserInfoModal from './components/UserInfoModal';
import UserInfoEditModal from './components/UserInfoEditModal';
import { ElMessage } from "element-plus";
import {
getUserList as reqGetUserList,
getUserDetail as reqGetUserDetail,
editUser as reqEditUser,
createUser as reqCreateUser
} from "@/service/user";
export default { export default {
components: { components: {
Layout, Layout,
page page,
UserInfoModal,
UserInfoEditModal
}, },
data () { data () {
return { return {
params: { pageParams: {
page: 1, page: 1,
pageSize: 10 size: 20,
user_name: "",
user_email: "",
user_mobile: "",
user_status: "",
}, },
totalNum: 1000, totalNum: 0,
lifeList: [], userList: [],
tableData: [{ curUserInfo: {},
id: '001', modalVisable: {
date: '2016-05-02', info: false,
name: '王小虎', edit: false,
address: '上海市普陀区金沙江路 1518 弄' },
}, { curOperateMode: 'new'
id: '002', };
date: '2016-05-04', },
name: '王小虎', computed: {
address: '上海市普陀区金沙江路 1517 弄' renderUserList () {
}, { const statusMap = new Map([
id: '003', [1, "启用"],
date: '2016-05-01', [2, "禁用"],
name: '王小虎', [3, "删除"],
address: '上海市普陀区金沙江路 1519 弄' ]);
}, { return this.userList.map((ele) => {
id: '004', ele.user_status = statusMap.get(ele.user_status);
date: '2016-05-03', return ele;
name: '王小虎', });
address: '上海市普陀区金沙江路 1516 弄' },
}], },
formInline: { beforeMount () {
user: '', this.getUserList();
region: ''
}
}
}, },
methods: { methods: {
//查询 async getUserList () {
onSearchSubmit () { const { code, result } = await reqGetUserList(this.pageParams);
console.log(this.formInline.user, this.formInline.region, 'submit!');
if (code !== 0) {
ElMessage.error("获取用户列表出错!");
return;
}
const { data, count } = result;
this.totalNum = count;
this.userList = data;
},
async setCurUserInfo (user_id) {
const { code, result } = await reqGetUserDetail({ user_id });
if (code === 0) {
this.curUserInfo = {
...result.user_info,
roles: result.role_list
}
} else {
ElMessage.error("获取用户信息出错!");
}
},
async checkUser (row) {
const { user_id } = row;
await this.setCurUserInfo(user_id);
this.openModal('info')
}, },
async editUser (row) {
const { user_id } = row;
await this.setCurUserInfo(user_id);
// this.openModal('edit');
this.modalVisable.edit = true;
this.curOperateMode = 'edit';
},
openModal (key) {
Object.keys(this.modalVisable).forEach(ele => {
this.modalVisable[ele] = (key === ele);
});
},
confirmEditModal (userInfo) {
// this.curOperateMode
console.log('confirmEditModal:::::', userInfo);
if (this.curOperateMode === 'edit') {
reqEditUser()
} else if (this.curOperateMode === 'new') {
reqCreateUser()
}
},
cancelEditModal () {
},
//重置 //重置
onReset () { onReset () {
this.formInline.user = "", this.pageParams = {
this.formInline.region = "" page: 1,
}, pageSize: 20,
update (obj) { user_name: "",
Object.assign(this.params, obj) user_email: "",
this.getlifeNoList(this.params) user_mobile: "",
user_status: "",
};
}, },
toUserDetail (row) {
this.$router.push({ name: 'UserDetail', query: { userId: row.id } }); updatePage ({ page, pageSize }) {
page && (this.pageParams.page = page);
pageSize && (this.pageParams.pageSize = pageSize);
this.getUserList();
}, },
//获取列表数据
getlifeNoList () { enableUser () {
} }
} },
} };
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.life-no { .user {
margin: 30px; padding: 50px;
.search_life { .search_life {
width: 280px; width: 280px;
} }
.func-btn {
float: right;
}
} }
</style> </style>
...@@ -18,7 +18,7 @@ export default { ...@@ -18,7 +18,7 @@ export default {
data () { data () {
return { return {
currentPage: 1, currentPage: 1,
page_size: 10 page_size: 20
} }
}, },
methods: { methods: {
......
...@@ -7,8 +7,9 @@ import Establish from '@/pages/Enterprise/Establish' ...@@ -7,8 +7,9 @@ import Establish from '@/pages/Enterprise/Establish'
import LifeNo from '../pages/Life-no/index.vue' import LifeNo from '../pages/Life-no/index.vue'
import LifeNoDetail from '../pages/Life-no/life-no-detail.vue' import LifeNoDetail from '../pages/Life-no/life-no-detail.vue'
// import User from '../pages/User/userList' import User from '../pages/User/userList'
import UserDetail from '../pages/User/user-detail.vue' import UserDetail from '../pages/User/user-detail.vue'
import AddRole from '../pages/Role/add-role.vue' import AddRole from '../pages/Role/add-role.vue'
import ManageRole from '../pages/Role/manage-role.vue' import ManageRole from '../pages/Role/manage-role.vue'
import RoleDetail from '../pages/Role/role-detail.vue' import RoleDetail from '../pages/Role/role-detail.vue'
...@@ -28,6 +29,11 @@ const routes = [ ...@@ -28,6 +29,11 @@ const routes = [
name: 'Forbidden', name: 'Forbidden',
component: () => import(/* webpackChunkName: "enterprise" */ '@/pages/Catch/forbidden'), component: () => import(/* webpackChunkName: "enterprise" */ '@/pages/Catch/forbidden'),
}, },
{
path: '/demoImgUploader',
name: 'demoImgUploader',
component: () => import(/* webpackChunkName: "enterprise" */ '@/pages/DemoImageUpload'),
},
{ {
path: '/enterprise/certification', path: '/enterprise/certification',
name: 'Certification', name: 'Certification',
...@@ -67,6 +73,11 @@ const routes = [ ...@@ -67,6 +73,11 @@ const routes = [
component: LifeNoDetail, component: LifeNoDetail,
}, },
//用户管理 //用户管理
{
path: '/user',
name: 'User',
component: User,
},
{ {
path: '/userDetail', path: '/userDetail',
name: 'UserDetail', name: 'UserDetail',
...@@ -86,7 +97,8 @@ const routes = [ ...@@ -86,7 +97,8 @@ const routes = [
name: 'ManageRole', name: 'ManageRole',
component: ManageRole, component: ManageRole,
meta: { meta: {
requireAuth: true requireAuth: true,
keepAlive: true
} }
}, },
{ {
......
import axios from '../utils/request';
export async function getImgId() {
const res = await axios.get("/api/v1/image/get_image_id")
return res;
}
export async function getImgBucket() {
const res = await axios.get("/api/v1/image/get_bucket")
return res;
}
export async function getImgToken() {
const res = await axios.get("/api/v1/image/get_token")
return res;
}
export async function uploadImageToKs3(file) {
const formData = new FormData();
formData.append("file", file);
const res = await axios.post("/api/v1/image/upload_ks3_image", formData)
return res;
}
export async function getKs3Config() {
const res = await axios.get("/api/v1/image/get_ks3_config")
return res;
}
\ No newline at end of file
import { getKs3Config } from "@/service/image";
import { KS3_CONST } from "@/config/constant";
import axios from '../utils/request';
// async function getRemoteConfig() {
// const imgId = await getImgId();
// const bucket = await getImgBucket();
// return {imgId, bucket}
// }
// const protocal = window.location.protocol === 'https:' ? 'https' : 'http';
// const { imgId, bucket } = await getRemoteConfig();
export async function ksOssUpload(file) {
const {bucket, objectId, policy, signature} = await getKs3Config();
const protocal = window.location.protocol === 'https:' ? 'https' : 'http';
const uploadURL = `${protocal}://${KS3_CONST.DOMAIN}/${bucket}`;
// return new Promise((resolve, reject) => {
// CommonServer.getKsOssSign().then(res => {
// const { accessid, policy, signature } = res
const formData = new FormData()
formData.append('acl', 'public-read')
formData.append('key', objectId)
formData.append('signature', signature)
formData.append('KSSAccessKeyId', KS3_CONST.AccessKeyID)
formData.append('policy', policy)
formData.append('file', file)
const res = await axios.post(uploadURL, formData).then(res => {
console.log(66666 ,res)
// const { status } = res
// if (status === 200) {
// const data = {
// url: `${OSS_URL}/${key}`,
// type: fileType(file.name)
// }
// resolve(data)
// } else {
// reject(res)
// }
})
// .catch(err => {
// reject(err)
// })
return res;
// }).catch(err => {})
// })
}
\ No newline at end of file
import axios from '../utils/request'; import axios from '../utils/request';
// import qs from 'qs'; // import qs from 'qs';
//角色列表 //角色列表
export async function getRole_list (page, page_size, role_status, role_name) { export async function getRole_list (parmasRole_list) {
const res = await axios.post("/api/v1/merchant/authority/role_list", { const res = await axios.post("/api/v1/merchant/authority/role_list", parmasRole_list)
page, page_size, role_status, role_name
})
return res; return res;
} }
//添加角色 //添加角色
export async function getAdd_role (role_name, permissions) { export async function getAdd_role (parmasAdd_role) {
const res = await axios.post("/api/v1/merchant/authority/add_role", { const res = await axios.post("/api/v1/merchant/authority/add_role", parmasAdd_role)
role_name, permissions
})
return res; return res;
} }
//角色编辑 //角色编辑
export async function getUpdate_role (op_cur_user, role_name, role_id, role_status, permissions) { export async function getUpdate_role (parmasUpdate_role) {
const res = await axios.post("/api/v1/merchant/authority/update_role", { const res = await axios.post("/api/v1/merchant/authority/update_role", parmasUpdate_role)
op_cur_user, role_name, role_id, role_status, permissions
})
return res; return res;
} }
//角色详情 //角色详情
...@@ -37,9 +31,9 @@ export async function getDelete_role (role_id) { ...@@ -37,9 +31,9 @@ export async function getDelete_role (role_id) {
} }
//权限列表 //权限列表
export async function getAll_role_list (user_name, user_email) { export async function getAll_role_list (user_email) {
const res = await axios.post("/api/v1/merchant/authority/get_role_list", { const res = await axios.post("/api/v1/merchant/authority/get_role_list", {
user_name, user_email user_email
}) })
return res.permissions; return res.permissions;
} }
...@@ -15,10 +15,26 @@ export async function getPermissions (email) { ...@@ -15,10 +15,26 @@ export async function getPermissions (email) {
console.log("fe service, getPermissions:::", email) console.log("fe service, getPermissions:::", email)
return await axios.get("/api/v1/user/get_permissions", { params: { email } }); return await axios.get("/api/v1/user/get_permissions", { params: { email } });
} }
export async function getUserList (params) {
return await axios.get("/api/v1/users", { params });
}
export async function getUserDetail (params) {
return await axios.get("/api/v1/users/detail", { params });
}
export async function editUser (data) {
return await axios.post("/api/v1/users/edit", { data });
}
export async function createUser (data) {
return await axios.post("/api/v1/users/new", { data });
}
//用户详情 //用户详情
export async function getUser_detail (user_id) { export async function getUser_detail (user_id) {
const res = await axios.post(`/api/v1/merchant/authority/get_user_info`, { const res = await axios.post(`/api/v1/merchant/authority/get_user_info`, {
user_id user_id
}) })
return res.result; return res.result;
} }
\ No newline at end of file
import { createStore } from "vuex"; import { createStore } from "vuex";
import { getPermissions } from '@/service/user'; import { getPermissions } from '@/service/user';
import { PERMISSIONNAME_PAGEMODULE } from '../config/pageconfig'
export default createStore({ export default createStore({
state: { state: {
...@@ -22,5 +23,25 @@ export default createStore({ ...@@ -22,5 +23,25 @@ export default createStore({
} }
}, },
modules: {}, modules: {},
getters: {} getters: {
subPermissions: state => {
const permissionCol = {};
(state.permissions || []).forEach(element => {
PERMISSIONNAME_PAGEMODULE[element.name] && (permissionCol[PERMISSIONNAME_PAGEMODULE[element.name]] = element.sub_permissions)
});
return permissionCol;
},
/**
*
* @param {*} module 模块名,可选值: enterprise, lifeNo, role, user
* @returns
*/
moduleSubPermissions: (state) => (module) => {
const permissionCol = {};
(state.permissions || []).forEach(element => {
PERMISSIONNAME_PAGEMODULE[element.name] && (permissionCol[PERMISSIONNAME_PAGEMODULE[element.name]] = element.sub_permissions)
});
return permissionCol[module];
}
}
}); });
// 包含权限相关的工具方法,注意要在vue的生命周期中调用这些方法,否则会有获取不到权限的问题 // 包含权限相关的工具方法,注意要在vue的生命周期中调用这些方法,否则会有获取不到权限的问题
import store from '../store' import store from '../store'
import { PAGEMODULE_PERMISSIONNAME, PERMISSIONNAME_PAGEMODULE, PATH_PERMISSION_NAME } from '../config/pageconfig' import { PATH_PERMISSION_NAME } from '../config/pageconfig'
function getPermissionObj () { function getPermissionObj () {
// 支持到二级权限 // 支持到二级权限
...@@ -40,22 +40,22 @@ export function checkPathAuth (path) { ...@@ -40,22 +40,22 @@ export function checkPathAuth (path) {
return true; return true;
} }
/** // /**
* 获取页面子权限 // * 获取页面子权限
* @param {*} module: 枚举值参考:PAGEMODULE_PERMISSIONNAME key // * @param {*} module: 枚举值参考:PAGEMODULE_PERMISSIONNAME key
* @returns 自权限列表 // * @returns 子权限列表
*/ // */
export function getModuleSubPermissions (module) { // export function getModuleSubPermissions(module) {
const authObj = getPermissionObj(); // const authObj = getPermissionObj() || {};
return Object.keys(authObj[PAGEMODULE_PERMISSIONNAME[module]]) // return Object.keys(authObj[PAGEMODULE_PERMISSIONNAME[module]])
} // }
/** // /**
* 获取一级权限 // * 获取一级权限
* @returns 一级权限列表 // * @returns 一级权限列表
*/ // */
export function getModulePermissions () { // export function getModulePermissions() {
const authObj = getPermissionObj(); // const authObj = getPermissionObj();
const modules = Object.keys(authObj).map(ele => PERMISSIONNAME_PAGEMODULE[ele]) // const modules = Object.keys(authObj).map(ele => PERMISSIONNAME_PAGEMODULE[ele])
return modules.filter(ele => !!ele) // return modules.filter(ele => !!ele)
} // }
\ No newline at end of file
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* axios封装 * axios封装
*/ */
import axios from "axios"; import axios from "axios";
import store from "@/store"
// import { ElMessage } from "element-plus"; // import { ElMessage } from "element-plus";
// import { APP_URI } from "../config/app.config"; // import { APP_URI } from "../config/app.config";
/** /**
...@@ -29,8 +30,12 @@ export const defaultConfig = { ...@@ -29,8 +30,12 @@ export const defaultConfig = {
* default params * default params
* @returns {} * @returns {}
*/ */
const getDefaultParams = () => { }; const getDefaultParams = () => {
const getDefaultHeaders = () => { }; return {
'op_cur_user': store.state.userInfo && store.state.userInfo.email
}
};
const getDefaultHeaders = () => {};
/** /**
* axios instance * axios instance
......
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