DESKTOP-UHC5L7D\Jaxc
1 year ago
commit
cc00353469
27 changed files with 13926 additions and 0 deletions
-
13.env.development
-
11.env.production
-
3.env.test
-
1.gitignore
-
29README.md
-
5babel.config.js
-
12507package-lock.json
-
26package.json
-
5postcss.config.js
-
BINpublic/favicon.ico
-
33public/index.html
-
8src/App.vue
-
BINsrc/assets/logo.png
-
BINsrc/assets/payment.png
-
BINsrc/assets/success.png
-
57src/components/HelloWorld.vue
-
42src/config/axios.js
-
15src/config/plugins.js
-
13src/config/setting.js
-
9src/main.js
-
53src/router/index.js
-
517src/utils/util.js
-
73src/views/auth/index.vue
-
323src/views/cashier/index.vue
-
102src/views/cashier/result.vue
-
34src/views/index/index.vue
-
47vue.config.js
@ -0,0 +1,13 @@ |
|||
NODE_ENV=development |
|||
#本地开发代理路径 |
|||
VUE_APP_BASE_URL="http://192.168.1.39:8090/" |
|||
#项目的前缀名 |
|||
VUE_APP_CONTEXT_PATH="/alipayapi" |
|||
#学员端项目的前缀名 |
|||
VUE_APP_CONTEXT_PATH1="" |
|||
#驾校端项目的前缀名 |
|||
VUE_APP_CONTEXT_PATH2="" |
|||
#路由前缀名 |
|||
VUE_APP_PATH="/alipay" |
|||
|
|||
|
@ -0,0 +1,11 @@ |
|||
NODE_ENV=production |
|||
#本地开发代理路径 |
|||
VUE_APP_BASE_URL="" |
|||
#项目的前缀名 |
|||
VUE_APP_CONTEXT_PATH="/" |
|||
#学员端项目的前缀名 |
|||
VUE_APP_CONTEXT_PATH1="api" |
|||
#驾校端项目的前缀名 |
|||
VUE_APP_CONTEXT_PATH2="schoolapi" |
|||
#路由前缀名 |
|||
VUE_APP_PATH="/alipay" |
@ -0,0 +1,3 @@ |
|||
NODE_ENV=test |
|||
VUE_APP_BASE_URL="http://192.168.1.9:4031/managementapi/" |
|||
VUE_APP_CONTEXT_PATH="/admin" |
@ -0,0 +1 @@ |
|||
node_modules/ |
@ -0,0 +1,29 @@ |
|||
# default |
|||
|
|||
## Project setup |
|||
``` |
|||
npm install |
|||
``` |
|||
|
|||
### Compiles and hot-reloads for development |
|||
``` |
|||
npm run serve |
|||
``` |
|||
|
|||
### Compiles and minifies for production |
|||
``` |
|||
npm run build |
|||
``` |
|||
|
|||
### Run your tests |
|||
``` |
|||
npm run test |
|||
``` |
|||
|
|||
### Lints and fixes files |
|||
``` |
|||
npm run lint |
|||
``` |
|||
|
|||
### Customize configuration |
|||
See [Configuration Reference](https://cli.vuejs.org/config/). |
@ -0,0 +1,5 @@ |
|||
module.exports = { |
|||
presets: [ |
|||
'@vue/app' |
|||
] |
|||
} |
12507
package-lock.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,26 @@ |
|||
{ |
|||
"name": "jiapei-alipay", |
|||
"version": "0.1.0", |
|||
"private": true, |
|||
"scripts": { |
|||
"serve": "vue-cli-service serve", |
|||
"build": "vue-cli-service build" |
|||
}, |
|||
"dependencies": { |
|||
"@fingerprintjs/fingerprintjs": "^3.3.3", |
|||
"axios": "^0.19.2", |
|||
"core-js": "^3.6.5", |
|||
"vant": "^2.12", |
|||
"vue": "^2.6.11", |
|||
"vue-axios": "^2.1.5", |
|||
"vue-cookies": "^1.8.1", |
|||
"vue-router": "^3.2.0" |
|||
}, |
|||
"devDependencies": { |
|||
"@vue/cli-plugin-babel": "^4.4.0", |
|||
"@vue/cli-service": "^4.4.0", |
|||
"vue-template-compiler": "^2.6.11", |
|||
"webpack-dev-server": "^4.4.0", |
|||
"compression-webpack-plugin": "^6.1.1" |
|||
} |
|||
} |
@ -0,0 +1,5 @@ |
|||
module.exports = { |
|||
plugins: { |
|||
autoprefixer: {} |
|||
} |
|||
} |
@ -0,0 +1,33 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|||
<meta name="viewport" content="width=device-width,initial-scale=1.0"> |
|||
<meta http-equiv="pragma" content="no-cache"> |
|||
<meta http-equiv="cache-control" content="no-cache"> |
|||
<meta http-equiv="expires" content="0"> |
|||
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
|||
<title>浙里学车生活号</title> |
|||
<style> |
|||
.van-dialog-bule{border-radius:0px!important;} |
|||
.van-dialog-bule .van-dialog__header{background-color:#1890ff;font-family: 'Arial Negreta', 'Arial Normal', 'Arial';font-weight: 700;font-style: normal;color: #FFFFFF;text-align: left;padding-left:20px;height:30px;margin-top:-15px;} |
|||
.van-dialog-bule .van-dialog__footer{height:80px;text-align: center;width: 300px;margin-left:20%;} |
|||
.van-dialog-bule .van-dialog__footer .van-dialog__cancel{background-color:#d7d7d7;width:10px;border-radius:5px;width:40%;} |
|||
.van-dialog-bule .van-dialog__footer .van-dialog__confirm{background-color: #1890ff;color:#FFFFFF;border-radius:5px;width:40%;margin-left:30px;} |
|||
.van-dialog-bule1 .van-dialog__footer .van-dialog__confirm{margin-left:0px;} |
|||
.van-dialog-purple{border-radius:0px!important;} |
|||
.van-dialog-purple .van-dialog__header{background-color:#8080ff;font-family: 'Arial Negreta', 'Arial Normal', 'Arial';font-weight: 700;font-style: normal;color: #FFFFFF;text-align: left;padding-left:20px;height:30px;margin-top:-15px;} |
|||
.van-dialog-purple .van-dialog__footer{height:80px;text-align: center;width: 300px;margin-left:20%;} |
|||
.van-dialog-purple .van-dialog__footer .van-dialog__cancel{background-color:#d7d7d7;width:10px;border-radius:5px;width:40%;} |
|||
.van-dialog-purple .van-dialog__footer .van-dialog__confirm{background-color: #1890ff;color:#FFFFFF;border-radius:5px;width:40%;margin-left:30px;} |
|||
</style> |
|||
</head> |
|||
<body> |
|||
<noscript> |
|||
<strong>We're sorry but default doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
|||
</noscript> |
|||
<div id="app"></div> |
|||
<!-- built files will be auto injected --> |
|||
</body> |
|||
</html> |
@ -0,0 +1,8 @@ |
|||
<template> |
|||
<div id="app"> |
|||
<router-view/> |
|||
</div> |
|||
</template> |
|||
|
|||
<style> |
|||
</style> |
After Width: 200 | Height: 200 | Size: 6.7 KiB |
After Width: 308 | Height: 308 | Size: 45 KiB |
After Width: 494 | Height: 494 | Size: 72 KiB |
@ -0,0 +1,57 @@ |
|||
<template> |
|||
<div class="hello"> |
|||
<h1>{{ msg }}</h1> |
|||
<p> |
|||
For a guide and recipes on how to configure / customize this project,<br> |
|||
check out the |
|||
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>. |
|||
</p> |
|||
<h3>Installed CLI Plugins</h3> |
|||
<ul> |
|||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li> |
|||
</ul> |
|||
<h3>Essential Links</h3> |
|||
<ul> |
|||
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li> |
|||
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li> |
|||
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li> |
|||
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li> |
|||
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li> |
|||
</ul> |
|||
<h3>Ecosystem</h3> |
|||
<ul> |
|||
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li> |
|||
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li> |
|||
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li> |
|||
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li> |
|||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li> |
|||
</ul> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'HelloWorld', |
|||
props: { |
|||
msg: String |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<!-- Add "scoped" attribute to limit CSS to this component only --> |
|||
<style scoped> |
|||
h3 { |
|||
margin: 40px 0 0; |
|||
} |
|||
ul { |
|||
list-style-type: none; |
|||
padding: 0; |
|||
} |
|||
li { |
|||
display: inline-block; |
|||
margin: 0 10px; |
|||
} |
|||
a { |
|||
color: #42b983; |
|||
} |
|||
</style> |
@ -0,0 +1,42 @@ |
|||
/** |
|||
* axios配置 |
|||
*/ |
|||
import Vue from 'vue' |
|||
import axios from 'axios' |
|||
import VueAxios from 'vue-axios' |
|||
import setting from './setting' |
|||
import cookies from 'vue-cookies'; |
|||
import { Dialog } from 'vant'; |
|||
import router from '@/router' |
|||
Vue.use(VueAxios, axios); |
|||
|
|||
//axios.defaults.baseURL = setting.baseURL;
|
|||
axios.defaults.baseURL =setting.context_path; |
|||
|
|||
axios.defaults.headers.common[setting.tokenHeaderName] =''; |
|||
axios.interceptors.request.use((config ) => { |
|||
var url=config.url; |
|||
if (url.indexOf("?")!=-1) { |
|||
let queryString = url.split('?')[1] // code=12313123&a=444
|
|||
if (queryString) { |
|||
let query = queryString.split('&') |
|||
for (let i = 0; i < query.length; i++) { |
|||
let arr = query[i].split('=') |
|||
if(arr[0]=="token"){ |
|||
config.headers[setting.tokenHeaderName] =arr[1]; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return config; |
|||
}, (error) => { |
|||
return Promise.reject(error); |
|||
}); |
|||
/* 响应拦截器 */ |
|||
axios.interceptors.response.use((res) => { |
|||
return res; |
|||
}, (error) => { |
|||
return Promise.reject(error); |
|||
}); |
|||
|
@ -0,0 +1,15 @@ |
|||
/** |
|||
* 引用框架 |
|||
*/ |
|||
import Vue from 'vue' |
|||
import './axios' |
|||
import setting from './setting' |
|||
import util from '@/utils/util' |
|||
// UI框架
|
|||
import Vant from 'vant'; // vant
|
|||
import 'vant/lib/index.css'; // 样式
|
|||
import cookies from 'vue-cookies'; |
|||
Vue.prototype.$setting = setting; |
|||
Vue.prototype.$util = util; |
|||
Vue.prototype.$cookies = cookies |
|||
Vue.use(Vant); |
@ -0,0 +1,13 @@ |
|||
/** |
|||
* 项目统一配置 |
|||
*/ |
|||
export default { |
|||
version: '1.0', |
|||
name: '浙里学车生活号', // 项目名称
|
|||
baseURL: process.env.VUE_APP_BASE_URL, // 接口地址
|
|||
context_path: process.env.VUE_APP_CONTEXT_PATH, //项目的前缀名
|
|||
context_path1: process.env.VUE_APP_CONTEXT_PATH1, //学员端项目的前缀名
|
|||
context_path2: process.env.VUE_APP_CONTEXT_PATH2, //学员端项目的前缀名
|
|||
vue_app_path: process.env.VUE_APP_PATH, //路由前缀名
|
|||
tokenHeaderName: 'token', // token传递的header名称
|
|||
} |
@ -0,0 +1,9 @@ |
|||
import Vue from 'vue' |
|||
import App from './App.vue' |
|||
import './config/plugins' |
|||
import router from './router' |
|||
Vue.config.productionTip = false |
|||
|
|||
new Vue({router, |
|||
render: h => h(App), |
|||
}).$mount('#app') |
@ -0,0 +1,53 @@ |
|||
/** |
|||
* 路由配置 |
|||
*/ |
|||
import Vue from 'vue' |
|||
import VueRouter from 'vue-router' |
|||
import setting from '@/config/setting' |
|||
|
|||
Vue.use(VueRouter); |
|||
|
|||
/* 静态路由配置 */ |
|||
const routes = [ |
|||
{ |
|||
path: '/', |
|||
component: (resolve) => require(['@/views/index/index'], resolve),//懒加载
|
|||
meta: {hide: true, title: '首页'} |
|||
}, |
|||
{ |
|||
path: '/auth', |
|||
component: (resolve) => require(['@/views/auth/index'], resolve),//懒加载
|
|||
meta: {hide: true, title: '授权页'} |
|||
}, |
|||
{ |
|||
path: '/cashier', |
|||
component: (resolve) => require(['@/views/cashier/index'], resolve),//懒加载
|
|||
meta: {hide: true, title: '收银台'} |
|||
}, |
|||
{ |
|||
path: '/result', |
|||
component: (resolve) => require(['@/views/cashier/result'], resolve),//懒加载
|
|||
meta: {hide: true, title: '支付结果'} |
|||
}, |
|||
|
|||
]; |
|||
const router = new VueRouter({ |
|||
base: process.env.VUE_APP_PATH, |
|||
routes, |
|||
mode: 'history' // history
|
|||
}); |
|||
|
|||
/* 路由守卫 */ |
|||
router.beforeEach((to, from, next) => { |
|||
// NProgress.start();
|
|||
document.title = `${to.meta.title || ''}${to.meta.title ? ' - ' : ''}${setting.name}`; |
|||
next(); |
|||
}); |
|||
|
|||
router.afterEach(() => { |
|||
setTimeout(() => { |
|||
// NProgress.done();
|
|||
}, 150); |
|||
}); |
|||
|
|||
export default router |
@ -0,0 +1,517 @@ |
|||
/** |
|||
* 常用工具方法 |
|||
*/ |
|||
export default { |
|||
/** |
|||
* 倒计时 |
|||
* @param endTime 结束时间 |
|||
* @param serverTime 服务端当前时间 |
|||
* @param callback 回调 |
|||
* @returns {number} 定时器实例 |
|||
*/ |
|||
countdown(endTime, serverTime, callback) { |
|||
let type = typeof serverTime === 'function', |
|||
end = new Date(endTime).getTime(), |
|||
now = new Date((!serverTime || type) ? new Date().getTime() : serverTime).getTime(), |
|||
count = end - now, |
|||
time = [ |
|||
Math.floor(count / (1000 * 60 * 60 * 24)), // 天
|
|||
Math.floor(count / (1000 * 60 * 60)) % 24, // 时
|
|||
Math.floor(count / (1000 * 60)) % 60, // 分
|
|||
Math.floor(count / 1000) % 60 // 秒
|
|||
]; |
|||
if (type) callback = serverTime; |
|||
let timer = setTimeout(() => { |
|||
this.countdown(endTime, now + 1000, callback); |
|||
}, 1000); |
|||
callback && callback(count > 0 ? time : [0, 0, 0, 0], serverTime, timer); |
|||
if (count <= 0) clearTimeout(timer); |
|||
return timer; |
|||
}, |
|||
/** |
|||
* 某个时间在当前时间的多久前 |
|||
* @param time 需要语义化的时间 |
|||
* @param onlyDate 超过30天是否仅返回日期 |
|||
* @returns {string} 语义化后的时间 |
|||
*/ |
|||
timeAgo(time, onlyDate) { |
|||
if (!time) return ''; |
|||
if (typeof time === 'string') time = time.replace(/-/g, '/'); |
|||
let arr = [ |
|||
[], |
|||
[] |
|||
], |
|||
stamp = new Date().getTime() - new Date(time).getTime(); |
|||
// 30天以上返回具体日期
|
|||
if (stamp > 1000 * 60 * 60 * 24 * 31) { |
|||
stamp = new Date(time); |
|||
arr[0][0] = this.digit(stamp.getFullYear(), 4); |
|||
arr[0][1] = this.digit(stamp.getMonth() + 1); |
|||
arr[0][2] = this.digit(stamp.getDate()); |
|||
if (!onlyDate) { // 是否输出时间
|
|||
arr[1][0] = this.digit(stamp.getHours()); |
|||
arr[1][1] = this.digit(stamp.getMinutes()); |
|||
arr[1][2] = this.digit(stamp.getSeconds()); |
|||
} |
|||
return arr[0].join('-') + ' ' + arr[1].join(':'); |
|||
} |
|||
// 30天以内,返回“多久前”
|
|||
if (stamp >= 1000 * 60 * 60 * 24) { |
|||
return ((stamp / 1000 / 60 / 60 / 24) | 0) + '天前'; |
|||
} else if (stamp >= 1000 * 60 * 60) { |
|||
return ((stamp / 1000 / 60 / 60) | 0) + '小时前'; |
|||
} else if (stamp >= 1000 * 60 * 3) { // 3分钟以内为:刚刚
|
|||
return ((stamp / 1000 / 60) | 0) + '分钟前'; |
|||
} else if (stamp < 0) { |
|||
return '未来'; |
|||
} else { |
|||
return '刚刚'; |
|||
} |
|||
}, |
|||
/** |
|||
* 数字前置补零 |
|||
* @param num 数字 |
|||
* @param length 位数 |
|||
* @returns {string} |
|||
*/ |
|||
digit(num, length) { |
|||
let str = ''; |
|||
num = String(num); |
|||
length = length || 2; |
|||
for (let i = num.length; i < length; i++) str += '0'; |
|||
return num < Math.pow(10, length) ? str + (num | 0) : num; |
|||
}, |
|||
/** |
|||
* 转化为日期格式字符 |
|||
* @param time 时间 |
|||
* @param format 格式 |
|||
* @returns {string} |
|||
*/ |
|||
toDateString(time, format) { |
|||
if (!time) return ''; |
|||
if (typeof time === 'string') time = time.replace(/-/g, '/'); |
|||
let date = new Date(time || new Date()), |
|||
ymd = [ |
|||
this.digit(date.getFullYear(), 4), |
|||
this.digit(date.getMonth() + 1), |
|||
this.digit(date.getDate()) |
|||
], |
|||
hms = [ |
|||
this.digit(date.getHours()), |
|||
this.digit(date.getMinutes()), |
|||
this.digit(date.getSeconds()) |
|||
]; |
|||
format = format || 'yyyy-MM-dd HH:mm:ss'; |
|||
return format.replace(/yyyy/g, ymd[0]) |
|||
.replace(/MM/g, ymd[1]) |
|||
.replace(/dd/g, ymd[2]) |
|||
.replace(/HH/g, hms[0]) |
|||
.replace(/mm/g, hms[1]) |
|||
.replace(/ss/g, hms[2]); |
|||
}, |
|||
toDate(time, intnum) { |
|||
if (!time) return ''; |
|||
if (typeof time === 'string') time = time.replace(/-/g, '/'); |
|||
if (intnum) { |
|||
let date = new Date(time || new Date()), |
|||
ymd = [ |
|||
this.digit(date.getFullYear(), 4), |
|||
this.digit(date.getMonth() + 1), |
|||
this.digit(date.getDate() + intnum) |
|||
]; |
|||
return 'yyyy-MM-dd'.replace(/yyyy/g, ymd[0]) |
|||
.replace(/MM/g, ymd[1]) |
|||
.replace(/dd/g, ymd[2]) |
|||
} else { |
|||
let date = new Date(time || new Date()), |
|||
ymd = [ |
|||
this.digit(date.getFullYear(), 4), |
|||
this.digit(date.getMonth() + 1), |
|||
this.digit(date.getDate()) |
|||
]; |
|||
return 'yyyy-MM-dd'.replace(/yyyy/g, ymd[0]) |
|||
.replace(/MM/g, ymd[1]) |
|||
.replace(/dd/g, ymd[2]) |
|||
} |
|||
}, |
|||
getBeforeDate(num, time) { |
|||
let n = num; |
|||
let d = ''; |
|||
if (time) { |
|||
d = new Date(time); |
|||
} else { |
|||
d = new Date(); |
|||
} |
|||
let year = d.getFullYear(); |
|||
let mon = d.getMonth() + 1; |
|||
let day = d.getDate(); |
|||
/* if (day <= n) { |
|||
if (mon > 1) { |
|||
mon = mon - 1; |
|||
} else { |
|||
year = year - 1; |
|||
mon = 12; |
|||
} |
|||
} */ |
|||
d.setDate(d.getDate() - n); |
|||
year = d.getFullYear(); |
|||
mon = d.getMonth() + 1; |
|||
day = d.getDate(); |
|||
let s = year + "-" + (mon < 10 ? ('0' + mon) : mon) + "-" + (day < 10 ? ('0' + day) : day); |
|||
return s; |
|||
}, |
|||
/** |
|||
* html转义, 防止xss攻击 |
|||
* @param html 需要转义的字符串 |
|||
* @returns {string} |
|||
*/ |
|||
escape(html) { |
|||
return String(html || '').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&') |
|||
.replace(/</g, '<').replace(/>/g, '>') |
|||
.replace(/'/g, ''').replace(/"/g, '"'); |
|||
}, |
|||
/** |
|||
* pid形式数据转children形式 |
|||
* @param data 需要转换的数组 |
|||
* @param idKey id字段名 |
|||
* @param pidKey pid字段名 |
|||
* @param childKey 生成的children字段名 |
|||
* @param pid 顶级的pid |
|||
* @returns {[]} |
|||
*/ |
|||
toTreeData(data, idKey, pidKey, childKey, pid) { |
|||
if (!childKey) childKey = 'children'; |
|||
if (pid === undefined) { |
|||
pid = []; |
|||
data.forEach(d => { |
|||
let flag = true; |
|||
for (let i = 0; i < data.length; i++) { |
|||
if (d[pidKey] == data[i][idKey]) { |
|||
flag = false; |
|||
break; |
|||
} |
|||
} |
|||
if (flag) pid.push(d[pidKey]); |
|||
}); |
|||
} |
|||
let result = []; |
|||
data.forEach(d => { |
|||
if (d[idKey] == d[pidKey]) return console.error('data error: ', d); |
|||
if (Array.isArray(pid) ? (pid.indexOf(d[pidKey]) !== -1) : (d[pidKey] == pid)) { |
|||
let children = this.toTreeData(data, idKey, pidKey, childKey, d[idKey]); |
|||
if (children.length > 0) d[childKey] = children; |
|||
result.push(d); |
|||
} |
|||
}); |
|||
return result; |
|||
}, |
|||
/** |
|||
* 遍历children形式数据 |
|||
* @param data 需要遍历的数组 |
|||
* @param callback 回调 |
|||
* @param childKey children字段名 |
|||
*/ |
|||
eachTreeData(data, callback, childKey) { |
|||
if (!childKey) childKey = 'children'; |
|||
data.forEach(d => { |
|||
if (callback(d) !== false && d[childKey]) this.eachTreeData(d[childKey], callback, childKey); |
|||
}); |
|||
}, |
|||
/** |
|||
* 让浏览器全屏切换 |
|||
* @returns {Element|*|boolean} 是否是全屏状态 |
|||
*/ |
|||
fullScreen() { |
|||
let isFull = document.fullscreenElement || document.msFullscreenElement || document.mozFullScreenElement || |
|||
document.webkitFullscreenElement || false; |
|||
if (isFull) { |
|||
let efs = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || |
|||
document.msExitFullscreen; |
|||
if (efs) { |
|||
efs.call(document); |
|||
} else if (window.ActiveXObject) { |
|||
let ws = new window.ActiveXObject('WScript.Shell'); |
|||
ws && ws.SendKeys('{F11}'); |
|||
} |
|||
} else { |
|||
let el = document.documentElement; |
|||
let rfs = el.requestFullscreen || el.webkitRequestFullscreen || el.mozRequestFullScreen || |
|||
el.msRequestFullscreen; |
|||
if (rfs) { |
|||
rfs.call(el); |
|||
} else if (window.ActiveXObject) { |
|||
let wss = new window.ActiveXObject('WScript.Shell'); |
|||
wss && wss.SendKeys('{F11}'); |
|||
} |
|||
} |
|||
return isFull; |
|||
}, |
|||
/** |
|||
* 获取屏幕宽度 |
|||
* @returns {number} |
|||
*/ |
|||
screenWidth() { |
|||
return document.documentElement.clientWidth || document.body.clientWidth; |
|||
}, |
|||
/** |
|||
* 获取屏幕高度 |
|||
* @returns {number} |
|||
*/ |
|||
screenHeight() { |
|||
return document.documentElement.clientHeight || document.body.clientHeight; |
|||
}, |
|||
/** |
|||
* html转text, 获取html的纯文本 |
|||
* @param html |
|||
* @returns {*} |
|||
*/ |
|||
htmlToText(html) { |
|||
/*let elem = document.createElement('div'); |
|||
elem.innerHTML = html; |
|||
return elem.innerText;*/ |
|||
return html.replace(/<[^>]+>/g, ''); |
|||
}, |
|||
/** |
|||
* 获取设备信息 |
|||
* @param key 自定义的agent |
|||
* @returns {{weixin: *, os: (string|undefined), ie: boolean}} |
|||
*/ |
|||
device(key) { |
|||
let agent = navigator.userAgent.toLowerCase(), |
|||
// 获取版本号
|
|||
getVersion = function(label) { |
|||
const exp = new RegExp(label + '/([^\\s\\_\\-]+)'); |
|||
label = (agent.match(exp) || [])[1]; |
|||
return label || false; |
|||
}, |
|||
// 返回结果集
|
|||
result = { |
|||
os: function() { // 底层操作系统
|
|||
if (/windows/.test(agent)) { |
|||
return 'windows'; |
|||
} else if (/linux/.test(agent)) { |
|||
return 'linux'; |
|||
} else if (/iphone|ipod|ipad|ios/.test(agent)) { |
|||
return 'ios'; |
|||
} else if (/mac/.test(agent)) { |
|||
return 'mac'; |
|||
} else if (/android/.test(agent)) { |
|||
return 'android'; |
|||
} |
|||
}(), |
|||
ie: function() { // ie版本
|
|||
return (!!window.ActiveXObject || 'ActiveXObject' in window) ? ( |
|||
(agent.match(/msie\s(\d+)/) || [])[1] || '11' // 由于ie11并没有msie的标识
|
|||
) : false; |
|||
}(), |
|||
weixin: getVersion('micromessenger') // 是否微信
|
|||
}; |
|||
// 任意的key
|
|||
if (key && !result[key]) { |
|||
result[key] = getVersion(key); |
|||
} |
|||
// 移动设备
|
|||
result.android = /android/.test(agent); |
|||
result.ios = result.os === 'ios'; |
|||
result.mobile = (result.android || result.ios) ? true : false; |
|||
return result; |
|||
}, |
|||
/** |
|||
* 生成随机id |
|||
* @param length 长度 |
|||
* @returns {string} |
|||
*/ |
|||
uuid(length = 32) { |
|||
const num = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'; |
|||
let str = ''; |
|||
for (let i = 0; i < length; i++) { |
|||
str += num.charAt(Math.floor(Math.random() * num.length)); |
|||
} |
|||
return str; |
|||
}, |
|||
/** |
|||
* 生成m到n的随机数,不包含n |
|||
* @param m 最小值 |
|||
* @param n 最大值 |
|||
* @returns {number} |
|||
*/ |
|||
random(m, n) { |
|||
return Math.floor(Math.random() * (m - n) + n); |
|||
}, |
|||
/** |
|||
* 百度地图坐标转高德地图坐标 |
|||
* @param point 坐标 |
|||
* @returns {{lng: number, lat: number}} |
|||
*/ |
|||
bd09ToGcj02: function(point) { |
|||
const x_pi = (3.14159265358979324 * 3000.0) / 180.0; |
|||
const x = point.lng - 0.0065, |
|||
y = point.lat - 0.006; |
|||
const z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); |
|||
const theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); |
|||
return { |
|||
lng: z * Math.cos(theta), |
|||
lat: z * Math.sin(theta) |
|||
}; |
|||
}, |
|||
/** |
|||
* 高德地图坐标转百度地图坐标 |
|||
* @param point 坐标 |
|||
* @returns {{lng: number, lat: number}} |
|||
*/ |
|||
gcj02ToBd09: function(point) { |
|||
const x_pi = (3.14159265358979324 * 3000.0) / 180.0; |
|||
const x = point.lng, |
|||
y = point.lat; |
|||
const z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi); |
|||
const theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi); |
|||
return { |
|||
lng: z * Math.cos(theta) + 0.0065, |
|||
lat: z * Math.sin(theta) + 0.006 |
|||
}; |
|||
}, |
|||
/** |
|||
* 深度克隆对象 |
|||
* @param obj |
|||
* @returns {{}|*} |
|||
*/ |
|||
deepClone: function(obj) { |
|||
let result; |
|||
const type = this.typeOf(obj); |
|||
if (type === 'Object') result = {}; |
|||
else if (type === 'Array') result = []; |
|||
else return obj; |
|||
Object.keys(obj).forEach(key => { |
|||
const copy = obj[key], |
|||
cType = this.typeOf(copy); |
|||
if (cType === 'Object' || cType === 'Array') result[key] = this.deepClone(copy); |
|||
else result[key] = obj[key]; |
|||
}); |
|||
return result; |
|||
}, |
|||
/** |
|||
* 获取变量类型 |
|||
* @param obj |
|||
* @returns {string} |
|||
*/ |
|||
typeOf(obj) { |
|||
if (obj === null) return 'Null'; |
|||
if (obj === undefined) return 'Undefined'; |
|||
return Object.prototype.toString.call(obj).slice(8, -1); |
|||
}, |
|||
/** |
|||
* 播放音频 |
|||
* @param url 音频地址 |
|||
*/ |
|||
play(url) { |
|||
return new Audio(url).play(); |
|||
}, |
|||
/** |
|||
* 判断富文本是否为空 |
|||
* @param html |
|||
*/ |
|||
htmlIsBlank(html) { |
|||
if (!html) return true; |
|||
const media = ['img', 'audio', 'video', 'iframe', 'object']; |
|||
for (let i = 0; i < media.length; i++) { |
|||
if (html.indexOf('<' + media[i]) > -1) return false; |
|||
} |
|||
let str = html.replace(/\s*/g, ''); // 去掉所有空格
|
|||
if (!str) return true; |
|||
str = str.replace(/ /ig, ''); // 去掉所有
|
|||
if (!str) return true; |
|||
str = str.replace(/<[^>]+>/g, ''); // 去掉所有html标签
|
|||
return !str; |
|||
}, |
|||
/** |
|||
* 导出excel |
|||
* @param XLSX XLSX对象 |
|||
* @param sheet 数组或sheet对象 |
|||
* @param sheetname 文件名称 |
|||
* @param type 文件格式 |
|||
*/ |
|||
exportSheet(XLSX, sheet, sheetname, type) { |
|||
if (!sheetname) sheetname = 'sheet1'; |
|||
if (!type) type = 'xlsx'; |
|||
if (Array.isArray(sheet)) sheet = XLSX.utils.aoa_to_sheet(sheet); |
|||
let workbook = { |
|||
SheetNames: [sheetname], |
|||
Sheets: {} |
|||
}; |
|||
workbook.Sheets[sheetname] = sheet; |
|||
XLSX.writeFile(workbook, sheetname + '.' + type); |
|||
}, |
|||
/** |
|||
* 获取不同屏幕的高度 |
|||
* @returns {number} |
|||
*/ |
|||
toHeight() { |
|||
let screenWidth = document.documentElement.clientWidth || document.body.clientWidth; |
|||
if (screenWidth <= 1366) { |
|||
return 'calc(100vh - 135px)'; |
|||
} else if (screenWidth <= 1600 && screenWidth > 1366) { |
|||
return 'calc(100vh - 265px)'; |
|||
} else if (screenWidth <= 1680 && screenWidth > 1600) { |
|||
return 'calc(100vh - 465px)'; |
|||
} else { |
|||
return 'calc(100vh - 500px)'; |
|||
} |
|||
}, |
|||
/** |
|||
* 获取表头样式 |
|||
*/ |
|||
headerCellStyle() { |
|||
return { |
|||
'text-align': 'center', |
|||
'height': '10px' |
|||
} |
|||
}, |
|||
/** |
|||
* 获取表每列样式 |
|||
*/ |
|||
cellStyle() { |
|||
return { |
|||
'text-align': 'center', |
|||
'padding': '0px' |
|||
} |
|||
}, |
|||
/** |
|||
* 获取表每行样式 |
|||
*/ |
|||
rowStyle() { |
|||
return { |
|||
'height': '40px' |
|||
} |
|||
}, |
|||
getParam(key) { |
|||
let href = location.href.split('#')[1] // http://localhost:8080/?code=12313123&a=444
|
|||
if(href==null||href==''){ |
|||
href = location.href.split('#')[0] |
|||
} |
|||
let queryString = href.split('?')[1] // code=12313123&a=444
|
|||
if (!queryString) { |
|||
return false |
|||
} |
|||
let query = queryString.split('&') |
|||
let obj = {} |
|||
for (let i = 0; i < query.length; i++) { |
|||
let arr = query[i].split('=') |
|||
obj[arr[0]] = arr[1] |
|||
} |
|||
if (key) { |
|||
return obj[key] |
|||
} |
|||
return obj |
|||
}, |
|||
/** |
|||
* 常用颜色 |
|||
*/ |
|||
beautifulColors: [ |
|||
'rgb(24,144,255)', 'rgb(102,181,255)', 'rgb(65, 217, 199)', 'rgb(47, 194, 91)', |
|||
'rgb(110, 219, 143)', 'rgb(154, 230, 92)', 'rgb(250, 204, 20)', 'rgb(230, 150, 92)', |
|||
'rgb(87, 173, 113)', 'rgb(34, 50, 115)', 'rgb(115, 138, 230)', 'rgb(117, 100, 204)', |
|||
'rgb(133, 67, 224)', 'rgb(168, 119, 237)', 'rgb(92, 142, 230)', 'rgb(19, 194, 194)', |
|||
'rgb(112, 224, 224)', 'rgb(92, 163, 230)', 'rgb(52, 54, 199)', 'rgb(128, 130, 255)', |
|||
'rgb(221, 129, 230)', 'rgb(240, 72, 100)', 'rgb(250, 125, 146)', 'rgb(213, 152, 217)' |
|||
] |
|||
} |
@ -0,0 +1,73 @@ |
|||
<template> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: "Auth", |
|||
components: { |
|||
}, |
|||
data() { |
|||
return { |
|||
|
|||
}; |
|||
}, |
|||
computed: { |
|||
|
|||
}, |
|||
mounted() { |
|||
var authCode=this.$util.getParam("auth_code"); |
|||
if(authCode!=null&&authCode!=''){ |
|||
var token=this.$util.getParam("token"); |
|||
this.getAlipayUnionId(authCode); |
|||
}else{ |
|||
window.location.href="https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=2021004116616163&scope=auth_base&state=state&redirect_uri="+location.href |
|||
} |
|||
}, |
|||
methods: { |
|||
getAlipayUnionId(authCode){ |
|||
this.$toast.loading({ |
|||
message: '加载中...', |
|||
loadingType: 'spinner', |
|||
}); |
|||
this.$http.post(this.$setting.context_path1+'/util/manage/getAlipayUnionId.do?code='+authCode).then(res => { |
|||
if (res.data.code==0) { |
|||
var params=""; |
|||
var unionId=res.data.data; |
|||
var type= this.$util.getParam("type") //type==1是调用驾校端预支支付 type=2调用变更车型支付,type为空调用的是学员端预支付 |
|||
var trainingOrderId= this.$util.getParam("trainingOrderId");//订单id |
|||
var fromAppurl= this.$util.getParam("fromAppurl");//跳转url |
|||
var token= this.$util.getParam("token");//app登录token 学员端和教练端 |
|||
var rechargeAmount= this.$util.getParam("rechargeAmount");//充值金额(未用留着) |
|||
if(type!=null&&type!=""){ |
|||
params=params+"&type="+type; |
|||
} |
|||
if(trainingOrderId!=null&&trainingOrderId!=""){ |
|||
params=params+"&trainingOrderId="+trainingOrderId; |
|||
} |
|||
if(fromAppurl!=null&&fromAppurl!=""){ |
|||
params=params+"&fromAppurl="+fromAppurl; |
|||
} |
|||
if(token!=null&&token!=""){ |
|||
params=params+"&token="+token; |
|||
} |
|||
if(rechargeAmount!=null&&rechargeAmount!=""){ |
|||
params=params+"&rechargeAmount="+rechargeAmount; |
|||
} |
|||
this.$router.push('/cashier?unionId='+unionId+params); |
|||
} else { |
|||
this.$toast({ type: 'fail', message:res.data.message }); |
|||
} |
|||
}).catch(e => { |
|||
this.$toast({ type: 'fail', message:e.message }); |
|||
}); |
|||
}, |
|||
|
|||
}, |
|||
created() { |
|||
|
|||
}, |
|||
|
|||
}; |
|||
</script> |
|||
<style scoped> |
|||
</style> |
@ -0,0 +1,323 @@ |
|||
<template> |
|||
<div class="cashier_detial"> |
|||
<div class="icon"> |
|||
<div class="img"><van-image :src="payment_logo" /></div> |
|||
<div class="price">¥{{rechargeAmount>0?rechargeAmount:price}}</div> |
|||
</div> |
|||
<div class="content"> |
|||
<div class="title"> |
|||
<div class="text">订单信息</div> |
|||
<div class="c">{{schoolName}}报名费</div> |
|||
</div> |
|||
<div class="title"> |
|||
<div class="text"> 订单金额</div> |
|||
<div class="p">¥{{rechargeAmount>0?rechargeAmount:price}}</div> |
|||
</div> |
|||
|
|||
</div> |
|||
<div class="button"> |
|||
<div> |
|||
<van-button class="add-btn" @click="save">确认支付完成</van-button> |
|||
</div> |
|||
<van-button class="add-btn" @click="goToApp">返回商户界面</van-button> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import payment_logo from '@/assets/payment.png' |
|||
import Big from 'big.js'; |
|||
export default { |
|||
name: "Cashier", |
|||
components: {}, |
|||
data() { |
|||
return { |
|||
payment_logo: payment_logo, |
|||
rechargeAmount: 0, |
|||
price: 0, |
|||
schoolName: '', |
|||
fromAppurl1: '', |
|||
type: null, |
|||
unionId: null, |
|||
trainingOrderId: null, |
|||
fromAppurl: null, |
|||
token: null, |
|||
ipType:"04", |
|||
payType:2, |
|||
riskType:"01", |
|||
deviceType:"1", |
|||
verifyTp:"01", |
|||
verifyRt:"01", |
|||
deviceId:"1", |
|||
longitude:"120.21649", |
|||
latitude:"30.36193", |
|||
clientIp:"127.0.0.1" |
|||
|
|||
}; |
|||
}, |
|||
computed: { |
|||
|
|||
}, |
|||
mounted() { |
|||
var unionId = this.$util.getParam("unionId"); |
|||
var type = this.$util.getParam("type") //type==1是调用驾校端预支支付 type=2调用变更车型支付,type为空调用的是学员端预支付 |
|||
var trainingOrderId = this.$util.getParam("trainingOrderId"); //订单id |
|||
var fromAppurl = this.$util.getParam("fromAppurl"); //跳转url |
|||
var token = this.$util.getParam("token"); //app登录token 学员端和教练端 |
|||
var rechargeAmount = this.$util.getParam("rechargeAmount"); //充值金额(未用留着) |
|||
if (unionId == '' || unionId == null) { |
|||
this.$toast({type: 'fail',message: "获取用户信息失败!"}); |
|||
} else { |
|||
this.unionId = unionId; |
|||
this.type = type; |
|||
this.trainingOrderId = trainingOrderId; |
|||
this.fromAppurl = decodeURIComponent(fromAppurl); |
|||
this.fromAppurl1 = decodeURIComponent(fromAppurl); |
|||
this.token = token; |
|||
this.rechargeAmount = rechargeAmount; |
|||
this.ready(); |
|||
this.getCurrentLocation(); |
|||
this.detail(trainingOrderId,token,type); |
|||
|
|||
} |
|||
|
|||
}, |
|||
methods: { |
|||
ready(callback) { |
|||
// 如果jsbridge已经注入则直接调用 |
|||
if (window.AlipayJSBridge) { |
|||
callback && callback(); |
|||
} else { |
|||
// 如果没有注入则监听注入的事件 |
|||
document.addEventListener('AlipayJSBridgeReady', callback, false); |
|||
} |
|||
}, |
|||
getCurrentLocation (){ |
|||
AlipayJSBridge.call('getCurrentLocation', { bizType: '$s' }, function(result) { |
|||
if (result.error) { |
|||
|
|||
return; |
|||
|
|||
} |
|||
this.latitude=result.latitude; |
|||
this.longitude=result.longitude; |
|||
}); |
|||
}, |
|||
/** |
|||
* 订单详情 |
|||
* @return {Promise} |
|||
*/ |
|||
detail(trainingOrderId, token, type) { |
|||
var url = type == 1 ? this.$setting.context_path2 +'/order/manage/getNoPayOrderDetails?v=1&ts=1&sign=1' : type == 2 ? this.$setting.context_path1 +'/apply/manage/getChangeModelDetails.do?1=1' : this.$setting.context_path1 +'/order/manage/getNoPayOrderDetails.do?1=1'; |
|||
url = url+"&token=" + token + "&trainingOrderId=" + trainingOrderId; |
|||
//初始化产生一个全局变量 AlipayJSBridge |
|||
this.$toast.loading({ |
|||
message: '加载中...', |
|||
forbidClick: true, |
|||
loadingType: 'spinner', |
|||
}); |
|||
this.$http.post(url).then(res => { |
|||
if (res.data.code == 0) { |
|||
this.schoolName = res.data.data.schoolName; |
|||
if (type == 2) { |
|||
this.price = new Big(res.data.data.balance).div(100).toFixed(2) |
|||
} else { |
|||
this.price = new Big(res.data.data.price).div(100).toFixed(2) |
|||
} |
|||
this.save(); |
|||
} else { |
|||
this.$toast({type: 'fail',message: res.data.message}); |
|||
} |
|||
}).catch(e => { |
|||
this.$toast({type: 'fail',message: e.message}); |
|||
}); |
|||
}, |
|||
/***预支付 */ |
|||
createPrepaid(token, type) { |
|||
var url = type == 1 ? this.$setting.context_path2 +'/order/manage/createPrepaid?v=1&ts=1&sign=1' : type == 2 ? this.$setting.context_path1 +'/order/manage/createChangeModelPrepaid.do?1=1' : this.$setting.context_path1 +'/order/manage/createPrepaid.do?1=1'; |
|||
url = url+"&token=" + token |
|||
var param={clientIp:this.clientIp,longitude:this.longitude,latitude:this.latitude,ipType:this.ipType,payType:this.payType,fromAppurl:this.fromAppurl,trainingOrderId:this.trainingOrderId,riskType:this.riskType,deviceType:this.deviceType,verifyTp:this.verifyTp,verifyRt:this.verifyRt,deviceId:this.deviceId,openid:this.unionId} |
|||
this.$http.post(url,type == 1?param:null,type!=1?{params:param}:null).then(res => { |
|||
if (res.data.code == 0) { |
|||
var outTradeNo=res.data.data.outTradeNo;//商户平台交易流水号 |
|||
if(outTradeNo!=''&&outTradeNo!=null){ |
|||
this.fromAppurl1=this.fromAppurl+'?outTradeNo='+outTradeNo////商户平台交易流水号 |
|||
} |
|||
var payInfo=JSON.parse(res.data.data.payInfo); |
|||
//调用支付宝api唤起支付功能 |
|||
AlipayJSBridge.call("tradePay",{tradeNO: payInfo.tradeNO,},(result) => { |
|||
const { resultCode = "", result: resultMsg = "支付失败" } =result; |
|||
if (resultCode == "9000") { |
|||
// 支付成功 |
|||
this.$router.push('/result?price='+this.price+"&fromAppurl="+this.fromAppurl+'&outTradeNo='+outTradeNo); |
|||
}else if(resultCode=="6001"){ |
|||
this.$toast({type: 'fail',message: "用户取消支付"}); |
|||
}else{ |
|||
this.$toast({type: 'fail',message: result}); |
|||
} |
|||
} |
|||
); |
|||
} else { |
|||
this.$toast({type: 'fail',message: res.data.message}); |
|||
} |
|||
}).catch(e => { |
|||
this.$toast({type: 'fail',message: e.message}); |
|||
}); |
|||
}, |
|||
/***充值预支付 */ |
|||
createRechargePrepaid(token, type) { |
|||
var param={clientIp:this.clientIp,longitude:this.longitude,latitude:this.latitude,ipType:this.ipType,payType:this.payType,fromAppurl:this.fromAppurl,trainingOrderId:this.trainingOrderId,riskType:this.riskType,deviceType:this.deviceType,verifyTp:this.verifyTp,verifyRt:this.verifyRt,deviceId:this.deviceId,openid:this.unionId,rechargeAmount:this.rechargeAmount} |
|||
|
|||
var url = type == 1 ? this.$setting.context_path2 +'/order/manage/createRechargePrepaid?v=1&ts=1&sign=1': this.$setting.context_path1 +'/order/manage/createRechargePrepaid.do?1=1'; |
|||
url = url+"&token=" + token |
|||
this.$http.post(url,type == 1?param:null,type!=1?{params:param}:null).then(res => { |
|||
if (res.data.code == 0) { |
|||
var outTradeNo=res.data.data.outTradeNo;//商户平台交易流水号 |
|||
if(outTradeNo!=''&&outTradeNo!=null){ |
|||
this.fromAppurl1=this.fromAppurl+'?outTradeNo='+outTradeNo//商户平台交易流水号 |
|||
} |
|||
var payInfo=JSON.parse(res.data.data.payInfo); |
|||
//调用支付宝api唤起支付功能 |
|||
AlipayJSBridge.call("tradePay",{tradeNO: payInfo.tradeNO,},(result) => { |
|||
const { resultCode = "", result: resultMsg = "支付失败" } =result; |
|||
if (resultCode == "9000") { |
|||
// 支付成功 |
|||
this.$router.push('/result?price='+this.rechargeAmount+"&fromAppurl="+this.fromAppurl+'&outTradeNo='+outTradeNo); |
|||
}else if(resultCode=="6001"){ |
|||
this.$toast({type: 'fail',message: "用户取消支付"}); |
|||
}else{ |
|||
this.$toast({type: 'fail',message: result}); |
|||
} |
|||
} |
|||
); |
|||
|
|||
} else { |
|||
this.$toast({type: 'fail',message: res.data.message}); |
|||
} |
|||
}).catch(e => { |
|||
this.$toast({type: 'fail',message: e.message}); |
|||
}); |
|||
}, |
|||
//确认支付 |
|||
save(){ |
|||
this.$toast.loading({ |
|||
message: '加载中...', |
|||
duration:3000, |
|||
forbidClick: true, |
|||
loadingType: 'spinner', |
|||
}); |
|||
if(this.rechargeAmount!=null&&this.rechargeAmount!=''&&this.rechargeAmount>0){ |
|||
this.createRechargePrepaid(this.token,this.type);//充值预支付 |
|||
}else{ |
|||
this.createPrepaid(this.token,this.type); |
|||
} |
|||
}, |
|||
goToApp() { |
|||
|
|||
window.location.href =this.fromAppurl1; |
|||
}, |
|||
|
|||
}, |
|||
created() { |
|||
// 注入支付宝jsapi |
|||
const s = document.createElement("script"); |
|||
s.type = "text/javascript"; |
|||
s.src ="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.min.js"; |
|||
document.body.appendChild(s); |
|||
}, |
|||
|
|||
}; |
|||
</script> |
|||
<style scoped> |
|||
body { |
|||
height: 100%; |
|||
width: 100%; |
|||
background-color: #f3f3f3; |
|||
} |
|||
|
|||
.cashier_detial { |
|||
width: 100%; |
|||
height: 1206rpx; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
.cashier_detial .icon { |
|||
width: 100%; |
|||
height: 200px; |
|||
} |
|||
|
|||
.cashier_detial .icon .img { |
|||
width: 100%; |
|||
text-align: center; |
|||
} |
|||
|
|||
.cashier_detial .icon .img .van-image { |
|||
margin-top: 20px; |
|||
width: 100px; |
|||
height: 100px; |
|||
margin-bottom: 15px; |
|||
} |
|||
|
|||
.cashier_detial .icon .price { |
|||
text-align: center; |
|||
font-size: 32px; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.cashier_detial .content { |
|||
background-color: #fff; |
|||
width: 100%; |
|||
height: 100px; |
|||
font-size: 15px; |
|||
} |
|||
|
|||
.cashier_detial .content .title { |
|||
font-size: 15px; |
|||
height: 58px; |
|||
border-bottom: 1px solid #f8f8f8; |
|||
} |
|||
|
|||
.cashier_detial .content .title .text { |
|||
margin-left: 15px; |
|||
margin-top: 15px; |
|||
float: left; |
|||
width: 20%; |
|||
color: #9b9999; |
|||
} |
|||
|
|||
.cashier_detial .content .title .c { |
|||
float: left; |
|||
width: 72%; |
|||
margin-top: 15px; |
|||
} |
|||
|
|||
.cashier_detial .content .title .p { |
|||
float: left; |
|||
width: 72%; |
|||
margin-top: 15px; |
|||
} |
|||
|
|||
.button { |
|||
width: 100%; |
|||
margin-top: 175px; |
|||
text-align: center; |
|||
} |
|||
|
|||
.add-btn { |
|||
width: 351px; |
|||
height: 46px; |
|||
background: linear-gradient(0deg, #3593fb 0%, #53d3e5 100%); |
|||
border-radius: 10px; |
|||
margin-top: 25px; |
|||
line-height: 46px; |
|||
font-weight: bold; |
|||
font-family: PingFang SC; |
|||
color: #fff; |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.text-center { |
|||
text-align: center; |
|||
font-size: 16px; |
|||
} |
|||
</style> |
@ -0,0 +1,102 @@ |
|||
<template> |
|||
<div class="cashier_detial"> |
|||
<div class="icon"> |
|||
<div class="img"><van-image :src="success_logo" /></div> |
|||
<div class="price">¥{{price}}</div> |
|||
</div> |
|||
<div class="button"> |
|||
<van-button class="add-btn" @click="goToApp">返回商户界面</van-button> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import success_logo from '@/assets/success.png' |
|||
export default { |
|||
name: "CashierResult", |
|||
components: { |
|||
}, |
|||
data() { |
|||
return { |
|||
success_logo:success_logo, |
|||
price:0, |
|||
fromAppurl:"", |
|||
}; |
|||
}, |
|||
computed: { |
|||
|
|||
}, |
|||
mounted() { |
|||
var price = this.$util.getParam("price");//金额 |
|||
var fromAppurl = this.$util.getParam("fromAppurl"); //跳转url |
|||
var outTradeNo = this.$util.getParam("outTradeNo"); //外部订单id |
|||
if(outTradeNo!=''&&outTradeNo!=null){ |
|||
fromAppurl=fromAppurl+'?outTradeNo='+outTradeNo; |
|||
} |
|||
this.price=price; |
|||
this.fromAppurl=fromAppurl; |
|||
}, |
|||
methods: { |
|||
|
|||
goToApp() { |
|||
window.location.href =this.fromAppurl; |
|||
}, |
|||
}, |
|||
created() { |
|||
|
|||
}, |
|||
|
|||
}; |
|||
</script> |
|||
<style scoped> |
|||
body{ |
|||
height: 100%; |
|||
width: 100%; |
|||
background-color: #f3f3f3; |
|||
} |
|||
.cashier_detial { |
|||
width: 100%; |
|||
height: 1206rpx; |
|||
overflow: hidden; |
|||
} |
|||
.cashier_detial .icon { |
|||
width: 100%; |
|||
height: 200px; |
|||
} |
|||
.cashier_detial .icon .img { |
|||
width: 100%; |
|||
text-align: center; |
|||
} |
|||
.cashier_detial .icon .img .van-image{ |
|||
margin-top: 20px; |
|||
width: 100px; |
|||
height: 100px; |
|||
margin-bottom: 15px; |
|||
} |
|||
.cashier_detial .icon .price { |
|||
text-align: center; |
|||
font-size: 32px; |
|||
font-weight: bold; |
|||
} |
|||
.button { |
|||
width: 100%; |
|||
margin-top: 175px; |
|||
text-align: center; |
|||
} |
|||
.add-btn { |
|||
width: 351px; |
|||
height: 46px; |
|||
background: linear-gradient(0deg, #3593fb 0%, #53d3e5 100%); |
|||
border-radius: 10px; |
|||
margin-top: 25px; |
|||
line-height: 46px; |
|||
font-weight: bold; |
|||
font-family: PingFang SC; |
|||
color:#fff; |
|||
cursor: pointer; |
|||
} |
|||
.text-center { |
|||
text-align: center; |
|||
font-size: 16px; |
|||
} |
|||
</style> |
@ -0,0 +1,34 @@ |
|||
<template> |
|||
<van-button type="primary" @click="pay">拉起支付宝</van-button> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: "Index", |
|||
components: { |
|||
}, |
|||
data() { |
|||
return { |
|||
|
|||
}; |
|||
}, |
|||
computed: { |
|||
|
|||
}, |
|||
mounted() { |
|||
}, |
|||
methods: { |
|||
pay(){ |
|||
//window.location.href = 'alipays://platformapi/startapp?saId=10000007&qrcode='+encodeURIComponent('http://192.168.1.39:9103/alipay/auth?trainingOrderId=65aee95e818f4571b2480bdafba4cd4a&token=amlhcGVpMTY5NDE1MjM0MzU5NTM0OTQ2&fromAppurl=paymoney://car:8888/carstep')//拉起支付宝扫一扫 |
|||
window.location.href="alipays://platformapi/startapp?appId=20000042&publicBizType=LIFE_APP&publicId=2021004116616163&url="+encodeURIComponent('http://192.168.1.39:9103/alipay/auth?trainingOrderId=65aee95e818f4571b2480bdafba4cd4a&token=amlhcGVpMTY5NDE1MjM0MzU5NTM0OTQ2&fromAppurl=paymoney://car:8888/carstep')//拉起生活号 |
|||
//window.location.href ='alipayqr://platformapi/startapp?saId=10000007&qrcode='+encodeURI('http://192.168.1.39:9103/alipay/auth?type=111&trainingOrderId=111&fromAppurl=111&token=111')//另一种拉起支付宝扫一扫 |
|||
} |
|||
}, |
|||
created() { |
|||
|
|||
}, |
|||
|
|||
}; |
|||
</script> |
|||
<style scoped> |
|||
</style> |
@ -0,0 +1,47 @@ |
|||
const CompressionWebpackPlugin = require('compression-webpack-plugin'); |
|||
const port = process.env.port || process.env.npm_config_port || 9103 // dev port
|
|||
const productionGzipExtensions = ['js','css','less'] |
|||
module.exports = { |
|||
publicPath: process.env.VUE_APP_PATH, |
|||
outputDir: 'dist', |
|||
assetsDir: 'static', |
|||
productionSourceMap: false, |
|||
transpileDependencies: ['vant'], // 需要兼容IE10要放开这个
|
|||
devServer: { |
|||
port: port, |
|||
open: true, |
|||
host: '0.0.0.0', |
|||
overlay: { |
|||
warnings: false, |
|||
errors: true |
|||
}, |
|||
proxy: { |
|||
'/alipayapi': { |
|||
target: process.env.VUE_APP_BASE_URL, |
|||
changeOrigin: true, |
|||
pathRewrite: { |
|||
'^/alipayapi': '' |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
chainWebpack: config => { |
|||
config.plugin('html').tap(options => { |
|||
options[0].title = '浙里学车生活号'; |
|||
return options; |
|||
}); |
|||
if (process.env.NODE_ENV === 'production') { |
|||
config.plugin('compressionPlugin').use(new CompressionWebpackPlugin({ |
|||
filename: '[path].gz[query]', |
|||
algorithm: 'gzip', |
|||
test: new RegExp( |
|||
'\\.(' +productionGzipExtensions.join('|') + |
|||
')$' |
|||
), |
|||
threshold: 10240, |
|||
// deleteOriginalAssets:true, //删除源文件,不建议
|
|||
minRatio: 0.8 |
|||
})); |
|||
} |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue