unknown
3 months ago
21 changed files with 1421 additions and 63 deletions
-
2config/api.js
-
5config/site.config.js
-
9manifest.json
-
15pages.json
-
6pages/carEntry/signature/signature.vue
-
1pages/indexEntry/enroll/payment/payh5.vue
-
1pages/indexEntry/enroll/payment/payment.vue
-
12pages/indexEntry/findShcool/findShcool.vue
-
6pages/indexEntry/findShcool/screen/screen.vue
-
20pages/mineEntry/myOrder/detail/comp/refundInfo.vue
-
7pages/mineEntry/myOrder/detail/detail.vue
-
74pages/mineEntry/personaInfo/personaInfo.vue
-
9pages/mineEntry/refund/comp/myform.vue
-
16pages/mineEntry/refund/refund.vue
-
285pages/mineEntry/uAvatarCropper/uAvatarCropper - 副本.vue
-
260pages/mineEntry/uAvatarCropper/uAvatarCropper.vue
-
709pages/mineEntry/uAvatarCropper/weCropper.js
-
2pages/tabbar/index/comp/coachItem.vue
-
26pages/tabbar/index/index.vue
-
12pages/tabbar/mine/index.vue
-
7store/modules/user.js
@ -0,0 +1,285 @@ |
|||
<template> |
|||
<view class="content"> |
|||
<view class="cropper-wrapper" :style="{ height: cropperOpt.height + 'px' }"> |
|||
<canvas |
|||
class="cropper" |
|||
:disable-scroll="true" |
|||
@touchstart="touchStart" |
|||
@touchmove="touchMove" |
|||
@touchend="touchEnd" |
|||
:style="{ width: cropperOpt.width, height: cropperOpt.height, backgroundColor: 'rgba(0, 0, 0, 0.8)' }" |
|||
canvas-id="cropper" |
|||
id="cropper" |
|||
></canvas> |
|||
<canvas |
|||
class="cropper" |
|||
:disable-scroll="true" |
|||
:style="{ |
|||
position: 'fixed', |
|||
top: `-${cropperOpt.width * cropperOpt.pixelRatio}px`, |
|||
left: `-${cropperOpt.height * cropperOpt.pixelRatio}px`, |
|||
width: `${cropperOpt.width * cropperOpt.pixelRatio}px`, |
|||
height: `${cropperOpt.height * cropperOpt.pixelRatio}` |
|||
}" |
|||
canvas-id="targetId" |
|||
id="targetId" |
|||
></canvas> |
|||
</view> |
|||
<view class="cropper-buttons safe-area-padding" :style="{ height: bottomNavHeight + 'px' }"> |
|||
<view class="upload" @click="uploadTap">取消</view> |
|||
<view class="getCropperImage" @click="getCropperImage(false)">完成</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import WeCropper from './weCropper.js'; |
|||
export default { |
|||
props: { |
|||
// 裁剪矩形框的样式,其中可包含的属性为lineWidth-边框宽度(单位rpx),color: 边框颜色, |
|||
// mask-遮罩颜色,一般设置为一个rgba的透明度,如"rgba(0, 0, 0, 0.35)" |
|||
boundStyle: { |
|||
type: Object, |
|||
default() { |
|||
return { |
|||
lineWidth: 4, |
|||
borderColor: 'rgb(245, 245, 245)', |
|||
mask: 'rgba(0, 0, 0, 0.35)' |
|||
}; |
|||
} |
|||
}, |
|||
avatarSrc: { |
|||
type: String, |
|||
default: '' |
|||
} |
|||
// // 裁剪框宽度,单位rpx |
|||
// rectWidth: { |
|||
// type: [String, Number], |
|||
// default: 400 |
|||
// }, |
|||
// // 裁剪框高度,单位rpx |
|||
// rectHeight: { |
|||
// type: [String, Number], |
|||
// default: 400 |
|||
// }, |
|||
// // 输出图片宽度,单位rpx |
|||
// destWidth: { |
|||
// type: [String, Number], |
|||
// default: 400 |
|||
// }, |
|||
// // 输出图片高度,单位rpx |
|||
// destHeight: { |
|||
// type: [String, Number], |
|||
// default: 400 |
|||
// }, |
|||
// // 输出的图片类型,如果发现裁剪的图片很大,可能是因为设置为了"png",改成"jpg"即可 |
|||
// fileType: { |
|||
// type: String, |
|||
// default: 'jpg', |
|||
// }, |
|||
// // 生成的图片质量 |
|||
// // H5上无效,目前不考虑使用此参数 |
|||
// quality: { |
|||
// type: [Number, String], |
|||
// default: 1 |
|||
// } |
|||
}, |
|||
data() { |
|||
return { |
|||
// 底部导航的高度 |
|||
bottomNavHeight: 50, |
|||
originWidth: 200, |
|||
width: 0, |
|||
height: 0, |
|||
cropperOpt: { |
|||
id: 'cropper', |
|||
targetId: 'targetCropper', |
|||
pixelRatio: 1, |
|||
width: 0, |
|||
height: 0, |
|||
scale: 2.5, |
|||
zoom: 8, |
|||
cut: { |
|||
x: (this.width - this.originWidth) / 2, |
|||
y: (this.height - this.originWidth) / 2, |
|||
width: this.originWidth, |
|||
height: this.originWidth |
|||
}, |
|||
boundStyle: { |
|||
lineWidth: uni.upx2px(this.boundStyle.lineWidth), |
|||
mask: this.boundStyle.mask, |
|||
color: this.boundStyle.borderColor |
|||
} |
|||
}, |
|||
// 裁剪框和输出图片的尺寸,高度默认等于宽度 |
|||
// 输出图片宽度,单位px |
|||
destWidth: 200, |
|||
// 裁剪框宽度,单位px |
|||
rectWidth: 350, |
|||
// 输出的图片类型,如果'png'类型发现裁剪的图片太大,改成"jpg"即可 |
|||
fileType: 'png', |
|||
src: '', // 选择的图片路径,用于在点击确定时,判断是否选择了图片 |
|||
}; |
|||
}, |
|||
onLoad(options) { |
|||
|
|||
let rectInfo = uni.getSystemInfoSync(); |
|||
this.width = rectInfo.windowWidth; |
|||
this.height = rectInfo.windowHeight - this.bottomNavHeight; |
|||
this.cropperOpt.width = this.width; |
|||
this.cropperOpt.height = this.height; |
|||
this.cropperOpt.pixelRatio = rectInfo.pixelRatio; |
|||
|
|||
if (this.destWidth) this.destWidth = this.destWidth; |
|||
if (this.rectWidth) { |
|||
let rectWidth = Number(this.rectWidth); |
|||
this.cropperOpt.cut = { |
|||
x: (this.width - rectWidth) / 2, |
|||
y: (this.height - rectWidth) / 2, |
|||
width: rectWidth, |
|||
height: rectWidth |
|||
}; |
|||
} |
|||
this.rectWidth = this.rectWidth; |
|||
if (this.fileType) this.fileType = this.fileType; |
|||
// 初始化 |
|||
this.cropper = new WeCropper(this.cropperOpt) |
|||
.on('ready', ctx => { |
|||
// wecropper is ready for work! |
|||
}) |
|||
.on('beforeImageLoad', ctx => { |
|||
// before picture loaded, i can do something |
|||
}) |
|||
.on('imageLoad', ctx => { |
|||
// picture loaded |
|||
}) |
|||
.on('beforeDraw', (ctx, instance) => { |
|||
// before canvas draw,i can do something |
|||
}); |
|||
// 设置导航栏样式,以免用户在page.json中没有设置为黑色背景 |
|||
uni.setNavigationBarColor({ |
|||
frontColor: '#ffffff', |
|||
backgroundColor: '#000000' |
|||
}); |
|||
this.src = encodeURI(options.url) |
|||
// 获取裁剪图片资源后,给data添加src属性及其值 |
|||
this.cropper.pushOrign(this.src); |
|||
}, |
|||
methods: { |
|||
touchStart(e) { |
|||
this.cropper.touchStart(e); |
|||
}, |
|||
touchMove(e) { |
|||
this.cropper.touchMove(e); |
|||
}, |
|||
touchEnd(e) { |
|||
this.cropper.touchEnd(e); |
|||
}, |
|||
getCropperImage(isPre = false) { |
|||
if(!this.src) return this.$u.toast('请先选择图片再裁剪'); |
|||
|
|||
let cropper_opt = { |
|||
destHeight: Number(this.destWidth), // uni.canvasToTempFilePath要求这些参数为数值 |
|||
destWidth: Number(this.destWidth), |
|||
fileType: this.fileType |
|||
}; |
|||
this.cropper.getCropperImage(cropper_opt, (path, err) => { |
|||
if (err) { |
|||
uni.showModal({ |
|||
title: '温馨提示', |
|||
content: err.message |
|||
}); |
|||
} else { |
|||
if (isPre) { |
|||
uni.previewImage({ |
|||
current: '', // 当前显示图片的 http 链接 |
|||
urls: [path] // 需要预览的图片 http 链接列表 |
|||
}); |
|||
} else { |
|||
uni.$emit('uAvatarCropper', path); |
|||
uni.navigateBack() |
|||
} |
|||
} |
|||
}); |
|||
}, |
|||
uploadTap() { |
|||
uni.navigateBack() |
|||
return |
|||
const self = this; |
|||
uni.chooseImage({ |
|||
count: 1, // 默认9 |
|||
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 |
|||
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 |
|||
success: (res) => { |
|||
self.src = res.tempFilePaths[0]; |
|||
// 获取裁剪图片资源后,给data添加src属性及其值 |
|||
|
|||
self.cropper.pushOrign(this.src); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
}; |
|||
</script> |
|||
|
|||
<style scoped lang="scss"> |
|||
// @import '@/node_modules/uview-ui/libs/css/style.components.scss'; |
|||
|
|||
.content { |
|||
background: rgba(255, 255, 255, 1); |
|||
} |
|||
|
|||
.cropper { |
|||
position: absolute; |
|||
top: 0; |
|||
left: 0; |
|||
width: 100%; |
|||
height: 100%; |
|||
z-index: 11; |
|||
} |
|||
|
|||
.cropper-buttons { |
|||
background-color: #000000; |
|||
color: #eee; |
|||
} |
|||
|
|||
.cropper-wrapper { |
|||
position: relative; |
|||
// @include vue-flex; |
|||
display: flex; |
|||
flex-direction: row; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
width: 100%; |
|||
background-color: #000; |
|||
} |
|||
|
|||
.cropper-buttons { |
|||
width: 100vw; |
|||
// @include vue-flex; |
|||
display: flex; |
|||
flex-direction: row; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
position: fixed; |
|||
bottom: 0; |
|||
left: 0; |
|||
font-size: 28rpx; |
|||
} |
|||
|
|||
.cropper-buttons .upload, |
|||
.cropper-buttons .getCropperImage { |
|||
width: 50%; |
|||
text-align: center; |
|||
} |
|||
|
|||
.cropper-buttons .upload { |
|||
text-align: left; |
|||
padding-left: 50rpx; |
|||
} |
|||
|
|||
.cropper-buttons .getCropperImage { |
|||
text-align: right; |
|||
padding-right: 50rpx; |
|||
} |
|||
</style> |
@ -0,0 +1,260 @@ |
|||
<template> |
|||
<view class="content"> |
|||
<view class="cropper-wrapper" style="height:617px"> |
|||
<canvas |
|||
class="cropper" |
|||
disable-scroll="true" |
|||
@touchstart="touchStart" |
|||
@touchmove="touchMove" |
|||
@touchend="touchEnd" |
|||
:style="{ width: cropperOpt.width, height: cropperOpt.height }" |
|||
canvas-id="cropper" |
|||
></canvas> |
|||
</view> |
|||
<view class="cropper-buttons"> |
|||
<view class="upload" @tap="uploadTap">重新选择</view> |
|||
<view class="getCropperImage" @tap="getCropperImage">确定</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import weCropper from './weCropper'; |
|||
const device = uni.getSystemInfoSync(); |
|||
const width = device.windowWidth; |
|||
const height = device.windowHeight - 50; |
|||
console.log(device); |
|||
import { uploadImgApi } from '@/config/utils.js' |
|||
export default { |
|||
data() { |
|||
return { |
|||
cropperOpt: { |
|||
id: 'cropper', |
|||
width: width, |
|||
height: height, |
|||
scale: 2.5, |
|||
zoom: 8, |
|||
cut: { |
|||
x: (width - 240) / 2, |
|||
y: (height - 320) / 2, |
|||
width: 240, |
|||
height: 320 |
|||
} |
|||
}, |
|||
weCropper: '' |
|||
}; |
|||
}, |
|||
methods: { |
|||
back() { |
|||
uni.redirectTo({ |
|||
url: '../infoDetail/infoDetail' |
|||
}); |
|||
}, |
|||
touchStart(e) { |
|||
this.weCropper.touchStart(e); |
|||
}, |
|||
touchMove(e) { |
|||
this.weCropper.touchMove(e); |
|||
}, |
|||
touchEnd(e) { |
|||
this.weCropper.touchEnd(e); |
|||
}, |
|||
convertBase64UrlToBlob(dataURI, type) { |
|||
var binary = atob(dataURI.split(',')[1]); |
|||
var array = []; |
|||
for (var i = 0; i < binary.length; i++) { |
|||
array.push(binary.charCodeAt(i)); |
|||
} |
|||
return new Blob([new Uint8Array(array)], { type: type }, { filename: '1111.jpg' }); |
|||
}, |
|||
blobToDataURL(blob) { |
|||
var a = new FileReader(); |
|||
a.readAsDataURL(blob); //读取文件保存在result中 |
|||
a.onload = function(e) { |
|||
var getRes = e.target.result; //读取的结果在result中 |
|||
console.log(getRes); |
|||
}; |
|||
}, |
|||
getCropperImage() { |
|||
console.log('点击了确定') |
|||
let _this = this; |
|||
//let pathurl = url + '/user/upload';上传服务器地址 |
|||
this.weCropper.getCropperImage(avatar => { |
|||
console.log('有图片吗?') |
|||
console.log(avatar) |
|||
if (avatar) { |
|||
// 获取到裁剪后的图片 |
|||
// 获取到裁剪后的图片 |
|||
uploadImgApi(avatar, 'avatar').then((res)=>{ |
|||
console.log(res) |
|||
uni.setStorageSync('avatarBase64', res) |
|||
uni.navigateBack() |
|||
}).catch(()=>{ |
|||
_this.$u.toast('上传失败,请重试') |
|||
}) |
|||
//下面是上传到服务器的方法 |
|||
// uni.uploadFile({ |
|||
// url: pathurl, |
|||
// filePath: avatar, |
|||
// name: 'file', |
|||
// formData: { token: token, userId: userId}, |
|||
// success: res => { |
|||
// console.log('uploadImage success, res is:', res); |
|||
// uni.showToast({ |
|||
// title: '上传成功', |
|||
// icon: 'success', |
|||
// duration: 1000 |
|||
// }); |
|||
// }, |
|||
// ail: err => { |
|||
// console.log('uploadImage fail', err); |
|||
// uni.showModal({ |
|||
// content: err.errMsg, |
|||
// showCancel: false |
|||
// }); |
|||
// uni.hideLoading(); |
|||
// }, |
|||
// complete: () => { |
|||
// console.log('complate'); |
|||
// } |
|||
// }); |
|||
} else { |
|||
console.log('获取图片失败,请稍后重试'); |
|||
} |
|||
}); |
|||
}, |
|||
uploadTap() { |
|||
const self = this; |
|||
|
|||
uni.chooseImage({ |
|||
count: 1, // 默认9 |
|||
sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有 |
|||
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 |
|||
success(res) { |
|||
let src = res.tempFilePaths[0]; |
|||
// 获取裁剪图片资源后,给data添加src属性及其值 |
|||
|
|||
self.weCropper.pushOrign(src); |
|||
} |
|||
}); |
|||
} |
|||
}, |
|||
onLoad(option) { |
|||
// do something |
|||
const cropperOpt = this.cropperOpt; |
|||
const src = option.src; |
|||
if (src) { |
|||
Object.assign(cropperOpt, { |
|||
src |
|||
}); |
|||
|
|||
this.weCropper = new weCropper(cropperOpt) |
|||
.on('ready', function(ctx) {}) |
|||
.on('beforeImageLoad', ctx => { |
|||
uni.showToast({ |
|||
title: '上传中', |
|||
icon: 'loading', |
|||
duration: 3000 |
|||
}); |
|||
}) |
|||
.on('imageLoad', ctx => { |
|||
uni.hideToast(); |
|||
}); |
|||
} |
|||
} |
|||
}; |
|||
</script> |
|||
|
|||
<style> |
|||
.content { |
|||
background: rgba(255, 255, 255, 1); |
|||
} |
|||
|
|||
.head-list { |
|||
height: 43px; |
|||
width: 100%; |
|||
background: #ffffff; |
|||
justify-content: center; |
|||
align-items: center; |
|||
display: flex; |
|||
border-bottom: 1px solid rgba(244, 244, 244, 1); |
|||
} |
|||
|
|||
.head-info { |
|||
text-align: center; |
|||
font-size: 18px; |
|||
color: #000000; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.save-box { |
|||
position: absolute; |
|||
right: 0px; |
|||
width: 50px; |
|||
height: 43px; |
|||
line-height: 43px; |
|||
} |
|||
|
|||
.save { |
|||
color: rgba(98, 111, 252, 1); |
|||
font-size: 16px; |
|||
font-weight: 400; |
|||
} |
|||
|
|||
.icon-back { |
|||
margin-top: 11px; |
|||
width: 10px; |
|||
height: 18px; |
|||
color: #000000; |
|||
margin-left: 6px; |
|||
} |
|||
|
|||
.icon-back-box { |
|||
display: block; |
|||
position: absolute; |
|||
left: 6px; |
|||
height: 43px; |
|||
width: 30px; |
|||
align-items: center; |
|||
} |
|||
.cropper { |
|||
position: absolute; |
|||
top: 0; |
|||
left: 0; |
|||
width: 100%; |
|||
height: 100%; |
|||
} |
|||
|
|||
.cropper-buttons { |
|||
background-color: rgba(0, 0, 0, 0.95); |
|||
color: #04b00f; |
|||
} |
|||
.cropper-wrapper { |
|||
position: relative; |
|||
display: flex; |
|||
flex-direction: row; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
width: 100%; |
|||
background-color: #F0F0F0; |
|||
} |
|||
|
|||
.cropper-buttons { |
|||
width: 100vw; |
|||
height: 50px; |
|||
display: flex; |
|||
flex-direction: row; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
position: fixed; |
|||
bottom: 0; |
|||
left: 0; |
|||
line-height: 50px; |
|||
} |
|||
|
|||
.cropper-buttons .upload, |
|||
.cropper-buttons .getCropperImage { |
|||
width: 50%; |
|||
text-align: center; |
|||
} |
|||
</style> |
@ -0,0 +1,709 @@ |
|||
(function(global, factory) { |
|||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : |
|||
typeof define === 'function' && define.amd ? define(factory) : |
|||
(global.weCropper = factory()); |
|||
}(this, (function() { |
|||
'use strict'; |
|||
|
|||
/** |
|||
* Created by sail on 2017/6/11. |
|||
*/ |
|||
var device = void 0; |
|||
var TOUCH_STATE = ['touchstarted', 'touchmoved', 'touchended']; |
|||
|
|||
function firstLetterUpper(str) { |
|||
return str.charAt(0).toUpperCase() + str.slice(1); |
|||
} |
|||
|
|||
function setTouchState(instance) { |
|||
for (var _len = arguments.length, arg = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { |
|||
arg[_key - 1] = arguments[_key]; |
|||
} |
|||
|
|||
TOUCH_STATE.forEach(function(key, i) { |
|||
if (arg[i] !== undefined) { |
|||
instance[key] = arg[i]; |
|||
} |
|||
}); |
|||
} |
|||
|
|||
function validator(instance, o) { |
|||
Object.defineProperties(instance, o); |
|||
} |
|||
|
|||
function getDevice() { |
|||
if (!device) { |
|||
device = wx.getSystemInfoSync(); |
|||
} |
|||
return device; |
|||
} |
|||
|
|||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) { |
|||
return typeof obj; |
|||
} : function(obj) { |
|||
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; |
|||
}; |
|||
|
|||
|
|||
|
|||
|
|||
var classCallCheck = function(instance, Constructor) { |
|||
if (!(instance instanceof Constructor)) { |
|||
throw new TypeError("Cannot call a class as a function"); |
|||
} |
|||
}; |
|||
|
|||
var createClass = function() { |
|||
function defineProperties(target, props) { |
|||
for (var i = 0; i < props.length; i++) { |
|||
var descriptor = props[i]; |
|||
descriptor.enumerable = descriptor.enumerable || false; |
|||
descriptor.configurable = true; |
|||
if ("value" in descriptor) descriptor.writable = true; |
|||
Object.defineProperty(target, descriptor.key, descriptor); |
|||
} |
|||
} |
|||
|
|||
return function(Constructor, protoProps, staticProps) { |
|||
if (protoProps) defineProperties(Constructor.prototype, protoProps); |
|||
if (staticProps) defineProperties(Constructor, staticProps); |
|||
return Constructor; |
|||
}; |
|||
}(); |
|||
|
|||
|
|||
|
|||
|
|||
var slicedToArray = function() { |
|||
function sliceIterator(arr, i) { |
|||
var _arr = []; |
|||
var _n = true; |
|||
var _d = false; |
|||
var _e = undefined; |
|||
|
|||
try { |
|||
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { |
|||
_arr.push(_s.value); |
|||
|
|||
if (i && _arr.length === i) break; |
|||
} |
|||
} catch (err) { |
|||
_d = true; |
|||
_e = err; |
|||
} finally { |
|||
try { |
|||
if (!_n && _i["return"]) _i["return"](); |
|||
} finally { |
|||
if (_d) throw _e; |
|||
} |
|||
} |
|||
|
|||
return _arr; |
|||
} |
|||
|
|||
return function(arr, i) { |
|||
if (Array.isArray(arr)) { |
|||
return arr; |
|||
} else if (Symbol.iterator in Object(arr)) { |
|||
return sliceIterator(arr, i); |
|||
} else { |
|||
throw new TypeError("Invalid attempt to destructure non-iterable instance"); |
|||
} |
|||
}; |
|||
}(); |
|||
|
|||
var tmp = {}; |
|||
|
|||
var DEFAULT = { |
|||
id: { |
|||
default: 'cropper', |
|||
get: function get$$1() { |
|||
return tmp.id; |
|||
}, |
|||
set: function set$$1(value) { |
|||
if (typeof value !== 'string') {} |
|||
tmp.id = value; |
|||
} |
|||
}, |
|||
width: { |
|||
default: 750, |
|||
get: function get$$1() { |
|||
return tmp.width; |
|||
}, |
|||
set: function set$$1(value) { |
|||
tmp.width = value; |
|||
} |
|||
}, |
|||
height: { |
|||
default: 750, |
|||
get: function get$$1() { |
|||
return tmp.height; |
|||
}, |
|||
set: function set$$1(value) { |
|||
tmp.height = value; |
|||
} |
|||
}, |
|||
scale: { |
|||
default: 2.5, |
|||
get: function get$$1() { |
|||
return tmp.scale; |
|||
}, |
|||
set: function set$$1(value) { |
|||
tmp.scale = value; |
|||
} |
|||
}, |
|||
zoom: { |
|||
default: 5, |
|||
get: function get$$1() { |
|||
return tmp.zoom; |
|||
}, |
|||
set: function set$$1(value) { |
|||
tmp.zoom = value; |
|||
} |
|||
}, |
|||
src: { |
|||
default: 'cropper', |
|||
get: function get$$1() { |
|||
return tmp.src; |
|||
}, |
|||
set: function set$$1(value) { |
|||
tmp.src = value; |
|||
} |
|||
}, |
|||
cut: { |
|||
default: {}, |
|||
get: function get$$1() { |
|||
return tmp.cut; |
|||
}, |
|||
set: function set$$1(value) { |
|||
tmp.cut = value; |
|||
} |
|||
}, |
|||
onReady: { |
|||
default: null, |
|||
get: function get$$1() { |
|||
return tmp.ready; |
|||
}, |
|||
set: function set$$1(value) { |
|||
tmp.ready = value; |
|||
} |
|||
}, |
|||
onBeforeImageLoad: { |
|||
default: null, |
|||
get: function get$$1() { |
|||
return tmp.beforeImageLoad; |
|||
}, |
|||
set: function set$$1(value) { |
|||
tmp.beforeImageLoad = value; |
|||
} |
|||
}, |
|||
onImageLoad: { |
|||
default: null, |
|||
get: function get$$1() { |
|||
return tmp.imageLoad; |
|||
}, |
|||
set: function set$$1(value) { |
|||
tmp.imageLoad = value; |
|||
} |
|||
}, |
|||
onBeforeDraw: { |
|||
default: null, |
|||
get: function get$$1() { |
|||
return tmp.beforeDraw; |
|||
}, |
|||
set: function set$$1(value) { |
|||
tmp.beforeDraw = value; |
|||
} |
|||
} |
|||
}; |
|||
|
|||
/** |
|||
* Created by sail on 2017/6/11. |
|||
*/ |
|||
function prepare() { |
|||
var self = this; |
|||
|
|||
var _getDevice = getDevice(), |
|||
windowWidth = _getDevice.windowWidth; |
|||
|
|||
self.attachPage = function() { |
|||
var pages = getCurrentPages |
|||
// 获取到当前page上下文
|
|||
(); |
|||
var pageContext = pages[pages.length - 1]; |
|||
// 把this依附在Page上下文的wecropper属性上,便于在page钩子函数中访问
|
|||
pageContext.wecropper = self; |
|||
}; |
|||
|
|||
self.createCtx = function() { |
|||
var id = self.id; |
|||
|
|||
if (id) { |
|||
self.ctx = wx.createCanvasContext(id); |
|||
} |
|||
}; |
|||
|
|||
self.deviceRadio = windowWidth / 750; |
|||
self.deviceRadio=self.deviceRadio.toFixed(2) |
|||
} |
|||
|
|||
/** |
|||
* |
|||
*/ |
|||
function observer() { |
|||
var self = this; |
|||
|
|||
var EVENT_TYPE = ['ready', 'beforeImageLoad', 'beforeDraw', 'imageLoad']; |
|||
|
|||
self.on = function(event, fn) { |
|||
if (EVENT_TYPE.indexOf(event) > -1) { |
|||
if (typeof fn === 'function') { |
|||
event === 'ready' ? fn(self) : self['on' + firstLetterUpper(event)] = fn; |
|||
} |
|||
} |
|||
return self; |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* Created by sail on 2017/6/11. |
|||
*/ |
|||
function methods() { |
|||
var self = this; |
|||
|
|||
var deviceRadio = self.deviceRadio; |
|||
console.log(JSON.stringify(self)); |
|||
|
|||
var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度
|
|||
var boundHeight = self.height; // 裁剪框默认高度,即整个画布高度
|
|||
var _self$cut = self.cut, |
|||
_self$cut$x = _self$cut.x, |
|||
x = _self$cut$x === undefined ? 0 : _self$cut$x, |
|||
_self$cut$y = _self$cut.y, |
|||
y = _self$cut$y === undefined ? 0 : _self$cut$y, |
|||
_self$cut$width = _self$cut.width, |
|||
width = _self$cut$width === undefined ? boundWidth : _self$cut$width, |
|||
_self$cut$height = _self$cut.height, |
|||
height = _self$cut$height === undefined ? boundHeight : _self$cut$height; |
|||
|
|||
|
|||
self.updateCanvas = function() { |
|||
if (self.croperTarget) { |
|||
|
|||
// 画布绘制图片
|
|||
self.ctx.drawImage(self.croperTarget, self.imgLeft, self.imgTop, self.scaleWidth, self.scaleHeight); |
|||
} |
|||
typeof self.onBeforeDraw === 'function' && self.onBeforeDraw(self.ctx, self); |
|||
|
|||
self.setBoundStyle // 设置边界样式
|
|||
(); |
|||
self.ctx.draw(); |
|||
return self; |
|||
}; |
|||
|
|||
self.pushOrign = function(src) { |
|||
self.src = src; |
|||
|
|||
typeof self.onBeforeImageLoad === 'function' && self.onBeforeImageLoad(self.ctx, self); |
|||
|
|||
uni.getImageInfo({ |
|||
src: src, |
|||
success: function success(res) { |
|||
var innerAspectRadio = res.width / res.height; |
|||
self.croperTarget = res.path||src; |
|||
if (innerAspectRadio < width / height) { |
|||
self.rectX = x; |
|||
self.baseWidth = width; |
|||
self.baseHeight = width / innerAspectRadio; |
|||
self.rectY = y - Math.abs((height - self.baseHeight) / 2); |
|||
} else { |
|||
self.rectY = y; |
|||
self.baseWidth = height * innerAspectRadio; |
|||
self.baseHeight = height; |
|||
self.rectX = x - Math.abs((width - self.baseWidth) / 2); |
|||
} |
|||
|
|||
self.imgLeft = self.rectX; |
|||
self.imgTop = self.rectY; |
|||
self.scaleWidth = self.baseWidth; |
|||
self.scaleHeight = self.baseHeight; |
|||
|
|||
self.updateCanvas(); |
|||
|
|||
typeof self.onImageLoad === 'function' && self.onImageLoad(self.ctx, self); |
|||
} |
|||
}); |
|||
|
|||
self.update(); |
|||
return self; |
|||
}; |
|||
|
|||
self.getCropperImage = function() { |
|||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { |
|||
args[_key] = arguments[_key]; |
|||
} |
|||
|
|||
var id = self.id; |
|||
|
|||
var ARG_TYPE = toString.call(args[0]); |
|||
switch (ARG_TYPE) { |
|||
case '[object Object]': |
|||
var _args$0$quality = args[0].quality, |
|||
quality = _args$0$quality === undefined ? 10 : _args$0$quality; |
|||
console.log("quality--"+quality); |
|||
|
|||
uni.canvasToTempFilePath({ |
|||
canvasId: id, |
|||
x: x, |
|||
y: y, |
|||
width: width, |
|||
height: height, |
|||
destWidth: width * quality / (deviceRadio * 10), |
|||
destHeight: height * quality / (deviceRadio * 10), |
|||
success: function success(res) { |
|||
console.log(res); |
|||
typeof args[args.length - 1] === 'function' && args[args.length - 1](res.tempFilePath); |
|||
} |
|||
}); |
|||
break; |
|||
case '[object Function]': |
|||
uni.canvasToTempFilePath({ |
|||
canvasId: id, |
|||
x: x, |
|||
y: y, |
|||
fileType:"jpg", |
|||
width: width, |
|||
height: height, |
|||
destWidth: width , |
|||
destHeight: height, |
|||
success: function success(res) { |
|||
|
|||
typeof args[args.length - 1] === 'function' && args[args.length - 1](res.tempFilePath); |
|||
} |
|||
}); |
|||
break; |
|||
} |
|||
|
|||
return self; |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* Created by sail on 2017/6/11. |
|||
*/ |
|||
function update() { |
|||
var self = this; |
|||
if (!self.src) return; |
|||
|
|||
self.__oneTouchStart = function(touch) { |
|||
self.touchX0 = touch.x; |
|||
self.touchY0 = touch.y; |
|||
}; |
|||
|
|||
self.__oneTouchMove = function(touch) { |
|||
var xMove = void 0, |
|||
yMove = void 0; |
|||
//计算单指移动的距离
|
|||
if (self.touchended) { |
|||
return self.updateCanvas(); |
|||
} |
|||
xMove = touch.x - self.touchX0; |
|||
yMove = touch.y - self.touchY0; |
|||
|
|||
var imgLeft = self.rectX + xMove; |
|||
var imgTop = self.rectY + yMove; |
|||
|
|||
self.outsideBound(imgLeft, imgTop); |
|||
|
|||
self.updateCanvas(); |
|||
}; |
|||
|
|||
self.__twoTouchStart = function(touch0, touch1) { |
|||
var xMove = void 0, |
|||
yMove = void 0, |
|||
oldDistance = void 0; |
|||
|
|||
self.touchX1 = self.rectX + self.scaleWidth / 2; |
|||
self.touchY1 = self.rectY + self.scaleHeight / 2; |
|||
|
|||
//计算两指距离
|
|||
xMove = touch1.x - touch0.x; |
|||
yMove = touch1.y - touch0.y; |
|||
oldDistance = Math.sqrt(xMove * xMove + yMove * yMove); |
|||
|
|||
self.oldDistance = oldDistance; |
|||
}; |
|||
|
|||
self.__twoTouchMove = function(touch0, touch1) { |
|||
var xMove = void 0, |
|||
yMove = void 0, |
|||
newDistance = void 0; |
|||
var scale = self.scale, |
|||
zoom = self.zoom; |
|||
// 计算二指最新距离
|
|||
|
|||
xMove = touch1.x - touch0.x; |
|||
yMove = touch1.y - touch0.y; |
|||
newDistance = Math.sqrt(xMove * xMove + yMove * yMove |
|||
|
|||
// 使用0.005的缩放倍数具有良好的缩放体验
|
|||
); |
|||
self.newScale = self.oldScale + 0.001 * zoom * (newDistance - self.oldDistance); |
|||
|
|||
// 设定缩放范围
|
|||
self.newScale <= 1 && (self.newScale = 1); |
|||
self.newScale >= scale && (self.newScale = scale); |
|||
|
|||
self.scaleWidth = self.newScale * self.baseWidth; |
|||
self.scaleHeight = self.newScale * self.baseHeight; |
|||
var imgLeft = self.touchX1 - self.scaleWidth / 2; |
|||
var imgTop = self.touchY1 - self.scaleHeight / 2; |
|||
|
|||
self.outsideBound(imgLeft, imgTop); |
|||
|
|||
self.updateCanvas(); |
|||
}; |
|||
|
|||
self.__xtouchEnd = function() { |
|||
self.oldScale = self.newScale; |
|||
self.rectX = self.imgLeft; |
|||
self.rectY = self.imgTop; |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* Created by sail on 2017/6/11. |
|||
*/ |
|||
|
|||
var handle = { |
|||
// 图片手势初始监测
|
|||
touchStart: function touchStart(e) { |
|||
var self = this; |
|||
var _e$touches = slicedToArray(e.touches, 2), |
|||
touch0 = _e$touches[0], |
|||
touch1 = _e$touches[1]; |
|||
|
|||
console.log(JSON.stringify(touch1)); |
|||
if(!touch0.x){ |
|||
touch0.x=touch0.clientX; |
|||
touch0.y=touch0.clientY; |
|||
if(touch1){ |
|||
touch1.x=touch1.clientX; |
|||
touch1.y=touch1.clientY; |
|||
} |
|||
} |
|||
|
|||
setTouchState(self, true, null, null |
|||
|
|||
//计算第一个触摸点的位置,并参照改点进行缩放
|
|||
); |
|||
self.__oneTouchStart(touch0 |
|||
|
|||
// 两指手势触发
|
|||
); |
|||
if (e.touches.length >= 2) { |
|||
self.__twoTouchStart(touch0, touch1); |
|||
} |
|||
}, |
|||
|
|||
|
|||
// 图片手势动态缩放
|
|||
touchMove: function touchMove(e) { |
|||
var self = this; |
|||
|
|||
var _e$touches2 = slicedToArray(e.touches, 2), |
|||
touch0 = _e$touches2[0], |
|||
touch1 = _e$touches2[1]; |
|||
if(!touch0.x){ |
|||
touch0.x=touch0.clientX; |
|||
touch0.y=touch0.clientY; |
|||
if(touch1){ |
|||
touch1.x=touch1.clientX; |
|||
touch1.y=touch1.clientY; |
|||
} |
|||
} |
|||
setTouchState(self, null, true |
|||
|
|||
// 单指手势时触发
|
|||
); |
|||
if (e.touches.length === 1) { |
|||
self.__oneTouchMove(touch0); |
|||
} |
|||
// 两指手势触发
|
|||
if (e.touches.length >= 2) { |
|||
self.__twoTouchMove(touch0, touch1); |
|||
} |
|||
}, |
|||
touchEnd: function touchEnd(e) { |
|||
var self = this; |
|||
|
|||
setTouchState(self, false, false, true); |
|||
self.__xtouchEnd(); |
|||
} |
|||
}; |
|||
|
|||
/** |
|||
* Created by sail on 1017/6/12. |
|||
*/ |
|||
function cut() { |
|||
var self = this; |
|||
var deviceRadio = self.deviceRadio; |
|||
|
|||
var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度
|
|||
var boundHeight = self.height; |
|||
// 裁剪框默认高度,即整个画布高度
|
|||
var _self$cut = self.cut, |
|||
_self$cut$x = _self$cut.x, |
|||
x = _self$cut$x === undefined ? 0 : _self$cut$x, |
|||
_self$cut$y = _self$cut.y, |
|||
y = _self$cut$y === undefined ? 0 : _self$cut$y, |
|||
_self$cut$width = _self$cut.width, |
|||
width = _self$cut$width === undefined ? boundWidth : _self$cut$width, |
|||
_self$cut$height = _self$cut.height, |
|||
height = _self$cut$height === undefined ? boundHeight : _self$cut$height; |
|||
|
|||
/** |
|||
* 设置边界 |
|||
* @param imgLeft 图片左上角横坐标值 |
|||
* @param imgTop 图片左上角纵坐标值 |
|||
*/ |
|||
|
|||
self.outsideBound = function(imgLeft, imgTop) { |
|||
self.imgLeft = imgLeft >= x ? x : self.scaleWidth + imgLeft - x <= width ? x + width - self.scaleWidth : imgLeft; |
|||
|
|||
self.imgTop = imgTop >= y ? y : self.scaleHeight + imgTop - y <= height ? y + height - self.scaleHeight : imgTop; |
|||
}; |
|||
|
|||
/** |
|||
* 设置边界样式 |
|||
* @param color 边界颜色 |
|||
*/ |
|||
self.setBoundStyle = function() { |
|||
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, |
|||
_ref$color = _ref.color, |
|||
color = _ref$color === undefined ? '#04b00f' : _ref$color, |
|||
_ref$mask = _ref.mask, |
|||
mask = _ref$mask === undefined ? 'rgba(0, 0, 0, 0.3)' : _ref$mask, |
|||
_ref$lineWidth = _ref.lineWidth, |
|||
lineWidth = _ref$lineWidth === undefined ? 1 : _ref$lineWidth; |
|||
|
|||
// 绘制半透明层
|
|||
self.ctx.beginPath(); |
|||
self.ctx.setFillStyle(mask); |
|||
self.ctx.fillRect(0, 0, x, boundHeight); |
|||
self.ctx.fillRect(x, 0, width, y); |
|||
self.ctx.fillRect(x, y + height, width, boundHeight - y - height); |
|||
self.ctx.fillRect(x + width, 0, boundWidth - x - width, boundHeight); |
|||
self.ctx.fill |
|||
|
|||
// 设置边界左上角样式
|
|||
// 为使边界样式处于边界外边缘,此时x、y均要减少lineWidth
|
|||
(); |
|||
self.ctx.beginPath(); |
|||
self.ctx.setStrokeStyle(color); |
|||
self.ctx.setLineWidth(lineWidth); |
|||
self.ctx.moveTo(x - lineWidth, y + 10 - lineWidth); |
|||
self.ctx.lineTo(x - lineWidth, y - lineWidth); |
|||
self.ctx.lineTo(x + 10 - lineWidth, y - lineWidth); |
|||
self.ctx.stroke |
|||
|
|||
// 设置边界左下角样式
|
|||
// 为使边界样式处于边界外边缘,此时x要减少lineWidth、y要增加lineWidth
|
|||
(); |
|||
self.ctx.beginPath(); |
|||
self.ctx.setStrokeStyle(color); |
|||
self.ctx.setLineWidth(lineWidth); |
|||
self.ctx.moveTo(x - lineWidth, y + height - 10 + lineWidth); |
|||
self.ctx.lineTo(x - lineWidth, y + height + lineWidth); |
|||
self.ctx.lineTo(x + 10 - lineWidth, y + height + lineWidth); |
|||
self.ctx.stroke |
|||
|
|||
// 设置边界右上角样式
|
|||
// 为使边界样式处于边界外边缘,此时x要增加lineWidth、y要减少lineWidth
|
|||
(); |
|||
self.ctx.beginPath(); |
|||
self.ctx.setStrokeStyle(color); |
|||
self.ctx.setLineWidth(lineWidth); |
|||
self.ctx.moveTo(x + width - 10 + lineWidth, y - lineWidth); |
|||
self.ctx.lineTo(x + width + lineWidth, y - lineWidth); |
|||
self.ctx.lineTo(x + width + lineWidth, y + 10 - lineWidth); |
|||
self.ctx.stroke |
|||
|
|||
// 设置边界右下角样式
|
|||
// 为使边界样式处于边界外边缘,此时x、y均要增加lineWidth
|
|||
(); |
|||
self.ctx.beginPath(); |
|||
self.ctx.setStrokeStyle(color); |
|||
self.ctx.setLineWidth(lineWidth); |
|||
self.ctx.moveTo(x + width + lineWidth, y + height - 10 + lineWidth); |
|||
self.ctx.lineTo(x + width + lineWidth, y + height + lineWidth); |
|||
self.ctx.lineTo(x + width - 10 + lineWidth, y + height + lineWidth); |
|||
self.ctx.stroke(); |
|||
}; |
|||
} |
|||
|
|||
var __version__ = '1.1.4'; |
|||
|
|||
var weCropper = function() { |
|||
function weCropper(params) { |
|||
classCallCheck(this, weCropper); |
|||
|
|||
var self = this; |
|||
var _default = {}; |
|||
|
|||
validator(self, DEFAULT); |
|||
|
|||
Object.keys(DEFAULT).forEach(function(key) { |
|||
_default[key] = DEFAULT[key].default; |
|||
}); |
|||
Object.assign(self, _default, params); |
|||
|
|||
self.prepare(); |
|||
self.attachPage(); |
|||
self.createCtx(); |
|||
self.observer(); |
|||
self.cutt(); |
|||
self.methods(); |
|||
self.init(); |
|||
self.update(); |
|||
|
|||
return self; |
|||
} |
|||
|
|||
createClass(weCropper, [{ |
|||
key: 'init', |
|||
value: function init() { |
|||
var self = this; |
|||
var src = self.src; |
|||
|
|||
|
|||
self.version = __version__; |
|||
|
|||
typeof self.onReady === 'function' && self.onReady(self.ctx, self); |
|||
|
|||
if (src) { |
|||
self.pushOrign(src); |
|||
} |
|||
setTouchState(self, false, false, false); |
|||
|
|||
self.oldScale = 1; |
|||
self.newScale = 1; |
|||
|
|||
return self; |
|||
} |
|||
}]); |
|||
return weCropper; |
|||
}(); |
|||
|
|||
Object.assign(weCropper.prototype, handle); |
|||
|
|||
|
|||
weCropper.prototype.prepare = prepare; |
|||
weCropper.prototype.observer = observer; |
|||
weCropper.prototype.methods = methods; |
|||
weCropper.prototype.cutt = cut; |
|||
weCropper.prototype.update = update; |
|||
|
|||
return weCropper; |
|||
|
|||
}))); |
Write
Preview
Loading…
Cancel
Save
Reference in new issue