You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

237 lines
6.0 KiB

import WeCropper from '../../we-cropper/dist/we-cropper.min.js'
const rich_message = "检测到所选的图片中有敏感内容,请选择其他图片";
const app = getApp();
Page({
data: {
},
touchStart(e) {
this.mycropper.touchStart(e)
},
touchMove(e) {
this.mycropper.touchMove(e)
},
touchEnd(e) {
this.mycropper.touchEnd(e)
},
onGetUserInfo(e){
console.log(e);
let {detail:{userInfo}} = e;
if(userInfo&&userInfo.avatarUrl){
let path = userInfo.avatarUrl;
this.mycropper.pushOrign(path);
}else{
wx.showToast({
title: '微信头像获取失败',icon:"none"
})
}
},
async _checkImg({path}){
let match = path.match(/(\.[^\.]*?)$/)
if(match)
var ext = match[0];
else
var ext = ".jpg";
let cloudPath = "images/temp/"+ app.globalData.openid + "-" + Date.now() + ext;
let res = await wx.cloud.uploadFile({
cloudPath,
filePath: path
});
let {fileID} = res;
return app.openapi("security.imgSecCheck")({fileID});
},
checkImg({path}){
if(this.promise&&path==this.tmp_path)
return this.promise;
this.promise = this._checkImg({path});
this.tmp_path = path;
this.promise.then(res=>{
console.log(res);
if(res.errCode==87014){
wx.showToast({
title:rich_message,icon: "none",duration:5000
})
}
});
return this.promise;
},
onConfirm(){
this.setData({submitting:1});
if(!this.mycropper||!this.mycropper.src)
return wx.showToast({
title: '请先选取图片',icon:"none"
})
let {croperTarget} = this.mycropper;
wx.showLoading({
title: '检查图片中...',
})
this.checkImg({path: croperTarget}).then(res=>{
if(res.errCode==0)
this.startUpload();
else if(res.errCode==87014){
wx.hideLoading();
wx.showModal({
content:rich_message,showCancel: false
});
this.setData({submitting:0});
}else{
wx.showToast({
title: '发生了未知错误,请重试',icon:"none"
});
this.promise = null;
let {croperTarget} = this.mycropper;
this.checkImg({path:croperTarget});
this.setData({submitting:0});
wx.reportMonitor('2', 1);
global.realTimeLog.error("未知错误 checkImg1", res);
global.realTimeLog.setFilterMsg("unexpected");
}
}).catch(e=>{
wx.hideLoading();
wx.showToast({
title: '请求超时,请重试',icon:"none"
});
this.promise = null;
let {croperTarget} = this.mycropper;
this.checkImg({path:croperTarget});
this.setData({submitting:0});
wx.reportMonitor('2', 1);
global.realTimeLog.error("未知错误 checkImg2", e);
global.realTimeLog.setFilterMsg("unexpected");
})
},
uploadAvartar(filePath) {
return new Promise((resolve, reject) => {
wx.getFileSystemManager().readFile({
filePath,
encoding: "base64",
success: res => {
let image = "data:image/jpeg;base64," + res.data;
app.api("users.accounts.avatar")({ image }).then(resolve).catch(reject);
},
fail: reject
});
});
},
startUpload() {
this.setData({submitting:1});
this.mycropper.getCropperImage((avatar) => {
if (avatar) {
wx.showLoading({
title: '上传头像中',
});
this.uploadAvartar(avatar)
.then(res => {
wx.hideLoading();
wx.showToast({
title: '更改成功',
});
this.setData({submitting:0});
setTimeout(()=>{
wx.navigateBack({
delta: 1
});
},500);
}).catch(e => {
wx.hideLoading();
wx.showToast({
title: '上传失败',
icon: "none"
});
this.setData({submitting:0});
});
} else {
wx.showToast({
title: '图片截取失败',
icon: "none"
});
this.setData({submitting:0});
}
})
},
chooseImage({navback=0}={}) {
wx.chooseImage({
count: 1,
sizeType:["compressed"],
success:(res) =>{
let {path, size} = res.tempFiles[0];
if(!path&&navback){
wx.navigateBack({
delta:1
})
}
if(size>1e6){
// unexpected error
wx.reportMonitor('2', 1);
global.realTimeLog.error("头像超过大小",size);
global.realTimeLog.setFilterMsg("avatar");
wx.showToast({
title: '对不起,图片过大,请重新选择',icon:"none", duration:3000
});
return;
}
if(!this.mycropper)
this.initCanvas(path);
else{
this.mycropper.pushOrign(path)
}
},fail:e=>{
console.log(e);
if(navback)
wx.navigateBack({
delta:1
})
}
})
},
initCanvas(src="") {
const { cropperOpt } = this.data;
if(src)
Object.assign(cropperOpt, { src });
this.mycropper = new WeCropper(cropperOpt);
this.mycropper
.on('beforeImageLoad', (ctx) => {
wx.showLoading({title: '图片加载中'})
})
.on('imageLoad', (ctx) => {
let {croperTarget} = this.mycropper;
this.checkImg({path:croperTarget});
wx.hideLoading();
})
.updateCanvas();
},
setCanvasOptions:function(){
let device = wx.getSystemInfoSync();
let width = device.windowWidth;
let height = device.windowHeight - 42;
let cropperOpt = {
id: 'cropper',
scale: 3.2,
zoom: 8,
width,
height,
boundStyle:{
color:"#0080f0",
lineWidth: 1.2
},
cut: {
x: (width - 300) / 2,
y: (height - 300) / 2,
width: 300,
height: 300
}
}
this.setData({ cropperOpt});
},
onLoad(option) {
this.setCanvasOptions();
const { src="" } = option;
this.initCanvas(src);
this.chooseImage({navback:1})
}
})