baiqiu-cms-decoration-dg 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/.babelrc +17 -0
  2. package/.editorconfig +9 -0
  3. package/.prettierrc +8 -0
  4. package/README.md +18 -0
  5. package/dist/baiqiu-cms-decoration.min.js +26 -0
  6. package/dist/baiqiu-cms-decoration.min.js.map +1 -0
  7. package/dist/font/iconfont.eot +0 -0
  8. package/dist/font/iconfont.svg +89 -0
  9. package/dist/font/iconfont.ttf +0 -0
  10. package/dist/font/iconfont.woff +0 -0
  11. package/dist/iconfont.svg +1 -0
  12. package/index.html +11 -0
  13. package/package.json +48 -0
  14. package/src/App.vue +198 -0
  15. package/src/api/com-service.js +26 -0
  16. package/src/assets/iconfont/demo.css +539 -0
  17. package/src/assets/iconfont/iconfont.css +158 -0
  18. package/src/assets/iconfont/iconfont.eot +0 -0
  19. package/src/assets/iconfont/iconfont.json +254 -0
  20. package/src/assets/iconfont/iconfont.svg +89 -0
  21. package/src/assets/iconfont/iconfont.ttf +0 -0
  22. package/src/assets/iconfont/iconfont.woff +0 -0
  23. package/src/assets/iconfont/iconfont.woff2 +0 -0
  24. package/src/assets/img/pc-cms-v2/creation.png +0 -0
  25. package/src/assets/img/pc-cms-v2/icon.png +0 -0
  26. package/src/assets/img/pc-cms-v2/mobileNav.png +0 -0
  27. package/src/assets/img/pc-cms-v2/next1.png +0 -0
  28. package/src/assets/img/pc-cms-v2/next2.png +0 -0
  29. package/src/assets/img/pc-cms-v2/prev1.png +0 -0
  30. package/src/assets/img/pc-cms-v2/prev2.png +0 -0
  31. package/src/assets/img/pc-cms-v2/text.png +0 -0
  32. package/src/components/cms/animate.scss +19 -0
  33. package/src/components/cms/buttonItem/buttonItem.js +139 -0
  34. package/src/components/cms/buttonItem/buttonItem.scss +95 -0
  35. package/src/components/cms/buttonItem/buttonItem.vue +47 -0
  36. package/src/components/cms/buttonItem/index.js +2 -0
  37. package/src/components/cms/cms.js +102 -0
  38. package/src/components/cms/cms.scss +46 -0
  39. package/src/components/cms/cms.vue +48 -0
  40. package/src/components/cms/customLayout/customLayout.js +46 -0
  41. package/src/components/cms/customLayout/customLayout.scss +8 -0
  42. package/src/components/cms/customLayout/customLayout.vue +15 -0
  43. package/src/components/cms/customLayout/index.js +2 -0
  44. package/src/components/cms/hotspot/hotspot.js +199 -0
  45. package/src/components/cms/hotspot/hotspot.scss +20 -0
  46. package/src/components/cms/hotspot/hotspot.vue +35 -0
  47. package/src/components/cms/hotspot/index.js +2 -0
  48. package/src/components/cms/imgNav/imgNav.js +177 -0
  49. package/src/components/cms/imgNav/imgNav.scss +110 -0
  50. package/src/components/cms/imgNav/imgNav.vue +123 -0
  51. package/src/components/cms/imgNav/index.js +2 -0
  52. package/src/components/cms/index.js +2 -0
  53. package/src/components/cms/mixin.js +244 -0
  54. package/src/components/cms/multipleLayout/index.js +2 -0
  55. package/src/components/cms/multipleLayout/multipleLayout.js +54 -0
  56. package/src/components/cms/multipleLayout/multipleLayout.scss +21 -0
  57. package/src/components/cms/multipleLayout/multipleLayout.vue +25 -0
  58. package/src/components/cms/productItem/index.js +2 -0
  59. package/src/components/cms/productItem/productItem.js +293 -0
  60. package/src/components/cms/productItem/productItem.scss +180 -0
  61. package/src/components/cms/productItem/productItem.vue +117 -0
  62. package/src/components/cms/singleLayout/index.js +2 -0
  63. package/src/components/cms/singleLayout/singleLayout.js +72 -0
  64. package/src/components/cms/singleLayout/singleLayout.scss +21 -0
  65. package/src/components/cms/singleLayout/singleLayout.vue +39 -0
  66. package/src/components/cms/slideLayout/index.js +2 -0
  67. package/src/components/cms/slideLayout/slideLayout.js +248 -0
  68. package/src/components/cms/slideLayout/slideLayout.scss +18 -0
  69. package/src/components/cms/slideLayout/slideLayout.vue +44 -0
  70. package/src/components/cms/swiperItem/index.js +2 -0
  71. package/src/components/cms/swiperItem/swiperItem.js +228 -0
  72. package/src/components/cms/swiperItem/swiperItem.scss +204 -0
  73. package/src/components/cms/swiperItem/swiperItem.vue +123 -0
  74. package/src/components/cms/tabLayout/index.js +2 -0
  75. package/src/components/cms/tabLayout/navItem/index.js +2 -0
  76. package/src/components/cms/tabLayout/navItem/navItem.js +47 -0
  77. package/src/components/cms/tabLayout/navItem/navItem.scss +23 -0
  78. package/src/components/cms/tabLayout/navItem/navItem.vue +13 -0
  79. package/src/components/cms/tabLayout/tabLayout.js +158 -0
  80. package/src/components/cms/tabLayout/tabLayout.scss +26 -0
  81. package/src/components/cms/tabLayout/tabLayout.vue +43 -0
  82. package/src/components/cms/textItem/index.js +2 -0
  83. package/src/components/cms/textItem/textItem.js +72 -0
  84. package/src/components/cms/textItem/textItem.scss +41 -0
  85. package/src/components/cms/textItem/textItem.vue +26 -0
  86. package/src/components/cms/utils.js +101 -0
  87. package/src/components/cms/videoItem/index.js +2 -0
  88. package/src/components/cms/videoItem/videoItem.js +96 -0
  89. package/src/components/cms/videoItem/videoItem.scss +27 -0
  90. package/src/components/cms/videoItem/videoItem.vue +56 -0
  91. package/src/components/cms/videoPlayer/index.js +2 -0
  92. package/src/components/cms/videoPlayer/videoPlayer.js +69 -0
  93. package/src/components/cms/videoPlayer/videoPlayer.scss +37 -0
  94. package/src/components/cms/videoPlayer/videoPlayer.vue +34 -0
  95. package/src/index.js +26 -0
  96. package/src/index.scss +213 -0
  97. package/src/main.js +7 -0
  98. package/src/utils/common.js +23 -0
  99. package/src/utils/http-client.js +111 -0
  100. package/src/utils/utils.js +63 -0
  101. package/webpack.config.js +113 -0
