瀏覽代碼

feat:提交代码,基本完成电影模块的对接

longzhicheng 1 年之前
父節點
當前提交
36e7e17017
共有 78 個文件被更改,包括 9587 次插入2021 次删除
  1. 1 0
      .env.development
  2. 8 6
      pages.config.ts
  3. 159 137
      src/apis/common.ts
  4. 29 0
      src/apis/map4tx.ts
  5. 107 0
      src/apis/movies.ts
  6. 2 1
      src/apis/order.api.ts
  7. 16 0
      src/apis/product.ts
  8. 12 0
      src/apis/quickLink.ts
  9. 2 2
      src/components/CXBSkuPopup/CXBSkuPopup.vue
  10. 4 0
      src/config/app.ts
  11. 4 0
      src/constants/index.ts
  12. 23 0
      src/libs/amap-wx.ts
  13. 1 1
      src/pages.json
  14. 2 2
      src/pages/annuity/index.vue
  15. 10 5
      src/pages/dacang/list/components/life-product.vue
  16. 3 2
      src/pages/dacang/list/index.vue
  17. 142 34
      src/pages/home/components/movies.vue
  18. 4 3
      src/pages/home/components/product-new.vue
  19. 18 4
      src/pages/home/index.vue
  20. 70 3
      src/pages/message/index.vue
  21. 217 45
      src/pages/order-confirm/index.vue
  22. 23 3
      src/pages/payment/index.vue
  23. 1 13
      src/pages/store/nearby/index.vue
  24. 53 50
      src/pages/user/index.vue
  25. 二進制
      src/static/bought.png
  26. 二進制
      src/static/icon/copy_icon.png
  27. 二進制
      src/static/icon/downArrow.png
  28. 二進制
      src/static/icon/img_msg.png
  29. 二進制
      src/static/icon/leftArrow.png
  30. 二進制
      src/static/icon/map_address_icon.png
  31. 二進制
      src/static/icon/movies1.png
  32. 二進制
      src/static/icon/movies2.png
  33. 二進制
      src/static/icon/movies3.png
  34. 二進制
      src/static/icon/phone_icon.png
  35. 二進制
      src/static/icon/red_close.png
  36. 二進制
      src/static/icon/timer_icon.png
  37. 二進制
      src/static/logo.png
  38. 二進制
      src/static/love_choose.png
  39. 二進制
      src/static/love_default.png
  40. 二進制
      src/static/love_icon.png
  41. 二進制
      src/static/selected.png
  42. 二進制
      src/static/unselected.png
  43. 5 3
      src/stores/userStore.ts
  44. 79 32
      src/subPages/pages/immediate-withdrawal/index.vue
  45. 14 8
      src/subPages/pages/income/index.vue
  46. 13 4
      src/subPages/pages/mine-top/brokerage.vue
  47. 49 20
      src/subPages/pages/mine-top/contribute.vue
  48. 18 14
      src/subPages/pages/mine-top/department.vue
  49. 13 5
      src/subPages/pages/mine-top/jifen.vue
  50. 110 73
      src/subPages/pages/mine-top/jingdou.vue
  51. 167 130
      src/subPages/pages/mine-top/qianbao.vue
  52. 17 7
      src/subPages/pages/mine-top/repurchase.vue
  53. 17 7
      src/subPages/pages/mine-top/vr.vue
  54. 619 0
      src/subPages/pages/movies/chooseSeat - 副本.vue
  55. 619 0
      src/subPages/pages/movies/chooseSeat.vue
  56. 753 0
      src/subPages/pages/movies/chooseSeat1.vue
  57. 209 0
      src/subPages/pages/movies/cityList.vue
  58. 680 0
      src/subPages/pages/movies/moviesIndex.vue
  59. 523 0
      src/subPages/pages/movies/moviesOrder.vue
  60. 603 0
      src/subPages/pages/movies/moviesTicketList.vue
  61. 549 0
      src/subPages/pages/movies/nearbyCinemas.vue
  62. 447 0
      src/subPages/pages/movies/orderDetail.vue
  63. 592 0
      src/subPages/pages/movies/orderList.vue
  64. 2 1
      src/subPages/pages/my-profile/index.vue
  65. 134 57
      src/subPages/pages/quick-fuc/business.vue
  66. 56 21
      src/subPages/pages/quick-fuc/components/life-product.vue
  67. 2 2
      src/subPages/pages/quick-fuc/life.vue
  68. 3 3
      src/subPages/pages/quick-fuc/repurchase.vue
  69. 3 1
      src/subPages/pages/quick-fuc/shop.vue
  70. 2 6
      src/subPages/pages/quick-fuc/vip.vue
  71. 83 18
      src/subPages/pages/record-detail/detail.vue
  72. 1262 1285
      src/subPages/pages/store/product/detail.vue
  73. 20 5
      src/subPages/pages/store/product/other.vue
  74. 18 4
      src/subPages/pages/withdrawal-record/index.vue
  75. 1 3
      src/utils/http/http.ts
  76. 954 0
      src/utils/seat-data.js
  77. 29 0
      src/utils/util.ts
  78. 11 1
      uni-pages.d.ts

+ 1 - 0
.env.development

@@ -1,2 +1,3 @@
1 1
 VITE_GLOB_API_URL = 'https://testapi.hxxfb.com'
2 2
 
3
+

+ 8 - 6
pages.config.ts

@@ -16,12 +16,14 @@ export default defineUniPages({
16 16
 			iconPath: 'static/icon/home-off.png',
17 17
 			selectedIconPath: 'static/icon/home-on.png',
18 18
 			text: '首页'
19
-		}, {
20
-			pagePath: 'pages/store/nearby/index',
21
-			iconPath: 'static/icon/dacang-off.png',
22
-			selectedIconPath: 'static/icon/dacang-on.png',
23
-			text: '本地生活'
24
-		}, {
19
+		},
20
+		// {
21
+		// 	pagePath: 'pages/store/nearby/index',
22
+		// 	iconPath: 'static/icon/dacang-off.png',
23
+		// 	selectedIconPath: 'static/icon/dacang-on.png',
24
+		// 	text: '本地生活'
25
+		// }, 
26
+		{
25 27
 			pagePath: 'pages/dacang/list/index',
26 28
 			iconPath: 'static/icon/chuangke-off.png',
27 29
 			selectedIconPath: 'static/icon/chuangke-on.png',

+ 159 - 137
src/apis/common.ts

@@ -1,11 +1,11 @@
1
-import {defHttp} from '~/utils/http'
2
-import {USER_LATITUDE, USER_LONGITUDE} from "~/constants";
1
+import { defHttp } from '~/utils/http'
2
+import { USER_LATITUDE, USER_LONGITUDE, USER_CHOOSE_CITY } from "~/constants";
3 3
 import AmapWx from "~/libs/amap-wx";
4
-import type {ArticleCategoryModel, ArticleModel, ArticleResult} from "~/apis/model/articleModel";
5
-import type {HomeQuickLinkModel} from "~/apis/model/common.model";
6
-import type {IntegralProductModel, IntegralProductParams} from "~/apis/model/integral.model";
7
-import type {AnnouncementResult} from "~/apis/model/announcement.model";
8
-import type {FeedbackRequestModel} from "~/apis/model/feedback.model";
4
+import type { ArticleCategoryModel, ArticleModel, ArticleResult } from "~/apis/model/articleModel";
5
+import type { HomeQuickLinkModel } from "~/apis/model/common.model";
6
+import type { IntegralProductModel, IntegralProductParams } from "~/apis/model/integral.model";
7
+import type { AnnouncementResult } from "~/apis/model/announcement.model";
8
+import type { FeedbackRequestModel } from "~/apis/model/feedback.model";
9 9
 // import {a} from "unocss-preset-weapp/dist/utilities-46c43da7";
10 10
 // 引入
11 11
 // import amap from '~/libs/amap-wx.130.js';
@@ -13,190 +13,212 @@ import type {FeedbackRequestModel} from "~/apis/model/feedback.model";
13 13
 // let amapPlugin = new amap.AMapWX({
14 14
 //     key: "e42681aed12886436ed44d6c28aa22c8"
15 15
 // });
16
-const amap = AmapWx.getInstance({key: "e42681aed12886436ed44d6c28aa22c8"});
16
+const amap = AmapWx.getInstance({ key: "e42681aed12886436ed44d6c28aa22c8" });
17 17
 
18 18
 enum API {
19 19
 
20
-    /**
21
-     * // 获取北参堂icon和title
22
-     * 首页金刚区
23
-     */
24
-    HOME_QUICK_LINK = `/api/common/home_quick_link`,
25
-    // 积分通兑产品
26
-    ENTROPY_PRODUCT_LIST = '/api/entropy/product_lst',
27
-    // 帮助中心分类
28
-    ARTICLE_CATEGORY_LIST = '/api/article/category/lst/19',
29
-    // 文章列表
30
-    ARTICLE_LIST = '/api/article/lst',
31
-    // 文章详情
32
-    ARTICLE_DETAIL = '/api/article/detail',
33
-
34
-    // 系统公告
35
-    NOTICE_LIST = '/api/notice/list',
36
-
37
-    // 注销接口
38
-    USER_LOGOUT = '/gateway/userCenter_service/userCenterService/userLogout',
39
-
40
-    // 上传图片
41
-    UPLOAD_IMAGE_FIELD = '/api/upload/image/field',
42
-    // 意见反馈-类型
43
-    FEEDBACK_TYPE_NEW = '/api/common/feedback_type_new',
44
-    // 意见反馈提交
45
-    FEEDBACK = '/api/user/feedback',
46
-    // 获取热门搜索关键词
47
-    HOT_KEYWORD = '/api/common/hot_keyword',
48
-
49
-    HOME_BANNER = '/api/newhome/nologin/banner/home_banner_new',
20
+	/**
21
+	 * // 获取北参堂icon和title
22
+	 * 首页金刚区
23
+	 */
24
+	HOME_QUICK_LINK = `/api/common/home_quick_link`,
25
+	// 积分通兑产品
26
+	ENTROPY_PRODUCT_LIST = '/api/entropy/product_lst',
27
+	// 帮助中心分类
28
+	ARTICLE_CATEGORY_LIST = '/api/article/category/lst/19',
29
+	// 文章列表
30
+	ARTICLE_LIST = '/api/article/lst',
31
+	// 文章详情
32
+	ARTICLE_DETAIL = '/api/article/detail',
33
+
34
+	// 系统公告
35
+	NOTICE_LIST = '/api/notice/list',
36
+
37
+	// 注销接口
38
+	USER_LOGOUT = '/gateway/userCenter_service/userCenterService/userLogout',
39
+
40
+	// 上传图片
41
+	UPLOAD_IMAGE_FIELD = '/api/upload/image/field',
42
+	// 意见反馈-类型
43
+	FEEDBACK_TYPE_NEW = '/api/common/feedback_type_new',
44
+	// 意见反馈提交
45
+	FEEDBACK = '/api/user/feedback',
46
+	// 获取热门搜索关键词
47
+	HOT_KEYWORD = '/api/common/hot_keyword',
48
+
49
+	HOME_BANNER = '/api/newhome/nologin/banner/home_banner_new',
50 50
 	BANNER = '/api/newhome/nologin/banner/',
51 51
 
52
-    GET_PRODUCT_SHARE = '/api/get_product_share',
53
-    // /api/get_product_share
52
+	GET_PRODUCT_SHARE = '/api/get_product_share',
53
+	// /api/get_product_share
54 54
 }
55 55
 
56 56
 export function getProductShare() {
57
-    return defHttp.get({
58
-        url: API.GET_PRODUCT_SHARE
59
-    })
57
+	return defHttp.get({
58
+		url: API.GET_PRODUCT_SHARE
59
+	})
60 60
 }
61 61
 
62 62
 /**
63 63
  * 获取首页轮播图
64 64
  */
65
-export function getHomeBanner(type="home_banner_new") {
66
-    return defHttp.get({
67
-        url: API.BANNER+type,
68
-    })
65
+export function getHomeBanner(type = "home_banner_new") {
66
+	return defHttp.get({
67
+		url: API.BANNER + type,
68
+	})
69 69
 }
70 70
 
71 71
 // 获取热门搜索关键ygnk
72 72
 export function getHotkeyWord() {
73
-    return defHttp.get({
74
-        url: API.HOT_KEYWORD,
75
-    })
73
+	return defHttp.get({
74
+		url: API.HOT_KEYWORD,
75
+	})
76 76
 }
77 77
 /**
78 78
  * 添加反馈
79 79
  * @param params
80 80
  */
81
-export function createFeedback(params: FeedbackRequestModel) {
82
-    return defHttp.post({
83
-        url: API.FEEDBACK,
84
-        data: {
85
-            ...params
86
-        }
87
-    })
81
+export function createFeedback(params : FeedbackRequestModel) {
82
+	return defHttp.post({
83
+		url: API.FEEDBACK,
84
+		data: {
85
+			...params
86
+		}
87
+	})
88 88
 }
89 89
 export function getFeedbackType() {
90
-    return defHttp.get({
91
-        url: API.FEEDBACK_TYPE_NEW,
92
-    })
90
+	return defHttp.get({
91
+		url: API.FEEDBACK_TYPE_NEW,
92
+	})
93 93
 }
94 94
 /**
95 95
  * 注销账号
96 96
  * @param phone
97 97
  */
98
-export function closeAccount(phone: string) {
99
-
100
-    return defHttp.post({
101
-        url: API.USER_LOGOUT,
102
-        data: {
103
-            phone
104
-        }
105
-    }, {
106
-        withToken: false
107
-    })
98
+export function closeAccount(phone : string) {
99
+
100
+	return defHttp.post({
101
+		url: API.USER_LOGOUT,
102
+		data: {
103
+			phone
104
+		}
105
+	}, {
106
+		withToken: false
107
+	})
108 108
 }
109 109
 
110 110
 export function getLocal() {
111
-    uni.getLocation({
112
-        type: 'wgs84',
113
-        success(res) {
114
-            console.log('location', res)
115
-            uni.setStorageSync(USER_LATITUDE, res.latitude)
116
-            uni.setStorageSync(USER_LONGITUDE, res.longitude)
117
-            // getRegeo(res.latitude, res.longitude);
118
-        }
119
-    })
120
-
121
-    // uni.showModal({
122
-    //     title: '提示',
123
-    //     content: '为了您更好的体验,请同意授权位置',
124
-    //     success: (res) => {
125
-    //         if (res.confirm) {
126
-    //             uni.getLocation({
127
-    //                 type: 'wgs84',
128
-    //                 success(res) {
129
-    //                     console.log(res)
130
-    //                     uni.setStorageSync(USER_LATITUDE, res.latitude)
131
-    //                     uni.setStorageSync(USER_LONGITUDE, res.longitude)
132
-    //                     // getRegeo(res.latitude, res.longitude);
133
-    //                 }
134
-    //             })
135
-    //             // amap.getWxLocation(async (loc) => {
136
-    //                 // 获取地址描述数据
137
-    //                 // const regeoRes = await amap.getRegeo({location: loc});
138
-    //                 // console.log(regeoRes.data.regeocode.addressComponent)
139
-    //             // })
140
-    //         }
141
-    //     }
142
-    // })
143
-}
144
-
145
-export async function getRegeo(latitude: number, longitude: number) {
146
-    // amapPlugin.getRegeo
147
-    const regeoRes = await amap.getRegeo({
148
-        location: '' + longitude + ',' + latitude + '',
149
-    })
150
-    // console.log(regeoRes.data.regeocode.addressComponent.city)
111
+	uni.getLocation({
112
+		type: 'wgs84',
113
+		success(res) {
114
+			console.log('location', res)
115
+			uni.setStorageSync(USER_LATITUDE, res.latitude)
116
+			uni.setStorageSync(USER_LONGITUDE, res.longitude)
117
+			// getRegeo(res.latitude, res.longitude);
118
+			console.log("===getLocal111");
119
+		}
120
+	})
121
+
151 122
 }
152 123
 
124
+export async function getRegeoX(callBack : Function) {
125
+	let latitude = uni.getStorageSync(USER_LATITUDE)
126
+	let longitude = uni.getStorageSync(USER_LONGITUDE)
127
+	const regeoRes = await amap.getRegeo({
128
+		location: '' + longitude + ',' + latitude + '',
129
+	})
130
+	//console.log("===regeoRes",regeoRes);
131
+	callBack && callBack(regeoRes.data.regeocode.addressComponent.city)
132
+	uni.setStorageSync(USER_CHOOSE_CITY, regeoRes.data.regeocode.addressComponent.city)
133
+}
134
+
135
+export function getLocalX(callBack : Function) {
136
+	uni.getLocation({
137
+		type: 'wgs84',
138
+		success(res) {
139
+			uni.setStorageSync(USER_LATITUDE, res.latitude)
140
+			uni.setStorageSync(USER_LONGITUDE, res.longitude)
141
+			callBack && callBack(res.latitude)
142
+		},
143
+		fail: () => {
144
+			callBack && callBack('')
145
+		}
146
+	})
147
+
148
+}
149
+
150
+
151
+
152
+
153
+export async function getRegeo(latitude : number, longitude : number) {
154
+	// amapPlugin.getRegeo
155
+	const regeoRes = await amap.getRegeo({
156
+		location: '' + longitude + ',' + latitude + '',
157
+	})
158
+	uni.setStorageSync(USER_CHOOSE_CITY, regeoRes.data.regeocode.addressComponent.city)
159
+	console.log(regeoRes.data.regeocode.addressComponent.city)
160
+
161
+}
162
+export async function getLongitudeAndLatitude(city : string) {
163
+	// amapPlugin.getRegeo
164
+	const _info = await amap.getLongitudeAndLatitude({
165
+		address: city,
166
+	})
167
+	uni.setStorageSync(USER_LONGITUDE, _info.data.geocodes[0].location.split(',')[0])
168
+	uni.setStorageSync(USER_LATITUDE, _info.data.geocodes[0].location.split(',')[1])
169
+	console.log("getLongitudeAndLatitude==", _info)
170
+
171
+}
172
+
173
+
174
+
153 175
 /**
154 176
  * 获取积分通兑产品列表
155 177
  */
156
-export function getEntropyProductList(params: IntegralProductParams): Promise<Array<IntegralProductModel>> {
157
-    return defHttp.get({
158
-        url: API.ENTROPY_PRODUCT_LIST,
159
-        data: {
160
-            ...params
161
-        }
162
-    })
178
+export function getEntropyProductList(params : IntegralProductParams) : Promise<Array<IntegralProductModel>> {
179
+	return defHttp.get({
180
+		url: API.ENTROPY_PRODUCT_LIST,
181
+		data: {
182
+			...params
183
+		}
184
+	})
163 185
 }
164 186
 
165 187
 /**
166 188
  * 获取帮助中心分类
167 189
  */
168
-export function getArticleCategory(): Promise<ArticleCategoryModel[]> {
169
-    return defHttp.get({
170
-        url: API.ARTICLE_CATEGORY_LIST,
171
-    }, {withToken: false})
190
+export function getArticleCategory() : Promise<ArticleCategoryModel[]> {
191
+	return defHttp.get({
192
+		url: API.ARTICLE_CATEGORY_LIST,
193
+	}, { withToken: false })
172 194
 }
173 195
 
174 196
 /**
175 197
  * 文章列表
176 198
  */
177
-export function getArticleList(article_category_id: string): Promise<ArticleResult> {
178
-    return defHttp.get({
179
-        url: `${API.ARTICLE_LIST}/${article_category_id}`,
180
-    }, {withToken: false})
199
+export function getArticleList(article_category_id : string) : Promise<ArticleResult> {
200
+	return defHttp.get({
201
+		url: `${API.ARTICLE_LIST}/${article_category_id}`,
202
+	}, { withToken: false })
181 203
 }
182 204
 
183
-export function getArticleDetail(article_id: string): Promise<ArticleModel> {
184
-    return defHttp.get({
185
-        url: `${API.ARTICLE_DETAIL}/${article_id}`,
186
-    }, {withToken: false})
205
+export function getArticleDetail(article_id : string) : Promise<ArticleModel> {
206
+	return defHttp.get({
207
+		url: `${API.ARTICLE_DETAIL}/${article_id}`,
208
+	}, { withToken: false })
187 209
 }
188 210
 
189 211
 /**
190 212
  * 首页金刚区
191 213
  */
192
-export function getHomeQuickLink(): Promise<Array<HomeQuickLinkModel>> {
193
-    return defHttp.get({
194
-        url: `${API.HOME_QUICK_LINK}`
195
-    })
214
+export function getHomeQuickLink() : Promise<Array<HomeQuickLinkModel>> {
215
+	return defHttp.get({
216
+		url: `${API.HOME_QUICK_LINK}`
217
+	})
196 218
 }
197 219
 
198
-export function getNoticeList(): Promise<AnnouncementResult> {
199
-    return defHttp.get({
200
-        url: `${API.NOTICE_LIST}`
201
-    })
220
+export function getNoticeList() : Promise<AnnouncementResult> {
221
+	return defHttp.get({
222
+		url: `${API.NOTICE_LIST}`
223
+	})
202 224
 }

+ 29 - 0
src/apis/map4tx.ts

@@ -0,0 +1,29 @@
1
+import { encode } from 'punycode';
2
+import { defHttp } from '~/utils/http'
3
+
4
+enum API {
5
+	MAP_KEY = '5HEBZ-ND26N-CMKFV-SNV2K-IOTTQ-VCFAQ'
6
+}
7
+
8
+
9
+export function apiGetCityName(latitude : any, longitude : any) {
10
+	const url = `https://apis.map.qq.com/ws/geocoder/v1/?location=${latitude},${longitude}&key=${API.MAP_KEY}`;
11
+
12
+	wx.request({
13
+		url, success: (res) => {
14
+			const city = res.data.result.address_component.city;
15
+		}
16
+	});
17
+
18
+
19
+}
20
+
21
+export function apiGetLongitudeAndLatitude(city : string,callBack:Function) {
22
+	let apiUrl = `https://apis.map.qq.com/ws/geocoder/v1/?address=${city}&key=${API.MAP_KEY}`;
23
+	uni.request({
24
+		url: apiUrl,
25
+		success: (res) => {
26
+			callBack && callBack(res)
27
+		}
28
+	})
29
+}

+ 107 - 0
src/apis/movies.ts

@@ -0,0 +1,107 @@
1
+import { defHttp } from '~/utils/http'
2
+
3
+enum API {
4
+	HOME_MOVIE_LIST = '/api/movie/film?',
5
+	CINEMA_LIST = '/api/movie/cinema?',
6
+	MOVIE_CITY_LIST = '/api/movie/city',
7
+	FILMSCHED_DATE_LIST = '/api/movie/filmsched_date?film_sign=',
8
+	CINEMAFILM_SCHED_LIST = '/api/movie/cinemafilm_sched?',
9
+	FILM_SCHED_LIST = '/api/movie/film_sched?',
10
+	SCHED_SEAT_LIST =  '/api/movie/sched_seat?',
11
+	MOVIES_ORDER_LIST =  '/api/movie/order_list?',
12
+	ORDER_INFO =  '/api/movie/order_info',
13
+	SUBMIT_ORDER =  '/api/movie/submit_order',
14
+	ORDER_LIST =  '/api/movie/order_list?',
15
+	CONFIRM_ORDER =  '/api/movie/confirm_order',
16
+	
17
+}
18
+
19
+
20
+//订单列表
21
+export function apiGetOrderList(params:any) {
22
+	return defHttp.get({
23
+		url: API.ORDER_LIST +params
24
+	})
25
+}
26
+
27
+//确认订单(付款)
28
+export function apiConfirmOrder(params:any) {
29
+	return defHttp.post({
30
+		url: API.CONFIRM_ORDER ,
31
+		data:params
32
+	})
33
+}
34
+
35
+//锁座订单
36
+export function apiSubmitOrder(params:any) {
37
+	return defHttp.post({
38
+		url: API.SUBMIT_ORDER ,
39
+		data:params
40
+	})
41
+}
42
+
43
+//订单详情
44
+export function apiGetOrderInfo(params:any) {
45
+	return defHttp.get({
46
+		url: API.ORDER_INFO +'?order_sn='+params
47
+	})
48
+}
49
+
50
+export function apiGetmoviesOrderList(params:any) {
51
+	return defHttp.get({
52
+		url: API.MOVIES_ORDER_LIST +params
53
+	})
54
+}
55
+
56
+//获取场次座位
57
+export function apiGetSchedSeatList(params:any) {
58
+	return defHttp.get({
59
+		url: API.SCHED_SEAT_LIST +params
60
+	})
61
+}
62
+//根据根据影片排片日期查询排片影院
63
+export function apiGetFilmSchedList(params:any) {
64
+	return defHttp.get({
65
+		url: API.FILM_SCHED_LIST +params
66
+	})
67
+}
68
+//根据影院影片场次日期查询场次列表
69
+export function apiGetCinemafilmSchedList(params:any) {
70
+	return defHttp.get({
71
+		url: API.CINEMAFILM_SCHED_LIST +params
72
+	})
73
+}
74
+
75
+//获取影片场次日期列表
76
+
77
+export function apiGetFilmschedDate(film_sign:any) {
78
+	return defHttp.get({
79
+		url: API.FILMSCHED_DATE_LIST +film_sign
80
+	})
81
+}
82
+
83
+//电影市区、首字母列表
84
+export function apiGetCityList() {
85
+	return defHttp.get({
86
+		url: API.MOVIE_CITY_LIST 
87
+	})
88
+}
89
+
90
+//获取影院列表
91
+export function apiGetCinemaList(params : any) {
92
+	return defHttp.get({
93
+		url: API.CINEMA_LIST + params
94
+	})
95
+}
96
+//获取影片列表
97
+export function apiGetHomeMovieList(type : any) {
98
+	return defHttp.get({
99
+		url: API.HOME_MOVIE_LIST + "page=1&limit=15&type=0" 
100
+	})
101
+}
102
+//获取影片列表
103
+export function apiGetMovieList(params : any) {
104
+	return defHttp.get({
105
+		url: API.HOME_MOVIE_LIST + params
106
+	})
107
+}

+ 2 - 1
src/apis/order.api.ts

@@ -71,7 +71,8 @@ enum API {
71 71
     // 售后-订单列表
72 72
     REFUND_LIST = '/api/refund/list',
73 73
     // 三方订单
74
-    USER_THIRD_ORDER = '/api/user/third_order',
74
+   // USER_THIRD_ORDER = '/api/user/third_order',
75
+	USER_THIRD_ORDER = '/api/user/third_order_bill',
75 76
     // 全部订单
76 77
     ORDER_ALL = '/api/order/all',
77 78
     // 获取微信支付小程序原始id和支付链接

+ 16 - 0
src/apis/product.ts

@@ -24,6 +24,8 @@ enum API {
24 24
     PRODUCT_SHARE = '/api/product_share',
25 25
     // 京东商品详情
26 26
     JD_DETAIL = '/api/jd/detail',
27
+	// 京东转链
28
+	JD_LINK = '/api/jd/chang_link',
27 29
 	// 未登录京东商品详情
28 30
 	JTT_DETAIL = '/api/jtt/detail',
29 31
     // 京东商品列表
@@ -147,6 +149,20 @@ export  function getJdProductDetail(skuId: string): Promise<JdgProductDetailMode
147 149
 }
148 150
 
149 151
 /**
152
+ * 京东商品详情转链接
153
+ * @param skuId
154
+ */
155
+export  function getJdLink(skuId: string,discount_link:string) {
156
+    return detailHttp.get({
157
+        url: API.JD_LINK,
158
+        data: {
159
+            skuId,
160
+			discount_link
161
+        }
162
+    })
163
+}
164
+
165
+/**
150 166
  * 未登录获取京东商品详情
151 167
  * @param skuId
152 168
  */

+ 12 - 0
src/apis/quickLink.ts

@@ -34,6 +34,9 @@ enum API {
34 34
 	
35 35
 	GET_SU_PRODUCT = '/api/su/list?limit=10&',
36 36
 	GET_SU_SEARCH_PRODUCT = '/api/su/search?limit=10&',
37
+	
38
+	GET_COMMERCE_LIST = '/api/store/merchant/product/commerce_list?limit=10&page=',
39
+	
37 40
  
38 41
 
39 42
 }
@@ -208,6 +211,15 @@ export function apiGetProductType(id : any) {
208 211
 }
209 212
 
210 213
 /**
214
+ * 商贸区列表
215
+ */
216
+export function apiGetCommerceList(id : any,page:any) {
217
+	return defHttp.get({
218
+		url: id ? (API.GET_COMMERCE_LIST +page+ "&category_id=" + id) : API.GET_COMMERCE_LIST+page
219
+	}, { withToken: false })
220
+}
221
+
222
+/**
211 223
  *产品
212 224
  */
213 225
 export function apiGetProductList(id : any) {

+ 2 - 2
src/components/CXBSkuPopup/CXBSkuPopup.vue

@@ -176,14 +176,14 @@ function handleCountChange(value) {
176 176
 
177 177
           <!--          </scroll-view>-->
178 178
         </div>
179
-        <div class="p-3">
179
+       <!-- <div class="p-3">
180 180
           <div class="flex  justify-between text-sm">
181 181
             数量
182 182
             <nut-input-number v-model="count" @change="handleCountChange" />
183 183
           </div>
184 184
 
185 185
 
186
-        </div>
186
+        </div> -->
187 187
       </div>
188 188
 
189 189
       <div class="px-3 pb-12" v-if="isTo == 1">

+ 4 - 0
src/config/app.ts

@@ -6,9 +6,13 @@ let VUE_APP_WS_URL = `ws://${location.hostname}?type=user`
6 6
 
7 7
 
8 8
 let httpApi = 'https://testapi.hxxfb.com'
9
+
9 10
 //let httpApi = 'https://api.hxxfb.com'
10 11
 
12
+console.log("===httpApi=====111111111",httpApi);
13
+console.log("===httpApi",httpApi);
11 14
 export const BASE_URL = httpApi
15
+console.log("===BASE_URL",BASE_URL);
12 16
 export const CDN_URL = 'https://cdn.bjtdba.com/chuxubao'
13 17
 export const CDM_URL = 'https://cdn.bjtdba.com/vod'
14 18
 export const IMG_CDN_URL='https://api.hxxfb.com/share/xcx/'

+ 4 - 0
src/constants/index.ts

@@ -3,7 +3,11 @@ export const USER_LATITUDE = 'user_latitude'
3 3
 // 用户经度
4 4
 export const USER_LONGITUDE = 'user_longitude'
5 5
 
6
+// 用户选择城市
7
+export const USER_CHOOSE_CITY = 'user_choose_city'
6 8
 
9
+//用户选择城市编码
10
+export const USER_CHOOSE_CITY_CODE = 'user_choose_city_code'
7 11
     //token
8 12
 export const  LOGIN_STATUS = 'LOGIN_STATUS_TOKEN'
9 13
     // uid

+ 23 - 0
src/libs/amap-wx.ts

@@ -288,6 +288,29 @@ class AmapWx {
288 288
             })
289 289
         })
290 290
     }
291
+	
292
+	/**
293
+	 * 地址逆编码
294
+	 */
295
+	getLongitudeAndLatitude(props: { address: string }) {
296
+	    return new Promise((success, fail) => {
297
+	        const config: RequestConfig & { address: string; extensions: string } = {
298
+	            address: props.address || '',
299
+	            extensions: 'all',
300
+	            ...this.requestConfig,
301
+	        }
302
+	        wx.request({
303
+	            url: 'https://restapi.amap.com/v3/geocode/geo',
304
+	            data: config,
305
+	            method: 'GET',
306
+	            header: { 'content-type': 'application/json' },
307
+	            success,
308
+	            fail,
309
+	        })
310
+	    })
311
+	}
312
+	
313
+	
291 314
     /**
292 315
      * 获取天气
293 316
      */

File diff suppressed because it is too large
+ 1 - 1
src/pages.json


+ 2 - 2
src/pages/annuity/index.vue

@@ -43,7 +43,7 @@ const progress = [{
43 43
   title: '计入账号开通',
44 44
   icon: `${CDN_URL}/static/assets/cxb_kt_220914.png`,
45 45
 }]
46
-
46
+const defaultHeadImg=ref('https://cdn.bjtdba.com/vod/image/2025-01-20/20250120125206881.png')
47 47
 const state = reactive({
48 48
   all_yanglao: 0,
49 49
   all_num: 0,
@@ -180,7 +180,7 @@ const ImgType = computed(() => {
180 180
       <div class="flex flex-col bg-white rounded  p-4">
181 181
         <div class="flex items-center w-full gap-2">
182 182
           <image
183
-            v-if="userStore.userInfo && userStore.userInfo.avatar" :src="userStore.userInfo.avatar" mode="widthFix"
183
+            v-if="userStore.userInfo && userStore.userInfo.avatar" :src="userStore.userInfo.avatar.indexOf('http://')!= -1?userInfo.avatar:defaultHeadImg" mode="widthFix"
184 184
             class="w-9 h-9 rounded-full"
185 185
           />
186 186
           <image v-else src="https://app.bjtdba.com/uploads/logo.jpg" style="width:74rpx; height:74rpx;" class=" rounded-full" />

+ 10 - 5
src/pages/dacang/list/components/life-product.vue

@@ -11,7 +11,11 @@
11 11
 		pageType:{
12 12
 			type:Number,
13 13
 			default:0
14
-		}
14
+		},
15
+		initType:{
16
+			type:Number,
17
+			default:0
18
+		},
15 19
 	})
16 20
 
17 21
 	function dealNum(value) {
@@ -21,7 +25,7 @@
21 25
 	
22 26
 	function handleProductItemClick(item) {
23 27
 		 uni.navigateTo({
24
-			url: `/subPages/pages/store/product/detail?id=${item.product_id}`
28
+			url: `/subPages/pages/store/product/detail?id=${item.product_id}&initType=${props.initType}`
25 29
 		})
26 30
 	}
27 31
 </script>
@@ -53,7 +57,7 @@
53 57
 				<text class="price-x">{{item.ot_price}}</text>
54 58
 				<view v-if="pageType==0" class="jf-content">积分</view>
55 59
 				<view v-if="pageType==0" class="jd-content">京豆</view>
56
-				<text v-if="pageType==1"  class="sell">已售{{item.sales}}</text>
60
+				<text v-if="pageType==1"  class="sell">已售{{item.sales}}</text>
57 61
 			</view>
58 62
 
59 63
 		</view>
@@ -131,8 +135,9 @@
131 135
 				align-items: center;
132 136
 				margin-top: 20rpx;
133 137
 			
138
+				
134 139
 				.annuity-value {
135
-					background-color: antiquewhite;
140
+					background-color: #f5f5f5;
136 141
 					color: #F83554;
137 142
 					font-size: 24rpx;
138 143
 					border-radius: 4rpx;
@@ -140,7 +145,7 @@
140 145
 					padding-right: 4rpx;
141 146
 				}
142 147
 				.annuity-value-x {
143
-					background-color: #faf0f1;
148
+					background-color: #ffefef;
144 149
 					color: #F83554;
145 150
 					font-size: 24rpx;
146 151
 					border-radius: 4rpx;

+ 3 - 2
src/pages/dacang/list/index.vue

@@ -27,7 +27,7 @@
27 27
 		</view>
28 28
 
29 29
 		<view class="bottom-content">
30
-			<ProductList :list="pageList" :pageType='1' v-if="pageList && pageList.length!=0" />
30
+			<ProductList :initType ='4' :list="pageList" :pageType='1' v-if="pageList && pageList.length!=0" />
31 31
 			<CXBEmpty v-else></CXBEmpty>
32 32
 		</view>
33 33
 	</div>
@@ -176,8 +176,9 @@
176 176
 	})
177 177
 
178 178
 	function handleItemClick(item) {
179
+		console.log("====");
179 180
 		uni.navigateTo({
180
-			url: `/subPages/pages/store/product/detail?id=${item.product_id}`
181
+			url: `/subPages/pages/store/product/detail?id=${item.product_id}&initType=4`
181 182
 		})
182 183
 	}
183 184
 

+ 142 - 34
src/pages/home/components/movies.vue

@@ -1,5 +1,49 @@
1
+<template>
2
+	<view class="movies-container">
3
+
4
+		<view class="title-content">
5
+			<text :class="currentIndex==0?'big-title':'small-title'" @click="onTabClick(0)">热映影片</text>
6
+			<text :class="currentIndex==1?'big-title':'small-title'" @click="onTabClick(1)">即将上映</text>
7
+			<view class="right-title" @click="onDetailClick">
8
+				<text class="more-title">查看全部</text>
9
+				<image class="more-icon" :src="ICON_CDN_URL+'order_store_entry_220624.png'" mode="widthFix"></image>
10
+			</view>
11
+		</view>
12
+		<view class="goods-scoll-content">
13
+			<scroll-view scroll-x="true" class="goods-scoll-item">
14
+				<view @click="onDetailClick" class="goods-scoll-item-x"
15
+					v-for="(item,index) in list" :key="'movies-item-'+index">
16
+					<view class="card-content">
17
+						<view class="card-item" >
18
+							<view class="card-img-content">
19
+								<image class="card-img" :src="item.cover_img" mode="aspectFill"></image>
20
+								<view class="card-grade">评分:{{item.grade}}</view>
21
+							</view>
22
+							<text class="card-title">{{item.film_name}}</text>
23
+							<text v-if="currentIndex==0" class="card-btn" @click="onDetailClick">购票</text>
24
+							<text v-if="currentIndex==1" class="card-des">3月28日上映</text>
25
+						</view>
26
+					</view>
27
+				</view>
28
+			</scroll-view>
29
+		</view>
30
+	</view>
31
+</template>
32
+
33
+
34
+
1 35
 <script lang="ts" setup>
2 36
 	import { IMG_CDN_URL, ICON_CDN_URL } from '~/config/app'
37
+	
38
+	const props = defineProps({
39
+	  list: {
40
+	    type: Array,
41
+	    required: true,
42
+	    default: () => {
43
+	      return []
44
+	    }
45
+	  }
46
+	})
3 47
 	const currentIndex = ref(0)
4 48
 
5 49
 	const moviesList = ref([
@@ -18,34 +62,24 @@
18 62
 			title: '帕丁顿熊3'
19 63
 		}
20 64
 	])
21
-	function onItemClick() {
22
-		uni.showToast({ title: '功能升级中...' })
65
+	
66
+	function onDetailClick(){
67
+		
68
+		// uni.showToast({
69
+		// 	title:'功能升级中...',
70
+		// 	icon:'none'
71
+		// })
72
+		uni.navigateTo({
73
+			url:'/subPages/pages/movies/moviesIndex'
74
+		})
75
+	}
76
+	
77
+	function onTabClick(position:number){
78
+		currentIndex.value =position
79
+		uni.$emit('movie_tab_click',position)
23 80
 	}
24 81
 </script>
25 82
 
26
-<template>
27
-	<view class="movies-container">
28
-
29
-		<view class="title-content">
30
-			<text class="big-title">热映影片</text>
31
-			<text class="small-title">即将上映</text>
32
-			<view class="right-title" @click="onItemClick">
33
-				<text class="more-title">查看全部</text>
34
-				<image class="more-icon" :src="ICON_CDN_URL+'order_store_entry_220624.png'" mode="widthFix"></image>
35
-			</view>
36
-		</view>
37
-
38
-		<view class="card-content">
39
-			<view @click="onItemClick" class="card-item" v-for="(item,index) in moviesList" :key="'movies-item-'+index">
40
-				<image class="card-img" :src="item.img" mode="aspectFill"></image>
41
-				<text class="card-title">{{item.title}}</text>
42
-				<text class="card-btn">购票</text>
43
-			</view>
44
-		</view>
45
-
46
-
47
-	</view>
48
-</template>
49 83
 
50 84
 <style scoped lang="scss">
51 85
 	.movies-container {
@@ -56,11 +90,41 @@
56 90
 		margin-right: 20rpx;
57 91
 		background: #FFFFFF;
58 92
 		border-radius: 20rpx;
59
-		padding: 24rpx;
93
+		padding-top: 34rpx;
94
+		padding-left: 12rpx;
95
+		padding-right: 12rpx;
96
+		padding-bottom: 34rpx;
97
+		
98
+		
99
+		.goods-scoll-content {
100
+			width: 100%;
101
+			display: flex;
102
+			flex-direction: row;
103
+			align-items: center;
104
+		
105
+			.goods-scoll-item {
106
+				display: flex;
107
+				flex-direction: row;
108
+				white-space: nowrap;
109
+				width: 100%;
110
+				margin-left: 10rpx;
111
+				margin-right: 10rpx;
112
+			}
113
+		
114
+			.goods-scoll-item-x {
115
+				display: inline-block;
116
+				text-align: center;
117
+				width: 160rpx;
118
+				margin-right: 16rpx;
119
+			}
120
+		}
121
+
60 122
 
61 123
 		.card-content {
62 124
 			display: flex;
63 125
 			flex-direction: row;
126
+			width: 160rpx;
127
+			box-sizing: border-box;
64 128
 
65 129
 			.card-item {
66 130
 				display: flex;
@@ -68,32 +132,72 @@
68 132
 				margin-right: 4rpx;
69 133
 				margin-left: 4rpx;
70 134
 				margin-top: 26rpx;
135
+				width: 160rpx;
136
+				
137
+				.card-img-content{
138
+					display: flex;
139
+					flex-direction: column;
140
+					margin-bottom: 26rpx;
141
+					position: relative;
142
+					height: 236rpx;
143
+					width: 160rpx;
144
+				}
145
+				.card-grade{
146
+					position: absolute;
147
+					bottom: 0;
148
+					width: 160rpx;
149
+					display: flex;
150
+					border-bottom-right-radius:20rpx ;
151
+					border-bottom-left-radius:20rpx ;
152
+					padding-top: 10rpx;
153
+					padding-bottom: 10rpx;
154
+					flex-direction: row;
155
+					align-items: center;
156
+					justify-content: center;
157
+					color: #fff;
158
+					z-index: 2;
159
+					font-size: 24rpx;
160
+					background: linear-gradient( 180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%);
161
+				}
71 162
 
72 163
 				.card-img {
73
-					width: 158rpx;
74
-					height: 270rpx;
75
-					border-radius: 20rpx;
76
-					margin-bottom: 16rpx;
164
+					width: 160rpx;
165
+					height: 236rpx;
166
+					border-radius: 10rpx;
167
+					background-color: #f8f8f8;
77 168
 				}
78 169
 
79 170
 				.card-title {
80 171
 					font-size: 24rpx;
81 172
 					color: #333;
82 173
 					line-height: 24rpx;
83
-					margin-bottom: 20rpx;
84 174
 					width: 158rpx;
85 175
 					white-space: nowrap;
86 176
 					overflow: hidden;
87 177
 					text-overflow: ellipsis;
178
+					text-align: left;
179
+				}
180
+				
181
+				.card-des{
182
+					font-size: 20rpx;
183
+					color: #999;
184
+					line-height: 20rpx;
185
+					width: 158rpx;
186
+					text-align: left;
187
+					margin-top: 30rpx;
88 188
 				}
89 189
 
90 190
 				.card-btn {
91 191
 					color: #fff;
92 192
 					background-color: #F83554;
93
-					border-radius: 20rpx;
94
-					font-size: 28rpx;
193
+					border-radius: 44rpx;
194
+					font-size: 24rpx;
95 195
 					text-align: center;
196
+					margin-top: 20rpx;
96 197
 					width: 90rpx;
198
+					height: 44rpx;
199
+					line-height: 44rpx;
200
+					text-align: center;
97 201
 				}
98 202
 			}
99 203
 		}
@@ -102,6 +206,7 @@
102 206
 			width: 100%;
103 207
 			display: flex;
104 208
 			flex-direction: row;
209
+			margin-left: 12rpx;
105 210
 			align-items: center;
106 211
 
107 212
 			.big-title {
@@ -114,13 +219,16 @@
114 219
 			.small-title {
115 220
 				font-size: 30rpx;
116 221
 				color: #333;
117
-				flex: 1;
222
+				margin-right: 30rpx;
118 223
 			}
119 224
 
120 225
 			.right-title {
121 226
 				display: flex;
122 227
 				flex-direction: row;
123 228
 				align-items: center;
229
+				flex: 1;
230
+				justify-content: flex-end;
231
+				margin-right: 24rpx;
124 232
 
125 233
 				.more-title {
126 234
 					font-size: 28rpx;

+ 4 - 3
src/pages/home/components/product-new.vue

@@ -157,7 +157,7 @@
157 157
 
158 158
 			<view class="price-content">
159 159
 				<text class="price">{{item.type===6?item.lowestCouponPrice:item.price}}</text>
160
-				<text class="price-x">{{item.type===6?item.price:item.market_price}}</text>
160
+				<!-- <text class="price-x">{{item.type===6?item.price:item.market_price}}</text> -->
161 161
 				<text class="sell">已售{{item.sales}}件</text>
162 162
 			</view>
163 163
 
@@ -194,6 +194,7 @@
194 194
 					color: #F83554;
195 195
 					margin-left: 20rpx;
196 196
 					margin-right: 10rpx;
197
+					flex: 1;
197 198
 				}
198 199
 
199 200
 				.price-x {
@@ -218,7 +219,7 @@
218 219
 				margin-top: 20rpx;
219 220
 
220 221
 				.annuity-value {
221
-					background-color: antiquewhite;
222
+					background-color: #f5f5f5;
222 223
 					color: #F83554;
223 224
 					font-size: 24rpx;
224 225
 					border-radius: 4rpx;
@@ -226,7 +227,7 @@
226 227
 					padding-right: 4rpx;
227 228
 				}
228 229
 				.annuity-value-x {
229
-					background-color: #faf0f1;
230
+					background-color: #ffefef;
230 231
 					color: #F83554;
231 232
 					font-size: 24rpx;
232 233
 					border-radius: 4rpx;

+ 18 - 4
src/pages/home/index.vue

@@ -8,16 +8,15 @@
8 8
 	import Header from '~/pages/home/components/header.vue'
9 9
 	import ProductList from '~/pages/home/components/product-new.vue'
10 10
 	import { getHomeBanner, getProductShare } from '~/apis/common'
11
+	import {apiGetHomeMovieList} from '~/apis/movies'
11 12
 	import { useUserStore } from '~/stores/userStore'
12 13
 	import CXBDialogSIgnIn from '~/components/CXBDialogSignIn/CXBDialogSIgnIn.vue'
13 14
 	import { CDM_URL, CDN_URL } from '~/config/app'
14 15
 	import CXBPrivacyPopup from '~/components/CXBPrivacyPopup/CXBPrivacyPopup.vue'
15 16
 	import { PRODUCT_TAB_ARR } from "./constants.js"
16 17
 	import Cache from '~/utils/cache'
17
-
18 18
 	import CXBBackTop from '~/components/CXBBackTop/CXBBackTop.vue'
19 19
 	import { getDcSeckill } from '~/apis/dacang'
20
-
21 20
 	const userStore = useUserStore()
22 21
 	const usePageStore = usePageStoreWidthOut()
23 22
 	usePageStore.setPageConfig({
@@ -51,6 +50,8 @@
51 50
 	const productTabList = ref(PRODUCT_TAB_ARR)
52 51
 	const currentTopIndex = ref(0)
53 52
 	
53
+	const moviesList =ref([])
54
+	
54 55
 	
55 56
 	const state = reactive({
56 57
 		shareId: '',
@@ -77,7 +78,8 @@
77 78
 		duration: 500,
78 79
 		currents: '0',
79 80
 		cid: 0,
80
-		keyword: 0
81
+		keyword: 0,
82
+		moviesIndex:0,
81 83
 	})
82 84
 	// 距离顶部距离
83 85
 	const Scroll_X = ref(0)
@@ -136,6 +138,7 @@
136 138
 		})
137 139
 		state.page = 1
138 140
 		loadProductList()
141
+		getMovieList()
139 142
 		loadList('reload')
140 143
 		getProductShare().then((res) => {
141 144
 			if (res)
@@ -144,8 +147,18 @@
144 147
 			// console.log(message)
145 148
 		})
146 149
 		userStore.setRedirectPage('/pages/home/index', 'tab')
150
+		uni.$on('movie_tab_click',(value)=>{
151
+			state.moviesIndex =value
152
+			getMovieList()
153
+		})
147 154
 		
148 155
 	})
156
+	
157
+	function getMovieList(){
158
+		apiGetHomeMovieList(state.moviesIndex).then(res=>{
159
+			moviesList.value = res.film_list
160
+		})
161
+	}
149 162
 
150 163
 	onShareAppMessage(() => {
151 164
 		const shareId = Cache.get('SHARE_ID')
@@ -276,6 +289,7 @@
276 289
 		state.page = 1
277 290
 		loadProductList()
278 291
 		loadList('reload')
292
+		getMovieList()
279 293
 	})
280 294
 
281 295
 	onReachBottom(() => {
@@ -406,7 +420,7 @@
406 420
 					</div>
407 421
 				</div>
408 422
 				<Navs />
409
-				<Movies />
423
+				<Movies :list ='moviesList'/>
410 424
 				<div v-if="msProductList.length > 0" class="px-3 relative " style="width: 700rpx; height: 458rpx;">
411 425
 					<!-- 秒杀大图 -->
412 426
 					<image lazy-load style="width: 100%;height: 100%; " :src="msbkImg" />

+ 70 - 3
src/pages/message/index.vue

@@ -4,6 +4,8 @@ import { getNoticeList } from "~/apis/common";
4 4
 import { encodeBase64 } from "~/utils/http/helper";
5 5
 import CXBEmpty from "~/components/CXBEmpty/CXBEmpty.vue";
6 6
 const announcementList = ref()
7
+const htmlHeadValue =ref("<div style='overflow : hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 1; -webkit-box-orient: vertical;word-break: break-all; '>")
8
+const htmlEndValue =ref("</div>")
7 9
 onLoad(async (options) => {
8 10
   let res = await getNoticeList()
9 11
   console.log(res);
@@ -18,11 +20,28 @@ function go(item: any) {
18 20
 
19 21
 </script>
20 22
 <template>
21
-  <div class="px-3" v-if="announcementList != undefined">
23
+ <!-- <div class="px-3" v-if="announcementList != undefined">
22 24
     <div v-for="(item, index) in announcementList" :key="index">
23 25
       <div @click="go(item)" class="py-2 text_gg " style="border-bottom: 1rpx solid #c0c4cc;">{{ item.title }}</div>
24 26
     </div>
25
-  </div>
27
+  </div> -->
28
+  
29
+  <view class="msg-out-content" v-if="announcementList != undefined">
30
+	  <view @click="go(item)" class="msg-content" v-for="(item, index) in announcementList" :key="'msg-item-'+index">
31
+		  <image class="msg-icon" src="/static/icon/img_msg.png" mode="widthFix"></image>
32
+		  <view class="right-content">
33
+			  <view class="msg-info">
34
+			  			  <text class="msg-title">{{item.title}}</text>
35
+			  			   <text class="msg-date">{{item.create_time}}</text>
36
+			  </view>
37
+			  
38
+			  <rich-text class="msg-des" :nodes="htmlHeadValue+item.content+htmlEndValue"></rich-text>
39
+		  </view>
40
+		  
41
+	  </view>
42
+  </view>
43
+
44
+
26 45
   <div v-else class="h-screen w-screen flex flex-col justify-center items-center">
27 46
     <CXBEmpty type="message" />
28 47
   </div>
@@ -32,7 +51,7 @@ function go(item: any) {
32 51
 style:
33 52
   navigationBarTitleText: 消息
34 53
 </route>
35
-<style scoped>
54
+<style scoped lang="scss">
36 55
 .text_gg {
37 56
   height: 42rpx;
38 57
   font-size: 30rpx;
@@ -40,4 +59,52 @@ style:
40 59
   font-weight: 400;
41 60
   color: #333333;
42 61
 }
62
+
63
+.msg-out-content{
64
+	display: flex;
65
+	flex-direction: column;
66
+	
67
+	.msg-content{
68
+		display: flex;
69
+		flex-direction: row;
70
+		align-items: center;
71
+		height: 160rpx;
72
+		border-bottom: 1rpx solid #eeeeee;
73
+		padding-left: 30rpx;
74
+		padding-right: 30rpx;
75
+		.msg-icon{
76
+			width: 80rpx;
77
+			height: 80rpx;
78
+			min-width: 80rpx;
79
+			margin-right: 20rpx;
80
+		}
81
+		
82
+		.right-content{
83
+			display: flex;
84
+			flex-direction: column;
85
+		}
86
+		.msg-info{
87
+			display: flex;
88
+			flex-direction: row;
89
+			align-items: center;
90
+			
91
+			.msg-title{
92
+				font-size: 32rpx;
93
+				font-weight: bolder;
94
+				color: #333;
95
+				flex: 1;
96
+			}
97
+			.msg-date{
98
+				font-size: 24rpx;
99
+				color: #999;
100
+			}
101
+		}
102
+		.msg-des{
103
+			margin-top: 10rpx;
104
+			font-size: 26rpx;
105
+			color: #666;
106
+		}
107
+	}
108
+	
109
+}
43 110
 </style>

+ 217 - 45
src/pages/order-confirm/index.vue

@@ -6,7 +6,7 @@
6 6
 	import CXBYaojinTag from '~/components/CXBYaojinTag/CXBYaojinTag.vue'
7 7
 	import FCell from '~/components/FCell/FCell.vue'
8 8
 	import { encodePhone } from '~/utils'
9
-	import { CDN_URL,IMG_CDN_NEW_URL } from '~/config/app'
9
+	import { CDN_URL, IMG_CDN_NEW_URL } from '~/config/app'
10 10
 	import { useAddressStore } from '~/stores/addressStore'
11 11
 	import FField from '~/components/FField/FField.vue'
12 12
 
@@ -14,6 +14,10 @@
14 14
 	// const addressInfo = ref({})
15 15
 	const addressStore = useAddressStore()
16 16
 	const userStore = useUserStore()
17
+	const newVrValue = ref(0)
18
+	const showVrValue=ref(0)
19
+	const totalVrValue =ref(0)
20
+	const isFirstChooseVr=ref(true)
17 21
 
18 22
 	const data = reactive({
19 23
 		cartOrder: [],
@@ -34,11 +38,18 @@
34 38
 		// proPrice: ''
35 39
 
36 40
 		enabled: false,
41
+		payType:''
37 42
 	})
38 43
 
39
-	const defautRadioIcon = ref(IMG_CDN_NEW_URL+'SingleChoice_nor.png')
40
-	const checkRadioIcon = ref(IMG_CDN_NEW_URL+'SingleChoice_sel.png')
44
+	const defautRadioIcon = ref(IMG_CDN_NEW_URL + 'SingleChoice_nor.png')
45
+	const checkRadioIcon = ref(IMG_CDN_NEW_URL + 'SingleChoice_sel.png')
46
+	let initType=-1
47
+	
41 48
 	onLoad(async (options) => {
49
+		console.log("===options",options);
50
+		if(options && options.initType){
51
+			initType = options.initType
52
+		}
42 53
 		if (options && options.type)
43 54
 			data.type = options.type
44 55
 
@@ -73,7 +84,7 @@
73 84
 			console.log(15999999, res)
74 85
 			data.is_dacang_vip_product = res.is_dacang_vip_product
75 86
 			data.cartOrder = res.order
76
-			data.totalPrice = res.order_price
87
+			data.totalPrice ='¥'+ res.order_price
77 88
 			data.orderStatus = res.status
78 89
 			// data.proPrice = res.proPrice
79 90
 			uni.hideLoading()
@@ -102,11 +113,11 @@
102 113
 				title: '暂不发货',
103 114
 			})
104 115
 		}
105
-        let fzone_paytypeX 
116
+		let fzone_paytypeX
106 117
 		for (var i = 0; i < data.cartOrder.length; i++) {
107 118
 			let cartOrderList = data.cartOrder[i].list
108 119
 			for (var j = 0; j < cartOrderList.length; j++) {
109
-			fzone_paytypeX	= cartOrderList[j].fzone_paytypeX
120
+				fzone_paytypeX = cartOrderList[j].fzone_paytypeX
110 121
 				if (!fzone_paytypeX) {
111 122
 					uni.showToast({
112 123
 						title: '请选择支付方式!',
@@ -127,8 +138,65 @@
127 138
 			distribution_mode: '1',
128 139
 			fzone_paytype: JSON.stringify(fzone_paytypeX)
129 140
 		}
130
-		data.enabled = true
131
-		payment(paymentData)
141
+		
142
+		
143
+		let showTypeDes = ''
144
+		if (data.payType == 'b1') {
145
+			showTypeDes =  'VR+积分方式支付,' 
146
+		} else if (data.payType == 'b2') {
147
+			showTypeDes =  '现金+积分方式支付,' 
148
+		} else if (data.payType == 'b3') {
149
+			showTypeDes =  'VR+京豆方式支付,' 
150
+		} else if (data.payType == 'b4') {
151
+			showTypeDes =  '现金+京豆方式支付,' 
152
+		}  else if (data.payType == 'b5'|| data.payType == 'a1') {
153
+			showTypeDes =  'VR方式支付,' 
154
+		} else if (data.payType == 'b6' ||  data.payType == 'a2') {
155
+			showTypeDes =  '现金方式支付,' 
156
+		}else if (data.payType == 'c1') {
157
+			showTypeDes =  '复购金方式支付,' 
158
+		}else if (data.payType == 'a3') {
159
+			showTypeDes =  '现金+VR方式支付,' 
160
+		}
161
+		
162
+		let des = ''
163
+		if(initType==0){//vip
164
+			des='会员专区商品一旦下单不支持退货退款,您将使用'+showTypeDes+'是否继续支付'
165
+		}else if(initType==1){//精彩生活
166
+			des='精彩生活区商品非质量问题不支持退换货请大家确认下单!您将使用'+showTypeDes+'是否继续支付'
167
+		}else if(initType==2 || initType==3 ){//商贸区
168
+			des='您将使用'+showTypeDes+'是否继续支付'
169
+		}else if(initType==4){//精品商城
170
+			des='精彩生活区商品非质量问题不支持退换货请大家确认下单!您将使用'+showTypeDes+'是否继续支付'
171
+		}
172
+		
173
+		
174
+		if(newVrValue.value>showVrValue.value){
175
+			uni.showToast({
176
+				title:'VR数量大于拥有VR',
177
+				icon:'none'
178
+			})
179
+			return
180
+		}
181
+		
182
+		if(newVrValue.value<0){
183
+			uni.showToast({
184
+				title:'VR数量不能小于0',
185
+				icon:'none'
186
+			})
187
+			return
188
+		}
189
+		
190
+		uni.showModal({
191
+			title:'温馨提示',
192
+			content:des,
193
+			complete: (res) => {
194
+				if(res.confirm){
195
+					data.enabled = true
196
+					 payment(paymentData)
197
+				}
198
+			}
199
+		})
132 200
 	}
133 201
 
134 202
 	function payment(createOrderData : CreateOrderRequest) {
@@ -167,14 +235,21 @@
167 235
 			orderCreate(createOrderData).then((res) => {
168 236
 				if (res) {
169 237
 					data.enabled = false
170
-					console.log(res)
171
-					// console.log('order_create')
172
-					console.log(res)
173 238
 					uni.hideLoading()
174
-					uni.navigateTo({
175
-						//   // url: '/pages/payment/index?' + `cardId=${data.cartId}&type=1&product_id=${data.productId}`
176
-						url: '/pages/payment/index?' + `pay_price=${res.groupOrder.pay_price}&order_id=${res.order_id}&OrderList=${JSON.stringify(res.groupOrder)}`,
177
-					})
239
+					if(data.payType=='c1' ||  data.payType=='b1' || data.payType=='b3' || data.payType=='b5' || data.payType=='a1'){
240
+						uni.navigateTo({
241
+							url: '/pages/payment/success'
242
+						})
243
+					}else if(data.payType=='a3' && newVrValue ==totalVrValue){
244
+						uni.navigateTo({
245
+							url: '/pages/payment/success'
246
+						})
247
+					}else {
248
+						uni.navigateTo({
249
+							url: '/pages/payment/index?' + `pay_price=${data.totalPrice}&order_id=${res.order_id}&OrderList=${JSON.stringify(res.groupOrder)}`,
250
+						})
251
+					}
252
+					
178 253
 				}
179 254
 			}).catch((err) => {
180 255
 				data.enabled = false
@@ -209,7 +284,27 @@
209 284
 			})
210 285
 		})
211 286
 	}
212
-
287
+   
288
+   function onVrInputChange(e,index, fIndex, childIndex){
289
+	 
290
+	 if(( totalVrValue.value-e.detail.value)<0){
291
+		  data.cartOrder[index].list[fIndex].fzone_paytype[childIndex].price=0
292
+	 }else if(e.detail.value<0){
293
+		   data.cartOrder[index].list[fIndex].fzone_paytype[childIndex].price=totalVrValue.value
294
+	 }else {
295
+		  data.cartOrder[index].list[fIndex].fzone_paytype[childIndex].price=totalVrValue.value -e.detail.value
296
+	 }
297
+	  newVrValue.value = e.detail.value
298
+	  data.cartOrder[index].list[fIndex].fzone_paytype[childIndex].other = e.detail.value
299
+	  
300
+	 if(!e.detail.value){
301
+		 data.cartOrder[index].list[fIndex].fzone_paytype[childIndex].other=0
302
+		 newVrValue.value = 0
303
+		 data.cartOrder[index].list[fIndex].fzone_paytype[childIndex].price =totalVrValue.value
304
+	 }
305
+	 
306
+	  data.totalPrice ='¥'+ data.cartOrder[index].list[fIndex].fzone_paytype[childIndex].price +'+'+data.cartOrder[index].list[fIndex].fzone_paytype[childIndex].other+'VR'
307
+   }
213 308
 
214 309
 
215 310
 	function onRadioClick(index, fIndex, childIndex) {
@@ -219,6 +314,32 @@
219 314
 		}
220 315
 		data.cartOrder[index].list[fIndex].fzone_paytype[childIndex].checked = true
221 316
 		data.cartOrder[index].list[fIndex].fzone_paytypeX = data.cartOrder[index].list[fIndex].fzone_paytype[childIndex]
317
+		let labItem = data.cartOrder[index].list[fIndex].fzone_paytype[childIndex]
318
+        data.payType = labItem.type
319
+		newVrValue.value  =0
320
+		if (labItem.type == 'b1') {
321
+			data.totalPrice = '¥' +labItem.price + 'VR+' + labItem.other + '积分'
322
+		} else if (labItem.type == 'b2') {
323
+			data.totalPrice = '¥' + labItem.price + '+' + labItem.other + '积分'
324
+		} else if (labItem.type == 'b3') {
325
+			data.totalPrice = '¥' + labItem.price + 'VR+' + labItem.other + '京豆'
326
+		} else if (labItem.type == 'b4') {
327
+			data.totalPrice = '¥' + labItem.price + '+' + labItem.other + '京豆'
328
+		}  else if (labItem.type == 'b5'|| labItem.type == 'a1') {
329
+			data.totalPrice = '¥' +labItem.price + 'VR'
330
+		} else if (labItem.type == 'b6' ||  labItem.type == 'a2') {
331
+			data.totalPrice = '¥' + labItem.price
332
+		}else if (labItem.type == 'c1') {
333
+			data.totalPrice = '¥' +labItem.price +  '复购金'
334
+		}else if(labItem.type == 'a3'){
335
+			data.totalPrice = '¥' + labItem.price +'+'+  labItem.other + 'VR'
336
+			newVrValue.value  = labItem.other
337
+			if(isFirstChooseVr.value){
338
+				showVrValue.value =labItem.other
339
+				totalVrValue.value = labItem.price+labItem.other
340
+			}
341
+			isFirstChooseVr.value=false
342
+		}
222 343
 	}
223 344
 
224 345
 	function onNumClick(index, fIndex, type) {
@@ -322,46 +443,59 @@
322 443
 									{{ orderProductItem.productAttr.sku }}
323 444
 								</div>
324 445
 							</div>
325
-							<div class="flex">
326
-								<CXBYaojinTag v-if="item.mer_id != '148'" :amount="orderProductItem.yanglao" />
327
-							</div>
446
+
328 447
 							<div class="flex justify-between ">
329 448
 								<div v-if="item.mer_id != '148'" style="color:#fa4032">
330 449
 									¥{{ orderProductItem.productAttr.price }}
331 450
 								</div>
332 451
 								<div v-if="item.mer_id == '148'" style="color:#fa4032">
333
-									{{ Math.round(orderProductItem.productAttr.price
334
-                    * 30) }}积分
452
+									{{ Math.round(orderProductItem.productAttr.price* 30) }}积分
335 453
 								</div>
336
-								<!-- <nut-input-number
337
-				  v-model="orderProductItem.cart_num"
338
-				  @change="(num) => handleNumberChange(num, orderProductItem)"
339
-				/> -->
340
-								<view class="number-content">
454
+
455
+								<!-- <view class="number-content">
341 456
 									<view @click="onNumClick(index,orderProductItemIndex,0)" class="del">-</view>
342 457
 									<text class="num-value">{{orderProductItem.cart_num}}</text>
343 458
 									<view @click="onNumClick(index,orderProductItemIndex,1)" class="add">+</view>
344
-								</view>
459
+								</view> -->
460
+							</div>
461
+							<div class="flex">
462
+								<CXBYaojinTag v-if="item.mer_id != '148'" :amount="orderProductItem.yanglao" />
345 463
 							</div>
346 464
 						</div>
347 465
 					</div>
348 466
 					<view class="radio-content">
349 467
 						<view @click="onRadioClick(index,orderProductItemIndex,labIndex)" :key="'radio-item-'+index"
350
-							class="radio-item" v-for="(labItem,labIndex) in orderProductItem.fzone_paytype">
351
-							<text class="radio-note">{{labItem.note}}</text>
352
-							<image :src="labItem.checked==1?checkRadioIcon:defautRadioIcon" class="radio-icon"></image>
353
-							<text v-if="labItem.type=='b1'"
354
-								class="radio-name">{{labItem.price}}VR+{{labItem.other}}积分</text>
355
-							<text v-if="labItem.type=='b2'"
356
-								class="radio-name">¥{{labItem.price}}+{{labItem.other}}积分</text>
357
-							<text v-if="labItem.type=='b5'" class="radio-name">{{labItem.price}}VR</text>
358
-							<text v-if="labItem.type=='b6'" class="radio-name">¥{{labItem.price}}</text>
468
+							class="radio-item-out" v-for="(labItem,labIndex) in orderProductItem.fzone_paytype">
469
+							
470
+							<view class="radio-item">
471
+								<text class="radio-note">{{labItem.note}}</text>
472
+								<image  :src="labItem.checked==1?checkRadioIcon:defautRadioIcon" class="radio-icon"></image>
473
+								<text v-if="labItem.type=='b1'"
474
+									class="radio-name">{{labItem.price}}VR+{{labItem.other}}积分</text>
475
+								<text v-if="labItem.type=='b2'"
476
+									class="radio-name">¥{{labItem.price}}+{{labItem.other}}积分</text>
477
+								<text v-if="labItem.type=='b3'"
478
+									class="radio-name">{{labItem.price}}VR+{{labItem.other}}京豆</text>
479
+								<text v-if="labItem.type=='b4'"
480
+									class="radio-name">¥{{labItem.price}}+{{labItem.other}}京豆</text>
481
+								<text v-if="labItem.type=='b5' || labItem.type=='a1'" class="radio-name">{{labItem.price}}VR</text>
482
+								<text v-if="labItem.type=='b6' || labItem.type=='a2'" class="radio-name">¥{{labItem.price}}</text>
483
+								<text v-if="labItem.type=='c1'" class="radio-name">{{labItem.price}}复购金 </text>
484
+								<view v-if="labItem.type=='a3'&& data.payType!='a3'" class="radio-name">¥{{labItem.price}}+{{labItem.other}}VR </view>
485
+							</view>
486
+						   <view class="a3-content"   v-if="labItem.type=='a3'&& data.payType=='a3'">
487
+							<view class="a3-top-content">
488
+								<text class="radio-note">VR:</text>
489
+								<input maxlength="6" class="radio-note-input" type="number" :value="newVrValue" @input="onVrInputChange($event ,index,orderProductItemIndex,labIndex)"  />
490
+								<text class="radio-note">现金:</text>
491
+								<input disabled class="radio-note-input" type="text" v-model="labItem.price" />
492
+							</view>
493
+							<text class="radio-note"> 剩余VR:{{showVrValue}}</text>
494
+						   </view>
359 495
 						</view>
360 496
 					</view>
361
-
362 497
 				</div>
363 498
 
364
-
365 499
 				<div>
366 500
 					<!-- 优惠券数据 先写死 -->
367 501
 					<FCell v-if="item.mer_id != '148'" title="优惠劵"
@@ -370,11 +504,6 @@
370 504
 					<FCell v-if="item.mer_id == '148'" title="积分"
371 505
 						:value="userStore.userInfo.score != '0' ? userStore.userInfo.score : '暂无积分'" arrow />
372 506
 					<FCell title="运费" :value="item.order.postage_price > 0 ? item.order.postage_price : '免运费'" arrow />
373
-					<!--            <FCell -->
374
-					<!--                title="留言" -->
375
-					<!--                value="建议留言前先与商家沟通确认" -->
376
-					<!--                arrow -->
377
-					<!--            ></FCell> -->
378 507
 					<FField v-model="data.mark" label="留言" placeholder="建议留言前先与商家沟通确认" :ex-class="['text-right']" />
379 508
 				</div>
380 509
 			</div>
@@ -388,8 +517,8 @@
388 517
 				<div v-if="data.type && data.type == '3'" style="color:#fa4032">
389 518
 					{{ Math.round(data.totalPrice * 30) }}积分
390 519
 				</div>
391
-				<div v-else style="color:#fa4032">
392
-					{{ data.totalPrice }}
520
+				<div class="submit-price-content" v-else style="color:#fa4032">
521
+					{{ data.totalPrice }}
393 522
 				</div>
394 523
 			</div>
395 524
 			<div class="flex">
@@ -407,6 +536,41 @@ style:
407 536
 </route>
408 537
 
409 538
 <style lang="scss">
539
+	
540
+	.submit-price-content{
541
+		width: 340rpx;
542
+		word-break:break-all;
543
+	}
544
+	
545
+	.a3-content{
546
+		display: flex;
547
+		flex-direction: column;
548
+	    justify-content: center;
549
+		margin-bottom: 20rpx;
550
+		margin-left: 100rpx;
551
+		
552
+		
553
+		.a3-top-content{
554
+			display: flex;
555
+			flex-direction: row;
556
+			align-items: center;
557
+			margin-bottom: 10rpx;
558
+		}
559
+		.radio-note{
560
+			font-size: 28rpx;
561
+			margin-right: 10rpx;
562
+			color: #333;
563
+		}
564
+		.radio-note-input{
565
+			width: 130rpx;
566
+			font-size: 28rpx;
567
+			padding-left: 10rpx;
568
+			color: #333;
569
+			margin-right: 30rpx;
570
+			border: 1rpx solid #999;
571
+			border-radius: 10rpx;
572
+		}
573
+	}
410 574
 	.number-content {
411 575
 		display: flex;
412 576
 		flex-direction: row;
@@ -418,6 +582,8 @@ style:
418 582
 			color: #333;
419 583
 			font-weight: bolder;
420 584
 		}
585
+		
586
+		
421 587
 
422 588
 		.num-value {
423 589
 			background-color: #f8f8f8;
@@ -440,6 +606,10 @@ style:
440 606
 		flex-direction: column;
441 607
 		margin-top: 20rpx;
442 608
 		margin-bottom: 20rpx;
609
+		.radio-item-out{
610
+			display: flex;
611
+			flex-direction: column;
612
+		}
443 613
 
444 614
 		.radio-item {
445 615
 			display: flex;
@@ -459,6 +629,8 @@ style:
459 629
 			.radio-name {
460 630
 				font-size: 26rpx;
461 631
 				color: #333;
632
+				max-width: 276rpx;
633
+				word-break:break-all;
462 634
 			}
463 635
 
464 636
 			.radio-icon {

+ 23 - 3
src/pages/payment/index.vue

@@ -17,6 +17,7 @@ const state = reactive({
17 17
   memberType: 0,
18 18
   initType:0,
19 19
   tabIndex: Number.NaN,
20
+  orderSn:''
20 21
 })
21 22
 onLoad((options) => {
22 23
   // console.log('我是options',options)
@@ -24,7 +25,9 @@ onLoad((options) => {
24 25
     state.orderList = options.OrderList
25 26
     state.payPrice = options.pay_price
26 27
     state.orderId = options.order_id
27
-	state.initType =options.initType
28
+	state.initType =options.initType //3 电影购票 1充值话费
29
+	state.orderSn = options.orderSn
30
+	console.log("===options.pay_price",options.pay_price);
28 31
 
29 32
     if (options.tabIndex)
30 33
       state.tabIndex = options.tabIndex
@@ -59,7 +62,7 @@ function handleConfirm() {
59 62
     extraData: {
60 63
       oid: state.orderId,
61 64
       OrderLists: state.orderList?state.orderList:[],
62
-      type: state.initType==1?'xfbspzfHF':'xfbspzf',// 商品--xfbspzf  话费--xfbspzfHF
65
+      type: state.initType==1?'xfbspzfHF':(state.initType==3?'dyxfbzh':'xfbspzf'),// 商品--xfbspzf  话费--xfbspzfHF
63 66
     },
64 67
     envVersion: 'trial', // develop(开发版),trial(体验版),release(正式版)
65 68
     // envVersion: 'release', // develop(开发版),trial(体验版),release(正式版)
@@ -86,6 +89,14 @@ function onClickLeft() {
86 89
 	 })
87 90
 		return
88 91
 	}
92
+	
93
+	if(state.initType==3){
94
+		uni.navigateBack({
95
+		  delta: 1,
96
+		})
97
+		return
98
+	}
99
+	
89 100
   uni.showModal({
90 101
     title: '确认要离开收银台?',
91 102
     content: '您的订单在24小时内未支付将被取消,请尽快完成支付。',
@@ -147,7 +158,7 @@ function onClickLeft() {
147 158
         <div class="text-xs text-gray-500">
148 159
           支付金额
149 160
         </div>
150
-        <FPrice :price="state.payPrice" ex-class="!text-xl font-bold" />
161
+      <view class="price">{{state.payPrice}}</view>
151 162
       </div>
152 163
       <div class="bg-white rounded-lg text-sm p-3 flex flex-col">
153 164
         <div class="flex f-hairline-bottom text-sm pb-2">
@@ -185,3 +196,12 @@ page {
185 196
   background: #f8f8f8;
186 197
 }
187 198
 </style>
199
+
200
+<style scoped lang="scss">
201
+.price{
202
+	font-size: 40rpx;
203
+	color: red;
204
+	margin-top: 10rpx;
205
+	font-weight: bolder;
206
+}
207
+</style>

+ 1 - 13
src/pages/store/nearby/index.vue

@@ -79,7 +79,7 @@ onShow(()=>{
79 79
 		icon:'none'
80 80
 	})
81 81
 	setTimeout(()=>{
82
-		 if (pageStore.currentPage.type === 'tab') {
82
+		 if (pageStore?.currentPage?.type === 'tab') {
83 83
 		   uni.switchTab({
84 84
 		     url: pageStore.currentPage.url,
85 85
 		   })
@@ -113,18 +113,6 @@ onShareTimeline(() => {
113 113
     // imageUrl: 'https://cdn.bjtdba.com/vod/image/2023-10-09/20231009202402136.png'
114 114
   }
115 115
 })
116
-onShow(() => {
117
-  // usePageStore.setPageConfig({
118
-  //   currentPage: {
119
-  //     type: 'tab',
120
-  //     url: '/pages/store/nearby/index',
121
-  //   },
122
-  // })
123
-  // console.log('onshow...')
124
-
125
-  // if (state.loadType)
126
-	 //  loadSelectMerchant(state.loadType)
127
-})
128 116
 
129 117
 function loadAll() {
130 118
   state.category_id = 0

+ 53 - 50
src/pages/user/index.vue

@@ -2,7 +2,7 @@
2 2
 	import type { Ref } from 'vue'
3 3
 	import { useUserStore } from '~/stores/userStore'
4 4
 	import { getUserInfo, apiGetUserToken, getNewSignInInfo, getNewSignIn } from '~/apis/user'
5
-	import { CDM_URL, CDN_URL, IMG_CDN_NEW_URL, ICON_CDN_URL,BASE_URL } from '~/config/app'
5
+	import { CDM_URL, CDN_URL, IMG_CDN_NEW_URL, ICON_CDN_URL,BASE_URL,IMG_CDN_URL } from '~/config/app'
6 6
 	import { totalOrderNumber } from '~/apis/order.api'
7 7
 	import type { OrderQuantityModel } from '~/apis/model/order.model'
8 8
 	import CXBDialogSIgnIn from '~/components/CXBDialogSignIn/CXBDialogSIgnIn.vue'
@@ -11,6 +11,8 @@
11 11
 	const userStore = useUserStore()
12 12
 	const userTokenInfo = ref()
13 13
 	const currentType = ref('')
14
+	
15
+	const defaultHeadImg=ref('https://cdn.bjtdba.com/vod/image/2025-01-20/20250120125206881.png')
14 16
 	const myOrderList = [{
15 17
 		id: 'noPay',
16 18
 		icon: `${CDN_URL}/static/assets/obligation_220620.png`,
@@ -189,7 +191,6 @@
189 191
 			let _token = userTokenInfo.value
190 192
 			console.log("===_token", _token);
191 193
 			if (item.text === '店铺管理') {
192
-				
193 194
 				let params=
194 195
 					{
195 196
 						x_token:_token.mweb_info.x_token,
@@ -291,37 +292,30 @@
291 292
 		if (!userInfo) {
292 293
 			return ''
293 294
 		}
294
-		const userRichType = userInfo.value.user_rich_type
295
+		const userRichType = userInfo.value.user_group
295 296
 		// console.log(userStore.userInfo)
296
-		// 普通用户
297
-		if (userRichType == 0)
298
-
299
-			return IMG_CDN_NEW_URL + '用户.png'
300
-
301
-		// 会员
297
+		// 用户
302 298
 		if (userRichType == 1)
303
-
304
-			return IMG_CDN_NEW_URL + '会员.png'
305
-
299
+			return IMG_CDN_NEW_URL + '用户.png'
300
+		// 业务员
301
+		if (userRichType == 2)
302
+			return IMG_CDN_URL + 'icon_yewuyuan.png'
303
+		// 业务经理
306 304
 		if (userRichType == 3)
307
-
308
-			return IMG_CDN_NEW_URL + '创始人.png'
309
-
310
-		// 高级会员
305
+			return IMG_CDN_URL + 'icon_yewujingli.png'
306
+		// 初级合伙人
311 307
 		if (userRichType == 4)
312
-
313
-			return IMG_CDN_NEW_URL + '高级会员.png'
314
-
315
-		if (userRichType == 8)
316
-
317
-			return IMG_CDN_NEW_URL + '合伙人.png'
318
-
319
-		if (userRichType == 9)
320
-
321
-			return IMG_CDN_NEW_URL + '联合创始人.png'
322
-
308
+			return IMG_CDN_URL + 'icon_chuji.png'
309
+		// 中级合伙人
310
+		if (userRichType == 5)
311
+			return IMG_CDN_URL + 'icon_zhongji.png'
312
+			// 高级合伙人
313
+		if (userRichType == 6)
314
+			return IMG_CDN_URL + 'icon_gaoji.png'
315
+			// 董事
316
+		if (userRichType == 7)
317
+				return IMG_CDN_URL + 'icon_member_dongshi.png'
323 318
 		if (!userRichType)
324
-
325 319
 			return ''
326 320
 	})
327 321
 
@@ -503,7 +497,7 @@
503 497
 		<div class="flex flex-col gap-4 relative px-3 pb-safe">
504 498
 			<div class="pt-15 ">
505 499
 				<div class="flex gap-2 mb-2 text-white mb-6">
506
-					<image v-if="userInfo&& userInfo.avatar" :src="userInfo.avatar"
500
+					<image v-if="userInfo&& userInfo.avatar" :src=" userInfo.avatar.indexOf('http://')!= -1?userInfo.avatar:defaultHeadImg"
507 501
 						style="min-width: 100rpx; width:100rpx; height:100rpx;" class="rounded-full"
508 502
 						@click="handleShowMyProfile" />
509 503
 					<image v-else src="https://app.bjtdba.com/uploads/logo.jpg" class="rounded-full"
@@ -520,25 +514,24 @@
520 514
 							</div>
521 515
 						</div>
522 516
 						<view class=" sign-content">
523
-							<view class=" flex gap-1 ">
524
-								<!-- 用户 -->
525
-								<view v-if="userType" class="flex rounded-full  text-[12px] text-white w-12 h-5  w-fit "
526
-									@click="handleShowMyRulePage()">
527
-									<image mode="heightFix" lazy-load class="vip_img" :src="userType" />
528
-								</view>
529
-								<!-- 市区县代理 -->
530
-								<view v-if="areaType" class="flex rounded-full  text-[12px] text-white w-12 h-5  w-fit "
531
-									@click="openPopup">
532
-									<image mode="heightFix" lazy-load class="vip_img" :src="areaType" />
533
-								</view>
534
-								<!-- 股东 -->
535
-								<view v-if="AlholderType"
536
-									class="flex rounded-full  text-[12px] text-white w-12 h-5   w-fit">
537
-									<image mode="heightFix" lazy-load class="vip_img" :src="AlholderType" />
538
-								</view>
539
-							</view>
517
+							
518
+						<!-- 用户 -->
519
+						<image  v-if="userType" mode="widthFix" lazy-load class="sign-icon" :src="userType" />
520
+						
521
+						<!-- 市区县代理 -->
522
+						<!-- <view v-if="areaType" class="flex rounded-full  text-[12px] text-white w-12 h-5  w-fit "
523
+							@click="openPopup">
524
+							<image mode="heightFix" lazy-load class="sign-icon" :src="areaType" />
525
+						</view>
526
+						 -->
527
+						<!-- 股东 -->
528
+					<!-- 	<view v-if="AlholderType"
529
+							class="flex rounded-full  text-[12px] text-white w-12 h-5   w-fit">
530
+							<image mode="heightFix" lazy-load class="sign-icon" :src="AlholderType" />
531
+						</view> -->
540 532
 							<view @click="onSignClick" class="sign-btn">{{state.isCanSignIn?'签到':'已签到'}}</view>
541 533
 						</view>
534
+						
542 535
 					</div>
543 536
 					<FPopup v-model:show="showValue" position="center" ex-class="box_2 ">
544 537
 						<div class="box_2 flex-row">
@@ -610,7 +603,7 @@
610 603
 					</view>
611 604
 					<view class="card-item" @click="onCardItemClick(7)">
612 605
 						<text class="card-title">复购金</text>
613
-						<text class="card-value">{{userInfo.repurchase_price}}</text>
606
+						<text class="card-value">{{userInfo.fugou}}</text>
614 607
 					</view>
615 608
 					<view class="card-item" @click="onCardItemClick(8)">
616 609
 						<text class="card-title">我的部门</text>
@@ -744,7 +737,7 @@
744 737
 	}
745 738
 
746 739
 	.vip_img {
747
-		height: 56rpx;
740
+		height: 46rpx;
748 741
 	}
749 742
 
750 743
 	.box_2 {
@@ -853,11 +846,21 @@
853 846
 		flex-direction: row;
854 847
 		align-items: center;
855 848
 		justify-content: center;
849
+		height:50rpx ;
850
+		flex-wrap: wrap;
851
+		
852
+		.sign-icon{
853
+			width: 140rpx;
854
+			height: 40rpx;
855
+			margin-right: 10rpx;
856
+		}
856 857
 
857 858
 		.sign-btn {
858
-			padding: 4rpx 30rpx;
859
+			padding: 0 30rpx;
860
+			height: 40rpx;
861
+			line-height: 40rpx;
862
+			text-align: center;
859 863
 			font-size: 26rpx;
860
-			margin-top: 10rpx !important;
861 864
 			margin-left: 20rpx;
862 865
 			color: #FD1642;
863 866
 			background-color: #fff;

二進制
src/static/bought.png


二進制
src/static/icon/copy_icon.png


二進制
src/static/icon/downArrow.png


二進制
src/static/icon/img_msg.png


二進制
src/static/icon/leftArrow.png


二進制
src/static/icon/map_address_icon.png


二進制
src/static/icon/movies1.png


二進制
src/static/icon/movies2.png


二進制
src/static/icon/movies3.png


二進制
src/static/icon/phone_icon.png


二進制
src/static/icon/red_close.png


二進制
src/static/icon/timer_icon.png


二進制
src/static/logo.png


二進制
src/static/love_choose.png


二進制
src/static/love_default.png


二進制
src/static/love_icon.png


二進制
src/static/selected.png


二進制
src/static/unselected.png


+ 5 - 3
src/stores/userStore.ts

@@ -58,9 +58,7 @@ export const useUserStore = defineStore('userStore', {
58 58
         async getUserInfo() {
59 59
             try {
60 60
                 this.userInfo = await getUserInfo();
61
-                console.log(this.userInfo);
62
-                
63
-
61
+                console.log("getUserInfo===",this.userInfo);
64 62
             } catch (error) {
65 63
                 uni.navigateTo({
66 64
                     url: '/pages/user/login/index'
@@ -81,15 +79,19 @@ export const useUserStore = defineStore('userStore', {
81 79
             Cache.clear(LOGIN_STATUS)
82 80
             Cache.clear(UID)
83 81
             Cache.clear(SHARE_REDIRECT_PAGE)
82
+			uni.clearStorageSync()
84 83
         },
85 84
         setUID(uid: string) {
86 85
             this.uid = uid
87 86
             Cache.set(UID, uid)
88 87
         },
88
+		
89 89
         setUserInfo(userInfo: UserInfoModel) {
90 90
             this.userInfo = userInfo
91 91
             // 这个是存储的对象数据
92 92
             Cache.set('USER_INFO', userInfo)
93
+			console.log("===userInfo.phone",userInfo.phone);
94
+			uni.setStorageSync('USER_INFO_PHONE',userInfo.phone)
93 95
             // Cache.set(USER_INFO, JSON.stringify(userInfo))
94 96
         },
95 97
         setOpenid(openid: string) {

+ 79 - 32
src/subPages/pages/immediate-withdrawal/index.vue

@@ -11,6 +11,7 @@ import {
11 11
   apigetBankList,
12 12
   apiAuthVerify,
13 13
   apiExtractCreate,
14
+  apiGetHBInfo
14 15
 } from "~/apis/user";
15 16
 import { SpreadInfoModel } from "~/apis/model/spreadInfoModel";
16 17
 import type { UserYanglaoJinModel } from "~/apis/model/userYanglaoJinModel";
@@ -39,8 +40,10 @@ const radioCheckIcon=IMG_CDN_NEW_URL+'SingleChoice_sel.png'
39 40
 const radiodefaultIcon=IMG_CDN_NEW_URL+'SingleChoice_nor.png'
40 41
 const bankIndex=ref(0)
41 42
 const showPhonePop=ref(false)
42
-
43
+const userHBInfo=ref({})
43 44
 const bankList=ref([])
45
+
46
+const userQbPrice=ref(0)
44 47
 // userSpreadInfo.value.brokerage_price
45 48
 onLoad((options) => {
46 49
   if (options && options.type) {
@@ -48,7 +51,10 @@ onLoad((options) => {
48 51
       isshow.value = 1
49 52
     } else if (options.type == 2) {
50 53
       isshow.value = 2
54
+    } else if (options.type == 3) {
55
+      isshow.value = 3
51 56
     }
57
+	console.log("===options.type",options.type);
52 58
   }
53 59
 })
54 60
 onShow(async () => {
@@ -57,19 +63,19 @@ onShow(async () => {
57 63
   getBankList()
58 64
 
59 65
   await userStore.getUserInfo()
66
+  
60 67
   // 佣金信息
61 68
   userSpreadInfo.value = await getUserSpreadInfo()
62
-  console.log(99999, userSpreadInfo.value);
63
-
69
+  // 红包信息
70
+  userHBInfo.value = await apiGetHBInfo()
71
+  userQbPrice.value = userHBInfo.value?.total_source ? parseFloat(userHBInfo.value?.total_source) : 0 
72
+  
64 73
   yanglaojin.value = await getUserYangLaoJin()
65
-
66 74
   // 提现配置
67 75
   widthdrawalConfig.value = await getWithdrawalConfig()
68
-
69
-  console.log(widthdrawalConfig.value)
70 76
   userBrokeragePrice.value = userSpreadInfo.value?.brokerage_price ? parseFloat(userSpreadInfo.value?.brokerage_price) : 0
71
-  console.log(userBrokeragePrice.value)
72 77
   member_brokerage_price.value = userSpreadInfo.value?.member_brokerage_price ? parseFloat(userSpreadInfo.value?.member_brokerage_price) : 0
78
+ 
73 79
   console.log(member_brokerage_price.value)
74 80
   // if (userSpreadInfo.value?.brokerage_price) {
75 81
   if (isshow.value == 1) {
@@ -81,7 +87,6 @@ onShow(async () => {
81 87
       })
82 88
     }
83 89
   } else if (isshow.value == 2) {
84
-
85 90
     if (member_brokerage_price.value < widthdrawalConfig.value.withdrawal_money) {
86 91
       isDisabled.value = true
87 92
       return uni.showToast({
@@ -89,6 +94,14 @@ onShow(async () => {
89 94
         icon: 'none'
90 95
       })
91 96
     }
97
+  }else if (isshow.value == 3) {
98
+    if (userQbPrice.value < widthdrawalConfig.value.withdrawal_money) {
99
+      isDisabled.value = true
100
+      return uni.showToast({
101
+        title: '满' + widthdrawalConfig.value.withdrawal_money + '才可以提现~',
102
+        icon: 'none'
103
+      })
104
+    }
92 105
   }
93 106
 
94 107
 })
@@ -170,6 +183,15 @@ function handleInputAll() {
170 183
         icon: 'none'
171 184
       })
172 185
     }
186
+  }else if(isshow.value == 3){
187
+	  if (userQbPrice.value && userQbPrice.value>= widthdrawalConfig.value.withdrawal_money) {
188
+	    cashWithdrawalAmount.value = userQbPrice.value
189
+	  } else {
190
+	    uni.showToast({
191
+	      title: '可用余额太少,未满足提现要求',
192
+	      icon: 'none'
193
+	    })
194
+	  }
173 195
   }
174 196
 
175 197
 }
@@ -198,8 +220,15 @@ function handleImmediateWithdrawal() {
198 220
     })
199 221
   }
200 222
   
223
+  if(isshow.value ==3  && userQbPrice.value < widthdrawalConfig.value.withdrawal_money){
224
+	  return uni.showToast({
225
+	    title: '满' + widthdrawalConfig.value.withdrawal_money + '才可以提现~',
226
+	    icon: 'none'
227
+	  })
228
+  }
229
+  
201 230
   // 1.用户可提现余额≤最低提现额
202
-  if (userBrokeragePrice.value < widthdrawalConfig.value.withdrawal_money) {
231
+  if (isshow.value ==1 && userBrokeragePrice.value < widthdrawalConfig.value.withdrawal_money) {
203 232
     return uni.showToast({
204 233
       title: '满' + widthdrawalConfig.value.withdrawal_money + '才可以提现~',
205 234
       icon: 'none'
@@ -207,7 +236,7 @@ function handleImmediateWithdrawal() {
207 236
   }
208 237
 
209 238
   // 2 当输入金额≤可提现余额<最低提现额度
210
-  if (Number.parseFloat(cashWithdrawalAmount.value) <= Number.parseFloat(userBrokeragePrice.value) && Number.parseFloat(cashWithdrawalAmount.value) < widthdrawalConfig.value.withdrawal_money) {
239
+  if (isshow.value ==1 &&  Number.parseFloat(cashWithdrawalAmount.value) <= Number.parseFloat(userBrokeragePrice.value) && Number.parseFloat(cashWithdrawalAmount.value) < widthdrawalConfig.value.withdrawal_money) {
211 240
     // 1 判断是否需要实名
212 241
     if (!yanglaojin.value?.is_certification == 1) {
213 242
       return uni.navigateTo({
@@ -220,9 +249,28 @@ function handleImmediateWithdrawal() {
220 249
       icon: 'none'
221 250
     })
222 251
   }
252
+  
253
+  
254
+  // 2 当输入金额≤可提现余额<最低提现额度
255
+  if (isshow.value ==3 &&  Number.parseFloat(cashWithdrawalAmount.value) <= Number.parseFloat(userQbPrice.value) && Number.parseFloat(cashWithdrawalAmount.value) < widthdrawalConfig.value.withdrawal_money) {
256
+    // 1 判断是否需要实名
257
+    if (!yanglaojin.value?.is_certification == 1) {
258
+      return uni.navigateTo({
259
+        url: '/pages/real-name-authentication/index'
260
+      })
261
+    }
262
+  
263
+    return uni.showToast({
264
+      title: '满' + widthdrawalConfig.value.withdrawal_money + '才可以提现~',
265
+      icon: 'none'
266
+    })
267
+  }
268
+  
269
+  
270
+  
223 271
 
224 272
   // 当输入金额>可提现余额且输入金额≥最低提现额度
225
-  if ((Number.parseFloat(cashWithdrawalAmount.value) > Number.parseFloat(userBrokeragePrice.value)) && (Number.parseFloat(cashWithdrawalAmount.value) >= widthdrawalConfig.value.withdrawal_money)) {
273
+  if (isshow.value ==3 &&(Number.parseFloat(cashWithdrawalAmount.value) > Number.parseFloat(userQbPrice.value)) && (Number.parseFloat(cashWithdrawalAmount.value) >= widthdrawalConfig.value.withdrawal_money)) {
226 274
     // 1 判断是否需要实名
227 275
     if (!yanglaojin.value?.is_certification == 1) {
228 276
       return uni.navigateTo({
@@ -235,6 +283,22 @@ function handleImmediateWithdrawal() {
235 283
       icon: 'none'
236 284
     })
237 285
   }
286
+  
287
+  
288
+  // 当输入金额>可提现余额且输入金额≥最低提现额度
289
+  if (isshow.value ==1 &&(Number.parseFloat(cashWithdrawalAmount.value) > Number.parseFloat(userBrokeragePrice.value)) && (Number.parseFloat(cashWithdrawalAmount.value) >= widthdrawalConfig.value.withdrawal_money)) {
290
+    // 1 判断是否需要实名
291
+    if (!yanglaojin.value?.is_certification == 1) {
292
+      return uni.navigateTo({
293
+        url: '/pages/real-name-authentication/index'
294
+      })
295
+    }
296
+  
297
+    return uni.showToast({
298
+      title: '输入金额超过可提现余额',
299
+      icon: 'none'
300
+    })
301
+  }
238 302
  
239 303
   showPhonePop.value=true
240 304
   //发送验证码
@@ -386,7 +450,7 @@ function onSubmitClick(){
386 450
 <template>
387 451
   <!-- 佣金提现 -->
388 452
 
389
-  <div class="p-3 flex flex-col gap-3" v-if="isshow == 1">
453
+  <div class="p-3 flex flex-col gap-3" v-if="isshow == 1 ||isshow == 3">
390 454
     <div class="flex justify-end">
391 455
       <div class=" text-sm" @tap="handleWithdrawalRecord">提现记录</div>
392 456
     </div>
@@ -403,12 +467,9 @@ function onSubmitClick(){
403 467
         <div class="text-xs text-red" @click="handleInputAll">全部提现</div>
404 468
       </div>
405 469
       <div class="flex text-gray items-center gap-3 text-sm">
406
-        <div v-if="userSpreadInfo">
407
-          可用余额¥:{{ userBrokeragePrice }}
470
+        <div >
471
+          可用余额¥:{{isshow==1? userBrokeragePrice:userQbPrice }}
408 472
         </div>
409
-     <!--   <div v-if="userStore.userInfo">
410
-          可用积分:{{ userStore.userInfo.score }}
411
-        </div> -->
412 473
       </div>
413 474
 
414 475
     </div>
@@ -416,22 +477,8 @@ function onSubmitClick(){
416 477
       <div class="flex f-hairline-bottom font-bold text-sm pb-2">
417 478
         提现至
418 479
       </div>
419
-	  
420
-      <!-- <div>
421
-        <div class="flex items-center justify-between py-3">
422
-          <div class="flex items-center gap-2">
423
-            <image :src="wx_logoImage" mode="widthFix" class="w-8 h-8"></image>
424
-            <div>微信</div>
425
-          </div>
426
-          <div>
427
-            <radio :checked="true" v-if="iswxshow == true" />
428
-            <radio :checked="false" v-if="iswxshow == false" @click="Tochecked" />
429
-          </div>
430
-        </div>
431
-      </div> -->
432
-	  
480
+     
433 481
 	  <view class="bank-list-content">
434
-		  
435 482
 		  <view v-if="bankList&& bankList.length!=0" class="bank-item-out" v-for="(item,index) in bankList" :key="'bank-item-'+index">
436 483
 			  <view class="bank-item" @click.stop="onItemClick(index)">
437 484
 			  			  <image class="bank-icon" :src="IMG_CDN_NEW_URL+'icon_bank_card.png'" mode="widthFix"></image>

+ 14 - 8
src/subPages/pages/income/index.vue

@@ -3,7 +3,7 @@
3 3
 
4 4
 
5 5
 		<view class="top-f-content">
6
-			<view class="top-hint">
6
+			<!-- <view class="top-hint">
7 7
 				<text class="hint">当日分红奖次日1时结算,推荐奖实时结算</text>
8 8
 				<view class="c-line"></view>
9 9
 
@@ -13,7 +13,7 @@
13 13
 						<image class="down-icon" :src="IMG_CDN_NEW_URL+'sanjiaoxing.png'" mode="widthFix"></image>
14 14
 					</view>
15 15
 				</picker>
16
-			</view>
16
+			</view> -->
17 17
 			<view class="date-content">
18 18
 				<picker class="date-choose" mode="date" fields='month' @change="onDateChange">
19 19
 					<view class="date-choose">
@@ -31,12 +31,12 @@
31 31
 				v-for="(item,index) in dataInfo.pageInfo.data" :key="'list-item-'+index">
32 32
 				<view class="list-item">
33 33
 					<view class="item-in">
34
-						<text class="item-title">{{currentTypeList[commission_type]?currentTypeList[commission_type]:'推荐奖'}}</text>
34
+						<text class="item-title">{{item.mark?item.mark:'推荐奖'}}</text>
35 35
 						<text class="item-des">{{item.title}}</text>
36
-						<text class="item-date">结算时间:{{item.create_time}}</text>
36
+					<!-- 	<text class="item-date">结算时间:{{item.create_time}}</text> -->
37 37
 					</view>
38 38
 					<view class="item-in">
39
-						<text class="item-des">{{item.status==0?'未结算':'已结算'}}</text>
39
+						<text :class="item.status==0?'item-des-x':'item-des'">{{item.status==0?'未结算':'已结算'}}</text>
40 40
 						<text class="item-num">{{item.money}}</text>
41 41
 					</view>
42 42
 				</view>
@@ -140,9 +140,9 @@ style:
140 140
 			display: flex;
141 141
 			flex-direction: column;
142 142
 			background-color: #fff;
143
-			padding-left: 30rpx;
144
-			padding-right: 30rpx;
145
-			margin-top: 210rpx;
143
+			padding-left: 40rpx;
144
+			padding-right: 40rpx;
145
+			margin-top: 130rpx;
146 146
 
147 147
 
148 148
 			.list-item-out {
@@ -180,6 +180,12 @@ style:
180 180
 						font-size: 28rpx;
181 181
 						margin-bottom: 10rpx;
182 182
 					}
183
+					
184
+					.item-des-x {
185
+						color: #ff0000;
186
+						font-size: 28rpx;
187
+						margin-bottom: 10rpx;
188
+					}
183 189
 
184 190
 					.item-date {
185 191
 						color: #666;

+ 13 - 4
src/subPages/pages/mine-top/brokerage.vue

@@ -21,7 +21,7 @@
21 21
 					<text class="title">{{dataInfo.no_clear_amount?dataInfo.no_clear_amount:'0'}}</text>
22 22
 				</view>
23 23
 				<view class="item-c">
24
-					<text class="title">已提现(元)</text>
24
+					<text class="title">已提现(元)</text>
25 25
 					<text class="title">{{dataInfo.withdraw_amount?dataInfo.withdraw_amount:'0'}}</text>
26 26
 				</view>
27 27
 				<view class="item-c">
@@ -71,7 +71,8 @@
71 71
 	import {
72 72
 		apiGetBrokerageInfo,
73 73
 		getUserInfo,
74
-		apiTransitionVr 
74
+		apiTransitionVr ,
75
+		apiGetVRList
75 76
 	} from '~/apis/user'
76 77
 	import {
77 78
 		formatDate
@@ -226,12 +227,20 @@
226 227
 	}
227 228
 
228 229
 	function getList() {
230
+		uni.showLoading({
231
+			title:'加载中...',
232
+			mask:true
233
+		})
229 234
 		apiGetVRList({
230 235
 			page: state.page,
231 236
 			pm: state.pm
232 237
 		}).then(res => {
233
-			listInfo.value = res
234
-		})
238
+			if (state.page === 1) {
239
+				listInfo.value = res
240
+			} else {
241
+				listInfo.value.push(...res)
242
+			}
243
+		}).finally(()=>{uni.hideLoading()})
235 244
 	}
236 245
 
237 246
 	onShareAppMessage(() => {

+ 49 - 20
src/subPages/pages/mine-top/contribute.vue

@@ -2,16 +2,30 @@
2 2
 	<view class="contribute-container">
3 3
 		
4 4
 		<view class="top-content-x">
5
-			<view class="top-card-content">
6
-				<view class="card-item">
7
-					<text class="item-title">{{dataInfo.total_source}}</text>
8
-					<text class="item-value">我的贡献值</text>
5
+			
6
+			<view class="top-card-out">
7
+				<view class="top-card-content">
8
+					<view class="card-item">
9
+						<text class="item-title">{{dataInfo.total_source}}</text>
10
+						<text class="item-value">我的贡献值</text>
11
+					</view>
12
+					<view class="card-item">
13
+						<text class="item-title">{{dataInfo.no_total_source}}</text>
14
+						<text class="item-value">未生效贡献值</text>
15
+					</view>
9 16
 				</view>
10
-				<view class="card-item">
11
-					<text class="item-title">{{dataInfo.no_total_source}}</text>
12
-					<text class="item-value">未生效贡献值</text>
17
+				<view class="top-card-content">
18
+					<view class="card-item">
19
+						<text class="item-title">{{dataInfo.zhitui}}</text>
20
+						<text class="item-value">直推贡献值</text>
21
+					</view>
22
+					<view class="card-item">
23
+						<text class="item-title">{{dataInfo.team_gongxian_num}}</text>
24
+						<text class="item-value">小部门贡献值</text>
25
+					</view>
13 26
 				</view>
14 27
 			</view>
28
+			
15 29
 		</view>
16 30
 		
17 31
 		<view class="tab-content">
@@ -27,7 +41,7 @@
27 41
 				<view class="list-item">
28 42
 					<view class="top-content">
29 43
 						<text class="top-title">{{item.mark}}</text>
30
-						<text class="top-right">{{currentIndex==0?'+':''}}{{item.number}}</text>
44
+						<text class="top-right">{{item.number}}</text>
31 45
 					</view>
32 46
 					<text class="date">{{formatDate(item.addtime,8,'-')}}</text>
33 47
 				</view>
@@ -80,9 +94,17 @@
80 94
 	}
81 95
 	
82 96
 	function getList(){
83
-		apiGetGongXianList({page:state.page,pm:state.pm}).then(res => {
84
-			listInfo.value= res
97
+		uni.showLoading({
98
+			title:'加载中...',
99
+			mask:true
85 100
 		})
101
+		apiGetGongXianList({page:state.page,pm:state.pm==0?0:2}).then(res => {
102
+			if (state.page === 1) {
103
+				listInfo.value = res
104
+			} else {
105
+				listInfo.value.push(...res)
106
+			}
107
+		}).finally(()=>{uni.hideLoading()})
86 108
 	}
87 109
 	onShareAppMessage(() => {
88 110
 		const shareId = Cache.get('SHARE_ID')
@@ -133,14 +155,14 @@
133 155
 		.empty-content{
134 156
 			display: flex;
135 157
 			flex-direction: column;
136
-			margin-top:450rpx ;
158
+			margin-top:512rpx ;
137 159
 		}
138 160
 		.list-content{
139 161
 			display: flex;
140 162
 			flex-direction: column;
141
-			margin-top:350rpx ;
142
-			padding-left: 20rpx;
143
-			padding-right: 20rpx;
163
+			margin-top:512rpx ;
164
+			padding-left: 40rpx;
165
+			padding-right: 40rpx;
144 166
 			.list-item-x{
145 167
 				display: flex;
146 168
 				flex-direction: column;
@@ -160,7 +182,7 @@
160 182
 							font-size: #666;
161 183
 						}
162 184
 						.top-right{
163
-							color: #FE0032;
185
+							color: #333;
164 186
 							font-size: 30rpx;
165 187
 						}
166 188
 					}
@@ -184,9 +206,9 @@
184 206
 			align-items: center;
185 207
 			position: fixed;
186 208
 			z-index: 222;
187
-			margin-top: 260rpx;
209
+			margin-top: 420rpx;
188 210
 			width: 100%;
189
-			background-color: #fff;
211
+			background-color: #f8f8f8;
190 212
 			top: 0;
191 213
 			left: 0;
192 214
 		}
@@ -230,7 +252,7 @@
230 252
 			flex-direction: column;
231 253
 			background-color:#fe0032;
232 254
 			width: 100%;
233
-			height: 260rpx;
255
+			height: 420rpx;
234 256
 			padding: 20rpx;
235 257
 			box-sizing: border-box;
236 258
 			position: fixed;
@@ -238,13 +260,20 @@
238 260
 			left: 0;
239 261
 			z-index: 222;
240 262
 		}
241
-		.top-card-content{
263
+		
264
+		.top-card-out{
265
+			padding: 30rpx;
266
+			display: flex;
267
+			flex-direction: column;
242 268
 			background-color: #fdddc4;
243 269
 			border-radius: 20rpx;
270
+			height: 100%;
271
+		}
272
+		.top-card-content{
244 273
 			display: flex;
245 274
 			flex-direction: row;
246
-			height: 100%;
247 275
 			align-items: center;
276
+			margin-top: 40rpx;
248 277
 			justify-content: center;
249 278
 			.card-item{
250 279
 				display: flex;

+ 18 - 14
src/subPages/pages/mine-top/department.vue

@@ -15,30 +15,29 @@
15 15
 							<text class="item-title">总业绩</text>
16 16
 							<text class="item-value">{{dataInfo.total_performance}}</text>
17 17
 						</view>
18
-						<view class="info-item">
19
-							<text class="item-title item-yellow">新增业绩</text>
20
-							<text class="item-value item-yellow">{{dataInfo.new_performance}}</text>
21
-						</view>
18
+							<view class="info-btn-content" @click="onShareClick">
19
+								<image class="info-btn-icon" :src="IMG_CDN_NEW_URL+'icon_team_invitate.png'"  mode="widthFix"></image>
20
+								<text class="info-tx">邀请好友</text>
21
+							</view>
22 22
 					</view>
23 23
 					<view class="info-in-content">
24 24
 						<view class="info-item">
25 25
 							<text class="item-title">小部门业绩</text>
26 26
 							<text class="item-value">{{dataInfo.person_nums_pv}}</text>
27 27
 						</view>
28
-						<view class="info-item">
29
-							<text class="item-title"></text>
30
-							<text class="item-value"></text>
31
-						</view>
28
+						
32 29
 						<view class="info-item">
33 30
 							<text class="item-title">大部门业绩</text>
34 31
 							<text class="item-value">{{dataInfo.common_nums_pv}}</text>
35 32
 						</view>
33
+						
34
+						<view class="info-item">
35
+							<text class="item-title item-yellow">本周新增总业绩</text>
36
+							<text class="item-value item-yellow">{{dataInfo.new_performance}}</text>
37
+						</view>
36 38
 					</view>
37 39
 				</view>
38
-				<view class="info-btn-content" @click="onShareClick">
39
-					<image class="info-btn-icon" :src="IMG_CDN_NEW_URL+'icon_team_invitate.png'"  mode="widthFix"></image>
40
-					<text class="info-tx">邀请好友</text>
41
-				</view>
40
+		
42 41
 			</view>
43 42
 			<view class="page-title">部门数据汇总</view>
44 43
 			<view class="tab-content">
@@ -145,7 +144,12 @@
145 144
 			tabList.value[0].value =`(${res.common_nums})` 
146 145
 			tabList.value[1].value =`(${ res.person_nums})` 
147 146
 			dataInfo.value = res
148
-			listInfo.value = res.team_list.data
147
+			
148
+			if (state.page === 1) {
149
+				listInfo.value = res.team_list.data
150
+			} else {
151
+				listInfo.value.push(...res.team_list.data)
152
+			}
149 153
 			uni.hideLoading()
150 154
 		})
151 155
 	}
@@ -363,11 +367,11 @@
363 367
 					flex-direction: row;
364 368
 					align-items: center;
365 369
 					justify-content: space-around;
370
+					padding-left: 40rpx;
366 371
 
367 372
 					.info-item {
368 373
 						display: flex;
369 374
 						flex-direction: column;
370
-						align-items: center;
371 375
 						flex: 1;
372 376
 						margin-top: 20rpx;
373 377
 						justify-content: center;

+ 13 - 5
src/subPages/pages/mine-top/jifen.vue

@@ -30,7 +30,7 @@
30 30
 					<view class="top-content">
31 31
 						<text class="top-title">{{item.mark}}</text>
32 32
 						<text
33
-							class="top-right">{{currentIndex==0?'+':(currentIndex==1?'-':'')}}{{item.reward_socre}}</text>
33
+							class="top-right">{{item.reward_socre}}</text>
34 34
 					</view>
35 35
 					<text class="date">{{formatDate(item.addtime,8,'-')}}</text>
36 36
 				</view>
@@ -126,12 +126,20 @@
126 126
 	}
127 127
 
128 128
 	function getList() {
129
+		uni.showLoading({
130
+			title:'加载中...',
131
+			mask:true
132
+		})
129 133
 		apiGetJFList({
130 134
 			page: state.page,
131 135
 			pm: state.pm
132 136
 		}).then(res => {
133
-			listInfo.value = res
134
-		})
137
+			if (state.page === 1) {
138
+				listInfo.value = res
139
+			} else {
140
+				listInfo.value.push(...res)
141
+			}
142
+		}).finally(()=>{uni.hideLoading()})
135 143
 	}
136 144
 
137 145
 	onShareAppMessage(() => {
@@ -227,7 +235,7 @@
227 235
 						}
228 236
 
229 237
 						.top-right {
230
-							color: #FE0032;
238
+							color: #333;
231 239
 							font-size: 30rpx;
232 240
 						}
233 241
 					}
@@ -255,7 +263,7 @@
255 263
 			z-index: 2;
256 264
 			margin-top: 349rpx;
257 265
 			width: 100%;
258
-			background-color: #fff;
266
+			background-color: #f8f8f8;
259 267
 			top: 0;
260 268
 			left: 0;
261 269
 		}

+ 110 - 73
src/subPages/pages/mine-top/jingdou.vue

@@ -1,6 +1,6 @@
1 1
 <template>
2 2
 	<view class="contribute-container">
3
-		
3
+
4 4
 		<view class="top-content-x">
5 5
 			<view class="top-card-content">
6 6
 				<view class="card-item">
@@ -13,75 +13,102 @@
13 13
 				</view>
14 14
 			</view>
15 15
 		</view>
16
-		
16
+
17 17
 		<view class="tab-content">
18
-			<view v-for="(item,index) in tabList" :key="'lab-item-x-'+index" class="lab-item-small" @click="onTabClick(index,item.merchant_category_id)">
18
+			<view v-for="(item,index) in tabList" :key="'lab-item-x-'+index" class="lab-item-small"
19
+				@click="onTabClick(index,item.merchant_category_id)">
19 20
 				<text :class="currentIndex==index?'lab-title':'lab-default-title'">{{item.name}}</text>
20 21
 				<view :class="currentIndex==index?'lab-line':'lab-default-line'"></view>
21 22
 			</view>
22 23
 		</view>
23
-		
24
+
24 25
 		<view class="list-content" v-if="listInfo && listInfo.length!=0">
25 26
 			<view class="list-item-x" v-for="(item,index) in listInfo" :key="'list-item-'+index">
26 27
 				<view class="list-line" v-if="index != listInfo.length-1"></view>
27 28
 				<view class="list-item">
28 29
 					<view class="top-content">
29 30
 						<text class="top-title">{{item.mark}}</text>
30
-						<text class="top-right">{{currentIndex==0?'+':(currentIndex==1?'-':'')}}{{item.number}}</text>
31
+						<text class="top-right">{{item.number}}</text>
31 32
 					</view>
32 33
 					<text class="date">{{formatDate(item.addtime,8,'-')}}</text>
33 34
 				</view>
34 35
 			</view>
35 36
 		</view>
36
-		
37
+
37 38
 		<view v-else class="empty-content">
38
-			<CXBEmpty ></CXBEmpty>
39
+			<CXBEmpty></CXBEmpty>
39 40
 		</view>
40 41
 	</view>
41 42
 </template>
42 43
 
43 44
 <script setup>
44
-	
45 45
 	import {
46 46
 		apiGetJingDouInfo,
47 47
 		apiGetJingDouList,
48 48
 	} from '~/apis/user'
49
-	import { getProductShare } from "~/apis/common";
50
-	import { useUserStore } from '~/stores/userStore'
49
+	import {
50
+		getProductShare
51
+	} from "~/apis/common";
52
+	import {
53
+		useUserStore
54
+	} from '~/stores/userStore'
51 55
 	import CXBEmpty from "~/components/CXBEmpty/CXBEmpty.vue";
52
-	import{IMG_CDN_URL} from '~/config/app.ts'
56
+	import {
57
+		IMG_CDN_URL
58
+	} from '~/config/app.ts'
53 59
 	const currentIndex = ref(0)
54
-	const tabList = ref([{name:'入账京豆'},{name:'消耗京豆'},{name:'未生效京豆'}])
55
-	import {formatDate} from '~/utils/util'
56
-    const userStore = useUserStore()
57
-    const dataInfo=ref({})
58
-	const listInfo=ref([])
60
+	const tabList = ref([{
61
+		name: '入账京豆'
62
+	}, {
63
+		name: '消耗京豆'
64
+	}, {
65
+		name: '未生效京豆'
66
+	}])
67
+	import {
68
+		formatDate
69
+	} from '~/utils/util'
70
+	const userStore = useUserStore()
71
+	const dataInfo = ref({})
72
+	const listInfo = ref([])
59 73
 	const state = reactive({
60
-		pm :0,
61
-		page :1
74
+		pm: 0,
75
+		page: 1
62 76
 	})
63
-	
77
+
64 78
 	onLoad((option) => {
65 79
 		if (option && option.shareId) {
66
-		  userStore.setShareId(option.shareId)
80
+			userStore.setShareId(option.shareId)
67 81
 		}
68 82
 		getProductShare().then(res => {
69
-		  if (res) userStore.setShareId(res.share_id)
83
+			if (res) userStore.setShareId(res.share_id)
70 84
 		})
71 85
 		getInfo()
72 86
 		getList()
73 87
 	})
74
-	
75
-	function getInfo(){
76
-			apiGetJingDouInfo().then(res=>{
77
-				dataInfo.value= res
78
-			})
88
+
89
+	function getInfo() {
90
+		apiGetJingDouInfo().then(res => {
91
+			dataInfo.value = res
92
+		})
79 93
 	}
80
-		
81
-	function getList(){
82
-			apiGetJingDouList({page:state.page,pm:state.pm}).then(res => {
83
-				listInfo.value= res
84
-			})
94
+
95
+	function getList() {
96
+		uni.showLoading({
97
+			title: '加载中...',
98
+			mask: true
99
+		})
100
+		apiGetJingDouList({
101
+			page: state.page,
102
+			pm: state.pm
103
+		}).then(res => {
104
+			if (state.page === 1) {
105
+				listInfo.value = res
106
+			} else {
107
+				listInfo.value.push(...res)
108
+			}
109
+		}).finally(() => {
110
+			uni.hideLoading()
111
+		})
85 112
 	}
86 113
 
87 114
 	onShareAppMessage(() => {
@@ -109,19 +136,17 @@
109 136
 	})
110 137
 
111 138
 	onPullDownRefresh(() => {
112
-	   state.page=1
113
-	   getList()
114
-	   uni.stopPullDownRefresh()
139
+		state.page = 1
140
+		getList()
141
+		uni.stopPullDownRefresh()
115 142
 	})
116 143
 
117 144
 	function onTabClick(position, id) {
118 145
 		currentIndex.value = position
119
-		state.pm =position
120
-		state.page=1
146
+		state.pm = position
147
+		state.page = 1
121 148
 		getList()
122 149
 	}
123
-
124
-	
125 150
 </script>
126 151
 
127 152
 <style lang="scss" scoped>
@@ -131,55 +156,64 @@
131 156
 		min-height: 100VH;
132 157
 		background-color: #fff;
133 158
 		box-sizing: border-box;
134
-		.empty-content{
159
+
160
+		.empty-content {
135 161
 			display: flex;
136 162
 			flex-direction: column;
137
-			margin-top:450rpx ;
163
+			margin-top: 450rpx;
138 164
 		}
139
-		.list-content{
165
+
166
+		.list-content {
140 167
 			display: flex;
141 168
 			flex-direction: column;
142
-			margin-top:350rpx ;
143
-			padding-left: 20rpx;
144
-			padding-right: 20rpx;
145
-			.list-item-x{
169
+			margin-top: 350rpx;
170
+			padding-left: 40rpx;
171
+			padding-right: 40rpx;
172
+
173
+			.list-item-x {
146 174
 				display: flex;
147 175
 				flex-direction: column;
148
-				.list-item{
176
+
177
+				.list-item {
149 178
 					display: flex;
150 179
 					flex-direction: column;
151 180
 					padding-top: 28rpx;
152 181
 					padding-bottom: 28rpx;
153
-					.top-content{
182
+
183
+					.top-content {
154 184
 						display: flex;
155 185
 						flex-direction: row;
156 186
 						align-items: center;
157 187
 						margin-bottom: 20rpx;
158
-						.top-title{
188
+
189
+						.top-title {
159 190
 							flex: 1;
160 191
 							font-size: 28rpx;
161 192
 							font-size: #666;
162 193
 						}
163
-						.top-right{
164
-							color: #FE0032;
194
+
195
+						.top-right {
196
+							color: #333;
165 197
 							font-size: 30rpx;
166 198
 						}
167 199
 					}
168
-					.date{
200
+
201
+					.date {
169 202
 						font-size: 26rpx;
170 203
 						font-size: #666;
171 204
 					}
172 205
 				}
173
-				.list-line{
206
+
207
+				.list-line {
174 208
 					width: 100%;
175 209
 					height: 2rpx;
176 210
 					background-color: #f8f8f8;
177 211
 				}
178 212
 			}
179 213
 		}
180
-		
181
-		
182
-		.tab-content{
214
+
215
+
216
+		.tab-content {
183 217
 			display: flex;
184 218
 			flex-direction: row;
185 219
 			align-items: center;
@@ -187,11 +221,11 @@
187 221
 			z-index: 222;
188 222
 			margin-top: 260rpx;
189 223
 			width: 100%;
190
-			background-color: #fff;
224
+			background-color: #f8f8f8;
191 225
 			top: 0;
192 226
 			left: 0;
193 227
 		}
194
-		
228
+
195 229
 		.lab-item-small {
196 230
 			display: flex;
197 231
 			flex-direction: column;
@@ -199,47 +233,48 @@
199 233
 			flex: 1;
200 234
 			height: 90rpx;
201 235
 			justify-content: center;
202
-		
236
+
203 237
 			.lab-default-title {
204 238
 				font-size: 28rpx;
205 239
 				margin-bottom: 10rpx;
206 240
 			}
207
-		
241
+
208 242
 			.lab-title {
209 243
 				font-size: 32rpx;
210 244
 				margin-bottom: 20rpx;
211 245
 				color: #FE0032;
212 246
 			}
213
-		
247
+
214 248
 			.lab-line {
215 249
 				width: 50rpx;
216 250
 				height: 6rpx;
217 251
 				background-color: #FE0032;
218 252
 				border-radius: 4rpx;
219 253
 			}
220
-		
254
+
221 255
 			.lab-default-line {
222 256
 				width: 50rpx;
223 257
 				height: 6rpx;
224 258
 				border-radius: 4rpx;
225 259
 			}
226
-		
260
+
227 261
 		}
228
-        
229
-		.top-content-x{
262
+
263
+		.top-content-x {
230 264
 			display: flex;
231 265
 			flex-direction: column;
232
-			background-color:#fe0032;
266
+			background-color: #fe0032;
233 267
 			width: 100%;
234 268
 			height: 260rpx;
235 269
 			padding: 20rpx;
236 270
 			box-sizing: border-box;
237 271
 			position: fixed;
238
-			top:0;
272
+			top: 0;
239 273
 			left: 0;
240 274
 			z-index: 222;
241 275
 		}
242
-		.top-card-content{
276
+
277
+		.top-card-content {
243 278
 			background-color: #fdddc4;
244 279
 			border-radius: 20rpx;
245 280
 			display: flex;
@@ -247,26 +282,28 @@
247 282
 			height: 100%;
248 283
 			align-items: center;
249 284
 			justify-content: center;
250
-			.card-item{
285
+
286
+			.card-item {
251 287
 				display: flex;
252 288
 				flex-direction: column;
253 289
 				align-items: center;
254 290
 				justify-content: center;
255 291
 				flex: 1;
256
-				
257
-				.item-title{
292
+
293
+				.item-title {
258 294
 					color: #964929;
259 295
 					font-weight: bolder;
260 296
 					font-size: 36rpx;
261 297
 					margin-bottom: 20rpx;
262 298
 				}
263
-				.item-value{
299
+
300
+				.item-value {
264 301
 					color: #964929;
265 302
 					font-size: 28rpx;
266 303
 				}
267 304
 			}
268 305
 		}
269
-		
306
+
270 307
 	}
271 308
 </style>
272 309
 
@@ -276,5 +313,5 @@ style:
276 313
   enablePullDownRefresh: true
277 314
   navigationBarBackgroundColor: '#fe0032'
278 315
   navigationBarTextStyle: white
279
-  
316
+
280 317
 </route>

+ 167 - 130
src/subPages/pages/mine-top/qianbao.vue

@@ -1,6 +1,6 @@
1 1
 <template>
2 2
 	<view class="contribute-container">
3
-		
3
+
4 4
 		<view class="top-content-x">
5 5
 			<view class="top-card-content">
6 6
 				<view class="card-item">
@@ -13,144 +13,170 @@
13 13
 				</view>
14 14
 			</view>
15 15
 		</view>
16
-		
16
+
17 17
 		<view class="tab-content">
18
-			<view v-for="(item,index) in tabList" :key="'lab-item-x-'+index" class="lab-item-small" @click="onTabClick(index,item.merchant_category_id)">
18
+			<view v-for="(item,index) in tabList" :key="'lab-item-x-'+index" class="lab-item-small"
19
+				@click="onTabClick(index,item.merchant_category_id)">
19 20
 				<text :class="currentIndex==index?'lab-title':'lab-default-title'">{{item.name}}</text>
20 21
 				<view :class="currentIndex==index?'lab-line':'lab-default-line'"></view>
21 22
 			</view>
22 23
 		</view>
23
-		
24
+
24 25
 		<view class="list-content" v-if="listInfo && listInfo.length!=0">
25 26
 			<view class="list-item-x" v-for="(item,index) in listInfo" :key="'list-item-'+index">
26 27
 				<view class="list-line" v-if="index != listInfo.length-1"></view>
27 28
 				<view class="list-item">
28 29
 					<view class="top-content">
29 30
 						<text class="top-title">{{item.mark}}</text>
30
-						<text class="top-right">{{currentIndex==0?'+':'-'}}{{item.number}}</text>
31
+						<text class="top-right">{{item.number}}</text>
31 32
 					</view>
32 33
 					<text class="date">{{formatDate(item.addtime,8,'-')}}</text>
33 34
 				</view>
34 35
 			</view>
35 36
 		</view>
36
-		
37
+
37 38
 		<view v-else class="empty-content">
38
-			<CXBEmpty ></CXBEmpty>
39
+			<CXBEmpty></CXBEmpty>
39 40
 		</view>
40 41
 	</view>
41 42
 </template>
42 43
 
43 44
 <script setup>
44
-	
45 45
 	import {
46 46
 		apiGetHBInfo,
47 47
 		apiGetHBList,
48 48
 		apiTransitionVr
49 49
 	} from '~/apis/user'
50
-	import {formatDate} from '~/utils/util'
51
-	import { getProductShare } from "~/apis/common";
52
-	import { useUserStore } from '~/stores/userStore'
50
+	import {
51
+		formatDate
52
+	} from '~/utils/util'
53
+	import {
54
+		getProductShare
55
+	} from "~/apis/common";
56
+	import {
57
+		useUserStore
58
+	} from '~/stores/userStore'
53 59
 	import CXBEmpty from "~/components/CXBEmpty/CXBEmpty.vue";
54
-	import{IMG_CDN_URL} from '~/config/app.ts'
60
+	import {
61
+		IMG_CDN_URL
62
+	} from '~/config/app.ts'
55 63
 	const currentIndex = ref(0)
56
-	const tabList = ref([{name:'入账红包'},{name:'出账红包'}])
57
-    const userStore = useUserStore()
58
-    const dataInfo=ref({})
59
-	const listInfo=ref([])
60
-	const dataNameInfo =ref()
64
+	const tabList = ref([{
65
+		name: '入账红包'
66
+	}, {
67
+		name: '出账红包'
68
+	}])
69
+	const userStore = useUserStore()
70
+	const dataInfo = ref({})
71
+	const listInfo = ref([])
72
+	const dataNameInfo = ref()
61 73
 	const state = reactive({
62
-		pm :0,
63
-		page :1
74
+		pm: 0,
75
+		page: 1
64 76
 	})
65
-	
77
+
66 78
 	onLoad((option) => {
67 79
 		if (option && option.shareId) {
68
-		  userStore.setShareId(option.shareId)
80
+			userStore.setShareId(option.shareId)
69 81
 		}
70 82
 		getProductShare().then(res => {
71
-		  if (res) userStore.setShareId(res.share_id)
83
+			if (res) userStore.setShareId(res.share_id)
72 84
 		})
73 85
 		getInfo()
74 86
 		getList()
75 87
 	})
76
-	
77
-	function onItemClick(index){
78
-		if(index==0){
88
+
89
+	function onItemClick(index) {
90
+		if (index == 0) {
79 91
 			handleClickTomo()
80
-		}else if(index ==1){
92
+		} else if (index == 1) {
81 93
 			uni.showModal({
82
-				editable:true,
83
-				title:'请输入佣金转VR数量',
84
-						placeholderText:'请输入佣金转VR数量',
85
-						complete: (e) => {
86
-							if(e.confirm){//去转换
87
-								transitionVr(e.content)
88
-							}
89
-						}
94
+				editable: true,
95
+				title: '请输入佣金转VR数量',
96
+				placeholderText: '请输入佣金转VR数量',
97
+				complete: (e) => {
98
+					if (e.confirm) { //去转换
99
+						transitionVr(e.content)
100
+					}
101
+				}
90 102
 			})
91 103
 		}
92
-		
104
+
93 105
 	}
94
-	
95
-	function transitionVr(num){
96
-		if(!num || num==0){
106
+
107
+	function transitionVr(num) {
108
+		if (!num || num == 0) {
97 109
 			uni.showToast({
98
-				title:''
110
+				title: ''
99 111
 			})
100 112
 			return
101 113
 		}
102
-		apiTransitionVr(num).then(res=>{
103
-			if(res==200){
114
+		apiTransitionVr(num).then(res => {
115
+			if (res == 200) {
104 116
 				getInfo()
105 117
 			}
106
-		}).catch(res=>{
118
+		}).catch(res => {
107 119
 			uni.showToast({
108
-				title:res,
109
-				icon:'none'
120
+				title: res,
121
+				icon: 'none'
110 122
 			})
111 123
 		})
112 124
 	}
113
-	
125
+
114 126
 	function handleClickTomo() {
115
-	  if (userStore.userInfo.is_ertification == 1) {
116
-	    uni.navigateTo({
117
-	      url: '/subPages/pages/immediate-withdrawal/index?type=1'
118
-	    })
119
-	  } else {
120
-	    setTimeout(() => {
121
-	      uni.showModal({
122
-	        title: '温馨提示',
123
-	        content: '实名认证后才可提现',
124
-	        cancelText: "取消", // 取消按钮的文字
125
-	        confirmText: "去认证", // 确认按钮的文字
126
-	        showCancel: true, // 是否显示取消按钮,默认为 true
127
-	        confirmColor: '#f55850',
128
-	        success: (res) => {
129
-	          if (res.confirm) {
130
-	            console.log('comfirm') //点击确定之后执行的代码
131
-	            setTimeout(() => {
132
-	              uni.navigateTo({
133
-	                url: '/pages/real-name-authentication/index'
134
-	              })
135
-	            }, 300);
136
-	          } else {
137
-	            console.log('cancel') //点击取消之后执行的代码
138
-	          }
139
-	        }
140
-	      })
141
-	    }, 300);
142
-	  }
143
-	}
144
-	
145
-	function getInfo(){
146
-			apiGetHBInfo().then(res=>{
147
-				dataInfo.value= res
127
+		if (userStore.userInfo.is_ertification == 1) {
128
+			uni.navigateTo({
129
+			url: '/subPages/pages/immediate-withdrawal/index?type=3'
148 130
 			})
131
+		} else {
132
+			setTimeout(() => {
133
+				uni.showModal({
134
+					title: '温馨提示',
135
+					content: '实名认证后才可提现',
136
+					cancelText: "取消", // 取消按钮的文字
137
+					confirmText: "去认证", // 确认按钮的文字
138
+					showCancel: true, // 是否显示取消按钮,默认为 true
139
+					confirmColor: '#f55850',
140
+					success: (res) => {
141
+						if (res.confirm) {
142
+							console.log('comfirm') //点击确定之后执行的代码
143
+							setTimeout(() => {
144
+								uni.navigateTo({
145
+									url: '/pages/real-name-authentication/index'
146
+								})
147
+							}, 300);
148
+						} else {
149
+							console.log('cancel') //点击取消之后执行的代码
150
+						}
151
+					}
152
+				})
153
+			}, 300);
154
+		}
149 155
 	}
150
-	function getList(){
151
-			apiGetHBList({page:state.page,pm:state.pm}).then(res => {
152
-				listInfo.value= res
153
-			})
156
+
157
+	function getInfo() {
158
+		apiGetHBInfo().then(res => {
159
+			dataInfo.value = res
160
+		})
161
+	}
162
+
163
+	function getList() {
164
+		uni.showLoading({
165
+			title: '加载中...',
166
+			mask: true
167
+		})
168
+		apiGetHBList({
169
+			page: state.page,
170
+			pm: state.pm
171
+		}).then(res => {
172
+			if (state.page === 1) {
173
+				listInfo.value = res
174
+			} else {
175
+				listInfo.value.push(...res)
176
+			}
177
+		}).finally(() => {
178
+			uni.hideLoading()
179
+		})
154 180
 	}
155 181
 
156 182
 	onShareAppMessage(() => {
@@ -178,19 +204,17 @@
178 204
 	})
179 205
 
180 206
 	onPullDownRefresh(() => {
181
-	   state.page=1
182
-	   getList()
183
-	   uni.stopPullDownRefresh()
207
+		state.page = 1
208
+		getList()
209
+		uni.stopPullDownRefresh()
184 210
 	})
185 211
 
186 212
 	function onTabClick(position, id) {
187 213
 		currentIndex.value = position
188
-		state.pm =position
189
-		state.page=1
214
+		state.pm = position
215
+		state.page = 1
190 216
 		getList()
191 217
 	}
192
-
193
-	
194 218
 </script>
195 219
 
196 220
 <style lang="scss" scoped>
@@ -200,55 +224,64 @@
200 224
 		min-height: 100VH;
201 225
 		background-color: #fff;
202 226
 		box-sizing: border-box;
203
-		.empty-content{
227
+
228
+		.empty-content {
204 229
 			display: flex;
205 230
 			flex-direction: column;
206
-			margin-top:450rpx ;
231
+			margin-top: 450rpx;
207 232
 		}
208
-		.list-content{
233
+
234
+		.list-content {
209 235
 			display: flex;
210 236
 			flex-direction: column;
211
-			margin-top:350rpx ;
212
-			padding-left: 20rpx;
213
-			padding-right: 20rpx;
214
-			.list-item-x{
237
+			margin-top: 350rpx;
238
+			padding-left: 40rpx;
239
+			padding-right: 40rpx;
240
+
241
+			.list-item-x {
215 242
 				display: flex;
216 243
 				flex-direction: column;
217
-				.list-item{
244
+
245
+				.list-item {
218 246
 					display: flex;
219 247
 					flex-direction: column;
220 248
 					padding-top: 28rpx;
221 249
 					padding-bottom: 28rpx;
222
-					.top-content{
250
+
251
+					.top-content {
223 252
 						display: flex;
224 253
 						flex-direction: row;
225 254
 						align-items: center;
226 255
 						margin-bottom: 20rpx;
227
-						.top-title{
256
+
257
+						.top-title {
228 258
 							flex: 1;
229 259
 							font-size: 28rpx;
230 260
 							font-size: #666;
231 261
 						}
232
-						.top-right{
233
-							color: #FE0032;
262
+
263
+						.top-right {
264
+							color: #333;
234 265
 							font-size: 30rpx;
235 266
 						}
236 267
 					}
237
-					.date{
268
+
269
+					.date {
238 270
 						font-size: 26rpx;
239 271
 						font-size: #666;
240 272
 					}
241 273
 				}
242
-				.list-line{
274
+
275
+				.list-line {
243 276
 					width: 100%;
244 277
 					height: 2rpx;
245 278
 					background-color: #f8f8f8;
246 279
 				}
247 280
 			}
248 281
 		}
249
-		
250
-		
251
-		.tab-content{
282
+
283
+
284
+		.tab-content {
252 285
 			display: flex;
253 286
 			flex-direction: row;
254 287
 			align-items: center;
@@ -256,11 +289,11 @@
256 289
 			z-index: 222;
257 290
 			margin-top: 260rpx;
258 291
 			width: 100%;
259
-			background-color: #fff;
292
+			background-color: #f8f8f8;
260 293
 			top: 0;
261 294
 			left: 0;
262 295
 		}
263
-		
296
+
264 297
 		.lab-item-small {
265 298
 			display: flex;
266 299
 			flex-direction: column;
@@ -268,47 +301,48 @@
268 301
 			flex: 1;
269 302
 			height: 90rpx;
270 303
 			justify-content: center;
271
-		
304
+
272 305
 			.lab-default-title {
273 306
 				font-size: 28rpx;
274 307
 				margin-bottom: 10rpx;
275 308
 			}
276
-		
309
+
277 310
 			.lab-title {
278 311
 				font-size: 32rpx;
279 312
 				margin-bottom: 20rpx;
280 313
 				color: #FE0032;
281 314
 			}
282
-		
315
+
283 316
 			.lab-line {
284 317
 				width: 50rpx;
285 318
 				height: 6rpx;
286 319
 				background-color: #FE0032;
287 320
 				border-radius: 4rpx;
288 321
 			}
289
-		
322
+
290 323
 			.lab-default-line {
291 324
 				width: 50rpx;
292 325
 				height: 6rpx;
293 326
 				border-radius: 4rpx;
294 327
 			}
295
-		
328
+
296 329
 		}
297
-        
298
-		.top-content-x{
330
+
331
+		.top-content-x {
299 332
 			display: flex;
300 333
 			flex-direction: column;
301
-			background-color:#fe0032;
334
+			background-color: #fe0032;
302 335
 			width: 100%;
303 336
 			height: 260rpx;
304 337
 			padding: 20rpx;
305 338
 			box-sizing: border-box;
306 339
 			position: fixed;
307
-			top:0;
340
+			top: 0;
308 341
 			left: 0;
309 342
 			z-index: 222;
310 343
 		}
311
-		.top-card-content{
344
+
345
+		.top-card-content {
312 346
 			background-color: #fdddc4;
313 347
 			border-radius: 20rpx;
314 348
 			display: flex;
@@ -316,19 +350,20 @@
316 350
 			height: 100%;
317 351
 			align-items: center;
318 352
 			justify-content: center;
319
-			
320
-			.card-item-x{
353
+
354
+			.card-item-x {
321 355
 				display: flex;
322 356
 				flex-direction: row;
323 357
 				align-items: center;
324
-				.red-btn{
358
+
359
+				.red-btn {
325 360
 					padding: 10rpx 40rpx;
326 361
 					border-radius: 40rpx;
327 362
 					background-color: #FE0032;
328 363
 					color: #fff;
329 364
 				}
330
-				
331
-				.yellow-btn{
365
+
366
+				.yellow-btn {
332 367
 					padding: 10rpx 40rpx;
333 368
 					border-radius: 40rpx;
334 369
 					background-color: #f4d227;
@@ -336,27 +371,29 @@
336 371
 					margin-left: 40rpx;
337 372
 					margin-right: 60rpx;
338 373
 				}
339
-				
374
+
340 375
 			}
341
-			.card-item{
376
+
377
+			.card-item {
342 378
 				display: flex;
343 379
 				flex-direction: column;
344 380
 				flex: 1;
345 381
 				margin-left: 80rpx;
346
-				
347
-				.item-title{
382
+
383
+				.item-title {
348 384
 					color: #964929;
349 385
 					font-weight: bolder;
350 386
 					font-size: 36rpx;
351 387
 					margin-bottom: 20rpx;
352 388
 				}
353
-				.item-value{
389
+
390
+				.item-value {
354 391
 					color: #964929;
355 392
 					font-size: 28rpx;
356 393
 				}
357 394
 			}
358 395
 		}
359
-		
396
+
360 397
 	}
361 398
 </style>
362 399
 
@@ -366,5 +403,5 @@ style:
366 403
   enablePullDownRefresh: true
367 404
   navigationBarBackgroundColor: '#fe0032'
368 405
   navigationBarTextStyle: white
369
-  
406
+
370 407
 </route>

+ 17 - 7
src/subPages/pages/mine-top/repurchase.vue

@@ -27,7 +27,7 @@
27 27
 				<view class="list-item">
28 28
 					<view class="top-content">
29 29
 						<text class="top-title">{{item.mark}}</text>
30
-						<text class="top-right">{{currentIndex==0?'+':(currentIndex==1?'-':'')}}{{item.number}}</text>
30
+						<text class="top-right">{{item.number}}</text>
31 31
 					</view>
32 32
 					<text class="date">{{formatDate(item.addtime,8,'-')}}</text>
33 33
 				</view>
@@ -87,9 +87,19 @@
87 87
 	}
88 88
 		
89 89
 	function getList(){
90
+		uni.showLoading({
91
+			title: '加载中...',
92
+			mask: true
93
+		})
90 94
 			apiGetFGJList({page:state.page,pm:state.pm}).then(res => {
91
-				listInfo.value= res
92
-			})
95
+				if (state.page === 1) {
96
+					listInfo.value = res
97
+				} else {
98
+					listInfo.value.push(...res)
99
+				}
100
+			}).finally(() => {
101
+			uni.hideLoading()
102
+		})
93 103
 	}
94 104
 
95 105
 	onShareAppMessage(() => {
@@ -149,8 +159,8 @@
149 159
 			display: flex;
150 160
 			flex-direction: column;
151 161
 			margin-top:350rpx ;
152
-			padding-left: 20rpx;
153
-			padding-right: 20rpx;
162
+			padding-left: 40rpx;
163
+			padding-right: 40rpx;
154 164
 			.list-item-x{
155 165
 				display: flex;
156 166
 				flex-direction: column;
@@ -170,7 +180,7 @@
170 180
 							font-size: #666;
171 181
 						}
172 182
 						.top-right{
173
-							color: #FE0032;
183
+							color: #333;
174 184
 							font-size: 30rpx;
175 185
 						}
176 186
 					}
@@ -196,7 +206,7 @@
196 206
 			z-index: 222;
197 207
 			margin-top: 260rpx;
198 208
 			width: 100%;
199
-			background-color: #fff;
209
+			background-color: #f8f8f8;
200 210
 			top: 0;
201 211
 			left: 0;
202 212
 		}

+ 17 - 7
src/subPages/pages/mine-top/vr.vue

@@ -26,7 +26,7 @@
26 26
 				<view class="list-item">
27 27
 					<view class="top-content">
28 28
 						<text class="top-title">{{item.mark}}</text>
29
-						<text class="top-right">{{currentIndex==0?'+':'-'}}{{item.number}}</text>
29
+						<text class="top-right">{{item.number}}</text>
30 30
 					</view>
31 31
 					<text class="date">{{formatDate(item.addtime,8,'-')}}</text>
32 32
 				</view>
@@ -103,9 +103,19 @@
103 103
 	}
104 104
 		
105 105
 	function getList(){
106
+		uni.showLoading({
107
+			title: '加载中...',
108
+			mask: true
109
+		})
106 110
 			apiGetVRList({page:state.page,pm:state.pm}).then(res => {
107
-				listInfo.value= res
108
-			})
111
+				if (state.page === 1) {
112
+					listInfo.value = res
113
+				} else {
114
+					listInfo.value.push(...res)
115
+				}
116
+			}).finally(() => {
117
+			uni.hideLoading()
118
+		})
109 119
 	}
110 120
 
111 121
 	onShareAppMessage(() => {
@@ -166,8 +176,8 @@
166 176
 			display: flex;
167 177
 			flex-direction: column;
168 178
 			margin-top:350rpx ;
169
-			padding-left: 20rpx;
170
-			padding-right: 20rpx;
179
+			padding-left: 40rpx;
180
+			padding-right: 40rpx;
171 181
 			.list-item-x{
172 182
 				display: flex;
173 183
 				flex-direction: column;
@@ -187,7 +197,7 @@
187 197
 							font-size: #666;
188 198
 						}
189 199
 						.top-right{
190
-							color: #FE0032;
200
+							color: #333;
191 201
 							font-size: 30rpx;
192 202
 						}
193 203
 					}
@@ -213,7 +223,7 @@
213 223
 			z-index: 222;
214 224
 			margin-top: 260rpx;
215 225
 			width: 100%;
216
-			background-color: #fff;
226
+			background-color: #f8f8f8;
217 227
 			top: 0;
218 228
 			left: 0;
219 229
 		}

+ 619 - 0
src/subPages/pages/movies/chooseSeat - 副本.vue

@@ -0,0 +1,619 @@
1
+<template>
2
+	<view class="w-100">
3
+		<view class="bg-f1 h-100vh">
4
+			<view class="pt-f left-0 w-100 p-0-32 bg-white z1000" :style="'height: 132rpx;top:0'">
5
+				<view>
6
+					<view class="fz-34 fw-b pt-20">
7
+						{{initInfo.film_name}}
8
+					</view>
9
+					<view class="mt-10 fz-28 color-666">
10
+						{{initInfo.show_des}}
11
+					</view>
12
+				</view>
13
+			</view>
14
+			<movable-area :style="'height:'+(seatRow*40+350)+'rpx;width: 100vw;top:'+(rpxNum*132)+'px'" class="pt-f left-0">
15
+				<movable-view :style="'width: 100vw;height:'+(seatRow*40+350)+'rpx;'" :inertia="true" :scale="true" :scale-min="0.95"
16
+				 :scale-max="2" direction="all" @change="onMove" @scale="onScale">
17
+					<view class="Stage dp-f jc-c ai-c fz-22 color-333">
18
+						{{initInfo.hall_name}}
19
+					</view>
20
+					<view style="width: 100rpx;height: 30rpx;" class="m-0-a mt-48 dp-f jc-c ai-c fz-20 color-999 b-1 br-5">银幕中央</view>
21
+					
22
+					<view class="pt-f pa-v-2 b-d-1" :style="'height:'+seatRow*(20+seatSize*pxNum)+'rpx;top:165rpx;width:0'"></view>
23
+					
24
+					<view v-for="(item,index) in seatArray" :key="index" class="dp-f jc-c mt-20" :style="'width:'+boxWidth+'px;height:'+seatSize+'px'">
25
+						<view v-for="(seat,col) in item" :key="col" class="dp-ib" :style="'width:'+seatSize+'px;height:'+seatSize+'px'"
26
+						 @click="handleChooseSeat(index,col)">
27
+							<image v-if="seat.status===1" class="w-100 h-100" src="../../static/unselected.png" mode="aspectFit"></image>
28
+							<image v-else-if="seat.status===2" class="w-100 h-100" src="../../static/selected.png" mode="aspectFit"></image>
29
+							<image v-else-if="seat.status===0" class="w-100 h-100" src="../../static/bought.png" mode="aspectFit"></image>
30
+						</view>
31
+					</view>
32
+					
33
+					<view class="pt-f bg-line br-15 over-h" :style="'left: '+(10-moveX/scale)+'px;top:109rpx;width:30rpx;'">
34
+						<view class="w-100 dp-f ai-c jc-c fz-22 color-fff" :style="'height:'+seatSize+'px;margin-top:20rpx;'" v-for="(m,mindex) in mArr"
35
+						 :key="mindex">{{m}}</view>
36
+						<view :style="'height: 20rpx;'"></view>
37
+					</view>
38
+
39
+				</movable-view>
40
+			</movable-area>
41
+			<view class="pt-f bottom-bar left-0 dp-f fd-cr z1000">
42
+				<view class="bg-white p-all-32">
43
+					<!-- <view class="dp-f ai-c jc-c fz-28 color-333 mb-20" v-if="SelectNum===0">
44
+						推荐选座
45
+						<view style="width: 106rpx;height: 60rpx;" class="b-1 br-5 dp-f ai-c jc-c fz-28 ml-20" v-for="(n,numindex) in 4"
46
+						 :key="n" @click="smartChoose(numindex+1)">
47
+							{{numindex+1}}人
48
+						</view>
49
+					</view> -->
50
+					<view class="dp-f ai-c fw-w fz-28 color-333 mb-20" v-if="SelectNum>0">
51
+						<text>已选</text>
52
+						<view class="p-all-10 b-1 br-5 dp-f ai-c jc-c fz-28 ml-20" v-for="(optItem,optindex) in optArr" :key="optindex">
53
+							{{optItem.seatNo}}
54
+						</view>
55
+					</view>
56
+					<view style="width: 686rpx;height: 90rpx;" class="dp-f jc-c ai-c br-10 fz-34 color-fff" :class="SelectNum>0?'bg-red-1':'bg-unbtn'"
57
+					 @click="buySeat">
58
+						{{SelectNum>0?('¥ '+totalPrice+' 确认座位'):'请选座位'}}
59
+					</view>
60
+				</view>
61
+				<view class="dp-f jc-c ai-c mb-20 fz-28" v-if="showTis && seatSize!=0">
62
+					<view class="dp-f jc-c ai-c m-0-10">
63
+						<image :style="'width:'+seatSize+'px;height:'+seatSize+'px'" src="/static/unselected.png" mode="aspectFit"></image><span
64
+						 class="ml-10">可选</span>
65
+					</view>
66
+					<view class="dp-f jc-c ai-c m-0-10">
67
+						<image :style="'width:'+seatSize+'px;height:'+seatSize+'px'" src="/static/bought.png" mode="aspectFit"></image><span
68
+						 class="ml-10">不可选</span>
69
+					</view>
70
+					<view class="dp-f jc-c ai-c m-0-10">
71
+						<image :style="'width:'+seatSize+'px;height:'+seatSize+'px'" src="/static/selected.png" mode="aspectFit"></image><span
72
+						 class="ml-10">选中</span>
73
+					</view>
74
+				</view>
75
+			</view>
76
+		</view>
77
+	</view>
78
+</template>
79
+<script>
80
+	
81
+	import {
82
+		seatData
83
+	} from '@/utils/seat-data.js'
84
+	
85
+	import {
86
+		apiGetSchedSeatList,
87
+		apiSubmitOrder
88
+	} from '~/apis/movies'
89
+	export default {
90
+		data() {
91
+			return {
92
+				scaleMin:1,//h5端为解决1无法缩小问题,设为0.95
93
+				boxWidth: 400, //屏幕宽度px
94
+				space: ' ', //空格
95
+				seatArray: [], //影院座位的二维数组,-1为非座位,0为未购座位,1为已选座位(绿色),2为已购座位(红色),一维行,二维列
96
+				seatRow: 0, //影院座位行数
97
+				seatCol: 0, //影院座位列数
98
+				seatSize: 0, //座位尺寸
99
+				SelectNum: 0, //选择座位数
100
+				moveX: 0, //水平移动偏移量
101
+				scale: 1, //放大倍数
102
+				minRow: 0, //从第几行开始排座位
103
+				minCol: 0, //从第几列开始排座位
104
+				showTis: true, //显示选座提示
105
+				seatList: [], //接口获取的原始位置
106
+				mArr: [], //排数提示
107
+				optArr: [], //选中的座位数组。
108
+				isWXAPP:false,
109
+				relation_id:'',
110
+				sched_sign:'',
111
+				initInfo:'',
112
+				orgSeatList:[],
113
+				siginPrice:'',
114
+				channelSn:'',
115
+				totalPrice:0,
116
+				isFirstInit:true,
117
+				isCanClick:true
118
+			};
119
+		},
120
+		computed: {
121
+			// aPrice() {
122
+			// 	return (this.SelectNum * (this.siginPrice*100))/100
123
+			// },
124
+			rpxNum() {
125
+				return this.boxWidth / 750
126
+			},
127
+			pxNum() {
128
+				return 750 / this.boxWidth
129
+			},
130
+		},
131
+		
132
+		onLoad(e) {
133
+			this.initWidth()
134
+			if(e.info){
135
+				this.initInfo  = JSON.parse(decodeURIComponent(e.info))
136
+				this.getSeatList()
137
+			}
138
+		},
139
+		
140
+		onShow() {
141
+			if(!this.isFirstInit){
142
+				this.resetSeat()
143
+				this.getSeatList()
144
+			}
145
+			this.isFirstInit =false
146
+		},
147
+	
148
+		
149
+		methods: {
150
+			
151
+			initWidth(){
152
+				//获取宽度
153
+				let _this =this
154
+				uni.getSystemInfo({
155
+					success: function(e) {
156
+						_this.boxWidth = e.screenWidth
157
+						//#ifdef H5
158
+						_this.scaleMin = 0.95
159
+						//#endif
160
+					}
161
+				})
162
+			},
163
+			
164
+			 completeSeats(originalData) {
165
+			  // 1. 确定最大行号和列号
166
+			  let maxRow = 0, maxColumn = 0;
167
+			  originalData.forEach(rowArray => {
168
+			    rowArray.forEach(seat => {
169
+			      maxRow = Math.max(maxRow, parseInt(seat.rowNo));
170
+			      maxColumn = Math.max(maxColumn, parseInt(seat.columnNo));
171
+			    });
172
+			  });
173
+			   this.seatRow  = maxRow//数组长度
174
+			   this.seatCol  = maxColumn//子数组中长度最大的
175
+			  // 2. 按行号整理原始数据
176
+			  const rowMap = new Map();
177
+			  originalData.forEach(rowArray => {
178
+			    if (rowArray.length === 0) return;
179
+			    const rowNo = rowArray[0].rowNo;
180
+			    rowMap.set(rowNo, rowArray);
181
+			  });
182
+			
183
+			  // 3. 生成完整的行和列
184
+			  const result = [];
185
+			  for (let row = 1; row <= maxRow; row++) {
186
+			    const rowNo = row.toString();
187
+			    const currentRow = rowMap.get(rowNo) || [];
188
+			    const columnMap = new Map(currentRow.map(seat => [seat.columnNo, seat]));
189
+			
190
+			    // 生成当前排的完整列数据
191
+			    const completedColumns = Array.from({ length: maxColumn }, (_, colIdx) => {
192
+			      const columnNo = (colIdx + 1).toString();
193
+			      return columnMap.has(columnNo) 
194
+			        ? columnMap.get(columnNo) 
195
+			        : { 
196
+			            supplier_id: null, 
197
+			            seatNo: `${rowNo}排${columnNo.padStart(2, '0')}座`, 
198
+			            rowNo, 
199
+			            columnNo ,
200
+						status:-1
201
+			          };
202
+			    });
203
+				
204
+			    result.push(completedColumns);
205
+			  }
206
+			
207
+			  return result;
208
+			},
209
+		
210
+			getSeatList(){
211
+				uni.showLoading()
212
+				let params = `relation_id=${this.initInfo.relation_id}&sched_sign=${this.initInfo.sched_sign}`
213
+				apiGetSchedSeatList(params).then(res => {
214
+					this.orgSeatList = res
215
+					if(res.length!=0){
216
+						this.seatArray = this.completeSeats(this.orgSeatList)
217
+						this.initSeatArray()
218
+						uni.hideLoading()
219
+					}else{
220
+						uni.showToast({
221
+							title:'未获取到座位数据',
222
+							icon:'none'
223
+						})
224
+					}
225
+			     
226
+				})
227
+			},
228
+			
229
+			submitOrder(){
230
+				if(!this.isCanClick){
231
+					return
232
+				}
233
+				this.isCanClick=false
234
+				uni.showLoading({
235
+					title:'处理中...',
236
+					mask:true
237
+				})
238
+			let _newArr=this.optArr.map((res)=>{
239
+					return {seat_no:res.seatNo,seat_sign:res.seatSign,channel_sn:res.channel_sn}
240
+				})
241
+				
242
+				let params ={
243
+					sched_sign:this.initInfo.sched_sign,
244
+					channel_sn:_newArr[0].channel_sn,
245
+					sched_seat:JSON.stringify(_newArr),
246
+					hall_sign:this.initInfo.hall_sign,
247
+					hall_name:this.initInfo.hall_name,
248
+					show_date:this.initInfo.show_date,
249
+					show_time:this.initInfo.show_time,
250
+					cinema_sign:this.initInfo.cinema_sign,
251
+					phone:uni.getStorageSync('USER_INFO_PHONE'),
252
+					
253
+					film_sign:this.initInfo.film_sign,
254
+					relation_id:this.initInfo.relation_id,
255
+				}
256
+				apiSubmitOrder(params).then(res => {
257
+					uni.hideLoading()
258
+					uni.navigateTo({
259
+						url:`/subPages/pages/movies/moviesOrder?order_sn=${res.order_sn}&oid=${res.oid}&code=${res.code}&type=${res.type}`
260
+					})
261
+				}).catch((e)=>{
262
+					console.log("===e",e);
263
+					this.isCanClick=true
264
+			    uni.showToast({
265
+				title:e ||'接口异常!',
266
+				icon:'none'
267
+			})
268
+		})
269
+			},
270
+			
271
+			//初始座位数组
272
+			initSeatArray() {
273
+				this.seatSize = this.boxWidth > 0 ?
274
+					parseInt(parseInt(this.boxWidth, 10) / (this.seatCol + 3), 10) :
275
+					parseInt(parseInt(414, 10) / (this.seatCol + 3), 10)
276
+				   this.initNonSeatPlace();
277
+			},
278
+			
279
+			//初始化是座位的地方
280
+			initNonSeatPlace() {
281
+				let mArr = []
282
+				for (var i = 0; i <this.seatArray.length; i++) {
283
+					let _item = this.seatArray[i]
284
+					let _name =''
285
+					for (var j = 0; j < _item.length; j++) {
286
+						let childItem = _item[j]
287
+						if (childItem.status!=-1 ) {
288
+							//this.siginPrice = childItem.price
289
+							this.channelSn =childItem.channel_sn
290
+							if(childItem.seatNo.indexOf('排')!= -1){
291
+								_name= childItem.seatNo.split('排')[0]
292
+							}else{
293
+								_name= childItem.rowNo
294
+							}
295
+							break
296
+						} 
297
+					}
298
+					mArr.push(_name)
299
+				}
300
+				this.mArr = mArr
301
+			},
302
+			//放大缩小事件
303
+			onScale(e) {
304
+				this.showTis = false
305
+				// this.moveX=-e.detail.x
306
+				let w = this.boxWidth * 0.5
307
+				let s = 1 - e.detail.scale
308
+				this.moveX = w * s
309
+				this.scale = e.detail.scale
310
+				if (s > 0 || s === 0) {
311
+					this.showTis = true
312
+				}
313
+			},
314
+			//移动事件
315
+			onMove(e) {
316
+				this.showTis = false
317
+				this.moveX = e.detail.x
318
+			},
319
+			//重置座位
320
+			resetSeat() {
321
+				this.totalPrice=0
322
+				this.SelectNum = 0
323
+				this.optArr = []
324
+				//将所有已选座位的值变为0
325
+				let oldArray = this.seatArray.slice();
326
+				for (let i = 0; i < this.seatRow; i++) {
327
+					for (let j = 0; j < this.seatCol; j++) {
328
+						if (oldArray[i][j].status === 2) {
329
+							oldArray[i][j].status = 1
330
+						}
331
+					}
332
+				}
333
+				this.seatArray = oldArray;
334
+			},
335
+			//选定且购买座位
336
+			buySeat() {
337
+				if (this.SelectNum === 0) {
338
+					return
339
+				}
340
+				let _this =this
341
+				for (let i = 0; i < this.optArr.length; i++) {
342
+					let _price = this.optArr[0].price
343
+					if(_price != this.optArr[i].price){
344
+						uni.showModal({
345
+							title:'温馨提示',
346
+							content:'请选择相同价格的座位,暂不支持不同价格的座位同时下单,如有需要请单独选择座位下单~',
347
+							complete: (res) => {
348
+								_this.resetSeat()
349
+							}
350
+						})
351
+						return
352
+					}
353
+				}
354
+				this.submitOrder()
355
+			},
356
+			
357
+			
358
+			//处理座位选择逻辑
359
+			handleChooseSeat(row, col) {
360
+				let seatValue = this.seatArray[row][col].status;
361
+				let newArray = this.seatArray;
362
+				//情侣座处理,基数加1 偶数减1
363
+				//如果是已购座位,直接返回
364
+				if (seatValue === 0 || seatValue === -1) return
365
+				//如果是已选座位点击后变未选
366
+				if (seatValue === 2) {
367
+					newArray[row][col].status = 1
368
+					this.SelectNum--
369
+					this.getOptArr(newArray[row][col], 0)
370
+					this.totalPrice = (parseFloat(this.totalPrice )*100- parseFloat(newArray[row][col].price)*100)/100
371
+				} else if (seatValue === 1) {
372
+					if(this.SelectNum==4){
373
+						uni.showToast({
374
+							title:'每次最多只能选择4个座位',
375
+							icon:'none'
376
+						})
377
+						return
378
+					}
379
+					newArray[row][col].status =2
380
+					this.totalPrice = ( parseFloat(this.totalPrice )*100 +  parseFloat(newArray[row][col].price)*100)/100
381
+					this.SelectNum++
382
+					this.getOptArr(newArray[row][col], 1)
383
+				}
384
+				//必须整体更新二维数组,Vue无法检测到数组某一项更新,必须slice复制一个数组才行
385
+				this.seatArray = newArray.slice();
386
+			
387
+			},
388
+			//处理已选座位数组
389
+			getOptArr(item, type) {
390
+				let optArr = this.optArr
391
+				if (type === 1) {
392
+					optArr.push(item)
393
+				} else if (type === 0) {
394
+					let arr = []
395
+					optArr.forEach(v => {
396
+						if (v.seatSign !== item.seatSign) {
397
+							arr.push(v)
398
+						}
399
+					})
400
+					optArr = arr
401
+				}
402
+				this.optArr = optArr.slice()
403
+			},
404
+			
405
+		}
406
+	}
407
+</script>
408
+
409
+<style lang="scss" scoped>
410
+	.p-all-10{
411
+		padding: 10rpx;
412
+	}
413
+	.ml-10 {
414
+		margin-left: 10rpx;
415
+	}
416
+
417
+	.m-0-10 {
418
+		margin: 0 10rpx;
419
+	}
420
+
421
+	.bg-unbtn {
422
+		background-color: #f9abb3;
423
+	}
424
+
425
+	.bg-red-1 {
426
+		background-color: #F45664;
427
+	}
428
+
429
+	.br-10 {
430
+		border-radius: 10rpx;
431
+	}
432
+
433
+	.ml-20 {
434
+		margin-left: 20rpx;
435
+	}
436
+
437
+	.mb-20 {
438
+		margin-bottom: 20rpx;
439
+	}
440
+
441
+	.p-all-32 {
442
+		padding: 32rpx;
443
+	}
444
+
445
+	.fd-cr {
446
+		flex-direction: column-reverse;
447
+		/* 主轴方向从下到上,默认从左到右 */
448
+	}
449
+
450
+	.bottom-bar {
451
+		bottom: var(--window-bottom);
452
+	}
453
+
454
+	.color-fff {
455
+		color: #fff
456
+	}
457
+
458
+	.br-15 {
459
+		border-radius: 15rpx;
460
+	}
461
+
462
+	.over-h {
463
+		overflow: hidden;
464
+	}
465
+
466
+	.dp-ib {
467
+		display: inline-block;
468
+	}
469
+
470
+	.mt-20 {
471
+		margin-top: 20rpx;
472
+	}
473
+
474
+	.pa-v-2 {
475
+		/* 定位垂直对齐 */
476
+		left: 50%;
477
+		transform: translateX(-50%)
478
+	}
479
+
480
+	.b-d-1 {
481
+		border: 1px dashed #e5e5e5;
482
+	}
483
+
484
+	.w-100 {
485
+		width: 100%;
486
+	}
487
+
488
+	.h-100 {
489
+		height: 100%;
490
+	}
491
+
492
+	.bg-f1 {
493
+		background-color: #f1f1f1;
494
+	}
495
+
496
+	.h-100vh {
497
+		height: 100vh;
498
+	}
499
+
500
+	.pt-f {
501
+		position: fixed;
502
+	}
503
+
504
+	.left-0 {
505
+		left: 0;
506
+	}
507
+
508
+	.p-0-32 {
509
+		padding: 0 32rpx;
510
+	}
511
+
512
+	.pt-20 {
513
+		padding-top: 20rpx;
514
+	}
515
+
516
+	.bg-white {
517
+		background-color: #fff;
518
+	}
519
+
520
+	.z1000 {
521
+		z-index: 1000;
522
+	}
523
+
524
+	.fz-34 {
525
+		font-size: 34rpx;
526
+	}
527
+
528
+	.fw-b {
529
+		font-weight: bold;
530
+	}
531
+
532
+	.mt-10 {
533
+		margin-top: 10rpx;
534
+	}
535
+
536
+	.fz-28 {
537
+		font-size: 28rpx;
538
+	}
539
+
540
+	.color-666 {
541
+		color: #666666
542
+	}
543
+
544
+	.dp-f {
545
+		display: flex;
546
+	}
547
+
548
+	.jc-c {
549
+		justify-content: center;
550
+	}
551
+
552
+	.ai-c {
553
+		align-items: center;
554
+	}
555
+
556
+	.fz-22 {
557
+		font-size: 22rpx;
558
+	}
559
+
560
+	.color-333 {
561
+		color: #333333
562
+	}
563
+
564
+	.m-0-a {
565
+		margin: 0 auto;
566
+	}
567
+
568
+	.mt-48 {
569
+		margin-top: 48rpx;
570
+	}
571
+
572
+	.fz-20 {
573
+		font-size: 20rpx;
574
+	}
575
+
576
+	.color-999 {
577
+		color: #999999
578
+	}
579
+
580
+	.b-1 {
581
+		border: 1px solid #CCCCCC;
582
+	}
583
+
584
+	.br-5 {
585
+		border-radius: 5rpx;
586
+	}
587
+
588
+	.Stage {
589
+		background-color: #dddddd;
590
+		width: 380rpx;
591
+		height: 50rpx;
592
+		transform: perspective(50rpx) rotateX(-10deg);
593
+		margin: 0 auto;
594
+	}
595
+
596
+	.bg-line {
597
+		background-color: rgba(0, 0, 0, 0.3);
598
+	}
599
+
600
+	.sel-seat {
601
+		background: url('/static/selected.png') center center no-repeat;
602
+		background-size: 100% 100%;
603
+	}
604
+	
605
+	.unsel-seat {
606
+		background: url('/static/unselected.png') center center no-repeat;
607
+		background-size: 100% 100%;
608
+	}
609
+	
610
+	.bought-seat {
611
+		background: url('/static/bought.png') center center no-repeat;
612
+		background-size: 100% 100%;
613
+	}
614
+</style>
615
+<route lang="yaml">
616
+style:
617
+  navigationBarTitleText: 选择座位
618
+  enablePullDownRefresh: true
619
+</route>

+ 619 - 0
src/subPages/pages/movies/chooseSeat.vue

@@ -0,0 +1,619 @@
1
+<template>
2
+	<view class="w-100">
3
+		<view class="bg-f1 h-100vh">
4
+			<view class="pt-f left-0 w-100 p-0-32 bg-white z1000" :style="'height: 132rpx;top:0'">
5
+				<view>
6
+					<view class="fz-34 fw-b pt-20">
7
+						{{initInfo.film_name}}
8
+					</view>
9
+					<view class="mt-10 fz-28 color-666">
10
+						{{initInfo.show_des}}
11
+					</view>
12
+				</view>
13
+			</view>
14
+			<movable-area :style="'height:'+(seatRow*40+350)+'rpx;width: 100vw;top:'+(rpxNum*132)+'px'" class="pt-f left-0">
15
+				<movable-view :style="'width: 100vw;height:'+(seatRow*40+350)+'rpx;'" :inertia="true" :scale="true" :scale-min="0.95"
16
+				 :scale-max="2" direction="all" @change="onMove" @scale="onScale">
17
+					<view class="Stage dp-f jc-c ai-c fz-22 color-333">
18
+						{{initInfo.hall_name}}
19
+					</view>
20
+					<view style="width: 100rpx;height: 30rpx;" class="m-0-a mt-48 dp-f jc-c ai-c fz-20 color-999 b-1 br-5">银幕中央</view>
21
+					
22
+					<view class="pt-f pa-v-2 b-d-1" :style="'height:'+seatRow*(20+seatSize*pxNum)+'rpx;top:165rpx;width:0'"></view>
23
+					
24
+					<view v-for="(item,index) in seatArray" :key="index" class="dp-f jc-c mt-20" :style="'width:'+boxWidth+'px;height:'+seatSize+'px'">
25
+						<view v-for="(seat,col) in item" :key="col" class="dp-ib" :style="'width:'+seatSize+'px;height:'+seatSize+'px'"
26
+						 @click="handleChooseSeat(index,col)">
27
+							<image v-if="seat.status===1" class="w-100 h-100" src="../../static/unselected.png" mode="aspectFit"></image>
28
+							<image v-else-if="seat.status===2" class="w-100 h-100" src="../../static/selected.png" mode="aspectFit"></image>
29
+							<image v-else-if="seat.status===0" class="w-100 h-100" src="../../static/bought.png" mode="aspectFit"></image>
30
+						</view>
31
+					</view>
32
+					
33
+					<view class="pt-f bg-line br-15 over-h" :style="'left: '+(10-moveX/scale)+'px;top:109rpx;width:30rpx;'">
34
+						<view class="w-100 dp-f ai-c jc-c fz-22 color-fff" :style="'height:'+seatSize+'px;margin-top:20rpx;'" v-for="(m,mindex) in mArr"
35
+						 :key="mindex">{{m}}</view>
36
+						<view :style="'height: 20rpx;'"></view>
37
+					</view>
38
+
39
+				</movable-view>
40
+			</movable-area>
41
+			<view class="pt-f bottom-bar left-0 dp-f fd-cr z1000">
42
+				<view class="bg-white p-all-32">
43
+					<!-- <view class="dp-f ai-c jc-c fz-28 color-333 mb-20" v-if="SelectNum===0">
44
+						推荐选座
45
+						<view style="width: 106rpx;height: 60rpx;" class="b-1 br-5 dp-f ai-c jc-c fz-28 ml-20" v-for="(n,numindex) in 4"
46
+						 :key="n" @click="smartChoose(numindex+1)">
47
+							{{numindex+1}}人
48
+						</view>
49
+					</view> -->
50
+					<view class="dp-f ai-c fw-w fz-28 color-333 mb-20" v-if="SelectNum>0">
51
+						<text>已选</text>
52
+						<view class="p-all-10 b-1 br-5 dp-f ai-c jc-c fz-28 ml-20" v-for="(optItem,optindex) in optArr" :key="optindex">
53
+							{{optItem.seatNo}}
54
+						</view>
55
+					</view>
56
+					<view style="width: 686rpx;height: 90rpx;" class="dp-f jc-c ai-c br-10 fz-34 color-fff" :class="SelectNum>0?'bg-red-1':'bg-unbtn'"
57
+					 @click="buySeat">
58
+						{{SelectNum>0?('¥ '+totalPrice+' 确认座位'):'请选座位'}}
59
+					</view>
60
+				</view>
61
+				<view class="dp-f jc-c ai-c mb-20 fz-28" v-if="showTis && seatSize!=0">
62
+					<view class="dp-f jc-c ai-c m-0-10">
63
+						<image :style="'width:'+seatSize+'px;height:'+seatSize+'px'" src="/static/unselected.png" mode="aspectFit"></image><span
64
+						 class="ml-10">可选</span>
65
+					</view>
66
+					<view class="dp-f jc-c ai-c m-0-10">
67
+						<image :style="'width:'+seatSize+'px;height:'+seatSize+'px'" src="/static/bought.png" mode="aspectFit"></image><span
68
+						 class="ml-10">不可选</span>
69
+					</view>
70
+					<view class="dp-f jc-c ai-c m-0-10">
71
+						<image :style="'width:'+seatSize+'px;height:'+seatSize+'px'" src="/static/selected.png" mode="aspectFit"></image><span
72
+						 class="ml-10">选中</span>
73
+					</view>
74
+				</view>
75
+			</view>
76
+		</view>
77
+	</view>
78
+</template>
79
+<script>
80
+	
81
+	import {
82
+		seatData
83
+	} from '@/utils/seat-data.js'
84
+	
85
+	import {
86
+		apiGetSchedSeatList,
87
+		apiSubmitOrder
88
+	} from '~/apis/movies'
89
+	export default {
90
+		data() {
91
+			return {
92
+				scaleMin:1,//h5端为解决1无法缩小问题,设为0.95
93
+				boxWidth: 400, //屏幕宽度px
94
+				space: ' ', //空格
95
+				seatArray: [], //影院座位的二维数组,-1为非座位,0为未购座位,1为已选座位(绿色),2为已购座位(红色),一维行,二维列
96
+				seatRow: 0, //影院座位行数
97
+				seatCol: 0, //影院座位列数
98
+				seatSize: 0, //座位尺寸
99
+				SelectNum: 0, //选择座位数
100
+				moveX: 0, //水平移动偏移量
101
+				scale: 1, //放大倍数
102
+				minRow: 0, //从第几行开始排座位
103
+				minCol: 0, //从第几列开始排座位
104
+				showTis: true, //显示选座提示
105
+				seatList: [], //接口获取的原始位置
106
+				mArr: [], //排数提示
107
+				optArr: [], //选中的座位数组。
108
+				isWXAPP:false,
109
+				relation_id:'',
110
+				sched_sign:'',
111
+				initInfo:'',
112
+				orgSeatList:[],
113
+				siginPrice:'',
114
+				channelSn:'',
115
+				totalPrice:0,
116
+				isFirstInit:true,
117
+				isCanClick:true
118
+			};
119
+		},
120
+		computed: {
121
+			// aPrice() {
122
+			// 	return (this.SelectNum * (this.siginPrice*100))/100
123
+			// },
124
+			rpxNum() {
125
+				return this.boxWidth / 750
126
+			},
127
+			pxNum() {
128
+				return 750 / this.boxWidth
129
+			},
130
+		},
131
+		
132
+		onLoad(e) {
133
+			this.initWidth()
134
+			if(e.info){
135
+				this.initInfo  = JSON.parse(decodeURIComponent(e.info))
136
+				this.getSeatList()
137
+			}
138
+		},
139
+		
140
+		onShow() {
141
+			if(!this.isFirstInit){
142
+				this.resetSeat()
143
+				this.getSeatList()
144
+			}
145
+			this.isFirstInit =false
146
+		},
147
+	
148
+		
149
+		methods: {
150
+			
151
+			initWidth(){
152
+				//获取宽度
153
+				let _this =this
154
+				uni.getSystemInfo({
155
+					success: function(e) {
156
+						_this.boxWidth = e.screenWidth
157
+						//#ifdef H5
158
+						_this.scaleMin = 0.95
159
+						//#endif
160
+					}
161
+				})
162
+			},
163
+			
164
+			 completeSeats(originalData) {
165
+			  // 1. 确定最大行号和列号
166
+			  let maxRow = 0, maxColumn = 0;
167
+			  originalData.forEach(rowArray => {
168
+			    rowArray.forEach(seat => {
169
+			      maxRow = Math.max(maxRow, parseInt(seat.rowNo));
170
+			      maxColumn = Math.max(maxColumn, parseInt(seat.columnNo));
171
+			    });
172
+			  });
173
+			   this.seatRow  = maxRow//数组长度
174
+			   this.seatCol  = maxColumn//子数组中长度最大的
175
+			  // 2. 按行号整理原始数据
176
+			  const rowMap = new Map();
177
+			  originalData.forEach(rowArray => {
178
+			    if (rowArray.length === 0) return;
179
+			    const rowNo = rowArray[0].rowNo;
180
+			    rowMap.set(rowNo, rowArray);
181
+			  });
182
+			
183
+			  // 3. 生成完整的行和列
184
+			  const result = [];
185
+			  for (let row = 1; row <= maxRow; row++) {
186
+			    const rowNo = row.toString();
187
+			    const currentRow = rowMap.get(rowNo) || [];
188
+			    const columnMap = new Map(currentRow.map(seat => [seat.columnNo, seat]));
189
+			
190
+			    // 生成当前排的完整列数据
191
+			    const completedColumns = Array.from({ length: maxColumn }, (_, colIdx) => {
192
+			      const columnNo = (colIdx + 1).toString();
193
+			      return columnMap.has(columnNo) 
194
+			        ? columnMap.get(columnNo) 
195
+			        : { 
196
+			            supplier_id: null, 
197
+			            seatNo: `${rowNo}排${columnNo.padStart(2, '0')}座`, 
198
+			            rowNo, 
199
+			            columnNo ,
200
+						status:-1
201
+			          };
202
+			    });
203
+				
204
+			    result.push(completedColumns);
205
+			  }
206
+			
207
+			  return result;
208
+			},
209
+		
210
+			getSeatList(){
211
+				uni.showLoading()
212
+				let params = `relation_id=${this.initInfo.relation_id}&sched_sign=${this.initInfo.sched_sign}`
213
+				apiGetSchedSeatList(params).then(res => {
214
+					this.orgSeatList = res
215
+					if(res.length!=0){
216
+						this.seatArray = this.completeSeats(this.orgSeatList)
217
+						this.initSeatArray()
218
+						uni.hideLoading()
219
+					}else{
220
+						uni.showToast({
221
+							title:'未获取到座位数据',
222
+							icon:'none'
223
+						})
224
+					}
225
+			     
226
+				})
227
+			},
228
+			
229
+			submitOrder(){
230
+				if(!this.isCanClick){
231
+					return
232
+				}
233
+				this.isCanClick=false
234
+				uni.showLoading({
235
+					title:'处理中...',
236
+					mask:true
237
+				})
238
+			let _newArr=this.optArr.map((res)=>{
239
+					return {seat_no:res.seatNo,seat_sign:res.seatSign,channel_sn:res.channel_sn}
240
+				})
241
+				
242
+				let params ={
243
+					sched_sign:this.initInfo.sched_sign,
244
+					channel_sn:_newArr[0].channel_sn,
245
+					sched_seat:JSON.stringify(_newArr),
246
+					hall_sign:this.initInfo.hall_sign,
247
+					hall_name:this.initInfo.hall_name,
248
+					show_date:this.initInfo.show_date,
249
+					show_time:this.initInfo.show_time,
250
+					cinema_sign:this.initInfo.cinema_sign,
251
+					phone:uni.getStorageSync('USER_INFO_PHONE'),
252
+					
253
+					film_sign:this.initInfo.film_sign,
254
+					relation_id:this.initInfo.relation_id,
255
+				}
256
+				apiSubmitOrder(params).then(res => {
257
+					uni.hideLoading()
258
+					uni.navigateTo({
259
+						url:`/subPages/pages/movies/moviesOrder?order_sn=${res.order_sn}&oid=${res.oid}&code=${res.code}&type=${res.type}`
260
+					})
261
+				}).catch((e)=>{
262
+					console.log("===e",e);
263
+					this.isCanClick=true
264
+			    uni.showToast({
265
+				title:e ||'接口异常!',
266
+				icon:'none'
267
+			})
268
+		})
269
+			},
270
+			
271
+			//初始座位数组
272
+			initSeatArray() {
273
+				this.seatSize = this.boxWidth > 0 ?
274
+					parseInt(parseInt(this.boxWidth, 10) / (this.seatCol + 3), 10) :
275
+					parseInt(parseInt(414, 10) / (this.seatCol + 3), 10)
276
+				   this.initNonSeatPlace();
277
+			},
278
+			
279
+			//初始化是座位的地方
280
+			initNonSeatPlace() {
281
+				let mArr = []
282
+				for (var i = 0; i <this.seatArray.length; i++) {
283
+					let _item = this.seatArray[i]
284
+					let _name =''
285
+					for (var j = 0; j < _item.length; j++) {
286
+						let childItem = _item[j]
287
+						if (childItem.status!=-1 ) {
288
+							//this.siginPrice = childItem.price
289
+							this.channelSn =childItem.channel_sn
290
+							if(childItem.seatNo.indexOf('排')!= -1){
291
+								_name= childItem.seatNo.split('排')[0]
292
+							}else{
293
+								_name= childItem.rowNo
294
+							}
295
+							break
296
+						} 
297
+					}
298
+					mArr.push(_name)
299
+				}
300
+				this.mArr = mArr
301
+			},
302
+			//放大缩小事件
303
+			onScale(e) {
304
+				this.showTis = false
305
+				// this.moveX=-e.detail.x
306
+				let w = this.boxWidth * 0.5
307
+				let s = 1 - e.detail.scale
308
+				this.moveX = w * s
309
+				this.scale = e.detail.scale
310
+				if (s > 0 || s === 0) {
311
+					this.showTis = true
312
+				}
313
+			},
314
+			//移动事件
315
+			onMove(e) {
316
+				this.showTis = false
317
+				this.moveX = e.detail.x
318
+			},
319
+			//重置座位
320
+			resetSeat() {
321
+				this.totalPrice=0
322
+				this.SelectNum = 0
323
+				this.optArr = []
324
+				//将所有已选座位的值变为0
325
+				let oldArray = this.seatArray.slice();
326
+				for (let i = 0; i < this.seatRow; i++) {
327
+					for (let j = 0; j < this.seatCol; j++) {
328
+						if (oldArray[i][j].status === 2) {
329
+							oldArray[i][j].status = 1
330
+						}
331
+					}
332
+				}
333
+				this.seatArray = oldArray;
334
+			},
335
+			//选定且购买座位
336
+			buySeat() {
337
+				if (this.SelectNum === 0) {
338
+					return
339
+				}
340
+				let _this =this
341
+				for (let i = 0; i < this.optArr.length; i++) {
342
+					let _price = this.optArr[0].price
343
+					if(_price != this.optArr[i].price){
344
+						uni.showModal({
345
+							title:'温馨提示',
346
+							content:'请选择相同价格的座位,暂不支持不同价格的座位同时下单,如有需要请单独选择座位下单~',
347
+							complete: (res) => {
348
+								_this.resetSeat()
349
+							}
350
+						})
351
+						return
352
+					}
353
+				}
354
+				this.submitOrder()
355
+			},
356
+			
357
+			
358
+			//处理座位选择逻辑
359
+			handleChooseSeat(row, col) {
360
+				let seatValue = this.seatArray[row][col].status;
361
+				let newArray = this.seatArray;
362
+				//情侣座处理,基数加1 偶数减1
363
+				//如果是已购座位,直接返回
364
+				if (seatValue === 0 || seatValue === -1) return
365
+				//如果是已选座位点击后变未选
366
+				if (seatValue === 2) {
367
+					newArray[row][col].status = 1
368
+					this.SelectNum--
369
+					this.getOptArr(newArray[row][col], 0)
370
+					this.totalPrice = (parseFloat(this.totalPrice )*100- parseFloat(newArray[row][col].price)*100)/100
371
+				} else if (seatValue === 1) {
372
+					if(this.SelectNum==4){
373
+						uni.showToast({
374
+							title:'每次最多只能选择4个座位',
375
+							icon:'none'
376
+						})
377
+						return
378
+					}
379
+					newArray[row][col].status =2
380
+					this.totalPrice = ( parseFloat(this.totalPrice )*100 +  parseFloat(newArray[row][col].price)*100)/100
381
+					this.SelectNum++
382
+					this.getOptArr(newArray[row][col], 1)
383
+				}
384
+				//必须整体更新二维数组,Vue无法检测到数组某一项更新,必须slice复制一个数组才行
385
+				this.seatArray = newArray.slice();
386
+			
387
+			},
388
+			//处理已选座位数组
389
+			getOptArr(item, type) {
390
+				let optArr = this.optArr
391
+				if (type === 1) {
392
+					optArr.push(item)
393
+				} else if (type === 0) {
394
+					let arr = []
395
+					optArr.forEach(v => {
396
+						if (v.seatSign !== item.seatSign) {
397
+							arr.push(v)
398
+						}
399
+					})
400
+					optArr = arr
401
+				}
402
+				this.optArr = optArr.slice()
403
+			},
404
+			
405
+		}
406
+	}
407
+</script>
408
+
409
+<style lang="scss" scoped>
410
+	.p-all-10{
411
+		padding: 10rpx;
412
+	}
413
+	.ml-10 {
414
+		margin-left: 10rpx;
415
+	}
416
+
417
+	.m-0-10 {
418
+		margin: 0 10rpx;
419
+	}
420
+
421
+	.bg-unbtn {
422
+		background-color: #f9abb3;
423
+	}
424
+
425
+	.bg-red-1 {
426
+		background-color: #F45664;
427
+	}
428
+
429
+	.br-10 {
430
+		border-radius: 10rpx;
431
+	}
432
+
433
+	.ml-20 {
434
+		margin-left: 20rpx;
435
+	}
436
+
437
+	.mb-20 {
438
+		margin-bottom: 20rpx;
439
+	}
440
+
441
+	.p-all-32 {
442
+		padding: 32rpx;
443
+	}
444
+
445
+	.fd-cr {
446
+		flex-direction: column-reverse;
447
+		/* 主轴方向从下到上,默认从左到右 */
448
+	}
449
+
450
+	.bottom-bar {
451
+		bottom: var(--window-bottom);
452
+	}
453
+
454
+	.color-fff {
455
+		color: #fff
456
+	}
457
+
458
+	.br-15 {
459
+		border-radius: 15rpx;
460
+	}
461
+
462
+	.over-h {
463
+		overflow: hidden;
464
+	}
465
+
466
+	.dp-ib {
467
+		display: inline-block;
468
+	}
469
+
470
+	.mt-20 {
471
+		margin-top: 20rpx;
472
+	}
473
+
474
+	.pa-v-2 {
475
+		/* 定位垂直对齐 */
476
+		left: 50%;
477
+		transform: translateX(-50%)
478
+	}
479
+
480
+	.b-d-1 {
481
+		border: 1px dashed #e5e5e5;
482
+	}
483
+
484
+	.w-100 {
485
+		width: 100%;
486
+	}
487
+
488
+	.h-100 {
489
+		height: 100%;
490
+	}
491
+
492
+	.bg-f1 {
493
+		background-color: #f1f1f1;
494
+	}
495
+
496
+	.h-100vh {
497
+		height: 100vh;
498
+	}
499
+
500
+	.pt-f {
501
+		position: fixed;
502
+	}
503
+
504
+	.left-0 {
505
+		left: 0;
506
+	}
507
+
508
+	.p-0-32 {
509
+		padding: 0 32rpx;
510
+	}
511
+
512
+	.pt-20 {
513
+		padding-top: 20rpx;
514
+	}
515
+
516
+	.bg-white {
517
+		background-color: #fff;
518
+	}
519
+
520
+	.z1000 {
521
+		z-index: 1000;
522
+	}
523
+
524
+	.fz-34 {
525
+		font-size: 34rpx;
526
+	}
527
+
528
+	.fw-b {
529
+		font-weight: bold;
530
+	}
531
+
532
+	.mt-10 {
533
+		margin-top: 10rpx;
534
+	}
535
+
536
+	.fz-28 {
537
+		font-size: 28rpx;
538
+	}
539
+
540
+	.color-666 {
541
+		color: #666666
542
+	}
543
+
544
+	.dp-f {
545
+		display: flex;
546
+	}
547
+
548
+	.jc-c {
549
+		justify-content: center;
550
+	}
551
+
552
+	.ai-c {
553
+		align-items: center;
554
+	}
555
+
556
+	.fz-22 {
557
+		font-size: 22rpx;
558
+	}
559
+
560
+	.color-333 {
561
+		color: #333333
562
+	}
563
+
564
+	.m-0-a {
565
+		margin: 0 auto;
566
+	}
567
+
568
+	.mt-48 {
569
+		margin-top: 48rpx;
570
+	}
571
+
572
+	.fz-20 {
573
+		font-size: 20rpx;
574
+	}
575
+
576
+	.color-999 {
577
+		color: #999999
578
+	}
579
+
580
+	.b-1 {
581
+		border: 1px solid #CCCCCC;
582
+	}
583
+
584
+	.br-5 {
585
+		border-radius: 5rpx;
586
+	}
587
+
588
+	.Stage {
589
+		background-color: #dddddd;
590
+		width: 380rpx;
591
+		height: 50rpx;
592
+		transform: perspective(50rpx) rotateX(-10deg);
593
+		margin: 0 auto;
594
+	}
595
+
596
+	.bg-line {
597
+		background-color: rgba(0, 0, 0, 0.3);
598
+	}
599
+
600
+	.sel-seat {
601
+		background: url('/static/selected.png') center center no-repeat;
602
+		background-size: 100% 100%;
603
+	}
604
+	
605
+	.unsel-seat {
606
+		background: url('/static/unselected.png') center center no-repeat;
607
+		background-size: 100% 100%;
608
+	}
609
+	
610
+	.bought-seat {
611
+		background: url('/static/bought.png') center center no-repeat;
612
+		background-size: 100% 100%;
613
+	}
614
+</style>
615
+<route lang="yaml">
616
+style:
617
+  navigationBarTitleText: 选择座位
618
+  enablePullDownRefresh: true
619
+</route>

+ 753 - 0
src/subPages/pages/movies/chooseSeat1.vue

@@ -0,0 +1,753 @@
1
+<template>
2
+	<view class="w-100">
3
+		<view class="bg-f1 h-100vh">
4
+			<view class="pt-f left-0 w-100 p-0-32 bg-white z1000" :style="'height: 132rpx;top:0'">
5
+				<view>
6
+					<view class="fz-34 fw-b pt-20">
7
+						{{initInfo.film_name}}
8
+					</view>
9
+					<view class="mt-10 fz-28 color-666">
10
+						{{initInfo.show_des}}
11
+					</view>
12
+				</view>
13
+			</view>
14
+			<movable-area :style="'height:'+(seatRow*40+350)+'rpx;width: 100vw;top:'+(rpxNum*132)+'px'" class="pt-f left-0">
15
+				<movable-view :style="'width: 100vw;height:'+(seatRow*40+350)+'rpx;'" :inertia="true" :scale="true" :scale-min="0.95"
16
+				 :scale-max="2" direction="all" @change="onMove" @scale="onScale">
17
+					<view class="Stage dp-f jc-c ai-c fz-22 color-333">
18
+						{{initInfo.hall_name}}
19
+					</view>
20
+					<view style="width: 100rpx;height: 30rpx;" class="m-0-a mt-48 dp-f jc-c ai-c fz-20 color-999 b-1 br-5">银幕中央</view>
21
+					
22
+					<view class="pt-f pa-v-2 b-d-1" :style="'height:'+seatRow*(20+seatSize*pxNum)+'rpx;top:165rpx;width:0'"></view>
23
+					
24
+					<view v-for="(item,index) in seatArray" :key="index" class="dp-f jc-c mt-20" :style="'width:'+boxWidth+'px;height:'+seatSize+'px'">
25
+						<view v-for="(seat,col) in item" :key="col" class="dp-ib" :style="'width:'+seatSize+'px;height:'+seatSize+'px'"
26
+						 @click="handleChooseSeat(index,col)">
27
+							<image v-if="seat.type===0" class="w-100 h-100" src="../../static/unselected.png" mode="aspectFit"></image>
28
+							<image v-else-if="seat.type===1" class="w-100 h-100" src="../../static/selected.png" mode="aspectFit"></image>
29
+							<image v-else-if="seat.type===2" class="w-100 h-100" src="../../static/bought.png" mode="aspectFit"></image>
30
+						</view>
31
+					</view>
32
+					
33
+					<view class="pt-f bg-line br-15 over-h" :style="'left: '+(10-moveX/scale)+'px;top:109rpx;width:30rpx;'">
34
+						<view class="w-100 dp-f ai-c jc-c fz-22 color-fff" :style="'height:'+seatSize+'px;margin-top:20rpx;'" v-for="(m,mindex) in mArr"
35
+						 :key="mindex">{{m}}</view>
36
+						<view :style="'height: 20rpx;'"></view>
37
+					</view>
38
+
39
+				</movable-view>
40
+			</movable-area>
41
+			<view class="pt-f bottom-bar left-0 dp-f fd-cr z1000">
42
+				<view class="bg-white p-all-32">
43
+					<!-- <view class="dp-f ai-c jc-c fz-28 color-333 mb-20" v-if="SelectNum===0">
44
+						推荐选座
45
+						<view style="width: 106rpx;height: 60rpx;" class="b-1 br-5 dp-f ai-c jc-c fz-28 ml-20" v-for="(n,numindex) in 4"
46
+						 :key="n" @click="smartChoose(numindex+1)">
47
+							{{numindex+1}}人
48
+						</view>
49
+					</view> -->
50
+					<view class="dp-f ai-c fw-w fz-28 color-333 mb-20" v-if="SelectNum>0">
51
+						<text>已选</text>
52
+						<view class="p-all-10 b-1 br-5 dp-f ai-c jc-c fz-28 ml-20" v-for="(optItem,optindex) in optArr" :key="optindex">
53
+							{{optItem.RowNum+'排'+optItem.ColumnNum+'座'}}
54
+						</view>
55
+					</view>
56
+					<view style="width: 686rpx;height: 90rpx;" class="dp-f jc-c ai-c br-10 fz-34 color-fff" :class="SelectNum>0?'bg-red-1':'bg-unbtn'"
57
+					 @click="buySeat">
58
+						{{SelectNum>0?('¥ '+aPrice+' 确认座位'):'请选座位'}}
59
+					</view>
60
+				</view>
61
+				<view class="dp-f jc-c ai-c mb-20 fz-28" v-if="showTis">
62
+					<view class="dp-f jc-c ai-c m-0-10">
63
+						<image :style="'width:'+seatSize+'px;height:'+seatSize+'px'" src="/static/unselected.png" mode="aspectFit"></image><span
64
+						 class="ml-10">可选</span>
65
+					</view>
66
+					<view class="dp-f jc-c ai-c m-0-10">
67
+						<image :style="'width:'+seatSize+'px;height:'+seatSize+'px'" src="/static/bought.png" mode="aspectFit"></image><span
68
+						 class="ml-10">不可选</span>
69
+					</view>
70
+					<view class="dp-f jc-c ai-c m-0-10">
71
+						<image :style="'width:'+seatSize+'px;height:'+seatSize+'px'" src="/static/selected.png" mode="aspectFit"></image><span
72
+						 class="ml-10">选中</span>
73
+					</view>
74
+				</view>
75
+			</view>
76
+		</view>
77
+	</view>
78
+</template>
79
+<script>
80
+	
81
+	import {
82
+		seatData
83
+	} from '@/utils/seat-data.js'
84
+	
85
+	import {
86
+		apiGetSchedSeatList,
87
+	} from '~/apis/movies'
88
+	export default {
89
+		data() {
90
+			return {
91
+				scaleMin:1,//h5端为解决1无法缩小问题,设为0.95
92
+				boxWidth: 400, //屏幕宽度px
93
+				space: ' ', //空格
94
+				seatArray: [], //影院座位的二维数组,-1为非座位,0为未购座位,1为已选座位(绿色),2为已购座位(红色),一维行,二维列
95
+				seatRow: 0, //影院座位行数
96
+				seatCol: 0, //影院座位列数
97
+				seatSize: 0, //座位尺寸
98
+				SelectNum: 0, //选择座位数
99
+				moveX: 0, //水平移动偏移量
100
+				scale: 1, //放大倍数
101
+				minRow: 0, //从第几行开始排座位
102
+				minCol: 0, //从第几列开始排座位
103
+				showTis: true, //显示选座提示
104
+				seatList: [], //接口获取的原始位置
105
+				mArr: [], //排数提示
106
+				optArr: [], //选中的座位数组。
107
+				isWXAPP:false,
108
+				relation_id:'',
109
+				sched_sign:'',
110
+				initInfo:'',
111
+				orgSeatList:[]
112
+			};
113
+		},
114
+		computed: {
115
+			aPrice() {
116
+				return this.SelectNum * 36
117
+			},
118
+			rpxNum() {
119
+				return this.boxWidth / 750
120
+			},
121
+			pxNum() {
122
+				return 750 / this.boxWidth
123
+			},
124
+		},
125
+		
126
+		onLoad(e) {
127
+			//relation_id=${item.relation_id}&sched_sign=${item.sched_sign}`
128
+			console.log("===onLoad",e);
129
+			
130
+			if(e.info){
131
+				this.initInfo  = JSON.parse(decodeURIComponent(e.info))
132
+			}
133
+			//获取宽度
134
+			let _this =this
135
+			uni.getSystemInfo({
136
+				success: function(e) {
137
+					_this.boxWidth = e.screenWidth
138
+					//#ifdef H5
139
+					_this.scaleMin = 0.95
140
+					//#endif
141
+				}
142
+			})
143
+			this.initData()
144
+			//this.getSeatList()
145
+		},
146
+		methods: {
147
+			
148
+			 completeSeats(originalData) {
149
+			  // 1. 确定最大行号和列号
150
+			  let maxRow = 0, maxColumn = 0;
151
+			  originalData.forEach(rowArray => {
152
+			    rowArray.forEach(seat => {
153
+			      maxRow = Math.max(maxRow, parseInt(seat.rowNo));
154
+			      maxColumn = Math.max(maxColumn, parseInt(seat.columnNo));
155
+			    });
156
+			  });
157
+			   this.seatRow  = maxRow//数组长度
158
+			   this.seatCol  = maxColumn//子数组中长度最大的
159
+			  // 2. 按行号整理原始数据
160
+			  const rowMap = new Map();
161
+			  originalData.forEach(rowArray => {
162
+			    if (rowArray.length === 0) return;
163
+			    const rowNo = rowArray[0].rowNo;
164
+			    rowMap.set(rowNo, rowArray);
165
+			  });
166
+			
167
+			  // 3. 生成完整的行和列
168
+			  const result = [];
169
+			  for (let row = 1; row <= maxRow; row++) {
170
+			    const rowNo = row.toString();
171
+			    const currentRow = rowMap.get(rowNo) || [];
172
+			    const columnMap = new Map(currentRow.map(seat => [seat.columnNo, seat]));
173
+			
174
+			    // 生成当前排的完整列数据
175
+			    const completedColumns = Array.from({ length: maxColumn }, (_, colIdx) => {
176
+			      const columnNo = (colIdx + 1).toString();
177
+			      return columnMap.has(columnNo) 
178
+			        ? columnMap.get(columnNo) 
179
+			        : { 
180
+			            supplier_id: null, 
181
+			            seatNo: `${rowNo}排${columnNo.padStart(2, '0')}座`, 
182
+			            rowNo, 
183
+			            columnNo ,
184
+						status:-1
185
+			          };
186
+			    });
187
+			    result.push(completedColumns);
188
+			  }
189
+			
190
+			  return result;
191
+			},
192
+			initData() {
193
+			
194
+				
195
+				let arr = seatData
196
+				//假数据说明:SeatCode座位编号,RowNum-行号,ColumnNum-纵号,YCoord-Y坐标,XCoord-X坐标,Status-状态
197
+				let row = 0
198
+				let col = 0
199
+				let minCol = parseInt(arr[0].XCoord)
200
+				let minRow = parseInt(arr[0].YCoord)
201
+				for (let i of arr) {
202
+					minRow = parseInt(i.YCoord) < minRow ? parseInt(i.YCoord) : minRow
203
+					minCol = parseInt(i.XCoord) < minCol ? parseInt(i.XCoord) : minCol
204
+					row = parseInt(i.YCoord) > row ? parseInt(i.YCoord) : row
205
+					col = parseInt(i.XCoord) > col ? parseInt(i.XCoord) : col
206
+				}
207
+				this.seatList = arr
208
+				this.seatRow = row - minRow + 1
209
+				this.seatCol = col - minCol + 3
210
+				this.minRow = minRow
211
+				this.minCol = minCol - 1
212
+				console.log("===this.seatRow--initData",this.seatList);
213
+				console.log("===this.seatRow",this.seatRow);
214
+                console.log("===this.seatCol",this.seatCol);
215
+				console.log("===minRow",this.minRow);
216
+				console.log("===minCol",this.minCol);
217
+				this.initSeatArray()
218
+			},
219
+			
220
+			getSeatList(){
221
+				uni.showLoading()
222
+				let params = `relation_id=${this.initInfo.relation_id}&sched_sign=${this.initInfo.sched_sign}`
223
+				apiGetSchedSeatList(params).then(res => {
224
+					console.log("===getSeatList",res);
225
+					this.orgSeatList = res
226
+				 
227
+				let _arr = 	this.completeSeats(this.orgSeatList)
228
+				console.log("===getSeatList",_arr);
229
+			
230
+					//this.initSeatArray()
231
+					uni.hideLoading()
232
+				})
233
+			},
234
+			//初始座位数组
235
+			initSeatArray: function() {
236
+				
237
+				
238
+				
239
+				let seatArray = Array(this.seatRow).fill(0).map(() => Array(this.seatCol).fill({
240
+					type: -1,
241
+					SeatCode: '',
242
+					RowNum: '',
243
+					ColumnNum: ''
244
+				}));
245
+					console.log("===this.seatArray",seatArray);
246
+				this.seatArray = seatArray
247
+				console.log("===this.seatArray",this.seatArray);
248
+				this.seatSize = this.boxWidth > 0 ?
249
+					parseInt(parseInt(this.boxWidth, 10) / (this.seatCol + 1), 10) :
250
+					parseInt(parseInt(414, 10) / (this.seatCol + 1), 10)
251
+				this.initNonSeatPlace();
252
+			},
253
+			
254
+			//初始化是座位的地方
255
+			initNonSeatPlace: function() {
256
+				let seat = this.seatList.slice()
257
+				let arr = this.seatArray.slice()
258
+				for (let num in seat) {
259
+					let status = 2 //-1为非座位,0为未购座位,1为已选座位(绿色),2为已购座位(红色)
260
+					if (seat[num].Status === 0) {
261
+						status = 0
262
+					} else if (seat[num].Status === -1) {
263
+						status = -1
264
+					}
265
+					arr[parseInt(seat[num].YCoord) - this.minRow][parseInt(seat[num].XCoord) - this.minCol] = {
266
+						type: status,
267
+						SeatCode: seat[num].SeatCode,
268
+						RowNum: seat[num].RowNum,
269
+						ColumnNum: seat[num].ColumnNum
270
+					}
271
+				}
272
+				this.seatArray = arr.slice()
273
+				console.log("===this.seatArray==slice",this.seatArray);
274
+				let mArr = []
275
+				for (let i in arr) {
276
+					let m = ''
277
+					for (let n of arr[i]) {
278
+						if (n.SeatCode) {
279
+							m = n.RowNum
280
+						}
281
+					}
282
+					if (m) {
283
+						mArr.push(m)
284
+					} else {
285
+						mArr.push('')
286
+					}
287
+				}
288
+				this.mArr = mArr
289
+			},
290
+			//放大缩小事件
291
+			onScale: function(e) {
292
+				this.showTis = false
293
+				// this.moveX=-e.detail.x
294
+				let w = this.boxWidth * 0.5
295
+				let s = 1 - e.detail.scale
296
+				this.moveX = w * s
297
+				this.scale = e.detail.scale
298
+				if (s > 0 || s === 0) {
299
+					this.showTis = true
300
+				}
301
+			},
302
+			//移动事件
303
+			onMove: function(e) {
304
+				this.showTis = false
305
+				this.moveX = e.detail.x
306
+			},
307
+			//重置座位
308
+			resetSeat: function() {
309
+				this.SelectNum = 0
310
+				this.optArr = []
311
+				//将所有已选座位的值变为0
312
+				let oldArray = this.seatArray.slice();
313
+				for (let i = 0; i < this.seatRow; i++) {
314
+					for (let j = 0; j < this.seatCol; j++) {
315
+						if (oldArray[i][j].type === 1) {
316
+							oldArray[i][j].type = 0
317
+						}
318
+					}
319
+				}
320
+				this.seatArray = oldArray;
321
+			},
322
+			//选定且购买座位
323
+			buySeat: function() {
324
+				console.log("===SelectNum",this.SelectNum);
325
+				if (this.SelectNum === 0) {
326
+					return
327
+				}
328
+				let oldArray = [];
329
+				for (let i = 0; i < this.seatRow; i++) {
330
+					for (let j = 0; j < this.seatCol; j++) {
331
+						if (this.seatArray[i][j].type === 1) {
332
+							oldArray.push(this.seatArray[i][j].SeatCode)
333
+						}
334
+					}
335
+				}
336
+				
337
+				console.log("===oldArray",oldArray);
338
+				// uni.navigateTo({
339
+				// 	url:'/subPages/pages/movies/moviesOrder'
340
+				// })
341
+			},
342
+			//处理座位选择逻辑
343
+			handleChooseSeat: function(row, col) {
344
+				
345
+				
346
+				let seatValue = this.seatArray[row][col].type;
347
+				let newArray = this.seatArray;
348
+				//如果是已购座位,直接返回
349
+				if (seatValue === 2 || seatValue === -1) return
350
+				//如果是已选座位点击后变未选
351
+				if (seatValue === 1) {
352
+					if(col % 2 ==0){ //偶数
353
+						newArray[row][col].type = 0
354
+						newArray[row][col-1].type = 0
355
+					}else {
356
+						newArray[row][col].type = 0
357
+						newArray[row][col+1].type = 0
358
+					}
359
+					this.SelectNum--
360
+					this.getOptArr(newArray[row][col], 0)
361
+				} else if (seatValue === 0) {
362
+					console.log("===SelectNum",this.SelectNum);
363
+					if(this.SelectNum==4){
364
+						uni.showToast({
365
+							title:'每次最多只能选择4个座位',
366
+							icon:'none'
367
+						})
368
+						return
369
+					}
370
+					
371
+					if(col % 2 ==0){ //偶数
372
+						newArray[row][col].type = 1
373
+						newArray[row][col-1].type = 1
374
+					}else {
375
+						newArray[row][col].type = 1
376
+						newArray[row][col+1].type = 1
377
+					}
378
+					this.SelectNum++
379
+					this.getOptArr(newArray[row][col], 1)
380
+					
381
+					
382
+				}
383
+				//必须整体更新二维数组,Vue无法检测到数组某一项更新,必须slice复制一个数组才行
384
+				this.seatArray = newArray.slice();
385
+			
386
+			},
387
+			//处理已选座位数组
388
+			getOptArr: function(item, type) {
389
+				let optArr = this.optArr
390
+				if (type === 1) {
391
+					optArr.push(item)
392
+					console.log("===optArr",optArr);
393
+				} else if (type === 0) {
394
+					let arr = []
395
+					optArr.forEach(v => {
396
+						if (v.SeatCode !== item.SeatCode) {
397
+							arr.push(v)
398
+						}
399
+					})
400
+					optArr = arr
401
+				}
402
+				this.optArr = optArr.slice()
403
+			},
404
+			//推荐选座,参数是推荐座位数目,
405
+			smartChoose: function(num) {
406
+				console.log('num===', num)
407
+				// 先重置
408
+				this.resetSeat()
409
+				//找到影院座位水平垂直中间位置的后一排
410
+				let rowStart = parseInt((this.seatRow - 1) / 2, 10) + 1;
411
+				//先从中间排往后排搜索
412
+				let backResult = this.searchSeatByDirection(rowStart, this.seatRow - 1, num);
413
+				if (backResult.length > 0) {
414
+					this.chooseSeat(backResult);
415
+					this.SelectNum += num
416
+					return
417
+				}
418
+				//再从中间排往前排搜索
419
+				let forwardResult = this.searchSeatByDirection(rowStart - 1, 0, num);
420
+				if (forwardResult.length > 0) {
421
+					this.chooseSeat(forwardResult);
422
+					this.SelectNum += num
423
+					return
424
+				}
425
+				//提示用户无合法位置可选
426
+				alert('无合法位置可选!')
427
+			
428
+			},
429
+			
430
+			//搜索函数,参数:fromRow起始行,toRow终止行,num推荐座位数
431
+			searchSeatByDirection: function(fromRow, toRow, num) {
432
+				/*
433
+				 * 推荐座位规则
434
+				 * (1)初始状态从座位行数的一半处的后一排的中间开始向左右分别搜索,取离中间最近的,如果满足条件,
435
+				 *    记录下该结果离座位中轴线的距离,后排搜索完成后取距离最小的那个结果座位最终结果,优先向后排进行搜索,
436
+				 *    后排都没有才往前排搜,前排逻辑同上
437
+				 *
438
+				 * (2)只考虑并排且连续的座位,不能不在一排或者一排中间有分隔
439
+				 *
440
+				 * */
441
+
442
+				/*
443
+				 * 保存当前方向搜索结果的数组,元素是对象,result是结果数组,offset代表与中轴线的偏移距离
444
+				 * {
445
+				 *   result:Array([x,y])
446
+				 *   offset:Number
447
+				 * }
448
+				 *
449
+				 */
450
+				let currentDirectionSearchResult = [];
451
+
452
+				let largeRow = fromRow > toRow ? fromRow : toRow,
453
+					smallRow = fromRow > toRow ? toRow : fromRow;
454
+
455
+				for (let i = smallRow; i <= largeRow; i++) {
456
+					//每一排的搜索,找出该排里中轴线最近的一组座位
457
+					let tempRowResult = [],
458
+						minDistanceToMidLine = Infinity;
459
+					for (let j = 0; j <= this.seatCol - num; j++) {
460
+						//如果有合法位置
461
+						if (this.checkRowSeatContinusAndEmpty(i, j, j + num - 1)) {
462
+							//计算该组位置距离中轴线的距离:该组位置的中间位置到中轴线的距离
463
+							let resultMidPos = parseInt((j + num / 2), 10);
464
+							let distance = Math.abs(parseInt(this.seatCol / 2) - resultMidPos);
465
+							//如果距离较短则更新
466
+							if (distance < minDistanceToMidLine) {
467
+								minDistanceToMidLine = distance;
468
+								//该行的最终结果
469
+								tempRowResult = this.generateRowResult(i, j, j + num - 1)
470
+							}
471
+						}
472
+					}
473
+					//保存该行的最终结果
474
+					currentDirectionSearchResult.push({
475
+						result: tempRowResult,
476
+						offset: minDistanceToMidLine
477
+					})
478
+				}
479
+
480
+				//处理后排的搜索结果:找到距离中轴线最短的一个
481
+				//注意这里的逻辑需要区分前后排,对于后排是从前往后,前排则是从后往前找
482
+				let isBackDir = fromRow < toRow;
483
+				let finalReuslt = [],
484
+					minDistanceToMid = Infinity;
485
+				if (isBackDir) {
486
+					//后排情况,从前往后
487
+					currentDirectionSearchResult.forEach((item) => {
488
+						if (item.offset < minDistanceToMid) {
489
+							finalReuslt = item.result;
490
+							minDistanceToMid = item.offset;
491
+						}
492
+					});
493
+				} else {
494
+					//前排情况,从后往前找
495
+					currentDirectionSearchResult.reverse().forEach((item) => {
496
+						if (item.offset < minDistanceToMid) {
497
+							finalReuslt = item.result;
498
+							minDistanceToMid = item.offset;
499
+						}
500
+					})
501
+				}
502
+
503
+				//直接返回结果
504
+				return finalReuslt
505
+			},
506
+
507
+			/*辅助函数,判断每一行座位从i列到j列是否全部空余且连续
508
+			 *
509
+			 */
510
+			checkRowSeatContinusAndEmpty: function(rowNum, startPos, endPos) {
511
+				let isValid = true;
512
+				for (let i = startPos; i <= endPos; i++) {
513
+					if (this.seatArray[rowNum][i].type !== 0) {
514
+						isValid = false;
515
+						break;
516
+					}
517
+				}
518
+				return isValid
519
+			},
520
+			//辅助函数:返回每一行的某个合理位置的座位数组
521
+			generateRowResult: function(row, startPos, endPos) {
522
+				let result = [];
523
+				for (let i = startPos; i <= endPos; i++) {
524
+					result.push([row, i])
525
+				}
526
+				return result
527
+			},
528
+			//辅助函数:智能推荐的选座操作
529
+			chooseSeat: function(result) {
530
+				let opt = this.optArr
531
+				let oldArray = this.seatArray.slice();
532
+				for (let i = 0; i < result.length; i++) {
533
+					//选定座位
534
+					oldArray[result[i][0]][result[i][1]].type = 1
535
+					this.optArr.push(oldArray[result[i][0]][result[i][1]])
536
+				}
537
+				this.seatArray = oldArray;
538
+			},
539
+		}
540
+	}
541
+</script>
542
+
543
+<style lang="scss" scoped>
544
+	.p-all-10{
545
+		padding: 10rpx;
546
+	}
547
+	.ml-10 {
548
+		margin-left: 10rpx;
549
+	}
550
+
551
+	.m-0-10 {
552
+		margin: 0 10rpx;
553
+	}
554
+
555
+	.bg-unbtn {
556
+		background-color: #f9abb3;
557
+	}
558
+
559
+	.bg-red-1 {
560
+		background-color: #F45664;
561
+	}
562
+
563
+	.br-10 {
564
+		border-radius: 10rpx;
565
+	}
566
+
567
+	.ml-20 {
568
+		margin-left: 20rpx;
569
+	}
570
+
571
+	.mb-20 {
572
+		margin-bottom: 20rpx;
573
+	}
574
+
575
+	.p-all-32 {
576
+		padding: 32rpx;
577
+	}
578
+
579
+	.fd-cr {
580
+		flex-direction: column-reverse;
581
+		/* 主轴方向从下到上,默认从左到右 */
582
+	}
583
+
584
+	.bottom-bar {
585
+		bottom: var(--window-bottom);
586
+	}
587
+
588
+	.color-fff {
589
+		color: #fff
590
+	}
591
+
592
+	.br-15 {
593
+		border-radius: 15rpx;
594
+	}
595
+
596
+	.over-h {
597
+		overflow: hidden;
598
+	}
599
+
600
+	.dp-ib {
601
+		display: inline-block;
602
+	}
603
+
604
+	.mt-20 {
605
+		margin-top: 20rpx;
606
+	}
607
+
608
+	.pa-v-2 {
609
+		/* 定位垂直对齐 */
610
+		left: 50%;
611
+		transform: translateX(-50%)
612
+	}
613
+
614
+	.b-d-1 {
615
+		border: 1px dashed #e5e5e5;
616
+	}
617
+
618
+	.w-100 {
619
+		width: 100%;
620
+	}
621
+
622
+	.h-100 {
623
+		height: 100%;
624
+	}
625
+
626
+	.bg-f1 {
627
+		background-color: #f1f1f1;
628
+	}
629
+
630
+	.h-100vh {
631
+		height: 100vh;
632
+	}
633
+
634
+	.pt-f {
635
+		position: fixed;
636
+	}
637
+
638
+	.left-0 {
639
+		left: 0;
640
+	}
641
+
642
+	.p-0-32 {
643
+		padding: 0 32rpx;
644
+	}
645
+
646
+	.pt-20 {
647
+		padding-top: 20rpx;
648
+	}
649
+
650
+	.bg-white {
651
+		background-color: #fff;
652
+	}
653
+
654
+	.z1000 {
655
+		z-index: 1000;
656
+	}
657
+
658
+	.fz-34 {
659
+		font-size: 34rpx;
660
+	}
661
+
662
+	.fw-b {
663
+		font-weight: bold;
664
+	}
665
+
666
+	.mt-10 {
667
+		margin-top: 10rpx;
668
+	}
669
+
670
+	.fz-28 {
671
+		font-size: 28rpx;
672
+	}
673
+
674
+	.color-666 {
675
+		color: #666666
676
+	}
677
+
678
+	.dp-f {
679
+		display: flex;
680
+	}
681
+
682
+	.jc-c {
683
+		justify-content: center;
684
+	}
685
+
686
+	.ai-c {
687
+		align-items: center;
688
+	}
689
+
690
+	.fz-22 {
691
+		font-size: 22rpx;
692
+	}
693
+
694
+	.color-333 {
695
+		color: #333333
696
+	}
697
+
698
+	.m-0-a {
699
+		margin: 0 auto;
700
+	}
701
+
702
+	.mt-48 {
703
+		margin-top: 48rpx;
704
+	}
705
+
706
+	.fz-20 {
707
+		font-size: 20rpx;
708
+	}
709
+
710
+	.color-999 {
711
+		color: #999999
712
+	}
713
+
714
+	.b-1 {
715
+		border: 1px solid #CCCCCC;
716
+	}
717
+
718
+	.br-5 {
719
+		border-radius: 5rpx;
720
+	}
721
+
722
+	.Stage {
723
+		background-color: #dddddd;
724
+		width: 380rpx;
725
+		height: 34rpx;
726
+		transform: perspective(34rpx) rotateX(-10deg);
727
+		margin: 0 auto;
728
+	}
729
+
730
+	.bg-line {
731
+		background-color: rgba(0, 0, 0, 0.3);
732
+	}
733
+
734
+	.sel-seat {
735
+		background: url('/static/selected.png') center center no-repeat;
736
+		background-size: 100% 100%;
737
+	}
738
+	
739
+	.unsel-seat {
740
+		background: url('/static/unselected.png') center center no-repeat;
741
+		background-size: 100% 100%;
742
+	}
743
+	
744
+	.bought-seat {
745
+		background: url('/static/bought.png') center center no-repeat;
746
+		background-size: 100% 100%;
747
+	}
748
+</style>
749
+<route lang="yaml">
750
+style:
751
+  navigationBarTitleText: 选择座位
752
+  enablePullDownRefresh: true
753
+</route>

+ 209 - 0
src/subPages/pages/movies/cityList.vue

@@ -0,0 +1,209 @@
1
+<template>
2
+	<view class="city-container">
3
+
4
+		<scroll-view class="scroll-content" scroll-y="true" :scroll-into-view='currentTagId'
5
+			scroll-with-animation="true">
6
+			<view class="scroll-item">
7
+				<input placeholder="输入城市名称查询" class="input-sty" type="text" :value="searchKey" @input="searchChange" />
8
+				<view v-if="!isSearch" class="list-content" v-for="(item,index) in cityName" :key="'city-item-'+index">
9
+					<view class="list-tag" :id="index">{{index}}</view>
10
+					<view @click="onCityClick(childItem)" class="list-city-content" v-for="(childItem,childIndex) in item"
11
+						:key="'child-city-item-'+childIndex">
12
+						<view class="list-city">{{childItem.city_name}}</view>
13
+						<view class="city-line" v-if="childIndex != item.length -1"></view>
14
+					</view>
15
+				</view>
16
+               <view v-if="isSearch" class="list-content" v-for="(item,index) in searchList" :key="'city-item-'+index">
17
+					<view class="list-city-content" @click="onCityClick(item)">
18
+						<view class="list-city">{{item.city_name}}</view>
19
+						<view class="city-line" v-if="index != searchList.length -1"></view>
20
+					</view>
21
+				</view>
22
+			</view>
23
+		</scroll-view>
24
+
25
+		<view class="tag-list" v-if="!isSearch">
26
+			<view @click.stop="onTagClick(item)" :key="'tag-item-'+index" class="tag-name"
27
+				v-for="(item,index) in initialList">{{item}}</view>
28
+		</view>
29
+
30
+	</view>
31
+</template>
32
+
33
+<script setup>
34
+	import {
35
+		useUserStore
36
+	} from '~/stores/userStore'
37
+	import {
38
+		getLongitudeAndLatitude,
39
+	} from "~/apis/common";
40
+	import {
41
+		apiGetCityList,
42
+	} from '~/apis/movies'
43
+	import {
44
+		USER_LATITUDE,
45
+		USER_LONGITUDE,
46
+		USER_CHOOSE_CITY,
47
+		USER_CHOOSE_CITY_CODE
48
+	} from '~/constants/index'
49
+
50
+
51
+	const searchKey = ref('')
52
+	const cityName = ref('')
53
+	const initialList = ref([])
54
+	const currentTagId = ref('A')
55
+	const isSearch = ref(false)
56
+	const searchList = ref([])
57
+
58
+	onLoad(() => {
59
+		getCityList()
60
+	})
61
+
62
+	function searchChange(e) {
63
+		searchKey.value = e.detail.value
64
+		if (searchKey.value) {
65
+			isSearch.value = true
66
+			for(let item in cityName.value){
67
+				if (cityName.value.hasOwnProperty(item)) {
68
+				        let value = cityName.value[item];
69
+						for (var i = 0; i < value.length; i++) {
70
+							let _info = value[i]
71
+							if(_info.city_name.includes(searchKey.value)){
72
+								searchList.value.push(_info)
73
+							}
74
+						}
75
+						
76
+				    }
77
+			}
78
+			
79
+		} else {
80
+			isSearch.value = false
81
+			searchList.value=[]
82
+		}
83
+	}
84
+
85
+	function onTagClick(item) {
86
+		currentTagId.value = item
87
+	}
88
+	
89
+	async  function onCityClick (item) {
90
+		//uni.showLoading({title:''})
91
+		 uni.setStorageSync(USER_CHOOSE_CITY,item.city_name)
92
+		uni.setStorageSync(USER_CHOOSE_CITY_CODE,item.city_sign)
93
+	  	await getLongitudeAndLatitude(item.city_name)
94
+		//uni.hideLoading()
95
+		uni.$emit('cityInfo',item)
96
+		uni.navigateBack()
97
+	}
98
+
99
+	function getCityList() {
100
+		uni.showLoading()
101
+		apiGetCityList().then(res => {
102
+			cityName.value = res.city_name
103
+			initialList.value = res.initial
104
+			uni.hideLoading()
105
+		})
106
+	}
107
+</script>
108
+
109
+<style lang="scss" scoped>
110
+	.city-container {
111
+		display: flex;
112
+		flex-direction: column;
113
+		min-height: 100VH;
114
+		background-color: #f8f8f8;
115
+		box-sizing: border-box;
116
+		position: relative;
117
+
118
+		.tag-list {
119
+			position: fixed;
120
+			right: 0;
121
+			margin-top: 130rpx;
122
+
123
+
124
+			.tag-name {
125
+				width: 60rpx;
126
+				color: #538aff;
127
+				padding-top: 10rpx;
128
+				padding-bottom: 10rpx;
129
+				font-size: 24rpx;
130
+				display: flex;
131
+				flex-direction: row;
132
+				align-items: center;
133
+				justify-content: center;
134
+			}
135
+		}
136
+
137
+		.scroll-content {
138
+			display: flex;
139
+			flex-direction: column;
140
+			height: 100VH;
141
+			width: 100%;
142
+
143
+			.scroll-item {
144
+				display: flex;
145
+				flex-direction: column;
146
+				height: 2000rpx;
147
+				width: 100%;
148
+			}
149
+
150
+			.input-sty {
151
+				height: 80rpx;
152
+				min-height: 80rpx;
153
+				margin: 20rpx;
154
+				padding-left: 20rpx;
155
+				padding-right: 20rpx;
156
+				font-size: 28rpx;
157
+				color: #333;
158
+				box-sizing: border-box;
159
+				border-radius: 10rpx;
160
+				border: 1rpx solid #538aff;
161
+			}
162
+
163
+			.list-content {
164
+				display: flex;
165
+				flex-direction: column;
166
+
167
+				.list-tag {
168
+					font-size: 26rpx;
169
+					color: #999;
170
+					margin-left: 20rpx;
171
+					margin-top: 20rpx;
172
+					margin-bottom: 20rpx;
173
+				}
174
+
175
+
176
+				.list-city-content {
177
+					display: flex;
178
+					flex-direction: column;
179
+					width: 100%;
180
+				}
181
+
182
+				.list-city {
183
+					width: 100%;
184
+					background-color: #fff;
185
+					height: 98rpx;
186
+					padding-left: 20rpx;
187
+					display: flex;
188
+					flex-direction: column;
189
+					justify-content: center;
190
+					color: #333;
191
+					font-size: 28rpx;
192
+				}
193
+
194
+				.city-line {
195
+					width: 100%;
196
+					height: 1rpx;
197
+					background-color: #ebebeb;
198
+				}
199
+			}
200
+		}
201
+
202
+	}
203
+</style>
204
+
205
+<route lang="yaml">
206
+style:
207
+  navigationBarTitleText: 选择城市
208
+  enablePullDownRefresh: true
209
+</route>

+ 680 - 0
src/subPages/pages/movies/moviesIndex.vue

@@ -0,0 +1,680 @@
1
+<template>
2
+	<view class="movies-container">
3
+
4
+		<view class="top-content">
5
+			<view class="head-content">
6
+				<view class="city-content" @click="onChooseCityClick">
7
+					<text class="city-name">{{currentCity}}</text>
8
+					<image class="down-arrow" src="/static/icon/downArrow.png" mode="widthFix"></image>
9
+				</view>
10
+				<view class="search-content">
11
+					<image class="search-icon" src="https://cdn.bjtdba.com/vod/image/2023-02-15/20230215112840149.png"
12
+						mode="widthFix"></image>
13
+					<input class="input-ty" type="text" :value="searchKey" :placeholder="currentIndex==1?'搜索影院':'搜索电影'"
14
+						@input="oninputChange" />
15
+				</view>
16
+			</view>
17
+
18
+			<view class="fuc-content">
19
+				<view class="fuc-item" @click="onOrderListClick(1)">
20
+					<image class="fuc-icon" src="/static/icon/movies1.png" mode="widthFix"></image>
21
+					<text class="fuc-title">取票码</text>
22
+				</view>
23
+				<view class="fuc-item" @click="onOrderListClick(0)">
24
+					<image class="fuc-icon" src="/static/icon/movies2.png" mode="widthFix"></image>
25
+					<text class="fuc-title">订单</text>
26
+				</view>
27
+				<view class="fuc-item" @click="onCustomerClick">
28
+					<image class="fuc-icon" src="/static/icon/movies3.png" mode="widthFix"></image>
29
+					<text class="fuc-title">客服</text>
30
+				</view>
31
+			</view>
32
+
33
+			<view class="tab-content">
34
+				<view class="tab-item" @click="onTabClick(0)">
35
+					<text :class="currentIndex==0?'tab-title':'tab-default-title'">正在热映</text>
36
+					<view :class="currentIndex==0?'tab-line':'tab-default-line'"></view>
37
+				</view>
38
+				<view class="tab-item" @click="onTabClick(1)">
39
+					<text :class="currentIndex==1?'tab-title':'tab-default-title'">附件影院</text>
40
+					<view :class="currentIndex==1?'tab-line':'tab-default-line'"></view>
41
+				</view>
42
+				<view class="tab-item" @click="onTabClick(2)">
43
+					<text :class="currentIndex==2?'tab-title':'tab-default-title'">即将上映</text>
44
+					<view :class="currentIndex==2?'tab-line':'tab-default-line'"></view>
45
+				</view>
46
+			</view>
47
+		</view>
48
+
49
+		<view v-if="currentIndex!=1">
50
+			<view class="list-item" v-for="(item,index) in moviesList" :key="'movies-item-'+index" @click="onItemClick(item)">
51
+				<image class="item-img" :src="item.cover_img" mode="aspectFill"></image>
52
+				<view class="info-item">
53
+					<view class="title-content">
54
+						<text class="item-title">{{item.film_name}}</text>
55
+						<view class="item-tag-content-x" v-if="item.version">
56
+							<text class="item-tag-0">{{item.version.split(' ')[0]}}</text>
57
+							<text  v-if="item.version.split(' ').length==2" class="item-tag-1">{{item.version.split(' ')[1]}}</text>
58
+						</view>
59
+					</view>
60
+					<view class="title-content">
61
+						<text class="item-des">评分:</text>
62
+						<text class="item-red-des">{{item.grade}}</text>
63
+					</view>
64
+					<view class="title-content">
65
+						<text class="item-des">导演:{{item.director_name}}</text>
66
+					</view>
67
+					<view class="title-content">
68
+						<text class="item-des">主演:</text>
69
+						<text :class="currentIndex==0 ?'item-people':'item-people-x'">{{item.actors_name}}</text>
70
+					</view>
71
+					<view class="title-content">
72
+						<text class="item-date">{{item.publish_date}}</text>
73
+						<text class="item-des">上映</text>
74
+					</view>
75
+				</view>
76
+				<view v-if="currentIndex==0" class="right-btn">特惠购票</view>
77
+			</view>
78
+		</view>
79
+
80
+		<view v-else>
81
+			<view class="list-item" v-for="(item,index) in cinemaList" :key="'movies-item-'+index" @click="onItemClick(item)">
82
+				<view class="info-item">
83
+					<view class="title-content">
84
+						<text class="item-title-x">{{item.cinema_name}}</text>
85
+						<view class="price-child-content" v-if="item.price">
86
+							<text class="item-price">¥{{item.price}}</text>
87
+							<text class="item-price-unit">起</text>
88
+						</view>
89
+
90
+					</view>
91
+					<view class="title-content">
92
+						<text class="item-people-s">{{item.address}}</text>
93
+						<text class="item-jl">{{item.distance}}km</text>
94
+					</view>
95
+				</view>
96
+			</view>
97
+		</view>
98
+		
99
+		
100
+		 <CXBEmpty  v-if="(currentIndex!=1 && moviesList.length==0) "></CXBEmpty>
101
+          <CXBEmpty  v-if="(currentIndex==1 && cinemaList.length==0) "></CXBEmpty>
102
+
103
+	</view>
104
+</template>
105
+
106
+<script setup>
107
+	import {
108
+		getLocalX,
109
+		getRegeoX
110
+	} from "~/apis/common";
111
+	import CXBEmpty from "~/components/CXBEmpty/CXBEmpty.vue";
112
+	import {
113
+		USER_LATITUDE,
114
+		USER_LONGITUDE,
115
+		USER_CHOOSE_CITY,
116
+		USER_CHOOSE_CITY_CODE
117
+	} from '~/constants/index'
118
+
119
+	import {
120
+		apiGetMovieList,
121
+		apiGetCinemaList,
122
+		apiGetCityList
123
+	} from '~/apis/movies'
124
+	
125
+	
126
+	
127
+	import {
128
+		IMG_CDN_URL
129
+	} from '~/config/app.ts'
130
+	const searchKey = ref('')
131
+	const currentIndex = ref(0)
132
+	const moviesList = ref([])
133
+	const cinemaList = ref([])
134
+	const currentCity =ref('定位中...')
135
+	
136
+	const state = reactive({
137
+		page: 1,
138
+		limit: 10,
139
+		keyword: '',
140
+		count: 1,
141
+		cityCode:''
142
+	})
143
+
144
+	onLoad( (option) => {
145
+	let phone = uni.getStorageSync('USER_INFO_PHONE')
146
+		let city=  uni.getStorageSync(USER_CHOOSE_CITY)
147
+	    let cityCode = 	uni.setStorageSync(USER_CHOOSE_CITY_CODE )
148
+		if(city && cityCode){
149
+			currentCity.value =city
150
+			state.cityCode = cityCode
151
+			getList()
152
+		}else {
153
+			getLocalX((res)=>{
154
+				if(res){
155
+					getRegeoX((res)=>{
156
+						currentCity.value =res
157
+						getCityList()
158
+					})
159
+				}
160
+			})
161
+		}
162
+		
163
+		uni.$on('cityInfo',(res)=>{
164
+			currentCity.value =res.city_name
165
+			state.cityCode =res.city_code
166
+			if(currentIndex.value ==1){
167
+				getCinemaList()
168
+			}
169
+		})
170
+		
171
+	})
172
+	
173
+	function getCityList() {
174
+		uni.showLoading({title:'加载中...',mask:true})
175
+		apiGetCityList().then(res => {
176
+		for (var key in res.city_name) {
177
+			if (res.city_name.hasOwnProperty(key)) {
178
+				var element = res.city_name[key];
179
+				for (let s of element) {
180
+					if(s.city_name ==currentCity.value){
181
+						state.cityCode = s.city_sign
182
+						uni.setStorageSync(USER_CHOOSE_CITY_CODE,state.cityCode )
183
+						break
184
+					}
185
+				}
186
+			}
187
+		}
188
+		console.log("===state.cityCode",state.cityCode);
189
+		getList()
190
+		}).finally(()=>{uni.hideLoading()})
191
+	}
192
+	
193
+	function onCustomerClick(){
194
+		uni.openCustomerServiceChat({
195
+			extInfo: {
196
+				url: 'https://work.weixin.qq.com/kfid/kfc8bd3f11a28aa81db',
197
+			},
198
+			corpId: 'wwaeb55681929a37ae',
199
+			success: (res) => {
200
+				console.log(res)
201
+			},
202
+			fail: (res) => {
203
+				console.log(res)
204
+			},
205
+		})
206
+		
207
+		
208
+	}
209
+	
210
+	function onOrderListClick(position){
211
+		uni.navigateTo({
212
+			url:`/subPages/pages/movies/orderList?type=${position}`
213
+		})
214
+	}
215
+	
216
+	function onItemClick (item){
217
+		if(currentIndex.value!=1){
218
+			uni.navigateTo({
219
+				url:`/subPages/pages/movies/nearbyCinemas?info=${encodeURIComponent(JSON.stringify(item))}&type=${currentIndex.value}`
220
+			})
221
+		}else {
222
+			uni.navigateTo({
223
+				url:`/subPages/pages/movies/moviesTicketList?info=${encodeURIComponent(JSON.stringify(item))}`
224
+			})
225
+		}
226
+		
227
+	}
228
+
229
+	
230
+	function onChooseCityClick(){
231
+		uni.navigateTo({
232
+			url:'/subPages/pages/movies/cityList'
233
+		})
234
+	}
235
+
236
+	function getCinemaList() {
237
+		let latitude = uni.getStorageSync(USER_LATITUDE)
238
+		let longitude = uni.getStorageSync(USER_LONGITUDE)
239
+		uni.showLoading()
240
+		let params =
241
+			`page=${state.page}&limit=${state.limit}&longitude=${longitude}&latitude=${latitude}&cinema_name=${searchKey.value}`
242
+		apiGetCinemaList(params).then(res => {
243
+			state.count = res.count
244
+			if (state.page === 1) {
245
+				cinemaList.value = res.cinema_list
246
+			} else {
247
+				cinemaList.value.push(...res.cinema_list)
248
+			}
249
+			uni.hideLoading()
250
+		})
251
+	}
252
+
253
+	function getList() {
254
+		if (currentIndex.value == 1) {
255
+			getCinemaList()
256
+		} else {
257
+			getmoviesList()
258
+		}
259
+	}
260
+
261
+	function getmoviesList() {
262
+		uni.showLoading()
263
+		let params = `page=${state.page}&limit=${state.limit}&type=${currentIndex.value==2?1:0}&film_name=${searchKey.value}`
264
+		apiGetMovieList(params).then(res => {
265
+			state.count = res.count
266
+			console.log("===state.cityCode11");
267
+			if (state.page === 1) {
268
+				moviesList.value = res.film_list
269
+			} else {
270
+				moviesList.value.push(...res.film_list)
271
+			}
272
+			uni.hideLoading()
273
+		})
274
+	}
275
+
276
+	function oninputChange(e) {
277
+		searchKey.value = e.detail.value
278
+		getList()
279
+	}
280
+
281
+	function onTabClick(position) {
282
+		currentIndex.value = position
283
+		state.page = 1
284
+		state.count = 1
285
+		searchKey.value = ''
286
+		if (position == 1) {
287
+			getCinemaList()
288
+		} else {
289
+			getmoviesList()
290
+		}
291
+	}
292
+
293
+	onPullDownRefresh(() => {
294
+		state.page = 1
295
+		getList()
296
+		uni.stopPullDownRefresh()
297
+	})
298
+
299
+	onReachBottom(() => {
300
+		if (moviesList.value.length < state.count) {
301
+			state.page += 1
302
+			getList()
303
+		}
304
+	})
305
+</script>
306
+
307
+<style lang="scss" scoped>
308
+	.movies-container {
309
+		display: flex;
310
+		padding-bottom: 60rpx;
311
+		flex-direction: column;
312
+		min-height: 100VH;
313
+		background-color: #f8f8f8;
314
+		box-sizing: border-box;
315
+		position: relative;
316
+		padding-top: 350rpx;
317
+		
318
+		.empty-content{
319
+			margin-top: 500rpx;
320
+		}
321
+
322
+		.top-content {
323
+			display: flex;
324
+			flex-direction: column;
325
+			position: fixed;
326
+			top: 0;
327
+			width: 100%;
328
+			z-index: 66;
329
+			left: 0;
330
+		}
331
+
332
+		.list-item {
333
+			display: flex;
334
+			flex-direction: row;
335
+			align-items: center;
336
+			padding: 24rpx 18rpx;
337
+			background-color: #fff;
338
+			margin-top: 24rpx;
339
+			border-radius: 10rpx;
340
+			position: relative;
341
+			margin-left: 22rpx;
342
+			margin-right: 22rpx;
343
+
344
+			.item-img {
345
+				width: 174rpx;
346
+				min-width: 174rpx;
347
+				height: 234rpx;
348
+				background-color: #f5f5f5;
349
+				border-radius: 20rpx;
350
+				margin-right: 22rpx;
351
+			}
352
+
353
+			.right-btn {
354
+				width: 148rpx;
355
+				height: 64rpx;
356
+				margin-top: 40rpx;
357
+				line-height: 64rpx;
358
+				text-align: center;
359
+				background-color: #eb4340;
360
+				color: #fff;
361
+				font-size: 28rpx;
362
+				border-radius: 64rpx;
363
+				position: absolute;
364
+				right: 0;
365
+				font-weight: bolder;
366
+				margin-right: 26rpx;
367
+			}
368
+
369
+			.right-black-btn {
370
+				width: 148rpx;
371
+				margin-top: 40rpx;
372
+				height: 64rpx;
373
+				line-height: 64rpx;
374
+				text-align: center;
375
+				border-radius: 64rpx;
376
+				background-color: #000;
377
+				color: #fff;
378
+				font-size: 28rpx;
379
+				font-weight: bolder;
380
+				position: absolute;
381
+				margin-right: 26rpx;
382
+				right: 0;
383
+			}
384
+
385
+			.info-item {
386
+				display: flex;
387
+				flex-direction: column;
388
+				width: 100%;
389
+
390
+				.title-content {
391
+					display: flex;
392
+					flex-direction: row;
393
+					margin-bottom: 12rpx;
394
+					align-items: center;
395
+					width: 100%;
396
+
397
+					.item-title {
398
+						font-size: 32rpx;
399
+						font-weight: bolder;
400
+						color: #333;
401
+						margin-right: 10rpx;
402
+						max-width: 370rpx;
403
+						white-space: nowrap;
404
+						/* 防止文本换行 */
405
+						overflow: hidden;
406
+						/* 隐藏溢出的内容 */
407
+						text-overflow: ellipsis;
408
+						/* 显示省略号来代表被修剪的文本 */
409
+					}
410
+
411
+					.price-child-content {
412
+						display: flex;
413
+						flex-direction: row;
414
+						align-items: center;
415
+						flex: 1;
416
+						justify-content: flex-end;
417
+					}
418
+
419
+					.item-title-x {
420
+						font-size: 32rpx;
421
+						font-weight: bolder;
422
+						color: #333;
423
+						flex: 1;
424
+						margin-right: 10rpx;
425
+						max-width: 550rpx;
426
+						white-space: nowrap;
427
+						/* 防止文本换行 */
428
+						overflow: hidden;
429
+						/* 隐藏溢出的内容 */
430
+						text-overflow: ellipsis;
431
+						/* 显示省略号来代表被修剪的文本 */
432
+					}
433
+
434
+					.item-people-s {
435
+						font-size: 22rpx;
436
+						color: #666;
437
+						max-width: 550rpx;
438
+						white-space: nowrap;
439
+						/* 防止文本换行 */
440
+						overflow: hidden;
441
+						/* 隐藏溢出的内容 */
442
+						text-overflow: ellipsis;
443
+						/* 显示省略号来代表被修剪的文本 */
444
+					}
445
+
446
+					.item-jl {
447
+						font-size: 22rpx;
448
+						color: #999;
449
+						flex: 1;
450
+						text-align: right;
451
+						line-height: 22rpx;
452
+						height: 22rpx;
453
+					}
454
+
455
+					.item-price {
456
+						font-size: 26rpx;
457
+						color: #df4743;
458
+						font-weight: bolder;
459
+					}
460
+
461
+					.item-price-unit {
462
+						font-size: 26rpx;
463
+						color: #999;
464
+						font-weight: bolder;
465
+					}
466
+
467
+					.item-red-des {
468
+						font-size: 28rpx;
469
+						color: #df4743;
470
+						font-weight: bolder;
471
+					}
472
+
473
+					.item-des {
474
+						font-size: 22rpx;
475
+						color: #999;
476
+					}
477
+
478
+					.item-date {
479
+						font-size: 22rpx;
480
+						color: #666;
481
+					}
482
+
483
+					.item-people {
484
+						font-size: 22rpx;
485
+						color: #999;
486
+						max-width: 240rpx;
487
+						white-space: nowrap;
488
+						/* 防止文本换行 */
489
+						overflow: hidden;
490
+						/* 隐藏溢出的内容 */
491
+						text-overflow: ellipsis;
492
+						/* 显示省略号来代表被修剪的文本 */
493
+					}
494
+
495
+					.item-people-x {
496
+						font-size: 22rpx;
497
+						color: #999;
498
+						max-width: 370rpx;
499
+						white-space: nowrap;
500
+						/* 防止文本换行 */
501
+						overflow: hidden;
502
+						/* 隐藏溢出的内容 */
503
+						text-overflow: ellipsis;
504
+						/* 显示省略号来代表被修剪的文本 */
505
+					}
506
+
507
+					.item-tag-content-x {
508
+						display: flex;
509
+						flex-direction: row;
510
+						align-items: center;
511
+						height: 32rpx;
512
+						border: 1rpx solid #999999;
513
+						border-radius: 6rpx;
514
+
515
+						.item-tag-0 {
516
+							font-size: 16rpx;
517
+							color: #fff;
518
+							height: 32rpx;
519
+							background-color: #999;
520
+							padding-right: 6rpx;
521
+							padding-left: 6rpx;
522
+							line-height: 32rpx;
523
+							text-align: center;
524
+						}
525
+
526
+						.item-tag-1 {
527
+							font-size: 16rpx;
528
+							color: #999;
529
+							height: 32rpx;
530
+							padding-left: 6rpx;
531
+							padding-right: 6rpx;
532
+							line-height: 32rpx;
533
+							text-align: center;
534
+						}
535
+					}
536
+				}
537
+			}
538
+		}
539
+
540
+		.tab-content {
541
+			display: flex;
542
+			flex-direction: row;
543
+			align-items: center;
544
+			justify-content: space-around;
545
+			background-color: #fff;
546
+
547
+			.tab-item {
548
+				display: flex;
549
+				flex-direction: column;
550
+				flex: 1;
551
+				align-items: center;
552
+				position: relative;
553
+				padding-top: 20rpx;
554
+
555
+				.tab-title {
556
+					font-size: 36rpx;
557
+					color: #333;
558
+					font-weight: bolder;
559
+					margin-bottom: 30rpx;
560
+				}
561
+
562
+				.tab-default-title {
563
+					font-size: 32rpx;
564
+					color: #666;
565
+					font-weight: bolder;
566
+					margin-bottom: 30rpx;
567
+				}
568
+
569
+				.tab-default-line {
570
+					width: 40rpx;
571
+					height: 10rpx;
572
+					background-color: #fff;
573
+					position: absolute;
574
+					bottom: 0;
575
+					border-radius: 10rpx;
576
+					margin-bottom: 10rpx;
577
+				}
578
+
579
+				.tab-line {
580
+					width: 40rpx;
581
+					height: 10rpx;
582
+					background-color: #ff0000;
583
+					position: absolute;
584
+					bottom: 0;
585
+					margin-bottom: 10rpx;
586
+					border-radius: 10rpx;
587
+				}
588
+			}
589
+		}
590
+
591
+		.fuc-content {
592
+			display: flex;
593
+			flex-direction: row;
594
+			align-items: center;
595
+			background-color: #fff;
596
+			padding-top: 20rpx;
597
+			padding-bottom: 30rpx;
598
+			justify-content: space-around;
599
+
600
+			.fuc-item {
601
+				display: flex;
602
+				flex-direction: column;
603
+				flex: 1;
604
+				align-items: center;
605
+				justify-content: center;
606
+
607
+				.fuc-icon {
608
+					width: 50rpx;
609
+					height: 54rpx;
610
+				}
611
+
612
+				.fuc-title {
613
+					color: #333;
614
+					font-size: 24rpx;
615
+					margin-top: 24rpx;
616
+				}
617
+			}
618
+		}
619
+
620
+		.head-content {
621
+			display: flex;
622
+			flex-direction: row;
623
+			align-items: center;
624
+			background-color: #fff;
625
+			padding-top: 20rpx;
626
+			padding-bottom: 20rpx;
627
+
628
+			.city-content {
629
+				display: flex;
630
+				flex-direction: row;
631
+				align-items: center;
632
+
633
+				.city-name {
634
+					font-size: 32rpx;
635
+					color: #333;
636
+					padding-left: 30rpx;
637
+					font-weight: bolder;
638
+					margin-right: 12rpx;
639
+				}
640
+
641
+				.down-arrow {
642
+					width: 24rpx;
643
+					height: 18rpx;
644
+				}
645
+			}
646
+
647
+			.search-content {
648
+				display: flex;
649
+				flex-direction: row;
650
+				align-items: center;
651
+				background-color: #f5f5f5;
652
+				height: 60rpx;
653
+				flex: 1;
654
+				border-radius: 60rpx;
655
+				padding-left: 20rpx;
656
+				margin-left: 24rpx;
657
+				padding-right: 20rpx;
658
+				box-sizing: border-box;
659
+				margin-right: 30rpx;
660
+
661
+				.search-icon {
662
+					width: 40rpx;
663
+					height: 40rpx;
664
+				}
665
+
666
+				.input-ty {
667
+					font-size: 26rpx;
668
+					color: #333;
669
+					padding-left: 20rpx;
670
+				}
671
+			}
672
+		}
673
+	}
674
+</style>
675
+
676
+<route lang="yaml">
677
+style:
678
+  navigationBarTitleText: 电影专区
679
+  enablePullDownRefresh: true
680
+</route>

+ 523 - 0
src/subPages/pages/movies/moviesOrder.vue

@@ -0,0 +1,523 @@
1
+<template>
2
+	<view class="movies-oder-container" v-if="orderDetail">
3
+		<view class="card-content">
4
+			<view class="list-item">
5
+				<image class="item-img" :src="orderDetail.film.cover_img" mode="aspectFill"></image>
6
+				<view class="info-item">
7
+					<text class="item-title">{{orderDetail.film_name}}</text>
8
+					<text class="file-des mb-24-x">{{orderDetail.sched_time}} </text>
9
+					<text class="file-des mb-24-x">{{orderDetail.cinema_name}}</text>
10
+					<view class="title-content ">
11
+						<text class="file-des">{{orderDetail.hall_name}}</text>
12
+						<text class="file-des-x" :key="'seat-item-'+index"
13
+							v-for="(item,index) in orderDetail.sched_seat">{{item.seat_no}}</text>
14
+					</view>
15
+				</view>
16
+				<view class="timer-content">
17
+					<image class="timer-icon" src="/static/icon/timer_icon.png" mode="widthFix"></image>
18
+					<text class="timer-tx"> {{ formatTime(minutes) }}:{{ formatTime(seconds) }}</text>
19
+				</view>
20
+			</view>
21
+
22
+			<view class="hint-info">
23
+				<image class="close-icon" src="/static/icon/red_close.png" mode="widthFix"></image>
24
+				<text class="hint-tx">不支持退票</text>
25
+				<image class="close-icon" src="/static/icon/red_close.png" mode="widthFix"></image>
26
+				<text class="hint-tx-1">不支持改签</text>
27
+				<text class="hint-tx">共{{orderDetail.sched_seat.length}}张</text>
28
+				<!-- <text class="hint-tx">原价¥60</text> -->
29
+			</view>
30
+
31
+			<!-- <view class="discount-info">
32
+				<text class="discount-tx">本单已优惠</text>
33
+				<text class="discount-price">-3.6</text>
34
+			</view> -->
35
+			<view class="card-line"></view>
36
+
37
+
38
+			<view class="discount-info">
39
+				<text class="fare-tx">票价合计</text>
40
+				<text class="fare-price-unit">¥</text>
41
+				<text class="fare-price">{{orderDetail.order_price}}</text>
42
+			</view>
43
+		</view>
44
+
45
+		<view class="card-content">
46
+			<view class="discount-info">
47
+				<text class="discount-tx">手机号码</text>
48
+				<input class="phone-value" type="text" v-model="userPhone" placeholder="请先填写手机号码" />
49
+			</view>
50
+			<view class="card-line"></view>
51
+			<text class="discount-tx-hine">仅用于出票异常时联系,取票码不会通过短信发送</text>
52
+		</view>
53
+
54
+
55
+		<!-- <view class="card-content">
56
+			<view class="discount-info">
57
+				<text class="discount-tx">无座位时,接受系统调座</text>
58
+				<switch checked="false" @change="onSwitchClick" />
59
+			</view>
60
+			<view class="card-line"></view>
61
+			<text class="discount-tx-hine mb-6-x">1.接受调座,当您选择的座位已售出时,系统自动为您选择最佳观影座位</text>
62
+			<view class="discount-info">
63
+				<text class="discount-tx-hine">2.</text>
64
+				<text class="discount-price">若不接受调座则出票率较低</text>
65
+				<text class="discount-tx-hine">,请谨慎选择。</text>
66
+			</view>
67
+		</view> -->
68
+
69
+		<view class="card-content">
70
+			<view class="discount-info">
71
+				<text class="discount-tx">购票须知</text>
72
+				<image @click="onCheckClick" class="radio-icon" :src="isCheck?checkRadioIconx:defautRadioIconx"
73
+					mode="widthFix"></image>
74
+				<text @click="onCheckClick" class="right-big-tx">{{isCheck?'已读':'未读'}}</text>
75
+			</view>
76
+
77
+			<view class="card-line"></view>
78
+			<view class="discount-info mb-6-x">
79
+				<text class="discount-tx-hine">1.请确认播放场次和时间、片名、人数、座位无误,已出票的订单<text
80
+						class="discount-price">不可改签、退票;</text></text>
81
+			</view>
82
+			<text class="discount-tx-hine mb-6-x">2.若设备故障、存在少量影院排片变化等不可抗因素,会进行退票退款;</text>
83
+			<text class="discount-tx-hine mb-6-x">3.若因系统繁忙的情况下,存在出票失败的情况下,会进行退款;</text>
84
+			<text class="discount-tx-hine mb-6-x">4.取票码可在“电影首页-取票码或订单”中查看;</text>
85
+			<text class="discount-tx-hine">5.如有疑问,请联系平台客服;</text>
86
+
87
+		</view>
88
+
89
+		<view class="bottom-btn-content">
90
+			<view class="left-content">
91
+				<view class="left-top-info">
92
+					<text class="pay-price-title">应付:</text>
93
+					<text class="pay-price">¥{{orderDetail.order_price}}</text>
94
+				</view>
95
+				<!-- <text class="price-hint">总计优惠:2.7元</text> -->
96
+			</view>
97
+			<view class="right-btn" @click="onPayClick">立即付款</view>
98
+		</view>
99
+	</view>
100
+
101
+</template>
102
+
103
+<script setup>
104
+	import {
105
+		getLocal,
106
+	} from "~/apis/common";
107
+	import {
108
+		USER_LATITUDE,
109
+		USER_LONGITUDE,
110
+		USER_CHOOSE_CITY
111
+	} from '~/constants/index'
112
+	import {
113
+		IMG_CDN_NEW_URL
114
+	} from '~/config/app'
115
+	import {
116
+		apiGetOrderInfo,
117
+		apiConfirmOrder
118
+	} from '~/apis/movies'
119
+	import {
120
+		useUserStore
121
+	} from '~/stores/userStore'
122
+
123
+	const totalTime = 600 // 5分钟=300秒
124
+	const count = ref(totalTime)
125
+	const minutes = ref(0)
126
+	const seconds = ref(0)
127
+	const defautRadioIconx = ref(IMG_CDN_NEW_URL + 'SingleChoice_nor.png')
128
+	const checkRadioIconx = ref(IMG_CDN_NEW_URL + 'SingleChoice_sel.png')
129
+	const isCheck = ref(false)
130
+	let timer = null
131
+	let order_sn = ''
132
+	let oid =''
133
+	let type =''
134
+	let code =''
135
+	const orderDetail = ref()
136
+	const userPhone = ref('')
137
+
138
+	// 格式化时间补零
139
+	const formatTime = (num) => num < 10 ? `0${num}` : num
140
+	onLoad((option) => {
141
+		console.log("===option.order_sn",option.oid);
142
+		if (option.order_sn) {
143
+			order_sn = option.order_sn
144
+			oid = option.oid
145
+			type = option.type
146
+			code = option.code
147
+			initTimer()
148
+			getDetailInfo()
149
+		}
150
+		userPhone.value = uni.getStorageSync('USER_INFO_PHONE')
151
+	})
152
+
153
+	function getDetailInfo() {
154
+		uni.showLoading({
155
+			title: '加载中...'
156
+		})
157
+		apiGetOrderInfo(order_sn).then(res => {
158
+			uni.hideLoading()
159
+			orderDetail.value = res
160
+		})
161
+	}
162
+
163
+
164
+	function initTimer() {
165
+		timer = setInterval(() => {
166
+			count.value--
167
+
168
+			updateCountdown()
169
+		}, 1000)
170
+	}
171
+
172
+	onUnmounted(() => {
173
+		clearInterval(timer)
174
+	})
175
+
176
+	// 更新倒计时
177
+	const updateCountdown = () => {
178
+		minutes.value = Math.floor(count.value / 60)
179
+		seconds.value = count.value % 60
180
+		if (count.value <= 0) {
181
+			clearInterval(timer)
182
+			uni.showModal({
183
+				title: '付款超时,请返回重新选择座位!',
184
+				showCancel: false,
185
+				complete: (res) => {
186
+					if (res.confirm) {
187
+						uni.navigateBack()
188
+					}
189
+				}
190
+			})
191
+		}
192
+	}
193
+
194
+	function onCheckClick() {
195
+		isCheck.value = !isCheck.value
196
+	}
197
+
198
+	function onSwitchClick(e) {
199
+
200
+	}
201
+
202
+
203
+
204
+	function onPayClick() {
205
+
206
+		if (!userPhone.value) {
207
+			uni.showToast({
208
+				title: '请先填写手机号码',
209
+				icon: 'none'
210
+			})
211
+			return
212
+		}
213
+		if (!isCheck.value) {
214
+			uni.showToast({
215
+				title: '请仔细阅读并勾选购票须知',
216
+				icon: 'none'
217
+			})
218
+			return
219
+		}
220
+
221
+		uni.showLoading({
222
+			title: '请求中...'
223
+		})
224
+
225
+
226
+
227
+		let params = {
228
+			phone: userPhone.value,
229
+			oid : oid,
230
+			type :type,
231
+			code :code,
232
+		}
233
+		apiConfirmOrder(params).then(res => {
234
+			uni.redirectTo({
235
+				url: `/pages/payment/index?pay_price=${orderDetail.value.order_price}&order_id=${oid}&initType=3&order_sn=${order_sn}&type=${res.pay_channel}`
236
+			})
237
+			uni.hideLoading()
238
+		}).catch((e) => {
239
+			uni.showToast({
240
+				title: e || '接口异常!',
241
+				icon: 'none'
242
+			})
243
+		})
244
+	}
245
+</script>
246
+
247
+<style lang="scss" scoped>
248
+	.movies-oder-container {
249
+		display: flex;
250
+		flex-direction: column;
251
+		min-height: 100VH;
252
+		background-color: #f8f8f8;
253
+		box-sizing: border-box;
254
+		position: relative;
255
+		padding-bottom: 200rpx;
256
+
257
+		.bottom-btn-content {
258
+			display: flex;
259
+			flex-direction: row;
260
+			height: 180rpx;
261
+			align-items: center;
262
+			z-index: 22;
263
+			position: fixed;
264
+			bottom: 0;
265
+			left: 0;
266
+			width: 100%;
267
+			box-sizing: border-box;
268
+			padding-left: 40rpx;
269
+			padding-right: 40rpx;
270
+			background-color: #fff;
271
+
272
+			.right-btn {
273
+				display: flex;
274
+				flex-direction: row;
275
+				align-items: center;
276
+				justify-content: center;
277
+				color: #fff;
278
+				font-size: 30rpx;
279
+				background-color: #fc425a;
280
+				border-radius: 80rpx;
281
+				height: 80rpx;
282
+				width: 200rpx;
283
+			}
284
+
285
+			.left-content {
286
+				display: flex;
287
+				flex-direction: column;
288
+				flex: 1;
289
+
290
+				.price-hint {
291
+					font-size: 24rpx;
292
+					margin-top: 10rpx;
293
+					color: #999;
294
+				}
295
+
296
+				.left-top-info {
297
+					display: flex;
298
+					flex-direction: row;
299
+					align-items: center;
300
+
301
+					.pay-price-title {
302
+						font-size: 30rpx;
303
+						color: #333;
304
+					}
305
+
306
+					.pay-price {
307
+						font-size: 30rpx;
308
+						color: #f44546;
309
+						font-weight: bolder;
310
+					}
311
+				}
312
+
313
+			}
314
+		}
315
+
316
+		.mb-6-x {
317
+			margin-bottom: 10rpx;
318
+		}
319
+
320
+		.radio-icon {
321
+			width: 40rpx;
322
+			height: 40rpx;
323
+		}
324
+
325
+		.right-big-tx {
326
+			font-size: 30rpx;
327
+			color: #999;
328
+			margin-left: 10rpx;
329
+		}
330
+
331
+		.check-content {
332
+			display: flex;
333
+			flex-direction: row;
334
+			align-items: center;
335
+		}
336
+
337
+		.discount-info {
338
+			display: flex;
339
+			flex-direction: row;
340
+			align-items: center;
341
+
342
+			.fare-tx {
343
+				font-size: 30rpx;
344
+				color: #999;
345
+				flex: 1;
346
+			}
347
+
348
+			.fare-price {
349
+				font-size: 30rpx;
350
+				font-weight: bolder;
351
+				color: #f44546;
352
+			}
353
+
354
+			.fare-price-unit {
355
+				font-size: 26rpx;
356
+				color: #f44546;
357
+			}
358
+
359
+
360
+			.discount-tx {
361
+				font-size: 30rpx;
362
+				font-weight: bolder;
363
+				color: #333;
364
+				flex: 1;
365
+			}
366
+
367
+			.phone-value {
368
+				font-size: 30rpx;
369
+				color: #333;
370
+				text-align: right;
371
+			}
372
+
373
+			.discount-price {
374
+				font-size: 26rpx;
375
+				color: #f44546;
376
+			}
377
+		}
378
+
379
+		.discount-tx-hine {
380
+			font-size: 26rpx;
381
+			color: #666;
382
+		}
383
+
384
+		.rifht-big-tx {
385
+			font-size: 30rpx;
386
+			color: #999;
387
+		}
388
+
389
+		.card-line {
390
+			height: 1rpx;
391
+			width: 100%;
392
+			background-color: #eeeeee;
393
+			margin-top: 30rpx;
394
+			margin-bottom: 30rpx;
395
+		}
396
+
397
+		.card-content {
398
+			display: flex;
399
+			flex-direction: column;
400
+			background-color: #fff;
401
+			padding: 24rpx 18rpx;
402
+			margin-top: 24rpx;
403
+			border-radius: 10rpx;
404
+			position: relative;
405
+			margin-left: 22rpx;
406
+			margin-right: 22rpx;
407
+		}
408
+
409
+		.hint-info {
410
+			display: flex;
411
+			flex-direction: row;
412
+			align-items: center;
413
+			margin-top: 50rpx;
414
+			margin-bottom: 60rpx;
415
+
416
+			.close-icon {
417
+				width: 26rpx;
418
+				height: 26rpx;
419
+				margin-right: 4rpx;
420
+			}
421
+
422
+			.hint-tx {
423
+				font-size: 26rpx;
424
+				color: #000;
425
+				margin-right: 10rpx;
426
+			}
427
+
428
+			.hint-tx-1 {
429
+				font-size: 26rpx;
430
+				color: #000;
431
+				margin-right: 10rpx;
432
+				flex: 1;
433
+			}
434
+		}
435
+
436
+		.list-item {
437
+			display: flex;
438
+			flex-direction: row;
439
+			position: relative;
440
+
441
+
442
+			.timer-content {
443
+				display: flex;
444
+				flex-direction: row;
445
+				align-items: center;
446
+				position: absolute;
447
+				right: 0;
448
+				top: 0;
449
+
450
+				.timer-icon {
451
+					width: 50rpx;
452
+					margin-right: 4rpx;
453
+					height: 50rpx;
454
+				}
455
+
456
+				.timer-tx {
457
+					font-size: 28rpx;
458
+					color: #000;
459
+				}
460
+			}
461
+
462
+
463
+			.item-img {
464
+				width: 174rpx;
465
+				min-width: 174rpx;
466
+				height: 234rpx;
467
+				background-color: #000;
468
+				border-radius: 20rpx;
469
+				margin-right: 22rpx;
470
+			}
471
+
472
+			.mb-24-x {
473
+				margin-bottom: 20rpx;
474
+			}
475
+
476
+			.info-item {
477
+				display: flex;
478
+				flex-direction: column;
479
+				width: 100%;
480
+
481
+				.title-content {
482
+					display: flex;
483
+					flex-direction: row;
484
+					align-items: center;
485
+					width: 100%;
486
+				}
487
+
488
+				.item-title {
489
+					font-size: 32rpx;
490
+					font-weight: bolder;
491
+					color: #333;
492
+					margin-right: 10rpx;
493
+					max-width: 350rpx;
494
+					white-space: nowrap;
495
+					/* 防止文本换行 */
496
+					overflow: hidden;
497
+					margin-bottom: 32rpx;
498
+					/* 隐藏溢出的内容 */
499
+					text-overflow: ellipsis;
500
+					/* 显示省略号来代表被修剪的文本 */
501
+				}
502
+
503
+				.file-des {
504
+					font-size: 24rpx;
505
+					color: #999;
506
+				}
507
+
508
+				.file-des-x {
509
+					font-size: 26rpx;
510
+					margin-left: 10rpx;
511
+					color: #000;
512
+					font-weight: bolder;
513
+				}
514
+			}
515
+		}
516
+	}
517
+</style>
518
+
519
+<route lang="yaml">
520
+style:
521
+  navigationBarTitleText: 确认订单
522
+  enablePullDownRefresh: true
523
+</route>

+ 603 - 0
src/subPages/pages/movies/moviesTicketList.vue

@@ -0,0 +1,603 @@
1
+<template>
2
+	<view class="movies-container">
3
+
4
+		<view class="top-f-content">
5
+			
6
+			<view class="top-content">
7
+				<image class="img-ty" :src="topBg" mode="aspectFill"></image>
8
+				<view class="top-title-content" :style="navBarHeight" v-if="moviesList&& moviesList.length!=0">
9
+					<image @click="onBackClick" class="left-arrow" src="/static/icon/leftArrow.png" mode="widthFix"></image>
10
+					<text class="title-name">{{moviesList[currentMoviesIndex].film_name}}</text>
11
+				</view>
12
+				
13
+				<view class="address-content" @click="onAddressClick">
14
+					<view class="address-info">
15
+						<text class="shop-name">{{initInfo.cinema_name}}</text>
16
+						<text class="shop-address">{{initInfo.address}}</text>
17
+					</view>
18
+					<image class="address-icon" src="/static/icon/map_address_icon.png" mode="widthFix"></image>
19
+				</view>
20
+			</view>
21
+			<view class="movies-lab-content">
22
+				<scroll-view scroll-x="true" class="lab-item">
23
+					<view class="lab-item-x" v-for="(item,index) in moviesList" :key="'lab-item-x-'+index">
24
+						<image @click="onMoviesClick(index)" :class="currentMoviesIndex==index?'movies-big-item':'movies-item'" :src="item.cover_img" mode="aspectFill"></image>
25
+					</view>
26
+				</scroll-view>
27
+			</view>
28
+			<view class="grade-content" v-if="moviesList && moviesList.length !=0">
29
+				<text class="title">{{moviesList[currentMoviesIndex].film_name}}</text>
30
+				<text class="grade">{{moviesList[currentMoviesIndex].grade}}</text>
31
+			</view>
32
+			
33
+			<view class="des-content"  v-if="moviesList && moviesList.length !=0">
34
+				<text class="time-des">{{moviesList[currentMoviesIndex].duration}}分钟</text>
35
+				<view class="time-line"></view>
36
+				<text class="time-des">{{moviesList[currentMoviesIndex].type}}</text>
37
+				<view class="time-line"></view>
38
+				<text class="time-des-content">{{moviesList[currentMoviesIndex].actors_name}}</text>
39
+			</view>
40
+
41
+		<view class="lab-content">
42
+			<scroll-view scroll-x="true" class="lab-item">
43
+				<view class="lab-item-x" v-for="(item,index) in dateList" :key="'lab-item-x-'+index">
44
+					<view class="lab-item-small" @click="onTabClick(index)">
45
+						<text :class="currentIndex==index?'lab-title':'lab-default-title'">{{formatTimestamp(item.date_timestamp)}} {{item.date}}</text>
46
+						<view :class="currentIndex==index?'lab-line':'lab-default-line'"></view>
47
+					</view>
48
+				</view>
49
+			</scroll-view>
50
+		</view>
51
+		</view>
52
+
53
+		<view  class="list-item" v-for="(item,index) in cinemaList" :key="'movies-item-'+index" @click="onChooseSeatClick(item)">
54
+			<view class="item-h">
55
+				<text class="item-time">{{item.show_time}}</text>
56
+				<text class="item-des">{{item.end_time}}散场</text>
57
+			</view>
58
+			<view class="item-h-1">
59
+				<text class="item-time">{{item.film.language=='汉语普通话'?'国语':item.film.language}} {{item.film.version}}</text>
60
+				<text class="item-des">{{item.hall_name}}</text>
61
+			</view>
62
+			<view class="item-h">
63
+				<text class="item-price">¥{{item.price}}</text>
64
+				<!-- <text class="item-price-unit">市场价¥46</text> -->
65
+			</view>
66
+			<view class="buy-btn">购票</view>
67
+		</view>
68
+		
69
+		 <CXBEmpty  v-if="cinemaList.length==0"></CXBEmpty>
70
+		
71
+	</view>
72
+</template>
73
+
74
+<script setup>
75
+	import {
76
+		getLocal,
77
+	} from "~/apis/common";
78
+	import {
79
+		USER_LATITUDE,
80
+		USER_LONGITUDE,
81
+		USER_CHOOSE_CITY
82
+	} from '~/constants/index'
83
+    import {formatTimestamp} from "~/utils/util"
84
+	import {
85
+		apiGetFilmschedDate,
86
+		apiGetCinemafilmSchedList,
87
+		apiGetHomeMovieList
88
+	} from '~/apis/movies'
89
+	import {formatDate}from'~/utils/util'
90
+	import {
91
+		useUserStore
92
+	} from '~/stores/userStore'
93
+	import {
94
+		IMG_CDN_URL
95
+	} from '~/config/app.ts'
96
+	const topBg =ref('https://api.hxxfb.com/share/xcx/jd_bg.png')
97
+	const searchKey = ref('')
98
+	const currentIndex = ref(0)
99
+	const cinemaList = ref([])
100
+	const currentCity = ref('请选择城市')
101
+	const title = ref('')
102
+	const initInfo = ref({})
103
+	const dateList = ref([])
104
+	const currentMoviesIndex =ref(0)
105
+	const moviesList =ref([])
106
+	const totalList=ref([])
107
+
108
+	const state = reactive({
109
+		page: 1,
110
+		limit: 10,
111
+		keyword: '',
112
+		count: 1,
113
+	})
114
+
115
+	const systemInfo = uni.getSystemInfoSync()
116
+	const statusBarHeight = systemInfo.statusBarHeight ?? 0
117
+	const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
118
+    let filmSign =''
119
+	const navBarHeight = computed(() => {
120
+		return {
121
+			marginTop: `${menuButtonInfo.top}px`,
122
+			height: `${menuButtonInfo.bottom -menuButtonInfo.top}px`,
123
+		}
124
+	})
125
+
126
+	onLoad( (option) => {
127
+		let info = option.info
128
+		console.log("===option.info",option.info);
129
+		 filmSign =option.film_sign
130
+		if (info) {
131
+			initInfo.value = JSON.parse(decodeURIComponent(info))
132
+		     getmoviesList()
133
+		}
134
+	})
135
+	
136
+    function onTabClick(position){
137
+		currentIndex.value = position
138
+		cinemaList.value = totalList.value[dateList.value[currentIndex.value].date]
139
+	}
140
+	
141
+	function onMoviesClick(position){
142
+		currentMoviesIndex.value =position
143
+		getCinemafilmSchedList()
144
+	}
145
+	
146
+	function onChooseSeatClick(item){
147
+		let params ={
148
+			relation_id:item.relation_id,
149
+			sched_sign:item.sched_sign,
150
+			show_date:item.show_date,
151
+			show_time:item.show_time,
152
+			film_name:moviesList.value[currentMoviesIndex.value].film_name,
153
+			hall_name:item.hall_name,
154
+			hall_sign:item.hall_sign,
155
+			film_sign:moviesList.value[currentMoviesIndex.value].film_sign,
156
+			cinema_sign:initInfo.value.cinema_sign,
157
+			show_des:`${formatDate(item.show_date,7,'-')} ${item.show_time}-${item.end_time} (${item.film.language=='汉语普通话'?'国语':item.film.language} ${item.film.version})`
158
+		}
159
+		uni.navigateTo({
160
+			url:`/subPages/pages/movies/chooseSeat?info=${encodeURIComponent(JSON.stringify(params))}`
161
+		})
162
+	}
163
+	
164
+	function getmoviesList() {
165
+		uni.showLoading()
166
+		apiGetHomeMovieList().then(res => {
167
+			moviesList.value =res.film_list
168
+			for (var i = 0; i < res.film_list.length; i++) {
169
+				if(filmSign == res.film_list[i].film_sign){
170
+					currentMoviesIndex.value =i
171
+					break
172
+				}
173
+			}
174
+			getCinemafilmSchedList()
175
+		})
176
+	}
177
+	
178
+	function onAddressClick(){
179
+		let latitude = uni.getStorageSync(USER_LATITUDE)
180
+		let longitude = uni.getStorageSync(USER_LONGITUDE)
181
+		uni.showLoading({
182
+			title:'初始化...'
183
+		})
184
+		
185
+		uni.openLocation({
186
+		        latitude: parseFloat(latitude),
187
+		        longitude:parseFloat(longitude),
188
+		        name: initInfo.value.cinema_name,
189
+		        address:initInfo.value.address,
190
+		        scale: 18 ,// 缩放级别
191
+				complete: () => {
192
+				   uni.hideLoading()	
193
+				},
194
+				fail: (res) => {
195
+					console.log("==res",res);
196
+					uni.showToast({
197
+						title:'定位失败,请重试',
198
+						icon:'none'
199
+					})
200
+				}
201
+		      });
202
+	}
203
+
204
+
205
+	function onBackClick() {
206
+		uni.navigateBack()
207
+	}
208
+
209
+	
210
+	function getCinemafilmSchedList(){
211
+		uni.showLoading()
212
+		let params =
213
+		`film_sign=${moviesList.value[currentMoviesIndex.value].film_sign}&cinema_sign=${initInfo.value.cinema_sign}`
214
+		apiGetCinemafilmSchedList(params).then(res=>{
215
+	        dateList.value =  res.show_date
216
+			totalList.value = res.cinema_sched
217
+			cinemaList.value = res.cinema_sched[dateList.value[0].date]
218
+			uni.hideLoading()
219
+		})
220
+	}
221
+	
222
+	onPullDownRefresh(() => {
223
+		getCinemafilmSchedList()
224
+		uni.stopPullDownRefresh()
225
+	})
226
+	
227
+	
228
+</script>
229
+
230
+<style lang="scss" scoped>
231
+	.movies-container {
232
+		display: flex;
233
+		flex-direction: column;
234
+		min-height: 100VH;
235
+		background-color: #f8f8f8;
236
+		box-sizing: border-box;
237
+		position: relative;
238
+		padding-top:870rpx ;
239
+		
240
+		.des-content{
241
+			display: flex;
242
+			flex-direction: row;
243
+			margin-bottom: 20rpx;
244
+			align-items: center;
245
+			.time-des{
246
+				font-size: 24rpx;
247
+				color:#999 ;
248
+			}
249
+			
250
+			.time-line{
251
+				height: 20rpx;
252
+				width: 1rpx;
253
+				background-color: #999;
254
+				margin-left: 10rpx;
255
+				margin-right: 10rpx;
256
+			}
257
+			.time-des-content{
258
+				max-width: 300rpx;
259
+				font-size: 24rpx;
260
+				color:#999 ;
261
+				  white-space: nowrap; /* 禁止文本换行 */
262
+				      overflow: hidden; /* 隐藏超出范围的内容 */
263
+				      text-overflow: ellipsis; /* 使用省略号 */
264
+			}
265
+		}
266
+		
267
+		.grade-content{
268
+			display: flex;
269
+			flex-direction: row;
270
+			align-items: center;
271
+			margin-top: 20rpx;
272
+			margin-bottom: 10rpx;
273
+			.title{
274
+				font-size: 28rpx;
275
+				color: #000;
276
+				font-weight: bolder;
277
+				margin-right: 20rpx;
278
+			}
279
+			.grade{
280
+				font-size: 28rpx;
281
+				color: #f44546;
282
+				font-weight: bolder;
283
+				margin-right: 20rpx;
284
+			}
285
+		}
286
+		
287
+		.address-content{
288
+			display: flex;
289
+			flex-direction: row;
290
+			align-items: center;
291
+			padding: 38rpx 20rpx;
292
+			background-color: #fff;
293
+			border-radius: 20rpx;
294
+			margin-left: 24rpx;
295
+			box-sizing: border-box;
296
+			margin-right: 24rpx;
297
+			justify-content: space-between;
298
+			z-index: 22;
299
+			box-shadow: 2px 2px 16px 0px rgba(31, 34, 37, 0.08);
300
+			
301
+			.address-info{
302
+				display: flex;
303
+				flex-direction: column;
304
+				
305
+				.shop-name{
306
+					font-size: 30rpx;
307
+					color: #000;
308
+					margin-bottom: 10rpx;
309
+					font-weight: bolder;
310
+				}
311
+				.shop-address{
312
+					font-size: 26rpx;
313
+					color: #666;
314
+					width: 560rpx;
315
+					 white-space: nowrap; /* 禁止文本换行 */
316
+					  overflow: hidden; /* 隐藏超出范围的内容 */
317
+					   text-overflow: ellipsis; /* 使用省略号 */
318
+				}
319
+			}
320
+			.address-icon{
321
+				width:90rpx;
322
+				height: 90rpx;
323
+			}
324
+			
325
+		}
326
+
327
+		.top-f-content {
328
+			position: fixed;
329
+			top: 0;
330
+			width: 100%;
331
+			left: 0;
332
+			display: flex;
333
+			align-items: center;
334
+			z-index: 22;
335
+			flex-direction: column;
336
+			background-color: #fff;
337
+		}
338
+
339
+		.lab-content {
340
+			width: 100%;
341
+			height: 100rpx;
342
+			display: flex;
343
+			flex-direction: row;
344
+			align-items: center;
345
+			background-color: #fff;
346
+			border-top-right-radius: 20rpx;
347
+			border-top-left-radius: 20rpx;
348
+			z-index: 9999999;
349
+
350
+			.lab-item {
351
+				display: flex;
352
+				flex-direction: row;
353
+				white-space: nowrap;
354
+				width: 100%;
355
+				padding-left: 20rpx;
356
+			}
357
+
358
+			.lab-item-x {
359
+				display: inline-block;
360
+				margin-right: 10px;
361
+				text-align: center;
362
+			}
363
+			
364
+			.movies-item{
365
+				width: 146rpx;
366
+				background-color: #df4743;
367
+				border-radius: 20rpx;
368
+				margin-left: 10rpx;
369
+				margin-right: 10rpx;
370
+				height: 200rpx;
371
+			}
372
+
373
+			.lab-item-small {
374
+				display: flex;
375
+				flex-direction: column;
376
+				align-items: center;
377
+				width: 170rpx;
378
+
379
+				
380
+				.lab-default-title {
381
+					font-size: 26rpx;
382
+					color: #666;
383
+					margin-bottom: 10rpx;
384
+				}
385
+				
386
+				.lab-title {
387
+					font-size: 30rpx;
388
+					margin-bottom: 10rpx;
389
+					font-weight: bolder;
390
+					color: #000;
391
+				}
392
+
393
+				.lab-line {
394
+					width: 50rpx;
395
+					height: 6rpx;
396
+					background-color: #df4743;
397
+					border-radius: 4rpx;
398
+				}
399
+
400
+				.lab-default-line {
401
+					width: 50rpx;
402
+					height: 6rpx;
403
+					border-radius: 4rpx;
404
+				}
405
+
406
+			}
407
+		}
408
+		
409
+		
410
+		.movies-lab-content {
411
+			width: 100%;
412
+			margin-top: 30rpx;
413
+			height: 250rpx;
414
+			display: flex;
415
+			flex-direction: row;
416
+			align-items: center;
417
+			background-color: #fff;
418
+			border-top-right-radius: 20rpx;
419
+			border-top-left-radius: 20rpx;
420
+			z-index: 9999999;
421
+		
422
+			.lab-item {
423
+				display: flex;
424
+				flex-direction: row;
425
+				white-space: nowrap;
426
+				width: 100%;
427
+				padding-left: 20rpx;
428
+			}
429
+		
430
+			.lab-item-x {
431
+				display: inline-block;
432
+				margin-right: 10px;
433
+				text-align: center;
434
+			}
435
+			
436
+			.movies-item{
437
+				width: 146rpx;
438
+				background-color: #f8f8f8;
439
+				border-radius: 20rpx;
440
+				margin-left: 10rpx;
441
+				margin-right: 10rpx;
442
+				height: 200rpx;
443
+			}
444
+			.movies-big-item{
445
+				width: 178rpx;
446
+				background-color: #f8f8f8;
447
+				border-radius: 20rpx;
448
+				margin-left: 10rpx;
449
+				margin-right: 10rpx;
450
+				height: 240rpx;
451
+			}
452
+		
453
+			.lab-item-small {
454
+				display: flex;
455
+				flex-direction: column;
456
+				align-items: center;
457
+				width: 170rpx;
458
+		
459
+				.lab-default-title {
460
+					font-size: 28rpx;
461
+					color: #666;
462
+					margin-bottom: 10rpx;
463
+				}
464
+		
465
+				.lab-title {
466
+					font-size: 32rpx;
467
+					margin-bottom: 10rpx;
468
+					color: #000;
469
+				}
470
+		
471
+				.lab-line {
472
+					width: 50rpx;
473
+					height: 6rpx;
474
+					background-color: #df4743;
475
+					border-radius: 4rpx;
476
+				}
477
+		
478
+				.lab-default-line {
479
+					width: 50rpx;
480
+					height: 6rpx;
481
+					border-radius: 4rpx;
482
+				}
483
+		
484
+			}
485
+		}
486
+
487
+		.img-ty {
488
+			width: 100%;
489
+			height: 318rpx;
490
+			position: absolute;
491
+			top: 0;
492
+			left: 0;
493
+		}
494
+
495
+		.top-content {
496
+			position: relative;
497
+			height: 348rpx;
498
+			width: 100%;
499
+			display: flex;
500
+			flex-direction: column;
501
+		}
502
+
503
+
504
+		.top-title-content {
505
+			width: 100%;
506
+			display: flex;
507
+			flex-direction: row;
508
+			align-items: center;
509
+			margin-bottom: 20rpx;
510
+			justify-content: center;
511
+			position: relative;
512
+			z-index: 22;
513
+
514
+			.left-arrow {
515
+				width: 40rpx;
516
+				height: 40rpx;
517
+				position: absolute;
518
+				left: 0;
519
+				margin-left: 30rpx;
520
+			}
521
+
522
+			.title-name {
523
+				font-size: 28rpx;
524
+				color: #fff;
525
+			}
526
+		}
527
+
528
+		.list-item {
529
+			display: flex;
530
+			flex-direction: row;
531
+			align-items: center;
532
+			padding: 20rpx 14rpx;
533
+			margin-left: 20rpx;
534
+			margin-right: 20rpx;
535
+			margin-bottom: 20rpx;
536
+			border-radius: 20rpx;
537
+			background-color: #fff;
538
+			position: relative;
539
+			
540
+			.item-h{
541
+				display: flex;
542
+				flex-direction: column;
543
+				flex: 1;
544
+				align-items: center;
545
+			}
546
+			
547
+			.item-h-1{
548
+				display: flex;
549
+				flex: 2;
550
+				flex-direction: column;
551
+				margin-left: 20rpx;
552
+			}
553
+			
554
+			.item-time{
555
+				font-size:28rpx ;
556
+				font-weight: bolder;
557
+				margin-bottom: 10rpx;
558
+				color: #000;
559
+			}
560
+			
561
+			.item-price{
562
+				font-size:28rpx ;
563
+				font-weight: bolder;
564
+				color: #f44546;
565
+				margin-bottom: 10rpx;
566
+			}
567
+			
568
+			.item-price-unit{
569
+				font-size:22rpx ;
570
+				color: #999;
571
+				text-decoration: line-through;
572
+			}
573
+			.item-des{
574
+				font-size:22rpx ;
575
+				font-weight: bolder;
576
+				color: #999;
577
+			}
578
+			
579
+			.buy-btn{
580
+				height: 46rpx;
581
+				width: 94rpx;
582
+				border-radius: 46rpx;
583
+				border: 1rpx solid #f44546;
584
+				font-size: 28rpx;
585
+				color: #f44546;
586
+				margin-left: 10rpx;
587
+				margin-right: 10rpx;
588
+				line-height: 46rpx;
589
+				text-align: center;
590
+			}
591
+
592
+			
593
+			
594
+		}
595
+	}
596
+</style>
597
+
598
+<route lang="yaml">
599
+style:
600
+  navigationBarTitleText: 电影专区
601
+  enablePullDownRefresh: true
602
+  navigationStyle: custom
603
+</route>

+ 549 - 0
src/subPages/pages/movies/nearbyCinemas.vue

@@ -0,0 +1,549 @@
1
+<template>
2
+	<view class="movies-container">
3
+
4
+		<view class="top-f-content">
5
+			<image class="img-ty" :src="topMoviesInfo.cover_img" mode="aspectFill"></image>
6
+			<view class="top-content">
7
+				<view class="top-title-content" :style="navBarHeight">
8
+					<image @click="onBackClick" class="left-arrow" src="/static/icon/leftArrow.png" mode="widthFix"></image>
9
+					<text class="title-name">{{topMoviesInfo.film_name}}</text>
10
+				</view>
11
+
12
+				<view class="list-item">
13
+					<image class="item-img" :src="topMoviesInfo.cover_img" mode="aspectFill"></image>
14
+					<view class="info-item">
15
+						<view class="title-content">
16
+							<text class="item-title">{{topMoviesInfo.film_name}}</text>
17
+						</view>
18
+						<view class="title-content">
19
+							<text class="item-des">评分:</text>
20
+							<text class="item-red-des">{{topMoviesInfo.grade}}</text>
21
+						</view>
22
+						<view class="title-content">
23
+							<text class="item-des">导演:{{topMoviesInfo.director_name}}</text>
24
+						</view>
25
+						<view class="title-content-x">
26
+							<text class="item-des-x">主演:</text>
27
+							<text class="item-people-a">{{topMoviesInfo.actors_name}}</text>
28
+						</view>
29
+						<view class="title-content">
30
+							<text class="item-date">{{topMoviesInfo.publish_date}}</text>
31
+							<text class="item-des">上映</text>
32
+						</view>
33
+					</view>
34
+				</view>
35
+			</view>
36
+<!-- 
37
+			<view class="lab-content" v-if="dateList && dateList.length!=0">
38
+				<scroll-view scroll-x="true" class="lab-item">
39
+					<view class="lab-item-x" v-for="(item,index) in dateList" :key="'lab-item-x-'+index">
40
+						<view class="lab-item-small" @click="onTabClick(index)">
41
+							<text v-if="item.show_date" :class="currentIndex==index?'lab-title':'lab-default-title'">{{formatTimestamp(item.show_date)}} {{item.date}}</text>
42
+							<view :class="currentIndex==index?'lab-line':'lab-default-line'"></view>
43
+						</view>
44
+					</view>
45
+				</scroll-view>
46
+			</view> -->
47
+		</view>
48
+
49
+		<view @click="onItemClick(item)" class="list-item-x" v-for="(item,index) in cinemaList" :key="'movies-item-'+index">
50
+			<view class="info-item">
51
+				<view class="title-content">
52
+					<text class="item-title-x">{{item.cinema_name}}</text>
53
+					<!-- <view class="price-child-content">
54
+						<text class="item-price">¥{{item.price}}</text>
55
+						<text class="item-price-unit">起</text>
56
+					</view> -->
57
+
58
+				</view>
59
+				<view class="title-content">
60
+					<text class="item-people-s">{{item.address}}</text>
61
+					<text class="item-jl">{{item.distance}}km</text>
62
+				</view>
63
+			</view>
64
+		</view>
65
+		
66
+		 <CXBEmpty  v-if="cinemaList.length==0"></CXBEmpty>
67
+	</view>
68
+</template>
69
+
70
+<script setup>
71
+	import {
72
+		getLocal,
73
+	} from "~/apis/common";
74
+	import {
75
+		USER_LATITUDE,
76
+		USER_LONGITUDE,
77
+		USER_CHOOSE_CITY,
78
+		USER_CHOOSE_CITY_CODE
79
+	} from '~/constants/index'
80
+
81
+	import {
82
+		apiGetFilmschedDate,
83
+		apiGetFilmSchedList
84
+	} from '~/apis/movies'
85
+	import {formatTimestamp} from "~/utils/util"
86
+	import {
87
+		useUserStore
88
+	} from '~/stores/userStore'
89
+	import {
90
+		IMG_CDN_URL
91
+	} from '~/config/app.ts'
92
+	const searchKey = ref('')
93
+	const currentIndex = ref(0)
94
+	const cinemaList = ref([])
95
+	const currentCity = ref('请选择城市')
96
+	const title = ref('')
97
+	const topMoviesInfo = ref({})
98
+	const dateList = ref([])
99
+
100
+	const state = reactive({
101
+		page: 1,
102
+		limit: 10,
103
+		keyword: '',
104
+		count: 1,
105
+	})
106
+
107
+	const systemInfo = uni.getSystemInfoSync()
108
+	const statusBarHeight = systemInfo.statusBarHeight ?? 0
109
+	const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
110
+
111
+	const navBarHeight = computed(() => {
112
+		return {
113
+			marginTop: `${menuButtonInfo.top}px`,
114
+			height: `${menuButtonInfo.bottom -menuButtonInfo.top}px`,
115
+		}
116
+	})
117
+
118
+	onLoad( (option) => {
119
+		let info = option.info
120
+		let type = option.type
121
+		
122
+		if (info) {
123
+			topMoviesInfo.value = JSON.parse(decodeURIComponent(info))
124
+			if(type==2){
125
+				uni.showModal({
126
+					showCancel:false,
127
+					title:'非常抱歉',
128
+					content:'该影片暂无排期,看看其他影片吧',
129
+					complete: (res) => {
130
+						console.log("===res",res);
131
+						if(res.confirm){
132
+							uni.navigateBack()
133
+						}
134
+					}
135
+				})
136
+			}else {
137
+								getFilmSchedList()
138
+				//getFilmschedDate()
139
+			}
140
+		}
141
+
142
+	})
143
+	
144
+	function onTabClick(position){
145
+		currentIndex.value = position
146
+		getFilmSchedList()
147
+	}
148
+
149
+	function onBackClick() {
150
+		uni.navigateBack()
151
+	}
152
+	
153
+	function onItemClick(item){
154
+		uni.navigateTo({
155
+			url:`/subPages/pages/movies/moviesTicketList?info=${encodeURIComponent(JSON.stringify(item))}&film_sign=${topMoviesInfo.value.film_sign}`
156
+		})
157
+	}
158
+
159
+	function getFilmschedDate() {
160
+		uni.showLoading()
161
+		apiGetFilmschedDate(topMoviesInfo.value.film_sign).then(res => {
162
+			dateList.value =res 
163
+			if(dateList.value && dateList.value.length!= 0){
164
+
165
+			}
166
+			uni.hideLoading()
167
+		})
168
+	}
169
+	
170
+	function getFilmSchedList(){
171
+			uni.showLoading()
172
+		let latitude = uni.getStorageSync(USER_LATITUDE)
173
+		let longitude = uni.getStorageSync(USER_LONGITUDE)
174
+		let cityCode = uni.getStorageSync(USER_CHOOSE_CITY_CODE)
175
+		let params =
176
+		`page=${state.page}&limit=${state.limit}&longitude=${longitude}&latitude=${latitude}&film_sign=${topMoviesInfo.value.film_sign}&city_sign=${cityCode}`
177
+		apiGetFilmSchedList(params).then(res=>{
178
+			state.count = res.count
179
+			if (state.page === 1) {
180
+				cinemaList.value = res.cinema_sched
181
+			} else {
182
+				cinemaList.value.push(...res.cinema_sched)
183
+			}
184
+			uni.hideLoading()
185
+		})
186
+	}
187
+	
188
+	onPullDownRefresh(() => {
189
+		state.page = 1
190
+		getFilmSchedList()
191
+		uni.stopPullDownRefresh()
192
+	})
193
+	
194
+	onReachBottom(() => {
195
+		if (cinemaList.value.length < state.count) {
196
+			state.page += 1
197
+			getFilmSchedList()
198
+		}
199
+	})
200
+	
201
+	
202
+</script>
203
+
204
+<style lang="scss" scoped>
205
+	.movies-container {
206
+		display: flex;
207
+		flex-direction: column;
208
+		min-height: 100VH;
209
+		background-color: #f8f8f8;
210
+		box-sizing: border-box;
211
+		position: relative;
212
+		padding-top:490rpx ;
213
+
214
+		.top-f-content {
215
+			position: fixed;
216
+			top: 0;
217
+			width: 100%;
218
+			left: 0;
219
+			z-index: 222;
220
+			display: flex;
221
+			flex-direction: column;
222
+		}
223
+
224
+		.lab-content {
225
+			width: 100%;
226
+			height: 100rpx;
227
+			display: flex;
228
+			flex-direction: row;
229
+			align-items: center;
230
+			background-color: #fff;
231
+			border-top-right-radius: 20rpx;
232
+			border-top-left-radius: 20rpx;
233
+			margin-top: -10rpx;
234
+			z-index: 9999999;
235
+			box-shadow: 2px 6px 16px 0px rgba(31, 34, 37, 0.12);
236
+
237
+			.lab-item {
238
+				display: flex;
239
+				flex-direction: row;
240
+				white-space: nowrap;
241
+				width: 100%;
242
+				padding-left: 20rpx;
243
+			}
244
+
245
+			.lab-item-x {
246
+				display: inline-block;
247
+				margin-right: 10px;
248
+				text-align: center;
249
+			}
250
+
251
+			.lab-item-small {
252
+				display: flex;
253
+				flex-direction: column;
254
+				align-items: center;
255
+				width: 170rpx;
256
+
257
+				.lab-default-title {
258
+					font-size: 26rpx;
259
+					color: #666;
260
+					margin-bottom: 10rpx;
261
+				}
262
+
263
+				.lab-title {
264
+					font-size: 30rpx;
265
+					margin-bottom: 10rpx;
266
+					font-weight: bolder;
267
+					color: #000;
268
+				}
269
+
270
+				.lab-line {
271
+					width: 50rpx;
272
+					height: 6rpx;
273
+					background-color: #df4743;
274
+					border-radius: 4rpx;
275
+				}
276
+
277
+				.lab-default-line {
278
+					width: 50rpx;
279
+					height: 6rpx;
280
+					border-radius: 4rpx;
281
+				}
282
+
283
+			}
284
+		}
285
+
286
+		.img-ty {
287
+			width: 100%;
288
+			height: 470rpx;
289
+		}
290
+
291
+		.top-content {
292
+			position: absolute;
293
+			top: 0%;
294
+			height: 470rpx;
295
+			left: 0%;
296
+			width: 100%;
297
+			background: rgba(0, 0, 0, 0.2);
298
+			backdrop-filter: blur(20rpx);
299
+			-webkit-backdrop-filter: blur(20rpx);
300
+		}
301
+
302
+
303
+		.top-title-content {
304
+			width: 100%;
305
+			display: flex;
306
+			flex-direction: row;
307
+			align-items: center;
308
+			justify-content: center;
309
+			position: relative;
310
+
311
+			.left-arrow {
312
+				width: 40rpx;
313
+				height: 40rpx;
314
+				position: absolute;
315
+				left: 0;
316
+				margin-left: 30rpx;
317
+			}
318
+
319
+			.title-name {
320
+				font-size: 28rpx;
321
+				color: #fff;
322
+			}
323
+		}
324
+
325
+		.list-item {
326
+			display: flex;
327
+			flex-direction: row;
328
+			align-items: center;
329
+			padding: 24rpx 40rpx;
330
+			position: relative;
331
+		}
332
+		
333
+		.list-item-x {
334
+			display: flex;
335
+			flex-direction: row;
336
+			align-items: center;
337
+			padding: 20rpx 14rpx;
338
+			margin-left: 20rpx;
339
+			margin-right: 20rpx;
340
+			margin-bottom: 20rpx;
341
+			border-radius: 20rpx;
342
+			background-color: #fff;
343
+			position: relative;
344
+		
345
+			
346
+		}
347
+		.item-img {
348
+			width: 174rpx;
349
+			min-width: 174rpx;
350
+			height: 234rpx;
351
+			background-color: #f5f5f5;
352
+			margin-right: 22rpx;
353
+		}
354
+		
355
+		.right-btn {
356
+			width: 148rpx;
357
+			height: 64rpx;
358
+			margin-top: 40rpx;
359
+			line-height: 64rpx;
360
+			text-align: center;
361
+			background-color: #eb4340;
362
+			color: #fff;
363
+			font-size: 28rpx;
364
+			border-radius: 64rpx;
365
+			position: absolute;
366
+			right: 0;
367
+			font-weight: bolder;
368
+			margin-right: 26rpx;
369
+		}
370
+		
371
+		.right-black-btn {
372
+			width: 148rpx;
373
+			margin-top: 40rpx;
374
+			height: 64rpx;
375
+			line-height: 64rpx;
376
+			text-align: center;
377
+			border-radius: 64rpx;
378
+			background-color: #000;
379
+			color: #fff;
380
+			font-size: 28rpx;
381
+			font-weight: bolder;
382
+			position: absolute;
383
+			margin-right: 26rpx;
384
+			right: 0;
385
+		}
386
+		
387
+		.info-item {
388
+			display: flex;
389
+			flex-direction: column;
390
+			width: 100%;
391
+			
392
+			.title-content-x{
393
+				display: flex;
394
+				flex-direction: row;
395
+				margin-bottom: 12rpx;
396
+				position: relative;
397
+				width: 100%;
398
+				.item-people-a {
399
+					font-size: 22rpx;
400
+					color: #fff;
401
+					max-width: 550rpx;
402
+				    display: -webkit-box; /* 设置为WebKit内核的弹性盒子模型 */
403
+				     -webkit-box-orient: vertical; /* 垂直排列 */
404
+				     -webkit-line-clamp: 2; /* 限制显示两行 */
405
+				     overflow: hidden; /* 隐藏超出范围的内容 */
406
+				     text-overflow: ellipsis; /* 使用省略号 */
407
+				     text-indent: 66rpx;
408
+				}
409
+				.item-des-x {
410
+					font-size: 22rpx;
411
+					color: #fff;
412
+					min-width: 66rpx;
413
+					position: absolute;
414
+					left: 0;
415
+				}
416
+			}
417
+		
418
+			.title-content {
419
+				display: flex;
420
+				flex-direction: row;
421
+				margin-bottom: 12rpx;
422
+				position: relative;
423
+				align-items: center;
424
+				width: 100%;
425
+		
426
+				.item-title {
427
+					font-size: 32rpx;
428
+					font-weight: bolder;
429
+					color: #fff;
430
+					margin-right: 10rpx;
431
+					max-width: 370rpx;
432
+					white-space: nowrap;
433
+					/* 防止文本换行 */
434
+					overflow: hidden;
435
+					/* 隐藏溢出的内容 */
436
+					text-overflow: ellipsis;
437
+					/* 显示省略号来代表被修剪的文本 */
438
+				}
439
+		
440
+				.price-child-content {
441
+					display: flex;
442
+					flex-direction: row;
443
+					align-items: center;
444
+					flex: 1;
445
+					justify-content: flex-end;
446
+				}
447
+		
448
+				.item-title-x {
449
+					font-size: 32rpx;
450
+					font-weight: bolder;
451
+					color: #333;
452
+					flex: 1;
453
+					margin-right: 10rpx;
454
+					max-width: 550rpx;
455
+					white-space: nowrap;
456
+					/* 防止文本换行 */
457
+					overflow: hidden;
458
+					/* 隐藏溢出的内容 */
459
+					text-overflow: ellipsis;
460
+					/* 显示省略号来代表被修剪的文本 */
461
+				}
462
+		
463
+				.item-people-s {
464
+					font-size: 22rpx;
465
+					color: #666;
466
+					max-width: 550rpx;
467
+					white-space: nowrap;
468
+					/* 防止文本换行 */
469
+					overflow: hidden;
470
+					/* 隐藏溢出的内容 */
471
+					text-overflow: ellipsis;
472
+					/* 显示省略号来代表被修剪的文本 */
473
+				}
474
+				
475
+		
476
+				.item-jl {
477
+					font-size: 22rpx;
478
+					color: #999;
479
+					flex: 1;
480
+					text-align: right;
481
+					line-height: 22rpx;
482
+					height: 22rpx;
483
+				}
484
+		
485
+				.item-price {
486
+					font-size: 26rpx;
487
+					color: #df4743;
488
+					font-weight: bolder;
489
+				}
490
+		
491
+				.item-price-unit {
492
+					font-size: 26rpx;
493
+					color: #999;
494
+					font-weight: bolder;
495
+				}
496
+		
497
+				.item-red-des {
498
+					font-size: 28rpx;
499
+					color: #df4743;
500
+					font-weight: bolder;
501
+				}
502
+		
503
+				.item-des {
504
+					font-size: 22rpx;
505
+					color: #fff;
506
+					min-width: 66rpx;
507
+				}
508
+				
509
+		
510
+				.item-date {
511
+					font-size: 22rpx;
512
+					color: #fff;
513
+				}
514
+		
515
+				.item-people {
516
+					font-size: 22rpx;
517
+					color: #fff;
518
+					max-width: 380rpx;
519
+					white-space: nowrap;
520
+					/* 防止文本换行 */
521
+					overflow: hidden;
522
+					/* 隐藏溢出的内容 */
523
+					text-overflow: ellipsis;
524
+					/* 显示省略号来代表被修剪的文本 */
525
+				}
526
+		
527
+				.item-people-x {
528
+					font-size: 22rpx;
529
+					color: #fff;
530
+					max-width: 370rpx;
531
+					white-space: nowrap;
532
+					/* 防止文本换行 */
533
+					overflow: hidden;
534
+					/* 隐藏溢出的内容 */
535
+					text-overflow: ellipsis;
536
+					/* 显示省略号来代表被修剪的文本 */
537
+				}
538
+		
539
+			}
540
+		}
541
+	}
542
+</style>
543
+
544
+<route lang="yaml">
545
+style:
546
+  navigationBarTitleText: 电影专区
547
+  enablePullDownRefresh: true
548
+  navigationStyle: custom
549
+</route>

+ 447 - 0
src/subPages/pages/movies/orderDetail.vue

@@ -0,0 +1,447 @@
1
+<template>
2
+	<view class="order-detail-container">
3
+
4
+		<view class="card-content">
5
+			<view class="top-info-content">
6
+				<view class="info-content">
7
+					<text class="info-title">{{detailInfo.film_name}}</text>
8
+					<text class="info-des" v-if="detailInfo&&detailInfo.film">{{detailInfo.sched_time}} ~ {{detailInfo.schedend_time}}({{detailInfo.film.language=='汉语普通话'?'国语':detailInfo.film.language}}{{detailInfo.film.version}})</text>
9
+					<text class="info-des">{{detailInfo.cinema_name}}{{detailInfo.hall_name}}</text>
10
+					
11
+					<view class="seat-content">
12
+						<text :key="'info-seat-'+index" class="info-seat"
13
+							v-for="(item,index) in detailInfo.sched_seat">{{item.seat_no}}</text>
14
+					</view>
15
+				
16
+						
17
+				</view>
18
+				<image v-if="detailInfo && detailInfo.film" class="info-img" :src="detailInfo.film.cover_img"
19
+					mode="aspectFill"></image>
20
+			</view>
21
+			<view class="order-line"></view>
22
+
23
+			<view class="order-status-content" v-if="detailInfo.status==0">
24
+				<text class="status-title">支付剩余 {{ formatTime(minutes) }}:{{ formatTime(seconds) }}</text>
25
+				<text class="status-hint"> 请尽快支付,否则订单将在10分钟后失效</text>
26
+			</view>
27
+			<view class="order-status-content"
28
+				v-if="detailInfo.status==3 || detailInfo.status==2|| detailInfo.status==5">
29
+				<text class="status-title"> 订单已取消</text>
30
+				<text class="status-hint"> 订单超时未支付,系统已自动关闭!</text>
31
+			</view>
32
+			<view class="order-status-content" v-if="detailInfo.status==1 || detailInfo.status==4">
33
+				<text class="status-title"> 取票码</text>
34
+				<view class="qr-content">
35
+					<image @click="onQrClick(index)" :key="'qr-icon-'+index" v-for="(item,index) in detailInfo.ticket"
36
+						class="order-qr" :src="item.qr_code" mode="widthFix"></image>
37
+				</view>
38
+			</view>
39
+		</view>
40
+
41
+		<view class="card-content" @click="onAddressClick" v-if="detailInfo&& detailInfo.cinema">
42
+			<view class="address-out-content">
43
+				<text class="cinemas-name">{{detailInfo.cinema.cinema_name}}</text>
44
+				<text class="address-name">{{detailInfo.cinema.address}}</text>
45
+				<image @click.stop="onPhoneClick" class="phone-icon" src="/static/icon/phone_icon.png" mode="widthFix">
46
+				</image>
47
+			</view>
48
+		</view>
49
+
50
+		<view class="card-content" @click="onCopyClick">
51
+			<text class="cinemas-name">订单金额:¥{{detailInfo.order_price}}</text>
52
+			<view class="order-no-content">
53
+				<text class="card-small-des">订单编号:{{detailInfo.order_sn}}</text>
54
+				<image class="copy-icon" src="/static/icon/copy_icon.png" mode="widthFix"></image>
55
+			</view>
56
+			<text class="card-small-des">下单时间:{{formatDate(detailInfo.create_time,8,'-')}}</text>
57
+			<text class="card-small-des">手机号码:{{detailInfo.phone}}</text>
58
+		</view>
59
+
60
+
61
+		<view class="card-content">
62
+			<text class="cinemas-name">观影须知</text>
63
+			<text class="card-small-des">1.请提前到达影院现场,找到自助取票机,打印纸制电影票,完成取票。</text>
64
+			<text class="card-small-des">2.如现场自助取票机无法打印电影票,请联系影院工作人员处理。</text>
65
+			<text class="card-small-des">3.凭打印好的纸质电影票,检票入场观影。</text>
66
+			<text class="card-small-des">4.如有开具所够电影票发票的需求,请保留好电影票根,尽量在观影当天联系影城工作人员进行开具,如遇特殊情况请及时咨询平台客服。</text>
67
+		</view>
68
+
69
+
70
+		<view class="bottom-btn-content" v-if="detailInfo.status==0 &&detailInfo.order_price ">
71
+			<view class="left-content">
72
+				<view class="left-top-info">
73
+					<text class="pay-price-title">应付:</text>
74
+					<text class="pay-price">¥{{detailInfo.order_price}}</text>
75
+				</view>
76
+			</view>
77
+			<view class="right-btn" @click="onPayClick">立即付款</view>
78
+		</view>
79
+
80
+	</view>
81
+</template>
82
+
83
+<script setup>
84
+	import {
85
+		USER_LATITUDE,
86
+		USER_LONGITUDE,
87
+		USER_CHOOSE_CITY
88
+	} from '~/constants/index'
89
+
90
+	import {
91
+		apiGetOrderInfo,
92
+		apiConfirmOrder
93
+	} from '~/apis/movies'
94
+	import {
95
+		useUserStore
96
+	} from '~/stores/userStore'
97
+	import {
98
+		formatDate
99
+	} from '~/utils/util'
100
+	import {
101
+		IMG_CDN_URL
102
+	} from '~/config/app.ts'
103
+
104
+	let orderSn = ''
105
+	const formatTime = (num) => num < 10 ? `0${num}` : num
106
+	const detailInfo = ref({})
107
+	let totalTime = 600 // 5分钟=300秒
108
+	const count = ref(0)
109
+	const minutes = ref(0)
110
+	const seconds = ref(0)
111
+	let timer = null
112
+	onLoad((option) => {
113
+		orderSn = option.orderSn
114
+		if (orderSn != 'undefined') {
115
+			getorderDetailInfo()
116
+		}
117
+	})
118
+
119
+	function onAddressClick() {
120
+		uni.navigateTo({
121
+			url:`/subPages/pages/movies/moviesTicketList?info=${encodeURIComponent(JSON.stringify(detailInfo.value.cinema))}&film_sign=${detailInfo.value.film.film_sign}`
122
+		})
123
+	}
124
+
125
+	function initTimer() {
126
+		timer = setInterval(() => {
127
+			count.value--
128
+			updateCountdown()
129
+		}, 1000)
130
+	}
131
+
132
+	function onPayClick() {
133
+		console.log("===detailInfo",detailInfo.value.oid);
134
+		uni.redirectTo({
135
+			url: `/pages/payment/index?pay_price=${detailInfo.value.order_price}&order_id=${detailInfo.value.oid}&initType=3&order_sn=${detailInfo.value.order_sn}`
136
+		})
137
+	}
138
+
139
+	onUnmounted(() => {
140
+		clearInterval(timer)
141
+	})
142
+
143
+	// 更新倒计时
144
+	const updateCountdown = () => {
145
+		minutes.value = Math.floor(count.value / 60)
146
+		seconds.value = count.value % 60
147
+		if (count.value <= 0) {
148
+			clearInterval(timer)
149
+			// 可在此处触发回调事件
150
+			getorderDetailInfo()
151
+		}
152
+	}
153
+
154
+	function onPhoneClick() {
155
+		uni.makePhoneCall({
156
+			phoneNumber: detailInfo.value.cinema.tel
157
+		})
158
+	}
159
+
160
+	function onQrClick(index) {
161
+
162
+		let imgList = new Array()
163
+		for (let s of detailInfo.value) {
164
+			imgList.push(s.qr_code)
165
+		}
166
+		uni.previewImage({
167
+			urls: imgList,
168
+			current: imgList[index]
169
+		})
170
+	}
171
+
172
+	function onCopyClick() {
173
+		uni.setClipboardData({
174
+			data: detailInfo.value.order_sn,
175
+			success(res) {
176
+				uni.showToast({
177
+					title: `复制成功`,
178
+					icon: 'none'
179
+				})
180
+			},
181
+			fail(res) {
182
+				return uni.showToast({
183
+					title: '请更新隐私协议',
184
+					icon: 'none'
185
+				})
186
+			}
187
+		})
188
+	}
189
+
190
+	function getorderDetailInfo() {
191
+		uni.showLoading()
192
+		apiGetOrderInfo(orderSn).then(res => {
193
+			detailInfo.value = res
194
+			if (detailInfo.value.status == 0) {
195
+	     	totalTime = parseInt((detailInfo.value.create_time*1000+600000 -	new Date().getTime())/1000)
196
+			count.value = totalTime+2
197
+				initTimer()
198
+			}
199
+			uni.hideLoading()
200
+		}).catch((e)=>{
201
+			uni.showToast({
202
+				title:e.message ||'接口异常!',
203
+				icon:'none'
204
+			})
205
+		})
206
+	}
207
+</script>
208
+
209
+<style lang="scss" scoped>
210
+	.order-detail-container {
211
+		display: flex;
212
+		padding-bottom: 60rpx;
213
+		flex-direction: column;
214
+		min-height: 100VH;
215
+		background-color: #f8f8f8;
216
+		box-sizing: border-box;
217
+		position: relative;
218
+		padding-top: 24rpx;
219
+		
220
+		.seat-content{
221
+			display: flex;
222
+			flex-direction: row;
223
+			align-items: center;
224
+			flex-wrap: wrap;
225
+		}
226
+
227
+		.bottom-btn-content {
228
+			display: flex;
229
+			flex-direction: row;
230
+			height: 180rpx;
231
+			align-items: center;
232
+			z-index: 22;
233
+			position: fixed;
234
+			bottom: 0;
235
+			left: 0;
236
+			width: 100%;
237
+			box-sizing: border-box;
238
+			padding-left: 40rpx;
239
+			padding-right: 40rpx;
240
+			background-color: #fff;
241
+
242
+			.right-btn {
243
+				display: flex;
244
+				flex-direction: row;
245
+				align-items: center;
246
+				justify-content: center;
247
+				color: #fff;
248
+				font-size: 30rpx;
249
+				background-color: #fc425a;
250
+				border-radius: 80rpx;
251
+				height: 80rpx;
252
+				width: 200rpx;
253
+			}
254
+
255
+			.left-content {
256
+				display: flex;
257
+				flex-direction: column;
258
+				flex: 1;
259
+
260
+				.price-hint {
261
+					font-size: 24rpx;
262
+					margin-top: 10rpx;
263
+					color: #999;
264
+				}
265
+
266
+				.left-top-info {
267
+					display: flex;
268
+					flex-direction: row;
269
+					align-items: center;
270
+
271
+					.pay-price-title {
272
+						font-size: 30rpx;
273
+						color: #333;
274
+					}
275
+
276
+					.pay-price {
277
+						font-size: 30rpx;
278
+						color: #f44546;
279
+						font-weight: bolder;
280
+					}
281
+				}
282
+
283
+			}
284
+		}
285
+
286
+		.card-content {
287
+			display: flex;
288
+			flex-direction: column;
289
+			background-color: #fff;
290
+			border-radius: 20rpx;
291
+			box-sizing: border-box;
292
+			margin-left: 24rpx;
293
+			margin-right: 24rpx;
294
+			margin-bottom: 24rpx;
295
+			padding: 24rpx;
296
+			position: relative;
297
+		}
298
+
299
+		.card-small-des {
300
+			font-size: 26rpx;
301
+			color: #999;
302
+			line-height: 30rpx;
303
+			margin-bottom: 10rpx;
304
+		}
305
+
306
+		.order-no-content {
307
+			display: flex;
308
+			flex-direction: row;
309
+			align-items: center;
310
+
311
+			.copy-icon {
312
+				width: 40rpx;
313
+				height: 40rpx;
314
+				margin-left: 10rpx;
315
+				margin-bottom: 10rpx;
316
+			}
317
+		}
318
+
319
+		.address-out-content {
320
+			display: flex;
321
+			flex-direction: column;
322
+			position: relative;
323
+			justify-content: center;
324
+		}
325
+
326
+		.cinemas-name {
327
+			font-size: 34rpx;
328
+			font-weight: bolder;
329
+			color: #000;
330
+			margin-bottom: 28rpx;
331
+		}
332
+
333
+		.phone-icon {
334
+			width: 36rpx;
335
+			height: 36rpx;
336
+			margin-left: 20rpx;
337
+			min-width: 50rpx;
338
+			position: absolute;
339
+			margin-left: 30rpx;
340
+			right: 0;
341
+		}
342
+
343
+		.address-name {
344
+			font-size: 24rpx;
345
+			color: #999;
346
+		}
347
+
348
+		.order-status-content {
349
+			display: flex;
350
+			flex-direction: column;
351
+			padding-top: 46rpx;
352
+			padding-bottom: 46rpx;
353
+			align-items: center;
354
+			justify-content: center;
355
+
356
+			.status-title {
357
+				font-size: 34rpx;
358
+				font-weight: bolder;
359
+				color: #df4743;
360
+				margin-bottom: 38rpx;
361
+			}
362
+
363
+			.status-hint {
364
+				font-size: 24rpx;
365
+				color: #999;
366
+			}
367
+
368
+			.qr-content {
369
+				display: flex;
370
+				flex-direction: row;
371
+				align-items: center;
372
+				flex-wrap: wrap;
373
+				padding-left: 10rpx;
374
+				padding-right: 10rpx;
375
+			}
376
+
377
+			.order-qr {
378
+				width: 120rpx;
379
+				height: 120rpx;
380
+				margin-right: 10rpx;
381
+				margin-bottom: 20rpx;
382
+				margin-left: 10rpx;
383
+				background-color: #999;
384
+			}
385
+		}
386
+
387
+		.order-line {
388
+			height: 1rpx;
389
+			width: 100%;
390
+			border: 1rpx dotted #eeeeee;
391
+			margin-top: 30rpx;
392
+		}
393
+
394
+
395
+
396
+		.top-info-content {
397
+			display: flex;
398
+			flex-direction: row;
399
+			align-items: center;
400
+
401
+			.info-content {
402
+				display: flex;
403
+				flex-direction: column;
404
+				flex: 1;
405
+
406
+				.info-title {
407
+					font-size: 38rpx;
408
+					font-weight: bolder;
409
+					color: #000;
410
+					margin-bottom: 10rpx;
411
+					// white-space: nowrap;
412
+					// overflow: hidden;
413
+					// text-overflow: ellipsis;
414
+				}
415
+
416
+				.info-des {
417
+					font-size: 24rpx;
418
+					color: #666;
419
+					margin-top: 20rpx;
420
+				}
421
+
422
+				.info-seat {
423
+					font-size: 24rpx;
424
+					margin-top: 20rpx;
425
+					color: #999;
426
+					margin-right: 10rpx;
427
+				}
428
+			}
429
+
430
+			.info-img {
431
+				width: 156rpx;
432
+				height: 200rpx;
433
+				background-color: aqua;
434
+				border-radius: 20rpx;
435
+				margin-left: 24rpx;
436
+			}
437
+
438
+		}
439
+
440
+
441
+	}
442
+</style>
443
+
444
+<route lang="yaml">
445
+style:
446
+  navigationBarTitleText: 订单详情
447
+</route>

+ 592 - 0
src/subPages/pages/movies/orderList.vue

@@ -0,0 +1,592 @@
1
+<template>
2
+	<view class="movies-container">
3
+
4
+		<view class="top-content">
5
+			<view class="tab-content">
6
+				<view class="tab-item" @click="onTabClick(0)">
7
+					<text :class="currentIndex==0?'tab-title':'tab-default-title'">全部</text>
8
+					<view :class="currentIndex==0?'tab-line':'tab-default-line'"></view>
9
+				</view>
10
+				<view class="tab-item" @click="onTabClick(1)">
11
+					<text :class="currentIndex==1?'tab-title':'tab-default-title'">已出票</text>
12
+					<view :class="currentIndex==1?'tab-line':'tab-default-line'"></view>
13
+				</view>
14
+				<view class="tab-item" @click="onTabClick(2)">
15
+					<text :class="currentIndex==2?'tab-title':'tab-default-title'">已取消</text>
16
+					<view :class="currentIndex==2?'tab-line':'tab-default-line'"></view>
17
+				</view>
18
+			</view>
19
+		</view>
20
+
21
+		<view v-if="cinemaList && cinemaList.length!= 0">
22
+			<view class="list-item-out" v-for="(item,index) in cinemaList" :key="'movies-item-'+index"
23
+				@click="onItemClick(item)">
24
+
25
+				<view class="list-item">
26
+
27
+					<image class="item-img" :src="item.cover_img" mode="aspectFill"></image>
28
+					<view class="info-item">
29
+						<view class="title-content">
30
+							<text class="item-title">{{item.film_name}}</text>
31
+						</view>
32
+
33
+						<view class="title-content">
34
+							<text class="item-des">{{item.cinema_name}}</text>
35
+						</view>
36
+						<view class="title-content">
37
+							<text class="item-des">观影时间:{{item.show_date}} {{item.show_time}}</text>
38
+
39
+						</view>
40
+						<view class="title-content">
41
+							<text class="item-date">4DX</text>
42
+							<text class="item-date">{{item.hall_name}}</text>
43
+							<text :key="'seat-item-'+index" class="item-seat" v-for="(childItem,childIndex) in item.sched_seat">{{childItem.seat_no}}</text>
44
+						</view>
45
+						<view class="title-content">
46
+							<text class="item-date-s">实付款</text>
47
+							<text class="item-date-big">¥{{item.order_price}}</text>
48
+							<text class="item-date-x">({{item.number}}张)</text>
49
+						</view>
50
+					</view>
51
+				</view>
52
+				<view class="card-line"></view>
53
+				
54
+				<view class="card-bottom-content">
55
+					<text class="card-date">{{item.create_time}}</text>
56
+					<text class="card-status">{{dealStatus(item.status)}}</text>
57
+				</view>
58
+			</view>
59
+		</view>
60
+		
61
+		 <CXBEmpty  v-else ></CXBEmpty>
62
+	</view>
63
+</template>
64
+
65
+<script setup>
66
+	import {
67
+		getLocal,
68
+	} from "~/apis/common";
69
+	import {
70
+		USER_LATITUDE,
71
+		USER_LONGITUDE,
72
+		USER_CHOOSE_CITY
73
+	} from '~/constants/index'
74
+   import CXBEmpty from "~/components/CXBEmpty/CXBEmpty.vue";
75
+	import {
76
+		apiGetOrderList,
77
+	} from '~/apis/movies'
78
+	import {
79
+		useUserStore
80
+	} from '~/stores/userStore'
81
+	import {
82
+		IMG_CDN_URL
83
+	} from '~/config/app.ts'
84
+	const searchKey = ref('')
85
+	const currentIndex = ref(0)
86
+	const cinemaList = ref([])
87
+	const currentCity = ref('请选择城市')
88
+
89
+	const state = reactive({
90
+		page: 1,
91
+		limit: 10,
92
+		keyword: '',
93
+		count: 1,
94
+	})
95
+
96
+	onLoad((option) => {
97
+		currentIndex.value = option.type
98
+		getmoviesOrderList()
99
+	})
100
+
101
+	function onItemClick(item) {
102
+		uni.navigateTo({
103
+			url: `/subPages/pages/movies/orderDetail?orderSn=${item.order_sn}`
104
+		})
105
+	}
106
+	
107
+	function dealStatus(status){
108
+		let name 
109
+		if(status==0){
110
+			name='待支付'
111
+		}else if(status==1){
112
+			name='已支付'
113
+		}else if(status==2){
114
+			name='已超时'
115
+		}else if(status==3 || status==5){
116
+			name='已取消'
117
+		}else if(status==4){
118
+			name='已成功'
119
+		}
120
+		return name
121
+	}
122
+	
123
+
124
+	function getmoviesOrderList() {
125
+		uni.showLoading()
126
+		let params =
127
+			`page=${state.page}&limit=${state.limit}&type=${currentIndex.value==0?-1:(currentIndex.value==2?5:1)}`
128
+		apiGetOrderList(params).then(res => {
129
+			state.count = res.count
130
+			if (state.page === 1) {
131
+				cinemaList.value = res.movie_order
132
+			} else {
133
+				cinemaList.value.push(...res.movie_order)
134
+			}
135
+			uni.hideLoading()
136
+		}).catch(()=>{
137
+			uni.hideLoading()
138
+			uni.showToast({
139
+				title:'接口异常!',
140
+				icon:'none'
141
+			})
142
+		})
143
+	}
144
+
145
+	function onTabClick(position) {
146
+		currentIndex.value = position
147
+		state.page = 1
148
+		state.count = 1
149
+		searchKey.value = ''
150
+		getmoviesOrderList()
151
+	}
152
+
153
+	onPullDownRefresh(() => {
154
+		state.page = 1
155
+		getmoviesOrderList()
156
+		uni.stopPullDownRefresh()
157
+	})
158
+
159
+	onReachBottom(() => {
160
+		if (cinemaList.value.length < state.count) {
161
+			state.page += 1
162
+			getmoviesOrderList()
163
+		}
164
+	})
165
+</script>
166
+
167
+<style lang="scss" scoped>
168
+	.movies-container {
169
+		display: flex;
170
+		padding-bottom: 60rpx;
171
+		flex-direction: column;
172
+		min-height: 100VH;
173
+		background-color: #f8f8f8;
174
+		box-sizing: border-box;
175
+		position: relative;
176
+		padding-top: 90rpx;
177
+
178
+		.top-content {
179
+			display: flex;
180
+			flex-direction: column;
181
+			position: fixed;
182
+			top: 0;
183
+			width: 100%;
184
+			z-index: 66;
185
+			left: 0;
186
+		}
187
+		
188
+		.card-line{
189
+			width: 100%;
190
+			height: 1rpx;
191
+			background-color: #eeeeee;
192
+			margin-top: 24rpx;
193
+			margin-bottom: 24rpx;
194
+		}
195
+		
196
+		.card-bottom-content{
197
+			display: flex;
198
+			flex-direction: row;
199
+			align-items: center;
200
+			
201
+			.card-date{
202
+				font-size: 28rpx;
203
+				color: #999;
204
+				flex: 1;
205
+			}
206
+			.card-status{
207
+				font-size: 28rpx;
208
+				color: #999;
209
+			}
210
+		}
211
+
212
+		.list-item-out {
213
+			display: flex;
214
+			flex-direction: column;
215
+			padding: 24rpx 18rpx;
216
+			background-color: #fff;
217
+			margin-top: 24rpx;
218
+			border-radius: 10rpx;
219
+			position: relative;
220
+			margin-left: 22rpx;
221
+			margin-right: 22rpx;
222
+		}
223
+
224
+		.list-item {
225
+			display: flex;
226
+			flex-direction: row;
227
+			align-items: center;
228
+			
229
+
230
+			.item-img {
231
+				width: 174rpx;
232
+				min-width: 174rpx;
233
+				height: 234rpx;
234
+				background-color: #f5f5f5;
235
+				border-radius: 20rpx;
236
+				margin-right: 22rpx;
237
+			}
238
+
239
+			.right-btn {
240
+				width: 148rpx;
241
+				height: 64rpx;
242
+				margin-top: 40rpx;
243
+				line-height: 64rpx;
244
+				text-align: center;
245
+				background-color: #eb4340;
246
+				color: #fff;
247
+				font-size: 28rpx;
248
+				border-radius: 64rpx;
249
+				position: absolute;
250
+				right: 0;
251
+				font-weight: bolder;
252
+				margin-right: 26rpx;
253
+			}
254
+
255
+			.right-black-btn {
256
+				width: 148rpx;
257
+				margin-top: 40rpx;
258
+				height: 64rpx;
259
+				line-height: 64rpx;
260
+				text-align: center;
261
+				border-radius: 64rpx;
262
+				background-color: #000;
263
+				color: #fff;
264
+				font-size: 28rpx;
265
+				font-weight: bolder;
266
+				position: absolute;
267
+				margin-right: 26rpx;
268
+				right: 0;
269
+			}
270
+
271
+			.info-item {
272
+				display: flex;
273
+				flex-direction: column;
274
+				width: 100%;
275
+
276
+				.title-content {
277
+					display: flex;
278
+					flex-direction: row;
279
+					margin-bottom: 12rpx;
280
+					align-items: center;
281
+					flex-wrap: wrap;
282
+					width: 100%;
283
+
284
+					.item-title {
285
+						font-size: 32rpx;
286
+						font-weight: bolder;
287
+						color: #333;
288
+						margin-right: 10rpx;
289
+						max-width: 370rpx;
290
+						white-space: nowrap;
291
+						/* 防止文本换行 */
292
+						overflow: hidden;
293
+						/* 隐藏溢出的内容 */
294
+						text-overflow: ellipsis;
295
+						/* 显示省略号来代表被修剪的文本 */
296
+					}
297
+
298
+					.price-child-content {
299
+						display: flex;
300
+						flex-direction: row;
301
+						align-items: center;
302
+						flex: 1;
303
+						justify-content: flex-end;
304
+					}
305
+
306
+					.item-title-x {
307
+						font-size: 32rpx;
308
+						font-weight: bolder;
309
+						color: #333;
310
+						flex: 1;
311
+						margin-right: 10rpx;
312
+						max-width: 550rpx;
313
+						white-space: nowrap;
314
+						/* 防止文本换行 */
315
+						overflow: hidden;
316
+						/* 隐藏溢出的内容 */
317
+						text-overflow: ellipsis;
318
+						/* 显示省略号来代表被修剪的文本 */
319
+					}
320
+
321
+					.item-people-s {
322
+						font-size: 22rpx;
323
+						color: #666;
324
+						max-width: 550rpx;
325
+						white-space: nowrap;
326
+						/* 防止文本换行 */
327
+						overflow: hidden;
328
+						/* 隐藏溢出的内容 */
329
+						text-overflow: ellipsis;
330
+						/* 显示省略号来代表被修剪的文本 */
331
+					}
332
+
333
+					.item-jl {
334
+						font-size: 22rpx;
335
+						color: #999;
336
+						flex: 1;
337
+						text-align: right;
338
+						line-height: 22rpx;
339
+						height: 22rpx;
340
+					}
341
+
342
+					.item-price {
343
+						font-size: 26rpx;
344
+						color: #df4743;
345
+						font-weight: bolder;
346
+					}
347
+
348
+					.item-price-unit {
349
+						font-size: 26rpx;
350
+						color: #999;
351
+						font-weight: bolder;
352
+					}
353
+
354
+					.item-red-des {
355
+						font-size: 28rpx;
356
+						color: #df4743;
357
+						font-weight: bolder;
358
+					}
359
+
360
+					.item-des {
361
+						font-size: 22rpx;
362
+						color: #999;
363
+					}
364
+
365
+					.item-date-x {
366
+						font-size: 24rpx;
367
+						color: #df4743;
368
+						margin-left: 4rpx;
369
+					}
370
+
371
+					.item-date-s {
372
+						font-size: 24rpx;
373
+						color: #666;
374
+					}
375
+
376
+					.item-date-big {
377
+						font-size: 28rpx;
378
+						color: #000;
379
+						font-weight: bolder;
380
+					}
381
+
382
+					.item-date {
383
+						font-size: 22rpx;
384
+						color: #666;
385
+						font-weight: bolder;
386
+					}
387
+					
388
+					.item-seat {
389
+						font-size: 22rpx;
390
+						color: #666;
391
+						margin-left: 4rpx;
392
+						margin-right: 4rpx;
393
+					}
394
+
395
+					.item-people {
396
+						font-size: 22rpx;
397
+						color: #999;
398
+						max-width: 240rpx;
399
+						white-space: nowrap;
400
+						/* 防止文本换行 */
401
+						overflow: hidden;
402
+						/* 隐藏溢出的内容 */
403
+						text-overflow: ellipsis;
404
+						/* 显示省略号来代表被修剪的文本 */
405
+					}
406
+
407
+					.item-people-x {
408
+						font-size: 22rpx;
409
+						color: #999;
410
+						max-width: 370rpx;
411
+						white-space: nowrap;
412
+						/* 防止文本换行 */
413
+						overflow: hidden;
414
+						/* 隐藏溢出的内容 */
415
+						text-overflow: ellipsis;
416
+						/* 显示省略号来代表被修剪的文本 */
417
+					}
418
+
419
+					.item-tag-content {
420
+						display: flex;
421
+						flex-direction: row;
422
+						align-items: center;
423
+						height: 32rpx;
424
+						border: 1rpx solid #999999;
425
+						border-radius: 6rpx;
426
+
427
+						.item-tag-0 {
428
+							font-size: 16rpx;
429
+							color: #fff;
430
+							height: 32rpx;
431
+							background-color: #999;
432
+							padding-right: 6rpx;
433
+							padding-left: 6rpx;
434
+							line-height: 32rpx;
435
+							text-align: center;
436
+						}
437
+
438
+						.item-tag-1 {
439
+							font-size: 16rpx;
440
+							color: #999;
441
+							height: 32rpx;
442
+							padding-left: 6rpx;
443
+							padding-right: 6rpx;
444
+							line-height: 32rpx;
445
+							text-align: center;
446
+						}
447
+					}
448
+				}
449
+			}
450
+		}
451
+
452
+		.tab-content {
453
+			display: flex;
454
+			flex-direction: row;
455
+			align-items: center;
456
+			justify-content: space-around;
457
+			background-color: #fff;
458
+
459
+			.tab-item {
460
+				display: flex;
461
+				flex-direction: column;
462
+				flex: 1;
463
+				align-items: center;
464
+				position: relative;
465
+				padding-top: 20rpx;
466
+
467
+				.tab-title {
468
+					font-size: 34rpx;
469
+					color: #333;
470
+					font-weight: bolder;
471
+					margin-bottom: 30rpx;
472
+				}
473
+
474
+				.tab-default-title {
475
+					font-size: 32rpx;
476
+					color: #666;
477
+					font-weight: bolder;
478
+					margin-bottom: 30rpx;
479
+				}
480
+
481
+				.tab-default-line {
482
+					width: 40rpx;
483
+					height: 10rpx;
484
+					background-color: #fff;
485
+					position: absolute;
486
+					bottom: 0;
487
+					border-radius: 10rpx;
488
+					margin-bottom: 10rpx;
489
+				}
490
+
491
+				.tab-line {
492
+					width: 40rpx;
493
+					height: 10rpx;
494
+					background-color: #ff0000;
495
+					position: absolute;
496
+					bottom: 0;
497
+					margin-bottom: 10rpx;
498
+					border-radius: 10rpx;
499
+				}
500
+			}
501
+		}
502
+
503
+		.fuc-content {
504
+			display: flex;
505
+			flex-direction: row;
506
+			align-items: center;
507
+			background-color: #fff;
508
+			padding-top: 20rpx;
509
+			padding-bottom: 30rpx;
510
+			justify-content: space-around;
511
+
512
+			.fuc-item {
513
+				display: flex;
514
+				flex-direction: column;
515
+				flex: 1;
516
+				align-items: center;
517
+				justify-content: center;
518
+
519
+				.fuc-icon {
520
+					width: 50rpx;
521
+					height: 54rpx;
522
+				}
523
+
524
+				.fuc-title {
525
+					color: #333;
526
+					font-size: 24rpx;
527
+					margin-top: 24rpx;
528
+				}
529
+			}
530
+		}
531
+
532
+		.head-content {
533
+			display: flex;
534
+			flex-direction: row;
535
+			align-items: center;
536
+			background-color: #fff;
537
+			padding-top: 20rpx;
538
+			padding-bottom: 20rpx;
539
+
540
+			.city-content {
541
+				display: flex;
542
+				flex-direction: row;
543
+				align-items: center;
544
+
545
+				.city-name {
546
+					font-size: 32rpx;
547
+					color: #333;
548
+					padding-left: 30rpx;
549
+					font-weight: bolder;
550
+					margin-right: 12rpx;
551
+				}
552
+
553
+				.down-arrow {
554
+					width: 24rpx;
555
+					height: 18rpx;
556
+				}
557
+			}
558
+
559
+			.search-content {
560
+				display: flex;
561
+				flex-direction: row;
562
+				align-items: center;
563
+				background-color: #f5f5f5;
564
+				height: 60rpx;
565
+				flex: 1;
566
+				border-radius: 60rpx;
567
+				padding-left: 20rpx;
568
+				margin-left: 24rpx;
569
+				padding-right: 20rpx;
570
+				box-sizing: border-box;
571
+				margin-right: 30rpx;
572
+
573
+				.search-icon {
574
+					width: 40rpx;
575
+					height: 40rpx;
576
+				}
577
+
578
+				.input-ty {
579
+					font-size: 26rpx;
580
+					color: #333;
581
+					padding-left: 20rpx;
582
+				}
583
+			}
584
+		}
585
+	}
586
+</style>
587
+
588
+<route lang="yaml">
589
+style:
590
+  navigationBarTitleText: 影票订单
591
+  enablePullDownRefresh: true
592
+</route>

+ 2 - 1
src/subPages/pages/my-profile/index.vue

@@ -101,7 +101,8 @@ function handleSubmit() {
101 101
     sex: formData.sex,
102 102
     // birthday: formData.birthday,
103 103
     birthday: currentDate.value,
104
-    mark: formData.mark
104
+    mark: formData.mark,
105
+	phone: formData.phone
105 106
   }).then(res => {
106 107
     if (res) {
107 108
       uni.showToast({

+ 134 - 57
src/subPages/pages/quick-fuc/business.vue

@@ -10,20 +10,20 @@
10 10
 				</view>
11 11
 			</scroll-view>
12 12
 		</view>
13
-		
13
+
14 14
 		<view class="banner-content">
15 15
 			<image class="top-banner" :src="topBanner" mode="aspectFill"></image>
16 16
 		</view>
17 17
 		<view class="fuc-content">
18
-			<view @click="onFucClick" class="fuc-item" v-for="(item,index) in MU_TABLE_LIST" :key="'fuc-item-'+index">
18
+			<view @click="onFucClick(index)" class="fuc-item" v-for="(item,index) in MU_TABLE_LIST"
19
+				:key="'fuc-item-'+index">
19 20
 				<text class="item-title">{{item.title}}</text>
20 21
 				<text class="item-des">{{item.des}}</text>
21 22
 				<image class="item-img" :src="item.icon" mode=""></image>
22 23
 			</view>
23 24
 		</view>
24 25
 		<view v-if="goodsList&& goodsList.length!=0" v-for="(item,index) in goodsList" :key="'goods-x-'+index">
25
-			<view class="vip-content" v-if="item.childList&& item.childList.length!=0"
26
-				@click="goShopClick(item.mer_id)">
26
+			<view class="vip-content" @click="goShopClick(item.mer_id)">
27 27
 				<image class="vip-bg" :src="vipBg" mode="aspectFill"></image>
28 28
 				<view class="left-lab-content">
29 29
 					<image class="lab-icon" :src="item.mer_avatar" mode="widthFix"></image>
@@ -38,22 +38,23 @@
38 38
 			<view class="goods-scoll-content">
39 39
 				<scroll-view scroll-x="true" class="goods-scoll-item">
40 40
 					<view @click="onDetailClick(childItem.product_id)" class="goods-scoll-item-x"
41
-						v-for="(childItem,childIndex) in item.childList" :key="'goods-scoll-item-x-'+childIndex">
41
+						v-for="(childItem,childIndex) in item.goods_list" :key="'goods-scoll-item-x-'+childIndex">
42 42
 						<view class="goods-item">
43 43
 							<image class="goods-img" :src="childItem.image" mode="aspectFill"></image>
44 44
 							<text class="goods-title">{{childItem.store_name}}</text>
45 45
 							<view class="price-content">
46
+								<text class="ylj-content">养老金¥{{childItem.yanglao}}</text>
47
+							</view>
48
+							<view class="price-content">
46 49
 								<text class="price-left">¥{{childItem.price}}</text>
47
-								<text class="price-rifht">¥{{childItem.ot_price}}</text>
48
-								<!-- <text class="goods-des">pv:{{childItem.pv?childItem.pv:0}}</text> -->
49 50
 							</view>
50 51
 						</view>
51 52
 					</view>
52 53
 				</scroll-view>
53 54
 			</view>
54
-			
55
+
55 56
 		</view>
56
-		
57
+
57 58
 		<CXBEmpty v-else />
58 59
 	</view>
59 60
 </template>
@@ -65,31 +66,47 @@
65 66
 	import {
66 67
 		apiGetCategoryList,
67 68
 		apiGetProductType,
68
-		apiGetProductList
69
+		apiGetProductList,
70
+		apiGetCommerceList
69 71
 	} from '~/apis/quickLink'
72
+	import {apiGetUserToken} from '~/apis/user'
70 73
 	import CXBEmpty from "~/components/CXBEmpty/CXBEmpty.vue";
71
-	import { getProductShare } from "~/apis/common";
72
-	import { useUserStore } from '~/stores/userStore'
73
-	import{IMG_CDN_URL} from '~/config/app.ts'
74
+	import {
75
+		getProductShare
76
+	} from "~/apis/common";
77
+	import {
78
+		useUserStore
79
+	} from '~/stores/userStore'
80
+	import {
81
+		IMG_CDN_URL,
82
+		BASE_URL
83
+	} from '~/config/app.ts'
84
+	
74 85
 	const currentIndex = ref(0)
75 86
 	const tabList = ref([])
76 87
 	const goodsList = ref([])
77
-	const topBanner =ref(`${IMG_CDN_URL}img_banner_dslm.png`)
78
-	const vipBg =ref(`${IMG_CDN_URL}item_smq_bg.png`)
79
-	let id=''
80
-
88
+	const topBanner = ref(`${IMG_CDN_URL}img_banner_dslm.png`)
89
+	const vipBg = ref(`${IMG_CDN_URL}item_smq_bg.png`)
90
+	const userTokenInfo = ref()
91
+	const itemList =ref([])
92
+	
93
+	const state = reactive({
94
+		pageSize: 10,
95
+		page: 1,
96
+		limit: 10,
97
+		cid: 0,
98
+	})
81 99
 
82 100
 	onLoad((option) => {
83
-		console.log();
101
+		getUserToken()
84 102
 		getCategoryList()
85
-		getProductType()
103
+		getCommerceList()
86 104
 		if (option && option.shareId) {
87
-		  userStore.setShareId(option.shareId)
105
+			userStore.setShareId(option.shareId)
88 106
 		}
89 107
 		getProductShare().then(res => {
90
-		  if (res) userStore.setShareId(res.share_id)
91
-		}).catch(message => {
92
-		})
108
+			if (res) userStore.setShareId(res.share_id)
109
+		}).catch(message => {})
93 110
 	})
94 111
 
95 112
 	onShareAppMessage(() => {
@@ -112,18 +129,19 @@
112 129
 
113 130
 	onReachBottom(() => {
114 131
 		console.log('到底了。。。')
115
-		
132
+        state.page += 1
133
+       getProduct()
116 134
 	})
117 135
 
118 136
 	onPullDownRefresh(() => {
119
-		getProductType()
137
+		getCommerceList()
120 138
 		uni.stopPullDownRefresh()
121 139
 	})
122 140
 
123 141
 	function onTabClick(position, id) {
124 142
 		currentIndex.value = position
125
-		id.value = id
126
-		getProductType()
143
+		state.cid = id
144
+		getCommerceList()
127 145
 	}
128 146
 
129 147
 	function goShopClick(id) {
@@ -133,17 +151,73 @@
133 151
 	}
134 152
 
135 153
 	function onDetailClick(id) {
154
+		console.log("==onDetailClick");
136 155
 		uni.navigateTo({
137
-			url: `/subPages/pages/store/product/detail?id=${id}`
156
+			url: `/subPages/pages/store/product/detail?id=${id}&initType=2`
138 157
 		})
139 158
 	}
140
-
141
-	function onFucClick() {
142
-		uni.showToast({
143
-			title: '升级中',
144
-			icon: 'none'
159
+	
160
+	function getUserToken() {
161
+		apiGetUserToken().then(res => {
162
+			userTokenInfo.value = res
145 163
 		})
146 164
 	}
165
+	
166
+
167
+	function onFucClick(position) {
168
+
169
+		if (position == 0 || position == 3) {
170
+
171
+			if (uni.getStorageSync('UID')) {
172
+				let _token = userTokenInfo.value
173
+				let params = {
174
+					x_token: _token.mweb_info.x_token,
175
+					storeStaff: _token.mweb_info.storeStaff,
176
+					user: {
177
+						account: _token.mweb_info.user.account,
178
+						pwd: _token.mweb_info.user.pwd,
179
+						uid: _token.mweb_info.user.uid,
180
+						user_number: _token.mweb_info.user.user_number,
181
+						user_type: _token.mweb_info.user.user_type,
182
+						wechat_user_id: _token.mweb_info.user.wechat_user_id,
183
+						mer_id: _token.mweb_info.user.mer_id,
184
+					}
185
+				}
186
+
187
+				let url = `${BASE_URL}/mweb/#/?data=${encodeURIComponent(JSON.stringify(params))}`
188
+				let info = {
189
+					url: url,
190
+					name: '店铺管理'
191
+				}
192
+				uni.navigateTo({
193
+					url: `/subPages/pages/mine-top/common-webView?info=${encodeURIComponent(JSON.stringify(info))}`
194
+				})
195
+			}else {
196
+				uni.showToast({
197
+					title:'请登录!',
198
+					icon:'none'
199
+				})
200
+				setTimeout(()=>{
201
+					pageStore.setPageConfig({
202
+						currentPage: {
203
+							type: 'tab',
204
+							url: '/pages/home/index'
205
+						}
206
+					})
207
+					return uni.redirectTo({
208
+						url: '/pages/user/login/index'
209
+					})
210
+				},300)
211
+			
212
+			}
213
+		} else {
214
+			uni.showToast({
215
+				title: '升级中',
216
+				icon: 'none'
217
+			})
218
+		}
219
+
220
+	}
147 221
 
148 222
 	function getCategoryList() {
149 223
 		apiGetCategoryList().then((res) => {
@@ -158,30 +232,22 @@
158 232
 			tabList.value = _list
159 233
 		})
160 234
 	}
161
-
162
-	function getProductType() {
235
+	
236
+	function getCommerceList(){
163 237
 		uni.showLoading({
164
-			title:'加载中...'
238
+			title: '加载中...'
165 239
 		})
166
-		apiGetProductType(id.value).then((res) => {
167
-			if (res && res.pageInfo && res.pageInfo.list) {
168
-				goodsList.value = res.pageInfo.list
169
-				dealData()
240
+		apiGetCommerceList(state.cid,state.page).then(res=>{
241
+			if (state.page === 1) {
242
+				goodsList.value = res.list
243
+			} else {
244
+			   goodsList.value.push(...res.list)
170 245
 			}
171
-			uni.hideLoading()
172
-		})
246
+		}).finally(()=>{uni.hideLoading()})
173 247
 	}
174 248
 
175
-	function dealData() {
176
-		for (let i = 0; i < goodsList.value.length; i++) {
177
-			let _id = goodsList.value[i].mer_id
178
-			apiGetProductList(_id).then(resx => {
179
-				if (resx.list && resx.list.length != 0) {
180
-					goodsList.value[i].childList = resx.list
181
-				}
182
-			})
183
-		}
184
-	}
249
+
250
+	
185 251
 </script>
186 252
 
187 253
 <style lang="scss" scoped>
@@ -193,6 +259,18 @@
193 259
 		background-color: #f8f8f8;
194 260
 		box-sizing: border-box;
195 261
 
262
+		.ylj-content {
263
+			height: 34rpx;
264
+			line-height: 34rpx;
265
+			text-align: left;
266
+			background-color: #eeeeee;
267
+			padding: 10rpx;
268
+			color: #666;
269
+			border-radius: 10rpx;
270
+			font-size: 24rpx;
271
+
272
+		}
273
+
196 274
 		.goods-content {
197 275
 			display: flex;
198 276
 			flex-direction: row;
@@ -214,7 +292,7 @@
214 292
 
215 293
 			.goods-img {
216 294
 				width: 300rpx;
217
-				height: 230rpx;
295
+				height: 320rpx;
218 296
 				border-top-right-radius: 20rpx;
219 297
 				border-top-left-radius: 20rpx;
220 298
 				background-color: #999;
@@ -235,7 +313,6 @@
235 313
 			.price-content {
236 314
 				margin-top: 10rpx;
237 315
 				display: flex;
238
-				margin-bottom: 20rpx;
239 316
 				flex-direction: row;
240 317
 				align-items: center;
241 318
 				padding-left: 16rpx;
@@ -247,6 +324,7 @@
247 324
 					font-size: 26rpx;
248 325
 					color: #333;
249 326
 					margin-right: 10rpx;
327
+					margin-bottom: 20rpx;
250 328
 				}
251 329
 
252 330
 				.price-rifht {
@@ -265,6 +343,7 @@
265 343
 			height: 100rpx;
266 344
 			display: flex;
267 345
 			flex-direction: row;
346
+			justify-content: space-between;
268 347
 			align-items: center;
269 348
 			box-sizing: border-box;
270 349
 
@@ -280,9 +359,7 @@
280 359
 				display: flex;
281 360
 				flex-direction: row;
282 361
 				align-items: center;
283
-				flex: 1;
284 362
 				z-index: 22;
285
-				justify-content: flex-end;
286 363
 
287 364
 				.right-tx {
288 365
 					color: #fff;
@@ -293,7 +370,7 @@
293 370
 				.right-icon {
294 371
 					width: 14rpx;
295 372
 					height: 10rpx;
296
-					margin-right: 20rpx;
373
+					margin-right: 30rpx;
297 374
 				}
298 375
 			}
299 376
 

+ 56 - 21
src/subPages/pages/quick-fuc/components/life-product.vue

@@ -11,6 +11,10 @@
11 11
 		pageType:{
12 12
 			type:Number,
13 13
 			default:0
14
+		},
15
+		initType:{
16
+			type:Number,
17
+			default:0
14 18
 		}
15 19
 	})
16 20
 	
@@ -22,7 +26,7 @@
22 26
 	
23 27
 	function handleProductItemClick(item) {
24 28
 		 uni.navigateTo({
25
-			url: `/subPages/pages/store/product/detail?id=${item.product_id}&type=${props.pageType}`
29
+			url: `/subPages/pages/store/product/detail?id=${item.product_id}&type=${props.pageType}&initType=${props.initType}`
26 30
 		})
27 31
 	}
28 32
 </script>
@@ -36,25 +40,29 @@
36 40
 				<text class="card-title line-clamp-2">{{item.store_name}}</text>
37 41
 			</view>
38 42
 
39
-			<!-- <view class="shop-content">
40
-				<image class="shop-icon" src="/static/icon/icon_shop_name.png" mode="widthFix"></image>
41
-				<text class="shop-name">{{item.shopName}}</text>
42
-			</view> -->
43
-              
43
+              <view class="annuity-content" v-if="item.pv && initType!=3 && initType!=0">
44
+              	<text  class="annuity-value">pv:{{dealNum(item.pv+'')}}</text>
45
+              </view>
44 46
 				
45
-			<view class="annuity-content" v-if="item.yanglao">
47
+			<view class="annuity-content" v-if="item.yanglao  && initType!=0">
46 48
 				 <text  class="annuity-value-x">养老金:¥{{dealNum(item.yanglao+'')}}</text>
47 49
 			</view>
48
-			<view class="annuity-content" v-if="item.pv">
49
-				<text  class="annuity-value">pv:{{dealNum(item.pv+'')}}</text>
50
+		
51
+			<view class="annuity-content" v-if="item.yanglao && initType==0">
52
+				 <text  class="annuity-value-x-0">养老金:¥{{dealNum(item.yanglao+'')}}</text>
50 53
 			</view>
54
+			
55
+			<view class="annuity-content" v-if="item.pv && initType==0">
56
+			  	<text  class="annuity-value-0">pv:{{dealNum(item.pv+'')}}</text>
57
+			</view>
58
+				
51 59
 
52 60
 			<view class="price-content">
53
-				<text class="price">{{item.price}}</text>
61
+				<text :class="initType==0?'price-s':'price'">{{item.price}}</text>
54 62
 				<text class="price-x">{{item.ot_price}}</text>
55 63
 				<view v-if="pageType==0" class="jf-content">积分</view>
56 64
 				<view v-if="pageType==0" class="jd-content">京豆</view>
57
-				<text v-if="pageType==1"  class="sell">已售{{item.sales}}</text>
65
+				<text v-if="pageType==1 && initType!=3"  class="sell">已售{{item.sales}}</text>
58 66
 			</view>
59 67
 
60 68
 		</view>
@@ -88,6 +96,13 @@
88 96
 				.price {
89 97
 					font-size: 28rpx;
90 98
 					font-weight: bolder;
99
+					color: #333;
100
+					margin-left: 20rpx;
101
+					margin-right: 10rpx;
102
+				}
103
+				.price-s {
104
+					font-size: 28rpx;
105
+					font-weight: bolder;
91 106
 					color: #F83554;
92 107
 					margin-left: 20rpx;
93 108
 					margin-right: 10rpx;
@@ -125,22 +140,42 @@
125 140
 				}
126 141
 			}
127 142
             .annuity-value {
128
-            	background-color: antiquewhite;
129
-            	color: #F83554;
130
-            	font-size: 24rpx;
143
+            	background-color: #fe0032;
144
+            	color: #fff;
145
+            	font-size: 26rpx;
131 146
             	border-radius: 4rpx;
132
-            	padding-left: 4rpx;
133
-            	padding-right: 4rpx;
147
+            	padding: 4rpx 6rpx;
134 148
             }
135 149
             .annuity-value-x {
136
-            	background-color: #faf0f1;
137
-            	color: #F83554;
150
+            	background-color: #f5f5f5;
151
+            	color: #333;
138 152
 				display: flex;
139
-            	font-size: 24rpx;
153
+            	font-size: 26rpx;
140 154
             	border-radius: 4rpx;
141
-            	padding-left: 4rpx;
142
-            	padding-right: 4rpx;
155
+            	padding: 4rpx 6rpx;
143 156
             }
157
+			
158
+			
159
+			
160
+			.annuity-value-0 {
161
+				background-color: #f5f5f5;
162
+				color: #F83554;
163
+				font-size: 24rpx;
164
+				border-radius: 4rpx;
165
+				padding-left: 4rpx;
166
+				padding-right: 4rpx;
167
+			}
168
+			.annuity-value-x-0 {
169
+				background-color: #ffefef;
170
+				color: #F83554;
171
+				font-size: 24rpx;
172
+				border-radius: 4rpx;
173
+				padding-left: 4rpx;
174
+				padding-right: 4rpx;
175
+			}
176
+			
177
+			
178
+			
144 179
 			.annuity-content {
145 180
 				display: flex;
146 181
 				margin-left: 20rpx;

+ 2 - 2
src/subPages/pages/quick-fuc/life.vue

@@ -38,7 +38,7 @@
38 38
 		
39 39
 		<CXBBackTop :Scroll_X="Scroll_X" :isCss="1" />
40 40
 		
41
-		<ProductList :list="pageList" v-if="pageList && pageList.length!=0" />
41
+		<ProductList :initType ='1' :list="pageList" v-if="pageList && pageList.length!=0" />
42 42
 		
43 43
         <CXBEmpty v-else></CXBEmpty>
44 44
 		
@@ -176,7 +176,7 @@
176 176
 
177 177
 	function handleItemClick(item) {
178 178
 		uni.navigateTo({
179
-			url: `/subPages/pages/store/product/detail?id=${item.product_id}`
179
+			url: `/subPages/pages/store/product/detail?id=${item.product_id}&initType=1`
180 180
 		})
181 181
 	}
182 182
 

+ 3 - 3
src/subPages/pages/quick-fuc/repurchase.vue

@@ -38,7 +38,7 @@
38 38
 		
39 39
 		<CXBBackTop :Scroll_X="Scroll_X" :isCss="1" />
40 40
 		
41
-		<ProductList :list="pageList" :pageType='1' v-if="pageList && pageList.length!=0" />
41
+		<ProductList :initType='3' :list="pageList" :pageType='1' v-if="pageList && pageList.length!=0" />
42 42
 		
43 43
         <CXBEmpty v-else></CXBEmpty>
44 44
 		
@@ -177,7 +177,7 @@
177 177
 	function handleItemClick(item) {
178 178
 		console.log("===item",item);
179 179
 		uni.navigateTo({
180
-			url: `/subPages/pages/store/product/detail?id=${item.product_id}type=1`
180
+			url: `/subPages/pages/store/product/detail?id=${item.product_id}&type=1&initType=3`
181 181
 		})
182 182
 	}
183 183
 
@@ -216,7 +216,7 @@
216 216
 
217 217
 <route lang="yaml">
218 218
 style:
219
-  navigationBarTitleText: 精彩生活
219
+  navigationBarTitleText: 复购区
220 220
   enablePullDownRefresh: true
221 221
 </route>
222 222
 

+ 3 - 1
src/subPages/pages/quick-fuc/shop.vue

@@ -5,7 +5,7 @@
5 5
 		<view class="title-content" :style="titleContentStyle">
6 6
 			<view class="title-info">
7 7
 				<image @click="onBackClick" class="left-icon" src="/static/icon/left_arrow.png" mode="widthFix"></image>
8
-				<text class="top-title">京东</text>
8
+				<text class="top-title">{{topTitle}}</text>
9 9
 			</view>
10 10
 		</view>
11 11
 		<view class="top-block-content" :style="navBarStyle">
@@ -65,6 +65,7 @@
65 65
 		title: '',
66 66
 		type: '',
67 67
 	})
68
+	const topTitle =ref('')
68 69
 	const navBarStyle = ref('')
69 70
 	const titleContentStyle = ref('')
70 71
 	const pageList = ref([])
@@ -94,6 +95,7 @@
94 95
 		}else if(state.type==KINGKONGKEY.SN){//苏宁易购
95 96
 			_title='苏宁易购'
96 97
 		}
98
+		topTitle.value = _title
97 99
 		uni.setNavigationBarTitle({
98 100
 			title: _title // 设置新的导航栏标题
99 101
 		});

+ 2 - 6
src/subPages/pages/quick-fuc/vip.vue

@@ -27,7 +27,7 @@
27 27
 		
28 28
 		<CXBBackTop :Scroll_X="Scroll_X" :isCss="1" />
29 29
 		
30
-		<ProductList :list="pageList" :pageType='1' v-if="pageList && pageList.length!=0" />
30
+		<ProductList :initType='0' :list="pageList" :pageType='1' v-if="pageList && pageList.length!=0" />
31 31
 		
32 32
         <CXBEmpty v-else></CXBEmpty>
33 33
 		
@@ -148,11 +148,7 @@
148 148
 		}
149 149
 	})
150 150
 
151
-	function handleItemClick(item) {
152
-		uni.navigateTo({
153
-			url: `/subPages/pages/store/product/detail?id=${item.product_id}`
154
-		})
155
-	}
151
+
156 152
 
157 153
 	function clearSearch() {
158 154
 		state.page = 1

+ 83 - 18
src/subPages/pages/record-detail/detail.vue

@@ -8,9 +8,13 @@
8 8
 			</view>
9 9
 			<view class="page-line"></view>
10 10
 			<text class="item-title">交易信息</text>
11
+		<view class="child-item">
12
+			<text class="child-item-title">来源</text>
13
+			<text class="child-item-value">{{dealType(dataInfo.type)}}</text>
14
+		</view>
11 15
 			<view class="child-item">
12 16
 				<text class="child-item-title">提现状态</text>
13
-				<text :class="dataInfo.status==0?'child-item-or-value':'child-item-value'">{{ dataInfo.status == '-1' ? '已失败' : (dataInfo.status == '0' ? '提现中' : dataInfo.status == '1'? '已到账' : '')}}</text>
17
+				<text :class="dataInfo.status==0?'child-item-or-value':(dataInfo.status==-1?'child-item-red-value':'child-item-value')">{{ dataInfo.status == '-1' ? '提现失败' : (dataInfo.status == '0' ? '提现中' : dataInfo.status == '1'? '已到账' : '')}}</text>
14 18
 			</view>
15 19
 			<view class="child-item">
16 20
 				<text class="child-item-title">提现时间</text>
@@ -20,6 +24,19 @@
20 24
 				<text class="child-item-title">打款时间</text>
21 25
 				<text class="child-item-value">{{dataInfo.status_time}}</text>
22 26
 			</view>
27
+			
28
+			<view class="child-item" v-if="dataInfo.service_money">
29
+				<text class="child-item-title">服务费</text>
30
+				<text class="child-item-value">{{dataInfo.service_money}}</text>
31
+			</view>
32
+			<view class="child-item" >
33
+				<text class="child-item-title">实际到账</text>
34
+				<text class="child-item-value">{{dataInfo.extract_price -dataInfo.service_money }}</text>
35
+			</view>
36
+			<view class="child-item-x" >
37
+				<text class="child-item-title">失败原因</text>
38
+				<text class="child-item-value-x">{{dataInfo.fail_msg }}</text>
39
+			</view>
23 40
 		</view>
24 41
 		
25 42
 		<view class="bottom-info">
@@ -33,6 +50,8 @@
33 50
 				<text class="child-item-value">{{dealIdcard(dataInfo.bank_info.user_card)}}</text>
34 51
 			</view>
35 52
 		</view>
53
+		
54
+		<view class="bottom-phone">客服电话:400-600-8888</view>
36 55
 	
37 56
 	</view>
38 57
 </template>
@@ -46,6 +65,18 @@
46 65
 		}
47 66
 	})
48 67
 	
68
+	function dealType(type){
69
+		 let name
70
+		 if(type==1){
71
+			 name='佣金提现'
72
+		 }else  if(type==2){
73
+			 name='养老金提现'
74
+		 } if(type==3){
75
+			 name='红包提现'
76
+		 }
77
+		 return name
78
+	}
79
+	
49 80
 	function dealIdcard(idCard){
50 81
 		return idCard.charAt(0) + '*'.repeat(idCard.length - 2) +idCard.charAt(idCard.length - 1);
51 82
 	}
@@ -70,6 +101,7 @@ style:
70 101
 		min-height: 100VH;
71 102
 		background-color: #f8f8f8;
72 103
 		box-sizing: border-box;
104
+		padding-bottom: 40rpx;
73 105
 		
74 106
 		.bottom-info{
75 107
 			background-color: #fff;
@@ -80,32 +112,65 @@ style:
80 112
 			margin-top: 20rpx;
81 113
 		}
82 114
 		
115
+		.bottom-phone{
116
+			display: flex;
117
+			flex-direction: row;
118
+			align-items: center;
119
+			justify-content: center;
120
+			font-size: 28rpx;
121
+			color: #999;
122
+			padding-top: 20rpx;
123
+			padding-bottom: 20rpx;
124
+		}
125
+		
126
+		.child-item-x{
127
+			display: flex;
128
+			flex-direction: column;
129
+			width: 100%;
130
+			margin-bottom: 30rpx;	
131
+		}
132
+		
83 133
 		.child-item{
84 134
 			display: flex;
85 135
 			flex-direction: row;
86 136
 			align-items: center;
87 137
 			width: 100%;
88 138
             margin-bottom: 30rpx;	
89
-					
90
-			.child-item-title{
91
-				flex: 1;
92
-				font-size: 30rpx;
93
-				color: #333;
94
-			}
95
-			.child-item-value{
96
-				font-size: 30rpx;
97
-				color: #333;
98
-			}
99
-			.child-item-or-value{
100
-				font-size: 30rpx;
101
-				color: #f98f35;
102
-			}
103 139
 		}
104
-		.item-title{
140
+		.child-item-title{
141
+			flex: 1;
142
+			font-size: 30rpx;
143
+			color: #333;
144
+		}
145
+		.child-item-value{
146
+			font-size: 30rpx;
147
+			color: #333;
148
+		}
149
+		
150
+		.child-item-value-x{
105 151
 			font-size: 30rpx;
152
+			color: #666;
153
+			padding: 30rpx;
154
+			margin-top: 20rpx;
155
+			background-color: #f8f8f8;
156
+			border-radius: 20rpx;
157
+			display: flex;
158
+			flex-direction: column;
159
+			min-height: 200rpx;
160
+		}
161
+		.child-item-or-value{
162
+			font-size: 30rpx;
163
+			color: #f98f35;
164
+		}
165
+		.child-item-red-value{
166
+			font-size: 30rpx;
167
+			color: #ff0000;
168
+		}
169
+		.item-title{
170
+			font-size: 32rpx;
106 171
 			font-weight: bolder;
107 172
 			color: #333;
108
-			margin-bottom: 30rpx;
173
+			margin-bottom: 40rpx;
109 174
 			margin-top: 30rpx;
110 175
 		}
111 176
 		.top-info{
@@ -139,7 +204,7 @@ style:
139 204
 					margin-bottom: 40rpx;
140 205
 				}
141 206
 				.info-num{
142
-					font-size: 50rpx;
207
+					font-size: 54rpx;
143 208
 					font-weight: bolder;
144 209
 					color: #333;
145 210
 					margin-bottom: 80rpx;

File diff suppressed because it is too large
+ 1262 - 1285
src/subPages/pages/store/product/detail.vue


+ 20 - 5
src/subPages/pages/store/product/other.vue

@@ -6,6 +6,7 @@ import {
6 6
   getDyProductDetail,
7 7
   getJTTProductDetail,
8 8
   getJdProductDetail,
9
+  getJdLink,
9 10
   getPddProductDetail,
10 11
   getShareId,
11 12
   getSuProductDetail,
@@ -67,14 +68,18 @@ const state = reactive({
67 68
   data: {},
68 69
   shareId: '',
69 70
   pddData: {},
71
+  JDUrl:''
70 72
 })
71 73
 const isShow = ref(false)
72 74
 const detail = ref<IProductDetail>()
73 75
 const detailclone = ref<IProductDetail>()
74 76
 const isNeedAuth = ref(false)
77
+
75 78
 onLoad((options: any) => {
76 79
   const data: Partial<IProductDetail> = JSON.parse(decodeBase64(options.params))
77 80
   state.pddData = data
81
+  
82
+  console.log("===state.pddData",state.pddData);
78 83
   userStore.setRedirectPage(`/subPages/pages/store/product/other?params=${encodeBase64(data)}`, 'page')
79 84
   // if (options.platform && options.id) {
80 85
   uni.showLoading({
@@ -152,8 +157,13 @@ function loadProductDetail(product: Partial<IProductDetail>) {
152 157
 		  getJdProductDetail(product.id).then((res) => {
153 158
 		    console.log('京东商品详情', res)
154 159
 		    const { data, status } = res
155
-
156
-		    const jdProduct = data[0]
160
+			 const jdProduct = data[0]
161
+			 
162
+           getJdLink(product.id,jdProduct.discount_link).then(res=>{
163
+			   console.log("===res",res);
164
+			   state.JDUrl=res.data.url
165
+		   })
166
+		   
157 167
 		    // console.log(jdProduct)
158 168
 		    mergeProductDetailclone({
159 169
 		      images: jdProduct.detail,
@@ -337,6 +347,8 @@ function handleBuyNow() {
337 347
     })
338 348
 	return
339 349
   }
350
+  
351
+  console.log("===product.platform",detail.value.platform);
340 352
   if (detail.value?.platform) {
341 353
     // 京东
342 354
     if (detail.value?.platform == 6 && detail.value?.materialUrl) {
@@ -345,7 +357,6 @@ function handleBuyNow() {
345 357
       if (detail.value && detail.value.materialUrl) {
346 358
         uni.navigateToMiniProgram({
347 359
           appId: 'wx91d27dbf599dff74',
348
-          // path: 'pages/union/proxy/proxy?spreadUrl=' + encodeURIComponent(detail.value?.spreadUrl),
349 360
           path: `pages/union/proxy/proxy?spreadUrl=${detail.value.materialUrl}`,
350 361
           extraData: {
351 362
             foo: 'bar',
@@ -369,10 +380,8 @@ function handleBuyNow() {
369 380
     }
370 381
     else if (detail.value?.platform == 1) {
371 382
       console.log(detail.value)
372
-
373 383
 	  if (detail.value.pddlink.mobile_url.includes('mobile.yangkeduo')) {
374 384
 		  isNeedAuth.value = true
375
-
376 385
 		  console.log('需要授权')
377 386
 	  }
378 387
 
@@ -406,6 +415,12 @@ function handleBuyNow() {
406 415
     else {
407 416
            let platformName = ''
408 417
             let clipboardData = ''
418
+			
419
+			if (detail.value?.platform ==  6) {
420
+			  platformName = '京东'
421
+			  clipboardData = state.JDUrl
422
+			  console.log("===state.JDUrl",state.JDUrl);
423
+			}
409 424
             if (detail.value?.platform == 5) {
410 425
               platformName = '淘宝'
411 426
               clipboardData = detail.value?.spreadUrl

+ 18 - 4
src/subPages/pages/withdrawal-record/index.vue

@@ -21,6 +21,17 @@ onLoad((option) => {
21 21
 	 	url:`/subPages/pages/record-detail/detail?itemInfo=${JSON.stringify(item)}`
22 22
 	 })
23 23
  }
24
+ function dealType(type:any){
25
+	 let name
26
+	 if(type==1){
27
+		 name='佣金'
28
+	 }else  if(type==2){
29
+		 name='养老金'
30
+	 } if(type==3){
31
+		 name='红包'
32
+	 }
33
+	 return name
34
+ }
24 35
  
25 36
 </script>
26 37
 <template>
@@ -33,14 +44,14 @@ onLoad((option) => {
33 44
 		<view class="item-content" @click="onItemClick(item)">
34 45
 			<div class="flex justify-between flex-1">
35 46
 			  <div>
36
-			    <div>{{item.title}}</div>
47
+			    <div>({{dealType(item.type)}}){{item.title}}</div>
37 48
 			    <div class="text-gray text-[11px] mt-20">{{ dayjs(item.create_time).format('YYYY-MM-DD HH:mm:ss') }}</div>
38 49
 			  </div>
39 50
 			  
40 51
 			  <div >
41 52
 			    <div>{{ item.extract_price }}</div>
42
-			    <div class="text-[11px] mt-20" :class="item.status == '0' ? 'or-color' : 'text-gray'"
43
-			    >{{ item.status == '-1' ? '失败' : (item.status == '0' ? '提现中' : item.status == '1'? '已到账' : '')}}</div>
53
+			    <div class="text-[11px] mt-20" :class="item.status == '0'  ? 'or-color' :(item.status == '-1'?'text-red':'text-gray') "
54
+			    >{{ item.status == '-1' ? '提现失败' : (item.status == '0' ? '提现中' : item.status == '1'? '已到账' : '')}}</div>
44 55
 			  </div>
45 56
 			</div>
46 57
 			<image class="right-icon" :src="IMG_CDN_NEW_URL+'look_all_221013.png'" mode="widthFix"></image>
@@ -70,13 +81,16 @@ page {
70 81
 	align-items: center;
71 82
 }
72 83
 .right-icon{
73
-	width: 30rpx;
84
+	width: 20rpx;
74 85
 	margin-left: 20rpx;
75 86
 	height: 20rpx;
76 87
 }
77 88
 .mt-20{
78 89
 	margin-top: 20rpx;
79 90
 }
91
+.text-red{
92
+	color:#ff0000
93
+}
80 94
 </style>
81 95
 <route lang="yaml">
82 96
 style:

+ 1 - 3
src/utils/http/http.ts

@@ -34,7 +34,6 @@ export class VRequest {
34 34
             isReturnNativeResponse, isTransformResponse,
35 35
         } = optionsTemp
36 36
 		
37
-		console.log("===apiUrl",apiUrl);
38 37
         // token header
39 38
         const token = getToken()
40 39
         if (token && withToken !== false) {
@@ -55,8 +54,7 @@ export class VRequest {
55 54
         if (apiUrl && isString(apiUrl)){
56 55
 			configTemp.url = `${apiUrl}${configTemp.url}`
57 56
 		}
58
-			console.log("===url", configTemp.url);
59
-            console.log("===data", configTemp.data);
57
+		console.log("===url", configTemp.url);
60 58
 			
61 59
         return new Promise((resolve, reject) => {
62 60
             uni.request({

+ 954 - 0
src/utils/seat-data.js

@@ -0,0 +1,954 @@
1
+export const seatData = [{
2
+	"YCoord": "3",
3
+	"XCoord": "11",
4
+	"SeatCode": "4413141101#01#14",
5
+	"Status": 0,
6
+	"RowNum": "1",
7
+	"ColumnNum": "14",
8
+	"type":1
9
+}, {
10
+	"YCoord": "3",
11
+	"XCoord": "12",
12
+	"SeatCode": "4413141101#01#13",
13
+	"Status": 0,
14
+	"RowNum": "1",
15
+	"ColumnNum": "13",
16
+	"type":1
17
+}, {
18
+	"YCoord": "3",
19
+	"XCoord": "13",
20
+	"SeatCode": "4413141101#01#12",
21
+	"Status": 0,
22
+	"RowNum": "1",
23
+	"ColumnNum": "12",
24
+	"type":1
25
+}, {
26
+	"YCoord": "3",
27
+	"XCoord": "14",
28
+	"SeatCode": "4413141101#01#11",
29
+	"Status": 0,
30
+	"RowNum": "1",
31
+	"ColumnNum": "11",
32
+	"type":1
33
+}, {
34
+	"YCoord": "3",
35
+	"XCoord": "15",
36
+	"SeatCode": "4413141101#01#10",
37
+	"Status": 0,
38
+	"RowNum": "1",
39
+	"ColumnNum": "10",
40
+	"type":1
41
+}, {
42
+	"YCoord": "3",
43
+	"XCoord": "16",
44
+	"SeatCode": "4413141101#01#09",
45
+	"Status": 0,
46
+	"RowNum": "1",
47
+	"ColumnNum": "9",
48
+	"type":1
49
+}, {
50
+	"YCoord": "3",
51
+	"XCoord": "17",
52
+	"SeatCode": "4413141101#01#08",
53
+	"Status": 0,
54
+	"RowNum": "1",
55
+	"ColumnNum": "8",
56
+	"type":1
57
+}, {
58
+	"YCoord": "3",
59
+	"XCoord": "18",
60
+	"SeatCode": "4413141101#01#07",
61
+	"Status": 0,
62
+	"RowNum": "1",
63
+	"ColumnNum": "7",
64
+	"type":1
65
+}, {
66
+	"YCoord": "3",
67
+	"XCoord": "19",
68
+	"SeatCode": "4413141101#01#06",
69
+	"Status": 0,
70
+	"RowNum": "1",
71
+	"ColumnNum": "6",
72
+	"type":1
73
+}, {
74
+	"YCoord": "3",
75
+	"XCoord": "20",
76
+	"SeatCode": "4413141101#01#05",
77
+	"Status": 0,
78
+	"RowNum": "1",
79
+	"ColumnNum": "5",
80
+	"type":1
81
+}, {
82
+	"YCoord": "3",
83
+	"XCoord": "21",
84
+	"SeatCode": "4413141101#01#04",
85
+	"Status": 0,
86
+	"RowNum": "1",
87
+	"ColumnNum": "4",
88
+	"type":1
89
+}, {
90
+	"YCoord": "3",
91
+	"XCoord": "22",
92
+	"SeatCode": "4413141101#01#03",
93
+	"Status": 0,
94
+	"RowNum": "1",
95
+	"ColumnNum": "3",
96
+	"type":1
97
+}, {
98
+	"YCoord": "3",
99
+	"XCoord": "23",
100
+	"SeatCode": "4413141101#01#02",
101
+	"Status": 0,
102
+	"RowNum": "1",
103
+	"ColumnNum": "2",
104
+	"type":1
105
+}, {
106
+	"YCoord": "3",
107
+	"XCoord": "24",
108
+	"SeatCode": "4413141101#01#01",
109
+	"Status": 0,
110
+	"RowNum": "1",
111
+	"ColumnNum": "1",
112
+	"type":1
113
+}, {
114
+	"YCoord": "3",
115
+	"XCoord": "10",
116
+	"SeatCode": "4413141101#01#15",
117
+	"Status": 0,
118
+	"RowNum": "1",
119
+	"ColumnNum": "15",
120
+	"type":1
121
+}, {
122
+	"YCoord": "4",
123
+	"XCoord": "10",
124
+	"SeatCode": "4413141101#02#15",
125
+	"Status": 0,
126
+	"RowNum": "2",
127
+	"ColumnNum": "15"
128
+}, {
129
+	"YCoord": "4",
130
+	"XCoord": "11",
131
+	"SeatCode": "4413141101#02#14",
132
+	"Status": 0,
133
+	"RowNum": "2",
134
+	"ColumnNum": "14"
135
+}, {
136
+	"YCoord": "4",
137
+	"XCoord": "12",
138
+	"SeatCode": "4413141101#02#13",
139
+	"Status": 0,
140
+	"RowNum": "2",
141
+	"ColumnNum": "13"
142
+}, {
143
+	"YCoord": "4",
144
+	"XCoord": "13",
145
+	"SeatCode": "4413141101#02#12",
146
+	"Status": 0,
147
+	"RowNum": "2",
148
+	"ColumnNum": "12"
149
+}, {
150
+	"YCoord": "4",
151
+	"XCoord": "14",
152
+	"SeatCode": "4413141101#02#11",
153
+	"Status": 0,
154
+	"RowNum": "2",
155
+	"ColumnNum": "11"
156
+}, {
157
+	"YCoord": "4",
158
+	"XCoord": "15",
159
+	"SeatCode": "4413141101#02#10",
160
+	"Status": 0,
161
+	"RowNum": "2",
162
+	"ColumnNum": "10"
163
+}, {
164
+	"YCoord": "4",
165
+	"XCoord": "16",
166
+	"SeatCode": "4413141101#02#09",
167
+	"Status": 0,
168
+	"RowNum": "2",
169
+	"ColumnNum": "9"
170
+}, {
171
+	"YCoord": "4",
172
+	"XCoord": "17",
173
+	"SeatCode": "4413141101#02#08",
174
+	"Status": 0,
175
+	"RowNum": "2",
176
+	"ColumnNum": "8"
177
+}, {
178
+	"YCoord": "4",
179
+	"XCoord": "18",
180
+	"SeatCode": "4413141101#02#07",
181
+	"Status": 0,
182
+	"RowNum": "2",
183
+	"ColumnNum": "7"
184
+}, {
185
+	"YCoord": "4",
186
+	"XCoord": "19",
187
+	"SeatCode": "4413141101#02#06",
188
+	"Status": 0,
189
+	"RowNum": "2",
190
+	"ColumnNum": "6"
191
+}, {
192
+	"YCoord": "4",
193
+	"XCoord": "20",
194
+	"SeatCode": "4413141101#02#05",
195
+	"Status": 0,
196
+	"RowNum": "2",
197
+	"ColumnNum": "5"
198
+}, {
199
+	"YCoord": "4",
200
+	"XCoord": "21",
201
+	"SeatCode": "4413141101#02#04",
202
+	"Status": 0,
203
+	"RowNum": "2",
204
+	"ColumnNum": "4"
205
+}, {
206
+	"YCoord": "4",
207
+	"XCoord": "22",
208
+	"SeatCode": "4413141101#02#03",
209
+	"Status": 0,
210
+	"RowNum": "2",
211
+	"ColumnNum": "3"
212
+}, {
213
+	"YCoord": "4",
214
+	"XCoord": "23",
215
+	"SeatCode": "4413141101#02#02",
216
+	"Status": 0,
217
+	"RowNum": "2",
218
+	"ColumnNum": "2"
219
+}, {
220
+	"YCoord": "4",
221
+	"XCoord": "24",
222
+	"SeatCode": "4413141101#02#01",
223
+	"Status": 0,
224
+	"RowNum": "2",
225
+	"ColumnNum": "1"
226
+}, {
227
+	"YCoord": "5",
228
+	"XCoord": "10",
229
+	"SeatCode": "4413141101#03#15",
230
+	"Status": 0,
231
+	"RowNum": "3",
232
+	"ColumnNum": "15"
233
+}, {
234
+	"YCoord": "5",
235
+	"XCoord": "11",
236
+	"SeatCode": "4413141101#03#14",
237
+	"Status": 0,
238
+	"RowNum": "3",
239
+	"ColumnNum": "14"
240
+}, {
241
+	"YCoord": "5",
242
+	"XCoord": "12",
243
+	"SeatCode": "4413141101#03#13",
244
+	"Status": 0,
245
+	"RowNum": "3",
246
+	"ColumnNum": "13"
247
+}, {
248
+	"YCoord": "5",
249
+	"XCoord": "13",
250
+	"SeatCode": "4413141101#03#12",
251
+	"Status": 0,
252
+	"RowNum": "3",
253
+	"ColumnNum": "12"
254
+}, {
255
+	"YCoord": "5",
256
+	"XCoord": "14",
257
+	"SeatCode": "4413141101#03#11",
258
+	"Status": 2,
259
+	"RowNum": "3",
260
+	"ColumnNum": "11"
261
+}, {
262
+	"YCoord": "5",
263
+	"XCoord": "15",
264
+	"SeatCode": "4413141101#03#10",
265
+	"Status": 2,
266
+	"RowNum": "3",
267
+	"ColumnNum": "10"
268
+}, {
269
+	"YCoord": "5",
270
+	"XCoord": "16",
271
+	"SeatCode": "4413141101#03#09",
272
+	"Status": 2,
273
+	"RowNum": "3",
274
+	"ColumnNum": "9"
275
+}, {
276
+	"YCoord": "5",
277
+	"XCoord": "17",
278
+	"SeatCode": "4413141101#03#08",
279
+	"Status": 0,
280
+	"RowNum": "3",
281
+	"ColumnNum": "8"
282
+}, {
283
+	"YCoord": "5",
284
+	"XCoord": "18",
285
+	"SeatCode": "4413141101#03#07",
286
+	"Status": 0,
287
+	"RowNum": "3",
288
+	"ColumnNum": "7"
289
+}, {
290
+	"YCoord": "5",
291
+	"XCoord": "19",
292
+	"SeatCode": "4413141101#03#06",
293
+	"Status": 0,
294
+	"RowNum": "3",
295
+	"ColumnNum": "6"
296
+}, {
297
+	"YCoord": "5",
298
+	"XCoord": "20",
299
+	"SeatCode": "4413141101#03#05",
300
+	"Status": 0,
301
+	"RowNum": "3",
302
+	"ColumnNum": "5"
303
+}, {
304
+	"YCoord": "5",
305
+	"XCoord": "21",
306
+	"SeatCode": "4413141101#03#04",
307
+	"Status": 0,
308
+	"RowNum": "3",
309
+	"ColumnNum": "4"
310
+}, {
311
+	"YCoord": "5",
312
+	"XCoord": "22",
313
+	"SeatCode": "4413141101#03#03",
314
+	"Status": 0,
315
+	"RowNum": "3",
316
+	"ColumnNum": "3"
317
+}, {
318
+	"YCoord": "5",
319
+	"XCoord": "23",
320
+	"SeatCode": "4413141101#03#02",
321
+	"Status": 0,
322
+	"RowNum": "3",
323
+	"ColumnNum": "2"
324
+}, {
325
+	"YCoord": "5",
326
+	"XCoord": "24",
327
+	"SeatCode": "4413141101#03#01",
328
+	"Status": 0,
329
+	"RowNum": "3",
330
+	"ColumnNum": "1"
331
+}, {
332
+	"YCoord": "6",
333
+	"XCoord": "10",
334
+	"SeatCode": "4413141101#04#15",
335
+	"Status": 0,
336
+	"RowNum": "4",
337
+	"ColumnNum": "15"
338
+}, {
339
+	"YCoord": "6",
340
+	"XCoord": "11",
341
+	"SeatCode": "4413141101#04#14",
342
+	"Status": 0,
343
+	"RowNum": "4",
344
+	"ColumnNum": "14"
345
+}, {
346
+	"YCoord": "6",
347
+	"XCoord": "12",
348
+	"SeatCode": "4413141101#04#13",
349
+	"Status": 2,
350
+	"RowNum": "4",
351
+	"ColumnNum": "13"
352
+}, {
353
+	"YCoord": "6",
354
+	"XCoord": "13",
355
+	"SeatCode": "4413141101#04#12",
356
+	"Status": 2,
357
+	"RowNum": "4",
358
+	"ColumnNum": "12"
359
+}, {
360
+	"YCoord": "6",
361
+	"XCoord": "14",
362
+	"SeatCode": "4413141101#04#11",
363
+	"Status": 0,
364
+	"RowNum": "4",
365
+	"ColumnNum": "11"
366
+}, {
367
+	"YCoord": "6",
368
+	"XCoord": "15",
369
+	"SeatCode": "4413141101#04#10",
370
+	"Status": 0,
371
+	"RowNum": "4",
372
+	"ColumnNum": "10"
373
+}, {
374
+	"YCoord": "6",
375
+	"XCoord": "16",
376
+	"SeatCode": "4413141101#04#09",
377
+	"Status": 0,
378
+	"RowNum": "4",
379
+	"ColumnNum": "9"
380
+}, {
381
+	"YCoord": "6",
382
+	"XCoord": "17",
383
+	"SeatCode": "4413141101#04#08",
384
+	"Status": 0,
385
+	"RowNum": "4",
386
+	"ColumnNum": "8"
387
+}, {
388
+	"YCoord": "6",
389
+	"XCoord": "18",
390
+	"SeatCode": "4413141101#04#07",
391
+	"Status": 0,
392
+	"RowNum": "4",
393
+	"ColumnNum": "7"
394
+}, {
395
+	"YCoord": "6",
396
+	"XCoord": "19",
397
+	"SeatCode": "4413141101#04#06",
398
+	"Status": 0,
399
+	"RowNum": "4",
400
+	"ColumnNum": "6"
401
+}, {
402
+	"YCoord": "6",
403
+	"XCoord": "20",
404
+	"SeatCode": "4413141101#04#05",
405
+	"Status": 0,
406
+	"RowNum": "4",
407
+	"ColumnNum": "5"
408
+}, {
409
+	"YCoord": "6",
410
+	"XCoord": "21",
411
+	"SeatCode": "4413141101#04#04",
412
+	"Status": 0,
413
+	"RowNum": "4",
414
+	"ColumnNum": "4"
415
+}, {
416
+	"YCoord": "6",
417
+	"XCoord": "22",
418
+	"SeatCode": "4413141101#04#03",
419
+	"Status": 0,
420
+	"RowNum": "4",
421
+	"ColumnNum": "3"
422
+}, {
423
+	"YCoord": "6",
424
+	"XCoord": "23",
425
+	"SeatCode": "4413141101#04#02",
426
+	"Status": 0,
427
+	"RowNum": "4",
428
+	"ColumnNum": "2"
429
+}, {
430
+	"YCoord": "6",
431
+	"XCoord": "24",
432
+	"SeatCode": "4413141101#04#01",
433
+	"Status": 0,
434
+	"RowNum": "4",
435
+	"ColumnNum": "1"
436
+}, {
437
+	"YCoord": "9",
438
+	"XCoord": "10",
439
+	"SeatCode": "4413141101#05#14",
440
+	"Status": 0,
441
+	"RowNum": "5",
442
+	"ColumnNum": "14"
443
+}, {
444
+	"YCoord": "9",
445
+	"XCoord": "11",
446
+	"SeatCode": "4413141101#05#13",
447
+	"Status": 2,
448
+	"RowNum": "5",
449
+	"ColumnNum": "13"
450
+}, {
451
+	"YCoord": "9",
452
+	"XCoord": "12",
453
+	"SeatCode": "4413141101#05#12",
454
+	"Status": 2,
455
+	"RowNum": "5",
456
+	"ColumnNum": "12"
457
+}, {
458
+	"YCoord": "9",
459
+	"XCoord": "13",
460
+	"SeatCode": "4413141101#05#11",
461
+	"Status": 2,
462
+	"RowNum": "5",
463
+	"ColumnNum": "11"
464
+}, {
465
+	"YCoord": "9",
466
+	"XCoord": "14",
467
+	"SeatCode": "4413141101#05#10",
468
+	"Status": 2,
469
+	"RowNum": "5",
470
+	"ColumnNum": "10"
471
+}, {
472
+	"YCoord": "9",
473
+	"XCoord": "15",
474
+	"SeatCode": "4413141101#05#09",
475
+	"Status": 2,
476
+	"RowNum": "5",
477
+	"ColumnNum": "9"
478
+}, {
479
+	"YCoord": "9",
480
+	"XCoord": "16",
481
+	"SeatCode": "4413141101#05#08",
482
+	"Status": 2,
483
+	"RowNum": "5",
484
+	"ColumnNum": "8"
485
+}, {
486
+	"YCoord": "9",
487
+	"XCoord": "17",
488
+	"SeatCode": "4413141101#05#07",
489
+	"Status": 0,
490
+	"RowNum": "5",
491
+	"ColumnNum": "7"
492
+}, {
493
+	"YCoord": "9",
494
+	"XCoord": "18",
495
+	"SeatCode": "4413141101#05#06",
496
+	"Status": 0,
497
+	"RowNum": "5",
498
+	"ColumnNum": "6"
499
+}, {
500
+	"YCoord": "9",
501
+	"XCoord": "19",
502
+	"SeatCode": "4413141101#05#05",
503
+	"Status": 0,
504
+	"RowNum": "5",
505
+	"ColumnNum": "5"
506
+}, {
507
+	"YCoord": "9",
508
+	"XCoord": "20",
509
+	"SeatCode": "4413141101#05#04",
510
+	"Status": 0,
511
+	"RowNum": "5",
512
+	"ColumnNum": "4"
513
+}, {
514
+	"YCoord": "9",
515
+	"XCoord": "21",
516
+	"SeatCode": "4413141101#05#03",
517
+	"Status": 0,
518
+	"RowNum": "5",
519
+	"ColumnNum": "3"
520
+}, {
521
+	"YCoord": "9",
522
+	"XCoord": "22",
523
+	"SeatCode": "4413141101#05#02",
524
+	"Status": 0,
525
+	"RowNum": "5",
526
+	"ColumnNum": "2"
527
+}, {
528
+	"YCoord": "9",
529
+	"XCoord": "23",
530
+	"SeatCode": "4413141101#05#01",
531
+	"Status": 0,
532
+	"RowNum": "5",
533
+	"ColumnNum": "1"
534
+}, {
535
+	"YCoord": "10",
536
+	"XCoord": "10",
537
+	"SeatCode": "4413141101#06#14",
538
+	"Status": 0,
539
+	"RowNum": "6",
540
+	"ColumnNum": "14"
541
+}, {
542
+	"YCoord": "10",
543
+	"XCoord": "11",
544
+	"SeatCode": "4413141101#06#13",
545
+	"Status": 0,
546
+	"RowNum": "6",
547
+	"ColumnNum": "13"
548
+}, {
549
+	"YCoord": "10",
550
+	"XCoord": "12",
551
+	"SeatCode": "4413141101#06#12",
552
+	"Status": 0,
553
+	"RowNum": "6",
554
+	"ColumnNum": "12"
555
+}, {
556
+	"YCoord": "10",
557
+	"XCoord": "13",
558
+	"SeatCode": "4413141101#06#11",
559
+	"Status": 0,
560
+	"RowNum": "6",
561
+	"ColumnNum": "11"
562
+}, {
563
+	"YCoord": "10",
564
+	"XCoord": "14",
565
+	"SeatCode": "4413141101#06#10",
566
+	"Status": 0,
567
+	"RowNum": "6",
568
+	"ColumnNum": "10"
569
+}, {
570
+	"YCoord": "10",
571
+	"XCoord": "15",
572
+	"SeatCode": "4413141101#06#09",
573
+	"Status": 0,
574
+	"RowNum": "6",
575
+	"ColumnNum": "9"
576
+}, {
577
+	"YCoord": "10",
578
+	"XCoord": "16",
579
+	"SeatCode": "4413141101#06#08",
580
+	"Status": 0,
581
+	"RowNum": "6",
582
+	"ColumnNum": "8"
583
+}, {
584
+	"YCoord": "10",
585
+	"XCoord": "17",
586
+	"SeatCode": "4413141101#06#07",
587
+	"Status": 0,
588
+	"RowNum": "6",
589
+	"ColumnNum": "7"
590
+}, {
591
+	"YCoord": "10",
592
+	"XCoord": "18",
593
+	"SeatCode": "4413141101#06#06",
594
+	"Status": 0,
595
+	"RowNum": "6",
596
+	"ColumnNum": "6"
597
+}, {
598
+	"YCoord": "10",
599
+	"XCoord": "19",
600
+	"SeatCode": "4413141101#06#05",
601
+	"Status": 0,
602
+	"RowNum": "6",
603
+	"ColumnNum": "5"
604
+}, {
605
+	"YCoord": "10",
606
+	"XCoord": "20",
607
+	"SeatCode": "4413141101#06#04",
608
+	"Status": 0,
609
+	"RowNum": "6",
610
+	"ColumnNum": "4"
611
+}, {
612
+	"YCoord": "10",
613
+	"XCoord": "21",
614
+	"SeatCode": "4413141101#06#03",
615
+	"Status": 0,
616
+	"RowNum": "6",
617
+	"ColumnNum": "3"
618
+}, {
619
+	"YCoord": "10",
620
+	"XCoord": "22",
621
+	"SeatCode": "4413141101#06#02",
622
+	"Status": 0,
623
+	"RowNum": "6",
624
+	"ColumnNum": "2"
625
+}, {
626
+	"YCoord": "10",
627
+	"XCoord": "23",
628
+	"SeatCode": "4413141101#06#01",
629
+	"Status": 0,
630
+	"RowNum": "6",
631
+	"ColumnNum": "1"
632
+}, {
633
+	"YCoord": "11",
634
+	"XCoord": "10",
635
+	"SeatCode": "4413141101#07#14",
636
+	"Status": 0,
637
+	"RowNum": "7",
638
+	"ColumnNum": "14"
639
+}, {
640
+	"YCoord": "11",
641
+	"XCoord": "11",
642
+	"SeatCode": "4413141101#07#13",
643
+	"Status": 0,
644
+	"RowNum": "7",
645
+	"ColumnNum": "13"
646
+}, {
647
+	"YCoord": "11",
648
+	"XCoord": "12",
649
+	"SeatCode": "4413141101#07#12",
650
+	"Status": 0,
651
+	"RowNum": "7",
652
+	"ColumnNum": "12"
653
+}, {
654
+	"YCoord": "11",
655
+	"XCoord": "13",
656
+	"SeatCode": "4413141101#07#11",
657
+	"Status": 0,
658
+	"RowNum": "7",
659
+	"ColumnNum": "11"
660
+}, {
661
+	"YCoord": "11",
662
+	"XCoord": "14",
663
+	"SeatCode": "4413141101#07#10",
664
+	"Status": 0,
665
+	"RowNum": "7",
666
+	"ColumnNum": "10"
667
+}, {
668
+	"YCoord": "11",
669
+	"XCoord": "15",
670
+	"SeatCode": "4413141101#07#09",
671
+	"Status": 0,
672
+	"RowNum": "7",
673
+	"ColumnNum": "9"
674
+}, {
675
+	"YCoord": "11",
676
+	"XCoord": "16",
677
+	"SeatCode": "4413141101#07#08",
678
+	"Status": 0,
679
+	"RowNum": "7",
680
+	"ColumnNum": "8"
681
+}, {
682
+	"YCoord": "11",
683
+	"XCoord": "17",
684
+	"SeatCode": "4413141101#07#07",
685
+	"Status": 0,
686
+	"RowNum": "7",
687
+	"ColumnNum": "7"
688
+}, {
689
+	"YCoord": "11",
690
+	"XCoord": "18",
691
+	"SeatCode": "4413141101#07#06",
692
+	"Status": 0,
693
+	"RowNum": "7",
694
+	"ColumnNum": "6"
695
+}, {
696
+	"YCoord": "11",
697
+	"XCoord": "19",
698
+	"SeatCode": "4413141101#07#05",
699
+	"Status": 0,
700
+	"RowNum": "7",
701
+	"ColumnNum": "5"
702
+}, {
703
+	"YCoord": "11",
704
+	"XCoord": "20",
705
+	"SeatCode": "4413141101#07#04",
706
+	"Status": 0,
707
+	"RowNum": "7",
708
+	"ColumnNum": "4"
709
+}, {
710
+	"YCoord": "11",
711
+	"XCoord": "21",
712
+	"SeatCode": "4413141101#07#03",
713
+	"Status": 0,
714
+	"RowNum": "7",
715
+	"ColumnNum": "3"
716
+}, {
717
+	"YCoord": "11",
718
+	"XCoord": "22",
719
+	"SeatCode": "4413141101#07#02",
720
+	"Status": 0,
721
+	"RowNum": "7",
722
+	"ColumnNum": "2"
723
+}, {
724
+	"YCoord": "11",
725
+	"XCoord": "23",
726
+	"SeatCode": "4413141101#07#01",
727
+	"Status": 0,
728
+	"RowNum": "7",
729
+	"ColumnNum": "1"
730
+}, {
731
+	"YCoord": "12",
732
+	"XCoord": "10",
733
+	"SeatCode": "4413141101#08#14",
734
+	"Status": 0,
735
+	"RowNum": "8",
736
+	"ColumnNum": "14"
737
+}, {
738
+	"YCoord": "12",
739
+	"XCoord": "11",
740
+	"SeatCode": "4413141101#08#13",
741
+	"Status": 0,
742
+	"RowNum": "8",
743
+	"ColumnNum": "13"
744
+}, {
745
+	"YCoord": "12",
746
+	"XCoord": "12",
747
+	"SeatCode": "4413141101#08#12",
748
+	"Status": 0,
749
+	"RowNum": "8",
750
+	"ColumnNum": "12"
751
+}, {
752
+	"YCoord": "12",
753
+	"XCoord": "13",
754
+	"SeatCode": "4413141101#08#11",
755
+	"Status": 0,
756
+	"RowNum": "8",
757
+	"ColumnNum": "11"
758
+}, {
759
+	"YCoord": "12",
760
+	"XCoord": "14",
761
+	"SeatCode": "4413141101#08#10",
762
+	"Status": 0,
763
+	"RowNum": "8",
764
+	"ColumnNum": "10"
765
+}, {
766
+	"YCoord": "12",
767
+	"XCoord": "15",
768
+	"SeatCode": "4413141101#08#09",
769
+	"Status": 0,
770
+	"RowNum": "8",
771
+	"ColumnNum": "9"
772
+}, {
773
+	"YCoord": "12",
774
+	"XCoord": "16",
775
+	"SeatCode": "4413141101#08#08",
776
+	"Status": 0,
777
+	"RowNum": "8",
778
+	"ColumnNum": "8"
779
+}, {
780
+	"YCoord": "12",
781
+	"XCoord": "17",
782
+	"SeatCode": "4413141101#08#07",
783
+	"Status": 0,
784
+	"RowNum": "8",
785
+	"ColumnNum": "7"
786
+}, {
787
+	"YCoord": "12",
788
+	"XCoord": "18",
789
+	"SeatCode": "4413141101#08#06",
790
+	"Status": 0,
791
+	"RowNum": "8",
792
+	"ColumnNum": "6"
793
+}, {
794
+	"YCoord": "12",
795
+	"XCoord": "19",
796
+	"SeatCode": "4413141101#08#05",
797
+	"Status": 0,
798
+	"RowNum": "8",
799
+	"ColumnNum": "5"
800
+}, {
801
+	"YCoord": "12",
802
+	"XCoord": "20",
803
+	"SeatCode": "4413141101#08#04",
804
+	"Status": 0,
805
+	"RowNum": "8",
806
+	"ColumnNum": "4"
807
+}, {
808
+	"YCoord": "12",
809
+	"XCoord": "21",
810
+	"SeatCode": "4413141101#08#03",
811
+	"Status": 0,
812
+	"RowNum": "8",
813
+	"ColumnNum": "3"
814
+}, {
815
+	"YCoord": "12",
816
+	"XCoord": "22",
817
+	"SeatCode": "4413141101#08#02",
818
+	"Status": 0,
819
+	"RowNum": "8",
820
+	"ColumnNum": "2"
821
+}, {
822
+	"YCoord": "12",
823
+	"XCoord": "23",
824
+	"SeatCode": "4413141101#08#01",
825
+	"Status": 0,
826
+	"RowNum": "8",
827
+	"ColumnNum": "1"
828
+}, {
829
+	"YCoord": "13",
830
+	"XCoord": "8",
831
+	"SeatCode": "4413141101#09#18",
832
+	"Status": 0,
833
+	"RowNum": "9",
834
+	"ColumnNum": "18"
835
+}, {
836
+	"YCoord": "13",
837
+	"XCoord": "9",
838
+	"SeatCode": "4413141101#09#17",
839
+	"Status": 0,
840
+	"RowNum": "9",
841
+	"ColumnNum": "17"
842
+}, {
843
+	"YCoord": "13",
844
+	"XCoord": "10",
845
+	"SeatCode": "4413141101#09#16",
846
+	"Status": 0,
847
+	"RowNum": "9",
848
+	"ColumnNum": "16"
849
+}, {
850
+	"YCoord": "13",
851
+	"XCoord": "11",
852
+	"SeatCode": "4413141101#09#15",
853
+	"Status": 0,
854
+	"RowNum": "9",
855
+	"ColumnNum": "15"
856
+}, {
857
+	"YCoord": "13",
858
+	"XCoord": "12",
859
+	"SeatCode": "4413141101#09#14",
860
+	"Status": 0,
861
+	"RowNum": "9",
862
+	"ColumnNum": "14"
863
+}, {
864
+	"YCoord": "13",
865
+	"XCoord": "13",
866
+	"SeatCode": "4413141101#09#13",
867
+	"Status": 0,
868
+	"RowNum": "9",
869
+	"ColumnNum": "13"
870
+}, {
871
+	"YCoord": "13",
872
+	"XCoord": "14",
873
+	"SeatCode": "4413141101#09#12",
874
+	"Status": 0,
875
+	"RowNum": "9",
876
+	"ColumnNum": "12"
877
+}, {
878
+	"YCoord": "13",
879
+	"XCoord": "15",
880
+	"SeatCode": "4413141101#09#11",
881
+	"Status": 0,
882
+	"RowNum": "9",
883
+	"ColumnNum": "11"
884
+}, {
885
+	"YCoord": "13",
886
+	"XCoord": "16",
887
+	"SeatCode": "4413141101#09#10",
888
+	"Status": 0,
889
+	"RowNum": "9",
890
+	"ColumnNum": "10"
891
+}, {
892
+	"YCoord": "13",
893
+	"XCoord": "17",
894
+	"SeatCode": "4413141101#09#09",
895
+	"Status": 0,
896
+	"RowNum": "9",
897
+	"ColumnNum": "9"
898
+}, {
899
+	"YCoord": "13",
900
+	"XCoord": "18",
901
+	"SeatCode": "4413141101#09#08",
902
+	"Status": 0,
903
+	"RowNum": "9",
904
+	"ColumnNum": "8"
905
+}, {
906
+	"YCoord": "13",
907
+	"XCoord": "19",
908
+	"SeatCode": "4413141101#09#07",
909
+	"Status": 0,
910
+	"RowNum": "9",
911
+	"ColumnNum": "7"
912
+}, {
913
+	"YCoord": "13",
914
+	"XCoord": "20",
915
+	"SeatCode": "4413141101#09#06",
916
+	"Status": 0,
917
+	"RowNum": "9",
918
+	"ColumnNum": "6"
919
+}, {
920
+	"YCoord": "13",
921
+	"XCoord": "21",
922
+	"SeatCode": "4413141101#09#05",
923
+	"Status": 0,
924
+	"RowNum": "9",
925
+	"ColumnNum": "5"
926
+}, {
927
+	"YCoord": "13",
928
+	"XCoord": "22",
929
+	"SeatCode": "4413141101#09#04",
930
+	"Status": 0,
931
+	"RowNum": "9",
932
+	"ColumnNum": "4"
933
+}, {
934
+	"YCoord": "13",
935
+	"XCoord": "23",
936
+	"SeatCode": "4413141101#09#03",
937
+	"Status": 0,
938
+	"RowNum": "9",
939
+	"ColumnNum": "3"
940
+}, {
941
+	"YCoord": "13",
942
+	"XCoord": "24",
943
+	"SeatCode": "4413141101#09#02",
944
+	"Status": 0,
945
+	"RowNum": "9",
946
+	"ColumnNum": "2"
947
+}, {
948
+	"YCoord": "13",
949
+	"XCoord": "25",
950
+	"SeatCode": "4413141101#09#01",
951
+	"Status": 0,
952
+	"RowNum": "9",
953
+	"ColumnNum": "1"
954
+}]

+ 29 - 0
src/utils/util.ts

@@ -87,3 +87,32 @@ export function formatDate(date, type, unit) {
87 87
 	}
88 88
 }
89 89
 
90
+
91
+ export function getRelativeDay(timestamp:any) {
92
+	  const today = new Date();
93
+	  today.setHours(0, 0, 0, 0); // 当前日期的零点
94
+	  const targetDate = new Date(timestamp);
95
+	  targetDate.setHours(0, 0, 0, 0); // 目标日期的零点
96
+	
97
+	  const diffDays = Math.round((targetDate - today) / (1000 * 3600 * 24));
98
+	  
99
+	  if (diffDays === 0) return '今天';
100
+	  if (diffDays === 1) return '明天';
101
+	  if (diffDays === 2) return '后天';
102
+	  return '';
103
+	}
104
+	
105
+	
106
+export	function getWeekday(timestamp:any) {
107
+	  const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
108
+	  const date = new Date(timestamp); // 注意:若时间戳为秒级需乘以1000
109
+	  return weekdays[date.getDay()];
110
+	}
111
+	
112
+   export function formatTimestamp(timestamp:any) {
113
+	  let _timestamp = timestamp*1000  
114
+	  const weekday = getWeekday(_timestamp);
115
+	  const relativeDay = getRelativeDay(_timestamp);
116
+	  return relativeDay ? relativeDay : weekday;
117
+	}
118
+

+ 11 - 1
uni-pages.d.ts

@@ -104,6 +104,16 @@ interface NavigateToOptions {
104 104
        "/subPages/pages/mine-top/qianbao" |
105 105
        "/subPages/pages/mine-top/repurchase" |
106 106
        "/subPages/pages/mine-top/vr" |
107
+       "/subPages/pages/movies/chooseSeat - 副本" |
108
+       "/subPages/pages/movies/chooseSeat" |
109
+       "/subPages/pages/movies/chooseSeat1" |
110
+       "/subPages/pages/movies/cityList" |
111
+       "/subPages/pages/movies/moviesIndex" |
112
+       "/subPages/pages/movies/moviesOrder" |
113
+       "/subPages/pages/movies/moviesTicketList" |
114
+       "/subPages/pages/movies/nearbyCinemas" |
115
+       "/subPages/pages/movies/orderDetail" |
116
+       "/subPages/pages/movies/orderList" |
107 117
        "/subPages/pages/my-profile/index" |
108 118
        "/subPages/pages/order/comment" |
109 119
        "/subPages/pages/order/detail" |
@@ -166,7 +176,7 @@ interface NavigateToOptions {
166 176
 interface RedirectToOptions extends NavigateToOptions {}
167 177
 
168 178
 interface SwitchTabOptions {
169
-  url: "/pages/home/index" | "/pages/store/nearby/index" | "/pages/dacang/list/index" | "/pages/user/index"
179
+  url: "/pages/home/index" | "/pages/dacang/list/index" | "/pages/user/index"
170 180
 }
171 181
 
172 182
 type ReLaunchOptions = NavigateToOptions | SwitchTabOptions;