fix: 新增创作联调

This commit is contained in:
wanganmao
2022-12-19 14:47:46 +08:00
parent 99d1a6867f
commit 604aef4cee
34 changed files with 2425 additions and 391 deletions

View File

@@ -12,13 +12,55 @@
"multiply": 7.7
},
"objects": [
{
"type": "rotSprite",
"relRotSpriteId": "fRwV2h",
"url": "/shelves-v5-store/rotSprite/fRwV2h/c-ada61/pano_$2.webp",
"urlSmall": "/shelves-v5-store/rotSprite/fRwV2h/c-ada61/pano_$2.webp",
"urlThumb": "/shelves-v5-store/rotSprie/fRwV2h/c-ada61/pano_00.webp",
"rsFrames": 36,
"rsClockwise": true,
"rsFirstRotY": -30,
"rsWidth": 5.8,
"rsHeight": 3.8,
"rsCenterY": 0.26,
"rsPlaceRotateY": 180,
"position": {
"x": -4.5,
"y": 0,
"z": -2
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
}
},
{
"type": "rotSprite",
"relRotSpriteId": "fRwV2h",
"url": "/shelves-v5-store/rotSprite/fRwV2h/c-ada61/pano_$2.webp",
"urlSmall": "/shelves-v5-store/rotSprite/fRwV2h/c-ada61/pano_$2.webp",
"urlThumb": "/shelves-v5-store/rotSprie/fRwV2h/c-ada61/pano_00.webp",
"rsFrames": 36,
"rsClockwise": true,
"rsFirstRotY": -30,
"rsWidth": 5.8,
"rsHeight": 3.8,
"rsCenterY": 0.26,
"rsPlaceRotateY": 180,
"position": {
"x": 2,
"y": 0,
"z": -10
},
"rotation": {
"x": 0,
"y": 0,

View File

@@ -5,10 +5,29 @@ export const rotSprites = reactive({
list: [
{
id: 'fRwV2h',
name: "xx",
url: `${api.storePrefix}/rotSprites/fRwV2h/seq1`,
urlSmall: `${api.storePrefix}/rotSprites/fRwV2h/seq1-small`,
urlThumb: `${api.storePrefix}/rotSpries/fRwV2h/seq1-t.png`,
name: "c-ada6l",
url: `${api.storePrefix}/rotSprite/fRwV2h/c-ada61/pano_$2.webp`,
urlSmall: `${api.storePrefix}/rotSprite/fRwV2h/c-ada61/pano_$2.webp`,
urlThumb: `${api.storePrefix}/rotSprie/fRwV2h/c-ada61/pano_00.webp`,
rsFrames: 36,
rsClockwise: true,
rsFirstRotY: -30,
rsWidth: 5.8, // 5m*1200/1034
rsHeight: 3.8, // 800/1200
rsCenterY: .26, // 214/800
},
{
id: 'LR2fN8',
name: "c-cba",
url: `${api.storePrefix}/rotSprite/LR2fN8/c-cba/pano_$2.webp`,
urlSmall: `${api.storePrefix}/rotSprite/LR2fN8/c-cba/pano_$2.webp`,
urlThumb: `${api.storePrefix}/rotSprie/LR2fN8/c-cba/pano_00.webp`,
rsFrames: 36,
rsClockwise: true,
rsFirstRotY: -30,
rsWidth: 4.78, // 4.6m*1200/1155
rsHeight: 3.19, // 800/1200
rsCenterY: .27, // 218/800
},
]
})

View File

@@ -24,13 +24,283 @@ body {
/* Non-prefixed version, currently supported by Chrome, Edge, Opera and Firefox */
/* font-family: "Microsoft YaHei"; */
font-family: monospace;
/* font-family: monospace; */
font-family: "Microsoft YaHei";
}
/* Works on Firefox */
* {
scrollbar-width: thin;
scrollbar-color: #ECECEC rgba(0, 0, 0, 0);
}
/* Works on Chrome, Edge, and Safari */
*::-webkit-scrollbar {
width: 4px;
height: 4px;
background: rgba(0, 0, 0, 0);
border-radius: 0;
}
/* *::-webkit-scrollbar-track {
} */
*::-webkit-scrollbar-thumb {
width: 4px;
height: 4px;
background: #ECECEC;
border-radius: 0;
}
/* Code for Firefox */
::-moz-selection {
color: #fff;
background: #70B936;
}
/* Code for Chrome, Edge, and Safari */
::selection {
color: #fff;
background: #70B936;
}
#app {
margin: 0px;
}
.yo-scrollbar {
display: grid;
flex-wrap: wrap;
gap: 25px;
padding: 25px;
overflow-y: auto;
grid-template-columns: repeat(1, 1fr);
}
.yo-scrollbar2 {
display: flex;
flex-flow: column;
/* gap: 25px; */
padding: 25px;
overflow-y: auto;
}
.yo-content {
display: flex;
flex-flow: column;
gap: 25px;
padding-top: 25px;
}
.yo-thumb {
display: inline-block;
width: auto;
height: 130px;
/* color: #70B936; */
background-color: rgba(245, 245, 245, 0.6);
border: none;
box-sizing: border-box;
border-radius: 10px;
margin: 0;
text-align: center;
}
.yo-thumb:hover,
.yo-thumb:focus {
border: none;
cursor: pointer;
transform: scale(1.05);
}
.yo-thumb:active {
border: none;
cursor: pointer;
transform: scale(0.95);
}
.yo-thumb img {
width: 100%;
height: 100%;
border-radius: 10px;
}
.yo-obj-fit-cover {
object-fit: cover;
}
.yo-obj-fit-contain {
object-fit: contain;
}
.ant-input {
color: #434343;
}
.ant-input-affix-wrapper {
color: #434343;
border-color: #DFE0E3;
background: #FEFFFE;
border-radius: 6px;
padding-left: 4px;
}
.ant-input-affix-wrapper:hover {
border-color: #70B936;
}
.ant-input-affix-wrapper img {
width: 24px;
}
.ant-input-affix-wrapper-focused {
box-shadow: none;
}
.ant-input-affix-wrapper .ant-input-prefix,
.ant-input-affix-wrapper .ant-input-suffix {
color: #7E7E7E;
font-size: 12px;
}
.ant-select-selection-item{
background-color: red;
}
.ant-slider-rail {
height: 6px;
background: #ECECEC;
border-radius: 3px;
}
.ant-slider-track {
height: 6px;
background: #7EC04A;
border-radius: 3px;
}
.ant-slider-handle {
width: 20px;
height: 20px;
margin-top: -7px;
background: #7EC04A;
border: 4px solid #DFF4D0;
}
.ant-slider-handle:focus {
border-color: #DFF4D0;
box-shadow: none;
}
.ant-slider-handle.ant-tooltip-open {
border-color: #DFF4D0;
}
.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) {
border-color: #DFF4D0;
}
.ant-slider-step {
height: 6px;
}
.ant-slider:hover .ant-slider-rail {
background: #ECECEC;
}
.ant-slider:hover .ant-slider-track {
background: #7EC04A;
}
.ant-tooltip-inner {
color: #fff;
background: #808080;
border-radius: 2px;
font-size: 12px;
line-height: 18px;
box-shadow: none;
}
.ant-radio-button-wrapper {
color: #434343;
border: none;
background: #f9f9f9;
}
.ant-radio-button-wrapper:hover {
color: #7EC04A;
background: #f9f9f9;
}
/* .ant-radio-button-wrapper:active {
color: #7EC04A;
background: #f9f9f9;
} */
.ant-radio-button-wrapper:first-child {
border: none;
border-radius: 6px 0 0 6px;
}
.ant-radio-button-wrapper:last-child {
border: none;
border-radius: 0 6px 6px 0;
}
.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {
color: #ffffff;
background: #7EC04A;
border: none;
}
.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover {
color: #ffffff;
background: #7EC04A;
border: none;
}
.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within {
box-shadow: none;
}
.ant-radio-button-wrapper:not(:first-child)::before {
background: none;
}
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)::before {
background: none;
}
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover::before {
background: none;
}
.ant-divider {
color: #F5F5F5;
margin: 0;
}
.empty1 {
font-size: 14px;
font-weight: 400;
letter-spacing: 2px;
color: #434343;
text-align: center;
}
.yo-title-s16 {
font-size: 16px;
font-weight: 600;
letter-spacing: 2px;
color: #434343;
}
.yo-title-s14 {
font-size: 14px;
font-weight: 400;
letter-spacing: 2px;
color: #434343;
}
.yo-icon img {
width: 100%;
height: 100%;
@@ -120,7 +390,8 @@ body {
padding-right: 24px;
}
.el-input-number--small .el-input-number__decrease, .el-input-number--small .el-input-number__increase {
.el-input-number--small .el-input-number__decrease,
.el-input-number--small .el-input-number__increase {
width: 16px;
font-size: 11px;
}
@@ -146,5 +417,4 @@ body {
}
/* antdv */
</style>

View File

@@ -44,7 +44,7 @@
</span>
</template>
</a-tab-pane>
<a-tab-pane key="element">
<a-tab-pane key="schema">
<template #tab>
<span>
<img :src="ItemSvg" />
@@ -63,27 +63,32 @@
@remove="removeHall" />
<TabListShelf v-if="activeTabName == 'shelf'" @clickThumb="clickThumbShelf" @add="addShelf"
@remove="removeShelf" />
<TabListWare v-if="activeTabName == 'ware'" />
<TabListWare v-if="activeTabName == 'ware'" @clickThumb="clickThumbWare" @add="addWare"
@remove="removeWare" />
</div>
<div class="yo-main">
<SceneShopEditor v-if="shopData" ref="se" :shopData="shopData" :updateAction="updateAction" />
<SceneShopEditor v-if="shopData" ref="se" :shopData="shopData" :updateAction0="updateAction0"
:updateAction="updateAction" :activePropName="activePropName"
@selectCell="selectedCell = $event" />
</div>
<div class="right">
<TabPropPanorama v-if="shopData && activeTabName == 'panorama'" :shopData="shopData"
<TabPropPanorama v-if="shopData && activePropName == 'panorama'" :shopData="shopData"
@updateAction="updateAction = $event" />
<TabPropHall v-if="shopData && activeTabName == 'hall'" :shopData="shopData"
<TabPropHall v-if="shopData && activePropName == 'hall'" :shopData="shopData"
@updateAction="updateAction = $event" />
<TabPropShelf v-if="shopData && activeTabName == 'shelf'" :shopData="shopData"
<TabPropShelf v-if="shopData && activePropName == 'shelf'" :shopData="shopData"
@updateAction="updateAction = $event" />
<TabPropCellWare v-if="shopData && activeTabName == 'ware'" />
<TabPropSchema v-if="shopData && activeTabName == 'schema'" />
<TabPropCellWare v-if="shopData && activePropName == 'ware'" :cell="selectedCell"
@changeCellPileNumber="changeCellPileNumber"
@changeCellPileRotationY="changeCellPileRotationY" />
<TabPropSchema v-if="shopData && activePropName == 'schema'" />
</div>
</div>
</div>
</div>
<PanoramaUploader :isOpen="isOpenPanoramaUploader" @close="closePanoramaUploader" @success="panoramaAddSuccess" />
<ShelfUploader :isOpen="isOpenShelfUploader" @close="closeShelfUploader" @success="shelfAddSuccess" />
<WareUploader :isOpen="isOpenWareUploader" @close="closeWareUploader" @success="wareAddSuccess" />
</template>
<script setup>
@@ -104,6 +109,7 @@ import TabPropSchema from '../../shelves-vue/components/editor/TabPropSchema.vue
import PanoramaUploader from '../../shelves-vue/view/PanoramaUploader.vue'
import ShelfUploader from '../../shelves-vue/view/ShelfUploader.vue'
import WareUploader from '../../shelves-vue/view/WareUploader.vue'
import ShopSvg from '../../shelves-vue/asset/icon2/shop.svg'
import WareSvg from '../../shelves-vue/asset/icon2/ware.svg'
@@ -113,8 +119,11 @@ import ItemSvg from '../../shelves-vue/asset/icon2/item.svg'
</script>
<script>
import { ShopEditor, use_ext, clone_except_ext, get_is_hall_ } from "../../../../lib/shelves.module"
// import { api } from '../../../crossyo/shelves-vue/api/baseApi'
import { ShopEditor, use_ext, clone_except_ext, get_is_hall_, append_default_shop_data_ } from "../../../../lib/shelves.module"
// import { api } from '@/crossyo/shelves-vue/api/baseApi'
import { ElMessage } from 'element-plus'
export default {
props: {
@@ -131,12 +140,24 @@ export default {
shopData: null,
isHall: false,
activeTabName: null, // "panorama",
updateAction0: null,
updateAction: null,
isOpenPanoramaUploader: false,
isOpenShelfUploader: false,
// viewMode: 1, // 1 - lookAt, 2 - orbit
isOpenWareUploader: false,
// arrangementData: JSON.parse(JSON.stringify(this.$store.state.arrangementData.data)),
selectedCell: null,
activePropName: null,
}
},
watch: {
activeTabName(newV, oldV) {
this.activePropName = newV
},
},
// beforeMount() {
// },
mounted() {
@@ -145,35 +166,38 @@ export default {
// // console.log(resp)
// if (resp.data && resp.data.success) {
// let shopData = resp.data.result
// append_default_shop_data_(shopData)
// use_ext(shopData)
// this.isHall = get_is_hall_(shopData)
// this.shopData = shopData
// this.activeTabName = this.isHall ? 'hall' : 'panorama'
// }
// })
let shopData = this.currentShopData;
append_default_shop_data_(shopData)
use_ext(shopData)
this.isHall = get_is_hall_(shopData)
this.shopData = shopData
this.activeTabName = this.isHall ? 'hall' : 'panorama'
},
// beforeUnmount() {
// },
methods: {
back() {
this.$router.back();
this.$router.go(-1);
},
save() {
// console.log(this.$refs, this.$refs.se)
this.$refs.se.editor_.commitToShopData()
// 减少与新增数据的关联
// let clone = JSON.parse(JSON.stringify(this.shopData))
let clone = clone_except_ext(this.shopData)
this.$store.dispatch("shopData/save", clone).then(data => {
// TODO
console.warn("save response!");
})
console.log(clone)
// this.$store.dispatch("shopData/save", clone).then(data => {
// // TODO
// console.warn("save response!");
// })
},
//
addPanorama() {
@@ -182,7 +206,7 @@ export default {
clickThumbPanorama(itm) {
// console.log(itm)
this.shopData.panorama = itm
this.updateAction = {
this.updateAction0 = {
action: "updatePanorama"
}
},
@@ -237,6 +261,74 @@ export default {
// closeTextureUploader() {
// this.isOpenTextureUploader = false
// },
// save() {
// this.$store.commit('arrangementData/save', clone_except_ext(this.arrangementData))
// },
addWare() {
this.isOpenWareUploader = true
},
clickThumbWare(itm) {
let cell = this.selectedCell
console.log('clickThumbWare', itm, cell)
if (cell) {
cell.pileWare = itm
this.updateAction = {
action: 'bindCellWare',
cell,
// commodity: itm,
ware: itm,
}
} else {
ElMessage({
showClose: true,
message: '请先选择一个货位!',
// type: 'warning',
})
}
},
removeWare() {
// unbind cell ware!
let cell = this.selectedCell
if (cell) {
this.updateAction = {
action: 'unbindCellWare',
cell
}
}
},
closeWareUploader() {
// console.log('closeWareUploader')
this.isOpenWareUploader = false
},
wareAddSuccess(data) {
this.clickThumbWare(data)
},
changeCellPileNumber() {
this.updateAction = {
action: 'updateCellPileNumber',
cell: this.selectedCell,
}
},
changeCellPileRotationY() {
this.updateAction = {
action: 'updateCellPileRotationY',
cell: this.selectedCell,
}
},
},
};
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
<g id="_x23_767676ff">
<path fill="#767676" d="M12.54,15.51c3.64-2.72,7.52-5.17,11.55-7.3c3.8,2.59,7.75,4.93,11.48,7.62c0.06,4.08,0.11,8.17-0.13,12.24
c-3.8,2.58-7.72,4.98-11.5,7.57c-3.92-2.34-7.72-4.88-11.55-7.37C12.27,24.03,11.74,19.7,12.54,15.51 M17.1,16.91
c2.16,1.42,4.25,3.4,6.87,3.83c2.81-0.7,4.96-2.85,7.17-4.6c-2.46-1.46-4.87-2.99-7.19-4.68C21.78,13.3,17.92,13.97,17.1,16.91
M15.38,19.09c-0.11,2.54-0.49,5.15,0.11,7.65c2.01,1.83,4.5,2.96,6.87,4.22c0.04-2.35,0.04-4.7,0.04-7.06
C20.06,22.3,17.71,20.7,15.38,19.09 M25.41,23.65c-0.01,2.46,0,4.91,0.05,7.37c2.4-1.49,5.1-2.65,7.05-4.74
c0.21-2.39,0.08-4.8-0.02-7.19C30.13,20.6,27.77,22.13,25.41,23.65z"/>
<path fill="#767676" d="M7.23,31.52c1.82-0.43,3.45,0.09,4.65,1.52c5.14,5.08,13.68,6.34,19.95,2.69c2.59-1.35,4.77-3.95,7.96-3.59
c-0.03,2.17-0.01,4.36-0.47,6.49c-1.98,0.47-2.98-0.35-3-2.46c-5.61,4.7-13.87,6.01-20.53,2.84C12.37,37.34,8.75,35.21,7.23,31.52z
"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
<g id="_x23_787878ff">
<path fill="#787878" d="M12.5,12.29c7.62,0.06,15.25-0.13,22.87,0.11c0.52,4.61,4.43,11.02-0.67,14.35
c-2.76,2.26-5.93-1.31-8.84,0.25c-2.92,1.56-5.99-1.91-8.77,0.38c-0.84,0.05-2.53,0.14-3.38,0.18c-1.29-1.38-3.33-2.56-3.29-4.7
C10.45,19.24,11.56,15.75,12.5,12.29 M14.85,15.47c-0.55,2.48-1.34,4.96-1.24,7.52c0.79,1.35,1.92,1.76,3.4,1.24
c0.67-1.22,1.21-2.5,1.88-3.73c2.56-0.65,3.13,2.23,3.86,3.97c0.79-0.07,1.59-0.15,2.38-0.23c0.53-1.27,1.04-2.55,1.71-3.75
c2.6-0.65,3.18,2.21,3.91,3.98c0.9-0.04,1.8-0.09,2.7-0.14c0.66-2.98,0.26-6.01-0.63-8.9C26.83,15.5,20.84,15.45,14.85,15.47z"/>
<path fill="#787878" d="M33.5,28.43c0.95,0.06,1.9,0.14,2.85,0.21c0.04,3.23,0.04,6.45,0.13,9.68c-2.6,1.47-5.63,0.95-8.48,1
c-5.44-0.02-10.88,0-16.31-0.02c-0.48-3.67-0.36-7.37-0.12-11.05c0.65,0.13,1.95,0.4,2.6,0.53c0.32,2.29,0.26,4.61,0.26,6.91
c6.31-0.01,12.62,0.07,18.93-0.06C33.41,33.23,33.43,30.83,33.5,28.43z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -2,25 +2,29 @@
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="128px" height="128px" viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
width="460px" height="260px" viewBox="0 0 460 260" enable-background="new 0 0 460 260" xml:space="preserve">
<rect x="-8.673" y="-8.692" fill="#6FB944" fill-opacity="0.06" stroke="#000000" stroke-miterlimit="10" width="473.558" height="275.481"/>
<g id="_x23_c3e1abff">
<path fill="#C3E1AB" d="M25.3,13.42c24.89-0.19,49.79,0.01,74.68-0.1c1.48,0.25,3.57-0.45,4.5,1.09c0.2,1.31-1.09,2.09-1.74,3.05
c-25.71-0.17-51.42,0.11-77.12-0.14C25.59,16.02,25.49,14.71,25.3,13.42z"/>
<path fill="#C3E1AB" d="M20.26,23.37c9.92-0.04,71.77,0.42,83.73-0.58c1.79,0.08,3.53,0.55,5.27,0.9c0.08,0.48,0.24,1.43,0.31,1.91
c-0.62,0.63-1.25,1.25-1.9,1.85c-29.01-0.03-58.02,0.1-87.02-0.06C20.57,26.05,20.43,24.7,20.26,23.37z"/>
<path fill="#C3E1AB" d="M16.18,35.17c1.56-2.08,4.37-2.43,6.78-2.49c27.68,0.02,55.35,0.05,83.03-0.01c2.47,0,5.29,0.24,7.02,2.25
c1.56,1.59,1.56,3.94,1.6,6.01c-0.07,15.77,0.22,31.55,0.09,47.33c-3.43-1.81-5.69-5.03-8.45-7.63c-4.85-4.78-9.46-9.8-14.42-14.45
c-2.26-2.37-6.65-2.77-8.95-0.26c-8.61,8.5-16.94,17.3-25.7,25.65c-3.79-3.46-7.06-7.44-10.97-10.74c-2.23-2.02-6.09-2.06-8.2,0.15
c-7.88,7.51-15.27,15.55-23.21,23c-0.44-20.32,0.07-40.66-0.12-60.99C14.77,40.35,14.56,37.42,16.18,35.17 M38.24,48.15
<path fill="#C4E0AC" d="M189.556,58.319c24.89-0.19,49.79,0.01,74.68-0.1c1.48,0.25,3.57-0.45,4.5,1.09
c0.2,1.31-1.09,2.09-1.74,3.05c-25.71-0.17-51.42,0.11-77.12-0.14C189.846,60.919,189.746,59.609,189.556,58.319z"/>
<path fill="#C4E0AC" d="M184.516,68.269c9.92-0.04,71.77,0.42,83.73-0.58c1.79,0.08,3.53,0.55,5.27,0.9
c0.08,0.48,0.24,1.43,0.31,1.91c-0.62,0.63-1.25,1.25-1.9,1.85c-29.01-0.03-58.02,0.1-87.02-0.06
C184.826,70.949,184.686,69.599,184.516,68.269z"/>
<path fill="#C4E0AC" d="M180.436,80.069c1.56-2.08,4.37-2.43,6.78-2.49c27.68,0.02,55.35,0.05,83.03-0.01
c2.47,0,5.29,0.24,7.02,2.25c1.56,1.59,1.56,3.94,1.6,6.01c-0.07,15.77,0.22,31.55,0.09,47.33c-3.43-1.81-5.69-5.03-8.45-7.63
c-4.85-4.78-9.46-9.8-14.42-14.45c-2.26-2.37-6.65-2.77-8.95-0.26c-8.61,8.5-16.94,17.3-25.7,25.65
c-3.79-3.46-7.06-7.44-10.97-10.74c-2.23-2.02-6.09-2.06-8.2,0.15c-7.88,7.51-15.27,15.55-23.21,23
c-0.44-20.32,0.07-40.66-0.12-60.99C179.026,85.249,178.816,82.319,180.436,80.069 M202.496,93.049
c-4.57,1.62-8.01,5.93-8.57,10.73c-0.68,6.91,5.27,13.8,12.31,13.73c6.75,0.24,13.05-5.88,12.71-12.69
C54.99,51.82,45.84,45.19,38.24,48.15z"/>
<path fill="#C3E1AB" d="M39.26,53.31c4.8-2.47,11.32,2.36,10.37,7.69c-0.34,4.88-6.18,8.19-10.54,6.01
c-2.55-1.37-4.4-4.11-4.44-7.03C34.8,57.12,36.66,54.47,39.26,53.31z"/>
<path fill="#C3E1AB" d="M85.37,70.35c1.08-1.6,2.95-0.92,3.9,0.4c8.29,8.36,16.85,16.46,24.98,24.96
C219.246,96.719,210.096,90.089,202.496,93.049z"/>
<path fill="#C4E0AC" d="M203.516,98.209c4.8-2.47,11.32,2.36,10.37,7.69c-0.34,4.88-6.18,8.19-10.54,6.01
c-2.55-1.37-4.4-4.11-4.44-7.03C199.056,102.019,200.916,99.369,203.516,98.209z"/>
<path fill="#C4E0AC" d="M249.626,115.249c1.08-1.6,2.95-0.92,3.9,0.4c8.29,8.36,16.85,16.46,24.98,24.96
c1.17,3.22,0.48,6.95,0.56,10.36c0.34,3.71-3.01,7.01-6.7,6.7c-18.7,0.08-37.41-0.01-56.11,0.04c-2.98,0.08-5.97,0.04-8.92-0.4
C57.04,98.25,71.33,84.42,85.37,70.35z"/>
<path fill="#C3E1AB" d="M42.2,83.89c4.09,3.47,7.76,7.39,11.5,11.23c-5.5,5.7-11.11,11.32-16.77,16.86
c-2.27,1.58-5.38,0.54-7.98,0.84c-4.4-0.22-9.35,0.94-13.1-2.02c0.92-1.66,2.09-3.17,3.49-4.44C27.06,98.97,34.38,91.17,42.2,83.89
z"/>
C221.296,143.149,235.586,129.319,249.626,115.249z"/>
<path fill="#C4E0AC" d="M206.456,128.789c4.09,3.47,7.76,7.39,11.5,11.23c-5.5,5.7-11.11,11.32-16.77,16.86
c-2.27,1.58-5.38,0.54-7.98,0.84c-4.4-0.22-9.35,0.94-13.1-2.02c0.92-1.66,2.09-3.17,3.49-4.44
C191.316,143.869,198.636,136.069,206.456,128.789z"/>
</g>
<text transform="matrix(1 0 0 1 173.1057 201.5)" fill="#6FB944" font-family="'AdobeHeitiStd-Regular-GBpc-EUC-H'" font-size="28">上传图片</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -4,17 +4,14 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
<g id="_x23_545454ff">
<path fill="#545454" d="M10.87,20.361c8.45-0.18,16.96-0.48,25.4,0.1c2.31,2.3,2.08,7.14-0.8,9c-7.92-0.37-15.86,0.12-23.78-0.24
c-2.69-1.09-1.98-4.29-2.16-6.58C9.87,22.071,10.53,20.931,10.87,20.361 M14.75,23.731c-0.55,1.62,0,2.18,1.64,1.67
C16.92,23.761,16.38,23.211,14.75,23.731 M21.49,25.561c3.74,0.03,7.48,0.03,11.22,0c-0.03-0.52-0.08-1.57-0.11-2.09
c-3.67,0-7.35,0-11.02,0.01C21.56,24.001,21.51,25.041,21.49,25.561z"/>
<path fill="#545454" d="M10.87,9.46c8.45-0.18,16.96-0.48,25.4,0.1c2.31,2.3,2.08,7.14-0.8,9c-7.92-0.37-15.86,0.12-23.78-0.24
C9,17.23,9.71,14.03,9.53,11.74C9.87,11.17,10.53,10.03,10.87,9.46 M14.75,12.83c-0.55,1.62,0,2.18,1.64,1.67
C16.92,12.86,16.38,12.31,14.75,12.83 M21.49,14.66c3.74,0.03,7.48,0.03,11.22,0c-0.03-0.52-0.08-1.57-0.11-2.09
c-3.67,0-7.35,0-11.02,0.01C21.56,13.1,21.51,14.14,21.49,14.66z"/>
<path fill="#545454" d="M10.87,31.269c8.45-0.18,16.96-0.48,25.4,0.1c2.31,2.3,2.08,7.14-0.8,9c-7.92-0.37-15.86,0.12-23.78-0.24
c-2.69-1.09-1.98-4.29-2.16-6.58C9.87,32.979,10.53,31.839,10.87,31.269 M14.75,34.639c-0.55,1.62,0,2.18,1.64,1.67
C16.92,34.669,16.38,34.119,14.75,34.639 M21.49,36.469c3.74,0.03,7.48,0.03,11.22,0c-0.03-0.52-0.08-1.57-0.11-2.09
c-3.67,0-7.35,0-11.02,0.01C21.56,34.909,21.51,35.949,21.49,36.469z"/>
<path fill="#545454" d="M10.29,10.12c5.51-0.98,11.17-0.34,16.74-0.49c2.11,0.23,5.23-0.36,6.27,2.06
c0.91,3.69,0.4,7.55,0.49,11.32c-0.15,4.84,0.45,9.74-0.3,14.55c-0.44,2.51-3.44,2.58-5.44,2.67c-5.34,0.06-10.71,0.25-16.04-0.16
c-1.84,0.02-3.71-1.26-3.69-3.24c-0.53-6.61-0.03-13.26-0.25-19.89C8.28,14.65,7.62,11.21,10.29,10.12 M14.09,18.01
c-0.01,0.47-0.03,1.42-0.04,1.9c4.59,0.58,9.27,0.57,13.86-0.01c-0.01-0.47-0.03-1.41-0.04-1.89
C23.31,17.39,18.65,17.39,14.09,18.01 M14.12,24c0,0.47-0.01,1.41-0.02,1.88c4.56,0.62,9.22,0.62,13.77,0
c-0.01-0.47-0.02-1.4-0.03-1.86C23.3,23.39,18.66,23.39,14.12,24 M14.05,29.96c0.02,0.48,0.05,1.43,0.07,1.91
c4.53,0.63,9.18,0.65,13.7-0.02c0.03-0.47,0.09-1.41,0.11-1.88C23.34,29.41,18.65,29.41,14.05,29.96z"/>
<path fill="#545454" d="M36.17,25.27c0.66-2.16,3.93-1.33,3.81,0.79c0.43,4.58,0.39,9.23-0.3,13.78c-1.12,0.08-2.24,0.06-3.36-0.05
C35.52,35.02,35.31,30.04,36.17,25.27z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
<g id="_x23_cfcfcfff">
<path fill="#CFCFCF" d="M12.17,19.99c1.18-4.46,5.13-8.21,9.84-8.48c6.02-0.77,11.85,4.43,12.1,10.42
c0.21,2.87-1.05,5.54-2.11,8.13c1.84,1.8,3.82,3.56,4.98,5.91l-0.92,0.74c-2.3-1.22-4.08-3.14-5.89-4.96
c-2.62,1.14-5.36,2.45-8.3,2.06C15.37,33.46,10.33,26.21,12.17,19.99 M20.35,14.34c-2.84,0.87-5.16,3.2-5.87,6.1
c-1.26,4.56,1.75,9.72,6.35,10.83c5.19,1.51,10.95-2.92,10.99-8.28C32.26,17.19,25.8,12.3,20.35,14.34z"/>
<path fill="#CFCFCF" d="M20.11,16.07c5.23-2.63,11.82,3.32,9.63,8.82c-1.3,5.57-9.77,6.73-12.6,1.81
C14.42,23.14,16.27,17.93,20.11,16.07 M21.18,18.3c-3.18,1.11-3.95,5.78-1.33,7.89c2.61,3.05,7.81,0.4,7.94-3.25
C28.17,19.62,24.16,16.78,21.18,18.3z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -4,14 +4,17 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
<g id="_x23_545454ff">
<path fill="#545454" d="M10.29,10.12c5.51-0.98,11.17-0.34,16.74-0.49c2.11,0.23,5.23-0.36,6.27,2.06
c0.91,3.69,0.4,7.55,0.49,11.32c-0.15,4.84,0.45,9.74-0.3,14.55c-0.44,2.51-3.44,2.58-5.44,2.67c-5.34,0.06-10.71,0.25-16.04-0.16
c-1.84,0.02-3.71-1.26-3.69-3.24c-0.53-6.61-0.03-13.26-0.25-19.89C8.28,14.65,7.62,11.21,10.29,10.12 M14.09,18.01
c-0.01,0.47-0.03,1.42-0.04,1.9c4.59,0.58,9.27,0.57,13.86-0.01c-0.01-0.47-0.03-1.41-0.04-1.89
C23.31,17.39,18.65,17.39,14.09,18.01 M14.12,24c0,0.47-0.01,1.41-0.02,1.88c4.56,0.62,9.22,0.62,13.77,0
c-0.01-0.47-0.02-1.4-0.03-1.86C23.3,23.39,18.66,23.39,14.12,24 M14.05,29.96c0.02,0.48,0.05,1.43,0.07,1.91
c4.53,0.63,9.18,0.65,13.7-0.02c0.03-0.47,0.09-1.41,0.11-1.88C23.34,29.41,18.65,29.41,14.05,29.96z"/>
<path fill="#545454" d="M36.17,25.27c0.66-2.16,3.93-1.33,3.81,0.79c0.43,4.58,0.39,9.23-0.3,13.78c-1.12,0.08-2.24,0.06-3.36-0.05
C35.52,35.02,35.31,30.04,36.17,25.27z"/>
<path fill="#545454" d="M10.87,20.361c8.45-0.18,16.96-0.48,25.4,0.1c2.31,2.3,2.08,7.14-0.8,9c-7.92-0.37-15.86,0.12-23.78-0.24
c-2.69-1.09-1.98-4.29-2.16-6.58C9.87,22.071,10.53,20.931,10.87,20.361 M14.75,23.731c-0.55,1.62,0,2.18,1.64,1.67
C16.92,23.761,16.38,23.211,14.75,23.731 M21.49,25.561c3.74,0.03,7.48,0.03,11.22,0c-0.03-0.52-0.08-1.57-0.11-2.09
c-3.67,0-7.35,0-11.02,0.01C21.56,24.001,21.51,25.041,21.49,25.561z"/>
<path fill="#545454" d="M10.87,9.46c8.45-0.18,16.96-0.48,25.4,0.1c2.31,2.3,2.08,7.14-0.8,9c-7.92-0.37-15.86,0.12-23.78-0.24
C9,17.23,9.71,14.03,9.53,11.74C9.87,11.17,10.53,10.03,10.87,9.46 M14.75,12.83c-0.55,1.62,0,2.18,1.64,1.67
C16.92,12.86,16.38,12.31,14.75,12.83 M21.49,14.66c3.74,0.03,7.48,0.03,11.22,0c-0.03-0.52-0.08-1.57-0.11-2.09
c-3.67,0-7.35,0-11.02,0.01C21.56,13.1,21.51,14.14,21.49,14.66z"/>
<path fill="#545454" d="M10.87,31.269c8.45-0.18,16.96-0.48,25.4,0.1c2.31,2.3,2.08,7.14-0.8,9c-7.92-0.37-15.86,0.12-23.78-0.24
c-2.69-1.09-1.98-4.29-2.16-6.58C9.87,32.979,10.53,31.839,10.87,31.269 M14.75,34.639c-0.55,1.62,0,2.18,1.64,1.67
C16.92,34.669,16.38,34.119,14.75,34.639 M21.49,36.469c3.74,0.03,7.48,0.03,11.22,0c-0.03-0.52-0.08-1.57-0.11-2.09
c-3.67,0-7.35,0-11.02,0.01C21.56,34.909,21.51,35.949,21.49,36.469z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,18 +1,20 @@
<template>
<div class="yo-shelf-position">
<el-icon class="yo-icon"><img :src="ICONS[icon]" /></el-icon>
<div class="yo-special-input">
<!-- <div class="yo-special-input">
<el-input class="yo-input-small" v-model="vec3.x" disabled />
<span>X</span>
</div>
<div class="yo-special-input">
</div> -->
<a-input v-model:value="vec3.x" suffix="X" disabled/>
<!-- <div class="yo-special-input">
<el-input class="yo-input-small" v-model="vec3.y" disabled />
<span>Y</span>
</div>
<div class="yo-special-input">
</div> -->
<a-input v-model:value="vec3.y" suffix="Y" disabled/>
<!-- <div class="yo-special-input">
<el-input class="yo-input-small" v-model="vec3.z" disabled />
<span>Z</span>
</div>
</div> -->
<a-input v-model:value="vec3.z" suffix="Z" disabled/>
</div>
</template>

View File

@@ -3,7 +3,7 @@
<div ref="c1" class="container-editor-1-" />
<div class="container-tools-1-">
<el-button-group>
<!-- <el-button-group>
<el-button v-if="showTranslate" class="yo-btn-rect yo-btn-tool" text :disabled="!enableTranslate"
@click="update_action_({ action: 'transformTranslate' })">
@@ -18,11 +18,21 @@
<el-icon class="yo-icon"><img :src="IconScaleRect" /></el-icon>
</el-button>
</el-button-group>
</el-button-group> -->
<!-- TODO 如何多重disabled radio -->
<a-radio-group button-style="solid" v-model:value="v_trans_action_">
<a-radio-button v-if="showTranslate" :disabled="!enableTranslate"
value="transformTranslate">移动</a-radio-button>
<a-radio-button v-if="showRotation" :disabled="!enableRotation"
value="transformRotate">旋转</a-radio-button>
<a-radio-button v-if="showResize" :disabled="!enableResize" value="transformResize">缩放</a-radio-button>
</a-radio-group>
</div>
<div class="container-tools-2-">
<el-button-group class="yo-btn-grp ml-4">
<!-- <el-button-group class="yo-btn-grp ml-4">
<el-tooltip content="全景图模式" placement="top">
<el-button plain :class="viewMode == 1 ? 'selected' : ''" @click="changeViewMode(1)">
<el-icon class="yo-icon"><img :src="IconPanoramic" /></el-icon>
@@ -33,13 +43,18 @@
<el-icon class="yo-icon"><img :src="Icon360" /></el-icon>
</el-button>
</el-tooltip>
</el-button-group>
</el-button-group> -->
<a-radio-group button-style="solid" v-model:value="viewMode">
<a-radio-button :value="1">全景</a-radio-button>
<a-radio-button :value="2">环绕</a-radio-button>
</a-radio-group>
</div>
</div>
</template>
<!-- dont use setup here, cause $refs cant visit member -->
<script setup>
<!-- <script setup>
import IconMove from '../../asset/icon/001-move.svg'
import IconScaleRect from '../../asset/icon/004-selection-1.svg'
@@ -48,14 +63,14 @@ import IconScaleCircle from '../../asset/icon/002-selection.svg'
import IconPanoramic from '../../asset/icon/001-panoramic.svg'
import Icon360 from '../../asset/icon/002-360.svg'
</script>
</script> -->
<script>
import { ShopEditor } from "../../../../../lib/shelves.module"
import { ShopEditor, activePropName_to_activeEditModeName } from "../../../../../lib/shelves.module"
export default {
props: ["shopData", "updateAction", "relProp"],
props: ["shopData", "updateAction0", "updateAction", "activePropName"],
// updateAction from TabShopPano
data() {
@@ -70,6 +85,7 @@ export default {
showRotation: true,
showResize: true,
v_trans_action_: '', // for antdv
}
},
computed: {
@@ -93,14 +109,25 @@ export default {
extSelectedCellSubName(v) {
this.update_tranform_buttons_(this.extSelectedShelf, this.extSelectedCell, v)
},
updateAction0(newV, oldV) {
this.update_action_(newV)
},
updateAction(newV, oldV) {
this.update_action_(newV)
},
relProp(newV, oldV) {
activePropName(newV, oldV) {
if (this.editor_) {
this.editor_.relProp(newV)
this.editor_.activeEditModeName = activePropName_to_activeEditModeName(newV)
}
},
v_trans_action_(newV) {
// console.log('watch trans_action_', newV)
this.update_action_({ action: newV })
},
viewMode(newV) {
// console.log('watch viewMode', newV)
this.changeViewMode(newV)
}
},
mounted: function () {
@@ -122,6 +149,7 @@ export default {
this.editor_ = new ShopEditor({
container: this.$refs.c1,
shopData: this.shopData,
activeEditModeName: activePropName_to_activeEditModeName(this.activePropName), // #20221216
})
this.editor_.on("loadingCompletion", () => {
this.viewMode = this.editor_.viewMode
@@ -132,6 +160,10 @@ export default {
this.viewMode = viewMode
})
this.editor_.on('arrange.selectCell', cell => {
this.$emit('selectCell', cell)
})
this.editor_.startup()
}
return this.editor_
@@ -147,7 +179,6 @@ export default {
this.editor_.updateAction(v)
}
},
update_tranform_buttons_(isShelf, cell, sub) {
// console.log('update transform buttons_', isShelf, cell, sub)
if (isShelf) {

View File

@@ -1,21 +1,27 @@
<template>
<el-scrollbar class="yo-scrollbar">
<el-button class="yo-thumb" @click="add" >
<el-icon class="yo-icon"><img :src="IconPlus" /></el-icon>
</el-button>
<el-button class="yo-thumb" @click="remove" >
<el-icon class="yo-icon"><img :src="IconNull" /></el-icon>
</el-button>
<div class="yo-thumb" v-for="(itm, index) in list" @click="clickThumb(itm)" :key="index">
<img :src="itm.urlThumb" />
<div class="yo-scrollbar" style="height: calc(100vh - 155px)">
<div class="yo-title-s16">环境库</div>
<a-input placeholder="请输入环境名" v-model:value="searchText">
<template #prefix>
<img :src="SearchSvg" />
</template>
</a-input>
<div class="yo-thumb" @click="add">
<img :src="ImageSvg" />
</div>
<!-- <el-button class="yo-thumb" @click="remove">
<el-icon class="yo-icon"><img :src="IconNull" /></el-icon>
</el-button> -->
<div class="yo-thumb" v-for="itm in list" @click="clickThumb(itm)">
<img class="yo-obj-fit-cover" :src="itm.urlThumb" />
</div>
</div>
</el-scrollbar>
</template>
<script setup>
import { Plus, Remove } from '@element-plus/icons-vue'
import IconPlus from '../../asset/icon/002-plus.svg'
import IconNull from '../../asset/icon/001-null.svg'
import ImageSvg from '../../asset/icon2/image.svg'
import SearchSvg from '../../asset/icon2/search.svg'
</script>
<script>
@@ -23,15 +29,21 @@ import IconNull from '../../asset/icon/001-null.svg'
export default {
data() {
return {
searchText: '',
list: []
}
},
mounted() {
async mounted() {
// this.$store.dispatch('panoramas/list').then(list => {
// this.list = list
// })
this.list = [];
// 环境类型
var type0 = process.env.VUE_APP_CURRENTMODE == "prod" ? "prod" : "test";
var type1 = process.env.VUE_APP_CURRENTMODE == "prod" ? "prod" : "uat";
// 默认的模型接口
var res = await fetch(`https://${type0}-cxp-public-web-1302259445.cos.ap-beijing.myqcloud.com/${type1}-yls/3D/shelves/scenes_data/panorama.json`).then(res => res.json());
this.list = res;
},
methods: {
clickThumb(itm) {
@@ -49,36 +61,5 @@ export default {
</script>
<style scoped>
.yo-scrollbar {
height: calc(100vh - 80px);
}
.yo-thumb {
display: inline-block;
width: 104px;
height: 78px;
background-color: #efefef;
border: none;
box-sizing: border-box;
border-radius: 4px;
margin: 8px 8px 8px 8px;
text-align: center;
}
.yo-thumb:hover, .yo-thumb:active, .yo-thumb:focus {
/* border-color: #c6e2ff;
background-color: #ecf5ff; */
color: #303133;
background-color: #efefef;
border: none;
/* opacity: 0.8; */
cursor: pointer;
transform: scale(1.05);
}
.yo-thumb img {
width: 100%;
height: 100%;
border-radius: 4px;
}
</style>

View File

@@ -1,20 +1,26 @@
<template>
<el-scrollbar class="yo-scrollbar">
<el-button class="yo-thumb" @click="add">
<el-icon class="yo-icon"><img :src="IconPlus" /></el-icon>
</el-button>
<el-button class="yo-thumb" @click="remove">
<el-icon class="yo-icon"><img :src="IconNull" /></el-icon>
</el-button>
<div class="yo-thumb" v-for="(itm, index) in list" :key="index" @click="clickThumb(itm)">
<img :src="itm.urlThumb" />
<div class="yo-scrollbar" style="height: calc(100vh - 155px)">
<div class="yo-title-s16">货架库</div>
<a-input placeholder="请输入货架名" v-model:value="searchText">
<template #prefix>
<img :src="SearchSvg" />
</template>
</a-input>
<div class="yo-thumb" @click="add">
<img :src="ImageSvg" />
</div>
<!-- <el-button class="yo-thumb" @click="remove">
<el-icon class="yo-icon"><img :src="IconNull" /></el-icon>
</el-button> -->
<div class="yo-thumb" v-for="itm in list" @click="clickThumb(itm)">
<img class="yo-obj-fit-contain" :src="itm.urlThumb" />
</div>
</div>
</el-scrollbar>
</template>
<script setup>
import IconPlus from '../../asset/icon/002-plus.svg'
import IconNull from '../../asset/icon/001-null.svg'
import ImageSvg from '../../asset/icon2/image.svg'
import SearchSvg from '../../asset/icon2/search.svg'
</script>
<script>
@@ -22,15 +28,21 @@ import IconNull from '../../asset/icon/001-null.svg'
export default {
data() {
return {
searchText: '',
list: []
}
},
mounted() {
async mounted() {
// this.$store.dispatch('shelves/list').then(list => {
// this.list = list
// })
this.list = []
// 环境类型
var type0 = process.env.VUE_APP_CURRENTMODE == "prod" ? "prod" : "test";
var type1 = process.env.VUE_APP_CURRENTMODE == "prod" ? "prod" : "uat";
// 默认的模型接口
var res = await fetch(`https://${type0}-cxp-public-web-1302259445.cos.ap-beijing.myqcloud.com/${type1}-yls/3D/shelves/scenes_data/shelf.json`).then(res => res.json());
this.list = res;
},
methods: {
clickThumb(itm) {
@@ -48,38 +60,5 @@ export default {
</script>
<style scoped>
.yo-scrollbar {
height: calc(100vh - 80px);
}
.yo-thumb {
display: inline-block;
width: 104px;
height: 78px;
background-color: #efefef;
border: none;
box-sizing: border-box;
border-radius: 4px;
margin: 8px 8px 8px 8px;
text-align: center;
}
.yo-thumb:hover,
.yo-thumb:active,
.yo-thumb:focus {
/* border-color: #c6e2ff;
background-color: #ecf5ff; */
color: #303133;
background-color: #efefef;
border: none;
/* opacity: 0.8; */
cursor: pointer;
transform: scale(1.05);
}
.yo-thumb img {
width: fit-content;
height: 100%;
border-radius: 4px;
}
</style>

View File

@@ -1,20 +1,27 @@
<template>
<el-scrollbar class="yo-scrollbar">
<el-button class="yo-thumb" @click="add">
<el-icon class="yo-icon"><img :src="IconPlus" /></el-icon>
</el-button>
<el-button class="yo-thumb" @click="remove">
<el-icon class="yo-icon"><img :src="IconNull" /></el-icon>
</el-button>
<div class="yo-thumb" v-for="(itm, index) in list" :key="index" @click="clickThumb(itm)">
<img :src="itm.urlThumb" />
<div class="yo-scrollbar" style="height: calc(100vh - 155px)">
<div class="yo-title-s16">商品库</div>
<a-input placeholder="请输入商品名" v-model:value="searchText">
<template #prefix>
<img :src="SearchSvg" />
</template>
</a-input>
<div class="yo-thumb" @click="add">
<img :src="ImageSvg" />
</div>
<!-- <el-button class="yo-thumb" @click="remove">
<el-icon class="yo-icon"><img :src="IconNull" /></el-icon>
</el-button> -->
<div class="yo-thumb" v-for="itm in list" @click="clickThumb(itm)">
<img class="yo-obj-fit-contain" :src="itm.urlThumb" />
</div>
</div>
</el-scrollbar>
</template>
<script setup>
import IconPlus from '../../asset/icon/002-plus.svg'
import IconNull from '../../asset/icon/001-null.svg'
import ImageSvg from '../../asset/icon2/image.svg'
import SearchSvg from '../../asset/icon2/search.svg'
</script>
<script>
@@ -22,15 +29,22 @@ import IconNull from '../../asset/icon/001-null.svg'
export default {
data() {
return {
searchText: '',
list: []
}
},
mounted() {
async mounted() {
// this.$store.dispatch('wares/list').then(list => {
// this.list = list
// })
this.list = [];
// 环境类型
var type0 = process.env.VUE_APP_CURRENTMODE == "prod" ? "prod" : "test";
var type1 = process.env.VUE_APP_CURRENTMODE == "prod" ? "prod" : "uat";
// 默认的模型接口
var res = await fetch(`https://${type0}-cxp-public-web-1302259445.cos.ap-beijing.myqcloud.com/${type1}-yls/3D/shelves/scenes_data/ware.json`).then(res => res.json());
res = res.map(x => x.surveyWare);
this.list = res;
},
methods: {
clickThumb(itm) {
@@ -48,38 +62,5 @@ export default {
</script>
<style scoped>
.yo-scrollbar {
height: calc(100vh - 40px);
}
.yo-thumb {
display: inline-block;
width: 104px;
height: 78px;
background-color: #efefef;
border: none;
box-sizing: border-box;
border-radius: 4px;
margin: 8px 8px 8px 8px;
text-align: center;
}
.yo-thumb:hover,
.yo-thumb:active,
.yo-thumb:focus {
/* border-color: #c6e2ff;
background-color: #ecf5ff; */
color: #303133;
background-color: #efefef;
border: none;
/* opacity: 0.8; */
cursor: pointer;
transform: scale(1.05);
}
.yo-thumb img {
width: fit-content;
height: 100%;
border-radius: 4px;
}
</style>

View File

@@ -1,10 +1,8 @@
<template>
<el-scrollbar class="yo-scrollbar">
<el-collapse v-model="activeNames">
<el-collapse-item title="货位堆放" name="cell">
<div v-if="cell">
<div class="yo-scrollbar2" style="height: calc(100vh - 155px)">
<div class="yo-title-s16">商品设置</div>
<div v-if="cell" class="yo-content">
<div>{{ cell.name }}</div>
<div class="yo-v-gap"></div>
<div class="yo-object-number">
<span>数量</span>
<el-input-number class="yo-input-number-small" v-model="cell.pileNumber" :min="1" :max="5" :step="1"
@@ -13,16 +11,12 @@
</div>
<div>
<span>旋转</span>
<el-slider class="yo-slider" v-model="cell.pileRotationY" :min="-180" :max="180"
:show-tooltip="false" @input="$emit('changeCellPileRotationY')" />
<el-slider class="yo-slider" v-model="cell.pileRotationY" :min="-180" :max="180" :show-tooltip="false"
@input="$emit('changeCellPileRotationY')" />
</div>
</div>
<div v-else class="empty1">请先选择一个货位</div>
</el-collapse-item>
</el-collapse>
</el-scrollbar>
</div>
</template>
<script setup>
@@ -53,16 +47,6 @@ export default {
</script>
<style scoped>
.yo-scrollbar {
height: calc(100vh - 40px);
padding: 8px 16px;
}
.empty1 {
color: var(--el-color-info-dark-2);
text-align: center;
}
.yo-object-number {
display: inline-block;
}

View File

@@ -1,20 +1,16 @@
<template>
<el-scrollbar class="yo-scrollbar">
<el-collapse v-model="activeNames">
<el-collapse-item title="环境" name="panorama">
<div v-if="panorama">
<span>环境方向</span>
<el-slider class="yo-slider" v-model="panoramaRotationY" :min="-180" :max="180"
:show-tooltip="false" @input="changePanoramaRotationY" />
<div class="yo-v-gap"></div>
<span>环境光强度</span>
<el-slider class="yo-slider" v-model="panoramaMultiply" :min="0" :max="4" :step=".1"
:show-tooltip="false" @input="changePanoramaMultiply" />
<div class="yo-scrollbar2" style="height: calc(100vh - 155px)">
<div class="yo-title-s16">环境设置</div>
<div v-if="panorama" class="yo-content">
<div class="yo-title-s14">环境方向</div>
<a-slider v-model:value="panoramaRotationY" :min="-180" :max="180" />
<a-divider />
<div class="yo-title-s14">环境光强度</div>
<a-slider v-model:value="panoramaMultiply" :min="0" :max="4" :step=".1"/>
<a-divider />
</div>
<div v-else class="empty1">请先选择一个环境</div>
</el-collapse-item>
</el-collapse>
</el-scrollbar>
</div>
</template>
<script setup>
@@ -75,6 +71,13 @@ export default {
// }
// },
panoramaRotationY(newVal) {
this.changePanoramaRotationY(newVal)
},
panoramaMultiply(newVal) {
this.changePanoramaMultiply(newVal)
},
},
mounted() {
// show panorama?
@@ -122,15 +125,6 @@ export default {
</script>
<style scoped>
.yo-scrollbar {
height: calc(100vh - 40px);
padding: 8px 16px;
}
.empty1 {
color: var(--el-color-info-dark-2);
text-align: center;
}
.yo-shelf-name {
display: inline-flex;
@@ -169,7 +163,6 @@ export default {
display: inline-block;
gap: 8px;
align-items: center;
/* height: 36px; */
margin-bottom: 12px;
}
@@ -199,11 +192,6 @@ export default {
margin: 0 4px;
}
.yo-slider {
width: 195px;
margin-left: 5px;
}
.yo-btn-add {
min-width: 10px;
height: 24px;

View File

@@ -1,19 +1,21 @@
<template>
<el-scrollbar class="yo-scrollbar">
<el-collapse v-model="activeNames">
<el-collapse-item title="货架" name="shelf">
<div v-if="shelf">
<div class="yo-scrollbar2" style="height: calc(100vh - 155px)">
<div class="yo-title-s16">货架设置</div>
<div v-if="shelf" class="yo-content">
<div class="yo-title-s14">货架位置</div>
<Vec3Comp :vec3="shelf.position" icon="position" />
<div class="yo-v-gap"></div>
<a-divider />
<div class="yo-title-s14">货架方向</div>
<Vec3Comp :vec3="shelf.rotation" icon="rotation" />
<a-divider />
</div>
<div v-else class="empty1">请先选择一个货架</div>
</el-collapse-item>
<div class="yo-line"></div>
<el-collapse v-model="activeNames">
<el-collapse-item title="货位" name="cells">
<div v-if="shelf">
<el-row :class="`yo-shelf-cells-position ${cell == extSelectedCell ? 'active' : ''}`"
v-for="(cell, idx) in cells" :key="idx">
v-for="(cell, idx) in cells">
<div class="yo-shelf-name">
{{ idx + 1 }}
<el-input class="yo-input-small" v-model="cell.name" />
@@ -60,13 +62,14 @@
<div v-else class="empty1">请先选择一个货架</div>
</el-collapse-item>
</el-collapse>
</el-scrollbar>
</div>
</template>
<script setup>
import { Delete } from '@element-plus/icons-vue'
import Vec3Comp from '../comp/Vec3Comp.vue'
import { MAX_CELLS } from '../../../../crossyo/shelves-vue/store/shelves'
// import { MAX_CELLS } from '@/crossyo/shelves-vue/store/shelves'
const MAX_CELLS = 16
</script>
<script>
@@ -173,15 +176,6 @@ export default {
</script>
<style scoped>
.yo-scrollbar {
height: calc(100vh - 40px);
padding: 8px 16px;
}
.empty1 {
color: var(--el-color-info-dark-2);
text-align: center;
}
.yo-shelf-name {
display: inline-flex;
@@ -250,11 +244,6 @@ export default {
margin: 0 4px;
}
.yo-slider {
width: 195px;
margin-left: 5px;
}
.yo-btn-add {
min-width: 10px;
height: 24px;

View File

@@ -14,8 +14,7 @@
<a-button class="yo-btn-right yo-btn-blue" type="primary" @click="$emit('save')">
<template #icon>
<!-- <SendOutlined /> -->
<img :src="SendSvg" style="width: 24px" />
<img :src="SendSvg" />
</template>
发送
</a-button>
@@ -53,11 +52,12 @@ import SendSvg from '../../asset/icon2/send.svg'
height: 40px;
width: 100px;
min-width: 10px;
/* line-height: 24px; */
line-height: 28px;
color: #FFFFFF;
background: #1C6FFF;
border-color: #1C6FFF;
font-size: 15px;
font-size: 16px;
font-weight: 400;
border-radius: 6px;
letter-spacing: 2px;
/* padding: 4px 20px; */
@@ -71,17 +71,10 @@ import SendSvg from '../../asset/icon2/send.svg'
border: #1C6FFF;
}
.yo-btn-back {
position: absolute;
left: 16px;
align-self: center;
height: 40px;
min-width: 10px;
/* line-height: 24px; */
color: #434343;
font-size: 16px;
letter-spacing: 2px;
/* padding: 4px 20px; */
.yo-btn-right img {
width: 24px;
margin-right: 6px;
padding-bottom: 2px;
}
.yo-btn-back {
@@ -93,7 +86,13 @@ import SendSvg from '../../asset/icon2/send.svg'
/* line-height: 24px; */
color: #434343;
font-size: 16px;
font-weight: 400;
letter-spacing: 2px;
/* padding: 4px 20px; */
}
.yo-btn-back img {
width: 24px;
margin-right: 6px;
}
</style>

View File

@@ -30,6 +30,8 @@ onMounted(async () => {
<style lang="scss" scoped>
@import url("./utils.default.scss");
:deep(img){
width: 100%;
}

View File

@@ -16,7 +16,7 @@
</span>
</template>
</a-input>
<a-button type="primary" @click="createMaterialRef.show(current.find(x => x))">
<a-button :disabled="!current.find(x => x)" type="primary" @click="createMaterialRef.show(current.find(x => x))">
<PlusOutlined/> 新增
</a-button>
</div>
@@ -29,11 +29,12 @@
<div class="pit-row" style="color: #262626;">
{{row.title}}
<div class="pit-tag" style="color: #0CC126; ">
三维环境
{{THREE_D_TYPE_S.find(x => x.type == row.type)?.name}}
</div>
</div>
<div class="pit-row" style="color: #8A8A8A;">
2022-08-08
<!-- 2022-08-08 -->
--
<div class="pit-more">
<a-dropdown placement="bottomCenter">
<a class="ant-dropdown-link" @click.prevent>

View File

@@ -4,9 +4,7 @@
<div class="search">
<a-menu v-model:selectedKeys="current" mode="horizontal">
<a-menu-item :key="0">全部 </a-menu-item>
<a-menu-item :key="1">3D虚拟门店</a-menu-item>
<a-menu-item :key="2">3D环物</a-menu-item>
<a-menu-item :key="3">3D商品模型</a-menu-item>
<a-menu-item v-for="(item) in CREATIVE_TYPE_S" :key="item.type">{{item.name}}</a-menu-item>
</a-menu>
<a-input v-model:value="title" placeholder="请输入" style="width: 200px; margin-right: 5px;">
<template v-slot:prefix>
@@ -18,7 +16,7 @@
</span>
</template>
</a-input>
<a-button type="primary">
<a-button :disabled="!current.find(x => x)" type="primary" @click="create3DRef.show(current.find(x => x))">
<PlusOutlined/> 新增
</a-button>
</div>
@@ -30,18 +28,13 @@
<div class="page-item-title">
<div class="pit-row" style="color: #262626;">
{{row.title}}
<div v-if="row.type==1" class="pit-tag" style="color: #0CC126; ">
3D虚拟门店
</div>
<div v-if="row.type==2" class="pit-tag" style="color: #0CC126; ">
3D环物
</div>
<div v-if="row.type==3" class="pit-tag" style="color: #0CC126; ">
3D商品模型
<div class="pit-tag" style="color: #0CC126; ">
{{CREATIVE_TYPE_S.find(x => x.type == row.type)?.name}}
</div>
</div>
<div class="pit-row" style="color: #8A8A8A;">
2022-08-08
<!-- 2022-08-08 -->
--
<div class="pit-more">
<a-dropdown placement="bottomCenter">
<a class="ant-dropdown-link" @click.prevent>
@@ -106,6 +99,7 @@
</div>
</div>
<RenameCreation ref="renameCreationRef" @complete="query" />
<Create3D ref="create3DRef" @complete="query"/>
</div>
</a-spin>
</template>
@@ -116,7 +110,9 @@ import { SearchOutlined, PlusOutlined } from "@ant-design/icons-vue"
import { computed, onMounted, ref, watch } from "@vue/runtime-core";
import { Modal } from "ant-design-vue";
import RenameCreation from "./components/RenameCreation.vue";
import Create3D from "./components/Create3D.vue";
import { currentMock } from "./creation.mock";
import { CREATIVE_TYPE, CREATIVE_TYPE_S } from "./components/Create3D.constant";
import { getMaterials, delMaterialCenter } from "./api";
import { useRouter } from "vue-router";
@@ -124,6 +120,8 @@ const router = useRouter();
const renameCreationRef = ref();
const create3DRef = ref();
const current = ref([0]);
const rows = ref([]);

View File

@@ -34,6 +34,16 @@ export function delMaterialCenter(id) {
})
}
/* 3D场景新增 */
export function createMaterialCenter(data) {
return request({
url: `/console/material_center`,
method: 'POST',
data
})
}
/* 素材库列表 */
export function getMaterialLibrary(params) {
return request({

View File

@@ -0,0 +1,65 @@
<template>
<div>
<div class="item" v-for="(item, index) in list" :key="index" :class="current.includes(item) ? 'selected' : ''" @click="toggle(item)">
<div class="cover">
<img src="" alt="">
</div>
<div class="title">
作品名称
</div>
</div>
<div style="clear: both;"></div>
</div>
</template>
<script setup>
const { ref }=require("@vue/reactivity");
const { onMounted }=require("@vue/runtime-core");
import { getMaterialLibrary } from "../api";
const props = defineProps(["type"])
const list = ref([]);
const current = ref([]);
const toggle = (item) => {
if(current.value.includes(item)){
current.value = current.value.filter(x => x != item);
}
else{
current.value.push(item);
}
};
onMounted(async () => {
const res = await getMaterialLibrary({
type: props.type, title: ""
});
list.value = res.data;
});
</script>
<style scoped lang="scss">
.item{
width: 31%;
border: solid 1px #eee;
outline: solid 1px #fff;
border-radius: 5px;
float: left;
margin: 5px 1%;
.cover{
width: 100%;
height: 120px;
}
.title{
line-height: 30px;
text-align: center;
}
}
.selected{
outline: solid 1px green;
}
</style>

View File

@@ -0,0 +1,945 @@
export const CREATIVE_TYPE = {
THREE_D: 1,
RING_360: 2,
MODEL_3D: 3,
};
export const CREATIVE_TYPE_S = [
{
type: CREATIVE_TYPE.THREE_D,
name: "3D虚拟门店"
},
{
type: CREATIVE_TYPE.RING_360,
name: "3D环物"
},
{
type: CREATIVE_TYPE.MODEL_3D,
name: "3D商品模型"
},
];
const factorys = [
{
type: CREATIVE_TYPE.THREE_D,
build: (data) => {
return {
"planetid": "scene1",
"name": "场景1",
"arrangementId": "bsld2da4",
"relShopId": "sllqkj4l",
"panorama": {
"url": "",
"urlSmall": "",
"urlThumb": "",
"urlDepth": "",
"urlShelfExr": "",
"rotationY": 0,
"multiply": 3
},
"shelves": [
{
"name": "货架1",
"planetid": "shelf1",
"id": "shelf1",
"url": "",
"urlThumb": "",
"hideWhenSurvey": true,
"cells": [
{
"name": "0-1",
"box": {
"position": {
"x": -0.6093719155636137,
"y": 1.1925115714503842,
"z": 0.45
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"size": {
"x": 0.3736,
"y": 0.2259,
"z": 0.2179
},
"child": {
"sign": {
"position": {
"x": -0.006,
"y": -0.029369916622918046,
"z": 0.1847
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "0-2",
"box": {
"position": {
"x": -0.18520626992561548,
"y": 1.1908614160723439,
"z": 0.45
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"size": {
"x": 0.3736,
"y": 0.2259,
"z": 0.2179
},
"child": {
"sign": {
"position": {
"x": -0.006,
"y": -0.03174731410176801,
"z": 0.1847
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "0-3",
"box": {
"position": {
"x": 0.2287325535366465,
"y": 1.1892382329257407,
"z": 0.45
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"size": {
"x": 0.3736,
"y": 0.2259,
"z": 0.2179
},
"child": {
"sign": {
"position": {
"x": -0.006,
"y": -0.028571714546698213,
"z": 0.1847
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "0-4",
"box": {
"position": {
"x": 0.661393068886308,
"y": 1.1909523674363642,
"z": 0.4537964589333506
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"size": {
"x": 0.3736,
"y": 0.2259,
"z": 0.2179
},
"child": {
"sign": {
"position": {
"x": -0.006,
"y": -0.03136253199426353,
"z": 0.1847
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "1-1",
"box": {
"position": {
"x": -0.605500512913119,
"y": 0.8538858659191146,
"z": 0.45017966628074646
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"size": {
"x": 0.37358155846595764,
"y": 0.225911445915699,
"z": 0.21794167160987854
},
"child": {
"sign": {
"position": {
"x": -0.0027324557304382324,
"y": -0.03184773059511403,
"z": 0.1743204391002655
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 0.7393795847892761,
"y": 0.05661093816161156,
"z": 0.05661093816161156
}
},
"logo": {
"position": {
"x": 0,
"y": 0.1499999999999999,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "1-2",
"box": {
"position": {
"x": -0.18658027999214435,
"y": 0.8512643658064176,
"z": 0.45017966628074646
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"size": {
"x": 0.37358155846595764,
"y": 0.225911445915699,
"z": 0.21794167160987854
},
"child": {
"sign": {
"position": {
"x": 0,
"y": -0.02759083972388149,
"z": 0.1743204391002655
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 0.7393795847892761,
"y": 0.05661093816161156,
"z": 0.05661093816161156
}
},
"logo": {
"position": {
"x": 0,
"y": 0.1499999999999999,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "1-3",
"box": {
"position": {
"x": 0.2230628973331703,
"y": 0.8511807287232012,
"z": 0.45017966628074646
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"size": {
"x": 0.37358155846595764,
"y": 0.225911445915699,
"z": 0.21794167160987854
},
"child": {
"sign": {
"position": {
"x": -0.005585700273513794,
"y": -0.032213962561231047,
"z": 0.1743204391002655
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 0.7393795847892761,
"y": 0.05661093816161156,
"z": 0.05661093816161156
}
},
"logo": {
"position": {
"x": 0,
"y": 0.1499999999999999,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "1-4",
"box": {
"position": {
"x": 0.6551478924840007,
"y": 0.8483097259524031,
"z": 0.45
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"size": {
"x": 0.3736,
"y": 0.2259,
"z": 0.2179
},
"child": {
"sign": {
"position": {
"x": -0.006,
"y": -0.02673691703609271,
"z": 0.1847
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "2-1",
"box": {
"position": {
"x": -0.60433011332925,
"y": 0.5125224579062782,
"z": 0.45017966628074646
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"size": {
"x": 0.37358155846595764,
"y": 0.225911445915699,
"z": 0.21794167160987854
},
"child": {
"sign": {
"position": {
"x": -0.0027324557304382324,
"y": -0.034508354476310954,
"z": 0.1743204391002655
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 0.7393795847892761,
"y": 0.05661093816161156,
"z": 0.05661093816161156
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15000000000000002,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "2-2",
"box": {
"position": {
"x": -0.1914175066620415,
"y": 0.5095275839341008,
"z": 0.45017966628074646
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"size": {
"x": 0.37358155846595764,
"y": 0.225911445915699,
"z": 0.21794167160987854
},
"child": {
"sign": {
"position": {
"x": 0,
"y": -0.027170852492222397,
"z": 0.1743204391002655
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 0.7393795847892761,
"y": 0.05661093816161156,
"z": 0.05661093816161156
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15000000000000002,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "2-3",
"box": {
"position": {
"x": 0.22360906333448538,
"y": 0.5101818344822482,
"z": 0.45017966628074646
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"size": {
"x": 0.37358155846595764,
"y": 0.225911445915699,
"z": 0.21794167160987854
},
"child": {
"sign": {
"position": {
"x": -0.005585700273513794,
"y": -0.030842453533999448,
"z": 0.1743204391002655
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 0.7393795847892761,
"y": 0.05661093816161156,
"z": 0.05661093816161156
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15000000000000002,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "2-4",
"box": {
"position": {
"x": 0.6482247451401058,
"y": 0.504394091002413,
"z": 0.45
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"size": {
"x": 0.3736,
"y": 0.2259,
"z": 0.2179
},
"child": {
"sign": {
"position": {
"x": -0.006,
"y": -0.02471250348374021,
"z": 0.1847
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "3-1",
"box": {
"position": {
"x": -0.6134215690979794,
"y": 0.1945505440235138,
"z": 0.45017966628074646
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"size": {
"x": 0.37358155846595764,
"y": 0.225911445915699,
"z": 0.21794167160987854
},
"child": {
"sign": {
"position": {
"x": -0.0027324557304382324,
"y": -0.024228371171756358,
"z": 0.1846828854084015
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 0.7393795847892761,
"y": 0.05661093816161156,
"z": 0.05661093816161156
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15000000000000002,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "3-2",
"box": {
"position": {
"x": -0.19111044416229633,
"y": 0.1945505440235138,
"z": 0.45017966628074646
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"size": {
"x": 0.37358155846595764,
"y": 0.225911445915699,
"z": 0.21794167160987854
},
"child": {
"sign": {
"position": {
"x": 0,
"y": -0.021009267483951266,
"z": 0.1846828854084015
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 0.7393795847892761,
"y": 0.05661093816161156,
"z": 0.05661093816161156
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15000000000000002,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "3-3",
"box": {
"position": {
"x": 0.21581759477578777,
"y": 0.1945505440235138,
"z": 0.45017966628074646
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"size": {
"x": 0.37358155846595764,
"y": 0.225911445915699,
"z": 0.21794167160987854
},
"child": {
"sign": {
"position": {
"x": -0.005585700273513794,
"y": -0.020448554878266023,
"z": 0.1846828854084015
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 0.7393795847892761,
"y": 0.05661093816161156,
"z": 0.05661093816161156
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15000000000000002,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
},
{
"name": "3-4",
"box": {
"position": {
"x": 0.6432047193626257,
"y": 0.19147498005043284,
"z": 0.45
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"size": {
"x": 0.3736,
"y": 0.2259,
"z": 0.2179
},
"child": {
"sign": {
"position": {
"x": -0.006,
"y": -0.013996807328698846,
"z": 0.1847
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
}
},
"logo": {
"position": {
"x": 0,
"y": 0.15,
"z": 0
}
}
}
},
"pileNumber": 2,
"pileRotationY": 0
}
],
"position": {
"x": 2.5193034425825944,
"y": -1.0605054800098004,
"z": 4.5102810375396984e-17
},
"rotation": {
"x": 0,
"y": -1.5707963267948966,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
},
"wares": []
}
]
}
}
},
{
type: CREATIVE_TYPE.RING_360,
build: (data) => {
}
},
{
type: CREATIVE_TYPE.MODEL_3D,
build: (data) => {
}
},
];
export const buildData = (data) => {
var factory = factorys.find(x => x.type == data.type);
if (!factory) throw new Error("Create3D.constant: 未找到素材数据构造方法");
return factory.build(data);
};

View File

@@ -0,0 +1,134 @@
<template>
<a-modal v-model:visible="visible" :title="title" width="800px" @ok="ok">
<a-steps v-if="formData.type==CREATIVE_TYPE.THREE_D" :current="step" size="small" style="margin: 0 auto; width: 80%;">
<a-step title="素材信息" />
<a-step title="选择环境" />
<a-step title="选择货架" />
<a-step title="选择商品" />
</a-steps>
<a-steps v-else :current="step" size="small" style="margin: 0 auto; width: 60%;">
<a-step title="素材信息" />
<a-step title="选择素材" />
</a-steps>
<a-form v-if="step==0" :label-col="{ span: 6 }" :wrapper-col="{ span: 14 }" style="margin: 40px 0;">
<a-form-item label="素材名称">
<a-input v-model:value="formData.title" placeholder="请输入素材名称" />
</a-form-item>
</a-form>
<div v-if="formData.type==CREATIVE_TYPE.THREE_D" style="margin: 20px 0;">
<div v-if="step==1">
<ChooseMarerial :type="THREE_D_TYPE.PANORAMA" v-model="formData.data.panorama"/>
</div>
<div v-if="step==2">
<ChooseMarerial :type="THREE_D_TYPE.SHELF" v-model="formData.data.shelves"/>
</div>
<div v-if="step==3">
<ChooseMarerial :type="THREE_D_TYPE.WARE" v-model="formData.data.wares"/>
</div>
</div>
<div v-if="formData.type==CREATIVE_TYPE.MODEL_3D" style="margin: 20px 0;">
<div v-if="step==1">
<ChooseMarerial :type="THREE_D_TYPE.CHARTLET" v-model="formData.data.panorama"/>
</div>
</div>
</a-modal>
</template>
<script setup>
import { UploadOutlined, InboxOutlined, MinusCircleFilled } from '@ant-design/icons-vue';
import { CREATIVE_TYPE_S, CREATIVE_TYPE, buildData } from "./Create3D.constant";
import { THREE_D_TYPE } from "./CreateMaterial.constant";
import ChooseMarerial from "./ChooseMarerial.vue"
const { ref, reactive }=require("@vue/reactivity");
import { createMaterialCenter } from "../api";
const emit = defineEmits(["complete"]);
const title = ref("");
const visible = ref(false);
const step = ref(0);
const formData = ref({
type: 1,
title: '',
cover: '',
data: {}
});
const show = (type) => {
const obj = CREATIVE_TYPE_S.find(x => x.type == type);
if(!obj) return;
title.value = obj.name;
var target = JSON.parse(JSON.stringify(obj));
target.title = "";
target.cover = "";
target.data = {};
formData.value = target;
step.value = 0;
visible.value = true;
}
const ok = async () => {
step.value++;
if(formData.value.type == CREATIVE_TYPE.THREE_D) {
if(step.value >= 4) {
formData.value.data = buildData(formData.value)
await createMaterialCenter(formData.value);
visible.value = false;
emit("complete");
}
}
else {
if(step.value >= 2) {
formData.value.data = buildData(formData.value)
await createMaterialCenter(formData.value);
visible.value = false;
emit("complete");
}
}
}
defineExpose({
show
})
</script>
<style scoped lang="scss">
.back{
cursor: pointer;
}
.ant-upload-drag-icon{
:deep(svg){
font-size: 50px!important;
}
}
.image-list{
.image-list-item{
width: 100px;
height: 100px;
display: inline-block;
margin-right: 10px;
position: relative;
font-size: 40px;
img{
max-width: 100%;
max-height: 100%;
}
.del{
color: red;
position: absolute;
right: -10px;
top: -10px;
:deep(*){
font-size: 20px;
}
}
}
}
</style>

View File

@@ -1,27 +0,0 @@
<template>
<div style="height: 70px; padding: 0 34px; line-height: 70px; border-bottom: solid 1px #eee;">
<span @click="back" class="back">
<i class="iconfont icon-xiangzuo-moren"></i>
<span>3D虚拟门店</span>
</span>
</div>
</template>
<script setup>
const { useRouter }=require("vue-router")
const router = useRouter();
const back = () => {
router.back();
}
</script>
<style scoped lang="scss">
.back{
cursor: pointer;
.icon-xiangzuo-moren {
font-size: 10px;
}
}
</style>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,387 @@
/* Works on Firefox */
* {
scrollbar-width: thin;
scrollbar-color: #ECECEC rgba(0, 0, 0, 0);
}
/* Works on Chrome, Edge, and Safari */
*::-webkit-scrollbar {
width: 4px;
height: 4px;
background: rgba(0, 0, 0, 0);
border-radius: 0;
}
/* *::-webkit-scrollbar-track {
} */
*::-webkit-scrollbar-thumb {
width: 4px;
height: 4px;
background: #ECECEC;
border-radius: 0;
}
/* Code for Firefox */
::-moz-selection {
color: #fff;
background: #70B936;
}
/* Code for Chrome, Edge, and Safari */
::selection {
color: #fff;
background: #70B936;
}
#app {
margin: 0px;
}
.yo-scrollbar {
display: flex;
flex-flow: column;
flex-wrap: wrap;
gap: 25px;
padding: 25px;
overflow-y: auto;
grid-template-columns: repeat(1, 1fr);
}
.yo-scrollbar2 {
display: flex;
flex-flow: column;
/* gap: 25px; */
padding: 25px;
overflow-y: auto;
}
.yo-content {
display: flex;
flex-flow: column;
gap: 25px;
padding-top: 25px;
}
.yo-thumb {
display: inline-block;
width: auto;
height: 130px;
/* color: #70B936; */
background-color: rgba(245, 245, 245, 0.6);
border: none;
box-sizing: border-box;
border-radius: 10px;
margin: 0;
text-align: center;
}
.yo-thumb:hover,
.yo-thumb:focus {
border: none;
cursor: pointer;
transform: scale(1.05);
}
.yo-thumb:active {
border: none;
cursor: pointer;
transform: scale(0.95);
}
.yo-thumb img {
width: 100%;
height: 100%;
border-radius: 10px;
}
.yo-obj-fit-cover {
object-fit: cover;
}
.yo-obj-fit-contain {
object-fit: contain;
}
.ant-input {
color: #434343;
}
.ant-input-affix-wrapper {
color: #434343;
border-color: #DFE0E3;
background: #FEFFFE;
border-radius: 6px;
padding-left: 4px;
}
.ant-input-affix-wrapper:hover {
border-color: #70B936;
}
.ant-input-affix-wrapper img {
width: 24px;
}
.ant-input-affix-wrapper-focused {
box-shadow: none;
}
.ant-input-affix-wrapper .ant-input-prefix,
.ant-input-affix-wrapper .ant-input-suffix {
color: #7E7E7E;
font-size: 12px;
}
.ant-slider-rail {
height: 6px;
background: #ECECEC;
border-radius: 3px;
}
.ant-slider-track {
height: 6px;
background: #7EC04A;
border-radius: 3px;
}
.ant-slider-handle {
width: 20px;
height: 20px;
margin-top: -7px;
background: #7EC04A;
border: 4px solid #DFF4D0;
}
.ant-slider-handle:focus {
border-color: #DFF4D0;
box-shadow: none;
}
.ant-slider-handle.ant-tooltip-open {
border-color: #DFF4D0;
}
.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) {
border-color: #DFF4D0;
}
.ant-slider-step {
height: 6px;
}
.ant-slider:hover .ant-slider-rail {
background: #ECECEC;
}
.ant-slider:hover .ant-slider-track {
background: #7EC04A;
}
.ant-tooltip-inner {
color: #fff;
background: #808080;
border-radius: 2px;
font-size: 12px;
line-height: 18px;
box-shadow: none;
}
.ant-radio-button-wrapper {
color: #434343;
border: none;
background: #f9f9f9;
}
.ant-radio-button-wrapper:hover {
color: #7EC04A;
background: #f9f9f9;
}
/* .ant-radio-button-wrapper:active {
color: #7EC04A;
background: #f9f9f9;
} */
.ant-radio-button-wrapper:first-child {
border: none;
border-radius: 6px 0 0 6px;
}
.ant-radio-button-wrapper:last-child {
border: none;
border-radius: 0 6px 6px 0;
}
.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {
color: #ffffff;
background: #7EC04A;
border: none;
}
.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover {
color: #ffffff;
background: #7EC04A;
border: none;
}
.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within {
box-shadow: none;
}
.ant-radio-button-wrapper:not(:first-child)::before {
background: none;
}
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)::before {
background: none;
}
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover::before {
background: none;
}
.ant-divider {
color: #F5F5F5;
margin: 0;
}
.empty1 {
font-size: 14px;
font-weight: 400;
letter-spacing: 2px;
color: #434343;
text-align: center;
}
.yo-title-s16 {
font-size: 16px;
font-weight: 600;
letter-spacing: 2px;
color: #434343;
}
.yo-title-s14 {
font-size: 14px;
font-weight: 400;
letter-spacing: 2px;
color: #434343;
}
.yo-icon img {
width: 100%;
height: 100%;
}
/* element plus */
.el-button {
min-width: 88px;
}
.el-button--small {
font-size: 11px;
}
.el-scrollbar__bar.is-vertical {
width: 4px;
top: 0;
}
.el-scrollbar__bar {
right: 0;
bottom: 0;
border-radius: 0;
}
.el-dialog__headerbtn {
font-size: 20px;
}
.el-dialog__footer {
text-align: center;
}
.dialog-footer button:first-child {
margin-right: 40px;
}
.el-collapse {
border: none;
background: none;
}
.el-collapse-item__header {
border: none;
background: none;
font-weight: 600;
font-size: 11px;
}
.el-collapse-item__wrap {
border: none;
background: none;
}
.el-collapse-item__content {
font-size: 11px;
}
.el-slider {
height: 24px;
--el-slider-border-radius: 3px;
--el-slider-height: 1px;
--el-slider-button-size: 10px;
--el-slider-button-wrapper-size: 8px;
--el-slider-button-wrapper-offset: -8px;
}
.el-slider__button {
border: solid 1px var(--el-slider-main-bg-color);
}
.el-slider__bar {
background: none;
}
.el-input.is-disabled .el-input__wrapper {
background-color: #ffffff;
}
.yo-special-input .yo-input-small .el-input__wrapper {
padding: 1px 16px 1px 8px;
}
.el-input-number.is-controls-right .el-input__wrapper {
padding-left: 8px;
padding-right: 24px;
}
.el-input-number--small .el-input-number__decrease,
.el-input-number--small .el-input-number__increase {
width: 16px;
font-size: 11px;
}
.yo-input-number-small {
width: 56px;
}
.yo-input-small {
font-size: 11px;
height: 24px;
}
.yo-line {
width: 100%;
height: 1px;
background-color: #efefef;
}
.yo-v-gap {
width: 100%;
height: 8px;
}
/* antdv */