wip: 图片裁剪

This commit is contained in:
kailong321200875 2023-11-14 17:59:44 +08:00
parent efc1c25db8
commit 19ccf8b518
7 changed files with 114 additions and 2 deletions

View File

@ -293,6 +293,14 @@ const adminList = [
meta: {
title: 'router.waterfall'
}
},
{
path: 'image-cropping',
component: 'views/Components/ImageCropping',
name: 'ImageCropping',
meta: {
title: 'router.imageCropping'
}
}
]
},
@ -651,6 +659,7 @@ const testList: string[] = [
'/components/infotip',
'/components/input-password',
'/components/waterfall',
'/components/image-cropping',
'function',
'/function/multiple-tabs',
'/function/multiple-tabs-demo/:id',

View File

@ -0,0 +1,3 @@
import ImageCropping from './src/ImageCropping.vue'
export { ImageCropping }

View File

@ -0,0 +1,76 @@
<script setup lang="ts">
import { useDesign } from '@/hooks/web/useDesign'
import { propTypes } from '@/utils/propTypes'
import { CSSProperties, computed } from 'vue'
const { getPrefixCls } = useDesign()
const prefixCls = getPrefixCls('image-cropping')
const bgIcon =
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC'
const props = defineProps({
imageUrl: propTypes.string,
boxWidth: propTypes.oneOfType([propTypes.number, propTypes.string]).def('100%'),
boxHeight: propTypes.oneOfType([propTypes.number, propTypes.string]).def('100%'),
dragWidth: propTypes.oneOfType([propTypes.number, propTypes.string]).def(200),
dragHeight: propTypes.oneOfType([propTypes.number, propTypes.string]).def(200),
cropWidth: propTypes.oneOfType([propTypes.number, propTypes.string]).def(200),
cropHeight: propTypes.oneOfType([propTypes.number, propTypes.string]).def(200)
})
const boxStyles = computed((): CSSProperties => {
return {
width: (typeof props.boxWidth === 'number' ? `${props.boxWidth}px` : props.boxWidth) ?? '100%',
height:
(typeof props.boxHeight === 'number' ? `${props.boxHeight}px` : props.boxHeight) ?? '100%',
position: 'relative',
backgroundImage: `url(${bgIcon})`
}
})
const dragStyles = computed((): CSSProperties => {
return {
width: (typeof props.dragWidth === 'number' ? `${props.dragWidth}px` : props.dragWidth) ?? 200,
height:
(typeof props.dragHeight === 'number' ? `${props.dragHeight}px` : props.dragHeight) ?? 200,
position: 'absolute',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
zIndex: 1,
boxShadow: '0 0 0 1px var(--el-color-primary),0 0 0 10000px rgba(0,0,0,.5)',
cursor: 'move'
}
})
const cropStyles = computed((): CSSProperties => {
return {
width: (typeof props.cropWidth === 'number' ? `${props.cropWidth}px` : props.cropWidth) ?? 300,
height:
(typeof props.cropHeight === 'number' ? `${props.cropHeight}px` : props.cropHeight) ?? 300,
position: 'absolute',
top: '50%',
left: '80px',
transform: 'translate(0, -50%)',
overflow: 'hidden',
borderRadius: '50%',
border: '1px solid var(--el-border-color)'
}
})
</script>
<template>
<div :class="prefixCls" class="flex">
<div class="flex-1">
<div :style="boxStyles">
<img :src="imageUrl" class="w-full absolute top-[50%] left-[50%]" alt="" srcset="" />
<div :style="dragStyles"> </div>
</div>
</div>
<div class="relative w-full">
<div :style="cropStyles"></div>
</div>
</div>
</template>

View File

@ -177,7 +177,8 @@ export default {
details: 'Details',
iconPicker: 'Icon picker',
request: 'Request',
waterfall: 'Waterfall'
waterfall: 'Waterfall',
imageCropping: 'Image cropping'
},
permission: {
hasPermission: 'Please set the operation permission value'

View File

@ -175,7 +175,8 @@ export default {
details: '详情页',
iconPicker: '图标选择器',
request: '请求',
waterfall: '瀑布流'
waterfall: '瀑布流',
imageCropping: '图片裁剪'
},
permission: {
hasPermission: '请设置操作权限值'

View File

@ -334,6 +334,14 @@ export const asyncRouterMap: AppRouteRecordRaw[] = [
meta: {
title: t('router.waterfall')
}
},
{
path: 'image-cropping',
component: () => import('@/views/Components/ImageCropping.vue'),
name: 'ImageCropping',
meta: {
title: t('router.imageCropping')
}
}
]
},

View File

@ -0,0 +1,14 @@
<script setup lang="ts">
import { ContentWrap } from '@/components/ContentWrap'
import { ImageCropping } from '@/components/ImageCropping'
</script>
<template>
<ContentWrap title="图片裁剪">
<ImageCropping
:box-width="350"
:box-height="380"
image-url="https://images6.alphacoders.com/657/thumbbig-657194.webp"
/>
</ContentWrap>
</template>