上传系统模特

This commit is contained in:
wxd
2024-10-03 14:16:23 +08:00
parent dc004824b5
commit 44912baee3
10 changed files with 184 additions and 65 deletions

View File

@@ -125,23 +125,23 @@ export default defineComponent({
fabric.Object.prototype.cornerSize = 10 fabric.Object.prototype.cornerSize = 10
fabric.Object.prototype.transparentCorners = false fabric.Object.prototype.transparentCorners = false
exportUrl = data.maskUrl exportUrl = data.maskUrl
canvas.on('mouse:wheel', opt => { // canvas.on('mouse:wheel', opt => {
const delta = opt.e.deltaY // 滚轮,向上滚一下是 -100向下滚一下是 100 // const delta = opt.e.deltaY // 滚轮,向上滚一下是 -100向下滚一下是 100
let zoom = canvas.getZoom() // 获取画布当前缩放值 // let zoom = canvas.getZoom() // 获取画布当前缩放值
zoom *= 0.999 ** delta // zoom *= 0.999 ** delta
if (zoom > 20) zoom = 20 // if (zoom > 20) zoom = 20
if (zoom < 0.01) zoom = 0.01 // if (zoom < 0.01) zoom = 0.01
// console.log(zoom); // // console.log(zoom);
canvas.zoomToPoint( // canvas.zoomToPoint(
{ // 关键点 // { // 关键点
x: opt.e.offsetX, // x: opt.e.offsetX,
y: opt.e.offsetY // y: opt.e.offsetY
}, // },
zoom // zoom
) // )
opt.e.preventDefault() // opt.e.preventDefault()
opt.e.stopPropagation() // opt.e.stopPropagation()
}) // })
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
fabric.Image.fromURL(data.maskUrl, function(img) { fabric.Image.fromURL(data.maskUrl, function(img) {
// 设置背景图对象的宽度和高度与 canvas 相同 // 设置背景图对象的宽度和高度与 canvas 相同

View File

@@ -228,14 +228,15 @@ export default defineComponent({
level2Type:'', level2Type:'',
designType:'', designType:'',
}) })
let scene = ref({
name:'Generate Sketch',
value:'generate'
})
let openMenu = ref(false) let openMenu = ref(false)
let sketchStyleList:any = computed(()=>{ let sketchStyleList:any = computed(()=>{
return store.state.UserHabit.SketchGenerateType return store.state.UserHabit.SketchGenerateType
}) })
let scene = ref({
name: t('SketchboardUpload.GenerateSketch'),
value:'generate'
})
return { return {
fileList, fileList,
openClick, openClick,

View File

@@ -215,10 +215,12 @@ export default defineComponent({
autoCropWidth: '0', //默认生成截图框宽度 autoCropWidth: '0', //默认生成截图框宽度
autoCropHeight: '0', //默认生成截图框高度 autoCropHeight: '0', //默认生成截图框高度
fixed: true, //是否开启截图框宽高固定比例 fixed: true, //是否开启截图框宽高固定比例
fixedBox: true, //固定截图框大小,不允许改变 fixedBox: false, //固定截图框大小,不允许改变//上传系统模特使用
// fixedBox: true, //固定截图框大小,不允许改变
fixedNumber: [1, 2.125], //截图框的宽高比例 fixedNumber: [1, 2.125], //截图框的宽高比例
full: false, //false按原比例裁切图片不失真 full: false, //false按原比例裁切图片不失真
canMove: true, //上传图片是否可以移动 canMove: false, //上传图片是否可以移动//上传系统模特使用
// canMove: true, //上传图片是否可以移动
canMoveBox: false, //截图框能否拖动 canMoveBox: false, //截图框能否拖动
original: false, //上传图片按照原始比例渲染 original: false, //上传图片按照原始比例渲染
centerBox: false, //截图框是否被限制在图片里面 centerBox: false, //截图框是否被限制在图片里面
@@ -741,6 +743,8 @@ export default defineComponent({
returnData[v.type] = [v.left, v.top] returnData[v.type] = [v.left, v.top]
}); });
} }
console.log(returnData);
return returnData return returnData
}, },

View File

@@ -33,7 +33,11 @@
<div class="publidh_right"> <div class="publidh_right">
<div class="publidh_right_name publidh_content_item"> <div class="publidh_right_name publidh_content_item">
<div class="publidh_content_item_title">{{$t('Publish.CollectionTitle')}}</div> <div class="publidh_content_item_title">{{$t('Publish.CollectionTitle')}}</div>
<input type="text" v-model="subPublishDate.portfolioName"> <div class="publidh_content_item_tag">
<input type="text" v-model="subPublishDate.portfolioName">
<a-tag closable color="purple">#RCAworkshop_2024</a-tag>
</div>
<a-tag color="purple">#RCAworkshop_2024</a-tag>
</div> </div>
<div class="publidh_right_name publidh_content_item"> <div class="publidh_right_name publidh_content_item">
<div class="publidh_content_item_title">{{$t('Publish.Description')}}</div> <div class="publidh_content_item_title">{{$t('Publish.Description')}}</div>
@@ -275,6 +279,22 @@ export default defineComponent({
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
}
:deep(.ant-tag){
// position: absolute;
// left: 10px;
// top: 50%;
// transform: translateY(-50%);
}
.publidh_content_item_tag{
position: relative;
.ant-tag{
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
}
} }
.publish_content_bottom{ .publish_content_bottom{
--border-color: #c4c4c4; --border-color: #c4c4c4;
@@ -292,6 +312,7 @@ export default defineComponent({
font-weight: 600; font-weight: 600;
font-size: 1.8rem; font-size: 1.8rem;
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.publidh_content_item_intro{ .publidh_content_item_intro{
font-size: 1.4rem; font-size: 1.4rem;

View File

@@ -10,6 +10,7 @@
<i class="icon iconfont icon-move" @click="setOperation('move')" :class="{active:canvasState == 'move'}"></i> <i class="icon iconfont icon-move" @click="setOperation('move')" :class="{active:canvasState == 'move'}"></i>
<i class="icon iconfont icon-bianji" @click="setOperation('pencil')" :class="{active:canvasState == 'pencil'}"></i> <i class="icon iconfont icon-bianji" @click="setOperation('pencil')" :class="{active:canvasState == 'pencil'}"></i>
<i class="icon iconfont icon-xiangpi_huaban1" @click="setOperation('eraser')" :class="{active:canvasState == 'eraser'}"></i> <i class="icon iconfont icon-xiangpi_huaban1" @click="setOperation('eraser')" :class="{active:canvasState == 'eraser'}"></i>
<i class="icon iconfont icon-IC-yehua" @click="setLiquefaction()"></i>
<input type="range" v-show="canvasState != 'move'" @input="setPencilWidth" min="1" max="50" v-model="canvasPencilWidth[canvasState]"> <input type="range" v-show="canvasState != 'move'" @input="setPencilWidth" min="1" max="50" v-model="canvasPencilWidth[canvasState]">
<!-- <div class="icon iconfont icon-xiala" :class="{btnRotate:spreadState}" @click="()=>spreadState = !spreadState"></div> --> <!-- <div class="icon iconfont icon-xiala" :class="{btnRotate:spreadState}" @click="()=>spreadState = !spreadState"></div> -->
</div> </div>
@@ -27,6 +28,7 @@
{{ $t('addDetails.submit') }} {{ $t('addDetails.submit') }}
</div> </div>
</div> </div>
<liquefaction ref="liquefaction" @submitLiquefaction="submitLiquefaction"></liquefaction>
</div> </div>
</template> </template>
<script> <script>
@@ -42,10 +44,11 @@ import { exportSele,JSRectUpdata,JSchangeType,JScanvasMouseDown,JSSetRemoveImage
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import canvasGeneral from "@/tool/canvasGeneral"; import canvasGeneral from "@/tool/canvasGeneral";
import { getMousePosition } from "@/tool/mdEvent"; import { getMousePosition } from "@/tool/mdEvent";
import liquefaction from "@/component/modules/liquefaction.vue";
export default defineComponent({ export default defineComponent({
components: { components: {
creditsDetail, creditsDetail,
allOrder, allOrder,liquefaction
}, },
emits: ['submitBase64Data'], emits: ['submitBase64Data'],
props: { props: {
@@ -164,24 +167,24 @@ export default defineComponent({
updateCanvasState('mouseUp') updateCanvasState('mouseUp')
} }
}); });
canvas.on('mouse:wheel', opt => { // canvas.on('mouse:wheel', opt => {
const delta = opt.e.deltaY // 滚轮,向上滚一下是 -100向下滚一下是 100 // const delta = opt.e.deltaY // 滚轮,向上滚一下是 -100向下滚一下是 100
let zoom = canvas.getZoom() // 获取画布当前缩放值 // let zoom = canvas.getZoom() // 获取画布当前缩放值
zoom *= 0.999 ** delta // zoom *= 0.999 ** delta
if (zoom > 20) zoom = 20 // if (zoom > 20) zoom = 20
if (zoom < 0.01) zoom = 0.01 // if (zoom < 0.01) zoom = 0.01
// console.log(zoom); // // console.log(zoom);
canvas.zoomToPoint( // canvas.zoomToPoint(
{ // 关键点 // { // 关键点
x: opt.e.offsetX, // x: opt.e.offsetX,
y: opt.e.offsetY // y: opt.e.offsetY
}, // },
zoom // zoom
) // )
opt.e.preventDefault() // opt.e.preventDefault()
opt.e.stopPropagation() // opt.e.stopPropagation()
}) // })
//画布上移动 //画布上移动
document.addEventListener('mousemove', mouseMove); document.addEventListener('mousemove', mouseMove);
@@ -358,6 +361,7 @@ export default defineComponent({
let data = exportCanvas.toDataURL('jpg') let data = exportCanvas.toDataURL('jpg')
cancelDsign() cancelDsign()
clearCanvas() clearCanvas()
console.log(data);
emit('submitBase64Data',data) emit('submitBase64Data',data)
}) })
} }
@@ -366,6 +370,47 @@ export default defineComponent({
document.removeEventListener('keyup', canvasKeyUp); document.removeEventListener('keyup', canvasKeyUp);
showPayOrder.value = false showPayOrder.value = false
} }
let liquefactionData = ref(null)
let liquefaction = ref(null)
let submitLiquefaction = (rv)=>{
const originalWidth = liquefactionData.value.width // 保存原始宽度
const originalHeight = liquefactionData.value.height; // 保存原始高度
liquefactionData.value.setSrc(rv, function(img) {
let wScale = 1
let hScale = 1
if(img.width>img.height){
hScale = img.height/img.width
exportWH = img.width
}else{
wScale = img.width/img.height
exportWH = img.height
}
img.scaleToWidth(canvas.width);
img.scaleToHeight(canvas.height);
img.set({
scaleX: canvas.width / img.width,
scaleY: canvas.height / img.height
});
// img.set({
// scaleX: 1,
// scaleY: 1
// });
canvas.renderAll();
});
}
let setLiquefaction = ()=>{
const activeObjects = canvas.backgroundImage // 获取选中的对象
if (activeObjects) {
liquefactionData.value = activeObjects
console.log(liquefactionData.value);
liquefaction.value.init(activeObjects)
} else {
// message.info(useI18.t('exportModel.jsContent6'))
return null;
}
}
return { return {
presentState, presentState,
showPayOrder, showPayOrder,
@@ -373,12 +418,17 @@ export default defineComponent({
t, t,
pencilbtnStyle, pencilbtnStyle,
...toRefs(canvasBtn), ...toRefs(canvasBtn),
liquefactionData,
liquefaction,
init, init,
setOperation, setOperation,
setPencilWidth, setPencilWidth,
historyState, historyState,
setSubmit, setSubmit,
cancelDsign, cancelDsign,
submitLiquefaction,
setLiquefaction,
}; };
}, },
data() { data() {

View File

@@ -95,6 +95,8 @@ export default defineComponent({
let img = new Image() let img = new Image()
img.setAttribute('crossOrigin', 'Anonymous') img.setAttribute('crossOrigin', 'Anonymous')
img.onload = () => { img.onload = () => {
canvasImgData.width = img.width
canvasImgData.height = img.height
let canvasBox = document.querySelector('.liquefaction .liquefaction_canvas_box') let canvasBox = document.querySelector('.liquefaction .liquefaction_canvas_box')
let width = canvasBox.offsetHeight / img.height * img.width let width = canvasBox.offsetHeight / img.height * img.width
canvas = document.getElementById('c') canvas = document.getElementById('c')
@@ -295,6 +297,41 @@ export default defineComponent({
} }
} }
let submit = ()=>{ let submit = ()=>{
const newCanvas = document.createElement('canvas');
let exportCanvas = new fabric.Canvas(newCanvas, {
width: canvasImgData.width,
height:canvasImgData.height,
isDrawingMode: false, // 开启绘图模式
});
fabric.Image.fromURL(canvas.toDataURL('png'), function(img) {
img.scaleToWidth(exportCanvas.width);
img.scaleToHeight(exportCanvas.height);
img.set({
scaleX: exportCanvas.width / img.width,
scaleY: exportCanvas.height / img.height
});
exportCanvas.setBackgroundImage(img, exportCanvas.renderAll.bind(exportCanvas));
let data = exportCanvas.toDataURL({
format: "png", // 导出格式为 PNG
quality: 1, // 图片质量为 1最高质量
});
},{ crossOrigin: "Anonymous" });
// newCanvas.width = canvasImgData.width;
// newCanvas.height = canvasImgData.height;
// const newCtx = newCanvas.getContext('2d');
// newCtx.drawImage(
// canvas,
// 0, 0,
// canvas.width,
// canvas.height,
// 0, 0,
// newCanvas.width,
// newCanvas.height
// );
// console.log(exportCanvas.toDataURL('jpg'));
emit('submitLiquefaction',canvas.toDataURL('image/png')) emit('submitLiquefaction',canvas.toDataURL('image/png'))
cancelDsign() cancelDsign()
} }

View File

@@ -303,6 +303,7 @@ export default {
Thumbnail:'选择的线稿', Thumbnail:'选择的线稿',
inputContent1:'生成图片的标题', inputContent1:'生成图片的标题',
maximumLength:'输入的内容超过允许输入的最大长度', maximumLength:'输入的内容超过允许输入的最大长度',
GenerateSketch:'生成线稿',
jsContent1:"上传失败", jsContent1:"上传失败",
jsContent2:"您只能上传图片文件!", jsContent2:"您只能上传图片文件!",
jsContent3:'图片必须小于5MB', jsContent3:'图片必须小于5MB',

View File

@@ -303,6 +303,7 @@ export default {
Thumbnail:'Selected sketchboard', Thumbnail:'Selected sketchboard',
inputContent1:'Input prompt', inputContent1:'Input prompt',
maximumLength:'The entered content exceeds the maximum length.', maximumLength:'The entered content exceeds the maximum length.',
GenerateSketch:'Generate Sketch',
jsContent1:"upload failed", jsContent1:"upload failed",
jsContent2:"You can only upload Image file!", jsContent2:"You can only upload Image file!",
jsContent3:'Image must smaller than 5MB!', jsContent3:'Image must smaller than 5MB!',

View File

@@ -22,9 +22,12 @@ class MyWs {
} }
} }
this.ws.onclose = (e)=>{ this.ws.onclose = (e)=>{
console.log('',e);
console.log('错误');
this.reconnection() this.reconnection()
} }
this.ws.onerror = (e)=>{ this.ws.onerror = (e)=>{
console.log('失败',e);
this.reconnection() this.reconnection()
} }
} }

View File

@@ -214,29 +214,7 @@ export default defineComponent({
let activeCredits = ref(false) let activeCredits = ref(false)
let getLangIsShowMark = ref(true) let getLangIsShowMark = ref(true)
let AdministratorUserIdList = [88,6,46,31,73,83,87,4] let AdministratorUserIdList = [88,6,46,31,73,83,87,4]
let navRouterList = [ let navRouterList = ref([])
{
routerName:['homePage'],
router:'/home/homePage',
name:t('Header.HOME')
},{
routerName:['library'],
router:'/home/library',
name:t('Header.LIBRARY')
},{
routerName:['history'],
router:'/home/history',
name:t('Header.HISTORY')
},{
routerName:['works'],
router:'/home/works',
name:t('Header.WORKS')
},{
routerName:['events','eventsDetail'],
router:'/home/events',
name:t('Header.EVENTS')
},
]
let messageNum = computed(()=>{ let messageNum = computed(()=>{
return store.state.UserHabit.messageSystem.messageNum return store.state.UserHabit.messageSystem.messageNum
}) })
@@ -322,6 +300,29 @@ export default defineComponent({
onMounted(()=>{ onMounted(()=>{
getUnreadCount() getUnreadCount()
navRouterList.value = [
{
routerName:['homePage'],
router:'/home/homePage',
name:t('Header.HOME')
},{
routerName:['library'],
router:'/home/library',
name:t('Header.LIBRARY')
},{
routerName:['history'],
router:'/home/history',
name:t('Header.HISTORY')
},{
routerName:['works'],
router:'/home/works',
name:t('Header.WORKS')
},{
routerName:['events','eventsDetail'],
router:'/home/events',
name:t('Header.EVENTS')
},
]
}) })
return { return {
store, store,