2022-11-22 07:45:36 +00:00
|
|
|
import $store from '@/sheep/store';
|
|
|
|
import { staticUrl } from '@/sheep/config';
|
|
|
|
|
|
|
|
const cdn = (url = '', cdnurl = '') => {
|
|
|
|
if (!url) return '';
|
|
|
|
if (url.indexOf('http') === 0) {
|
|
|
|
return url;
|
|
|
|
}
|
|
|
|
if (cdnurl === '') {
|
|
|
|
cdnurl = $store('app').info.cdnurl;
|
|
|
|
}
|
|
|
|
return cdnurl + url;
|
|
|
|
};
|
|
|
|
export default {
|
|
|
|
// 添加cdn域名前缀
|
|
|
|
cdn,
|
|
|
|
// 对象存储自动剪裁缩略图
|
|
|
|
thumb: (url = '', params) => {
|
|
|
|
url = cdn(url);
|
|
|
|
return append_thumbnail_params(url, params);
|
|
|
|
},
|
|
|
|
// 静态资源地址
|
|
|
|
static: (url = '', staticurl = '') => {
|
|
|
|
if (staticurl === '') {
|
|
|
|
staticurl = staticUrl;
|
|
|
|
}
|
|
|
|
if (staticurl !== 'local') {
|
|
|
|
url = cdn(url, staticurl);
|
|
|
|
}
|
|
|
|
return url;
|
|
|
|
},
|
|
|
|
// css背景图片地址
|
|
|
|
css: (url = '', staticurl = '') => {
|
|
|
|
if (staticurl === '') {
|
|
|
|
staticurl = staticUrl;
|
|
|
|
}
|
|
|
|
if (staticurl !== 'local') {
|
|
|
|
url = cdn(url, staticurl);
|
|
|
|
}
|
|
|
|
// #ifdef APP-PLUS
|
|
|
|
if (staticurl === 'local') {
|
|
|
|
url = plus.io.convertLocalFileSystemURL(url);
|
|
|
|
}
|
|
|
|
// #endif
|
|
|
|
return `url(${url})`;
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 追加对象存储自动裁剪/压缩参数
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
function append_thumbnail_params(url, params) {
|
|
|
|
const filesystem = $store('app').info.filesystem;
|
|
|
|
if (filesystem === 'public') {
|
|
|
|
return url;
|
|
|
|
}
|
|
|
|
let width = params.width || '200'; // 宽度
|
|
|
|
let height = params.height || '200'; // 高度
|
|
|
|
let mode = params.mode || 'lfit'; // 缩放模式
|
|
|
|
let quality = params.quality || 90; // 压缩质量
|
|
|
|
let gravity = params.gravity || 'center'; // 剪裁质量
|
|
|
|
let suffix = '';
|
|
|
|
let crop_str = '';
|
|
|
|
let quality_str = '';
|
|
|
|
let size = width + 'x' + height;
|
|
|
|
switch (filesystem) {
|
|
|
|
case 'aliyun':
|
|
|
|
// 裁剪
|
|
|
|
if (!gravity && gravity != 'center') {
|
|
|
|
// 指定了裁剪区域
|
|
|
|
mode = 'mfit';
|
2024-03-04 03:46:48 +00:00
|
|
|
crop_str = '/crop,g_' + gravityFormatMap('aliyun', gravity) + ',w_' + width + ',h_' + height;
|
2022-11-22 07:45:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 质量压缩
|
|
|
|
if (quality > 0 && quality < 100) {
|
|
|
|
quality_str = '/quality,q_' + quality;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 缩放参数
|
|
|
|
suffix = 'x-oss-process=image/resize,m_' + mode + ',w_' + width + ',h_' + height;
|
|
|
|
|
|
|
|
// 拼接裁剪和质量压缩
|
|
|
|
suffix += crop_str + quality_str;
|
|
|
|
break;
|
|
|
|
case 'qcloud':
|
|
|
|
let mode_str = 'thumbnail';
|
|
|
|
if (mode == 'fill' || (!gravity && gravity != 'center')) {
|
|
|
|
// 指定了裁剪区域
|
|
|
|
mode_str = 'crop';
|
|
|
|
mode = 'fill';
|
2024-03-04 03:46:48 +00:00
|
|
|
crop_str = '/gravity/' + gravityFormatMap('qcloud', gravity);
|
2022-11-22 07:45:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 质量压缩
|
|
|
|
if (quality > 0 && quality < 100) {
|
|
|
|
quality_str = '/rquality/' + quality;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (mode) {
|
|
|
|
case 'lfit':
|
|
|
|
size = '' + size + '>';
|
|
|
|
break;
|
|
|
|
case 'mfit':
|
|
|
|
size = '!' + size + 'r';
|
|
|
|
case 'fill':
|
|
|
|
break;
|
|
|
|
case 'pad':
|
|
|
|
size = size + '/pad/1';
|
|
|
|
break;
|
|
|
|
case 'fixed':
|
|
|
|
size = size + '!';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
suffix = 'imageMogr2/' + mode_str + '/' + size + crop_str + quality_str;
|
|
|
|
break;
|
|
|
|
case 'qiniu':
|
|
|
|
if (mode == 'fill' || (!gravity && gravity != 'center')) {
|
|
|
|
// 指定了裁剪区域,全部转为 mfit
|
|
|
|
mode = 'mfit';
|
2024-03-04 03:46:48 +00:00
|
|
|
crop_str = '/gravity/' + gravityFormatMap('qiniu', gravity) + '/crop/' + size;
|
2022-11-22 07:45:36 +00:00
|
|
|
}
|
|
|
|
// 质量压缩
|
|
|
|
if (quality > 0 && quality < 100) {
|
|
|
|
quality_str = '/quality/' + quality;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (mode) {
|
|
|
|
case 'lfit':
|
|
|
|
case 'pad': // 七牛不支持在缩放之后,尺寸不足时,填充背景色,所以这里和 lfit 模式一样
|
|
|
|
size = size + '>';
|
|
|
|
break;
|
|
|
|
case 'mfit':
|
|
|
|
size = '!' + size + 'r';
|
|
|
|
break;
|
|
|
|
case 'fill':
|
|
|
|
// 会被转为 mfit
|
|
|
|
break;
|
|
|
|
case 'fixed':
|
|
|
|
size = size + '!';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
suffix = 'imageMogr2/thumbnail/' + size + crop_str + quality_str;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return url + '?' + suffix;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 裁剪区域格式转换
|
|
|
|
*
|
|
|
|
* @param string $type aliyun|qcloud|qiniu
|
|
|
|
* @param string $gravity 统一的裁剪区域字符
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
function gravityFormatMap(type, gravity) {
|
|
|
|
let gravityFormat = {
|
|
|
|
aliyun: {
|
|
|
|
north_west: 'nw', // 左上
|
|
|
|
north: 'north', // 中上
|
|
|
|
north_east: 'ne', // 右上
|
|
|
|
west: 'west', // 左中
|
|
|
|
center: 'center', // 中部
|
|
|
|
east: 'east', // 右中
|
|
|
|
south_west: 'sw', // 左下
|
|
|
|
south: 'south', // 中下
|
|
|
|
south_east: 'se', // 右下
|
|
|
|
},
|
|
|
|
qcloud: {
|
|
|
|
northwest: 'nw', // 左上
|
|
|
|
north: 'north', // 中上
|
|
|
|
northeast: 'ne', // 右上
|
|
|
|
west: 'west', // 左中
|
|
|
|
center: 'center', // 中部
|
|
|
|
east: 'east', // 右中
|
|
|
|
southwest: 'sw', // 左下
|
|
|
|
south: 'south', // 中下
|
|
|
|
southeast: 'se', // 右下
|
|
|
|
},
|
|
|
|
qiniu: {
|
|
|
|
NorthWest: 'nw', // 左上
|
|
|
|
North: 'north', // 中上
|
|
|
|
NorthEast: 'ne', // 右上
|
|
|
|
West: 'west', // 左中
|
|
|
|
Center: 'center', // 中部
|
|
|
|
East: 'east', // 右中
|
|
|
|
SouthWest: 'sw', // 左下
|
|
|
|
South: 'south', // 中下
|
|
|
|
SouthEast: 'se', // 右下
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
return gravityFormat[type][gravity];
|
|
|
|
}
|