Commit bb95169345a5f4633910e4ae4c6b1054fdaca667
1 parent
0e89efab
赤峰微信公众号 -- 临停支付
Showing
30 changed files
with
991 additions
and
238 deletions
dist 2.zip
No preview for this file type
dist.zip
No preview for this file type
index.html
package.json
... | ... | @@ -15,9 +15,11 @@ |
15 | 15 | "js-base64": "^3.6.0", |
16 | 16 | "less-loader": "^4.1.0", |
17 | 17 | "mint-ui": "^2.2.13", |
18 | + "moment": "^2.29.1", | |
18 | 19 | "node-sass": "^5.0.0", |
19 | 20 | "sass-loader": "^7.3.1", |
20 | 21 | "vue": "^2.5.2", |
22 | + "mint-ui": "^2.2.13", | |
21 | 23 | "vue-h5-popup": "^1.0.2", |
22 | 24 | "vue-router": "^3.0.1" |
23 | 25 | }, |
... | ... | @@ -62,9 +64,9 @@ |
62 | 64 | "vue-loader": "^13.3.0", |
63 | 65 | "vue-style-loader": "^3.0.1", |
64 | 66 | "vue-template-compiler": "^2.5.2", |
65 | - "webpack": "^3.6.0", | |
67 | + "webpack": "^3.4.1", | |
66 | 68 | "webpack-bundle-analyzer": "^2.9.0", |
67 | - "webpack-dev-server": "^2.9.1", | |
69 | + "webpack-dev-server": "^2.9.7", | |
68 | 70 | "webpack-merge": "^4.1.0" |
69 | 71 | }, |
70 | 72 | "engines": { | ... | ... |
src/api/orderPay/orderPay.js
... | ... | @@ -17,7 +17,6 @@ export function getOpenId(params) { // 获取OpenId |
17 | 17 | }) |
18 | 18 | } |
19 | 19 | |
20 | - | |
21 | 20 | export function vxPayQuery(params) { // 微信 |
22 | 21 | return request({ |
23 | 22 | url: 'weixinpay/publicUnifiedOrder', |
... | ... | @@ -26,22 +25,18 @@ export function vxPayQuery(params) { // 微信 |
26 | 25 | }) |
27 | 26 | } |
28 | 27 | |
29 | -// 新接口银联 | |
30 | 28 | |
31 | -export function doPay(params) { // 微信 | |
29 | +export function bankH5Pay(params) { // 农行 | |
32 | 30 | return request({ |
33 | - url: 'unionpay/doPay', | |
31 | + url: 'abcBankPay/bankPayForH5', | |
34 | 32 | method: 'post', |
35 | 33 | data: params |
36 | 34 | }) |
37 | 35 | } |
38 | 36 | |
39 | - | |
40 | -// 创建订单 | |
41 | - | |
42 | -export function doOrderCreate(params) { // 创建订单 | |
37 | +export function queryParkingRecordPageByCarNumbers(params) { // 支付完成后查询记录 | |
43 | 38 | return request({ |
44 | - url: 'unionpay/doOrderCreate', | |
39 | + url: 'queryParkOrder/queryParkingRecordPageByCarNumbers', | |
45 | 40 | method: 'post', |
46 | 41 | data: params |
47 | 42 | }) |
... | ... | @@ -50,3 +45,8 @@ export function doOrderCreate(params) { // 创建订单 |
50 | 45 | |
51 | 46 | |
52 | 47 | |
48 | + | |
49 | + | |
50 | + | |
51 | + | |
52 | + | ... | ... |
src/api/parkRecord/parkRecord.js
src/api/plateNumber/plateNumber.js
0 → 100644
src/assets/images/blackBG.png
0 → 100644
5.57 KB
src/assets/images/blueBG.png
0 → 100644
5.6 KB
src/assets/images/carBlack.png
0 → 100644
1.69 KB
src/assets/images/carBlue.png
0 → 100644
1.88 KB
src/assets/images/carGreen.png
0 → 100644
3.33 KB
src/assets/images/carWhite.png
0 → 100644
1.45 KB
src/assets/images/carYellow.png
0 → 100644
1.86 KB
src/assets/images/cards/carBg.png
0 → 100644
3.15 KB
src/assets/images/cards/cardPointBg.png
0 → 100644
23.4 KB
src/assets/images/greenBG.png
0 → 100644
5.92 KB
src/assets/images/sweet.png
0 → 100644
412 Bytes
src/assets/images/tip.png
0 → 100644
1.16 KB
src/assets/images/whiteBG.png
0 → 100644
5.68 KB
src/assets/images/yellowBG.png
0 → 100644
5.76 KB
src/main.js
... | ... | @@ -10,18 +10,33 @@ import h5Popup from 'vue-h5-popup' // 引入弹窗 |
10 | 10 | Vue.use(h5Popup) |
11 | 11 | |
12 | 12 | |
13 | -import MintUI from 'mint-ui' | |
14 | -import 'mint-ui/lib/style.css' | |
15 | -Vue.use(MintUI) // 引入MintUI | |
13 | +// import MintUI from 'mint-ui' | |
14 | +// import 'mint-ui/lib/style.css' | |
15 | +// Vue.use(MintUI) // 引入MintUI | |
16 | + | |
16 | 17 | |
18 | +import 'mint-ui/lib/style.css' | |
19 | +import { MessageBox } from 'mint-ui' | |
20 | +// Vue.use(MessageBox) | |
21 | +Vue.prototype.$msgbox = MessageBox | |
17 | 22 | |
18 | 23 | //全局设置的基本样式 |
19 | 24 | import './assets/css/base.scss' |
20 | 25 | |
21 | 26 | |
27 | +import moment from 'moment' | |
28 | +// 设置本地时区 | |
29 | +moment.locale('zh-cn') | |
30 | +Vue.prototype.$moment = moment | |
31 | + | |
32 | + | |
22 | 33 | import utils from './utils/utils' // 工具类 |
23 | 34 | Vue.prototype.$utils = utils |
24 | 35 | |
36 | +import Mint from 'mint-ui'; | |
37 | +import 'mint-ui/lib/style.css' | |
38 | +Vue.use(Mint); | |
39 | + | |
25 | 40 | |
26 | 41 | import 'swiper/dist/css/swiper.min.css' // 轮播 |
27 | 42 | import 'swiper/dist/js/swiper.min' | ... | ... |
src/router/index.js
... | ... | @@ -2,7 +2,7 @@ import Vue from 'vue' |
2 | 2 | import Router from 'vue-router' |
3 | 3 | import plateNumber from '@/views/parkPay/plateNumber' |
4 | 4 | import parkRecord from '@/views/parkPay/parkRecord' |
5 | -import selfNav from '@/views/mySelf/selfNav' | |
5 | +// import selfNav from '@/views/mySelf/selfNav' | |
6 | 6 | |
7 | 7 | Vue.use(Router) |
8 | 8 | |
... | ... | @@ -11,7 +11,7 @@ export default new Router({ |
11 | 11 | { |
12 | 12 | path: '/', |
13 | 13 | redirect: { |
14 | - name: 'selfNav' | |
14 | + name: 'plateNumber' | |
15 | 15 | } |
16 | 16 | }, |
17 | 17 | // { |
... | ... | @@ -37,36 +37,50 @@ export default new Router({ |
37 | 37 | component: () => import("@/views/parkPay/orderPay.vue") |
38 | 38 | }, |
39 | 39 | |
40 | - //---------------- 个人页面导航 | |
41 | - { | |
42 | - path: '/selfNav', | |
43 | - name: 'selfNav', | |
44 | - component: () => import("@/views/mySelf/selfNav.vue") | |
45 | - }, | |
46 | - | |
47 | - // ------------------------建议反馈 | |
48 | - { | |
49 | - path: '/suggestionBack', | |
50 | - name: 'suggestionBack', | |
51 | - component: () => import("@/views/mySelf/feedback/suggestionBack.vue") | |
52 | - }, | |
53 | - | |
54 | - // ------------------------停车记录 | |
55 | - { | |
56 | - path: '/parkNotes', | |
57 | - name: 'parkNotes', | |
58 | - component: () => import("@/views/mySelf/parkNotes/parkNotes.vue") | |
59 | - }, | |
60 | - | |
61 | - | |
62 | - // ------------------------停车记录 | |
63 | - { | |
64 | - path: '/binDing', | |
65 | - name: 'binDing', | |
66 | - component: () => import("@/views/binding/binDing.vue") | |
67 | - }, | |
68 | - | |
69 | - | |
40 | + // //---------------- 个人页面导航 | |
41 | + // { | |
42 | + // path: '/selfNav', | |
43 | + // name: 'selfNav', | |
44 | + // component: () => import("@/views/mySelf/selfNav.vue") | |
45 | + // }, | |
46 | + // | |
47 | + // // ------------------------建议反馈 | |
48 | + // { | |
49 | + // path: '/suggestionBack', | |
50 | + // name: 'suggestionBack', | |
51 | + // component: () => import("@/views/mySelf/feedback/suggestionBack.vue") | |
52 | + // }, | |
53 | + // | |
54 | + // // ------------------------停车记录 | |
55 | + // { | |
56 | + // path: '/parkNotes', | |
57 | + // name: 'parkNotes', | |
58 | + // component: () => import("@/views/mySelf/parkNotes/parkNotes.vue") | |
59 | + // }, | |
60 | + // | |
61 | + // | |
62 | + // // ------------------------停车记录 | |
63 | + // { | |
64 | + // path: '/binDing', | |
65 | + // name: 'binDing', | |
66 | + // component: () => import("@/views/binding/binDing.vue") | |
67 | + // }, | |
68 | + // | |
69 | + // | |
70 | + // // ------------------------购买会员卡提示 | |
71 | + // { | |
72 | + // path: '/cardPoint', | |
73 | + // name: 'cardPoint', | |
74 | + // component: () => import("@/views/cards/cardPoint.vue") | |
75 | + // }, | |
76 | + // | |
77 | + // | |
78 | + // // ------------------------购买会员卡 | |
79 | + // { | |
80 | + // path: '/buyCard', | |
81 | + // name: 'buyCard', | |
82 | + // component: () => import("@/views/cards/buyCard.vue") | |
83 | + // }, | |
70 | 84 | |
71 | 85 | |
72 | 86 | ... | ... |
src/utils/request.js
... | ... | @@ -7,7 +7,7 @@ const service = axios.create({ |
7 | 7 | // http://pay.service.renniting.cn/ 赤峰 |
8 | 8 | // http://pay.service.huangshiparking.com/ 黄石正式环境 |
9 | 9 | // http://39.98.54.240:8090/ 黄石测试环境 |
10 | - baseURL: 'http://pay.service.huangshiparking.com/', // url = base url + request url | |
10 | + baseURL: 'http://pay.service.renniting.cn/v1', // url = base url + request url | |
11 | 11 | // withCredentials: true, // send cookies when cross-domain requests |
12 | 12 | timeout: 6000 // request timeout |
13 | 13 | }) | ... | ... |
src/utils/utils.js
... | ... | @@ -12,6 +12,34 @@ export default { |
12 | 12 | return pwd; |
13 | 13 | }, |
14 | 14 | |
15 | + formatDate: function(secs, type=0){ //type是可选参数,因为json中时间的格式是year-month-date,不能识别XX年XX月XX日 | |
16 | + var t = new Date(secs) | |
17 | + var year = t.getFullYear() | |
18 | + var month = t.getMonth() + 1 | |
19 | + if(month < 10){ month = '0' + month } | |
20 | + var date = t.getDate() | |
21 | + if(date < 10){ date = '0' + date } | |
22 | + var hour = t.getHours() | |
23 | + if(hour < 10){ hour = '0' + hour } | |
24 | + var minute = t.getMinutes() | |
25 | + if(minute < 10){ minute = '0' + minute } | |
26 | + var second = t.getSeconds() | |
27 | + if(second < 10){ second = '0' + second } | |
28 | + if(type==0){ | |
29 | + return year + '年' + month + '月' + date + '日' | |
30 | + }else{ | |
31 | + return year + '-'+month+'-'+date | |
32 | + }}, | |
33 | + | |
34 | + timestampToTime: function (timestamp) { | |
35 | + var d = new Date(timestamp);//时间戳为10位需*1000,时间戳为13位的话不需乘1000 | |
36 | + var youWant=d.getFullYear() + '-' + this.completedString(d.getMonth() + 1) + '-' + this.completedString(d.getDate()) ; | |
37 | + return youWant | |
38 | + }, | |
39 | + completedString:function(s) { | |
40 | + return s < 10 ? '0' + s : s | |
41 | + }, | |
42 | + | |
15 | 43 | |
16 | 44 | |
17 | 45 | dateFormat: function (msd) { // 时间转换 |
... | ... | @@ -80,27 +108,53 @@ export default { |
80 | 108 | } else if (/AlipayClient/.test(window.navigator.userAgent)) { |
81 | 109 | console.log("支付宝客户端"); |
82 | 110 | return '支付宝' |
83 | - } else { | |
111 | + } else if (/BankabciPhone/.test(window.navigator.userAgent)) { | |
112 | + console.log("农行客户端"); | |
113 | + return '立即' | |
114 | + }else if (/BankabcAndroid/.test(window.navigator.userAgent)) { | |
115 | + console.log("农行客户端"); | |
116 | + return '立即' | |
117 | + }else { | |
84 | 118 | console.log("其他浏览器"); |
85 | 119 | return '支付宝' |
86 | 120 | } |
87 | 121 | }, |
122 | + | |
123 | + // 1:支付宝 2:微信 3:银联 10:H5 4微信公众号 34 农行 | |
124 | + clientBrowsePayType: function () { // 判断客户端 | |
125 | + if (/MicroMessenger/.test(window.navigator.userAgent)) { | |
126 | + console.log("微信客户端"); | |
127 | + return '4' | |
128 | + } else if (/AlipayClient/.test(window.navigator.userAgent)) { | |
129 | + console.log("支付宝客户端"); | |
130 | + return '1' | |
131 | + } else if (/BankabciPhone/.test(window.navigator.userAgent)) { | |
132 | + console.log("农行客户端"); | |
133 | + return '34' | |
134 | + }else if (/BankabcAndroid/.test(window.navigator.userAgent)) { | |
135 | + console.log("农行客户端"); | |
136 | + return '34' | |
137 | + }else { | |
138 | + console.log("其他浏览器"); | |
139 | + return '1' | |
140 | + } | |
141 | + }, | |
88 | 142 | // 0eca8f5373ca4866aec2f8e9d9367104 老的id |
89 | 143 | // 14318527b13840c2a4af63fef52c2d6e 老的签名 |
90 | 144 | |
91 | 145 | // ud8yq5tv0inxupc05xfeau39jywlqoj2 新的id |
92 | 146 | // ny1u72b6k374sg379z0kqjgfxe2ycnpw 新的签名 |
93 | 147 | |
94 | - myVarAppid:'0eca8f5373ca4866aec2f8e9d9367104',// 公共请求Appid | |
148 | + myVarAppid:'ud8yq5tv0inxupc05xfeau39jywlqoj2',// 公共请求Appid | |
95 | 149 | |
96 | 150 | myDeviceInfo: 'BC0703A4-AFB0-4B51-9089-9B7487C0CC6E', // 公共请求设备信息 |
97 | 151 | |
98 | - myVxAppId: 'wxa1a66cc7d263afe6', | |
152 | + myVxAppId: 'wx2af2bab90d433c86', | |
99 | 153 | // 测试环境 微信赤峰 appid wxff4cebaedbf4f886 |
100 | 154 | // 微信赤峰 appid wx2af2bab90d433c86 |
101 | 155 | // 黄石 appid wxa1a66cc7d263afe6 |
102 | 156 | |
103 | - myOrgId: '10079', // 归属地 赤峰id 10003 黄石 10079 | |
157 | + myOrgId: '10003', // 归属地 赤峰id 10003 黄石 10079 | |
104 | 158 | |
105 | 159 | myGetSign: function (objb) { // 获取签名 |
106 | 160 | var compare = function (obj1, obj2) { |
... | ... | @@ -115,13 +169,13 @@ export default { |
115 | 169 | } |
116 | 170 | } |
117 | 171 | objb.sort(compare); |
118 | - var strmd5 = '14318527b13840c2a4af63fef52c2d6e'; | |
172 | + var strmd5 = 'ny1u72b6k374sg379z0kqjgfxe2ycnpw'; | |
119 | 173 | for(var i=0;i<objb.length;i++){ |
120 | 174 | if(objb[i].value != null&&objb[i].value != ''){ |
121 | 175 | strmd5 += objb[i].keyname+objb[i].value; |
122 | 176 | } |
123 | 177 | } |
124 | - strmd5 += '14318527b13840c2a4af63fef52c2d6e'; | |
178 | + strmd5 += 'ny1u72b6k374sg379z0kqjgfxe2ycnpw'; | |
125 | 179 | // console.log('strmd5-------->'+strmd5); |
126 | 180 | strmd5 = md5(strmd5); |
127 | 181 | strmd5=strmd5.toUpperCase(); | ... | ... |
src/views/cards/buyCard.vue
0 → 100644
1 | +<template> | |
2 | + <div> | |
3 | + <ul class="choose-area"> | |
4 | + <li> | |
5 | + <div style="color: #666">卡名称</div> | |
6 | + <div>微纳园卡</div> | |
7 | + </li> | |
8 | + | |
9 | + <li> | |
10 | + <div style="color: #666">选择卡类型</div> | |
11 | + <div @click="popupVisible = true">{{carType}}</div> | |
12 | + <div class="arrow">></div> | |
13 | + </li> | |
14 | + | |
15 | + | |
16 | + <li> | |
17 | + <div style="color: #666">绑定车牌</div> | |
18 | + <div @click="carNumberVisible = true">{{carNumber}}</div> | |
19 | + <div class="arrow">></div> | |
20 | + </li> | |
21 | + | |
22 | + <li> | |
23 | + <div style="color: #A31414">生效时间</div> | |
24 | + <div style="color: #A31414" @click="selectData">{{ $utils.timestampToTime(time) }}</div> | |
25 | + <div class="arrow">></div> | |
26 | + </li> | |
27 | + | |
28 | + <li> | |
29 | + <div style="color: #666">有效期至</div> | |
30 | + <div>{{ $utils.timestampToTime(endDate)}}</div> | |
31 | + </li> | |
32 | + | |
33 | + | |
34 | + <li> | |
35 | + <div style="color: #666">购买数量</div> | |
36 | + <div class="choose-num"> | |
37 | + <span @click="addCardNum">+</span> | |
38 | + <span>{{cardNum}}</span> | |
39 | + <span @click="reduceCarNum">-</span> | |
40 | + </div> | |
41 | + </li> | |
42 | + | |
43 | + <li> | |
44 | + <div style="color: #666">单价</div> | |
45 | + <div>¥10.00</div> | |
46 | + </li> | |
47 | + | |
48 | + | |
49 | + <li> | |
50 | + <div style="color: #666">优惠金额</div> | |
51 | + <div>¥0.00</div> | |
52 | + </li> | |
53 | + | |
54 | + <li> | |
55 | + <div style="color: #666">应付金额</div> | |
56 | + <div style="color: #A31414">¥30.00</div> | |
57 | + </li> | |
58 | + | |
59 | + </ul> | |
60 | + | |
61 | + <div class="parkArea leftRightPadding"> | |
62 | + <p class="parkAreaTitle"> | |
63 | + <span>本卡同时适用于以下停车场:</span> | |
64 | + <span class="parkMore" @click="parkMoreVisible = true">查看更多</span> | |
65 | + </p> | |
66 | + | |
67 | + <p>停车场停车场停车停车场</p> | |
68 | + </div> | |
69 | + | |
70 | + <div style="margin-top: 34px" class="leftRightPadding"> | |
71 | + <mt-button type="danger" size="large">确定购买</mt-button> | |
72 | + </div> | |
73 | + | |
74 | + <!-- @touchmove.prevent 阻止默认事件,在选择时间时阻止页面也跟着滚动--> | |
75 | + <div @touchmove.prevent> | |
76 | + <mt-datetime-picker | |
77 | + lockScroll="true" | |
78 | + ref="datePicker" | |
79 | + v-model="dateVal" | |
80 | + type="date" | |
81 | + year-format="{value} 年" | |
82 | + month-format="{value} 月" | |
83 | + date-format="{value} 日" | |
84 | + :startDate="startDate" | |
85 | + @confirm="handleConfirm()" | |
86 | + ></mt-datetime-picker> | |
87 | + </div> | |
88 | + | |
89 | + | |
90 | + <mt-actionsheet | |
91 | + :actions="actions" | |
92 | + v-model="popupVisible"> | |
93 | + </mt-actionsheet> | |
94 | + | |
95 | + <mt-actionsheet | |
96 | + :actions="carNumList" | |
97 | + v-model="carNumberVisible"> | |
98 | + </mt-actionsheet> | |
99 | + | |
100 | + <mt-popup | |
101 | + v-model="parkMoreVisible" class="park-list-wrap" | |
102 | + > | |
103 | + <ul class="park-list"> | |
104 | + <li v-for="(i, index) in 10">{{index+1}}、停车场{{i}}</li> | |
105 | + </ul> | |
106 | + </mt-popup> | |
107 | + | |
108 | + </div> | |
109 | +</template> | |
110 | + | |
111 | +<script> | |
112 | +import { timestampToTime } from '../../utils/utils.js' | |
113 | + | |
114 | +export default { | |
115 | + name: 'buyCard', | |
116 | + data() { | |
117 | + return { | |
118 | + startDate: new Date(), | |
119 | + dateVal: '', | |
120 | + selectedValue: '', | |
121 | + time: new Date(), | |
122 | + endDate:new Date(), | |
123 | + popupVisible: false, | |
124 | + actions: [ | |
125 | + {name:'月卡',num:1, method: this.clickAction }, | |
126 | + {name:'季卡',num:3, method: this.clickAction }, | |
127 | + {name:'年卡',num:12, method: this.clickAction }, | |
128 | + | |
129 | + ], | |
130 | + carType:'月卡', | |
131 | + carNumList:[ | |
132 | + {name:'停车场1',method: this.clickActionCarNum }, | |
133 | + {name:'停车场2',method: this.clickActionCarNum }, | |
134 | + {name:'停车场3',method: this.clickActionCarNum }, | |
135 | + {name:'停车场4',method: this.clickActionCarNum }, | |
136 | + {name:'停车场5',method: this.clickActionCarNum }, | |
137 | + ], | |
138 | + carNumber:'', | |
139 | + carNumberVisible:false, | |
140 | + parkMoreVisible:false, | |
141 | + cardNum:1 | |
142 | + } | |
143 | + }, | |
144 | + methods: { | |
145 | + //打开时间选择器 | |
146 | + selectData() { | |
147 | + | |
148 | + this.$refs['datePicker'].open() | |
149 | + }, | |
150 | + handleConfirm() { | |
151 | + console.log(this.dateVal) | |
152 | + this.time = this.$utils.timestampToTime(this.dateVal); | |
153 | + }, | |
154 | + clickAction(e){ | |
155 | + console.log(e.name) | |
156 | + this.carType = e.name | |
157 | + this.endDate = this.time | |
158 | + }, | |
159 | + clickActionCarNum(e){ | |
160 | + this.carNumber = e.name | |
161 | + }, | |
162 | + addCardNum(){ // 增加购买数量 | |
163 | + this.cardNum ++ | |
164 | + }, | |
165 | + reduceCarNum(){ // 增加购买数量 | |
166 | + if(this.cardNum==1){ | |
167 | + return | |
168 | + } | |
169 | + this.cardNum -- | |
170 | + }, | |
171 | + | |
172 | + | |
173 | + | |
174 | + }, | |
175 | + filters: { | |
176 | + formatDate(time) { | |
177 | + var date = new Date(time); | |
178 | + return formatDate(date) | |
179 | + } | |
180 | + }, | |
181 | +} | |
182 | +</script> | |
183 | + | |
184 | +<style scoped lang="scss"> | |
185 | + .choose-area { | |
186 | + background: #fff; | |
187 | + padding: 0 10px; | |
188 | + } | |
189 | + | |
190 | + .choose-area > li { | |
191 | + padding-right: 20px; | |
192 | + position: relative; | |
193 | + height: 38px; | |
194 | + line-height: 38px; | |
195 | + border-bottom: 1px solid #EFEFEF; | |
196 | + display: flex; | |
197 | + justify-content: space-between; | |
198 | + .arrow { | |
199 | + position: absolute; | |
200 | + right: 0; | |
201 | + top: 0; | |
202 | + font-size: 16px; | |
203 | + } | |
204 | + &:last-child { | |
205 | + border-bottom: 0; | |
206 | + } | |
207 | + } | |
208 | + .choose-num{ | |
209 | + height: 28px; | |
210 | + margin-top: 5px; | |
211 | + line-height: 28px; | |
212 | + display: flex; | |
213 | + border: 1px solid #D8D8D8; | |
214 | + span{ | |
215 | + display: inline-block; | |
216 | + &:nth-of-type(1){ | |
217 | + width: 28px; | |
218 | + height: 28px; | |
219 | + text-align: center; | |
220 | + cursor: pointer; | |
221 | + } | |
222 | + &:nth-of-type(2){ | |
223 | + width: 50px; | |
224 | + text-align: center; | |
225 | + border-left: 1px solid #D8D8D8; | |
226 | + border-right: 1px solid #D8D8D8; | |
227 | + } | |
228 | + &:nth-of-type(3){ | |
229 | + width: 28px; | |
230 | + height: 28px; | |
231 | + text-align: center; | |
232 | + cursor: pointer; | |
233 | + } | |
234 | + } | |
235 | + } | |
236 | + .parkArea{ | |
237 | + padding-top: 10px; | |
238 | + padding-bottom: 10px; | |
239 | + margin-top: 10px; | |
240 | + background: #fff; | |
241 | + color: #999; | |
242 | + } | |
243 | + .parkAreaTitle{ | |
244 | + display: flex; | |
245 | + justify-content: space-between; | |
246 | + color: #666; | |
247 | + } | |
248 | + .parkMore{ | |
249 | + cursor: pointer; | |
250 | + } | |
251 | + .park-list-wrap{ | |
252 | + width: 80%; | |
253 | + max-height: 70%; | |
254 | + overflow-y: scroll; | |
255 | + border-radius: 5px; | |
256 | + } | |
257 | + .park-list{ | |
258 | + | |
259 | + /*width: 80%;*/ | |
260 | + li{ | |
261 | + padding-left: 20px; | |
262 | + line-height: 25px; | |
263 | + } | |
264 | + } | |
265 | + | |
266 | +</style> | ... | ... |
src/views/cards/cardPoint.vue
0 → 100644
1 | +<template> | |
2 | + <div class="leftRightPadding"> | |
3 | + <div class="card-point-bg"> | |
4 | + <div class="carbg"></div> | |
5 | + <p class="buy-card-btn" @click="$router.push({name:'buyCard'})">+<span>购买会员卡</span></p> | |
6 | + <div class="slogan"> | |
7 | + <p> | |
8 | + 年卡、季卡、月卡,任你选,停车场让您挑, | |
9 | + </p> | |
10 | + <p>优惠停车,惊喜不断!</p> | |
11 | + </div> | |
12 | + </div> | |
13 | + | |
14 | + <p class="sweet">温馨提示:</p> | |
15 | + <div class="sweet-con"> | |
16 | + <p> | |
17 | + 1、年卡有效期为一年,从开卡之日算起往后一年时间内在所选停车场均可免费停车,到期后自动失效。 | |
18 | + </p> | |
19 | + <p> | |
20 | + 2、季卡有效期为三个月,从开卡之日算起往后三个月内所选停车场免费停车,到期后自动失效。 | |
21 | + </p> | |
22 | + <p> | |
23 | + 3、月卡有效期为一个月,从开卡之日算起,往后一个月为止在所选停车场长内均可免费停车,到期后自动失效。 | |
24 | + </p> | |
25 | + <p> | |
26 | + 4、所有卡均 <span>不支持预留车位</span> ,只适用于所选停车场进出场结算。 | |
27 | + </p> | |
28 | + </div> | |
29 | + | |
30 | + </div> | |
31 | +</template> | |
32 | + | |
33 | +<script> | |
34 | +export default { | |
35 | + name: 'cardPoint' | |
36 | +} | |
37 | +</script> | |
38 | + | |
39 | +<style scoped lang="scss"> | |
40 | + .card-point-bg { | |
41 | + height: 212px; | |
42 | + margin: 10px 0; | |
43 | + position: relative; | |
44 | + background: url("../../assets/images/cards/cardPointBg.png") no-repeat; | |
45 | + background-size: 100% 100%; | |
46 | + } | |
47 | + .carbg{ | |
48 | + width: 134px; | |
49 | + height: 141px; | |
50 | + position: absolute; | |
51 | + left: 21px; | |
52 | + top:30px; | |
53 | + background: url("../../assets/images/cards/carBg.png") no-repeat; | |
54 | + background-size: 100% 100%; | |
55 | + } | |
56 | + .buy-card-btn{ | |
57 | + position: absolute; | |
58 | + left: 90px; | |
59 | + top:71px; | |
60 | + font-size: 24px; | |
61 | + color: #fff; | |
62 | + font-weight: bold; | |
63 | + cursor: pointer; | |
64 | + span{ | |
65 | + margin-left: 30px; | |
66 | + } | |
67 | + } | |
68 | + .slogan{ | |
69 | + position: absolute; | |
70 | + left: 45px; | |
71 | + top: 150px; | |
72 | + text-align: center; | |
73 | + color: #fff; | |
74 | + } | |
75 | + .sweet{ | |
76 | + padding-left: 20px; | |
77 | + background: url("../../assets/images/sweet.png") no-repeat 0 center; | |
78 | + } | |
79 | + .sweet-con{ | |
80 | + color: #666; | |
81 | + p{ | |
82 | + margin-bottom: 10px; | |
83 | + line-height: 25px; | |
84 | + } | |
85 | + span{ | |
86 | + color: #D29E0D; | |
87 | + } | |
88 | + } | |
89 | +</style> | ... | ... |
src/views/parkPay/orderPay.vue
... | ... | @@ -22,10 +22,10 @@ |
22 | 22 | </li> |
23 | 23 | </ul> |
24 | 24 | <div style="padding: 20px 18px"> |
25 | - <div class="toPay" @click="toPay">微信支付</div> | |
25 | + <div class="toPay" @click="toPay">{{clientBrowser}}支付</div> | |
26 | 26 | </div> |
27 | 27 | |
28 | - <div v-if="appOrderTimeout"> | |
28 | + <div v-if="appOrderTimeout.length>0"> | |
29 | 29 | <p class="tip"> |
30 | 30 | 温馨提示: |
31 | 31 | </p> |
... | ... | @@ -40,22 +40,27 @@ |
40 | 40 | </template> |
41 | 41 | |
42 | 42 | <script> |
43 | -import {aliPay, getOpenId, vxPayQuery, doPay, doOrderCreate} from '@/api/orderPay/orderPay' | |
43 | +// import CryptoJS from '../utils/AES.js' | |
44 | +// let Base64 = require('js-base64').Base64 | |
45 | +import { MessageBox } from 'mint-ui'; | |
46 | +import { aliPay, getOpenId, vxPayQuery, bankH5Pay, queryParkingRecordPageByCarNumbers } from '@/api/orderPay/orderPay' | |
44 | 47 | |
45 | 48 | export default { |
46 | 49 | name: 'orderPay', |
47 | 50 | data() { |
48 | 51 | return { |
49 | 52 | carWrapBG: 0, |
50 | - carNumber: '京A12312', | |
53 | + carNumber: '', | |
51 | 54 | arrearageActFee: 0, |
52 | 55 | arrearageDiscFee: 0, |
53 | 56 | arrearageActFee: 0, |
57 | + parkingData: [], // 在停数据 | |
58 | + historyList: [], // 历史欠费数据 | |
59 | + clientBrowser: '', // 客户端 | |
54 | 60 | paySrcType: '', //支付的类型 101 是本次 103是历史欠费 |
55 | 61 | orderId: '', //支付的订单 |
56 | 62 | webAppCode: '', // 微信code |
57 | 63 | appOrderTimeout: '', // 超时描述 |
58 | - isAndroid: '', // 终端类型 | |
59 | 64 | } |
60 | 65 | }, |
61 | 66 | created() { |
... | ... | @@ -64,14 +69,19 @@ export default { |
64 | 69 | this.arrearageTotalFee = this.$route.query.arrearageTotalFee // 应收 |
65 | 70 | this.arrearageDiscFee = this.$route.query.arrearageDiscFee // 优惠 |
66 | 71 | this.arrearageActFee = this.$route.query.arrearageActFee // 实收 |
72 | + this.clientBrowser = this.$utils.clientBrowser() //支付方式 | |
67 | 73 | this.paySrcType = this.$route.query.paySrcType // 实收 |
68 | - this.orderId = this.$route.query.ordeID // 订单号 | |
74 | + this.orderId = this.$route.query.ordeID | |
69 | 75 | console.log(this.orderId) |
70 | - this.appOrderTimeout = this.$route.query.appOrderTimeout //提示 | |
76 | + this.appOrderTimeout = this.$route.query.appOrderTimeout | |
77 | + if (this.clientBrowser == "微信") { | |
78 | + this.webAppCode = this.getCode(); | |
79 | + } | |
80 | + | |
71 | 81 | |
72 | - let userAgent = navigator.userAgent; | |
73 | - this.isAndroid = userAgent.indexOf('Android') > -1 || userAgent.indexOf('Adr') > -1; //android终端 | |
74 | - this.webAppCode = this.getCode(); | |
82 | + | |
83 | + }, | |
84 | + mounted(){ | |
75 | 85 | |
76 | 86 | }, |
77 | 87 | methods: { |
... | ... | @@ -85,131 +95,181 @@ export default { |
85 | 95 | return code; |
86 | 96 | } |
87 | 97 | }, |
88 | - doOrderCreate(orderID) { // 欠费创建订单号 | |
89 | - var jsondata = { | |
90 | - orderBigType: 100, | |
91 | - payOrderType: this.paySrcType, | |
92 | - parkOrderIds: orderID, | |
93 | - terminalSource: 7, | |
94 | - operName: '', | |
95 | - operCode: '', | |
96 | - }; | |
97 | - // jsondata = JSON.stringify(jsondata); | |
98 | - doOrderCreate(jsondata).then(res => { | |
99 | - console.log(res) | |
100 | - this.orderId = res.data.rltOrderId | |
101 | - console.log(this.orderId) | |
102 | - this.dopay(this.orderId) | |
103 | - }) | |
104 | - | |
105 | - }, | |
106 | 98 | getUrlParam(name) { |
107 | 99 | var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)'); |
108 | 100 | var r = window.location.search.substr(1).match(reg) |
109 | 101 | if (r != null) return unescape(r[2]) |
110 | 102 | return null |
111 | 103 | }, |
112 | - dopay(orderID) { | |
104 | + toPay() { | |
113 | 105 | let me = this |
106 | + let _order = [] | |
107 | + | |
108 | + console.log(this.orderId) | |
109 | + if (this.paySrcType == 103) { | |
110 | + this.orderId = JSON.parse(this.orderId) | |
111 | + this.orderId.forEach(item => { | |
112 | + _order.push({ | |
113 | + orderId: item | |
114 | + }) | |
115 | + }) | |
116 | + this.orderId = [] | |
117 | + this.orderId = _order | |
118 | + } | |
119 | + | |
120 | + if (this.clientBrowser == '支付宝') { // 支付宝支付 | |
121 | + var aliParams = {}; | |
122 | + aliParams.orderId = this.orderId; | |
123 | + aliParams.carNumber = this.carNumber; | |
124 | + aliParams.payType = 1;// 1:支付宝 2:微信 3:银联 10:H5 4微信公众号 | |
125 | + aliParams.terminalSource = 7;//请求端来源 1: 任你停 2:pda 3:微信公共号 7:H5扫码 10页面支付 | |
126 | + aliParams.paySrcType = this.paySrcType;//101停车支付 | |
127 | + aliParams.orgId = this.$utils.myOrgId, | |
128 | + aliParams.backType = 2, | |
129 | + aliParams.recordArreaInfos = JSON.stringify(this.orderId); | |
130 | + console.log(aliParams) | |
131 | + aliPay(aliParams).then(response => { | |
132 | + console.log(response) | |
133 | + if (response.code == 0) {//进场 | |
134 | + document.write(response.data);//打开支付表单 | |
135 | + } else {//其他情况如【该卡号场内已存在】 | |
136 | + console.log(response.message); | |
137 | + } | |
138 | + | |
139 | + }) | |
140 | + } | |
141 | + | |
142 | + console.log(this.clientBrowser) | |
143 | + if (this.clientBrowser == '立即') { // 农行支付 | |
144 | + var bankabcParams = {}; | |
145 | + bankabcParams.orderId = this.orderId; | |
146 | + bankabcParams.carNumber = this.carNumber; | |
147 | + bankabcParams.payType = 34;// 1:支付宝 2:微信 3:银联 10:H5 4微信公众号 34 农行 | |
148 | + bankabcParams.terminalSource = 7;//请求端来源 1: 任你停 2:pda 3:微信公共号 7:H5扫码 10页面支付 | |
149 | + bankabcParams.paySrcType = this.paySrcType;//101停车支付 | |
150 | + bankabcParams.orgId = this.$utils.myOrgId, | |
151 | + bankabcParams.backType = 2, | |
152 | + bankabcParams.PaymentLinkType = 1 | |
153 | + bankabcParams.recordArreaInfos = JSON.stringify(this.orderId); | |
154 | + console.log(bankabcParams) | |
155 | + bankH5Pay(bankabcParams).then(response => { | |
156 | + console.log(response) | |
157 | + if(response.code=='0'){ | |
158 | + let res = response.data.PaymentURL | |
159 | + let _token = res.split('TOKEN=')[1] | |
160 | + let OrderNo = response.data.OrderNo | |
161 | + localStorage.setItem('OrderNum',OrderNo) | |
162 | + | |
163 | + | |
164 | + if(window.navigator.userAgent.indexOf('Bankabc/Portal') > -1) { | |
165 | + // alert('当前页面在新容器'); | |
166 | + AlipayJSBridge.call('startApp',{ | |
167 | + appId:'30603024', // 固定值 | |
168 | + param:{ | |
169 | + type:"3", // 3: 掌银内H5页面, | |
170 | + tokenId:_token, //商户传过来的tokenId | |
171 | + paySystem:"", //商户传过来的paySystem, 没有则传空字符串 | |
172 | + payType:"1111", //商户传过来的payType,没有则传'1111' | |
173 | + webviewURL:"https://wxgzh.renniting.cn/wechatwuxi/Chifeng/TEST/sweeping_payment/codepay/index.html#/payResult", //商户传过来的回跳地址 | |
174 | + remark:"其他参数", //扩展备用 | |
175 | + showProgress:'NO', | |
176 | + backBehavior:'back' | |
177 | + }, | |
178 | + },function(result){ | |
179 | + | |
180 | + }); | |
181 | + } else { | |
182 | + // alert('当前页面在旧容器'); | |
183 | + // 旧支付方式 | |
184 | + window.location.href = 'https://www.abchina.com/luascript/mobilePayLua/'+ encodeURI('{"return":{"tokenID":"'+_token+'","backURL":"https://wxgzh.renniting.cn/wechatwuxi/Chifeng/TEST/sweeping_payment/codepay/index.html#/payResult","payType":""}}'); | |
185 | + | |
186 | + } | |
187 | + }else{ | |
188 | + alert('支付失败') | |
189 | + } | |
190 | + | |
191 | + | |
192 | + // console.log(_token) | |
193 | + // let _data = 'method=invokePayFromBrowser&tokenID='+_token | |
194 | + // let cryData = CryptoJS.encrypt(_data, 'G9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvM3', 'EkpTEA3FbZFGGq8Y') | |
195 | + // | |
196 | + // let baseCRY = Base64.encode(cryData) | |
197 | + // console.log(baseCRY) | |
198 | + // window.location.href='bankabc:' + encodeURIComponent('{"method":"invokePayFromBrowser","param":'+baseCRY+'}') | |
199 | + // // 即为加密后的数据。其中paramsEncode是需要加密的数据、 | |
200 | + // // keyStr是加密时使用的key,与服务端一致、hash是偏移量,是一个随机生成的16位字符串。 | |
201 | + }) | |
202 | + } | |
203 | + | |
204 | + | |
114 | 205 | |
115 | 206 | |
116 | 207 | |
117 | - var vm = this | |
208 | + | |
209 | + | |
210 | + if (this.clientBrowser == '微信') { // 微信支付 | |
118 | 211 | //第一步获取openid |
119 | 212 | var codeParams = { |
120 | 213 | code: this.webAppCode, |
121 | 214 | appId: this.$utils.myVxAppId |
122 | 215 | }; |
123 | - getOpenId(codeParams).then(resu => { | |
124 | - if (resu.code == 0) { | |
125 | - // me.vxPay(res.data, this.orderId) | |
126 | - | |
127 | - var jsondata = { | |
128 | - orderBigType: 100, | |
129 | - payOrderType: this.paySrcType, | |
130 | - rltOrderId: orderID, | |
131 | - payType: 2, // 1 是支付宝 2是微信 | |
132 | - terminalSource: 7, | |
133 | - orderActFee: this.arrearageActFee, | |
134 | - orderTotalFee: this.arrearageTotalFee, | |
135 | - orderDicountFee: this.arrearageDiscFee, | |
136 | - payUserId: resu.data, | |
137 | - terminalOS: this.isAndroid ? 'AND' : 'IOS', | |
138 | - couponType: 1, //优惠类型 | |
139 | - couponCode: this.arrearageDiscFee, | |
140 | - }; | |
141 | - | |
142 | - doPay(jsondata).then(res => { | |
143 | - console.log(res) | |
144 | - if (res.code == 0) { // | |
145 | - //alertMsg("出场成功"); | |
146 | - if (res.data) { | |
147 | - var data = JSON.parse(res.data.jsPayRequest); | |
148 | - console.log(JSON.stringify(data)); | |
149 | - if (typeof WeixinJSBridge === 'undefined') { // 微信浏览器内置对象。参考微信官方文档 | |
150 | - if (document.addEventListener) { | |
151 | - document.addEventListener('WeixinJSBridgeReady', vm.onBridgeReady(data), false) | |
152 | - } else if (document.attachEvent) { | |
153 | - document.attachEvent('WeixinJSBridgeReady', vm.onBridgeReady(data)) | |
154 | - document.attachEvent('onWeixinJSBridgeReady', vm.onBridgeReady(data)) | |
155 | - } | |
156 | - } else { | |
157 | - console.log('准备调用微信支付') | |
158 | - vm.onBridgeReady(data) | |
159 | - } | |
160 | - } else { | |
161 | - alert("没有找到返回值"); | |
162 | - } | |
163 | - } else { | |
164 | - alert('支付错误') | |
165 | - console.log(res.message); | |
166 | - alert(res.message); | |
167 | - } | |
168 | - | |
169 | - }) | |
170 | - | |
216 | + getOpenId(codeParams).then(res => { | |
217 | + if (res.code == 0) { | |
218 | + me.vxPay(res.data, this.orderId) | |
171 | 219 | } else if (res.code == 40163) { //code been used, hints[重复code问题] |
172 | - alert('获取opendid错误--------') | |
173 | - alert(res.message) | |
220 | + alert('请重新扫码') | |
174 | 221 | console.log(res.message); |
175 | 222 | } else { |
176 | - alert('获取opendid错误') | |
177 | - alert(res.message) | |
223 | + alert('请重新扫码') | |
178 | 224 | } |
179 | 225 | }) |
180 | 226 | |
181 | - | |
182 | - }, | |
183 | - toPay() { | |
184 | - let me = this | |
185 | - let _order = [] | |
186 | - // this.orderId = JSON.parse(this.orderId) | |
187 | - console.log(this.orderId) | |
188 | - if (this.paySrcType == 103) { | |
189 | - this.orderId = JSON.parse(this.orderId) | |
190 | - this.doOrderCreate(this.orderId) | |
191 | - } else { | |
192 | - console.log(this.orderId) | |
193 | - console.log(typeof this.orderId) | |
194 | - | |
195 | - this.dopay(this.orderId) | |
196 | 227 | } |
197 | 228 | |
198 | 229 | }, |
199 | - | |
230 | + vxPay(openIdData, orderIdData) { | |
231 | + let vm = this | |
232 | + var wxParams = {}; | |
233 | + wxParams.orderId = orderIdData; | |
234 | + wxParams.backType = 2, | |
235 | + wxParams.orgId = this.$utils.myOrgId, | |
236 | + wxParams.payType = 4;// 1:支付宝 2:微信 3:银联 10:H5 4微信公众号 | |
237 | + wxParams.terminalSource = 7;//请求端来源 1: 任你停 2:pda 3:微信公共号 7:H5扫码 10页面支付 | |
238 | + wxParams.carNumber = this.carNumber; | |
239 | + wxParams.paySrcType = this.paySrcType;//101停车支付 | |
240 | + wxParams.recordArreaInfos = JSON.stringify(orderIdData); | |
241 | + wxParams.openId = openIdData; | |
242 | + wxParams.appId = this.$utils.myVxAppId; | |
243 | + vxPayQuery(wxParams).then(res => { | |
244 | + if (res.code == 0) { // | |
245 | + if (res.data) { | |
246 | + var data = res.data; | |
247 | + console.log(JSON.stringify(data)); | |
248 | + if (typeof WeixinJSBridge === 'undefined') { // 微信浏览器内置对象。参考微信官方文档 | |
249 | + if (document.addEventListener) { | |
250 | + document.addEventListener('WeixinJSBridgeReady', vm.onBridgeReady(data), false) | |
251 | + } else if (document.attachEvent) { | |
252 | + document.attachEvent('WeixinJSBridgeReady', vm.onBridgeReady(data)) | |
253 | + document.attachEvent('onWeixinJSBridgeReady', vm.onBridgeReady(data)) | |
254 | + } | |
255 | + } else { | |
256 | + console.log('准备调用微信支付') | |
257 | + vm.onBridgeReady(data) | |
258 | + } | |
259 | + } else { | |
260 | + alert("没有找到返回值"); | |
261 | + } | |
262 | + } else { | |
263 | + console.log(res.message); | |
264 | + alert(res.message); | |
265 | + } | |
266 | + }) | |
267 | + }, | |
200 | 268 | onBridgeReady(params) { |
269 | + let me = this | |
201 | 270 | console.log('调用微信支付WeixinJSBridge') |
202 | 271 | WeixinJSBridge.invoke( |
203 | - 'getBrandWCPayRequest', { | |
204 | - "appId": params.appId, //公众号名称,由商户传入 | |
205 | - "timeStamp": params.timeStamp, //时间戳,自1970年以来的秒数 | |
206 | - "nonceStr": params.nonceStr, //随机串 | |
207 | - "package": params.package, | |
208 | - "signType": params.signType, //微信签名方式: | |
209 | - "paySign": params.paySign //微信签名 | |
210 | - }, | |
211 | - | |
212 | - // 'getBrandWCPayRequest', params, | |
272 | + 'getBrandWCPayRequest', params, | |
213 | 273 | // |
214 | 274 | // 'getBrandWCPayRequest', { // 下面参数内容都是后台返回的 |
215 | 275 | // 'appId': data.appId, // 公众号名称,由商户传入 |
... | ... | @@ -223,15 +283,110 @@ export default { |
223 | 283 | // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 |
224 | 284 | if (res.err_msg === 'get_brand_wcpay_request:ok') { |
225 | 285 | console.log('成功') |
286 | + var salt = me.$utils.myCommonSalt(32); | |
287 | + let wxparams = { | |
288 | + pageNum: 1, | |
289 | + pageSize: 10000, | |
290 | + parkState: 10, | |
291 | + terminalSource: 7, | |
292 | + carNumber: me.carNumber, | |
293 | + app_id: me.$utils.myVarAppid, | |
294 | + deviceInfo: me.$utils.myDeviceInfo, | |
295 | + salt: salt, | |
296 | + sign_type: "md5", | |
297 | + token:'', | |
298 | + } | |
299 | + wxparams.sign = me.$utils.signObject(wxparams) | |
300 | + queryParkingRecordPageByCarNumbers(wxparams).then(response => { | |
301 | + console.log(response) | |
302 | + me.parkList = response.data.dataList | |
303 | + | |
304 | + if(me.parkList.length == 0){ | |
305 | + me.$router.push({ | |
306 | + path:'parkRecord', | |
307 | + query:{ | |
308 | + carNumber: me.carNumber, | |
309 | + carNumberColor: me.carWrapBG, | |
310 | + parkFlag: 0 // 0表示在停 1表示历史 | |
311 | + } | |
312 | + }) | |
313 | + } | |
314 | + | |
315 | + me.parkingData = me.parkList.filter(item => { | |
316 | + return item.parkState == '10' | |
317 | + }) | |
318 | + console.log(me.parkingData) | |
319 | + me.historyList = me.parkList.filter(item => { | |
320 | + return item.parkState == '20' | |
321 | + }) | |
322 | + console.log(me.historyList) | |
323 | + if(me.parkingData.length>0){ | |
324 | + MessageBox.confirm('', { | |
325 | + message: '您当前有在停订单 是否立即支付?', | |
326 | + title: '温馨提示', | |
327 | + confirmButtonText: '去支付', | |
328 | + cancelButtonText: '取消' | |
329 | + }).then(action => { | |
330 | + if (action == 'confirm') { //确认的回调 | |
331 | + console.log('确定'); | |
332 | + me.$router.push({ | |
333 | + path:'parkRecord', | |
334 | + query:{ | |
335 | + carNumber: me.carNumber, | |
336 | + carNumberColor: me.carWrapBG, | |
337 | + parkFlag: 0 // 0表示在停 1表示历史 | |
338 | + } | |
339 | + }) | |
340 | + } | |
341 | + }).catch(err => { | |
342 | + if (err == 'cancel') { //取消的回调 | |
343 | + console.log('取消'); | |
344 | + } | |
345 | + }); | |
346 | + } | |
347 | + | |
348 | + if(me.parkingData.length==0&&me.historyList.length>0){ | |
349 | + MessageBox.confirm('', { | |
350 | + message: '您当前有历史欠费 是否立即补缴?', | |
351 | + title: '温馨提示', | |
352 | + confirmButtonText: '去补缴', | |
353 | + cancelButtonText: '取消' | |
354 | + }).then(action => { | |
355 | + if (action == 'confirm') { //确认的回调 | |
356 | + console.log('确定'); | |
357 | + me.$router.push({ | |
358 | + path:'parkRecord', | |
359 | + query:{ | |
360 | + carNumber: me.carNumber, | |
361 | + carNumberColor: me.carWrapBG, | |
362 | + parkFlag: 1 // 0表示在停 1表示历史 | |
363 | + } | |
364 | + }) | |
365 | + } | |
366 | + }).catch(err => { | |
367 | + if (err == 'cancel') { //取消的回调 | |
368 | + console.log('取消'); | |
369 | + } | |
370 | + }); | |
371 | + } | |
372 | + | |
373 | + }) | |
374 | + | |
375 | + | |
376 | + | |
377 | + | |
378 | + | |
226 | 379 | } else { |
227 | 380 | console.log('失败') |
228 | 381 | alert('支付失败') |
382 | + me.$router.go(-2); | |
229 | 383 | } |
230 | 384 | } |
231 | 385 | ) |
232 | 386 | }, |
233 | 387 | }, |
234 | - | |
388 | + filters: { | |
389 | + } | |
235 | 390 | } |
236 | 391 | </script> |
237 | 392 | |
... | ... | @@ -247,27 +402,27 @@ export default { |
247 | 402 | } |
248 | 403 | |
249 | 404 | .carBlue { |
250 | - background: url("../../assets/images/parkPay/blueBG.png") no-repeat; | |
405 | + background: url("../../assets/images/blueBG.png") no-repeat; | |
251 | 406 | background-size: 100% 100%; |
252 | 407 | } |
253 | 408 | |
254 | 409 | .carYellow { |
255 | - background: url("../../assets/images/parkPay/yellowBG.png") no-repeat; | |
410 | + background: url("../../assets/images/yellowBG.png") no-repeat; | |
256 | 411 | background-size: 100% 100%; |
257 | 412 | } |
258 | 413 | |
259 | 414 | .carGreen { |
260 | - background: url("../../assets/images/parkPay/greenBG.png") no-repeat; | |
415 | + background: url("../../assets/images/greenBG.png") no-repeat; | |
261 | 416 | background-size: 100% 100%; |
262 | 417 | } |
263 | 418 | |
264 | 419 | .carWhite { |
265 | - background: url("../../assets/images/parkPay/whiteBG.png") no-repeat; | |
420 | + background: url("../../assets/images/whiteBG.png") no-repeat; | |
266 | 421 | background-size: 100% 100%; |
267 | 422 | } |
268 | 423 | |
269 | 424 | .carBlack { |
270 | - background: url("../../assets/images/parkPay/blackBG.png") no-repeat; | |
425 | + background: url("../../assets/images/blackBG.png") no-repeat; | |
271 | 426 | background-size: 100% 100%; |
272 | 427 | } |
273 | 428 | |
... | ... | @@ -316,7 +471,7 @@ export default { |
316 | 471 | |
317 | 472 | .tip { |
318 | 473 | padding-left: 40px; |
319 | - background: url("../../assets/images/parkPay/tip.png") no-repeat 18px center; | |
474 | + background: url("../../assets/images/tip.png") no-repeat 18px center; | |
320 | 475 | background-size: 16px 16px; |
321 | 476 | color: #666; |
322 | 477 | } | ... | ... |
src/views/parkPay/parkRecord.vue
... | ... | @@ -10,12 +10,11 @@ |
10 | 10 | </li> |
11 | 11 | </ul> |
12 | 12 | |
13 | - | |
14 | 13 | <!--本次缴费--> |
15 | 14 | <div v-show="currentTabActive==0"> |
16 | 15 | |
17 | 16 | <div v-if="parkingData.length>0"> |
18 | - <p class="free-tip" v-if="parkingData[0].parkDuration<=2100">停车30分钟内无需缴费,请直接离场。</p> | |
17 | + <p class="free-tip" v-if="parkingData[0].parkDuration<=2100">停车15分钟内无需缴费,请申请离场。</p> | |
19 | 18 | |
20 | 19 | <div class="cost-main" v-for="i in parkingData"> |
21 | 20 | <ul class="cost-header"> |
... | ... | @@ -34,7 +33,8 @@ |
34 | 33 | <p>停车时长:{{ $utils.dateFormat(i.parkDuration)}}</p> |
35 | 34 | <div class="out-wrap"> |
36 | 35 | <p class="mon-wrap">¥{{(i.unPayFee/100).toFixed(2)}}</p> |
37 | - <p class="out-btn" @click="toPayCurrent(i)" v-if="parkingData[0].parkDuration>2100">出场缴费</p> | |
36 | + <p class="out-btn" @click="toPayCurrent(i,parkingData[0].parkDuration)" v-if="parkingData[0].parkDuration<=60">申请离场</p> | |
37 | + <p class="out-btn" @click="toPayCurrent(i,parkingData[0].parkDuration)" v-else>出场缴费</p> | |
38 | 38 | </div> |
39 | 39 | </div> |
40 | 40 | </div> |
... | ... | @@ -66,7 +66,7 @@ |
66 | 66 | </ul> |
67 | 67 | |
68 | 68 | <div class="cost-body"> |
69 | - <p>车辆类型:临停车</p> | |
69 | + <!--<p>车辆颜色:临停车</p>--> | |
70 | 70 | |
71 | 71 | <p>车场名称:{{i.parkName}} |
72 | 72 | </p> |
... | ... | @@ -112,19 +112,13 @@ |
112 | 112 | 暂无记录 |
113 | 113 | </div> |
114 | 114 | |
115 | - <modal-alert ref="alert"> | |
116 | - <div class="trave-tip-content txt-l" slot="content"> | |
117 | - <div class="confirm-text"> | |
118 | - <p>请至少选择一笔记录</p> | |
119 | - </div> | |
120 | - </div> | |
121 | - <span slot="button">知道了</span> | |
122 | - </modal-alert> | |
115 | + | |
123 | 116 | </div> |
124 | 117 | </template> |
125 | 118 | |
126 | 119 | <script> |
127 | -import { parkRecordList, historyQuery, parkingQuery } from '@/api/parkRecord/parkRecord.js' | |
120 | + | |
121 | +import { parkRecordList, historyQuery, parkingQuery, appApplyParkOut } from '@/api/parkRecord/parkRecord.js' | |
128 | 122 | |
129 | 123 | |
130 | 124 | export default { |
... | ... | @@ -136,7 +130,7 @@ export default { |
136 | 130 | { text: '欠费待缴', id: 2 }, |
137 | 131 | ], |
138 | 132 | carColor: 1,// 车牌颜色 |
139 | - currentTabActive: 1, // 显示当前哪个 | |
133 | + currentTabActive: 0, // 显示当前哪个 | |
140 | 134 | carNumber: '', // 车牌号码 |
141 | 135 | parkingData:[], // 在停数据 |
142 | 136 | parkList: [], // 停车记录数据 |
... | ... | @@ -155,8 +149,10 @@ export default { |
155 | 149 | created() { |
156 | 150 | this.carNumber = this.$route.query.carNumber // 获取车牌号 |
157 | 151 | this.carColor = this.$route.query.carNumberColor // 获取颜色 0:蓝牌;1:黄牌;2:白牌;3:黑牌;4:绿色 |
152 | + this.currentTabActive = this.$route.query.parkFlag ? this.$route.query.parkFlag : 0 // 0在停 1历史 | |
158 | 153 | console.log(this.carNumber) |
159 | 154 | this.parkRecordList(this.carNumber) |
155 | + | |
160 | 156 | }, |
161 | 157 | methods: { |
162 | 158 | parkRecordList(){ // 获取停车记录数据 |
... | ... | @@ -186,13 +182,16 @@ export default { |
186 | 182 | this.parkingData = this.parkList.filter(item => { |
187 | 183 | return item.parkState == '10' |
188 | 184 | }) |
189 | - if(this.parkingData.length>0){ | |
190 | - this.currentTabActive = 0 | |
191 | - } | |
185 | + // if(this.parkingData.length>0){ | |
186 | + // this.currentTabActive = 0 | |
187 | + // } | |
192 | 188 | console.log(this.parkingData) |
193 | 189 | this.historyList = this.parkList.filter(item => { |
194 | 190 | return item.parkState == '20' |
195 | 191 | }) |
192 | + if(this.parkingData.length==0&&this.historyList.length>0){ | |
193 | + this.currentTabActive = 1 | |
194 | + } | |
196 | 195 | this.historyList.forEach( i => { |
197 | 196 | this.allMoney += Number(i.unPayFee) |
198 | 197 | }) |
... | ... | @@ -246,47 +245,71 @@ export default { |
246 | 245 | this.orderIds = [] |
247 | 246 | } |
248 | 247 | }, |
249 | - toPayCurrent(i){ // 缴纳本次在停费用 | |
248 | + toPayCurrent(i, num) { // 缴纳本次在停费用 | |
250 | 249 | var salt = this.$utils.myCommonSalt(32); |
251 | - var jsondata = { | |
250 | + var params = { | |
252 | 251 | app_id: this.$utils.myVarAppid, |
253 | 252 | deviceInfo: this.$utils.myDeviceInfo, |
254 | 253 | salt: salt, |
255 | 254 | sign_type: "md5", |
256 | - payType: 4, | |
257 | - appId: this.$utils.myVxAppId, | |
258 | 255 | orderId: i.orderId, |
259 | - terminalSource: '7', | |
260 | - parkCode: i.parkCode, | |
261 | - carNumber: this.carNumber, | |
256 | + payOrderType: '101', | |
257 | + terminalSource: '3', | |
262 | 258 | } |
263 | - jsondata.sign = this.$utils.signObject(jsondata) | |
264 | - parkingQuery(jsondata).then(result => { | |
265 | - console.log(result) | |
266 | - let res = result.data | |
267 | - let _dis = res.discountFee | |
268 | - let discountFee = _dis.slice(1,_dis.length-1) | |
259 | + params.sign = this.$utils.signObject(params) | |
260 | + appApplyParkOut(params).then(response => { | |
261 | + console.log(response) | |
269 | 262 | |
270 | - this.$router.push( | |
271 | - { | |
272 | - path:'orderPay', | |
273 | - query:{ | |
274 | - carColor: this.carColor,// 车牌颜色 | |
275 | - arrearageTotalFee: res.orderTotalFee,// 应收 | |
276 | - arrearageDiscFee: discountFee*100,// 优惠 | |
277 | - arrearageActFee: res.orderFee,// 实收 | |
278 | - carNumber: this.carNumber, // 车牌 | |
279 | - paySrcType: 101, //支付的类型 101 是本次 103是历史欠费 | |
280 | - ordeID: i.orderId, //支付的订单号 | |
281 | - appOrderTimeout: res.appOrderTimeout, // 超时描述 | |
282 | - } | |
263 | + if (response.code == '5005') { | |
264 | + var salt = this.$utils.myCommonSalt(32); | |
265 | + var jsondata = { | |
266 | + app_id: this.$utils.myVarAppid, | |
267 | + deviceInfo: this.$utils.myDeviceInfo, | |
268 | + salt: salt, | |
269 | + sign_type: "md5", | |
270 | + payType: this.$utils.clientBrowsePayType(), | |
271 | + appId: this.$utils.myVxAppId, | |
272 | + orderId: i.orderId, | |
273 | + terminalSource: '7', | |
274 | + parkCode: i.parkCode, | |
275 | + carNumber: this.carNumber, | |
283 | 276 | } |
284 | - ) | |
277 | + jsondata.sign = this.$utils.signObject(jsondata) | |
278 | + parkingQuery(jsondata).then(result => { | |
279 | + console.log(result) | |
280 | + let res = result.data | |
281 | + let _dis = res.discountFee | |
282 | + let discountFee = _dis.slice(1, _dis.length - 1) | |
283 | + | |
284 | + this.$router.push( | |
285 | + { | |
286 | + path: 'orderPay', | |
287 | + query: { | |
288 | + carColor: this.carColor,// 车牌颜色 | |
289 | + arrearageTotalFee: res.orderTotalFee,// 应收 | |
290 | + arrearageDiscFee: discountFee * 100,// 优惠 | |
291 | + arrearageActFee: res.orderFee,// 实收 | |
292 | + carNumber: this.carNumber, // 车牌 | |
293 | + paySrcType: 101, //支付的类型 101 是本次 103是历史欠费 | |
294 | + ordeID: i.orderId, //支付的订单号 | |
295 | + appOrderTimeout: res.appOrderTimeout, // 超时描述 | |
296 | + } | |
297 | + } | |
298 | + ) | |
299 | + }) | |
300 | + | |
301 | + } else { | |
302 | + //$('.dialog-out').show() | |
303 | + this.$msgbox('提示', '停车15分钟内无需缴费,申请成功。') | |
304 | + } | |
305 | + | |
285 | 306 | }) |
307 | + | |
286 | 308 | }, |
287 | 309 | toPayHisroryPage() { // 缴纳历史费用 |
288 | 310 | if(this.historyCheckedLen==0){ |
289 | - this.$refs.alert.open() | |
311 | + this.$msgbox('提示', '请至少选择一条记录') | |
312 | + | |
290 | 313 | return |
291 | 314 | } |
292 | 315 | var salt = this.$utils.myCommonSalt(32); |
... | ... | @@ -323,6 +346,7 @@ export default { |
323 | 346 | carNumber: this.carNumber, // 车牌 |
324 | 347 | paySrcType: 103, //支付的类型 101 是本次 103是历史欠费 |
325 | 348 | ordeID: this.orderIds, //支付的订单号 |
349 | + appOrderTimeout: '' | |
326 | 350 | } |
327 | 351 | } |
328 | 352 | ) | ... | ... |
src/views/parkPay/plateNumber.vue
1 | 1 | <template> |
2 | 2 | <div id="page"> |
3 | + | |
4 | + <div class="swiper-container" style="height: 260px"> | |
5 | + <div class="swiper-wrapper"> | |
6 | + <div class="swiper-slide" v-for="item in swiperData" :key="item.id" | |
7 | + :style="{backgroundImage:'url(' + item.url + ')'}" | |
8 | + @click="openImgUrl(item)" | |
9 | + ></div> | |
10 | + </div> | |
11 | + <!-- 如果需要分页器 --> | |
12 | + <div class="swiper-pagination"></div> | |
13 | + | |
14 | + <!-- 如果需要滚动条 --> | |
15 | + <!-- <div class="swiper-scrollbar"></div>--> | |
16 | + </div> | |
17 | + | |
3 | 18 | <div class="wrap"> |
4 | - <p style="margin-bottom: 18px;margin-top: 18px;">请选择车牌颜色</p> | |
19 | + <!--<p style="margin-bottom: 18px;margin-top: 18px;">请选择车牌颜色</p>--> | |
20 | + | |
21 | + <!--<ul class="color-choose">--> | |
22 | + <!--<li v-for="(i,index) in colorList" :key="i.name" @click="chooseColor(index)"--> | |
23 | + <!--:style="{color:currentColor==index?'#FFF':'',background: currentColor==index?activeBG:'' }"--> | |
24 | + <!-->--> | |
25 | + <!--{{i.name}}--> | |
26 | + <!--</li>--> | |
27 | + | |
28 | + <!--</ul>--> | |
29 | + | |
30 | + | |
5 | 31 | |
6 | - <ul class="color-choose"> | |
7 | - <li v-for="(i,index) in colorList" :key="i.name" @click="chooseColor(index)" | |
8 | - :style="{color:currentColor==index?'#FFF':'',background: currentColor==index?activeBG:'' }" | |
9 | - > | |
10 | - {{i.name}} | |
11 | - </li> | |
12 | 32 | |
13 | - </ul> | |
14 | 33 | |
15 | 34 | <p style="margin-bottom: 18px;margin-top: 18px;">请输入车牌号码</p> |
16 | 35 | <div class="num-box"> |
... | ... | @@ -59,19 +78,14 @@ |
59 | 78 | </div> |
60 | 79 | |
61 | 80 | <div> |
62 | - <p style="margin-bottom: 18px;margin-top: 18px;">已绑定车牌</p> | |
63 | - <ul class="bound-list"> | |
64 | - <li> | |
65 | - <span>鄂B4567R</span> | |
66 | - <span>查看订单</span> | |
67 | - </li> | |
68 | - <li> | |
69 | - <span>鄂B4567R</span> | |
70 | - <span>查看订单</span> | |
81 | + <p style="margin-bottom: 18px;margin-top: 18px;">查询记录</p> | |
82 | + <ul class="bound-list" v-if="boundList.length>0"> | |
83 | + <li v-for="i in boundList" :key="i"> | |
84 | + <span>{{ i }}</span> | |
71 | 85 | </li> |
72 | 86 | </ul> |
73 | - <div style="text-align: center;padding: 10px 0;">暂无绑定车牌</div> | |
74 | - <div class="addCarNum"><span></span>添加车辆</div> | |
87 | + <div v-else style="text-align: center;padding: 10px 0;">暂无查询记录</div> | |
88 | + <!--<div class="addCarNum"><span></span>添加车辆</div>--> | |
75 | 89 | </div> |
76 | 90 | |
77 | 91 | |
... | ... | @@ -83,7 +97,7 @@ |
83 | 97 | <div class="first-word" |
84 | 98 | @click="selectFirstWord($event)"> |
85 | 99 | <div class="word"> |
86 | - <span>京</span> | |
100 | + <span>蒙</span> | |
87 | 101 | </div> |
88 | 102 | <div class="word"> |
89 | 103 | <span>湘</span> |
... | ... | @@ -164,7 +178,7 @@ |
164 | 178 | <div class="first-word" |
165 | 179 | @click="selectFirstWord($event)"> |
166 | 180 | <div class="word"> |
167 | - <span>蒙</span> | |
181 | + <span>京</span> | |
168 | 182 | </div> |
169 | 183 | <div class="word"> |
170 | 184 | <span>赣</span> |
... | ... | @@ -184,8 +198,38 @@ |
184 | 198 | <div class="word"> |
185 | 199 | <span>新</span> |
186 | 200 | </div> |
201 | + <div class="word"> | |
202 | + <span>学</span> | |
203 | + </div> | |
204 | + <!--<div class="word bordernone">--> | |
205 | + <!--<!– <img src="../assets/images/icon-switch.png" alt=""> –>--> | |
206 | + <!--</div>--> | |
207 | + </div> | |
208 | + | |
209 | + <div class="first-word" | |
210 | + @click="selectFirstWord($event)"> | |
211 | + <div class="word"> | |
212 | + <span>港</span> | |
213 | + </div> | |
214 | + <div class="word"> | |
215 | + <span>澳</span> | |
216 | + </div> | |
217 | + <div class="word"> | |
218 | + <span>领</span> | |
219 | + </div> | |
220 | + | |
221 | + <div class="word"> | |
222 | + <span>警</span> | |
223 | + </div> | |
224 | + | |
225 | + | |
226 | + <div class="word bordernone"> | |
227 | + </div> | |
228 | + <div class="word bordernone"> | |
229 | + </div> | |
230 | + <div class="word bordernone"> | |
231 | + </div> | |
187 | 232 | <div class="word bordernone"> |
188 | - <!-- <img src="../assets/images/icon-switch.png" alt=""> --> | |
189 | 233 | </div> |
190 | 234 | </div> |
191 | 235 | </div> |
... | ... | @@ -257,6 +301,10 @@ |
257 | 301 | </div> |
258 | 302 | </template> |
259 | 303 | <script> |
304 | + | |
305 | +import Swiper from 'swiper' // 应入swiper | |
306 | +import {swiperQuery} from '../../api/plateNumber/plateNumber' | |
307 | + | |
260 | 308 | export default { |
261 | 309 | data () { |
262 | 310 | return { |
... | ... | @@ -310,12 +358,53 @@ export default { |
310 | 358 | confirmTitle: '', |
311 | 359 | submitConfirm: false, |
312 | 360 | submitConfirmFalse: false, |
313 | - submitConfirmText: '' | |
361 | + submitConfirmText: '', | |
362 | + swiperData: [], // 轮播数据 | |
363 | + boundList:[] // 历史记录 | |
314 | 364 | } |
315 | 365 | }, |
366 | + created(){ | |
367 | + this.initSWiper() | |
368 | + }, | |
316 | 369 | mounted () { |
370 | + this.boundList = localStorage.getItem('parkRecordList') ? localStorage.getItem('parkRecordList') : [] | |
371 | + console.log(this.boundList) | |
317 | 372 | }, |
318 | 373 | methods: { |
374 | + initSWiper() { | |
375 | + var salt = this.$utils.myCommonSalt(32) | |
376 | + var jsondata = { | |
377 | + app_id: this.$utils.myVarAppid, | |
378 | + deviceInfo: this.$utils.myDeviceInfo, | |
379 | + salt: salt, | |
380 | + sign_type: 'md5', | |
381 | + sign: '1', | |
382 | + orgId: this.$utils.myOrgId, | |
383 | + jumpType: '8' | |
384 | + }; | |
385 | + // jsondata = JSON.stringify(jsondata); | |
386 | + swiperQuery(jsondata).then(res => { | |
387 | + this.swiperData = res.data | |
388 | + console.log(this.swiperData) | |
389 | + new Swiper('.swiper-container', { | |
390 | + pagination: '.swiper-pagination', | |
391 | + paginationClickable: true, | |
392 | + centeredSlides: true, | |
393 | + notNextTick: true, | |
394 | + autoplay: 5000, | |
395 | + autoplayDisableOnInteraction: true, | |
396 | + | |
397 | + observer: true, //修改swiper自己或子元素时,自动初始化swiper | |
398 | + observeParents: true, //修改swiper的父元素时,自动初始化swiper | |
399 | + onSlideChangeStart: function (swiper) { | |
400 | + //console.log(swiper.activeIndex) | |
401 | + } | |
402 | + }) | |
403 | + }) | |
404 | + }, | |
405 | + openImgUrl(i) { // 点击图片跳转 | |
406 | + window.open(i.jumpUrl) | |
407 | + }, | |
319 | 408 | chooseColor (index){ // 颜色选择 |
320 | 409 | this.currentColor = index |
321 | 410 | switch (this.currentColor) { |
... | ... | @@ -406,10 +495,20 @@ export default { |
406 | 495 | } |
407 | 496 | this.$emit('getPlateLicense',plateLicense) |
408 | 497 | console.log(plateLicense); |
498 | + | |
499 | + // boundList | |
500 | + if(this.boundList.indexOf(plateLicense) == -1 ){ | |
501 | + if(this.boundList.length == 3){ | |
502 | + this.boundList.pop() | |
503 | + } | |
504 | + this.boundList.unshift(plateLicense) | |
505 | + } | |
506 | + | |
409 | 507 | this.$router.push({ |
410 | 508 | path:'parkRecord', |
411 | 509 | query:{ |
412 | - carNumber:plateLicense | |
510 | + carNumber:plateLicense, | |
511 | + carNumberColor: this.currentColor | |
413 | 512 | } |
414 | 513 | }) |
415 | 514 | }, |
... | ... | @@ -506,6 +605,18 @@ export default { |
506 | 605 | } |
507 | 606 | </script> |
508 | 607 | <style lang="scss" scoped> |
608 | + | |
609 | + .swiper-container { | |
610 | + height: 206px; | |
611 | + } | |
612 | + | |
613 | + .swiper-slide { | |
614 | + /*width: 100%;*/ | |
615 | + height: 206px; | |
616 | + background-repeat: no-repeat; | |
617 | + background-size: 100% 100%; | |
618 | + } | |
619 | + | |
509 | 620 | .flex-items-center { |
510 | 621 | display: flex; |
511 | 622 | align-items: center; | ... | ... |