@@ -0,0 +1,47 @@
1
+ <template>
2
+ <div
3
+ :style="{
4
+ width: Math.round(attributeJson.baseStyle.w * ratio) + 'px',
5
+ height: Math.round(attributeJson.baseStyle.h * ratio) + 'px',
6
+ left: Math.round(attributeJson.baseStyle.l * ratio) + 'px',
7
+ top: Math.round(attributeJson.baseStyle.t * ratio) + 'px'
8
+ }"
9
+ class="button-wrap"
10
+ >
11
+ <div class="entrance-con">
12
+ <div
13
+ :ref="`button${attributeJson.sort}`"
14
+ :class="['button-cl', `button-cl-${sortId}`, animationInObj.type ? enterClass : '']" v-show="entranceShow"
15
+ @click="pageClick"
16
+ :style="{ animationDuration: `${animationInObj.duration}s` }">
17
+ <div
18
+ class="button-content"
19
+ :class="[{ flexCenterBetween: iconImage }, animationHoverObj.type === 4 ? hoverDirection : '']"
20
+ @mouseover.stop="textMouseOver"
21
+ @mouseleave="textMouseLeave"
22
+ :style="[buttonStyle, { '--width': hoverStyleShow ? '100%' : '0', '--height': hoverStyleShow ? '100%' : '0', '--bgColor': animationHoverObj.bgStyle.backgroundColor }]"
23
+ v-hoverAnimate
24
+ >
25
+ <img v-if="iconStyle.type === 1 && iconStyle.position === 1 && iconImage" :src="iconImage" alt="" />
26
+ <div class="label" :style="hoverButtonStyle">{{ attributeJson.label || '按钮' }}</div>
27
+ <img v-if="iconStyle.type === 1 && iconStyle.position === 2 && iconImage" :src="iconImage" alt="" />
28
+
29
+ <!-- 换图 -->
30
+ <img class="hover-image" :src="hoverImage" alt="" v-if="animationHoverObj.type === 5 && hoverImage && hoverStyleShow" />
31
+ </div>
32
+ <!-- 边框 -->
33
+ <div class="hover-con" v-if="animationHoverObj.type === 2" :style="[hoverStyle, { opacity: hoverStyleShow ? 1 : 0, borderRadius: attributeJson.borderStyle.borderRadius + 'px' }]"></div>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </template>
38
+
39
+ <script>
40
+ import buttonItemJs from './buttonItem.js'
41
+ export default buttonItemJs
42
+ </script>
43
+
44
+ <style lang="scss" scoped>
45
+ @import 'buttonItem';
46
+ @import '../animate.scss';
47
+ </style>
@@ -0,0 +1,2 @@
1
+ import buttonItem from './buttonItem.vue'
2
+ export default buttonItem
@@ -0,0 +1,102 @@
1
+ // import draggable from 'vuedraggable'
2
+ import singleLayout from './singleLayout/'
3
+ import multipleLayout from './multipleLayout/'
4
+ import customLayout from './customLayout/'
5
+ import tabLayout from "./tabLayout/";
6
+ import slideLayout from './slideLayout/';
7
+
8
+ export default {
9
+ name: 'cms',
10
+ inheritAttrs: false,
11
+ components: {
12
+ // draggable,
13
+ singleLayout, //单列布局
14
+ multipleLayout, //多列布局
15
+ customLayout, // 自定义
16
+ tabLayout, // 导航
17
+ slideLayout, // 滑动容器
18
+ },
19
+ props: {
20
+ cmsList: {
21
+ type: Array,
22
+ default: () => []
23
+ },
24
+ canDrag: {
25
+ type: Boolean,
26
+ default: true
27
+ },
28
+ mode: {
29
+ type: String,
30
+ default: 'pc'
31
+ },
32
+ ratio: {
33
+ type: Number,
34
+ default: 1
35
+ },
36
+ envUrl: {
37
+ type: String,
38
+ default: ''
39
+ },
40
+ path: {
41
+ type: String
42
+ }
43
+ },
44
+ data() {
45
+ return {
46
+ chooseSort: '', //选中的元素标识
47
+ activeIndex: -1, // 鼠标悬浮的元素位置
48
+ layOutObj: {
49
+ 1:'singleLayout',
50
+ 2:'multipleLayout',
51
+ 3:'customLayout',
52
+ 4:'tabLayout',
53
+ 5:'slideLayout'
54
+ }
55
+ }
56
+ },
57
+ mounted() {
58
+ this.$nextTick(()=>{
59
+ var commom = require('../../utils/common')
60
+ commom.scroll(this)
61
+ commom.entrance(this)
62
+ });
63
+ },
64
+ methods: {
65
+ dragChange(e) {
66
+ // 拖拽添加元素
67
+ if (e.added) {
68
+ this.chooseSort = e.added.element.sort
69
+ this.$emit('updateLayOut', { layoutType: e.added.element.layoutType, sort: this.chooseSort})
70
+ this.ratio = this.$refs.cms.offsetWidth / (this.mode == 'pc' ? 1920 : 750)
71
+ this.$emit('dragChange', e.added)
72
+ }
73
+
74
+ if(e.moved) {
75
+ this.$emit('saveVersionId')
76
+ }
77
+ },
78
+ chooseLayout(layoutType, sort) {
79
+ this.chooseSort = sort
80
+ this.$emit('updateLayOut', { layoutType, sort})
81
+ },
82
+ updateSort(sort) {
83
+ this.chooseSort = sort
84
+ },
85
+ // 删除布局组件
86
+ deleteModule(index, sort) {
87
+ // 若删除的为当前选中布局, 特殊处理
88
+ if(sort === this.chooseSort) {
89
+ this.$emit('deleteModule', index)
90
+ } else {
91
+ this.cmsList.splice(index, 1)
92
+ this.$emit('saveVersionId')
93
+ }
94
+ },
95
+ // 控制组件展示或隐藏
96
+ showOrHide(index) {
97
+ let item = this.cmsList[index]
98
+ this.$set(item, 'displayType', item.displayType ? 0 : 1)
99
+ this.$emit('componentChange', item.sort)
100
+ }
101
+ }
102
+ }
@@ -0,0 +1,46 @@
1
+ .lay-wrap {
2
+ width: 100%;
3
+
4
+ .vdr {
5
+ border: none;
6
+ touch-action: auto;
7
+ }
8
+
9
+ .lay-item {
10
+ border: none;
11
+ position: relative;
12
+ width: 100%;
13
+ display: flex;
14
+ justify-content: center;
15
+ background-color: #fff;
16
+
17
+ .btn-wrap {
18
+ width: 136px;
19
+ height: 40px;
20
+ background-color: #1890FF;
21
+ color: #fff;
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ position: absolute;
26
+ right: -1px;
27
+ border-radius: 8px 0px 0px;
28
+ bottom: 0;
29
+
30
+ .icon {
31
+ font-size: 16px;
32
+ cursor: pointer;
33
+ }
34
+
35
+ .iconrank {
36
+ font-size: 19px;
37
+ margin-right: 16px;
38
+ }
39
+
40
+ .iconvisibility, .iconyincang {
41
+ margin-right: 18px;
42
+ font-size: 20px;
43
+ }
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,48 @@
1
+ <template>
2
+ <div ref="cms">
3
+ <div
4
+ :class="['lay-wrap', { mobile: mode == 'mobile' }]"
5
+ >
6
+ <div
7
+ class="lay-item"
8
+ v-for="(item, index) in cmsList"
9
+ :key="item.sort"
10
+ >
11
+ <div
12
+ class="layout-set"
13
+ :style="{
14
+ width: item.attributeJson.layoutStyle && item.attributeJson.layoutStyle.widthStyle.type === 2 ? item.attributeJson.layoutStyle.widthStyle.width + '%' : '100%',
15
+ height: item.attributeJson.layoutStyle ? Math.round(item.attributeJson.layoutStyle.height * ratio) + 'px' : 'auto'
16
+ }"
17
+ >
18
+ <component
19
+ ref="layModule"
20
+ :is="layOutObj[item.layoutType]"
21
+ v-bind="$attrs"
22
+ v-on="$listeners"
23
+ :layOutData="item.attributeJson"
24
+ :sort="item.attributeJson.sort"
25
+ :ratio="ratio"
26
+ :mode="mode"
27
+ :recordId="item.originalId"
28
+ :envUrl="envUrl"
29
+ :path="path"
30
+ >
31
+ <template v-if="item.layoutType === 3" slot="customComponent" slot-scope="scope">
32
+ <slot name="customComponent" :attributeJson="scope.attributeJson"></slot>
33
+ </template>
34
+ </component>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </template>
40
+
41
+ <script>
42
+ import cmsJs from "./cms.js";
43
+ export default cmsJs;
44
+ </script>
45
+
46
+ <style lang="scss" scoped>
47
+ @import "cms";
48
+ </style>
@@ -0,0 +1,46 @@
1
+ import { dataSaveDecorationPageComponentEventFn } from '../../../utils/utils';
2
+ export default {
3
+ name: 'customLayout',
4
+ props: {
5
+ layOutData: {
6
+ type: Object,
7
+ default: () => {}
8
+ },
9
+ envUrl: {
10
+ type: String,
11
+ default: ''
12
+ },
13
+ path: {
14
+ type: String
15
+ }
16
+ },
17
+ inheritAttrs: false,
18
+ methods:{
19
+ // 上报数据
20
+ reportData(h) {
21
+ if(this.isReport) return
22
+ let ref = this.$refs[`custom${this.layOutData.sort}`]
23
+ if(!ref) return
24
+ let el = ref.getBoundingClientRect()
25
+ if(el.top <= h && el.top >= 0) {
26
+ this.isReport = true
27
+ dataSaveDecorationPageComponentEventFn(
28
+ {
29
+ uniqueId: this.layOutData.sort, // 组件_id
30
+ uniqueName: this.uniqueName, // 组件_名称
31
+ componentType: 7,
32
+ popData: {},
33
+ materialId: this.layOutData.sort, //素材id
34
+ materialName: this.uniqueName, //素材名称
35
+ refererPagePath: this.refererPagePath,
36
+ brand: this.brand,
37
+ path: this.path,
38
+ position: 1,
39
+ event: 'bannerShow'
40
+ },
41
+ this.envUrl
42
+ )
43
+ }
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,8 @@
1
+ .custom-layout{
2
+ width: 100%;
3
+ height: 100%;
4
+ display: flex;
5
+ justify-content: center;
6
+ align-items: center;
7
+ position: relative;
8
+ }
@@ -0,0 +1,15 @@
1
+ <template>
2
+ <div class="custom-layout" :ref="`custom${layOutData.sort}`">
3
+ <div class="add-con"></div>
4
+ <slot name="customComponent" :attributeJson="layOutData"></slot>
5
+ </div>
6
+ </template>
7
+
8
+ <script>
9
+ import customLayoutJs from './customLayout.js'
10
+ export default customLayoutJs
11
+ </script>
12
+
13
+ <style lang="scss" scoped>
14
+ @import "customLayout";
15
+ </style>
@@ -0,0 +1,2 @@
1
+ import customLayout from './customLayout.vue'
2
+ export default customLayout
@@ -0,0 +1,199 @@
1
+ import { ComService } from "../../../api/com-service";
2
+ import { dataSaveDecorationPageComponentEventFn } from '../../../utils/utils'
3
+ export default {
4
+ name: 'hotspot',
5
+ props: {
6
+ item: {
7
+ type: Object,
8
+ default: () => {}
9
+ },
10
+ width: {
11
+ type: Number,
12
+ default: 0
13
+ },
14
+ height: {
15
+ type: Number,
16
+ default: 0
17
+ },
18
+ ratio: {
19
+ type: Number,
20
+ default: 1
21
+ },
22
+ envUrl: {
23
+ type: String,
24
+ default:''
25
+ },
26
+ // 组件sort
27
+ sortId: {
28
+ type: Number,
29
+ default: 0
30
+ },
31
+ // 最外层布局recordId
32
+ recordId: {
33
+ type: Number,
34
+ default: 0
35
+ },
36
+ brand: {
37
+ type: String
38
+ },
39
+ componentType: {
40
+ type: Number
41
+ },
42
+ refererPagePath: {
43
+ type: String
44
+ },
45
+ path: {
46
+ type: String,
47
+ },
48
+ pathType: {
49
+ type: Number
50
+ },
51
+ uniqueName: {
52
+ type: String
53
+ },
54
+ language: {
55
+ type: String,
56
+ default: 'zh-CN'
57
+ },
58
+ // 适用于轮播图的热区坑位上报,因为轮播图loop前后复制的原因,会造成复制的元素拿不到preTotal
59
+ prePosition: {
60
+ type: Number
61
+ }
62
+ },
63
+ data() {
64
+ return {
65
+ hotList: [],
66
+ proportion: 1,
67
+ hoverIndex: 1,
68
+ needReport: true, // 是否需要上报
69
+ preTotal: 0,
70
+ service: new ComService(),
71
+ }
72
+ },
73
+ watch: {
74
+ 'item.width': {
75
+ handler(val) {
76
+ this.proportion = val / 750
77
+ },
78
+ deep: true,
79
+ immediate: true
80
+ },
81
+ itemCodeList: {
82
+ handler(val) {
83
+ this.getProductList(val)
84
+ },
85
+ immediate: true,
86
+ deep: true
87
+ }
88
+ },
89
+ computed: {
90
+ itemCodeList() {
91
+ let pop = this.item.popList.filter(item => {
92
+ return item.jumpLinkType == 1 && item.product.imageType == 1
93
+ })
94
+ return pop.map(item=> {
95
+ return item.productCode
96
+ })
97
+ }
98
+ },
99
+ mounted() {
100
+ this.hotList = JSON.parse(JSON.stringify(this.item.popList))
101
+ },
102
+ methods: {
103
+ // 点击热区
104
+ pageClick(val,index) {
105
+ if(val.jumpLinkType) {
106
+ try {
107
+ dataSaveDecorationPageComponentEventFn(
108
+ {
109
+ uniqueId: this.recordId + '_' + this.sortId, // 组件_id
110
+ uniqueName: this.uniqueName, // 组件_名称
111
+ componentMethodType: 1,
112
+ popData: {
113
+ ...val,
114
+ uniqueId: this.recordId + '_' + this.sortId + '_' + val.uniqueId('_')[2],
115
+ brand: this.pathType === 1 ? 'defaultPath' : this.brand
116
+ },
117
+ materialId: this.item.sort ? this.recordId + '_' + this.item.sort : this.recordId + '_' + this.sortId, //素材id
118
+ materialName: this.item.uniqueName ? this.item.uniqueName : this.uniqueName, //素材名称
119
+ refererPagePath: this.refererPagePath,
120
+ componentType: this.componentType,
121
+ path: this.path,
122
+ brand: this.brand,
123
+ position: this.prePosition? this.prePosition + index + 1 : this.preTotal*1 + index + 1,
124
+ event: 'bannerClick'
125
+ },
126
+ this.envUrl
127
+ )
128
+ } catch(err) {
129
+
130
+ }
131
+ }
132
+ this.$emit('jumpLink', val)
133
+ },
134
+ // 获取商品列表
135
+ getProductList(itemCodeList) {
136
+ if(itemCodeList.length == 0) return
137
+ let params = {
138
+ itemCodeList: itemCodeList,
139
+ pageNum: 1,
140
+ pageSize: itemCodeList.length
141
+ }
142
+ let productImage = {}
143
+ this.service.getProductInfo(this.envUrl, params, this.language).then(res => {
144
+ if (res && res.list) {
145
+ this.productList = res.list;
146
+ res.list.forEach(item => {
147
+ productImage[item.code] = item.mainPicUrl
148
+ })
149
+ this.productImage = productImage
150
+ }
151
+ })
152
+ },
153
+ reportData(h, preTotal = 0) {
154
+ this.preTotal = preTotal
155
+ let arr = this.hotList || []
156
+ if(!this.needReport) return
157
+
158
+ this.needReport = arr.some(item=>{
159
+ return !item.isReport
160
+ })
161
+ arr.forEach((ele, i) => {
162
+ // 若已上报不重复上报
163
+ if (!ele.isReport) {
164
+ let hotEl = this.$refs[`${this.sortId}${i}`][0].getBoundingClientRect()
165
+ if (hotEl.top <= h && hotEl.top >= -100) {
166
+ arr[i].isReport = true
167
+ let obj = arr[i]
168
+ dataSaveDecorationPageComponentEventFn(
169
+ {
170
+ uniqueId: this.recordId + '_' + this.sortId, // 组件_id
171
+ uniqueName: this.uniqueName, // 组件_名称
172
+ // componentMethodType: 0,
173
+ popData: {
174
+ ...obj,
175
+ // brand: this.pathType === 1 ? 'defaultPath' : this.brand
176
+ },
177
+ materialId: this.item.sort ? this.recordId + '_' +this.item.sort : this.recordId + '_' + this.sortId, //素材id
178
+ materialName: this.item.uniqueName ? this.item.uniqueName : this.uniqueName, //素材名称
179
+ refererPagePath: this.refererPagePath,
180
+ path: this.path,
181
+ componentType: this.componentType,
182
+ brand: this.brand,
183
+ position: preTotal + i + 1,
184
+ event: 'bannerShow'
185
+ },
186
+ this.envUrl
187
+ )
188
+ }
189
+ }
190
+ })
191
+ },
192
+ mouseover(index) {
193
+ this.hoverIndex = index
194
+ },
195
+ mouseLeave() {
196
+ this.hoverIndex = -1
197
+ }
198
+ },
199
+ }
@@ -0,0 +1,20 @@
1
+ .pop-wrap {
2
+ position: absolute;
3
+ .pop-item {
4
+ position: absolute;
5
+ cursor: pointer;
6
+
7
+ .product-hover {
8
+ font-size: 0;
9
+ display: flex;
10
+ align-items: center;
11
+ position: relative;
12
+ height: 100%;
13
+
14
+ .product-image {
15
+ font-size: 0;
16
+ padding-left: 10px;
17
+ }
18
+ }
19
+ }
20
+ }
@@ -0,0 +1,35 @@
1
+ <template>
2
+ <div class="pop-wrap" :style="{left: item.left, top: item.top, width: item.realWidth * ratio+'px' || '100%', height: item.realHeight * ratio+'px' || '100%'}">
3
+ <div
4
+ :ref="`${sortId}${index}`"
5
+ :class="`pop-item`"
6
+ v-for="(ele,index) in item.popList"
7
+ :key="index"
8
+ @click="pageClick(ele, index)"
9
+ :style="{
10
+ width: `${ele.width / 750 * 100 }%`,
11
+ height:`${ele.height / (item.height / proportion) * 100}%`,
12
+ left: `${ele.left / 750 * 100 }%`,
13
+ top: `${ele.top / (item.height /proportion) * 100}%`
14
+ }">
15
+ <div class="product-hover" v-if="ele.product.openHot" @mouseover="mouseover(index)" @mouseleave="mouseLeave">
16
+ <div v-if="ele.product.initImage.length!=0" style="{fontSize: 0}">
17
+ <img :src="hoverIndex == index ?ele.product.hoverImage[0].resourcePath: ele.product.initImage[0].resourcePath" alt="">
18
+ </div>
19
+
20
+ <div v-if="hoverIndex == index" class="product-image">
21
+ <img :src="ele.product.imageType == 1 ? productImage[ele.productCode] : ele.product.productImage[0].resourcePath" alt="">
22
+ </div>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ </template>
27
+
28
+ <script>
29
+ import hotspotJs from './hotspot.js';
30
+ export default hotspotJs;
31
+ </script>
32
+
33
+ <style lang="scss" scoped>
34
+ @import 'hotspot';
35
+ </style>
@@ -0,0 +1,2 @@
1
+ import hotspot from './hotspot.vue';
2
+ export default hotspot;