gxd-uni-library-editx 1.0.0

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 (215) hide show
  1. package/.editorconfig +14 -0
  2. package/README.md +447 -0
  3. package/index.js +3 -0
  4. package/package.json +104 -0
  5. package/postcss.config.js +22 -0
  6. package/settings.js.tpl +68 -0
  7. package/src/XdAppClass.1.0.js +257 -0
  8. package/src/XdAppClass.js +150 -0
  9. package/src/components/XdAddress/XdAddress.vue +579 -0
  10. package/src/components/XdAddressSelect/XdAddressSelect.vue +243 -0
  11. package/src/components/XdBaiduMap/XdBaiduMap.vue +204 -0
  12. package/src/components/XdBaiduOverlay/XdBaiduOverlay.vue +345 -0
  13. package/src/components/XdBaiduSearch/XdBaiduSearch.vue +354 -0
  14. package/src/components/XdBar/XdBar.vue +339 -0
  15. package/src/components/XdButton/XdButton.vue +288 -0
  16. package/src/components/XdCartList/XdCartList.vue +791 -0
  17. package/src/components/XdCartNoStoreList/XdCartNoStoreList.vue +747 -0
  18. package/src/components/XdCity/XdCity.vue +620 -0
  19. package/src/components/XdCity/city.js +93 -0
  20. package/src/components/XdCity/testData.js +124 -0
  21. package/src/components/XdCityLocation/XdCityLocation.vue +314 -0
  22. package/src/components/XdCityLocation/jweixin.js +72 -0
  23. package/src/components/XdCityShow/XdCityShow.vue +354 -0
  24. package/src/components/XdClipImage/XdClipImage.vue +879 -0
  25. package/src/components/XdCoins/XdCoins.vue +66 -0
  26. package/src/components/XdConfirm/XdConfirm.vue +240 -0
  27. package/src/components/XdContentXss/XdContentXss.vue +71 -0
  28. package/src/components/XdDailog/XdDailog.vue +258 -0
  29. package/src/components/XdDate/XdDataItemOne.vue +236 -0
  30. package/src/components/XdDate/XdDate.vue +1081 -0
  31. package/src/components/XdDate/XdDateItem.vue +316 -0
  32. package/src/components/XdDate/XdDateTime.vue +929 -0
  33. package/src/components/XdDate/i18n/en.json +19 -0
  34. package/src/components/XdDate/i18n/index.js +8 -0
  35. package/src/components/XdDate/i18n/zh-Hans.json +19 -0
  36. package/src/components/XdDate/i18n/zh-Hant.json +19 -0
  37. package/src/components/XdDate/keypress.js +45 -0
  38. package/src/components/XdDate/util.js +418 -0
  39. package/src/components/XdDownDrawer/XdDownDrawer.vue +176 -0
  40. package/src/components/XdEditPwd/XdEditPwd.vue +305 -0
  41. package/src/components/XdEnterOrderList/XdEnterOrderList.vue +413 -0
  42. package/src/components/XdExpressTimeLine/XdExpressTimeLine.vue +280 -0
  43. package/src/components/XdFilter/XdFilter.vue +541 -0
  44. package/src/components/XdFontIcon/XdFontIcon.vue +165 -0
  45. package/src/components/XdFontIcon/css/icon.less +498 -0
  46. package/src/components/XdFooterBar/XdFooterBar.vue +291 -0
  47. package/src/components/XdFooterTabbar/XdFooterTabbar.vue +284 -0
  48. package/src/components/XdForm/XdForm.vue +481 -0
  49. package/src/components/XdForm/validate.js +486 -0
  50. package/src/components/XdFormCheckbox/XdFormCheckbox.vue +858 -0
  51. package/src/components/XdFormDate.vue +187 -0
  52. package/src/components/XdFormInput/XdFormInput.vue +535 -0
  53. package/src/components/XdFormInput/common.js +56 -0
  54. package/src/components/XdFormItem/XdFormItem.vue +583 -0
  55. package/src/components/XdFormSelect/XdFormSelect.vue +119 -0
  56. package/src/components/XdImage/XdImage.vue +113 -0
  57. package/src/components/XdItemCardUser/XdItemCardUser.vue +232 -0
  58. package/src/components/XdItemFilmImage/XdItemFilmImage.vue +146 -0
  59. package/src/components/XdItemFilmText/XdItemFilmText.vue +83 -0
  60. package/src/components/XdItemPhysical/XdItemPhysical.vue +410 -0
  61. package/src/components/XdItemPhysicalPack/XdItemPhysicalPack.vue +240 -0
  62. package/src/components/XdItemStore/XdItemStore.vue +236 -0
  63. package/src/components/XdItemUserInfo/XdItemUserInfo.vue +175 -0
  64. package/src/components/XdJson/XdJson.vue +398 -0
  65. package/src/components/XdKeyValue/XdKeyValue.vue +150 -0
  66. package/src/components/XdLabelNew/XdLabelNew.vue +193 -0
  67. package/src/components/XdLayout/XdLayout.vue +634 -0
  68. package/src/components/XdLoading/XdLoading.vue +165 -0
  69. package/src/components/XdMore/XdMore.vue +66 -0
  70. package/src/components/XdMpHtml/XdMpHtml.vue +458 -0
  71. package/src/components/XdMpHtml/node/node.vue +536 -0
  72. package/src/components/XdMpHtml/parser.js +1260 -0
  73. package/src/components/XdMpHtml/static/js/handler.js +1 -0
  74. package/src/components/XdMpHtml/static/js/uni.webview.min.js +1 -0
  75. package/src/components/XdMpHtml/static/local.html +1 -0
  76. package/src/components/XdMy/XdMy.vue +294 -0
  77. package/src/components/XdMySuccess/XdMySuccess.vue +603 -0
  78. package/src/components/XdNavTab/XdNavTab.vue +147 -0
  79. package/src/components/XdNoData/XdNoData.vue +87 -0
  80. package/src/components/XdNoticeBar/XdNoticeBar.vue +501 -0
  81. package/src/components/XdNumber/XdNumber.vue +210 -0
  82. package/src/components/XdNumberUni/XdNumberUni.vue +270 -0
  83. package/src/components/XdNumberUni/readme.md +42 -0
  84. package/src/components/XdOnlineConfirm/XdOnlineConfirm.vue +385 -0
  85. package/src/components/XdOnlineDetail/XdOnlineDetail.vue +332 -0
  86. package/src/components/XdOnlinePay/XdOnlinePay.vue +349 -0
  87. package/src/components/XdOnlineSchedule/XdOnlineSchedule.vue +453 -0
  88. package/src/components/XdOnlineSeat/XdOnlineSeat.vue +796 -0
  89. package/src/components/XdOnlineSeatMove/XdOnlineSeatMove.vue +1012 -0
  90. package/src/components/XdPayCombo/XdPayCombo.vue +118 -0
  91. package/src/components/XdPreviewImage/XdPreviewImage.vue +372 -0
  92. package/src/components/XdPwPay/XdPwPay.vue +214 -0
  93. package/src/components/XdRadio/XdRadio.vue +151 -0
  94. package/src/components/XdRangeSlider/XdRangeSlider.vue +355 -0
  95. package/src/components/XdRedName/XdRedName.vue +35 -0
  96. package/src/components/XdSearchBar/XdSearchBar.vue +286 -0
  97. package/src/components/XdSelect/XdSelect.vue +382 -0
  98. package/src/components/XdSelectCity/XdSelectCity.vue +270 -0
  99. package/src/components/XdSelectTime/XdSelectTime.vue +342 -0
  100. package/src/components/XdStar/XdStar.vue +261 -0
  101. package/src/components/XdStoreCashier/XdStoreCashier.vue +526 -0
  102. package/src/components/XdStoreItem/XdStoreItem.vue +400 -0
  103. package/src/components/XdStoreOrderDetail/XdStoreOrderDetail.vue +1571 -0
  104. package/src/components/XdStoreOrderList/XdStoreOrderList.vue +450 -0
  105. package/src/components/XdStoreProductInfo/XdStoreProductInfo.vue +940 -0
  106. package/src/components/XdStoreProductType/XdStoreProductType.vue +307 -0
  107. package/src/components/XdSuccess/XdSuccess.vue +527 -0
  108. package/src/components/XdSwipeSelect/XdSwipeSelect.vue +99 -0
  109. package/src/components/XdSwiper/XdSwiper.vue +124 -0
  110. package/src/components/XdSwitch/XdSwitch.vue +204 -0
  111. package/src/components/XdTab/XdTab.vue +220 -0
  112. package/src/components/XdTabScroll/XdTabScroll.vue +212 -0
  113. package/src/components/XdTag/XdTag.vue +423 -0
  114. package/src/components/XdTimeLine/XdTimeLine.vue +121 -0
  115. package/src/components/XdTips/XdTips.vue +212 -0
  116. package/src/components/XdTipsBlock/XdTipsBlock.vue +141 -0
  117. package/src/components/XdTitleSection/XdTitleSection.vue +152 -0
  118. package/src/components/XdTitleTab/XdTitleTab.vue +227 -0
  119. package/src/components/XdUnit/XdUnit.vue +206 -0
  120. package/src/components/XdUpload/XdUpload.vue +197 -0
  121. package/src/components/XdUploadImage/XdUploadImage.vue +145 -0
  122. package/src/components/Xdlogs/XdLogs.vue +144 -0
  123. package/src/components/autoload.js +211 -0
  124. package/src/components/swipeAction/UniSwipeAction.vue +43 -0
  125. package/src/components/swipeActionItem/UniSwipeActionItem.vue +386 -0
  126. package/src/components/swipeActionItem/bindingx.js +298 -0
  127. package/src/components/swipeActionItem/index.wxs +321 -0
  128. package/src/components/swipeActionItem/isPC.js +18 -0
  129. package/src/components/swipeActionItem/mpalipay.js +210 -0
  130. package/src/components/swipeActionItem/mpother.js +252 -0
  131. package/src/components/swipeActionItem/mpwxs.js +140 -0
  132. package/src/dome/dome/address.vue +415 -0
  133. package/src/dome/dome/auth/login.vue +166 -0
  134. package/src/dome/dome/baidu_show.vue +20 -0
  135. package/src/dome/dome/cake.vue +186 -0
  136. package/src/dome/dome/cart.vue +205 -0
  137. package/src/dome/dome/cart_store.vue +149 -0
  138. package/src/dome/dome/cashier/cashier.vue +73 -0
  139. package/src/dome/dome/cashier/check_cashier.vue +469 -0
  140. package/src/dome/dome/cashier/success.vue +127 -0
  141. package/src/dome/dome/city.vue +148 -0
  142. package/src/dome/dome/cityData.js +9 -0
  143. package/src/dome/dome/clip.vue +82 -0
  144. package/src/dome/dome/date/date.vue +273 -0
  145. package/src/dome/dome/date/selected.js +315 -0
  146. package/src/dome/dome/dcom/app1.vue +13 -0
  147. package/src/dome/dome/dcom/app2.vue +13 -0
  148. package/src/dome/dome/dcom/app3.vue +13 -0
  149. package/src/dome/dome/dcom/app4.vue +13 -0
  150. package/src/dome/dome/dcom/app5.vue +13 -0
  151. package/src/dome/dome/dcom/index.vue +1 -0
  152. package/src/dome/dome/debug/debug.vue +95 -0
  153. package/src/dome/dome/docache/docache.vue +88 -0
  154. package/src/dome/dome/express.vue +269 -0
  155. package/src/dome/dome/form.vue +312 -0
  156. package/src/dome/dome/icon.js +125 -0
  157. package/src/dome/dome/icon.vue +93 -0
  158. package/src/dome/dome/index.vue +725 -0
  159. package/src/dome/dome/item.vue +236 -0
  160. package/src/dome/dome/json/json.vue +88 -0
  161. package/src/dome/dome/layout.vue +105 -0
  162. package/src/dome/dome/line.vue +113 -0
  163. package/src/dome/dome/map/search.vue +70 -0
  164. package/src/dome/dome/my.vue +171 -0
  165. package/src/dome/dome/notice.vue +93 -0
  166. package/src/dome/dome/online/confirm.vue +92 -0
  167. package/src/dome/dome/online/detail.vue +80 -0
  168. package/src/dome/dome/online/pay.vue +78 -0
  169. package/src/dome/dome/online/schedule.vue +73 -0
  170. package/src/dome/dome/online/seat.vue +98 -0
  171. package/src/dome/dome/order/detail.vue +166 -0
  172. package/src/dome/dome/order/enter_order.vue +294 -0
  173. package/src/dome/dome/order/list.vue +219 -0
  174. package/src/dome/dome/order/order.js +18 -0
  175. package/src/dome/dome/order/success.vue +68 -0
  176. package/src/dome/dome/product.vue +179 -0
  177. package/src/dome/dome/store_cashier.vue +67 -0
  178. package/src/dome/dome/swiper.vue +32 -0
  179. package/src/dome/dome/webview.vue +61 -0
  180. package/src/install.js +183 -0
  181. package/src/main/address/address.vue +251 -0
  182. package/src/main/cart/cart.vue +149 -0
  183. package/src/main/cashier/cashier.vue +72 -0
  184. package/src/main/cashier/check_cashier.vue +483 -0
  185. package/src/main/city/city.vue +149 -0
  186. package/src/main/date/date.vue +260 -0
  187. package/src/main/order/order.js +19 -0
  188. package/src/main/order/order.vue +222 -0
  189. package/src/main/product/detail.vue +121 -0
  190. package/src/main/product/type.vue +108 -0
  191. package/src/main/search/search.vue +501 -0
  192. package/src/pages.json +337 -0
  193. package/src/plugins/CreatedComponentsPlugin.js +19 -0
  194. package/src/plugins/JsonRename.js +72 -0
  195. package/src/plugins/SetAppParams.js +171 -0
  196. package/src/project.js +18 -0
  197. package/src/utils/Cookie.js +68 -0
  198. package/src/utils/Runtime.js +105 -0
  199. package/src/utils/Storage.js +104 -0
  200. package/src/utils/XdNetwork.js +133 -0
  201. package/src/utils/helper.js +1321 -0
  202. package/src/utils/nourl.js +95 -0
  203. package/src/utils/project.js +17 -0
  204. package/src/utils/xd.auth.js +61 -0
  205. package/src/utils/xd.base.js +474 -0
  206. package/src/utils/xd.common.js +240 -0
  207. package/src/utils/xd.event.js +99 -0
  208. package/src/utils/xd.frame.js +96 -0
  209. package/src/utils/xd.path.js +96 -0
  210. package/src/utils/xdAppLog.js +170 -0
  211. package/src/utils/xdWxLog.js +302 -0
  212. package/src/utils/xdh5log.js +307 -0
  213. package/src/websetting.js +64 -0
  214. package/tsconfig.json +9 -0
  215. package/xd.less +180 -0
