diff --git a/src/assets/style/style.css b/src/assets/style/style.css index 366bc46a..bd544bdd 100644 --- a/src/assets/style/style.css +++ b/src/assets/style/style.css @@ -70,6 +70,44 @@ li { margin-top: -0.4rem; border: solid 0.2rem #343579; } +.cliAdmin_like { + animation: adminLike 0.5s ease-in-out forwards; + transform-origin: center; +} +@keyframes adminLike { + 0% { + transform: scale(1); + /*开始为原始大小*/ + } + 50% { + transform: scale(1.2); + } +} +[adminLike='true'] { + animation: adminLike 0.5s ease-in-out forwards; + transform-origin: center; +} +@keyframes adminLike { + 0% { + transform: scale(1); + /*开始为原始大小*/ + } + 50% { + transform: scale(1.2); + } +} +[adminSix='true'] { + animation: adminSix 0.5s ease-in-out; + transform-origin: 30% center; +} +@keyframes adminSix { + 0% { + transform: rotate(0deg); + } + 50% { + transform: rotate(-20deg); + } +} .ant-tooltip { z-index: 2; } @@ -255,9 +293,10 @@ li { z-index: 9999; } .delete_like_file_block { - display: none; + opacity: 0; width: 3rem; height: 3rem; + cursor: pointer; background: rgba(0, 0, 0, 0.6); border-radius: calc(0.4rem*1.2); position: absolute; @@ -278,6 +317,14 @@ li { font-size: calc(1.6rem*1.2); color: #fff; } +.delete_like_file_block i, +.delete_like_file_block span { + width: 100%; + display: flex; + height: 100%; + justify-content: center; + align-items: center; +} .delete_like_file_block i { font-size: calc(1.4rem); color: #fff; diff --git a/src/assets/style/style.less b/src/assets/style/style.less index f4666877..c1e100b5 100644 --- a/src/assets/style/style.less +++ b/src/assets/style/style.less @@ -79,6 +79,42 @@ input:focus{ } } } +.cliAdmin_like{ + animation: adminLike .5s ease-in-out forwards; + transform-origin: center; + @keyframes adminLike{ + 0% { + transform: scale(1); /*开始为原始大小*/ + } + 50% { + transform: scale(1.2); + } + } +} +[adminLike='true']{ + animation: adminLike .5s ease-in-out forwards; + transform-origin: center; + @keyframes adminLike{ + 0% { + transform: scale(1); /*开始为原始大小*/ + } + 50% { + transform: scale(1.2); + } + } +} +[adminSix='true']{ + animation: adminSix .5s ease-in-out; + transform-origin: 30% center; + @keyframes adminSix{ + 0% { + transform: rotate(0deg); + } + 50%{ + transform: rotate(-20deg); + } + } +} .ant-tooltip{ // top: 74px !important; z-index: 2; @@ -284,9 +320,11 @@ input:focus{ } //爱心 .delete_like_file_block{ - display: none; + // display: none; + opacity: 0; width: 3rem; height: 3rem; + cursor: pointer; background: rgba(0,0,0,0.6); border-radius: calc(0.4rem*1.2); position: absolute; @@ -306,9 +344,17 @@ input:focus{ font-size: calc(1.6rem*1.2); color: #fff; } + i,span{ + width: 100%; + display: flex; + height: 100%; + justify-content: center; + align-items: center; + } i{ font-size: calc(1.4rem); color: #fff; + &.fi-rr-heart{ } diff --git a/src/component/Detail/DesignDetail.vue b/src/component/Detail/DesignDetail.vue index 773c32d8..b670df56 100644 --- a/src/component/Detail/DesignDetail.vue +++ b/src/component/Detail/DesignDetail.vue @@ -107,8 +107,9 @@
-
-
+
+
+
{{current?.color?.tcx}}
{{current?.color?.name}}
@@ -155,7 +156,7 @@ import Draggable from 'vuedraggable' import { ExclamationCircleOutlined } from '@ant-design/icons-vue'; import { Https } from "@/tool/https"; import { Modal,message } from 'ant-design-vue'; -import {getUploadUrl,isMoible} from '@/tool/util' +import {getUploadUrl,isMoible,setGradual} from '@/tool/util' import { useStore } from "vuex"; import { openGuide,driverObj__ } from "@/tool/guide"; import GO from '@/tool/GO'; @@ -254,6 +255,25 @@ export default defineComponent({ designOrder:false, } }, + computed:{ + setGradient(){ + return (gradient)=>{ + let gradientStr = '' + gradient.gradientList.sort((a, b) => { + let aArr = a.left.split('%')[0] + let bArr = b.left.split('%')[0] + return aArr - bArr; + }); + gradient.gradientList.forEach((item,index)=>{ + let str = ',' + if(gradient.gradientList.length == index+1)str = '' + gradientStr += `rgba(${item.rgba.r},${item.rgba.g},${item.rgba.b},${item.rgba.a}) ${item.left}${str}` + + }) + return `${gradientStr}` + } + }, + }, watch:{ designItemDetail:{ handler: async function(newVal,oldVal) { @@ -647,10 +667,11 @@ export default defineComponent({ let num = -1 // let zIndex = 10 designItemDetail.clothes.forEach((item:any,index:number) => { - let clothesItem = { + let clothesItem:any = { color: `${item.color.r} ${item.color.g} ${item.color.b}`, id:item.id, path:item.minIOPath, + gradient:{}, changed:item.changed?item.changed:false, designType:item.designType?item.designType:"Library", offset:item.layersObject?.[1]?.offset == null?[0,0]:item.layersObject[1].offset, @@ -663,6 +684,13 @@ export default defineComponent({ priority:item.priority, type:item.type, } + if(item.gradient){ + let gradient = item.gradient + gradient.colorImg = setGradual(item.gradient,320,700) + clothesItem.gradient = item.gradient + }else{ + delete clothesItem.gradient + } if(!item.id && sub){ num = index }else{ @@ -877,9 +905,10 @@ export default defineComponent({ this.designItemDetail.clothes.forEach((item:any)=>{ item.clothesOpen = false }) - let color + let color,gradient if(this.designItemDetail.clothes[0]){ color = this.designItemDetail.clothes[0].color + gradient = this.designItemDetail.clothes[0].gradient }else{ color = { "id": '', @@ -900,6 +929,7 @@ export default defineComponent({ "path": "", "minIOPath": "", "color": color, + gradient:gradient, "printObject": { "ifSingle": null, "prints": [ @@ -956,6 +986,7 @@ export default defineComponent({ } data.designSingleItemDTOList[this.currentIndex] = { color:`${this.current.color.r} ${this.current.color.g} ${this.current.color.b}`, + id:this.current.id?this.current.id:'', changed:this.current.changed?this.current.changed:false, designType:this.current.designType?this.current.designType:'Library', diff --git a/src/component/Detail/DesignDetailAlter.vue b/src/component/Detail/DesignDetailAlter.vue index fd47ef1c..1f721bea 100644 --- a/src/component/Detail/DesignDetailAlter.vue +++ b/src/component/Detail/DesignDetailAlter.vue @@ -190,6 +190,31 @@
--> + +
+
+
+
Alignment
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
@@ -285,6 +310,7 @@ export default defineComponent({ let openClick = ref(1); let searchPictureName = ref('') + let total = ref(0) let pageSize = ref(10) let currentPage = ref(1) @@ -305,6 +331,34 @@ export default defineComponent({ let sketchCatecoryList = computed(()=>{ return store.state.Workspace.workspacePosition }) + let colorList = ref([{},{},{},{},{},{},{},{},{}]) + let selectIndex = ref(0) + let gradient = ref({ + gradientList:[ + { + rgba:{ + r:117, + g:119, + b:255, + a:1, + }, + left:'0%' + },{ + rgba:{ + r:0, + g:222, + b:152, + a:1, + }, + left:'100%' + }, + ], + angle:45, + selectIndex:-1, + gradientShow:false, + }) + provide('colorList',colorList) + provide('selectIndex',selectIndex) let {t} = useI18n() return{ store, @@ -329,6 +383,9 @@ export default defineComponent({ driver__, body, sketchCatecoryList, + colorList, + selectIndex, + gradient, t, } }, @@ -362,7 +419,6 @@ export default defineComponent({ tcxColor:'', selectColorList: [], colorFileList: [], - selectIndex:0, indicator : h(LoadingOutlined, { style: { fontSize: '2.4rem', @@ -416,22 +472,63 @@ export default defineComponent({ return data } }, + setGradient(){ + // return this.setGradientAngle(gradient) + return (gradient)=>{ + let gradientStr = '' + gradient.gradientList.sort((a, b) => { + let aArr = a.left.split('%')[0] + let bArr = b.left.split('%')[0] + return aArr - bArr; + }); + gradient.gradientList.forEach((item,index)=>{ + let str = ',' + if(gradient.gradientList.length == index+1)str = '' + gradientStr += `rgba(${item.rgba.r},${item.rgba.g},${item.rgba.b},${item.rgba.a}) ${item.left}${str}` + + }) + return `${gradientStr}` + } + + } }, mounted(){ }, watch:{ - selectColor(newVal,oldVal){ - let DesignDetailEnd = this.$refs.DesignDetailEnd - DesignDetailEnd.colorList[DesignDetailEnd.selectIndex] = newVal - let colorList = DesignDetailEnd.colorList.filter((v) => v && Object.keys(v).length) - this.setColorboardList(colorList) + // selectColor(newVal,oldVal){ + // this.colorList[this.selectIndex] = newVal + // let colorList = this.colorList.filter((v) => v && Object.keys(v).length) - clearInterval(this.getPantongNameTime) - this.getPantongNameTime = setTimeout(() => { - this.getPantongName(newVal.rgba) - }, 100); - }, + // clearInterval(this.getPantongNameTime) + // this.getPantongNameTime = setTimeout(() => { + // this.getPantongName(newVal.rgba) + // }, 100); + // }, + selectColor:{ + handler(newVal,oldVal){ + if(typeof newVal?.rgba?.r !== 'number' && typeof newVal?.rgba?.r !== 'string'){ + this.colorList[this.selectIndex] = {} + return + } + this.colorList[this.selectIndex].rgba = newVal.rgba + this.colorList[this.selectIndex].hex = newVal.hex + if(this.colorList[this.selectIndex]?.gradient && this.colorList[this.selectIndex]?.gradient?.selectIndex>-1 && this.colorList[this.selectIndex]?.gradient?.gradientShow){ + this.colorList[this.selectIndex].gradient.gradientList[this.colorList[this.selectIndex].gradient.selectIndex].rgba = { + r:newVal.rgba.r, + g:newVal.rgba.g, + b:newVal.rgba.b, + a:1, + } + } + // console.log(JSON.parse(JSON.stringify(this.colorList)),JSON.parse(JSON.stringify(newVal))); + clearInterval(this.getPantongNameTime) + this.getPantongNameTime = setTimeout(() => { + this.getPantongName(newVal.rgba) + }, 100); + }, + immediate: true + }, workspaceCom(newVal,oldVal){ this.workspace = newVal this.upload.gender = newVal?.sexEnum?.name @@ -480,7 +577,8 @@ export default defineComponent({ b:Number(arr.b), a:Number(arr.a?arr.a:1), }, - hex:this.rgbaToHex([arr.r,arr.g,arr.b,arr.a?arr.a:1]) + hex:this.rgbaToHex([arr.r,arr.g,arr.b,arr.a?arr.a:1]), + gradient:this.current.gradient } this.uploadList = [] if (num == 1) { @@ -496,6 +594,19 @@ export default defineComponent({ this.clothesList = [] this.getLibraryList() } + this.store.state.UploadFilesModule.allBoardData.colorBoards.forEach((item,index) => { + this.colorList[index+1] = { + gradient:item.gradient, + rgba:item.rgbValue, + tcx:item.tcx, + name:item.name, + } + if(item.gradient){ + this.colorList[index+1].gradient = item.gradient + }else{ + delete this.colorList[index+1].gradient + } + }) let DesignDetailEnd = this.$refs.DesignDetailEnd DesignDetailEnd.init(num) this.workspaceCom = computed(()=>{ @@ -567,7 +678,7 @@ export default defineComponent({ terminate(){ let DesignDetailEnd = this.$refs.DesignDetailEnd this.select = false - DesignDetailEnd.selectIndex = 0 + this.selectIndex = 0 DesignDetailEnd.type_ = 0 this.colorFileList = [] this.selectColorList = [] @@ -581,7 +692,7 @@ export default defineComponent({ this.uploadList = [] this.apparelList = [] this.printList = [] - DesignDetailEnd.colorList = [{},{},{},{},{},{},{},{},{}] + this.colorList = [{},{},{},{},{},{},{},{},{}] // DesignDetailEnd.colorList = [{}] DesignDetailEnd.sketchImg={} this.terminate() @@ -749,7 +860,92 @@ export default defineComponent({ ).catch(res=>{ }); }, + setOperate(){ + console.log(this.selectColor); + this.selectColor.rgba = this.selectColor?.rgba?.r?this.selectColor.rgba:{r:0,g:0,b:0,a:1} + this.gradient.selectIndex = 0 + this.gradient.gradientShow = true + this.colorList[this.selectIndex].rgba = this.selectColor.rgba + if(!this.colorList[this.selectIndex].gradient){ + if(this.selectColor.rgba.r){ + this.gradient.gradientList[this.gradient.selectIndex].rgba = { + r:this.selectColor.rgba.r, + g:this.selectColor.rgba.g, + b:this.selectColor.rgba.b, + a:1, + } + } + this.colorList[this.selectIndex].gradient = JSON.parse(JSON.stringify(this.gradient)) + }else{ + this.selectColor = {rgba:this.colorList[this.selectIndex].gradient.gradientList[0].rgba} + this.colorList[this.selectIndex].gradient = '' + } + let colorList =this.colorList.filter((v) => v && Object.keys(v).length) + }, + mousedownGradient(event,item,index){ + event.stopPropagation(); + this.colorList[this.selectIndex].gradient.selectIndex = index + let gradientRgba = item.rgba + let rgba = [gradientRgba.r,gradientRgba.g,gradientRgba.b,gradientRgba.a?gradientRgba.a:1] + let hex = this.rgbaToHex(rgba) + this.selectColor = {rgba:gradientRgba,hex:hex} //顔色选择器默认颜色 + // isMoible() true为移动端 + let gradientWidth = document.querySelector('.detail_modal_body_select .color_setting_operate_bg').clientWidth + let position = { + x:event.x, + left:event.target.style.left?event.target.style.left.split('%')[0]:0 + } + let mousedownGradient = (e)=>{ + let left = (e.x - position.x)/gradientWidth*100+Number(position.left) + left = (left<0?0:left>100?100:left) + item.left = left+'%' + } + let mouseupGradient = ()=>{ + window.removeEventListener('mousemove',mousedownGradient) + window.removeEventListener('mouseup',mouseupGradient) + } + window.addEventListener('mousemove',mousedownGradient) + window.addEventListener('mouseup',mouseupGradient) + // event.target.addEventListener('touchmove',) + }, + mousedownGradientAngle(event){ + event.stopPropagation(); + // isMoible() true为移动端 + let domPosition = event.target.getBoundingClientRect() + let position = { + x:domPosition.x+domPosition.width/2, + y:domPosition.y+domPosition.height/2, + } + let angle + let mousedownGradientAngle = (e)=>{ + let X = position.x + let Y = position.y + let x = e.x - X + let y = Y - e.y + angle = Math.atan2(x,y)*(180 / Math.PI) + // this.colorList[this.selectIndex].gradient = JSON.parse(JSON.stringify(this.gradient)) + this.colorList[this.selectIndex].gradient.angle = angle + } + let mouseupGradientAngle = ()=>{ + window.removeEventListener('mousemove',mousedownGradientAngle) + window.removeEventListener('mouseup',mouseupGradientAngle) + } + window.addEventListener('mousemove',mousedownGradientAngle) + window.addEventListener('mouseup',mouseupGradientAngle) + }, + deleteGradientItem(){ + if(this.colorList[this.selectIndex].gradient.gradientList.length <= 2)return + this.colorList[this.selectIndex].gradient.gradientList.splice(this.colorList[this.selectIndex].gradient.selectIndex,1) + }, + addGradient(event){ + let gradientWidth = event.target.clientWidth + let left = event.offsetX/gradientWidth + this.colorList[this.selectIndex].gradient.gradientList.push({ + rgba:this.selectColor.rgba, + left:left.toFixed(2)*100+'%' + }) + }, //通过tcx获取颜色 getTcxColor(){ if(!this.tcxColor){ @@ -764,10 +960,9 @@ export default defineComponent({ let hex = this.rgbaToHex([rv.r,rv.g,rv.b,rv.a? rv.a :1]) this.reviewColor = rv?.r + ''? {rgba:{r:rv.r,g:rv.g,b:rv.b,a:1},hex:hex} : {hex:''} this.selectColor = this.reviewColor - DesignDetailEnd.colorList[DesignDetailEnd.selectIndex] = {r:rv.r, g:rv.g, b:rv.b} + this.colorList[this.selectIndex] = {r:rv.r, g:rv.g, b:rv.b} this.pantongName = rv.name - let colorList =DesignDetailEnd.colorList.filter((v) => Object.keys(v).length) - this.setColorboardList(colorList) + let colorList =this.colorList.filter((v) => Object.keys(v).length) this.getColorBg = true }else{ message.info(this.t('DesignDetailAlter.jsContent6')) @@ -794,8 +989,8 @@ export default defineComponent({ Https.axiosPost(Https.httpUrls.getRgbByHsvBatch, data) .then((rv) => { if (rv) { - this.selectColor.tcx = rv[0].tcx - this.selectColor.name = rv[0].name + this.colorList[this.selectIndex].tcx = rv[0].tcx + this.colorList[this.selectIndex].name = rv[0].name resolve(); } }) @@ -804,19 +999,7 @@ export default defineComponent({ }); }); }, - setColorboardList(colorList){ - - let newColorList = colorList.map((v)=>{ - let data = { - id:'', - name:'', - rgbValue:v - } - - return data - }) - - }, + fileUploadChange(data){ let file = data.file let fileData = file.originFileObj @@ -1129,6 +1312,7 @@ export default defineComponent({ .detail_color{ // height: calc(100% - 5.4rem*1.2)); + &.detail_color::-webkit-scrollbar{display: none;} height: 100%; overflow-y: auto; overflow-x: hidden; @@ -1273,10 +1457,9 @@ export default defineComponent({ } } .color_setting_block{ - width: calc(17.5rem*1.2); margin: auto; background: linear-gradient(70deg, #eee4f3, #f3f4e6); - + width: 24rem; border-radius: calc(1rem*1.2); overflow: hidden; // box-shadow: 2px 2px 8px #000; @@ -1286,14 +1469,15 @@ export default defineComponent({ box-shadow:none; } .chrome_color{ - width: calc(17.5rem*1.2); + width: 24rem; // height: 16.5rem*1.2); overflow: hidden; .vc-chrome-saturation-wrap{ height: 100%; - width: calc(16rem*1.2); - height: calc(16rem*1.2); + // width: calc(16rem*1.2); + width: 100%; + height: calc(14rem*1.2); max-height: calc(17rem*1.2); max-width: calc(17rem*1.2); margin: calc(.7rem*1.2) auto; @@ -1424,6 +1608,98 @@ export default defineComponent({ height: calc(1rem*1.2); } } + .color_setting_operateSingle{ + text-align: center; + margin: 1rem 0; + } + .color_setting_operate{ + *{ + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; + } + .color_setting_operate_item{ + display: flex; + justify-content: space-around; + align-items: center; + .operate_item_box{ + } + } + .color_setting_operate_control{ + .operate_item_delete,.operate_item_angle{ + cursor: pointer; + } + .operate_item_delete{ + i{ + display: flex; + font-size: 3rem; + } + } + .operate_item_angle{ + .operate_item_angle_box{ + border-radius: 50%; + width: 4rem; + height: 4rem; + border: solid 2px #39215b; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + >div{ + height: 100%; + width: 1rem; + position: relative; + pointer-events:none; + } + >div::before{ + position: absolute; + content: ""; + top: 0.2rem; + width: 1rem; + height: 1rem; + border-radius: 50%; + background: #39215b; + } + } + } + } + .color_setting_operate_input{ + width: 80%; + // padding: 0 10%; + margin: 1.2rem 10%; + border-radius: 10%; + position: relative; + height: 2.5rem; + .color_setting_operate_bg{ + border-radius: .5rem; + width: 100%; + height: 2.5rem; + background: #fff; + position: absolute; + } + } + .color_setting_operate_btn{ + position: absolute; + top: 50%; + transform: translate(-50%,-50%); + left: 0; + width: 1rem; + height: 110%; + border: .2rem solid; + border-radius: .5rem; + cursor: pointer; + box-sizing: content-box; + z-index: 2; + &.active{ + border: .3rem solid; + } + } + .color_setting_operate_btn:hover{ + border: .3rem solid; + } + } .sileder_color{ margin-top:calc(1.3rem*1.2); diff --git a/src/component/Detail/DesignDetailEnd.vue b/src/component/Detail/DesignDetailEnd.vue index 5674a4a8..cc385ceb 100644 --- a/src/component/Detail/DesignDetailEnd.vue +++ b/src/component/Detail/DesignDetailEnd.vue @@ -73,9 +73,10 @@