style: 优化头像裁剪框样式
This commit is contained in:
parent
be4c3376dd
commit
28f4791833
6
continew-admin-ui/pnpm-lock.yaml
generated
6
continew-admin-ui/pnpm-lock.yaml
generated
@ -60,7 +60,7 @@ dependencies:
|
|||||||
version: 3.3.4
|
version: 3.3.4
|
||||||
vue-cropper:
|
vue-cropper:
|
||||||
specifier: ^1.0.9
|
specifier: ^1.0.9
|
||||||
version: 1.0.9
|
version: 1.1.1
|
||||||
vue-echarts:
|
vue-echarts:
|
||||||
specifier: ^6.6.1
|
specifier: ^6.6.1
|
||||||
version: 6.6.1(echarts@5.4.3)(vue@3.3.4)
|
version: 6.6.1(echarts@5.4.3)(vue@3.3.4)
|
||||||
@ -9872,6 +9872,10 @@ packages:
|
|||||||
fsevents: 2.3.2
|
fsevents: 2.3.2
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/vue-cropper@1.1.1:
|
||||||
|
resolution: {integrity: sha512-WsqKMpaBf9Osi1LQlE/5AKdD0nHWOy1asLXocaG8NomOWO07jiZi968+/PbMmnD0QbPJOumDQaGuGa13qys85A==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/vue-demi@0.13.11(vue@3.3.4):
|
/vue-demi@0.13.11(vue@3.3.4):
|
||||||
resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==}
|
resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
|
@ -74,7 +74,7 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
.tags-wrap {
|
.tags-wrap {
|
||||||
padding: 4px 0;
|
padding: 4px 0;
|
||||||
height: 48px;
|
height: 42px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
|
|
||||||
|
@ -20,56 +20,49 @@
|
|||||||
</a-avatar>
|
</a-avatar>
|
||||||
</template>
|
</template>
|
||||||
</a-upload>
|
</a-upload>
|
||||||
|
<a-modal
|
||||||
<div class="main">
|
:title="$t('userCenter.panel.avatar.upload')"
|
||||||
<a-modal
|
:visible="visible"
|
||||||
:visible="cropperVisible"
|
:width="400"
|
||||||
width="40%"
|
:footer="false"
|
||||||
:footer="false"
|
unmount-on-close
|
||||||
unmount-on-close
|
render-to-body
|
||||||
render-to-body
|
@cancel="handleCancel"
|
||||||
@cancel="handleCropperCancel"
|
>
|
||||||
>
|
<a-row>
|
||||||
<a-row>
|
<a-col :span="14" style="width: 200px; height: 200px">
|
||||||
<a-col :span="14">
|
<vue-cropper
|
||||||
<div style="width: 370px; height: 370px">
|
ref="cropperRef"
|
||||||
<!-- 头像裁剪框 -->
|
:img="options.img"
|
||||||
<vue-cropper
|
:info="true"
|
||||||
ref="cropper"
|
:auto-crop="options.autoCrop"
|
||||||
:info="true"
|
:auto-crop-width="options.autoCropWidth"
|
||||||
:img="options.img"
|
:auto-crop-height="options.autoCropHeight"
|
||||||
:full="options.full"
|
:fixed-box="options.fixedBox"
|
||||||
:fixed="options.fixed"
|
:fixed="options.fixed"
|
||||||
:fixed-box="options.fixedBox"
|
:full="options.full"
|
||||||
:can-move="options.canMove"
|
:center-box="options.centerBox"
|
||||||
:center-box="options.centerBox"
|
:can-move="options.canMove"
|
||||||
:auto-crop="options.autoCrop"
|
:output-type="options.outputType"
|
||||||
:auto-crop-width="options.autoCropWidth"
|
:output-size="options.outputSize"
|
||||||
:auto-crop-height="options.autoCropHeight"
|
@real-time="handleRealTime"
|
||||||
:output-type="options.outputType"
|
/>
|
||||||
:output-size="options.outputSize"
|
</a-col>
|
||||||
@realTime="realTime"
|
<a-col :span="10" style="display: flex; justify-content: center">
|
||||||
/>
|
<div :style="previewStyle">
|
||||||
|
<div :style="previews.div">
|
||||||
|
<img :src="previews.url" :style="previews.img" alt="" />
|
||||||
</div>
|
</div>
|
||||||
</a-col>
|
</div>
|
||||||
<a-col :span="6">
|
</a-col>
|
||||||
<!-- 实时预览 -->
|
</a-row>
|
||||||
<div :style="previewStyle">
|
<div style="text-align: center; padding-top: 30px">
|
||||||
<div :style="previews.div">
|
|
||||||
<img :src="previews.url" :style="previews.img" alt="" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
<br />
|
|
||||||
<a-space>
|
<a-space>
|
||||||
<a-button type="primary" @click="handleUpload">提交</a-button>
|
<a-button type="primary" @click="handleUpload">确定</a-button>
|
||||||
<a-button type="outline" @click="handleCropperCancel"
|
<a-button @click="handleCancel">取消</a-button>
|
||||||
>取消</a-button
|
|
||||||
>
|
|
||||||
</a-space>
|
</a-space>
|
||||||
</a-modal>
|
</div>
|
||||||
</div>
|
</a-modal>
|
||||||
|
|
||||||
<a-descriptions
|
<a-descriptions
|
||||||
:column="2"
|
:column="2"
|
||||||
@ -122,19 +115,18 @@
|
|||||||
import { reactive, ref, getCurrentInstance } from 'vue';
|
import { reactive, ref, getCurrentInstance } from 'vue';
|
||||||
import { FileItem } from '@arco-design/web-vue';
|
import { FileItem } from '@arco-design/web-vue';
|
||||||
import { uploadAvatar, cropperOptions } from '@/api/system/user-center';
|
import { uploadAvatar, cropperOptions } from '@/api/system/user-center';
|
||||||
import getAvatar from '@/utils/avatar';
|
|
||||||
import { useUserStore } from '@/store';
|
import { useUserStore } from '@/store';
|
||||||
|
import getAvatar from '@/utils/avatar';
|
||||||
import { VueCropper } from 'vue-cropper';
|
import { VueCropper } from 'vue-cropper';
|
||||||
import 'vue-cropper/dist/index.css';
|
import 'vue-cropper/dist/index.css';
|
||||||
|
|
||||||
const fileRef = ref(reactive({ name: 'avatar.png' }));
|
|
||||||
const previews: any = ref({});
|
|
||||||
const previewStyle: any = ref({});
|
|
||||||
const cropperVisible = ref(false);
|
|
||||||
const cropper = ref();
|
|
||||||
const { proxy } = getCurrentInstance() as any;
|
const { proxy } = getCurrentInstance() as any;
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
const cropperRef = ref();
|
||||||
|
const visible = ref(false);
|
||||||
|
const previews: any = ref({});
|
||||||
|
const previewStyle: any = ref({});
|
||||||
|
const fileRef = ref(reactive({ name: 'avatar.png' }));
|
||||||
const avatar = {
|
const avatar = {
|
||||||
uid: '-2',
|
uid: '-2',
|
||||||
name: 'avatar.png',
|
name: 'avatar.png',
|
||||||
@ -143,15 +135,15 @@
|
|||||||
const avatarList = ref<FileItem[]>([avatar]);
|
const avatarList = ref<FileItem[]>([avatar]);
|
||||||
|
|
||||||
const options: cropperOptions = reactive({
|
const options: cropperOptions = reactive({
|
||||||
autoCrop: true,
|
|
||||||
autoCropWidth: 200,
|
|
||||||
autoCropHeight: 200,
|
|
||||||
canMove: true,
|
|
||||||
centerBox: true,
|
|
||||||
full: false,
|
|
||||||
fixed: false,
|
|
||||||
fixedBox: false,
|
|
||||||
img: '',
|
img: '',
|
||||||
|
autoCrop: true,
|
||||||
|
autoCropWidth: 160,
|
||||||
|
autoCropHeight: 160,
|
||||||
|
fixedBox: true,
|
||||||
|
fixed: true,
|
||||||
|
full: false,
|
||||||
|
centerBox: true,
|
||||||
|
canMove: true,
|
||||||
outputSize: 1,
|
outputSize: 1,
|
||||||
outputType: 'png',
|
outputType: 'png',
|
||||||
});
|
});
|
||||||
@ -168,46 +160,47 @@
|
|||||||
reader.onload = () => {
|
reader.onload = () => {
|
||||||
options.img = reader.result;
|
options.img = reader.result;
|
||||||
};
|
};
|
||||||
cropperVisible.value = true;
|
visible.value = true;
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 关闭裁剪框
|
* 关闭裁剪框
|
||||||
*/
|
*/
|
||||||
const handleCropperCancel = () => {
|
const handleCancel = () => {
|
||||||
fileRef.value = { name: '' };
|
fileRef.value = { name: '' };
|
||||||
options.img = '';
|
options.img = '';
|
||||||
cropperVisible.value = false;
|
visible.value = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 上传头像
|
* 上传头像
|
||||||
*/
|
*/
|
||||||
const handleUpload = () => {
|
const handleUpload = () => {
|
||||||
cropper.value.getCropBlob((data: string | Blob) => {
|
cropperRef.value.getCropBlob((data: string | Blob) => {
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append('avatarFile', data, fileRef.value?.name);
|
formData.append('avatarFile', data, fileRef.value?.name);
|
||||||
uploadAvatar(formData).then((res) => {
|
uploadAvatar(formData).then((res) => {
|
||||||
userStore.avatar = res.data.avatar;
|
userStore.avatar = res.data.avatar;
|
||||||
avatarList.value[0].url = getAvatar(res.data.avatar, undefined);
|
avatarList.value[0].url = getAvatar(res.data.avatar, undefined);
|
||||||
proxy.$message.success(res.msg);
|
proxy.$message.success(res.msg);
|
||||||
handleCropperCancel();
|
handleCancel();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 实时预览
|
* 实时预览
|
||||||
* @param data data
|
*
|
||||||
|
* @param data data 预览图像
|
||||||
*/
|
*/
|
||||||
const realTime = (data: any) => {
|
const handleRealTime = (data: any) => {
|
||||||
previewStyle.value = {
|
previewStyle.value = {
|
||||||
width: `${data.w}px`,
|
width: `${data.w}px`,
|
||||||
height: `${data.h}px`,
|
height: `${data.h}px`,
|
||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
margin: '0',
|
margin: '0',
|
||||||
zoom: 0.8,
|
zoom: 100 / data.h,
|
||||||
borderRadius: '50%',
|
borderRadius: '50%',
|
||||||
};
|
};
|
||||||
previews.value = data;
|
previews.value = data;
|
||||||
@ -231,8 +224,4 @@
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.main {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -6,6 +6,7 @@ export default {
|
|||||||
|
|
||||||
// user-panel
|
// user-panel
|
||||||
'userCenter.panel.avatar': 'Avatar',
|
'userCenter.panel.avatar': 'Avatar',
|
||||||
|
'userCenter.panel.avatar.upload': 'Upload Avatar',
|
||||||
'userCenter.panel.label.nickname': 'Nick Name :',
|
'userCenter.panel.label.nickname': 'Nick Name :',
|
||||||
'userCenter.panel.label.gender': 'Gender :',
|
'userCenter.panel.label.gender': 'Gender :',
|
||||||
'userCenter.panel.label.phone': 'Phone :',
|
'userCenter.panel.label.phone': 'Phone :',
|
||||||
|
@ -6,6 +6,7 @@ export default {
|
|||||||
|
|
||||||
// user-panel
|
// user-panel
|
||||||
'userCenter.panel.avatar': '头像',
|
'userCenter.panel.avatar': '头像',
|
||||||
|
'userCenter.panel.avatar.upload': '上传头像',
|
||||||
'userCenter.panel.label.nickname': '昵称 :',
|
'userCenter.panel.label.nickname': '昵称 :',
|
||||||
'userCenter.panel.label.gender': '性别 :',
|
'userCenter.panel.label.gender': '性别 :',
|
||||||
'userCenter.panel.label.phone': '手机号码 :',
|
'userCenter.panel.label.phone': '手机号码 :',
|
||||||
|
Loading…
Reference in New Issue
Block a user