@@ -0,0 +1,1012 @@
1
+ <template>
2
+ <view class="xd-online-seat">
3
+ <movable-area
4
+ v-if="seatInitStatus"
5
+ class="xd-online-seat__area"
6
+ scale-area
7
+ >
8
+ <!--#ifdef MP-WEIXIN-->
9
+ <movable-view
10
+ class="xd-online-seat__view"
11
+ :style="{
12
+ minWidth: boxWidth + 'px',
13
+ padding: '0 0 ' + leftPadding + 'px ' + leftPadding +'px',
14
+ height: seatHeight + 'px',
15
+ }"
16
+ :inertia="true"
17
+ :scale="scaleStop"
18
+ :scale-min="1"
19
+ :scale-max="2"
20
+ :scale-value="defautScale"
21
+ direction="all"
22
+ @scale="onScale"
23
+ @change="onMove"
24
+ @touchstart="touchStart"
25
+ @touchmove="touchMove"
26
+ @touchend="touchEnd"
27
+ >
28
+ <view
29
+ class="xd-online-seat__stage"
30
+ >
31
+ <text>{{seathallNames}} 屏幕</text>
32
+ </view>
33
+ <view class="xd-online-seat__tips">
34
+ <view class="xd-online-seat__tips-item">
35
+ <view
36
+ :style="'width:'+seatSize+'px;height:'+seatSize+'px;'"
37
+ class="xd-online-seat__unselected"
38
+ ></view>
39
+ <span>可选</span>
40
+ </view>
41
+ <view class="xd-online-seat__tips-item">
42
+ <view
43
+ :style="'width:'+seatSize+'px;height:'+seatSize+'px'"
44
+ class="xd-online-seat__disbaled"
45
+ ></view>
46
+ <span>不可选</span>
47
+ </view>
48
+ <view class="xd-online-seat__tips-item">
49
+ <view
50
+ :style="'width:'+seatSize+'px;height:'+seatSize+'px'"
51
+ class="xd-online-seat__selected"
52
+ ></view>
53
+ <span>选中</span>
54
+ </view>
55
+ <view class="xd-online-seat__tips-item">
56
+ <view
57
+ :style="'width:'+seatSize+'px;height:'+seatSize+'px'"
58
+ class="xd-online-seat__lovely"
59
+ ></view>
60
+ <span>情侣</span>
61
+ </view>
62
+ </view>
63
+ <view class="xd-online-seat__body">
64
+ <view
65
+ class="xd-online-seat__center-line"
66
+ :style="'height:'+seatRow * (seatMarginBottom/pxNum + seatSize)+'px;border-left:1px dashed '+ $mainColor +';'"
67
+ ></view>
68
+ <view
69
+ v-for="(item,index) in seatArray"
70
+ :key="index"
71
+ class="xd-online-seat__item-warper"
72
+ :style="'width:'+ (seatSize * seatCol) +'px; height:'+(seatSize)+'px;'"
73
+ >
74
+ <view
75
+ v-for="(seat,col) in item"
76
+ :key="col"
77
+ class="xd-online-seat__item"
78
+ :style="'width:'+(seatSize)+'px;height:'+(seatSize)+'px; margin-left:2px;'"
79
+ @click="(e)=>{
80
+ handleChooseSeat(e,seat,index,col)
81
+ }"
82
+ >
83
+ <view v-if="seat.type===0" class="xd-online-seat__unselected"></view>
84
+ <view v-if="seat.type===1" class="xd-online-seat__disbaled"></view>
85
+ <view v-if="seat.type===2" class="xd-online-seat__selected"></view>
86
+ <view v-if="seat.type===3" class="xd-online-seat__lovely"></view>
87
+ </view>
88
+ </view>
89
+ </view>
90
+ </movable-view>
91
+ <!--#endif-->
92
+ <!--#ifdef H5-->
93
+ <movable-view
94
+ class="xd-online-seat__view"
95
+ :style="getViewStyle"
96
+ :inertia="true"
97
+ :scale="scaleStop"
98
+ :scale-min="1"
99
+ :scale-max="2"
100
+ :scale-value="defautScale"
101
+ direction="all"
102
+ @scale="onScale"
103
+ @change="onMove"
104
+ >
105
+ <view
106
+ class="xd-online-seat__stage"
107
+ >
108
+ <text>{{seathallNames}} 屏幕</text>
109
+ </view>
110
+ <view class="xd-online-seat__tips">
111
+ <view class="xd-online-seat__tips-item">
112
+ <view
113
+ :style="'width:'+seatSize+'px;height:'+seatSize+'px;'"
114
+ class="xd-online-seat__unselected"
115
+ ></view>
116
+ <span>可选</span>
117
+ </view>
118
+ <view class="xd-online-seat__tips-item">
119
+ <view
120
+ :style="'width:'+seatSize+'px;height:'+seatSize+'px'"
121
+ class="xd-online-seat__disbaled"
122
+ ></view>
123
+ <span>不可选</span>
124
+ </view>
125
+ <view class="xd-online-seat__tips-item">
126
+ <view
127
+ :style="'width:'+seatSize+'px;height:'+seatSize+'px'"
128
+ class="xd-online-seat__selected"
129
+ ></view>
130
+ <span>选中</span>
131
+ </view>
132
+ <view class="xd-online-seat__tips-item">
133
+ <view
134
+ :style="'width:'+seatSize+'px;height:'+seatSize+'px'"
135
+ class="xd-online-seat__lovely"
136
+ ></view>
137
+ <span>情侣</span>
138
+ </view>
139
+ </view>
140
+ <view class="xd-online-seat__body">
141
+ <view
142
+ class="xd-online-seat__center-line"
143
+ :style="'height:'+seatRow * (seatMarginBottom/pxNum + seatSize)+'px;border-left:1px dashed '+ $mainColor +';'"
144
+ ></view>
145
+ <view
146
+ v-for="(item,index) in seatArray"
147
+ :key="index"
148
+ class="xd-online-seat__item-warper"
149
+ :style="'width:'+ (seatSize * seatCol) +'px; height:'+(seatSize)+'px;'"
150
+ >
151
+ <view
152
+ v-for="(seat,col) in item"
153
+ :key="col"
154
+ class="xd-online-seat__item"
155
+ :style="'width:'+(seatSize)+'px;height:'+(seatSize)+'px; margin-left:2px;'"
156
+ @click="(e)=>{
157
+ handleChooseSeat(e,seat,index,col)
158
+ }"
159
+ >
160
+ <view v-if="seat.type===0" class="xd-online-seat__unselected"></view>
161
+ <view v-if="seat.type===1" class="xd-online-seat__disbaled"></view>
162
+ <view v-if="seat.type===2" class="xd-online-seat__selected"></view>
163
+ <view v-if="seat.type===3" class="xd-online-seat__lovely"></view>
164
+ </view>
165
+ </view>
166
+ </view>
167
+ </movable-view>
168
+ <!--#endif-->
169
+ </movable-area>
170
+ <view class="xd-online-seat__natioc">{{seatDom|raw}}</view>
171
+ <view
172
+ class="xd-online-seat__left-bar"
173
+ :style="{
174
+ top : seatOffsetTop + 'px',
175
+ width: 30 * scale + 'rpx',
176
+ background: $mainColor
177
+ }"
178
+ >
179
+ <view
180
+ class="xd-online-seat__left-bar-body"
181
+ :style="{
182
+ height: seatSize*scale + 'px',
183
+ lineHeight: seatSize*scale + 'px',
184
+ marginTop: seatMarginBottom + 'rpx',
185
+ fontSize: 16 * scale + 'rpx'
186
+ }"
187
+ v-for="(m,mindex) in seatRowList"
188
+ :key="mindex">{{m}}</view>
189
+ </view>
190
+ </view>
191
+ </template>
192
+ <script>
193
+ import helper from "@/utils/helper";
194
+ import XdButton from "@/components/XdButton/XdButton";
195
+
196
+ export default {
197
+ name: 'XdOnlineSeatMove',
198
+ components: {XdButton},
199
+ props: {
200
+ list: {
201
+ type: Array | Object,
202
+ default() {
203
+ return {};
204
+ }
205
+ },
206
+ hallName: {
207
+ type: String,
208
+ default: '影厅屏幕'
209
+ },
210
+
211
+ //最大购买格式
212
+ seatMaxBuyNumber: {
213
+ type: Number,
214
+ default: 4
215
+ }
216
+ },
217
+ data() {
218
+ return {
219
+ /**页面属性**/
220
+ boxWidth: null, //屏幕宽度px
221
+ moveX: 0, //水平移动偏移量
222
+ leftPadding: 20,
223
+ scale : 1,
224
+ defautScale: 0.95,
225
+ lineBarLeft: 0,
226
+ srceenType: true, //true -> 竖屏 false->横屏
227
+ systemInfo: null, //底部tabber
228
+ height: 0,
229
+ seatOffsetTop: 0, //座位图在显示区距离顶部域偏移
230
+ seatOffsetLeft: 0, //座位图在显示区距离顶部域偏移
231
+ seatWidth: 0, //座位图宽度
232
+ seatHeight: 0, //座位图高度
233
+ stageAllHeight: 0, //舞台高度
234
+ seatDom: {},
235
+
236
+ /**影院属性**/
237
+ //#ifdef MP-WEIXIN
238
+ stageHeight: 120, //舞台块高度px
239
+ tipsheight: 76, //提示块高度px
240
+ //#endif
241
+ //#ifndef MP-WEIXIN
242
+ stageHeight: 80, //舞台块高度px
243
+ tipsheight: 76, //提示块高度px
244
+ //#endif
245
+ scaleStop: true, //是否支持双手指放大事件停止
246
+ disabled: true, //是否禁用拖拽
247
+
248
+ /**座位数据**/
249
+ seatMarginBottom: 0, //座位上边距px
250
+ seatSize: 25, //座位尺寸
251
+ seatRow: 0, //影院座位行数
252
+ seatCol: 0, //影院座位列数
253
+ seatArray: [], //影院座位的二维数组, -1为非座位,0为可购座位,1为不可购座位, 2为已购座位(平台起作用), 3为情侣座位(LL,LR),一维行,二维列
254
+ seatSourceList: null, //接口获取的原始位置
255
+ seatRowList: [], //排数提示
256
+ seatUnselectedTotalNumber: 0, //可选座位总数
257
+ seatInitStatus: false,
258
+ seathallNames: null, //影片类型
259
+
260
+ //提交数据
261
+ totalPrice: 0, //总价格
262
+ seatSelected: [], //选中的座位数组。
263
+ seatError: [],//记录当前选座位是否有错误
264
+ seatTotalNumber: 0, //座位总数
265
+
266
+ };
267
+ },
268
+ computed: {
269
+ getViewStyle() {
270
+ let height = Math.floor((this.seatSize + this.seatMarginBottom / this.pxNum) * this.seatRow + this.stageHeight / this.pxNum + this.tipsheight / this.pxNum);
271
+ return {
272
+ width: this.boxWidth + 'px',
273
+ height: height + 'px',
274
+ padding: `0 ${this.leftPadding * this.pxNum}rpx ${this.leftPadding * this.pxNum}rpx`
275
+ }
276
+ },
277
+
278
+ getFormData() {
279
+ return {
280
+ seatSelected: this.seatSelected,
281
+ seatTotalNumber: this.seatTotalNumber,
282
+ totalPrice: this.totalPrice,
283
+ seatSelectTotalNumber: this.seatSelected.length,
284
+ seatSelectedName: this.$xdUniHelper.getListKeyForValue(this.seatSelected, 'name'),
285
+ seatError: this.seatError
286
+ }
287
+ },
288
+
289
+ rpxNum() {
290
+ return this.$rpxNum
291
+ },
292
+ pxNum() {
293
+ return this.$pxNum
294
+ },
295
+ },
296
+ created() {
297
+ console.log('created', this.list);
298
+ this.scale = this.defautScale;
299
+ this.seathallNames = this.hallName;
300
+ this.seatInitStatus = false;
301
+ this.seatSourceList = helper.cloneDeep(this.list);
302
+
303
+ this.init();
304
+ },
305
+ watch: {
306
+ list(val) {
307
+ this.seatInitStatus = false;
308
+ this.seatSourceList = helper.cloneDeep(val);
309
+ this.init()
310
+ },
311
+ hallName(val) {
312
+ this.seathallNames = val;
313
+ },
314
+ },
315
+ mounted(){
316
+ this.setSeatOffset()
317
+ },
318
+ methods: {
319
+ reSelectData(){
320
+ this.totalPrice = 0;
321
+ this.seatSelected = [];
322
+ this.seatError = [];
323
+ this.seatTotalNumber = 0;
324
+ },
325
+
326
+ touchStart(e){
327
+ this.scaleStop = false;
328
+ },
329
+
330
+ touchMove(e) {
331
+ if (e.touches.length > 1) {
332
+ this.scaleStop = false;
333
+ }else{
334
+ this.scaleStop = true;
335
+ }
336
+ },
337
+
338
+ touchEnd(e) {
339
+ setTimeout(()=>{
340
+ this.scaleStop = true;
341
+ }, 50)
342
+ },
343
+
344
+ setSeatOffset(){
345
+ this.$nextTick(() => {
346
+ this.$xdUniHelper.getWindowHeight([
347
+ '.xd-online-seat__body',
348
+ '.xd-online-seat__stage',
349
+ '.xd-online-seat__tips'
350
+ ], this)
351
+ .then(res => {
352
+ let {top, left, width, height} = res['.xd-online-seat__body'];
353
+ this.seatOffsetTop = top;
354
+ this.seatOffsetLeft = left;
355
+ this.seatDom = res['.xd-online-seat__body'];
356
+ this.seatWidth = width;
357
+ this.seatHeight = height;
358
+ this.stageAllHeight = height + res['.xd-online-seat__stage']['height'] +
359
+ res['.xd-online-seat__tips']['height'];
360
+ })
361
+ .catch()
362
+ })
363
+ },
364
+
365
+ init() {
366
+ this.systemInfo = getApp().globalData.$systemInfo;
367
+ this.boxWidth = getApp().globalData.$systemInfo.windowWidth - this.leftPadding - 4*this.scale;
368
+ this.srceenType = this.$isPortrait;
369
+ this.reSelectData();
370
+
371
+ if (this.seatSourceList && !helper.isEmpty(this.seatSourceList)) {
372
+ this.initData(this.seatSourceList);
373
+
374
+ }
375
+ },
376
+
377
+ update() {
378
+ this.$emit('input', this.getFormData);
379
+ this.$emit('select', this.getFormData);
380
+ },
381
+
382
+ /**
383
+ * @description 初始化座位数据
384
+ */
385
+ initData() {
386
+ /**对象转化为数组**/
387
+ if (helper.checkVarType(this.seatSourceList) === 'object') {
388
+ let temp = [];
389
+ Object.keys(this.seatSourceList).map((key) => {
390
+ temp.push(this.seatSourceList[key]);
391
+ });
392
+ this.seatSourceList = helper.cloneDeep(temp);
393
+ }
394
+
395
+ /**座位排数**/
396
+ this.seatRow = this.seatSourceList.length;
397
+
398
+ /**座位每排座位数**/
399
+ this.seatCol = this.seatSourceList[0].length;
400
+
401
+ this.initSeatArray();
402
+ },
403
+
404
+ /**
405
+ * @description 影院座位的二维数组,一维行,二维列
406
+ * @desc cell.type -1为非座位,0为可购座位,1为不可购座位, 2为已购座位(平台起作用), 3为情侣座位(LL,LR),
407
+ */
408
+ initSeatArray() {
409
+ this.seatSourceList.map((row, posRow) => {
410
+ row.map((cell, posCell) => {
411
+
412
+ //设置位置
413
+ cell['posRow'] = posRow;
414
+ cell['posCell'] = posCell;
415
+
416
+ //非座位状态
417
+ if (cell.type === 'G') cell.type = -1;
418
+
419
+ //情侣座位状态
420
+ if (cell.type === 'LL') {
421
+ cell.type = 3;
422
+ cell.lovely = 'LL'; //记录左情侣座
423
+ this.seatTotalNumber++;
424
+ }
425
+
426
+ //记录右情侣座
427
+ if (cell.type === 'LR') {
428
+ cell.lovely = 'LR';
429
+ }
430
+
431
+ //可选 or 不可购买座位状态
432
+ if (cell.type === '0' || cell.type === 'LR') {
433
+ if (cell.status === 'false') cell.type = 1;
434
+ else cell.type = 0;
435
+ this.seatTotalNumber++;
436
+ }
437
+ });
438
+ });
439
+
440
+ this.seatArray = helper.cloneDeep(this.seatSourceList);
441
+
442
+ /**计算可选座位总数**/
443
+ this.computedUnselectedTotalNumber();
444
+
445
+ /**设置座位大小**/
446
+ let seatSize = this.boxWidth / (this.seatCol);
447
+ if (this.seatSize * this.seatCol > this.boxWidth) {
448
+ this.seatSize = seatSize;
449
+ }
450
+
451
+ this.initNonSeatPlace();
452
+ },
453
+
454
+ /**
455
+ * @description 初始化排数显示
456
+ */
457
+ initNonSeatPlace() {
458
+ let temp = [];
459
+ this.seatArray.map((row) => {
460
+ let rowNum = '';
461
+ row.map((collapse) => {
462
+ if (collapse['row_name']) {
463
+ rowNum = collapse['row_name'];
464
+ }
465
+ });
466
+ temp.push(rowNum);
467
+ });
468
+ this.seatRowList = temp;
469
+ this.seatInitStatus = true;
470
+ },
471
+
472
+ /**
473
+ * @description 放大缩小事件
474
+ * @param e
475
+ */
476
+ onScale(e) {
477
+ this.scale = e.detail.scale;
478
+ this.setSeatOffset()
479
+ },
480
+
481
+ /**
482
+ * @description 移动事件
483
+ * @param e
484
+ */
485
+ onMove: function (e) {
486
+ this.moveX = e.detail.x;
487
+ this.setSeatOffset();
488
+ },
489
+
490
+
491
+ /**
492
+ * @description 统一错误提示
493
+ */
494
+ seatTips(message = null, callback = null) {
495
+ if (!message) {
496
+ message = `每次最多可以购买:${this.seatMaxBuyNumber}个座位。`;
497
+ }
498
+ uni.showModal({
499
+ title: '提示',
500
+ content: message,
501
+ showCancel: false,
502
+ success: function (res) {
503
+ if (typeof callback === 'function') {
504
+ callback()
505
+ }
506
+ }
507
+ });
508
+ },
509
+
510
+
511
+ /**
512
+ * @description 计算购买座位所需要的总价格
513
+ */
514
+ computedPrice() {
515
+ let totalPrice = 0;
516
+ this.seatSelected.map((item) => {
517
+ let price = Number(item['price']['price']);
518
+ console.log(price);
519
+ totalPrice = this.$xdUniHelper.addFloatNumber(totalPrice, price);
520
+ });
521
+ this.totalPrice = totalPrice;
522
+ console.log(JSON.stringify(this.seatSelected));
523
+ },
524
+
525
+ /**
526
+ * @description 计算可选座位数量
527
+ */
528
+ computedUnselectedTotalNumber() {
529
+ this.checkSelectedSeatHasEmpty();
530
+ this.update();
531
+ },
532
+
533
+ /**
534
+ * @description 选中 OR 取消座位操作
535
+ * @param item 当前座位信息
536
+ * @param type 操作类型 "-" OR "+"
537
+ */
538
+ selectSeat(item, type) {
539
+ if (type === '+') {
540
+ this.seatSelected.push(item);
541
+ this.computedPrice();
542
+ this.computedUnselectedTotalNumber();
543
+ return
544
+ }
545
+ let {id} = item;
546
+ let index = 0;
547
+ this.seatSelected.map((it, i) => {
548
+ if (it['id'] === id) {
549
+ index = i;
550
+ }
551
+ });
552
+ this.seatSelected.splice(index, 1);
553
+ this.computedPrice();
554
+ this.computedUnselectedTotalNumber();
555
+ },
556
+
557
+ /**
558
+ * @description 检查正负2内的座位是否有错误
559
+ * cell.type -1为非座位,0为可购座位,1为不可购座位, 2为已购座位(平台起作用), 3为情侣座位(LL,LR),
560
+ * @param rows 被检查座位所在行的行数据
561
+ * @param posCell 被检查的座位所在列位置
562
+ * @return boolean
563
+ * false 选中座位附近无隔空座位
564
+ * true=》选中座位附近有隔空座位
565
+ */
566
+ checkSeatStatus(rows, posCell) {
567
+ console.log(rows[posCell]['name'])
568
+ let maxCell = rows.length - 1,
569
+ leftStatus,
570
+ rightStatus;
571
+
572
+ //选中座位为左右边座位,
573
+ if (posCell === 0 || posCell === maxCell) return false;
574
+
575
+ //检查左边座位
576
+ leftStatus = this.checkNearBySeat(rows, posCell);
577
+ console.log('leftStatus', leftStatus);
578
+ if (leftStatus === 0) {
579
+ console.log('leftStatus', '有隔座留空!');
580
+ return true;
581
+ }
582
+ if (leftStatus === 1) {
583
+ console.log('leftStatus', '正常!');
584
+ return false;
585
+ }
586
+ console.log('leftStatus', '需要检查右边座位!');
587
+
588
+ rightStatus = this.checkNearBySeat(rows, posCell, 1);
589
+ if (rightStatus === 1) {
590
+ console.log('rightStatus', '正常!');
591
+ return false;
592
+ }
593
+
594
+ if (rightStatus === 0) {
595
+ console.log('rightStatus', '有隔座留空!');
596
+ return true;
597
+ }
598
+
599
+ if (leftStatus === 3 && rightStatus === 3) {
600
+ console.log('rightStatus', '正常!');
601
+ return false;
602
+ }
603
+ return true;
604
+ },
605
+
606
+ /**
607
+ * @description 检查附近座位状态
608
+ * @param rows 被检查的座位所在行数据
609
+ * @param posCell 被检查的座位坐在列位置
610
+ * @param add 检查左边OR右边两个座位 -1左边 1右边
611
+ * @return number 1=> 不需要检查 , 0=> 不通过, 3=>需要检查右边
612
+ */
613
+ checkNearBySeat(rows, posCell, add = -1) {
614
+ let maxCell = rows.length - 1;
615
+ let prevSeat = posCell + add;
616
+ let first = rows[prevSeat];
617
+
618
+ //选中在的座位左右座位为边座
619
+ if (prevSeat === 0 || prevSeat === maxCell) {
620
+ if (first.type === 0) return 4;
621
+ else return 1;
622
+ }
623
+
624
+ //不需要检查,直接通过(不可售,地板,已选中)
625
+ if (first.type === -1 || first.type === 1 || first.type === 2
626
+ ) {
627
+ return 1;
628
+ }
629
+
630
+ //检查左右第二个座位状态
631
+ let second = rows[prevSeat + add];
632
+
633
+ if (add === -1) {
634
+ if (second.type === -1 || second.type === 1 || second.type === 2) {
635
+ return 4;
636
+ }
637
+ } else {
638
+ //第二个座为(不可售,地板,已选中),直接不通过
639
+ if (second.type === -1 || second.type === 1 || second.type === 2) {
640
+ return 0;
641
+ }
642
+ }
643
+
644
+
645
+ //需要检查右边座位状态
646
+ return 3;
647
+ },
648
+
649
+ getObjectLeng(obj) {
650
+ return Object.keys(obj).length;
651
+ },
652
+
653
+ /**
654
+ * @description 检查座位是不是边座
655
+ */
656
+ checkSelectedSeatHasEmpty() {
657
+ let error = [];
658
+ let group = [];
659
+ let groupObj = {}; //分组对象
660
+ //行分组
661
+ this.seatSelected.map((item) => {
662
+ if (!groupObj[item['row']]) {
663
+ groupObj[item['row']] = {};
664
+ groupObj[item['row']][item['column']] = item;
665
+ } else {
666
+ groupObj[item['row']][item['column']] = item;
667
+ }
668
+ });
669
+
670
+ //对连座分在一组
671
+ Object.keys(groupObj).map((key) => {
672
+ if (this.getObjectLeng(groupObj[key]) === 1) {
673
+ Object.keys(groupObj[key]).map(k => {
674
+ group.push([groupObj[key][k]]);
675
+ })
676
+ } else {
677
+ let splitGroup = (obj) => {
678
+ console.log('start', JSON.stringify(Object.keys(obj)));
679
+ let k = Object.keys(obj)[0];
680
+ let im = obj[k];
681
+ let nextCell = Number(im['column']) + 1;
682
+ delete obj[k];
683
+ let temp = [im];
684
+ Object.keys(obj).map((item) => {
685
+ let nowCell = Number(obj[item]['column']);
686
+ if (nextCell === nowCell) {
687
+ nextCell++;
688
+ temp.push(obj[item]);
689
+ delete obj[item];
690
+ }
691
+ });
692
+ group.push(temp);
693
+
694
+ if (this.getObjectLeng(obj) === 1) {
695
+ Object.keys(obj).map(k => {
696
+ group.push([obj[k]]);
697
+ });
698
+ return
699
+ }
700
+
701
+ if (this.getObjectLeng(obj) === 0) {
702
+ return
703
+ }
704
+
705
+ splitGroup(obj);
706
+ };
707
+ splitGroup(groupObj[key]);
708
+ }
709
+ });
710
+ console.log('group', group, groupObj);
711
+
712
+ //对分组进行判断是否有隔座留空
713
+ group.map(item => {
714
+ if (item.length === 1) {
715
+ let rows = this.seatArray[item[0]['posRow']];
716
+ let status = this.checkSeatStatus(rows, item[0]['posCell']);
717
+ if (status) error.push(item[0]['name']);
718
+ console.log('单座', status ? '有隔座留空!' : '正常');
719
+ } else {
720
+ let rows = this.seatArray[item[0]['posRow']];
721
+ let maxCell = rows.length - 1;
722
+ let leftstatus, rightstatus;
723
+
724
+ //选中座位为左右边座位,
725
+ if (item[0]['posCell'] === 0) {
726
+ console.log('连坐左边', '正常')
727
+ leftstatus = 1;
728
+ } else {
729
+ leftstatus = this.checkNearBySeat(rows, item[0]['posCell']);
730
+ console.log('连坐左边', leftstatus, leftstatus === 0 ? '有隔座留空!' : '正常');
731
+ }
732
+
733
+ if (item[item.length - 1]['posCell'] === maxCell) {
734
+ console.log('连坐右边', '正常')
735
+ rightstatus = 1;
736
+ } else {
737
+ rightstatus = this.checkNearBySeat(rows, item[item.length - 1]['posCell'], 1);
738
+ console.log('连坐右边', rightstatus, rightstatus === 0 ? '有隔座留空!' : '正常');
739
+ }
740
+
741
+ if (leftstatus === 1 || rightstatus === 1) {
742
+ console.log('连座区域结果11:', '正常');
743
+ } else if (leftstatus === 3 && rightstatus === 3) {
744
+ console.log('连座区域结果22:', '正常');
745
+ } else {
746
+ error.push(item[0]['name']);
747
+ console.log('连座区域结果:', '有隔座留空!');
748
+ }
749
+ }
750
+ });
751
+
752
+ this.seatError = error;
753
+ if (error.length > 0) {
754
+ console.log('有隔座留空!', error);
755
+ } else {
756
+ console.log('正常!');
757
+ }
758
+ },
759
+
760
+ /***
761
+ * @description 选择操作处理
762
+ * @param ev
763
+ * @param item
764
+ * @param posRow
765
+ * @param posCol
766
+ */
767
+ handleChooseSeat: function (ev, item, posRow, posCol) {
768
+ console.log('handleChooseSeat',ev)
769
+
770
+ //如果是不可选,直接返回
771
+ if (item['type'] === 1 || item['type'] === -1) return;
772
+
773
+ //购买数量大于设定购买数量并且是选择操作
774
+ if (item['type'] === 0 && this.seatSelected.length >= this.seatMaxBuyNumber) {
775
+ this.seatTips();
776
+ return;
777
+ }
778
+
779
+
780
+ //选择当前行数据
781
+ let row = this.$xdUniHelper.cloneDeep(this.seatArray[posRow]);
782
+ console.log(item, posRow, posCol, item['type']);
783
+
784
+
785
+ //取消选择中操作
786
+ if (item['type'] === 2) {
787
+ console.log('取消选择中操作', item['type']);
788
+ item['type'] = 0;
789
+
790
+
791
+ //左情侣取消
792
+ if (item['lovely'] === 'LL') {
793
+ item['type'] = 3;
794
+ let lovelyseat = row[posCol + 1];
795
+ lovelyseat['type'] = 0;
796
+ this.selectSeat(lovelyseat, '-');
797
+ }
798
+
799
+ //右情侣取消
800
+ if (item['lovely'] === 'LR') {
801
+ item['type'] = 0;
802
+ let lovelyseat = row[posCol - 1];
803
+ lovelyseat['type'] = 3;
804
+ this.selectSeat(lovelyseat, '-');
805
+ }
806
+
807
+ this.selectSeat(item, '-');
808
+ }
809
+
810
+ //选择中操作
811
+ else if (item['type'] === 0 || item['type'] === 3) {
812
+ console.log('选择中操作', item['type'], item.name);
813
+ item['type'] = 2;
814
+ this.selectSeat(item, '+');
815
+
816
+ //选中左情侣
817
+ if (item['lovely'] === 'LL') {
818
+ row[posCol + 1]['type'] = 2;
819
+ this.selectSeat(row[posCol + 1], '+');
820
+ }
821
+
822
+ //选中右情侣
823
+ if (item['lovely'] === 'LR') {
824
+ row[posCol - 1]['type'] = 2;
825
+ this.selectSeat(row[posCol - 1], '+');
826
+ }
827
+
828
+ }
829
+
830
+ //更新座位图数据
831
+ row.splice(posCol, 1, item);
832
+ this.seatArray.splice(posRow, 1, row);
833
+
834
+ },
835
+
836
+ }
837
+ }
838
+
839
+ </script>
840
+ <style lang="less">
841
+
842
+ .xd-online-seat {
843
+ height: 100%;
844
+ box-sizing: border-box;
845
+ position: relative;
846
+
847
+ /*height: 100vh;*/
848
+
849
+ &__disbaled {
850
+ background-image: url(@xd-bg-disbaled);
851
+ background-size: 100%;
852
+ background-position: top left;
853
+ background-repeat: no-repeat;
854
+ font-size: 12px;
855
+ }
856
+
857
+ &__selected {
858
+ background-image: url(@xd-bg-selected);
859
+ background-size: 100%;
860
+ background-position: top left;
861
+ background-repeat: no-repeat;
862
+ font-size: 12px;
863
+ }
864
+
865
+ &__unselected {
866
+ background-image: url(@xd-bg-unselected);
867
+ background-size: 100%;
868
+ background-position: top left;
869
+ background-repeat: no-repeat;
870
+ font-size: 12px;
871
+ }
872
+
873
+ &__lovely {
874
+ background-image: url(@xd-bg-lovely);
875
+ background-size: 100%;
876
+ background-position: top left;
877
+ background-repeat: no-repeat;
878
+ font-size: 12px;
879
+ }
880
+
881
+ width: unit(750, rpx);
882
+
883
+ &__area {
884
+ background: #fff;
885
+ width: 100%;
886
+ overflow: hidden;
887
+ height: 100%;
888
+
889
+ }
890
+
891
+ &__view {
892
+
893
+ }
894
+
895
+ &__stage {
896
+ background-image: url(@xd-bg-filmBg);
897
+ background-size: 100%;
898
+ background-position: top left;
899
+ background-repeat: no-repeat;
900
+ color: @xd-text-color;
901
+ width: unit(533, rpx);
902
+ height: unit(50, rpx);
903
+ font-size: @xd-font-size-base;
904
+ text-align: center;
905
+ margin: unit(20, rpx) auto unit(40, rpx);
906
+ box-sizing: border-box;
907
+
908
+ *, text {
909
+ display: inline-block;
910
+ padding: unit(30, rpx) 0 0;
911
+ }
912
+ }
913
+
914
+ &__natioc {
915
+ display: none;
916
+ position: fixed;
917
+ top: unit(300,rpx);
918
+ left: 0;
919
+ background: rgba(0,0,0,.5);
920
+ font-size: unit(18,rpx);
921
+ z-index: 1000;
922
+ word-break: break-all;
923
+ word-wrap: break-word;
924
+
925
+ }
926
+
927
+ &__tips {
928
+ display: flex;
929
+ justify-content: center;
930
+ align-content: center;
931
+ height: unit(40, rpx);
932
+ padding: 0 0 unit(30, rpx);
933
+
934
+ &-item {
935
+ font-size: @xd-font-size-base;
936
+ margin: 0 unit(10, rpx);
937
+ display: flex;
938
+ justify-content: center;
939
+ align-content: center;
940
+ align-items: center;
941
+
942
+ *, view {
943
+ margin-right: unit(10, rpx);
944
+ }
945
+ }
946
+ }
947
+
948
+ &__item-warper {
949
+ display: flex;
950
+ justify-content: center;
951
+ flex-wrap: nowrap;
952
+ align-content: center;
953
+ align-items: center;
954
+ flex-direction: row;
955
+ margin-bottom: unit(10, rpx);
956
+ margin: 0 auto;
957
+ }
958
+
959
+
960
+ &__body {
961
+ position: relative;
962
+ }
963
+
964
+ &__center-line {
965
+ border-left: 1px dashed #e5e5e5;
966
+ position: absolute;
967
+ left: 50%;
968
+ margin-left: 1px;
969
+ -webkit-transform: translateX(-50%);
970
+ transform: translateX(-50%);
971
+ top: unit(-10, rpx)
972
+ }
973
+
974
+ &__item {
975
+ display: flex;
976
+ justify-content: center;
977
+ flex-wrap: nowrap;
978
+ align-content: center;
979
+ align-items: center;
980
+ flex-direction: row;
981
+
982
+
983
+ > *, view {
984
+ width: 100%;
985
+ height: 100%;
986
+ display: inline-block;
987
+ }
988
+ }
989
+
990
+ &__left-bar {
991
+ position: fixed;
992
+ left: unit(10, rpx);
993
+ background-color: rgba(0, 0, 0, 0.3);
994
+ border-radius: unit(14, rpx);
995
+ overflow: hidden;
996
+ font-size: unit(20, rpx);
997
+
998
+ &-footer {
999
+ height: unit(30, rpx);
1000
+ }
1001
+
1002
+ &-body {
1003
+ width: 100%;
1004
+ color: @xd-text-color-inverse;
1005
+ display: flex;
1006
+ justify-content: center;
1007
+ text-align: center;
1008
+ }
1009
+ }
1010
+
1011
+ }
1012
+ </style>