Merge pull request '头像裁切' (#145) from xbx into master
Reviewed-on: http://git.luyuan.tk/luyuan/beelink/pulls/145
This commit is contained in:
commit
1f37b07836
@ -13,6 +13,7 @@
|
|||||||
"ant-design-vue": "^2.0.0-beta.9",
|
"ant-design-vue": "^2.0.0-beta.9",
|
||||||
"axios": "^0.21.0",
|
"axios": "^0.21.0",
|
||||||
"core-js": "^3.6.5",
|
"core-js": "^3.6.5",
|
||||||
|
"cropperjs": "^1.5.9",
|
||||||
"dayjs": "^1.9.1",
|
"dayjs": "^1.9.1",
|
||||||
"postcss-pxtorem": "^5.1.1",
|
"postcss-pxtorem": "^5.1.1",
|
||||||
"tim-js-sdk": "^2.8.0",
|
"tim-js-sdk": "^2.8.0",
|
||||||
|
9
public/css/cropper.min.css
vendored
Normal file
9
public/css/cropper.min.css
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/*!
|
||||||
|
* Cropper.js v1.5.9
|
||||||
|
* https://fengyuanchen.github.io/cropperjs
|
||||||
|
*
|
||||||
|
* Copyright 2015-present Chen Fengyuan
|
||||||
|
* Released under the MIT license
|
||||||
|
*
|
||||||
|
* Date: 2020-09-10T13:16:21.689Z
|
||||||
|
*/.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}
|
@ -70,6 +70,7 @@
|
|||||||
}
|
}
|
||||||
})(1366, 1024);
|
})(1366, 1024);
|
||||||
</script>
|
</script>
|
||||||
|
<link href="/css/cropper.min.css" rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
#make{
|
#make{
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
@ -104,7 +105,7 @@
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js"></script>
|
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js"></script>
|
||||||
|
<script src="/js/cropper.min.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
10
public/js/cropper.min.js
vendored
Normal file
10
public/js/cropper.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
100
src/components/imghead.vue
Normal file
100
src/components/imghead.vue
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
<template>
|
||||||
|
<div class="imghead">
|
||||||
|
<img id="image" />
|
||||||
|
<div class="submit-btn" @click="sub">{{lan.$t("baocun") }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.imghead {
|
||||||
|
padding-top:0.3rem;
|
||||||
|
width: 550px;
|
||||||
|
// height: 550px;
|
||||||
|
// overflow: hidden;
|
||||||
|
#image{
|
||||||
|
width: 500px;
|
||||||
|
height: 500px;
|
||||||
|
}
|
||||||
|
.submit-btn {
|
||||||
|
width: 63px;
|
||||||
|
height: 23px;
|
||||||
|
background: #08ae98;
|
||||||
|
border-radius: 3px;
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #ffffff;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 23px;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
margin: 20px 0 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script lang="ts">
|
||||||
|
import { useI18n } from '@/utils/i18n';
|
||||||
|
import { uploadflie } from '@/utils/vod';
|
||||||
|
import { defineComponent, onMounted } from "vue";
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
url: {
|
||||||
|
type: File,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props, ctx) {
|
||||||
|
const lan: any = useI18n();
|
||||||
|
let CROPPER: any;
|
||||||
|
onMounted(() => {
|
||||||
|
const reader = new FileReader();
|
||||||
|
if (props.url) {
|
||||||
|
reader.readAsDataURL(props.url);
|
||||||
|
reader.onload = () => {
|
||||||
|
const dataURL = reader.result;
|
||||||
|
//将img的src改为刚上传的文件的转换格式
|
||||||
|
const image: any = document.querySelector("#image");
|
||||||
|
console.log(image)
|
||||||
|
if(image){
|
||||||
|
console.log(110)
|
||||||
|
image.src = dataURL;
|
||||||
|
//创建cropper实例-----------------------------------------
|
||||||
|
CROPPER = new window.Cropper(image, {
|
||||||
|
aspectRatio: 1,
|
||||||
|
viewMode: 1,
|
||||||
|
background: false,
|
||||||
|
zoomable: false
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
function sub(){
|
||||||
|
if(CROPPER){
|
||||||
|
CROPPER.getCroppedCanvas({
|
||||||
|
maxWidth: 4096,
|
||||||
|
maxHeight: 4096,
|
||||||
|
fillColor: '#fff',
|
||||||
|
imageSmoothingEnabled: true,
|
||||||
|
imageSmoothingQuality: 'high',
|
||||||
|
}).toBlob(async (blob: any) => {
|
||||||
|
//之后就可以愉快的将blob数据发送至后端啦,可根据自己情况进行发送,我这里用的是axios
|
||||||
|
// 第三个参数为文件名,可选填.
|
||||||
|
const file = new File([blob], 'name.png',{type: "image/png"});
|
||||||
|
const res = await uploadflie(file, (info: any) => {
|
||||||
|
console.log(info);
|
||||||
|
});
|
||||||
|
ctx.emit("upload", res)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
lan,
|
||||||
|
sub
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
2
src/import-png.d.ts
vendored
2
src/import-png.d.ts
vendored
@ -29,3 +29,5 @@ declare module 'vue-cropper'{
|
|||||||
declare var FB: any;
|
declare var FB: any;
|
||||||
|
|
||||||
declare var TCPlayer: any;
|
declare var TCPlayer: any;
|
||||||
|
|
||||||
|
declare var Cropper: any;
|
@ -509,6 +509,9 @@
|
|||||||
<a-modal v-model:visible="huobi" :footer="null" :title="lan.$t('tishi')" >
|
<a-modal v-model:visible="huobi" :footer="null" :title="lan.$t('tishi')" >
|
||||||
<p>{{lan.$t('huobitishi')}}</p>
|
<p>{{lan.$t('huobitishi')}}</p>
|
||||||
</a-modal>
|
</a-modal>
|
||||||
|
<a-modal v-model:visible="touxiang" width="6rem" :footer="null">
|
||||||
|
<imghead @upload="imgupload" v-if="touxiang" :url="imgfire"></imghead>
|
||||||
|
</a-modal>
|
||||||
<nav-bottom></nav-bottom>
|
<nav-bottom></nav-bottom>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -530,6 +533,7 @@ import { uploadflie } from "@/utils/vod";
|
|||||||
import store from "@/store";
|
import store from "@/store";
|
||||||
import smile from "@/static/images/smile.png";
|
import smile from "@/static/images/smile.png";
|
||||||
import smilet from "@/static/images/smilet.png";
|
import smilet from "@/static/images/smilet.png";
|
||||||
|
import imghead from "@/components/imghead.vue"
|
||||||
import {
|
import {
|
||||||
changetel,
|
changetel,
|
||||||
checksmscode,
|
checksmscode,
|
||||||
@ -556,10 +560,12 @@ export default defineComponent({
|
|||||||
UserOutlined,
|
UserOutlined,
|
||||||
PlaySquareOutlined,
|
PlaySquareOutlined,
|
||||||
NavBottom,
|
NavBottom,
|
||||||
|
imghead
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
let issum = true;
|
let issum = true;
|
||||||
const lan: any = useI18n();
|
const lan: any = useI18n();
|
||||||
|
const touxiang = ref(false);
|
||||||
interface SpeakItem {
|
interface SpeakItem {
|
||||||
lang: string;
|
lang: string;
|
||||||
proficiency: number;
|
proficiency: number;
|
||||||
@ -996,17 +1002,27 @@ export default defineComponent({
|
|||||||
userinfo.value.currencyValue = e;
|
userinfo.value.currencyValue = e;
|
||||||
// editsystemsetting({currency:e})
|
// editsystemsetting({currency:e})
|
||||||
}
|
}
|
||||||
|
const imgfire = ref<any>()
|
||||||
async function uploadspic(file: AntUpload) {
|
async function uploadspic(file: AntUpload) {
|
||||||
const res = await uploadflie(file.file, (info: any) => {
|
// const res = await uploadflie(file.file, (info: any) => {
|
||||||
console.log(info);
|
// console.log(info);
|
||||||
// uploadpicprogress.value = info.percent.toFixed(2) * 100;
|
// // uploadpicprogress.value = info.percent.toFixed(2) * 100;
|
||||||
});
|
// });
|
||||||
console.log(res);
|
// console.log(res);
|
||||||
|
|
||||||
// picinfo.fileId=res.fileId
|
// // picinfo.fileId=res.fileId
|
||||||
// picinfo.url=res.video.url
|
// // picinfo.url=res.video.url
|
||||||
|
// formData.value.img = res.video.url;
|
||||||
|
// setheadimg(res.video.url);
|
||||||
|
console.log(file.file)
|
||||||
|
imgfire.value = file.file;
|
||||||
|
touxiang.value = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
function imgupload(res: any){
|
||||||
formData.value.img = res.video.url;
|
formData.value.img = res.video.url;
|
||||||
setheadimg(res.video.url);
|
setheadimg(res.video.url);
|
||||||
|
touxiang.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// function beforeVideoUpload(file: any){
|
// function beforeVideoUpload(file: any){
|
||||||
@ -1081,7 +1097,10 @@ export default defineComponent({
|
|||||||
video,
|
video,
|
||||||
imgs,
|
imgs,
|
||||||
mrqh,
|
mrqh,
|
||||||
huobi
|
huobi,
|
||||||
|
touxiang,
|
||||||
|
imgfire,
|
||||||
|
imgupload
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -3117,6 +3117,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
|
|||||||
safe-buffer "^5.0.1"
|
safe-buffer "^5.0.1"
|
||||||
sha.js "^2.4.8"
|
sha.js "^2.4.8"
|
||||||
|
|
||||||
|
cropperjs@^1.5.9:
|
||||||
|
version "1.5.9"
|
||||||
|
resolved "https://registry.npm.taobao.org/cropperjs/download/cropperjs-1.5.9.tgz?cache=0&sync_timestamp=1599745509586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcropperjs%2Fdownload%2Fcropperjs-1.5.9.tgz#4ff9d31e02ad04d2fc5df0044207c2ad53d99da8"
|
||||||
|
integrity sha1-T/nTHgKtBNL8XfAEQgfCrVPZnag=
|
||||||
|
|
||||||
cross-spawn@^3.0.0:
|
cross-spawn@^3.0.0:
|
||||||
version "3.0.1"
|
version "3.0.1"
|
||||||
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
|
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
|
||||||
|
Loading…
Reference in New Issue
Block a user