Commit b481fc9b authored by 李智书's avatar 李智书

1.初始化;

parent 353ba747
Pipeline #396 failed with stages
.DS_Store
node_modules/
unpackage/
dist/
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.project
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
const plugins = []
if (process.env.UNI_OPT_TREESHAKINGNG) {
plugins.push(require('@dcloudio/vue-cli-plugin-uni-optimize/packages/babel-plugin-uni-api/index.js'))
}
if (
(
process.env.UNI_PLATFORM === 'app-plus' &&
process.env.UNI_USING_V8
) ||
(
process.env.UNI_PLATFORM === 'h5' &&
process.env.UNI_H5_BROWSER === 'builtin'
)
) {
const path = require('path')
const isWin = /^win/.test(process.platform)
const normalizePath = path => (isWin ? path.replace(/\\/g, '/') : path)
const input = normalizePath(process.env.UNI_INPUT_DIR)
try {
plugins.push([
require('@dcloudio/vue-cli-plugin-hbuilderx/packages/babel-plugin-console'),
{
file (file) {
file = normalizePath(file)
if (file.indexOf(input) === 0) {
return path.relative(input, file)
}
return false
}
}
])
} catch (e) {}
}
process.UNI_LIBRARIES = process.UNI_LIBRARIES || ['@dcloudio/uni-ui']
process.UNI_LIBRARIES.forEach(libraryName => {
plugins.push([
'import',
{
'libraryName': libraryName,
'customName': (name) => {
return `${libraryName}/lib/${name}/${name}`
}
}
])
})
module.exports = {
presets: [
[
'@vue/app',
{
modules: 'commonjs',
useBuiltIns: process.env.UNI_PLATFORM === 'h5' ? 'usage' : 'entry'
}
]
],
plugins
}
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "xzf_uniapp-wechat-web",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "npm run dev:h5",
"build": "npm run build:h5",
"build:app-plus": "cross-env NODE_ENV=production UNI_PLATFORM=app-plus vue-cli-service uni-build",
"build:custom": "cross-env NODE_ENV=production uniapp-cli custom",
"build:h5": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build",
"build:mp-360": "cross-env NODE_ENV=production UNI_PLATFORM=mp-360 vue-cli-service uni-build",
"build:mp-alipay": "cross-env NODE_ENV=production UNI_PLATFORM=mp-alipay vue-cli-service uni-build",
"build:mp-baidu": "cross-env NODE_ENV=production UNI_PLATFORM=mp-baidu vue-cli-service uni-build",
"build:mp-kuaishou": "cross-env NODE_ENV=production UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build",
"build:mp-qq": "cross-env NODE_ENV=production UNI_PLATFORM=mp-qq vue-cli-service uni-build",
"build:mp-toutiao": "cross-env NODE_ENV=production UNI_PLATFORM=mp-toutiao vue-cli-service uni-build",
"build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
"build:quickapp-native": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-native vue-cli-service uni-build",
"build:quickapp-webview": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview vue-cli-service uni-build",
"build:quickapp-webview-huawei": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build",
"build:quickapp-webview-union": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build",
"dev:app-plus": "cross-env NODE_ENV=development UNI_PLATFORM=app-plus vue-cli-service uni-build --watch",
"dev:custom": "cross-env NODE_ENV=development uniapp-cli custom",
"dev:h5": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve",
"dev:mp-360": "cross-env NODE_ENV=development UNI_PLATFORM=mp-360 vue-cli-service uni-build --watch",
"dev:mp-alipay": "cross-env NODE_ENV=development UNI_PLATFORM=mp-alipay vue-cli-service uni-build --watch",
"dev:mp-baidu": "cross-env NODE_ENV=development UNI_PLATFORM=mp-baidu vue-cli-service uni-build --watch",
"dev:mp-kuaishou": "cross-env NODE_ENV=development UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build --watch",
"dev:mp-qq": "cross-env NODE_ENV=development UNI_PLATFORM=mp-qq vue-cli-service uni-build --watch",
"dev:mp-toutiao": "cross-env NODE_ENV=development UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --watch",
"dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
"dev:quickapp-native": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-native vue-cli-service uni-build --watch",
"dev:quickapp-webview": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview vue-cli-service uni-build --watch",
"dev:quickapp-webview-huawei": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build --watch",
"dev:quickapp-webview-union": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build --watch",
"info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js",
"serve:quickapp-native": "node node_modules/@dcloudio/uni-quickapp-native/bin/serve.js",
"test:android": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=android jest -i",
"test:h5": "cross-env UNI_PLATFORM=h5 jest -i",
"test:ios": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=ios jest -i",
"test:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu jest -i",
"test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i"
},
"dependencies": {
"@dcloudio/uni-app-plus": "^2.0.0-32920210927002",
"@dcloudio/uni-h5": "^2.0.0-32920210927002",
"@dcloudio/uni-helper-json": "*",
"@dcloudio/uni-i18n": "^2.0.0-32920210927002",
"@dcloudio/uni-mp-360": "^2.0.0-32920210927002",
"@dcloudio/uni-mp-alipay": "^2.0.0-32920210927002",
"@dcloudio/uni-mp-baidu": "^2.0.0-32920210927002",
"@dcloudio/uni-mp-kuaishou": "^2.0.0-32920210927002",
"@dcloudio/uni-mp-qq": "^2.0.0-32920210927002",
"@dcloudio/uni-mp-toutiao": "^2.0.0-32920210927002",
"@dcloudio/uni-mp-vue": "^2.0.0-32920210927002",
"@dcloudio/uni-mp-weixin": "^2.0.0-32920210927002",
"@dcloudio/uni-quickapp-native": "^2.0.0-32920210927002",
"@dcloudio/uni-quickapp-webview": "^2.0.0-32920210927002",
"@dcloudio/uni-stat": "^2.0.0-32920210927002",
"@vue/shared": "^3.0.0",
"core-js": "^3.6.5",
"dayjs": "^1.10.4",
"echarts": "^5.1.0",
"flyio": "^0.6.2",
"jweixin-module": "^1.6.0",
"less-loader": "5.0.0",
"regenerator-runtime": "^0.12.1",
"sass-loader": "7.0.0",
"node-sass": "^6.0.1",
"vant": "^2.12.30",
"vconsole": "^3.7.0",
"vue": "^2.6.11",
"vuex": "^3.2.0"
},
"devDependencies": {
"@babel/runtime": "~7.12.0",
"@dcloudio/types": "*",
"@dcloudio/uni-automator": "^2.0.0-32920210927002",
"@dcloudio/uni-cli-i18n": "^2.0.0-32920210927002",
"@dcloudio/uni-cli-shared": "^2.0.0-32920210927002",
"@dcloudio/uni-migration": "^2.0.0-32920210927002",
"@dcloudio/uni-template-compiler": "^2.0.0-32920210927002",
"@dcloudio/vue-cli-plugin-hbuilderx": "^2.0.0-32920210927002",
"@dcloudio/vue-cli-plugin-uni": "^2.0.0-32920210927002",
"@dcloudio/vue-cli-plugin-uni-optimize": "^2.0.0-32920210927002",
"@dcloudio/webpack-uni-mp-loader": "^2.0.0-32920210927002",
"@dcloudio/webpack-uni-pages-loader": "^2.0.0-32920210927002",
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"babel-plugin-import": "^1.11.0",
"cross-env": "^7.0.2",
"jest": "^25.4.0",
"mini-types": "*",
"miniprogram-api-typings": "*",
"postcss-comment": "^2.0.0",
"vue-template-compiler": "^2.6.11"
},
"browserslist": [
"Android >= 4.4",
"ios >= 9"
],
"uni-app": {
"scripts": {}
}
}
const path = require('path')
module.exports = {
parser: require('postcss-comment'),
plugins: [
require('postcss-import')({
resolve (id, basedir, importOptions) {
if (id.startsWith('~@/')) {
return path.resolve(process.env.UNI_INPUT_DIR, id.substr(3))
} else if (id.startsWith('@/')) {
return path.resolve(process.env.UNI_INPUT_DIR, id.substr(2))
} else if (id.startsWith('/') && !id.startsWith('//')) {
return path.resolve(process.env.UNI_INPUT_DIR, id.substr(1))
}
return id
}
}),
require('autoprefixer')({
remove: process.env.UNI_PLATFORM !== 'h5'
}),
require('@dcloudio/vue-cli-plugin-uni/packages/postcss')
]
}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="shortcut icon" type="image/x-icon" href="./faceico.ico"/>
<title>
<%= htmlWebpackPlugin.options.title %>
</title>
<script src="//s1.pstatp.com/cdn/expire-1-M/jquery/1.8.0/jquery-1.8.0.min.js" async="async"></script>
<script src="//res.wx.qq.com/open/libs/weuijs/1.2.1/weui.min.js" async="async"></script>
<script src="//res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script src="//static.runoob.com/assets/qrcode/qrcode.min.js" async="async"></script>
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS
.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
<script src="//cdn.bootcdn.net/ajax/libs/clipboard.js/2.0.6/clipboard.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/eruda" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
// eruda.init();
</script>
</head>
<body>
<noscript>
<strong>Please enable JavaScript to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
.DS_Store
node_modules/
unpackage/
dist/
.hbuilderx/
# local env files
.env.local
.env.*.local
manifest.json
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.project
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
<script>
export default {
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style>
/*每个页面公共css */
@import url("./common/css/weui.min.css");
/* #ifdef H5 */
@import url("../node_modules/vant/lib/index.css");
/* #endif */
</style>
# az-uniapp-wechat-web
传统web页面使用uniapp框架重写
\ No newline at end of file
/*!
* WeUI v2.0.1 (https://github.com/weui/weui)
* Copyright 2019 Tencent, Inc.
* Licensed under the MIT license
*/html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{line-height:1.6;font-family:-apple-system-font,Helvetica Neue,sans-serif}*{margin:0;padding:0}a img{border:0}a{text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}input,textarea{caret-color:#07c160}@font-face{font-weight:400;font-style:normal;font-family:weui;src:url("data:application/octet-stream;base64,AAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzJAKEx8AAABfAAAAFZjbWFw65cFHQAAAhwAAAJQZ2x5Zp+UEEcAAASUAAAIvGhlYWQUqc7xAAAA4AAAADZoaGVhB/YD+wAAALwAAAAkaG10eEJoAAAAAAHUAAAASGxvY2EUxhJeAAAEbAAAACZtYXhwASEAQwAAARgAAAAgbmFtZeNcHtgAAA1QAAAB5nBvc3T6OoZLAAAPOAAAAOYAAQAAA+gAAABaA+gAAAAAA7MAAQAAAAAAAAAAAAAAAAAAABIAAQAAAAEAAMCU2KdfDzz1AAsD6AAAAADY7EUUAAAAANjsRRQAAAAAA7MD5AAAAAgAAgAAAAAAAAABAAAAEgA3AAUAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQOwAZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6gHqEQPoAAAAWgPoAAAAAAABAAAAAAAAAAAAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAAAAABQAAAAMAAAAsAAAABAAAAXQAAQAAAAAAbgADAAEAAAAsAAMACgAAAXQABABCAAAABAAEAAEAAOoR//8AAOoB//8AAAABAAQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAANwAAAAAAAAAEQAA6gEAAOoBAAAAAQAA6gIAAOoCAAAAAgAA6gMAAOoDAAAAAwAA6gQAAOoEAAAABAAA6gUAAOoFAAAABQAA6gYAAOoGAAAABgAA6gcAAOoHAAAABwAA6ggAAOoIAAAACAAA6gkAAOoJAAAACQAA6goAAOoKAAAACgAA6gsAAOoLAAAACwAA6gwAAOoMAAAADAAA6g0AAOoNAAAADQAA6g4AAOoOAAAADgAA6g8AAOoPAAAADwAA6hAAAOoQAAAAEAAA6hEAAOoRAAAAEQAAAAAARACKAMQBEgFgAZIB4gH6AioCeAK0AwwDZAOiA9wEEAReAAAAAgAAAAADlQOVABQAKQAAJSInJicmNDc2NzYyFxYXFhQHBgcGJzI3Njc2NCcmJyYiBwYHBhQXFhcWAfRxYV83OTk3X2HiYV83OTk3X2FxZFVTMTIyMVNVyFVTMTIyMVNVUzk3X2HiYV83OTk3X2HiYV83OTIyMVNVyFVTMTIyMVNVyFVTMTIAAAIAAAAAA7MDswAXAC0AAAEiBwYHBhUUFxYXFjMyNzY3NjU0JyYnJhMHBiIvASY2OwERNDY7ATIWFREzMhYB7nZnZDs9PTtkZ3Z8amY7Pj47Zmkhdg4oDnYODRddCwcmBwtdFw0Dsz47Zmp8dmdkOz09O2Rndn1pZjs+/fCaEhKaEhoBFwgLCwj+6RoAAwAAAAADlQOVABQAGAAhAAAlIicmJyY0NzY3NjIXFhcWFAcGBwYDETMRJzI2NCYiBhQWAfRxYV83OTk3X2HiYV83OTk3X2GQPh8RGRkiGRlTOTdfYeJhXzc5OTdfYeJhXzc5AfT+3QEjKhgjGBgjGAAAAAACAAAAAAOxA+QAFwAsAAABBgcGDwERFBcWFxYXNjc2NzY1EScmJyYTAQYvASY/ATYyHwEWNjclNjIfARYB9WlsP3A3Rz5sXmxsXW09SDdwQGuP/tUEBIoDAxIBBQFxAQUCARICBQERBAPjFyASJBL+rI51ZUg/HBw/SGV1jgFUEiQSIP66/tkDA48EBBkCAVYCAQHlAQIQBAAAAAADAAAAAAOxA+QAFwAmAC8AAAEGBwYPAREUFxYXFhc2NzY3NjURJyYnJgczMhYVAxQGKwEiJwM0NhMiJjQ2MhYUBgH1aWtAcDdHPmxebGxdbT1IN3BAa4M0BAYMAwImBQELBh4PFhYeFRUD5BggEiQS/q2PdWRJPh0dPklkdY8BUxIkEiD4BgT+xgIDBQE6BAb+QBUfFRUfFQAAAAACAAAAAAOVA5UAFAAaAAAlIicmJyY0NzY3NjIXFhcWFAcGBwYDJwcXAScB9HFhXzc5OTdfYeJhXzc5OTdfYaJzLJ8BFi1TOTdfYeJhXzc5OTdfYeJhXzc5AUhzLJ8BFSwAAAAAAwAAAAADlQOVABQAKQAvAAAlIicmJyY0NzY3NjIXFhcWFAcGBwYnMjc2NzY0JyYnJiIHBgcGFBcWFxYTNxcBJzcB9HFhXzc5OTdfYeJhXzc5OTdfYXFkVVMxMjIxU1XIVVMxMjIxU1Uz8iT+6p8jUzk3X2HiYV83OTk3X2HiYV83OTIyMVNVyFVTMTIyMVNVyFVTMTIBBPIj/uufJAAAAAEAAAAAA5kDGAAHAAAlATcXARcBBgGF/vg7zgHYOv3vAcsBCTvPAdg7/e4BAAAAAAIAAAAAA5UDlQAFABoAAAE1IxUXNwMiJyYnJjQ3Njc2MhcWFxYUBwYHBgITPrEsvnFhXzc5OTdfYeJhXzc5OTdfYQIO4PqxLP7kOTdfYeJhXzc5OTdfYeJhXzc5AAAAAAMAAAAAA5UDlQAFABoALwAAARcHJzUzAyInJicmNDc2NzYyFxYXFhQHBgcGJzI3Njc2NCcmJyYiBwYHBhQXFhcWAg2iI7EyGXFhXzc5OTdfYeJhXzc5OTdfYXFkVVMxMjIxU1XIVVMxMjIxU1UCCaIksfr9ZTk3X2HiYV83OTk3X2HiYV83OTIyMVNVyFVTMTIyMVNVyFVTMTIAAAMAAAAAA5UDlQAUABgAIQAAJSInJicmNDc2NzYyFxYXFhQHBgcGAxMzEwMyNjQmIg4BFgH0cWFfNzk5N19h4mFfNzk5N19hkQU2BSAQFRUgFQEWUzk3X2HiYV83OTk3X2HiYV83OQKV/sQBPP43Fh8VFR8WAAAAAAQAAAAAA5UDlQAUACkALQA2AAAlIicmJyY0NzY3NjIXFhcWFAcGBwYnMjc2NzY0JyYnJiIHBgcGFBcWFxYTMxEjEyImNDYyFhQGAfRxYV83OTk3X2HiYV83OTk3X2FxZFVTMTIyMVNVyFVTMTIyMVNVSzIyGREZGSIZGVM5N19h4mFfNzk5N19h4mFfNzkyMjFTVchVUzEyMjFTVchVUzEyAcL+3QFNGCMYGCMYAAAAAwAAAAADlQOVABQAKQA1AAAlIicmJyY0NzY3NjIXFhcWFAcGBwYnMjc2NzY0JyYnJiIHBgcGFBcWFxYTFwcnByc3JzcXNxcB9HFhXzc5OTdfYeJhXzc5OTdfYXFkVVMxMjIxU1XIVVMxMjIxU1WHgiOCgiOCgiOCgiNTOTdfYeJhXzc5OTdfYeJhXzc5MjIxU1XIVVMxMjIxU1XIVVMxMgFvgiOCgiOCgiOCgiMAAAACAAAAAANUA0IAGAAlAAABFwcnDgEjIicmJyY0NzY3NjIXFhcWFRQGJzQuASIOARQeATI+AQKoqyOsJ180T0RCJycnJ0JEn0RCJiglDUFvg29BQW+Db0EBYKwjrCAjKCZCRJ9EQicnJydCRE82YZdBb0FBb4NvQUFvAAAAAgAAAAADlQOVAAsAIAAAATcnBycHFwcXNxc3AyInJicmNDc2NzYyFxYXFhQHBgcGAiB9LH19LH19LH19LKlxYV83OTk3X2HiYV83OTk3X2EB9H0sfX0sfX0sfX0s/tw5N19h4mFfNzk5N19h4mFfNzkAAAACAAAAAAOVA5UAFAAcAAAlIicmJyY0NzY3NjIXFhcWFAcGBwYDJzcnBwYfAQH0cWFfNzk5N19h4mFfNzk5N19hHoqKK7UBAbVTOTdfYeJhXzc5OTdfYeJhXzc5ARKPjy27AQG6AAAAAAUAAAAAA1cDbAAJAB0AJwArAC8AAAETHgEzITI2NxMzAw4BIyEiJicDIzU0NjMhMhYdASUyFh0BIzU0NjMHMxMjEzMDIwEaIgETDQEuDRMBIjIiAjAh/tIhMAIiVgwJApoJDP7xCQzQDAkVMhUyiTIVMgLd/cgOEhIOAjj9xSEuLiECOx4IDAwIHo4MCR0dCQz6/okBd/6JAAAAAAAAEADGAAEAAAAAAAEABAAAAAEAAAAAAAIABwAEAAEAAAAAAAMABAALAAEAAAAAAAQABAAPAAEAAAAAAAUACwATAAEAAAAAAAYABAAeAAEAAAAAAAoAKwAiAAEAAAAAAAsAEwBNAAMAAQQJAAEACABgAAMAAQQJAAIADgBoAAMAAQQJAAMACAB2AAMAAQQJAAQACAB+AAMAAQQJAAUAFgCGAAMAAQQJAAYACACcAAMAAQQJAAoAVgCkAAMAAQQJAAsAJgD6d2V1aVJlZ3VsYXJ3ZXVpd2V1aVZlcnNpb24gMS4wd2V1aUdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAHcAZQB1AGkAUgBlAGcAdQBsAGEAcgB3AGUAdQBpAHcAZQB1AGkAVgBlAHIAcwBpAG8AbgAgADEALgAwAHcAZQB1AGkARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETAAZjaXJjbGUIZG93bmxvYWQEaW5mbwxzYWZlLXN1Y2Nlc3MJc2FmZS13YXJuB3N1Y2Nlc3MOc3VjY2Vzcy1jaXJjbGURc3VjY2Vzcy1uby1jaXJjbGUHd2FpdGluZw53YWl0aW5nLWNpcmNsZQR3YXJuC2luZm8tY2lyY2xlBmNhbmNlbAZzZWFyY2gFY2xlYXIEYmFjawZkZWxldGUAAAAA") format("truetype")}[class*=" weui-icon-"],[class^=weui-icon-]{display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 weui;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}[class*=" weui-icon-"]:before,[class^=weui-icon-]:before{display:inline-block;margin-left:.2em;margin-right:.2em}.weui-icon-circle:before{content:"\EA01"}.weui-icon-download:before{content:"\EA02"}.weui-icon-info:before{content:"\EA03"}.weui-icon-safe-success:before{content:"\EA04"}.weui-icon-safe-warn:before{content:"\EA05"}.weui-icon-success:before{content:"\EA06"}.weui-icon-success-circle:before{content:"\EA07"}.weui-icon-success-no-circle:before{content:"\EA08"}.weui-icon-waiting:before{content:"\EA09"}.weui-icon-waiting-circle:before{content:"\EA0A"}.weui-icon-warn:before{content:"\EA0B"}.weui-icon-info-circle:before{content:"\EA0C"}.weui-icon-cancel:before{content:"\EA0D"}.weui-icon-search:before{content:"\EA0E"}.weui-icon-clear:before{content:"\EA0F"}.weui-icon-back:before{content:"\EA10"}.weui-icon-delete:before{content:"\EA11"}[class*=" weui-icon_"]:before,[class^=weui-icon_]:before{margin:0}.weui-icon-success{font-size:23px;color:#07c160}.weui-icon-waiting{font-size:23px;color:#10aeff}.weui-icon-warn{font-size:23px;color:#fa5151}.weui-icon-info{font-size:23px;color:#10aeff}.weui-icon-success-circle,.weui-icon-success-no-circle{font-size:23px;color:#07c160}.weui-icon-waiting-circle{font-size:23px;color:#10aeff}.weui-icon-circle{font-size:23px;color:#c9c9c9}.weui-icon-download,.weui-icon-info-circle{font-size:23px;color:#07c160}.weui-icon-safe-success{color:#07c160}.weui-icon-safe-warn{color:#ffbe00}.weui-icon-cancel{color:#fa5151;font-size:22px}.weui-icon-search{color:rgba(0,0,0,.5);font-size:18px}.weui-icon-search:before{margin-right:0}.weui-icon-clear{color:#b2b2b2;font-size:14px}.weui-icon-delete.weui-icon_gallery-delete{color:#fff;font-size:22px}.weui-icon_msg{font-size:64px}.weui-icon_msg.weui-icon-warn{color:#fa5151}.weui-icon_msg-primary{font-size:64px}.weui-icon_msg-primary.weui-icon-warn{color:rgba(0,0,0,.3)}.weui-btn{position:relative;display:block;width:184px;margin-left:auto;margin-right:auto;padding:8px 24px;box-sizing:border-box;font-weight:700;font-size:17px;text-align:center;text-decoration:none;color:#fff;line-height:1.41176471;border-radius:4px;-webkit-tap-highlight-color:rgba(0,0,0,0);overflow:hidden}.weui-btn_block{width:auto}.weui-btn_inline{display:inline-block}.weui-btn_default{color:#06ae56;background-color:#f2f2f2}.weui-btn_default:not(.weui-btn_disabled):visited{color:#06ae56}.weui-btn_default:not(.weui-btn_disabled):active{color:#06ae56;background-color:#d9d9d9}.weui-btn_primary{background-color:#07c160}.weui-btn_primary:not(.weui-btn_disabled):visited{color:#fff}.weui-btn_primary:not(.weui-btn_disabled):active{color:#fff;background-color:#06ad56}.weui-btn_warn{color:#fa5151;background-color:#f2f2f2}.weui-btn_warn:not(.weui-btn_disabled):visited{color:#fa5151}.weui-btn_warn:not(.weui-btn_disabled):active{color:#fa5151;background-color:#d9d9d9}.weui-btn_disabled{color:rgba(0,0,0,.18);background-color:#fafafa}.weui-btn_loading .weui-loading{margin:-.2em .34em 0 0}.weui-btn_loading.weui-btn_primary{color:#fff}.weui-btn_loading.weui-btn_default{background-color:#d9d9d9}.weui-btn_loading.weui-btn_primary{background-color:#06ad56}.weui-btn_loading.weui-btn_warn{background-color:#d9d9d9}.weui-btn_plain-primary{color:#07c160;border:1px solid #1aad19}.weui-btn_plain-primary:not(.weui-btn_plain-disabled):active{color:#06ae56;border-color:#179c16;background-color:rgba(0,0,0,.1)}.weui-btn_plain-primary:after{border-width:0}.weui-btn_plain-default{color:#353535;border:1px solid #353535}.weui-btn_plain-default:not(.weui-btn_plain-disabled):active{color:#323232;border-color:#323232;background-color:rgba(0,0,0,.1)}.weui-btn_plain-default:after{border-width:0}.weui-btn_plain-disabled{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}.weui-btn_cell{position:relative;display:block;margin-left:auto;margin-right:auto;box-sizing:border-box;font-weight:700;font-size:17px;text-align:center;text-decoration:none;color:#fff;line-height:1.41176471;padding:16px;-webkit-tap-highlight-color:rgba(0,0,0,0);overflow:hidden;background-color:#fff}.weui-btn_cell+.weui-btn_cell{margin-top:16px}.weui-btn_cell:active{background-color:#ececec}.weui-btn_cell__icon{display:inline-block;vertical-align:middle;width:24px;height:24px;margin:-.2em .34em 0 0}.weui-btn_cell-default{color:rgba(0,0,0,.9)}.weui-btn_cell-primary{color:#576b95}.weui-btn_cell-warn{color:#fa5151}button.weui-btn,input.weui-btn{border-width:0;outline:0;-webkit-appearance:none}button.weui-btn:focus,input.weui-btn:focus{outline:0}button.weui-btn_inline,button.weui-btn_mini,input.weui-btn_inline,input.weui-btn_mini{width:auto}button.weui-btn_plain-default,button.weui-btn_plain-primary,input.weui-btn_plain-default,input.weui-btn_plain-primary{border-width:1px;background-color:transparent}.weui-btn_mini{display:inline-block;width:auto;padding:0 .75em;line-height:2;font-size:16px}.weui-btn+.weui-btn{margin-top:16px}.weui-btn.weui-btn_inline+.weui-btn.weui-btn_inline{margin-top:auto;margin-left:16px}.weui-btn-area{margin:48px 16px 8px}.weui-btn-area_inline{display:-webkit-box;display:-webkit-flex;display:flex}.weui-btn-area_inline .weui-btn{margin-top:auto;margin-right:16px;width:100%;-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-btn-area_inline .weui-btn:last-child{margin-right:0}.weui-cells{margin-top:8px;background-color:#fff;line-height:1.41176471;font-size:17px;overflow:hidden;position:relative}.weui-cells:before{top:0;border-top:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-cells:after,.weui-cells:before{content:" ";position:absolute;left:0;right:0;height:1px;color:rgba(0,0,0,.1);z-index:2}.weui-cells:after{bottom:0;border-bottom:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-cells__title{margin-top:16px;margin-bottom:3px;padding-left:16px;padding-right:16px;color:rgba(0,0,0,.5);font-size:14px;line-height:1.4}.weui-cells__title+.weui-cells{margin-top:0}.weui-cells__tips{margin-top:.3em;color:rgba(0,0,0,.5);padding-left:16px;padding-right:16px;font-size:14px}.weui-cell{padding:16px;position:relative;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-cell:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:16px;z-index:2}.weui-cell:first-child:before{display:none}.weui-cell_primary{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start}.weui-cell__bd{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-cell__ft{text-align:right;color:rgba(0,0,0,.5)}.weui-cell_swiped{display:block;padding:0}.weui-cell_swiped>.weui-cell__bd{position:relative;z-index:1;background-color:#fff}.weui-cell_swiped>.weui-cell__ft{position:absolute;right:0;top:0;bottom:0;display:-webkit-box;display:-webkit-flex;display:flex;color:#fff}.weui-swiped-btn{display:block;padding:16px 1em;line-height:1.41176471;color:inherit}.weui-swiped-btn_default{background-color:#ededed}.weui-swiped-btn_warn{background-color:#fa5151}.weui-cell_access{-webkit-tap-highlight-color:rgba(0,0,0,0);color:inherit}.weui-cell_access:active{background-color:#ececec}.weui-cell_access .weui-cell__ft{padding-right:16px;position:relative}.weui-cell_access .weui-cell__ft:after{content:" ";display:inline-block;height:8px;width:8px;border-width:2px 2px 0 0;border-color:#b2b2b2;border-style:solid;-webkit-transform:matrix(.71,.71,-.71,.71,0,0);transform:matrix(.71,.71,-.71,.71,0,0);position:relative;top:-2px;position:absolute;top:50%;margin-top:-5px;right:0}.weui-cell_link{color:#576b95;font-size:17px}.weui-cell_link:first-child:before{display:block}.weui-check__label{-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-check__label:active{background-color:#ececec}.weui-check{position:absolute;left:-9999em}.weui-cells_radio .weui-cell__ft{padding-left:16px}.weui-cells_radio .weui-check+.weui-icon-checked{min-width:16px}.weui-cells_radio .weui-check+.weui-icon-checked:before{margin:0}.weui-cells_radio .weui-check:checked+.weui-icon-checked:before{display:block;content:"\EA08";color:#07c160;font-size:16px}.weui-cells_checkbox .weui-check__label:before{left:55px}.weui-cells_checkbox .weui-cell__hd{padding-right:16px}.weui-cells_checkbox .weui-icon-checked:before{content:"\EA01";color:rgba(0,0,0,.3);font-size:23px;display:block;margin:0}.weui-cells_checkbox .weui-check:checked+.weui-icon-checked:before{content:"\EA06";color:#07c160}.weui-label{display:block;width:105px;word-wrap:break-word;word-break:break-all}.weui-input{width:100%;border:0;outline:0;-webkit-appearance:none;background-color:transparent;font-size:inherit;color:inherit;height:1.41176471em;line-height:1.41176471}.weui-input::-webkit-inner-spin-button,.weui-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.weui-textarea{display:block;border:0;resize:none;width:100%;color:inherit;font-size:1em;line-height:inherit;outline:0}.weui-textarea-counter{color:rgba(0,0,0,.3);text-align:right}.weui-cell_warn .weui-textarea-counter{color:#fa5151}.weui-toptips{display:none;position:fixed;-webkit-transform:translateZ(0);transform:translateZ(0);top:0;left:0;right:0;padding:5px;font-size:14px;text-align:center;color:#fff;z-index:5000;word-wrap:break-word;word-break:break-all}.weui-toptips_warn{background-color:#fa5151}.weui-cells_form .weui-cell__ft{font-size:0}.weui-cells_form .weui-icon-warn{display:none}.weui-cells_form input,.weui-cells_form label[for],.weui-cells_form textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-cell_warn{color:#fa5151}.weui-cell_warn .weui-icon-warn{display:inline-block}.weui-form-preview{position:relative;background-color:#fff}.weui-form-preview:before{top:0;border-top:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-form-preview:after,.weui-form-preview:before{content:" ";position:absolute;left:0;right:0;height:1px;color:rgba(0,0,0,.1)}.weui-form-preview:after{bottom:0;border-bottom:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-form-preview__hd{position:relative;padding:16px;text-align:right;line-height:2.5em}.weui-form-preview__hd:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:16px}.weui-form-preview__hd .weui-form-preview__value{font-style:normal;font-size:1.6em}.weui-form-preview__bd{padding:16px;font-size:.9em;text-align:right;color:rgba(0,0,0,.5);line-height:2}.weui-form-preview__ft{position:relative;line-height:50px;display:-webkit-box;display:-webkit-flex;display:flex}.weui-form-preview__ft:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-form-preview__item{overflow:hidden}.weui-form-preview__label{float:left;margin-right:1em;min-width:4em;color:rgba(0,0,0,.5);text-align:justify;text-align-last:justify}.weui-form-preview__value{display:block;overflow:hidden;word-break:normal;word-wrap:break-word}.weui-form-preview__btn{position:relative;display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#576b95;text-align:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}button.weui-form-preview__btn{background-color:transparent;border:0;outline:0;line-height:inherit;font-size:inherit}.weui-form-preview__btn:active{background-color:#ececec}.weui-form-preview__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-form-preview__btn:first-child:after{display:none}.weui-form-preview__btn_default{color:rgba(0,0,0,.9)}.weui-form-preview__btn_primary{color:#576b95}.weui-cell_select{padding:0}.weui-cell_select .weui-select{padding-right:30px}.weui-cell_select .weui-cell__bd:after{content:" ";display:inline-block;height:8px;width:8px;border-width:2px 2px 0 0;border-color:#b2b2b2;border-style:solid;-webkit-transform:matrix(.71,.71,-.71,.71,0,0);transform:matrix(.71,.71,-.71,.71,0,0);position:relative;top:-2px;position:absolute;top:50%;right:16px;margin-top:-5px}.weui-select{-webkit-appearance:none;border:0;outline:0;background-color:transparent;width:100%;font-size:inherit;height:56px;line-height:56px;position:relative;z-index:1;padding-left:16px}.weui-cell_select-before{padding-right:16px}.weui-cell_select-before .weui-select{width:105px;box-sizing:border-box}.weui-cell_select-before .weui-cell__hd{position:relative}.weui-cell_select-before .weui-cell__hd:after{content:" ";position:absolute;right:0;top:0;width:1px;bottom:0;border-right:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-cell_select-before .weui-cell__hd:before{content:" ";display:inline-block;height:8px;width:8px;border-width:2px 2px 0 0;border-color:#b2b2b2;border-style:solid;-webkit-transform:matrix(.71,.71,-.71,.71,0,0);transform:matrix(.71,.71,-.71,.71,0,0);position:relative;top:-2px;position:absolute;top:50%;right:16px;margin-top:-5px}.weui-cell_select-before .weui-cell__bd{padding-left:16px}.weui-cell_select-before .weui-cell__bd:after{display:none}.weui-cell_select-after{padding-left:16px}.weui-cell_select-after .weui-select{padding-left:0}.weui-cell_vcode{padding-top:0;padding-right:0;padding-bottom:0}.weui-vcode-btn,.weui-vcode-img{margin-left:5px;height:56px;vertical-align:middle}.weui-vcode-btn{display:inline-block;padding:0 .6em 0 .7em;line-height:56px;font-size:17px;color:#576b95;position:relative}.weui-vcode-btn:before{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}button.weui-vcode-btn{background-color:transparent;border:0;outline:0}.weui-vcode-btn:active{color:#767676}.weui-gallery{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background-color:#000;z-index:1000}.weui-gallery__img{top:constant(safe-area-inset-top);top:env(safe-area-inset-top);bottom:calc(60px + constant(safe-area-inset-bottom));bottom:calc(60px + env(safe-area-inset-bottom));background:50% no-repeat;background-size:contain}.weui-gallery__img,.weui-gallery__opr{position:absolute;right:constant(safe-area-inset-right);right:env(safe-area-inset-right);left:constant(safe-area-inset-left);left:env(safe-area-inset-left)}.weui-gallery__opr{bottom:constant(safe-area-inset-bottom);bottom:env(safe-area-inset-bottom);background-color:#0d0d0d;color:#fff;line-height:60px;text-align:center}.weui-gallery__del{display:block}.weui-cell_switch{padding-top:12px;padding-bottom:12px}.weui-switch{-webkit-appearance:none;appearance:none}.weui-switch,.weui-switch-cp__box{position:relative;width:52px;height:32px;border:1px solid rgba(0,0,0,.1);outline:0;border-radius:16px;box-sizing:border-box;background-color:rgba(0,0,0,.1);-webkit-transition:background-color .1s,border .1s;transition:background-color .1s,border .1s}.weui-switch-cp__box:before,.weui-switch:before{content:" ";position:absolute;top:0;left:0;width:50px;height:30px;border-radius:15px;background-color:#fdfdfd;-webkit-transition:-webkit-transform .35s cubic-bezier(.45,1,.4,1);transition:-webkit-transform .35s cubic-bezier(.45,1,.4,1);transition:transform .35s cubic-bezier(.45,1,.4,1);transition:transform .35s cubic-bezier(.45,1,.4,1),-webkit-transform .35s cubic-bezier(.45,1,.4,1)}.weui-switch-cp__box:after,.weui-switch:after{content:" ";position:absolute;top:0;left:0;width:30px;height:30px;border-radius:15px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4);-webkit-transition:-webkit-transform .35s cubic-bezier(.4,.4,.25,1.35);transition:-webkit-transform .35s cubic-bezier(.4,.4,.25,1.35);transition:transform .35s cubic-bezier(.4,.4,.25,1.35);transition:transform .35s cubic-bezier(.4,.4,.25,1.35),-webkit-transform .35s cubic-bezier(.4,.4,.25,1.35)}.weui-switch-cp__input:checked~.weui-switch-cp__box,.weui-switch:checked{border-color:#07c160;background-color:#07c160}.weui-switch-cp__input:checked~.weui-switch-cp__box:before,.weui-switch:checked:before{-webkit-transform:scale(0);transform:scale(0)}.weui-switch-cp__input:checked~.weui-switch-cp__box:after,.weui-switch:checked:after{-webkit-transform:translateX(20px);transform:translateX(20px)}.weui-switch-cp__input{position:absolute;left:-9999px}.weui-switch-cp__box{display:block}.weui-uploader__hd{display:-webkit-box;display:-webkit-flex;display:flex;padding-bottom:16px;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-uploader__title{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-uploader__info{color:rgba(0,0,0,.3)}.weui-uploader__bd{margin-bottom:-8px;margin-right:-8px;overflow:hidden}.weui-uploader__files{list-style:none}.weui-uploader__file{float:left;margin-right:8px;margin-bottom:8px;width:96px;height:96px;background:no-repeat 50%;background-size:cover}.weui-uploader__file_status{position:relative}.weui-uploader__file_status:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.5)}.weui-uploader__file_status .weui-uploader__file-content{display:block}.weui-uploader__file-content{display:none;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#fff}.weui-uploader__file-content .weui-icon-warn{display:inline-block}.weui-uploader__input-box{float:left;position:relative;margin-right:8px;margin-bottom:8px;width:96px;height:96px;box-sizing:border-box;background-color:#ededed}.weui-uploader__input-box:after,.weui-uploader__input-box:before{content:" ";position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:#a3a3a3}.weui-uploader__input-box:before{width:2px;height:32px}.weui-uploader__input-box:after{width:32px;height:2px}.weui-uploader__input-box:active{border-color:#8b8b8b}.weui-uploader__input-box:active:after,.weui-uploader__input-box:active:before{background-color:#8b8b8b}.weui-uploader__input{position:absolute;z-index:1;top:0;left:0;width:100%;height:100%;opacity:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-msg{padding-top:48px;padding:calc(48px + constant(safe-area-inset-top)) constant(safe-area-inset-right) constant(safe-area-inset-bottom) constant(safe-area-inset-left);padding:calc(48px + env(safe-area-inset-top)) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);text-align:center;line-height:1.4;min-height:100%;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;background-color:#fff}.weui-msg a:not(.weui-btn){color:#576b95;display:inline-block;vertical-align:baseline}.weui-msg__icon-area{margin-bottom:32px}.weui-msg__text-area{margin-bottom:32px;padding:0 32px;-webkit-box-flex:1;-webkit-flex:1;flex:1;line-height:1.6}.weui-msg__text-area:first-child{padding-top:96px}.weui-msg__title{font-weight:700;font-size:22px}.weui-msg__desc,.weui-msg__title{margin-bottom:16px;word-wrap:break-word;word-break:break-all}.weui-msg__desc{font-size:17px;color:rgba(0,0,0,.9)}.weui-msg__desc-primary{font-size:14px;color:rgba(0,0,0,.5);word-wrap:break-word;word-break:break-all;margin-bottom:16px}.weui-msg__opr-area{margin-bottom:16px}.weui-msg__opr-area .weui-btn-area{margin:0}.weui-msg__opr-area .weui-btn+.weui-btn{margin-bottom:16px}.weui-msg__opr-area:last-child{margin-bottom:96px}.weui-msg__opr-area+.weui-msg__extra-area{margin-top:48px}.weui-msg__tips-area{margin-bottom:16px;padding:0 40px}.weui-msg__opr-area+.weui-msg__tips-area{margin-bottom:48px}.weui-msg__tips-area:last-child{margin-bottom:64px}.weui-msg__extra-area,.weui-msg__tips{font-size:12px;color:rgba(0,0,0,.5)}.weui-msg__extra-area{margin-bottom:24px}.weui-msg__extra-area a{color:#576b95}.weui-article{padding:24px 16px;padding:24px calc(16px + constant(safe-area-inset-right)) calc(24px + constant(safe-area-inset-bottom)) calc(16px + constant(safe-area-inset-left));padding:24px calc(16px + env(safe-area-inset-right)) calc(24px + env(safe-area-inset-bottom)) calc(16px + env(safe-area-inset-left));font-size:17px;color:rgba(0,0,0,.9)}.weui-article section{margin-bottom:1.5em}.weui-article h1{font-size:22px;font-weight:700;margin-bottom:.9em;line-height:1.4}.weui-article h2{font-size:17px}.weui-article h2,.weui-article h3{font-weight:700;margin-bottom:.34em;line-height:1.4}.weui-article h3{font-size:15px}.weui-article *{max-width:100%;box-sizing:border-box;word-wrap:break-word}.weui-article p{margin:0 0 .8em}.weui-tabbar{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;z-index:500;background-color:#f7f7f7}.weui-tabbar:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-tabbar__item{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;padding:8px 0;padding-bottom:calc(8px + constant(safe-area-inset-bottom));padding-bottom:calc(8px + env(safe-area-inset-bottom));font-size:0;color:rgba(0,0,0,.5);text-align:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-tabbar__item:first-child{padding-left:constant(safe-area-inset-left);padding-left:env(safe-area-inset-left)}.weui-tabbar__item:last-child{padding-right:constant(safe-area-inset-right);padding-right:env(safe-area-inset-right)}.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon,.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon>i,.weui-tabbar__item.weui-bar__item_on .weui-tabbar__label{color:#07c160}.weui-tabbar__icon{display:inline-block;width:28px;height:28px;margin-bottom:2px}.weui-tabbar__icon>i,i.weui-tabbar__icon{font-size:24px;color:rgba(0,0,0,.5)}.weui-tabbar__icon img{width:100%;height:100%}.weui-tabbar__label{color:rgba(0,0,0,.9);font-size:10px;line-height:1.4}.weui-navbar{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;z-index:500;background-color:#fff;padding-top:constant(safe-area-inset-top);padding-top:env(safe-area-inset-top)}.weui-navbar:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-navbar+.weui-tab__panel{padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom)}.weui-navbar__item{position:relative;display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;padding:16px 0;padding-top:calc(16px + constant(safe-area-inset-top));padding-top:calc(16px + env(safe-area-inset-top));text-align:center;font-size:17px;line-height:1.41176471;-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-navbar__item.weui-bar__item_on,.weui-navbar__item:active{background-color:#ececec}.weui-navbar__item:after{content:" ";position:absolute;right:0;top:0;width:1px;bottom:0;border-right:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-navbar__item:first-child{padding-left:constant(safe-area-inset-left);padding-left:env(safe-area-inset-left)}.weui-navbar__item:last-child{padding-right:constant(safe-area-inset-right);padding-right:env(safe-area-inset-right)}.weui-navbar__item:last-child:after{display:none}.weui-tab{display:-webkit-box;display:-webkit-flex;display:flex;height:100%;box-sizing:border-box;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.weui-tab__panel{box-sizing:border-box;-webkit-box-flex:1;-webkit-flex:1;flex:1;overflow:auto;-webkit-overflow-scrolling:touch}.weui-tab__content{display:none}.weui-progress{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-progress__bar{background-color:#ededed;height:3px;-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-progress__inner-bar{width:0;height:100%;background-color:#07c160}.weui-progress__opr{display:block;margin-left:15px;font-size:0}.weui-panel{background-color:#fff;margin-top:10px;position:relative;overflow:hidden}.weui-panel:first-child{margin-top:0}.weui-panel:before{top:0;border-top:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-panel:after,.weui-panel:before{content:" ";position:absolute;left:0;right:0;height:1px;color:rgba(0,0,0,.1)}.weui-panel:after{bottom:0;border-bottom:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-panel__hd{padding:16px 16px 13px;color:rgba(0,0,0,.9);font-size:15px;font-weight:700;position:relative}.weui-panel__hd:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:15px}.weui-media-box{padding:16px;position:relative}.weui-media-box:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:16px}.weui-media-box:first-child:before{display:none}a.weui-media-box{color:#000;-webkit-tap-highlight-color:rgba(0,0,0,0)}a.weui-media-box:active{background-color:#ececec}.weui-media-box__title{font-weight:400;font-size:17px;color:rgba(0,0,0,.9);width:auto;white-space:nowrap;word-wrap:normal;word-wrap:break-word;word-break:break-all}.weui-media-box__desc,.weui-media-box__title{line-height:1.4;overflow:hidden;text-overflow:ellipsis}.weui-media-box__desc{color:rgba(0,0,0,.3);font-size:14px;padding-top:4px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.weui-media-box__info{margin-top:16px;padding-bottom:4px;font-size:13px;color:#cecece;line-height:1em;list-style:none;overflow:hidden}.weui-media-box__info__meta{float:left;padding-right:1em}.weui-media-box__info__meta_extra{padding-left:1em;border-left:1px solid #cecece}.weui-media-box_appmsg{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-media-box_appmsg .weui-media-box__hd{margin-right:16px;width:60px;height:60px;line-height:60px;text-align:center}.weui-media-box_appmsg .weui-media-box__thumb{width:100%;max-height:100%;vertical-align:top}.weui-media-box_appmsg .weui-media-box__bd{-webkit-box-flex:1;-webkit-flex:1;flex:1;min-width:0}.weui-media-box_small-appmsg{padding:0}.weui-media-box_small-appmsg .weui-cells{margin-top:0}.weui-media-box_small-appmsg .weui-cells:before{display:none}.weui-grids{position:relative;overflow:hidden}.weui-grids:before{right:0;height:1px;border-top:1px solid #d9d9d9;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-grids:after,.weui-grids:before{content:" ";position:absolute;left:0;top:0;color:#d9d9d9}.weui-grids:after{width:1px;bottom:0;border-left:1px solid #d9d9d9;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-grid{position:relative;float:left;padding:20px 10px;width:33.33333333%;box-sizing:border-box}.weui-grid:before{top:0;width:1px;border-right:1px solid #d9d9d9;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-grid:after,.weui-grid:before{content:" ";position:absolute;right:0;bottom:0;color:#d9d9d9}.weui-grid:after{left:0;height:1px;border-bottom:1px solid #d9d9d9;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-grid:active{background-color:#ececec}.weui-grid__icon{width:28px;height:28px;margin:0 auto}.weui-grid__icon img{display:block;width:100%;height:100%}.weui-grid__icon+.weui-grid__label{margin-top:4px}.weui-grid__label{display:block;color:rgba(0,0,0,.9);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.weui-footer,.weui-grid__label{text-align:center;font-size:14px}.weui-footer{color:rgba(0,0,0,.3);line-height:1.4}.weui-footer a{color:#576b95}.weui-footer_fixed-bottom{position:fixed;bottom:16px;left:0;right:0}.weui-footer__links{font-size:0}.weui-footer__link{display:inline-block;vertical-align:top;margin:0 8px;position:relative;font-size:14px}.weui-footer__link:before{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid #c7c7c7;color:#c7c7c7;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5);left:-8px;top:.36em;bottom:.36em}.weui-footer__link:first-child:before{display:none}.weui-footer__text{padding:0 16px;font-size:12px}.weui-flex{display:-webkit-box;display:-webkit-flex;display:flex}.weui-flex__item{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-dialog{position:fixed;z-index:5000;top:50%;left:16px;right:16px;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#fff;text-align:center;border-radius:3px;overflow:hidden}.weui-dialog__hd{padding:32px 24px 16px}.weui-dialog__title{font-weight:700;font-size:17px;line-height:1.4}.weui-dialog__bd{padding:0 24px 32px;min-height:40px;font-size:17px;line-height:1.4;word-wrap:break-word;word-break:break-all;color:rgba(0,0,0,.5)}.weui-dialog__bd:first-child{padding:32px 24px;color:rgba(0,0,0,.9)}.weui-dialog__ft{position:relative;line-height:64px;font-size:17px;display:-webkit-box;display:-webkit-flex;display:flex}.weui-dialog__ft:after{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-dialog__btn{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#576b95;font-weight:700;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0);position:relative}.weui-dialog__btn:active{background-color:#ececec}.weui-dialog__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-dialog__btn:first-child:after{display:none}.weui-dialog__btn_default{color:rgba(0,0,0,.9)}.weui-skin_android .weui-dialog{text-align:left;box-shadow:0 6px 30px 0 rgba(0,0,0,.1)}.weui-skin_android .weui-dialog__title{font-size:22px;line-height:1.4}.weui-skin_android .weui-dialog__hd{text-align:left}.weui-skin_android .weui-dialog__bd{color:rgba(0,0,0,.5);font-size:17px;text-align:left}.weui-skin_android .weui-dialog__bd:first-child{color:rgba(0,0,0,.9)}.weui-skin_android .weui-dialog__ft{display:block;text-align:right;line-height:40px;padding:0 24px 16px}.weui-skin_android .weui-dialog__ft:after{display:none}.weui-skin_android .weui-dialog__btn{display:inline-block;vertical-align:top;padding:0 .8em}.weui-skin_android .weui-dialog__btn:after{display:none}.weui-skin_android .weui-dialog__btn:last-child{margin-right:-.8em}.weui-skin_android .weui-dialog__btn_default{color:rgba(0,0,0,.9)}@media screen and (min-width:1024px){.weui-dialog{width:35%}}.weui-half-screen-dialog{position:fixed;left:0;right:0;bottom:0;max-height:75%;z-index:5000;line-height:1.4;background-color:#fff;border-top-left-radius:12px;border-top-right-radius:12px;overflow:hidden;padding:0 calc(24px + constant(safe-area-inset-right)) constant(safe-area-inset-bottom) calc(24px + constant(safe-area-inset-left));padding:0 calc(24px + env(safe-area-inset-right)) env(safe-area-inset-bottom) calc(24px + env(safe-area-inset-left))}.weui-half-screen-dialog__hd{font-size:8px;height:8em;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-half-screen-dialog__hd .weui-icon-btn{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.weui-half-screen-dialog__hd__side{position:relative}.weui-half-screen-dialog__hd__main{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-half-screen-dialog__hd__side+.weui-half-screen-dialog__hd__main{text-align:center;padding:0 40px}.weui-half-screen-dialog__hd__main+.weui-half-screen-dialog__hd__side .weui-icon-btn{right:0}.weui-half-screen-dialog__title{display:block;color:rgba(0,0,0,.9);font-weight:700;font-size:15px}.weui-half-screen-dialog__subtitle{display:block;color:rgba(0,0,0,.5);font-size:10px}.weui-half-screen-dialog__bd{word-wrap:break-word;-webkit-hyphens:auto;hyphens:auto;overflow-y:auto}.weui-half-screen-dialog__desc{padding-top:4px;font-size:17px;color:rgba(0,0,0,.9);line-height:1.4}.weui-half-screen-dialog__tips{padding-top:16px;font-size:14px;color:rgba(0,0,0,.3);line-height:1.4}.weui-half-screen-dialog__ft{padding:40px 24px 32px;text-align:center}.weui-half-screen-dialog__ft .weui-btn{display:inline-block;vertical-align:top;margin:0 8px;width:120px}.weui-icon-btn{background-color:transparent;background-repeat:no-repeat;background-position:50% 50%;background-size:100%;border:0;outline:0;font-size:0}.weui-icon-btn_goback{width:12px;height:24px;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='24' viewBox='0 0 12 24'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='%23FFF' d='M-16-8c0-6.627 5.367-12 12-12h390c6.628 0 12 5.374 12 12v52H-16V-8z'/%3E%3Cpath fill='%23000' fill-opacity='.9' d='M10 19.438L8.955 20.5l-7.666-7.79a1.02 1.02 0 0 1 0-1.42L8.955 3.5 10 4.563 2.682 12 10 19.438z'/%3E%3C/g%3E%3C/svg%3E")}.weui-icon-btn_close{width:24px;height:24px;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='24' height='24' viewBox='0 0 24 24'%3E%3Cdefs%3E%3Cpath id='a' d='M8 6.943L1.807.75.75 1.807 6.943 8 .75 14.193l1.057 1.057L8 9.057l6.193 6.193 1.057-1.057L9.057 8l6.193-6.193L14.193.75z'/%3E%3C/defs%3E%3Cg fill='none' fill-rule='evenodd' transform='translate(-16 -20)'%3E%3Cpath fill='%23FFF' d='M0 12C0 5.373 5.367 0 12 0h390c6.628 0 12 5.374 12 12v52H0V12z'/%3E%3Cuse fill='%23000' fill-opacity='.9' transform='translate(20 24)' xlink:href='%23a'/%3E%3C/g%3E%3C/svg%3E")}.weui-icon-btn_more{width:24px;height:24px;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='%23FFF' d='M-374-8c0-6.627 5.367-12 12-12H28c6.628 0 12 5.374 12 12v52h-414V-8z'/%3E%3Cpath fill='%23000' fill-opacity='.9' d='M6.75 12a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0zM12 10.25a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5z'/%3E%3C/g%3E%3C/svg%3E")}.weui-toast{position:fixed;z-index:5000;width:7.6em;min-height:7.6em;top:180px;left:50%;margin-left:-3.8em;background:hsla(0,0%,7%,.7);text-align:center;border-radius:5px;color:#fff}.weui-icon_toast{margin:24px 0 0;display:block}.weui-icon_toast.weui-icon-success-no-circle:before{color:#fff;font-size:55px}.weui-icon_toast.weui-loading{margin:32px 0 0;width:38px;height:38px;vertical-align:baseline}.weui-toast__content{margin:0 0 16px;font-size:14px}.weui-mask{background:rgba(0,0,0,.6)}.weui-mask,.weui-mask_transparent{position:fixed;z-index:1000;top:0;right:0;left:0;bottom:0}.weui-actionsheet{position:fixed;left:0;bottom:0;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:5000;width:100%;background-color:#ededed;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.weui-actionsheet__title{position:relative;height:56px;padding:0 24px;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;text-align:center;font-size:14px;color:rgba(0,0,0,.5);line-height:1.4;background:#fff}.weui-actionsheet__title:before{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-actionsheet__title .weui-actionsheet__title-text{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.weui-actionsheet__menu{background-color:#fff}.weui-actionsheet__action{margin-top:6px;background-color:#fff;padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom)}.weui-actionsheet__cell{position:relative;padding:16px;text-align:center;font-size:17px;line-height:1.41176471}.weui-actionsheet__cell:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-actionsheet__cell:active{background-color:#ececec}.weui-actionsheet__cell:first-child:before{display:none}.weui-skin_android .weui-actionsheet{position:fixed;left:50%;top:50%;bottom:auto;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:274px;box-sizing:border-box;-webkit-backface-visibility:hidden;backface-visibility:hidden;background:transparent;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.weui-skin_android .weui-actionsheet__action{display:none}.weui-skin_android .weui-actionsheet__menu{border-radius:2px;box-shadow:0 6px 30px 0 rgba(0,0,0,.1)}.weui-skin_android .weui-actionsheet__cell{padding:16px;font-size:17px;line-height:1.41176471;color:rgba(0,0,0,.9);text-align:left}.weui-skin_android .weui-actionsheet__cell:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.weui-skin_android .weui-actionsheet__cell:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.weui-actionsheet_toggle{-webkit-transform:translate(0);transform:translate(0)}.weui-loadmore{width:65%;margin:1.5em auto;line-height:1.6em;font-size:14px;text-align:center}.weui-loadmore__tips{display:inline-block;vertical-align:middle;color:rgba(0,0,0,.9)}.weui-loadmore_line{border-top:1px solid rgba(0,0,0,.1);margin-top:2.4em}.weui-loadmore_line .weui-loadmore__tips{position:relative;top:-.9em;padding:0 .55em;background-color:#fff;color:rgba(0,0,0,.5)}.weui-loadmore_dot .weui-loadmore__tips{padding:0 .16em}.weui-loadmore_dot .weui-loadmore__tips:before{content:" ";width:4px;height:4px;border-radius:50%;background-color:rgba(0,0,0,.1);display:inline-block;position:relative;vertical-align:0;top:-.16em}.weui-badge{display:inline-block;padding:.15em .4em;min-width:8px;border-radius:18px;background-color:#fa5151;color:#fff;line-height:1.2;text-align:center;font-size:12px;vertical-align:middle}.weui-badge_dot{padding:.4em;min-width:0}.weui-search-bar{position:relative;padding:8px;display:-webkit-box;display:-webkit-flex;display:flex;box-sizing:border-box;background-color:#ededed;-webkit-text-size-adjust:100%;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-search-bar.weui-search-bar_focusing .weui-search-bar__cancel-btn{display:block}.weui-search-bar.weui-search-bar_focusing .weui-search-bar__label{display:none}.weui-search-bar__form{position:relative;-webkit-box-flex:1;-webkit-flex:auto;flex:auto;background-color:#fff;border-radius:4px}.weui-search-bar__box{position:relative;padding-left:32px;padding-right:32px;height:100%;width:100%;box-sizing:border-box;z-index:1}.weui-search-bar__box .weui-search-bar__input{padding:8px 0;width:100%;height:1.14285714em;border:0;font-size:14px;line-height:1.14285714em;box-sizing:content-box;background:transparent;caret-color:#07c160}.weui-search-bar__box .weui-search-bar__input:focus{outline:none}.weui-search-bar__box .weui-icon-search{position:absolute;top:50%;left:8px;margin-top:-14px;line-height:28px}.weui-search-bar__box .weui-icon-clear{position:absolute;top:50%;right:0;margin-top:-14px;padding:0 8px;line-height:28px}.weui-search-bar__label{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;font-size:0;border-radius:4px;line-height:32px;text-align:center;color:rgba(0,0,0,.5);background:#fff}.weui-search-bar__label span{display:inline-block;font-size:14px;vertical-align:middle}.weui-search-bar__label .weui-icon-search{margin-right:4px}.weui-search-bar__cancel-btn{display:none;margin-left:8px;line-height:28px;color:#576b95;white-space:nowrap}.weui-search-bar__input:not(:valid)~.weui-icon-clear{display:none}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-results-button,input[type=search]::-webkit-search-results-decoration{display:none}.weui-picker{position:fixed;width:100%;box-sizing:border-box;left:0;bottom:0;z-index:5000;background-color:#fff;padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.weui-picker__hd{display:-webkit-box;display:-webkit-flex;display:flex;padding:16px;padding:16px calc(16px + constant(safe-area-inset-right)) 16px calc(16px + constant(safe-area-inset-left));padding:16px calc(16px + env(safe-area-inset-right)) 16px calc(16px + env(safe-area-inset-left));position:relative;text-align:center;font-size:17px;line-height:1.4}.weui-picker__hd:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid rgba(0,0,0,.1);color:rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-picker__bd{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;background-color:#fff;height:240px;overflow:hidden}.weui-picker__group{-webkit-box-flex:1;-webkit-flex:1;flex:1;position:relative;height:100%}.weui-picker__group:first-child .weui-picker__item{padding-left:constant(safe-area-inset-left);padding-left:env(safe-area-inset-left)}.weui-picker__group:last-child .weui-picker__item{padding-right:constant(safe-area-inset-right);padding-right:env(safe-area-inset-right)}.weui-picker__mask{top:0;height:100%;margin:0 auto;background:-webkit-linear-gradient(top,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),-webkit-linear-gradient(bottom,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background:linear-gradient(180deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),linear-gradient(0deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background-position:top,bottom;background-size:100% 92px;background-repeat:no-repeat;-webkit-transform:translateZ(0);transform:translateZ(0)}.weui-picker__indicator,.weui-picker__mask{position:absolute;left:0;width:100%;z-index:3}.weui-picker__indicator{height:56px;top:92px}.weui-picker__indicator:before{top:0;border-top:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-picker__indicator:after,.weui-picker__indicator:before{content:" ";position:absolute;left:0;right:0;height:1px;color:rgba(0,0,0,.1)}.weui-picker__indicator:after{bottom:0;border-bottom:1px solid rgba(0,0,0,.1);-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-picker__content{position:absolute;top:0;left:0;width:100%}.weui-picker__item{height:48px;line-height:48px;text-align:center;color:rgba(0,0,0,.9);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.weui-picker__item_disabled{color:rgba(0,0,0,.5)}@-webkit-keyframes a{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes a{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.weui-animate-slide-up{-webkit-animation:a ease .3s forwards;animation:a ease .3s forwards}@-webkit-keyframes b{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes b{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.weui-animate-slide-down{-webkit-animation:b ease .3s forwards;animation:b ease .3s forwards}@-webkit-keyframes c{0%{opacity:0}to{opacity:1}}@keyframes c{0%{opacity:0}to{opacity:1}}.weui-animate-fade-in{-webkit-animation:c ease .3s forwards;animation:c ease .3s forwards}@-webkit-keyframes d{0%{opacity:1}to{opacity:0}}@keyframes d{0%{opacity:1}to{opacity:0}}.weui-animate-fade-out{-webkit-animation:d ease .3s forwards;animation:d ease .3s forwards}.weui-agree{display:block;padding:.5em 15px;font-size:13px}.weui-agree a{color:#576b95}.weui-agree__text{color:rgba(0,0,0,.5)}.weui-agree__checkbox{-webkit-appearance:none;appearance:none;outline:0;font-size:0;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:3px;width:13px;height:13px;position:relative;vertical-align:0;top:2px}.weui-agree__checkbox:checked:before{font-family:weui;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-align:center;speak:none;display:inline-block;vertical-align:middle;text-decoration:inherit;content:"\EA08";color:#09bb07;font-size:13px;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-48%) scale(.73);transform:translate(-50%,-48%) scale(.73)}.weui-agree__checkbox:disabled{background-color:#e1e1e1}.weui-agree__checkbox:disabled:before{color:#adadad}.weui-loading{width:20px;height:20px;display:inline-block;vertical-align:middle;-webkit-animation:e 1s steps(12) infinite;animation:e 1s steps(12) infinite;background:transparent url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E9E9E9' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23989697' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%239B999A' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23A3A1A2' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23ABA9AA' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23B2B2B2' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23BAB8B9' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23C2C0C1' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23CBCBCB' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23D2D2D2' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23DADADA' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E2E2E2' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E") no-repeat;background-size:100%}.weui-btn_loading.weui-btn_primary .weui-loading,.weui-loading.weui-loading_transparent{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect xmlns='http://www.w3.org/2000/svg' width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.56)' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.5)' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.43)' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.38)' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.32)' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.28)' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.25)' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.2)' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.17)' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.14)' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.1)' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.03)' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E")}@-webkit-keyframes e{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes e{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.weui-slider{padding:15px 18px;-webkit-user-select:none;user-select:none}.weui-slider__inner{position:relative;height:2px;background-color:rgba(0,0,0,.1)}.weui-slider__track{height:2px;background-color:#07c160;width:0}.weui-slider__handler{position:absolute;left:0;top:50%;width:28px;height:28px;margin-left:-14px;margin-top:-14px;border-radius:50%;background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.2)}.weui-slider-box{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-slider-box .weui-slider{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-slider-box__value{margin-left:.5em;min-width:24px;color:rgba(0,0,0,.5);text-align:center;font-size:14px}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
const baseUrl = 'https://szcf.superbest.wang/API' //稳定版本环境
let UrlReg = /^http:\/\/.*/i
let UrlReg2 = /^https:\/\/.*/i
function uploadFile(params) {
var _this = this,
url = params.url,
filePath = params.filePath,
name = params.name ? params.name : 'file',
data = params.data;
console.log('uploadFile', params)
//fileType String 见平台差异说明 文件类型,image/video/audio
uni.uploadFile({
url: url, //仅为示例,非真实的接口地址
filePath: filePath,
name: name,
formData: data,
success: (uploadFileRes) => {
if (params.success) {
console.log("uploadFile成功", uploadFileRes)
params.success(uploadFileRes)
}
}
});
}
function downloadFile(params) {
uni.downloadFile({
url: 'https://www.example.com/file/test', //仅为示例,并非真实的资源
success: (res) => {
if (res.statusCode === 200) {
console.log('下载成功');
}
}
});
}
/**
* 方法说明
* @url 请求地址
* @method 请求方式
* @dataType 请求类型
* @data 参数
* @header {参数类型} 额外头部信息
* @return {返回值类型} 返回值说明
*
*/
function request(params, data) {
return new Promise((resolve, reject) => {
uni.request({
url: (UrlReg.test(params.url) || UrlReg2.test(params.url)) ? params.url : baseUrl + params.url,
method: params.method,
dataType: params.dataType,
data,
header: Object.assign({
"Content-Type": "application/json;charset=utf-8",
}, params.header),
success: function(res) {
resolve(res)
},
fail: function(fail) {
reject(fail)
}
});
})
}
/**
* 方法说明
* @url 请求地址
* @parms 参数
* @header {参数类型} 额外头部信息
* @return {返回值类型} 返回值说明
*
*/
function postRequest(params, data = {}) {
return new Promise((resolve, reject) => {
uni.showLoading({
title: params.Ltitle ? params.Ltitle : "加载中..."
});
try {
//登录错误提示
let duration;
if(params.url == '/user/login/pwd'){
duration = 20000
}else{
duration = 3000
}
//token
let token = uni.getStorageSync("token")
//用户id
let userId = uni.getStorageSync("userId")
data.userId = data.userId || userId;
params.header = {
"token": token || ""
};
params.method = "POST";
params.dataType = "JSON"
if (!params.url) {
uni.showToast({
icon: "none",
title: "url不能为空",
duration
})
uni.hideLoading();
reject("url不能为空")
}
request(params, data).then(reslt => {
try {
reslt.data = JSON.parse(reslt.data)
} catch (e) {
reslt.data = reslt.data
//TODO handle the exception
}
if (reslt.data.code != 200) {
//token失效或者错误 ----401
//账号已在其他地方登录! -----1006
if (reslt.data.code == 401 || reslt.data.code == 1006) {
uni.showToast({
icon: "none",
title: reslt.data.message,
duration
})
uni.hideLoading();
//401跳转登录
uni.redirectTo({
// url: "/pages/notecheck/notecheck?phone=13428967050",
// url: "/pages/notecheck/notecheck",
url: "/pages/login/login"
})
reject(reslt.data.message)
}
uni.showToast({
icon: "none",
title: reslt.data.message,
duration
})
uni.hideLoading();
reject(reslt.data.message)
}
console.log(reslt);
uni.hideLoading();
resolve(reslt.data)
}).catch(e => {
reject(e.message)
})
} catch (e) {
console.log(e);
uni.hideLoading();
reject(e.message)
//TODO handle the exception
}
})
}
/**
* 方法说明
* @url 请求地址
* @parms 参数
* @header {参数类型} 额外头部信息
* @return {返回值类型} 返回值说明
*
*/
function getRequest(params, data) {
return new Promise((resolve, reject) => {
uni.showLoading({
title: params.Ltitle ? params.Ltitle : "加载中..."
});
try {
//token
let token = uni.getStorageSync("token")
//用户id
let userId = uni.getStorageSync("userId")
data.userId = data.userId || userId;
params.header = {
"token": token || ""
};
params.method = "GET";
params.dataType = "JSON"
if (!params.url) {
uni.showToast({
icon: "none",
title: "url不能为空",
duration:3000
})
uni.hideLoading();
reject("url不能为空")
}
request(params, data).then(reslt => {
try {
reslt.data = JSON.parse(reslt.data)
} catch (e) {
reslt.data = reslt.data
//TODO handle the exception
}
if (reslt.data.code != 200) {
//token失效或者错误
if (reslt.data.code == 401) {
uni.showToast({
icon: "none",
title: reslt.data.message,
duration:3000
})
uni.hideLoading();
//401跳转登录
uni.redirectTo({
// url: "/pages/notecheck/notecheck?phone=13428967050",
// url: "/pages/notecheck/notecheck",
url: "/pages/login/login"
})
reject(reslt.data.message)
}
uni.showToast({
icon: "none",
title: reslt.data.message,
duration:3000
})
uni.hideLoading();
reject(reslt.data.message)
}
console.log(reslt);
uni.hideLoading();
resolve(reslt.data)
}).catch(e => {
reject(e.message)
})
} catch (e) {
console.log(e);
uni.hideLoading();
reject(e.message)
//TODO handle the exception
}
})
}
/**
* 方法说明
* @url 请求地址
* @parms 参数
* @header {参数类型} 额外头部信息
* @return {返回值类型} 返回值说明
*
*/
async function Login(params, data) {
try {
await uni.showLoading({
title: params.Ltitle ? params.Ltitle : "加载中..."
});
params.method = "POST";
params.dataType = "JSON"
if (!params.url) {
await uni.showToast({
icon: "none",
title: "url不能为空",
duration:3000
})
await uni.hideLoading();
throw Error("url不能为空")
}
//获取验证码
let [err, reslt] = await request(params, data);
try {
reslt.data = JSON.parse(reslt.data)
} catch (e) {
reslt.data = reslt.data
//TODO handle the exception
}
if (err) {
await uni.showToast({
icon: "none",
title: JSON.stringify(err),
duration:3000
})
await uni.hideLoading();
throw Error(JSON.stringify(err))
}
if (reslt.data.code != 200) {
await uni.showToast({
icon: "none",
title: reslt.data.message,
duration:3000
})
await uni.hideLoading();
throw Error(reslt.data.message)
}
//获取token 用户信息
let [LoginErr, LoginInfo] = await request({
method: "POST",
url: '/user/login/to_login'
}, {
phone: reslt.data.data.phone,
verifyCode: reslt.data.data.verifyCode
});
try {
reslt.data = JSON.parse(reslt.data)
} catch (e) {
reslt.data = reslt.data
//TODO handle the exception
}
if (LoginErr) {
await uni.showToast({
icon: "none",
title: JSON.stringify(LoginErr),
duration:3000
})
await uni.hideLoading();
throw Error(JSON.stringify(LoginErr))
}
if (LoginInfo.data.code != 200) {
await uni.showToast({
icon: "none",
title: LoginInfo.data.message,
duration:3000
})
await uni.hideLoading();
throw Error(LoginInfo.data.message)
}
//缓存用户信息
uni.setStorageSync("token", LoginInfo.data.data.token)
uni.setStorageSync("userId", LoginInfo.data.data.userId)
await uni.hideLoading();
return true
} catch (e) {
console.log(e);
await uni.hideLoading();
throw Error(e)
//TODO handle the exception
}
}
module.exports = {
post: postRequest,
get: getRequest,
upload: uploadFile,
download: downloadFile,
Login,
//接口地址
baseUrl
}
let idCardNoUtil = {
/*省,直辖市代码表*/
provinceAndCitys: {
11: "北京",
12: "天津",
13: "河北",
14: "山西",
15: "内蒙古",
21: "辽宁",
22: "吉林",
23: "黑龙江",
31: "上海",
32: "江苏",
33: "浙江",
34: "安徽",
35: "福建",
36: "江西",
37: "山东",
41: "河南",
42: "湖北",
43: "湖南",
44: "广东",
45: "广西",
46: "海南",
50: "重庆",
51: "四川",
52: "贵州",
53: "云南",
54: "西藏",
61: "陕西",
62: "甘肃",
63: "青海",
64: "宁夏",
65: "新疆",
71: "台湾",
81: "香港",
82: "澳门",
91: "国外"
},
/*每位加权因子*/
powers: ["7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"],
/*第18位校检码*/
parityBit: ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"],
/*性别*/
genders: {
male: "",
female: ""
},
/*校验地址码*/
checkAddressCode: function(addressCode) {
let check = /^[1-9]\d{5}$/.test(addressCode);
if (!check) return false;
if (idCardNoUtil.provinceAndCitys[parseInt(addressCode.substring(0, 2))]) {
return true;
} else {
return false;
}
},
/*校验日期码*/
checkBirthDayCode: function(birDayCode) {
let check = /^[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))$/.test(birDayCode);
if (!check) return false;
let yyyy = parseInt(birDayCode.substring(0, 4), 10);
let mm = parseInt(birDayCode.substring(4, 6), 10);
let dd = parseInt(birDayCode.substring(6), 10);
let xdata = new Date(yyyy, mm - 1, dd);
if (xdata > new Date()) {
return false; //生日不能大于当前日期
} else if ((xdata.getFullYear() == yyyy) && (xdata.getMonth() == mm - 1) && (xdata.getDate() == dd)) {
return true;
} else {
return false;
}
},
/*计算校检码*/
getParityBit: function(idCardNo) {
let id17 = idCardNo.substring(0, 17);
/*加权 */
let power = 0;
for (let i = 0; i < 17; i++) {
power += parseInt(id17.charAt(i), 10) * parseInt(idCardNoUtil.powers[i]);
}
/*取模*/
let mod = power % 11;
return idCardNoUtil.parityBit[mod];
},
/*验证校检码*/
checkParityBit: function(idCardNo) {
let parityBit = idCardNo.charAt(17).toUpperCase();
if (idCardNoUtil.getParityBit(idCardNo) == parityBit) {
return true;
} else {
return false;
}
},
/*校验15位或18位的身份证号码*/
checkIdCardNo: function(idCardNo) {
//15位和18位身份证号码的基本校验
let check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo);
if (!check) return false;
//判断长度为15位或18位
if (idCardNo.length == 15) {
return idCardNoUtil.check15IdCardNo(idCardNo);
} else if (idCardNo.length == 18) {
return idCardNoUtil.check18IdCardNo(idCardNo);
} else {
return false;
}
},
//校验15位的身份证号码
check15IdCardNo: function(idCardNo) {
//15位身份证号码的基本校验
let check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(idCardNo);
if (!check) return false;
//校验地址码
let addressCode = idCardNo.substring(0, 6);
check = idCardNoUtil.checkAddressCode(addressCode);
if (!check) return false;
let birDayCode = '19' + idCardNo.substring(6, 12);
//校验日期码
return idCardNoUtil.checkBirthDayCode(birDayCode);
},
//校验18位的身份证号码
check18IdCardNo: function(idCardNo) {
//18位身份证号码的基本格式校验
let check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/.test(idCardNo);
if (!check) return false;
//校验地址码
let addressCode = idCardNo.substring(0, 6);
check = idCardNoUtil.checkAddressCode(addressCode);
if (!check) return false;
//校验日期码
let birDayCode = idCardNo.substring(6, 14);
check = idCardNoUtil.checkBirthDayCode(birDayCode);
if (!check) return false;
//验证校检码
return idCardNoUtil.checkParityBit(idCardNo);
},
formateDateCN: function(day) {
let yyyy = day.substring(0, 4);
let mm = day.substring(4, 6);
let dd = day.substring(6);
return yyyy + '-' + mm + '-' + dd;
},
//获取信息
getIdCardInfo: function(idCardNo) {
let idCardInfo = {
gender: "", //性别
birthday: "" // 出生日期(yyyy-mm-dd)
};
if (idCardNo.length == 15) {
let aday = '19' + idCardNo.substring(6, 12);
idCardInfo.birthday = idCardNoUtil.formateDateCN(aday);
if (parseInt(idCardNo.charAt(14)) % 2 == 0) {
idCardInfo.gender = idCardNoUtil.genders.female;
} else {
idCardInfo.gender = idCardNoUtil.genders.male;
}
} else if (idCardNo.length == 18) {
let aday = idCardNo.substring(6, 14);
idCardInfo.birthday = idCardNoUtil.formateDateCN(aday);
if (parseInt(idCardNo.charAt(16)) % 2 == 0) {
idCardInfo.gender = idCardNoUtil.genders.female;
} else {
idCardInfo.gender = idCardNoUtil.genders.male;
}
}
return idCardInfo;
},
/*18位转15位*/
getId15: function(idCardNo) {
if (idCardNo.length == 15) {
return idCardNo;
} else if (idCardNo.length == 18) {
return idCardNo.substring(0, 6) + idCardNo.substring(8, 17);
} else {
return null;
}
},
/*15位转18位*/
getId18: function(idCardNo) {
if (idCardNo.length == 15) {
let id17 = idCardNo.substring(0, 6) + '19' + idCardNo.substring(6);
let parityBit = idCardNoUtil.getParityBit(id17);
return id17 + parityBit;
} else if (idCardNo.length == 18) {
return idCardNo;
} else {
return null;
}
},
/* 护照 */
isPassPortCard(idCardNo) {
// 护照
// 规则: 14/15开头 + 7位数字, G + 8位数字, P + 7位数字, S/D + 7或8位数字,等
// 样本: 141234567, G12345678, P1234567
var reg = /^([a-zA-z]|[0-9]){5,17}$/;
if (reg.test(idCardNo) === false) {
return false;
} else {
return idCardNo;
}
},
/* 台湾居民来往大陆通行证 */
isTWCard(idCardNo) {
// 台湾居民来往大陆通行证
// 规则: 新版8位或18位数字, 旧版10位数字 + 英文字母
// 样本: 12345678 或 1234567890B
var reg = /^\d{8}|^[a-zA-Z0-9]{10}|^\d{18}$/;
if (reg.test(idCardNo) === false) {
// return { 'status': 0, 'msg': '台湾居民来往大陆通行证号码不合规' };
return false;
} else {
return idCardNo;
}
},
/* 港澳居民来往内地通行证 */
isHMCard(idCardNo) {
// 港澳居民来往内地通行证
// 规则: H/M + 10位或6位数字
// 样本: H1234567890
var reg = /^([A-Z]\d{6,10}(\(\w{1}\))?)$/;
if (reg.test(idCardNo) === false) {
return false;
// return {
// 'status': 0,
// 'msg': '港澳居民来往内地通行证号码不合规'
// };
} else {
return idCardNo;
}
},
/* 港澳台居民居住证 */
isHMTCard(idCardNo){
var reg = /^8[123]0000(?:19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dX]$/;
if (reg.test(idCardNo) === false) {
return false;
} else {
return idCardNo;
}
},
/* 军官证 */
isOfficerCard(idCardNo) {
// 军官证
// 规则: 军/兵/士/文/职/广/(其他中文) + "字第" + 4到8位字母或数字 + "号"
// 样本: 军字第2001988号, 士字第P011816X号
var reg = /^[\u4E00-\u9FA5](字第)([0-9a-zA-Z]{4,8})(?)$/;
if (reg.test(idCardNo) === false) {
return false;
} else {
return idCardNo;
}
},
};
export default idCardNoUtil;
<template>
<uni-popup :custom="true" type="bottom" ref="keyboardPackage">
<view class="keyboardbox">
<view class="numkeyboard" v-if="type==='number'">
<view class="num-area">
<view class="row" v-for="(item,index) in numKeybordList" :key="index">
<view :class="['item',ite===0?'z':'',(disableDot && ite==='.')?'disabled':'']"
v-for="(ite,idx) in item" hover-class="active" :hover-start-time="0" :hover-stay-time="5"
:key="idx" @tap="input(ite)">{{ite}}</view>
</view>
</view>
<view class="btn-area">
<view :class="['item','del']" hover-class="active" :hover-start-time="0" :hover-stay-time="5"
@tap="deleteVal">
<image src="../../static/img/deleteIcon.png" mode="aspectFit" style="width: 60rpx;height: 35rpx;"></image>
</view>
<view class="confirem item" hover-class="active" :hover-start-time="0" :hover-stay-time="5"
@tap="confirm">
充值
</view>
</view>
</view>
<view class="numkeyboard" v-if="type==='idCard'">
<view class="num-area">
<view class="row" v-for="(item,index) in idCardList" :key="index">
<view :class="['item',ite===0?'z':'',(disableDot && ite==='.')?'disabled':'']"
v-for="(ite,idx) in item" hover-class="active" :hover-start-time="0" :hover-stay-time="5"
:key="idx" @tap="input(ite)">{{ite}}</view>
</view>
</view>
<view class="btn-area">
<view :class="['item','del']" hover-class="active" :hover-start-time="0" :hover-stay-time="5"
@tap="deleteVal">
</view>
<view class="confirem item" hover-class="active" :hover-start-time="0" :hover-stay-time="5"
@tap="confirm">
完成
</view>
</view>
</view>
<view class="platenumber" v-if="type==='plateNumber'">
<view class="header">
<view @tap="active=active===1?2:1" hover-class="active" :hover-start-time="0" :hover-stay-time="5">
{{active===1?'地区':'车牌号'}}
</view>
<view hover-class="active" :hover-start-time="0" :hover-stay-time="5" @tap="confirm">完成</view>
</view>
<view class="main">
<view class="normal" v-show="active===1">
<view class="row" v-for="(item,index) in EngKeyBoardList" :key="index">
<view class="item" v-for="(ite,idx) in item" :key="idx" hover-class="active"
:hover-start-time="0" :hover-stay-time="5" @tap="input(ite)">
{{ite}}
</view>
<view class="item img" v-if="index===EngKeyBoardList.length-1" hover-class="active"
:hover-start-time="0" :hover-stay-time="5" @tap="deleteVal">
<image src="/static/delete.png" mode=""></image>
</view>
</view>
</view>
<view class="area" v-show="active===2">
<view class="row" v-for="(item,index) in areaList" :key="index">
<view class="item" v-for="(ite,idx) in item" :key="idx" hover-class="active"
:hover-start-time="0" :hover-stay-time="5" @tap="input(ite)">
{{ite}}
</view>
<view class="item img" v-if="index===EngKeyBoardList.length-1" hover-class="active"
:hover-start-time="0" :hover-stay-time="5" @tap="deleteVal">
<image src="/static/delete.png" mode=""></image>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="safe-area" v-if="safeAreaInsetBottom"></view>
</uni-popup>
</template>
<script>
export default {
props: {
type: {
type: String,
default: 'number'
},
safeAreaInsetBottom: { //是否设置安全区
type: Boolean,
default: false
},
disableDot: { //数字键盘是否禁止点击.仅type为number生效
type: Boolean,
default: false
}
},
data() {
return {
numKeybordList: [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[0, '.']
],
idCardList: [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[0, 'X']
],
areaList: [
['', '', '', '', '', '', '', '', '', ''],
['', '', '', '', '', '', '', '', '', ''],
['', '', '', '', '', '', '', '', ''],
['', '', '使', '', '', '']
],
EngKeyBoardList: [
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'],
['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'],
['Z', 'X', 'C', 'V', 'B', 'N', 'M']
],
active: 2
};
},
methods: {
open() {
this.$refs.keyboardPackage.open();
},
confirm() {
this.close();
this.$emit('onConfirm');
},
deleteVal() {
this.$emit('onDelete');
},
input(val) {
if (val === '.' && this.disableDot) return;
this.$emit('onInput', val);
if (this.active === 2) {
this.active = 1;
}
},
close() {
this.$refs.keyboardPackage.close();
}
}
}
</script>
<style lang="scss" scoped>
.keyboardbox {
background-color: #FFFFFF;
.numkeyboard {
height: 440rpx;
display: flex;
background: #F7F7F7;
.btn-area {
display: flex;
// flex-direction: column;
flex-wrap: wrap;
align-items: center;
.item {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
flex-grow: 1;
}
.del {
width: 170rpx;
height: 90rpx;
background: #FFFFFF;
border-radius: 8rpx;
margin: 0 auto;
text-align: center;
&.active {
background-color: #f1f3f5;
}
}
.confirem {
width: 170rpx;
height: 302rpx;
background: #04BA73;
border-radius: 8rpx;
color: #FFFFFF;
&.active {
background-color: #0570db;
}
}
}
.num-area {
flex-grow: 1;
display: flex;
flex-wrap: wrap;
height: 100%;
.row {
width: 100%;
// height: 25%;
display: flex;
margin-top: 1px;
justify-content: space-around;
align-items: center;
.item {
// flex-grow: 1;
// height: 100%;
display: flex;
justify-content: center;
align-items: center;
width: 170rpx;
height: 90rpx;
background: #FFFFFF;
border-radius: 8rpx;
&.active {
background-color: #04BA73;
color: #FFFFFF;
}
&.z {
// flex-grow: 1.5;
width: 62%;
font-size: 36rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #303030;
}
&.disabled {
background: #FFFFFF;
color: #B9B9B9;
}
}
}
}
}
}
.safe-area {
padding-bottom: 0rpx;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
.platenumber {
background-color: #f5f5f5;
.header {
height: 76rpx;
background-color: #FFFFFF;
display: flex;
justify-content: space-between;
align-items: center;
font-size: 28rpx;
border-top: 1px solid #f5f5f5;
&>view {
padding: 0 45rpx;
color: #00a7ea;
height: 100%;
display: flex;
align-items: center;
&.active {
background-color: #ebedf0;
}
}
}
.main {
height: 435rpx;
.row {
margin: 13rpx 0;
display: flex;
justify-content: center;
align-items: center;
.item {
width: 56rpx;
height: 94rpx;
display: flex;
justify-content: center;
align-items: center;
background-color: #FFFFFF;
border-radius: 6rpx;
margin: 0 7rpx;
font-size: 24rpx;
&.active {
background-color: #ebedf0;
}
&.img {
background-color: #c2cacc;
width: 94rpx;
&.active {
background-color: #ddd;
}
&>image {
width: 49rpx;
height: 48rpx;
}
}
}
}
}
}
</style>
<template>
<view>
</view>
</template>
<script>
export default {
data() {
return {
}
},
methods: {
}
}
</script>
<style>
</style>
<template>
<view class="box">
<view :class="['item',list.length===index?'fakecursor':'']" v-for="(item,index) in length" :key="item" :style="{margin:formatMargin(gutter)}">
<view class="psw" v-if="showPsw">{{list[index]}}</view>
<view :class="['circle',(index<list.length)?'dot':'']" v-else></view>
</view>
</view>
</template>
<script>
export default {
props: {
length: { //长度只允许为6和4
type: Number,
default: 6,
validator(val) {
if (val !== 6 && val !== 4) {
return false;
}
return true;
}
},
gutter: {
type: Number,
default: 0
},
list: {
type: Array,
default: function() {
return [];
}
},
showPsw: { // 展示密码
type: Boolean,
default: false,
}
},
data() {
return {};
},
computed: {
},
methods: {
formatMargin(gutter) {
return 0 + ' ' + gutter + 'rpx';
}
}
}
</script>
<style lang="scss" scoped>
.box {
background-color: #F5F5F5;
padding: 20rpx;
display: flex;
.item {
position: relative;
background-color: #FFFFFF;
height: 100rpx;
flex: 1;
border: 1px solid #F5F5F5;
display: flex;
justify-content: center;
align-items: center;
border-radius: 20rpx;
.circle {
width: 20rpx;
height: 20rpx;
border-radius: 50%;
background-color: #fff;
&.dot {
background-color: #000;
}
}
.psw{
font-size: 24rpx;
}
}
}
.fakecursor::after {
content: '';
display: block;
width: 1px;
height: 32rpx;
animation: blink 1s infinite steps(1, start);
position: absolute;
left: 50%;
top: 50%;
margin-top: -16rpx;
}
@keyframes blink {
0% {
background-color: white;
}
50% {
background-color: black;
}
100% {
background-color: white;
}
}
</style>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>本地网页</title>
<style type="text/css">
.btn {
display: block;
margin: 20px auto;
padding: 5px;
background-color: #007aff;
border: 0;
color: #ffffff;
height: 40px;
width: 200px;
}
.btn-red {
background-color: #dd524d;
}
.btn-yellow {
background-color: #f0ad4e;
}
.desc {
padding: 10px;
color: #999999;
}
</style>
</head>
<body>
<p class="desc">web-view 组件加载本地 html 示例,仅在 App 环境下生效。点击下列按钮,跳转至其它页面。</p>
<div class="btn-list">
<button class="btn" type="button" data-action="navigateTo">navigateTo</button>
<button class="btn" type="button" data-action="redirectTo">redirectTo</button>
<button class="btn" type="button" data-action="navigateBack">navigateBack</button>
<button class="btn" type="button" data-action="reLaunch">reLaunch</button>
<button class="btn" type="button" data-action="switchTab">switchTab</button>
</div>
<p class="desc">网页向应用发送消息。注意:小程序端应用会在此页面后退时接收到消息。</p>
<div class="btn-list">
<button class="btn btn-red" type="button" id="postMessage">postMessage</button>
</div>
<!-- uni 的 SDK -->
<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
<script type="text/javascript">
document.addEventListener('UniAppJSBridgeReady', function() {
document.querySelector('.btn-list').addEventListener('click', function(evt) {
var target = evt.target;
if (target.tagName === 'BUTTON') {
var action = target.getAttribute('data-action');
switch (action) {
case 'switchTab':
uni.switchTab({
url: '/pages/tabBar/API/API'
});
break;
case 'reLaunch':
uni.reLaunch({
url: '/pages/tabBar/API/API'
});
break;
case 'navigateBack':
uni.navigateBack({
delta: 1
});
break;
default:
uni[action]({
url: '/pages/component/button/button'
});
break;
}
}
});
document.querySelector("#postMessage").addEventListener('click', function() {
uni.postMessage({
data: {
action: 'message'
}
});
})
});
</script>
</body>
</html>
<!--
THIS EXAMPLE WAS DOWNLOADED FROM https://echarts.apache.org/examples/zh/editor.html?c=pie-doughnut
-->
<!DOCTYPE html>
<html style="height: 100%">
<head>
<meta charset="utf-8">
<meta name=viewport
content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1">
</head>
<body style="height: 100%; margin: 0">
<div id="container" style="height: 100%"></div>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
<!-- Uncomment this line if you want to dataTool extension
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/extension/dataTool.min.js"></script>
-->
<!-- Uncomment this line if you want to use gl extension
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-gl@2/dist/echarts-gl.min.js"></script>
-->
<!-- Uncomment this line if you want to echarts-stat extension
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js"></script>
-->
<!-- Uncomment this line if you want to use map
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/map/js/china.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/map/js/world.js"></script>
-->
<!-- Uncomment these two lines if you want to use bmap extension
<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=<Your Key Here>"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/extension/bmap.min.js"></script>
-->
<script type="text/javascript">
var dom = document.getElementById("container");
var myChart = echarts.init(dom);
var app = {};
var option;
option = {
tooltip: {
trigger: 'item'
},
legend: {
top: '5%',
left: 'center'
},
series: [{
name: '访问来源',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: '40',
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [{
value: 1048,
name: '搜索引擎'
},
{
value: 735,
name: '直接访问'
},
{
value: 580,
name: '邮件营销'
},
{
value: 484,
name: '联盟广告'
},
{
value: 300,
name: '视频广告'
}
]
}]
};
if (option && typeof option === 'object') {
myChart.setOption(option);
}
</script>
</body>
</html>
import Vue from 'vue'
import App from './App'
// OSS静态资源
Vue.prototype.$iImgUrl = 'https://szcf.superbest.wang/xcxImages/'
//http请求
import http from '@/common/js/http.js'
Vue.prototype.$http = http
// 时间处理模块
import dayjs from 'dayjs'
Vue.prototype.$day = dayjs
// OSS静态资源
Vue.prototype.$ImgUrl = 'https://xiaopay2020.oss-cn-shenzhen.aliyuncs.com/static/weapp/';
// #ifdef H5
import Vant from 'vant';
Vue.use(Vant);
// echarts图标
// var echarts = require('echarts')
// Vue.prototype.$echarts = echarts
// console.log(echarts);
// 微信JSSDK
// import jweixin from 'jweixin-module'
// Vue.prototype.$jweixin = jweixin
// console.log(jweixin);
import VConsole from 'vconsole';
// const vConsole = new VConsole();
//加载es5>>js
function loadJs(path, callback) {
let secScript = document.createElement("script");
secScript.setAttribute("src", path);
secScript.setAttribute("async", "async");
document.body.insertBefore(secScript, document.body.lastChild);
secScript.onload = callback;
if (secScript.readyState) {
// IE
secScript.onreadystatechange = function() {
if (secScript.readyState === 'loaded' || secScript.readyState === 'complete') {
secScript.onreadystatechange = null;
callback();
}
};
} else {
//其他浏览器
secScript.onload = callback;
}
}
// //JQ
// loadJs("//s1.pstatp.com/cdn/expire-1-M/jquery/1.8.0/jquery-1.8.0.min.js")
// // 微信-WEUI框架
// loadJs("//res.wx.qq.com/open/libs/weuijs/1.2.1/weui.min.js")
// // 公众号js-sdk
// loadJs("//res.wx.qq.com/open/js/jweixin-1.6.0.js")
// // 二维码生成
// loadJs("//static.runoob.com/assets/qrcode/qrcode.min.js")
// #endif
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()
{
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "校智付电子校园卡",
"navigationStyle": "custom",
"usingComponents": {
},
"h5": {
"titleNView": "transparent"
}
}
}, {
"path": "pages/WxworkTearch/WxworkTearch",
"style": {
"navigationBarTitleText": "企业微信教职工采集签约助手",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/wxWorkAuth/wxWorkAuth",
"style": {
"navigationBarTitleText": "校智付",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/assignDeposit/assignDeposit",
"style": {
"navigationBarTitleText": "电子校园卡",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/confirmQrCode/confirmQrCode",
"style": {
"navigationBarTitleText": "识别二维码确认采集信息",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/CreditRefund/CreditRefund",
"style": {
"navigationBarTitleText": "信用金退款",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/ClsWeekReport/ClsWeekReport",
"style": {
"navigationBarTitleText": "周消费报告",
"enablePullDownRefresh": false,
"navigationStyle": "custom",
"usingComponents": {
},
"h5": {
"titleNView": "transparent"
}
}
}, {
"path": "pages/NoticeInfo/NoticeInfo",
"style": {
"navigationBarTitleText": "通知公告",
"enablePullDownRefresh": false,
"navigationStyle": "custom",
"usingComponents": {
},
"h5": {
"titleNView": "transparent"
}
}
}, {
"path": "pages/AccessControlModular/SchoolAttendance/SchoolAttendance",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}, {
"path": "pages/AccessControlModular/StudentAttendance/StudentAttendance",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}, {
"path": "pages/AccessControlModular/TeacherAttendance/TeacherAttendance",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}, {
"path": "pages/QueryMyWechat/QueryMyWechat",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "我的微信信息",
"enablePullDownRefresh": false,
"h5": {
"titleNView": "transparent"
}
}
}, {
"path": "pages/IcbcModule/Recharge/Recharge",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "充值",
"enablePullDownRefresh": false
}
}, {
"path": "pages/IcbcModule/Reflect/Reflect",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "提现",
"enablePullDownRefresh": false
}
}, {
"path": "pages/AccessControlModular/SchoolAttendance/SchoolAttendance",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}, {
"path": "pages/AccessControlModular/StudentAttendance/StudentAttendance",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}, {
"path": "pages/AccessControlModular/TeacherAttendance/TeacherAttendance",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}, {
"path": "pages/StudentsGraduate/StudentsGraduate",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "首页",
"enablePullDownRefresh": false
}
}, {
"path": "pages/AgreementXL/agreement/main",
"style": {
"navigationBarTitleText": "笑脸校园",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementXL/privacy/main",
"style": {
"navigationBarTitleText": "笑脸校园",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementXL/rule/main",
"style": {
"navigationBarTitleText": "笑脸校园",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementXZF/agreement/main",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementXZF/privacy/main",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementXZF/rule/main",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementICBC/account/main",
"style": {
"navigationBarTitleText": "个人银行电子账户服务协议",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementICBC/personal/main",
"style": {
"navigationBarTitleText": "中国工商银行电子银行个人客户服务协议",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementJSX/agreement/main",
"style": {
"navigationBarTitleText": "晋尚学服务协议",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementJSX/privacy/main",
"style": {
"navigationBarTitleText": "晋尚学未成年人个人信息保护规则",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementJSX/rule/main",
"style": {
"navigationBarTitleText": "晋尚学隐私权政策",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
},
{
"path": "pages/AgreementSZXY/agreement/main",
"style": {
"navigationBarTitleText": "数字校园服务协议",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementSZXY/privacy/main",
"style": {
"navigationBarTitleText": "数字校园未成年人个人信息保护规则",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}, {
"path": "pages/AgreementSZXY/rule/main",
"style": {
"navigationBarTitleText": "数字校园隐私权政策",
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "校智付",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
}
}
<template>
<view class="container">
</view>
</template>
<script>
export default {
name: "SchoolAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
</style>
<template>
<view class="container">
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
</style>
<template>
<view class="container">
</view>
</template>
<script>
export default {
name: "TeacherAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
</style>
<template>
<view class="container">
<div class="title">个人银行电子账户服务协议</div>
<div class="paragraph t bold">
【特别提示】本合同是由您作为开户申请人(以下简称甲方)与中国工商银行股份有限公司经办机构(以下简称乙方)就甲方合法、规范使用个人银行结算账户,在平等自愿的基础上达成的协议。甲方以点击确认的方式选择接受本合同,即表示甲方与乙方已达成本协议并同意接受本协议的全部约定内容。在接受本协议之前,请您仔细阅读本协议的全部内容,如果您对本协议条款有疑问或异议,请勿点击确认。
</div>
<div class="paragraph">
<div class="t bold">一、定义</div>
<p>
根据中国人民银行有关个人银行结算账户分类管理的规定,本协议所称电子账户划分为Ⅱ类电子账户及Ⅲ类电子账户(以下分别简称Ⅱ类户、Ⅲ类户)。乙方申请的电子账户为Ⅲ类户。
<p>1.电子账户:甲方凭有效个人身份证件通过乙方非柜面渠道或合作方渠道以非面对面方式在乙方开立,用于办理资金收付结算的个人银行结算账户。按照账户使用范围,电子账户可以分为特定用途电子账户和通用电子账户。特定用途电子账户是指根据合作方需求,具有特定用途的电子账户;通用电子账户是指在正常使用的电子账户。</p>
<p>2.Ⅱ类户:甲方在乙方以非面对面方式开立的Ⅱ类户,乙方通过该账户为甲方提供存款、购买投资理财等金融产品、限额内的消费和缴费支付、限额内向非绑定账户转出资金等服务。</p>
<p>3.Ⅲ类户:甲方在乙方以非面对面方式开立的Ⅲ类户,乙方通过该账户为甲方提供限额内的消费和缴费支付、限额内向非绑定账户转出资金、非绑定账户限额内向该账户转入资金等服务。</p>
<p>4.绑定账户:甲方开立电子账户时,甲方提供的本人在乙方或其他银行开立的同名银行账户或信用卡账户,确认绑定账户的所有人为甲方本人。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">二、账户开立</div>
<p>1.甲方自愿申请在乙方开立电子账户,同意在开立、使用、变更和撤销电子账户时遵守《人民币银行结算账户管理办法》及相关法律、法规的规定,同时遵守乙方公布的相关制度规定。</p>
<p>2.甲方通过合作方渠道申请开立乙方电子账户,该电子账户将作为乙方通过合作方渠道为甲方提供银行产品和服务的个人综合账户,甲方一旦通过该渠道发起指令均视为授权渠道方完整、及时、准确无误地将指令传输至乙方完成产品或服务的申请。甲方同意并授权乙方根据与合作方的约定和指令,办理资金保留、解保留和扣划等业务。甲方可通过合作方或致电乙方95588客服热线咨询具体账户类型、开户行等信息。</p>
<p>
3.甲方申请在乙方开立电子账户,甲方同意向乙方提交或授权乙方通过合作方渠道获取和保存甲方相应证明文件和个人信息(包括但不限于姓名、证件类型、证件号码、证件照片、住所地或者工作单位地址、手机号码、税收居民信息、职业信息、绑定账户信息、脸部信息),并接受乙方审核,同意乙方通过银联、电信运营商等第三方机构核验甲方个人信息,以落实银行账户实名制。甲方承诺所提交的开户资料、信息真实、合法、有效。如有伪造、欺诈,需承担相应法律责任。若乙方发现甲方提交的开户资料虚假或预留非本人实名登记的手机号码,一经发现,乙方有权停用该账户,待甲方变更开户资料或本人实名登记的手机号码后再恢复使用。如因资料不真实造成的一切后果由甲方自行承担。甲方申请开立电子账户必须由甲方本人办理,不得由他人代办。
</p>
<p>4.甲方申请在乙方开立电子账户,为保证绑定账户向电子账户的资金充值,甲方授权乙方向银联等第三方清算机构发起对绑定账户(卡号)资金扣划的指令。</p>
<p>5.甲方开立电子账户遵循以下规定:</p>
<p>5.1甲方应使用本人有效居民身份证和实名登记的手机号申请开立电子账户。</p>
<p>5.2甲方开立Ⅱ类户,应当绑定本人Ⅰ类户或者信用卡账户,验证的信息应当至少包括开户申请人姓名、居民身份证号码、手机号码、绑定账户(卡号)、绑定账户是否为Ⅰ类户或者信用卡账户等5个要素。</p>
<p>5.3甲方开立Ⅲ类户,应当绑定本人账户,验证的信息应当至少包括开户申请人姓名、居民身份证号码、手机号码、绑定账户(卡号)等4个要素。甲方在乙方开立的所有Ⅲ类户资金双边收付金额累计达到5万元(含)以上时,甲方应按乙方要求在规定时间内提供有效身份证件,补充身份基本信息,留存有效身份证件的复印件、影印件或影像。甲方未按要求登记身份信息、提供身份证件的,乙方有权中止该账户所有业务。</p>
<p>5.4支持绑定的银行账户以银行侧返回结果为准。</p>
<p>6.乙方将根据监管要求对甲方开户申请进行审核,审核通过的,乙方为甲方完成电子账户开立。对于个人存在异常开户和可疑交易行为的,乙方有权按照《中国人民银行关于加强支付结算管理防范电信网络新型违法犯罪有关事项的通知》(银发[2016]261号)、《中国人民银行关于加强开户管理及可疑交易报告后续控制措施的通知》(银发[2017]117号)、《中国人民银行关于进一步加强支付结算管理 防范电信网络新型违法犯罪有关事项的通知》(银发[2019]85号)等制度规定,采取拒绝为甲方开立个人银行电子账户或暂停账户非柜面业务或者限制账户功能等措施。甲方同意并授权乙方将审核结果和电子账户信息发送至合作方渠道并向甲方展示。</p>
</div>
<div class="paragraph">
<div class="t bold">三、账户使用</div>
<p>1.为保障甲方账户资金安全,甲方同意乙方根据法律法规、监管部门及自身风险管理的要求,对Ⅱ、Ⅲ类户的转账、存取现金等业务设置限额。乙方为甲方开立的电子账户的使用遵循《中国人民银行关于改进个人银行账户分类管理有关事项的通知》(银发【2018】16号)、《中国人民银行关于落实个人银行账户分类管理制度的通知》(银发【2016】302号)、《中国人民银行关于改进个人银行账户服务加强账户管理的通知》(银发【2015】392号)的规定。</p>
<p>2.如果甲方设置了账户校验信息、预留银行账户密码、一次性短信验证码或合作方渠道方账户密码,凡使用正确校验信息、短信验证码或密码进行的操作均视为甲方本人行为。甲方应妥善保管账户校验信息、短信验证码或密码(如有)、本人有效身份证件及有关凭证等,因甲方保管不善或甲方将账户转借、转租他人使用或泄露资料、手机出借、丢失所产生的风险及造成的损失由甲方自行承担。</p>
<p>3.甲方在乙方开立的电子账户可通过乙方渠道预留银行账户密码,除甲乙双方另有规定外。对于预留密码的账户,凡使用正确密码进行的交易均视为甲方本人行为,甲方应妥善保管账户密码、本人有效身份证件及有关业务凭证等,因甲方保管不善造成的损失由甲方自行承担。在符合监管规定、银行卡清算组织规则或双方约定的前提下,相关交易可不使用密码验证。</p>
<p>4.甲方授权乙方在发生以下情形时,乙方有权对该电子账户采取限制措施,包括但不限于强制销户等,相关责任由甲方承担:</p>
<p>4.1乙方有合理理由认定该电子账户可能非甲方本人开立;</p>
<p>4.2甲方否认电子账户由本人开立;</p>
<p>4.3绑定手机号码不存在、无效、不真实、虚拟手机号码或并非本人实名登记手机号;</p>
<p>4.4绑定账户非甲方本人开立的账户;</p>
<p>4.5其他乙方认为可能对账户安全性产生影响的情形。 </p>
<p>5.甲方承诺不利用乙方开立电子账户进行偷逃税款、逃废债务、套取现金、洗钱及其他违法犯罪活动。</p>
<p>6.甲方同意乙方对电子账户开户、使用及其资金交易情况进行监测,并结合监测结果对可能导致甲方账户资金发生风险或引发电子账户不当使用的交易进行阻断、限制部分交易功能,或进而不再受理甲方提出的个人银行结算账户开户申请。</p>
<p>7.甲方充分了解并清楚知晓出租、出借、出售、购买账户的相关法律责任和惩戒措施,承诺依法依规开立和使用在乙方开立的个人银行结算账户。甲方同意,对于经设区的市级及以上公安机关认定的出租、出借、出售、购买银行账户(含银行卡)的个人及相关组织者,假冒他人身份或者虚构代理关系开立个人银行结算账户的个人,乙方有权5年内暂停其个人银行结算账户非柜面业务,5年内不为甲方开立新的个人银行结算账户。甲方同意,对于经设区的市级及以上公安机关认定并纳入电信网络新型违法犯罪交易风险事件管理平台“涉案账户”名单的个人银行结算账户,乙方有权中止该账户所有业务。甲方为上述涉案账户开户人的,乙方将通知甲方重新核实身份。如甲方未在3日内向乙方重新核实身份,甲方同意乙方对甲方名下其他银行账户暂停非柜面业务。</p>
<p>8.甲方承诺不冒用他人身份开立电子账户。乙方发现电子账户为假名或冒名开户的,将立即停止该账户的使用,并可经被冒用人同意后予以销户,账户内资金纳入乙方久悬未取专户核算。</p>
<p>9.因甲方违规使用电子账户导致的损失由甲方承担,给乙方造成损害的,甲方承担相应法律责任。</p>
<p>10.甲方通过合作方渠道申请在乙方开立电子账户,甲方同意并授权乙方将甲方在合作方渠道使用电子账户的有关交易信息通过加密通道传输给合作方,包括但不限于账(卡)号、余额、明细、账户状态和交易结果。</p>
<p>11.甲方授权乙方可基于业务办理、履行合同、拓展服务及开展风险管理等需要,收集、传输、加工、保存、查询和使用甲方信息,并可通过短信等方式推送服务和产品等信息。双方业务关系终止后,乙方应依法为甲方在乙方开立的电子账户的有关资料保密。除国家法律另有规定或本协议另有约定外,乙方有权拒绝任何单位或个人查询。</p>
<p>12.如有问题,可通过中国工商银行营业网点、门户网站或手机银行APP在线客服咨询投诉,或拨打中国工商银行统一的咨询与投诉电话(95588)。</p>
</div>
<div class="paragraph">
<div class="t bold">四、账户变更和注销</div>
<p>1.甲方的联系方式、手机号码等信息发生变更,或者甲方有效身份证件及身份证明文件的有效期届满的,甲方承诺及时通知乙方进行更新。甲方同意按照乙方要求重新验证信息,并配合乙方核实个人变更信息的真实意愿。若因甲方不及时更新相关信息导致影响账户使用的,甲方自行承担相关责任及损失。</p>
<p>2.甲方可以通过乙方柜面办理姓名、居民身份证号码、手机号码、绑定账户变更业务。甲方可以通过乙方非柜面渠道或合作方渠道办理电子账户绑定账户变更业务。甲方办理变更业务时,乙方有权要求甲方按照新开户要求重新验证信息,并采取核验短信验证码、人脸识别等措施核实甲方变更信息的真实意愿。</p>
<p>3.甲方通过乙方渠道或者合作方渠道办理电子账户变更或销户业务,甲方应当先将电子账户所有投资理财等金融产品赎回、提前支取定期存款,将电子账户资金全部转回绑定账户后再予以变更或销户。乙方通过电子渠道非面对面为甲方办理Ⅱ、Ⅲ类户变更或销户业务时,绑定账户已销户的,甲方应按照乙方新开户要求重新验证个人身份信息后绑定新的账户,将电子账户资金转回新绑定账户后再办理变更或销户。</p>
<p>4.甲方在乙方开立电子账户,同意遵守中国工商银行对外公布的小额账户或长期不动户、零余额账户的有关规定。具体标准以中国工商银行网站公布或公告为准。</p>
<p>5.甲方同意乙方可根据法律法规、监管规定或银行风险管理等需要对本协议内容进行修改,并通过中国工商银行网站、营业网点等进行公告。公告期内,甲方可以选择是否继续使用电子账户,甲方如不同意有关变更,可按照规定进行销户,继续使用电子账户的,视为甲方同意有关变更,公告期满即为生效。</p>
<p>6.本协议生效后施行的法律法规和监管规章的有关规定与本协议内容冲突的,以有关法律法规和监管规章规定为准。</p>
<p>7.本协议于甲方在乙方开立的电子账户存续期间有效,至甲方依本协议在乙方开立的电子账户正式销户之日终止。</p>
</div>
<div class="paragraph">
<div class="t bold">五、法律适用与争议解决</div>
<p>1.本协议的效力、解释、变更、执行及争议的解决等均适用中华人民共和国法律。</p>
<p>2.因本协议产生的任何争议,双方应协商解决,协商不成的,应提交乙方所在地有管辖权的人民法院裁决。诉讼期间,甲、乙双方须继续执行协议中除争议部分之外的其他条款。</p>
</div>
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
.container {
padding:20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top:20rpx;
font-size:14px;
}
.paragraph .t{
font-size:16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">中国工商银行电子银行个人客户服务协议</div>
<div class="bold" style="text-indent: 2em;">
  中国工商银行遵循平等自愿、诚实守信、勤勉尽责的原则,努力为客户提供专业化、高质量的金融服务。在签订本合同之前,特提请客户充分了解工商银行提供的相关金融服务内容及收费标准,自主决定是否选择相关金融服务。
</div>
<div style="text-indent: 2em;">为明确双方的权利和义务,规范双方业务行为,甲方(客户) 、乙方(中国工商银行)本着平等互利的原则,就电子银行服务相关事宜达成本协议。</div>
<div class="paragraph">
<div class="t bold">第一条  定义</div>
<p> 下列用语在本协议中的含义为:</p>
<p>“电子银行”是指乙方通过面向社会公众开放的通讯通道或开放型公众网络,以及为特定自助服务设施或客户建立的专用网络等方式,为甲方提供的离柜金融服务。</p>
<p>“密码”指客户自行设定并用于验证客户身份的字符和图形等信息。</p>
<p>“动态口令”是指按照特定规则动态产生并用于识别客户身份的字符组合,动态口令的载体包括电子银行口令卡、工银电子密码器、手机等。</p>
<p>“客户证书”指用于存放客户身份标识,并对客户发送的电子银行交易信息进行数字签名的电子文件。乙方为甲方提供的客户证书存放介质为“U盾”。</p>
</div>
<div class="paragraph">
<div class="t bold">第二条  甲方权利、义务</div>
<p>
一、权利
<p>(一)甲方自愿申请注册乙方电子银行,经乙方同意后,将有权根据注册项目的不同享受不同的服务。</p>
<p>(二)甲方在注册期内有权办理电子银行变更或注销手续。</p>
<p>(三)甲方对乙方电子银行服务如有疑问、建议或意见时,可拨打电话“95588”、登录乙方网站或到乙方各营业网点咨询。</p>
</p>
<p>
二、义务
<p>(一)甲方办理电子银行业务,应遵守《中国工商银行电子银行章程》和乙方在网站上公布的交易规则。甲方开通二维码支付功能的,还应遵守在乙方网站上公布的《二维码支付交易规则》。</p>
<p>(二)甲方到乙方营业网点办理电子银行注册、注销、变更等手续,应按乙方要求提供相关申请资料,甲方应对所申请事项签字确认。甲方签章确认的业务申请资料是本协议不可分割的组成部分。甲方应保证所提供资料真实、准确、完整,对于因甲方提供信息不真实、不准确或不完整所造成的损失由甲方承担。</p>
<p>(三)(甲方办理网上银行业务应直接登录乙方网站(网址:http://www.icbc.com.cn),而不要通过短信、电话、邮件或其他网站提供的链接登录;甲方在中国大陆地区办理电话银行业务,应直接拨打乙方服务电话95588或在中国工商银行网站公布的指定电话号码,而不要拨打其他电话;甲方办理手机银行业务应通过手机直接登录乙方手机银行网站(网址:http://m.icbc.com.cn);甲方使用短信银行应将短信发送到95588;甲方使用通过客户端登录的电子银行,客户端软件应从中国工商银行网站或设备指定软件下载网站下载。</p>
<p>(四)(四)甲方必须妥善保管本人注册卡号(账号、登录ID或注册手机号码)、密码、电子银行口令卡、U盾、工银电子密码器及接收短信认证的手机。乙方执行通过安全程序的电子支付指令后,甲方不得要求变更或撤销电子支付指令。
    甲方不得出租、出借、出售电子银行口令卡、U盾、工银电子密码器,由于上述行为造成的后果由甲方承担。</p>
<p>(五)甲方应按照机密的原则设置和保管密码:避免使用姓名、生日、电话号码等与本人明显相关的信息作为密码;不得将本人自设密码提供给除法律规定外的任何人;通过电脑、手机等终端办理电子银行业务后,须将自设密码从终端上删除;采取其他合理措施,防止本人密码被窃取。由于密码泄露造成的后果由甲方承担。
    甲方应该妥善保管预留验证信息,除在乙方办理业务时使用外,不要向任何其他人、其他网站、电话或短信的问询提供预留验证信息内容。
    甲方申领电子银行口令卡后,应妥善保管电子银行口令卡,不得将电子银行口令卡上的字符信息泄露给他人,否则由此造成的后果由甲方承担。电子银行口令卡密码字符区域的覆膜会随电子银行口令卡的使用而逐渐被刮开,被刮开区域的密码字符容易被他人记录,从而降低动态密码的安全性。因此,甲方应采取必要措施保护已被刮开的密码字符,当电子银行口令卡上一半以上的覆膜被刮开时,建议甲方进一步加强对字符信息泄露风险的防范;当电子银行口令卡上所有覆膜被刮开时,建议甲方到乙方营业网点申领新卡,以便更好地保障安全。
    甲方申领工银电子密码器后,应妥善保管工银电子密码器,不得将工银电子密码器及其产生的动态口令交由他人使用,否则由此造成的后果由甲方承担。电子密码器产生的数字可用于对电子银行对外支付进行身份认证,当网页上要求输入电子密码器产生的数字时,甲方应首先核对浏览器地址栏中的网站域名是否为icbc.com.cn,如果不是不应输入,防止密码信息泄露;当有人索要电子密码器产生的数字时,甲方不应随意提供,防止受骗。</p>
<p>(六)甲方使用乙方通过手机短信发送的动态口令进行交易确认的,应确保向乙方提供本人正确的手机号,乙方向该手机号发送可用于办理对外支付等业务的动态口令,甲方应在交易过程中认真核对短信发送编号等信息是否与正在进行的交易事项一致。因甲方提供手机号有误、未认真核对信息或未正确操作造成的一切损失,乙方不承担责任。</p>
<p>
(七)甲方在无乙方个人结算账户的情况下,申请开通乙方电子银行业务,还应遵守如下条款。
<p>1.甲方申请开通电子银行业务,应由本人亲自办理,须持有二代居民身份证和在国内其他商业银行实名开立的银行卡,并向乙方提供相关身份信息,承诺向乙方提供的所有资料真实、有效、完整、准确、合法,如甲方提供的资料不符合要求或存在代办、伪冒、欺诈等情形,乙方有权拒绝甲方的申请,甲方需承担相应法律责任;乙方审核通过后为甲方开立电子账户。</p>
<p>2.甲方申请将电子账户的资金转回所绑定银行卡时,应确保绑定银行卡状态正常,因状态不正常导致资金无法正常到账的,乙方对此不承担责任。</p>
<p>3.甲方开立的电子账户只限甲方本人使用,不得出借、转让或出租。否则,由此产生的损失由甲方自行承担。</p>
</p>
<p>
(八)发生以下情况时,甲方应及时到乙方营业网点办理相应手续,否则可能产生甲方无法正常使用乙方电子银行功能或甲方账户资金安全性降低等风险。甲方应承担办妥手续之前所产生的一切后果。
<p>1.甲方的密码泄露、遗忘,应办理密码重置手续。</p>
<p>2.甲方申领电子银行口令卡时发现卡片覆膜、覆膜上的图案等不完整、破损,或所领取电子银行口令卡序列号与申请表上银行打印的电子银行口令卡序列号不一致时,应当场办理更换手续。</p>
<p>3.甲方电子银行口令卡达到乙方设定的有效次数,或者在达到有效次数前遗失、损毁等,仍需使用的,应办理申领新卡手续。</p>
<p>4. 甲方领取的工银电子密码器序列号与申请表上银行打印的序列号不一致,应当场办理更换手续。</p>
<p>5.甲方的工银电子密码器遗失、损毁、无法正常使用或使用期届满,应及时到乙方营业网点办理重新申领手续。</p>
<p>6.甲方客户证书在有效期内损毁、锁码、遗失或证书密码遗忘,应办理证书更换、解锁或密码重置手续。</p>
<p>7.甲方输错密码、动态口令、短信认证信息超过乙方规定的次数,其交易可能被限制,甲方应及时与乙方办理相应解除限制的手续。</p>
<p>8.甲方手机号遗失或变更,应即时取消或变更网上银行、手机银行、直销银行、工银信使、短信认证等业务的绑定 手机号码。</p>
</p>
<p>(九)甲方在 使用电子银行服务过程中,所提供的注册信息如有更改,应及时办理有关手续,办妥上述手续之前所产生的一切后果由甲方承担。</p>
<p>(十)甲方应保证办理电子支付业务账户的支付能力,并严格遵守支付结算业务的相关法律法规。</p>
<p>(十一)甲方不得以与第三方发生纠纷为理由拒绝支付应付乙方的款项。</p>
<p>(十二)甲方不得有意诋毁、损害乙方声誉或恶意攻击乙方电子银行系统。</p>
<p>(十三)甲方办理电子银行业务时,如其使用的服务功能涉及到乙方其他业务规定或规则的需同时遵守。</p>
<p>(十四)甲方长期不使用电子银行,应主动申请办理注销手续。</p>
<p>(十五)甲方不具备完全民事行为能力的,甲方监护人应妥善保管甲方的注册卡号(账号、登录ID或注册手机号码)、电子银行口令卡、U盾、工银电子密码器、接受短信认证信息的手机及相关密码,并对通过以上信息完成的金融交易负责。</p>
<p>(十六)甲方使用乙方电子银行服务的,应按照乙方制定并公布的相应收费标准支付服务费用。具体收费标准及优惠政策等,详见乙方在网站及营业网点公布的《服务价目表》。各项收费如有变动,以乙方最新公告为准。</p>
</div>   
<div class="paragraph">
<div class="t bold">第三条  乙方权利、义务 </div>
<p>
一、权利
<p>(一)乙方有权根据甲方资信情况,决定是否受理甲方的注册申请。</p>
<p>(二)乙方有权依法制定电子银行业务收费标准,并在网站及营业网点进行公布。</p>
<p>(三)乙方具有对电子银行系统进行升级、改造的权利。</p>
<p>(四)甲方存在未按时支付有关费用、不遵守乙方已公布的有关业务规定或存在恶意操作、诋毁、损害乙方声誉等情况的,乙方有权单方终止对甲方提供电子银行服务,并保留追究甲方责任的权利。甲方利用乙方电子银行从事违反国家法律法规活动的,乙方将停止为其办理电子银行业务。</p>
<p>(五)乙方有权通过全国公民身份信息系统等合法渠道查询、打印、保存并使用甲方有关信息,用于核实甲方身份信息等与业务审核及管理相关的事项。</p>
<p>(六)乙方根据甲方的电子银行业务指令办理业务, 对所有使用甲方在乙方设定的身份标识信息(包括账户账号、卡号、客户编号、电话或手机号码、客户名称、终端设备信息等),并按照甲方在乙方设定的身份认证方式(包括密码、客户证书、动态口令等)通过身份验证的操作均视为甲方所为,该操作所产生的电子信息记录均为乙方处理电子银行业务的有效凭据。</p>
<p>
(七)乙方因以下情况没有正确执行甲方提交的电子银行业务指令,不承担任何责任:
<p>1 .乙方接收到的指令信息不明、存在乱码、不完整等。</p>
<p>2.甲方账户存款余额或信用额度不足。</p>
<p>3.甲方账户内资金被依法冻结或扣划。</p>
<p>4.甲方未能按照乙方的有关业务规定正确操作。</p>
<p>5. 甲方的行为出于欺诈或其他非法目的。</p>
<p>6. 由于不可抗力、计算机黑客袭击、系统故障、通讯故障、网络拥堵、供电系统故障、电脑病毒、恶意程序攻击及其它不可归因于乙方的原因,导致甲方未收到或延迟收到乙方发出的与交易相关的认证信息,或导致乙方无法正常处理甲方的电子银行业务指令。因乙方故意或重大过失导致的计算机黑客袭击、系统故障、通讯故障、网络拥堵、供电系统故障、电脑病毒、恶意程序攻击除外。</p>
</p>
<p>(八)若发生可能导致电子银行口令卡数据泄漏的事件,为保障甲方账户资金安全,乙方有权将该电子银行口令卡作废。乙方应 通过适当方式将作废电子银行口令卡的信息告知甲方,并应甲方要求为甲方更换新卡。</p>
<p>(九)服务有效期内,如甲方(客户)提前解除或终止本协议,应向乙方(我行)支付违约补偿金,违约补偿金金额为甲方(客户)已缴纳的剩余期限的服务费用。</p>
<p>(十)如甲方因乙方电子银行系统差错、故障或其他原因获得不当得利的,甲方授权乙方从甲方账户中扣划甲方的不当得利所得或暂停对甲方的电子银行服务。</p>
</p>
   <p>
二、义务
<p>(一)在乙方系统正常运行情况下,乙方负责及时准确地处理甲方发送的电子银行业务指令,并及时向甲方提供查询交易记录、资金余额、账户状态等服务。</p>
<p>(二)乙方对于电子银行所使用的相关软件的合法性承担责任。</p>
<p>(三)乙方负责及时为甲方办理电子银行注册手续,并按甲方注册功能的不同为甲方提供相应的电子银行服务。</p>
<p>(四)乙方负责向甲方提供电子银行业务咨询服务,并在乙方网站公布功能介绍、热点解答、交易规则等内容。</p>
<p>(五)乙方在法律法规许可和甲方授权的范围内使用甲方的资料和交易记录。乙方对甲方提供的申请资料和其他信息有保密的义务,但法律法规另有规定的除外。</p>
<p>(六)因工作失误导致支付结算处理延误,乙方按中国人民银行《支付结算办法》的有关规定赔偿。</p>
</p>
 </div>  
    
    
    <div class="paragraph">
<div class="t bold">第四条  法律适用条款 </div>
<p>
<p>本协议的成立、生效、履行和解释,均适用中华人民共和国法律。</p>
<p>本协议是乙方的其他既有协议和约定的补充而非替代文件,如本协议与其他既有协议和约定有冲突,涉及电子银行业务内容的,应以本协议为准。</p>
</p>
</div>    
    
<div class="paragraph">
<div class="t bold">第五条  差错和争议的解决</div>
<p> 甲方发现自身未按规定操作,或由于自身其他原因造成电子银行业务指令未执行、未适当执行、延迟执行的,应及时通过拨打服务热线“95588 ”或到营业网点通知乙方。乙方应积极调查并告知甲方调查结果。</p>
<p> 双方在履行本协议的过程中,如发生争议,应协商解决。协商不成的,任何一方均可向本协议项下乙方经办行所在地人民法院提起诉讼。</p>
</div>       
    
<div class="paragraph">
<div class="t bold"> 第六条  协议的中止和终止 </div>
<p>乙方提供的电子银行服务受甲方注册卡(账户)状态的制约,如该卡(账户)挂失、止付等原因不能使用,相关服务自动中止。甲方注册卡(账户)状态恢复正常时,乙方重新提供相应服务。</p>
<p>甲方电子银行注销手续办理完毕,本协议即为终止。</p>
<p>在甲方违反本协议规定或其他乙方公布的业务规定的情况下,乙方有权中止或终止本协议。协议终止并不意味着终止前所发生的未完成交易指令的撤销,也不能消除因终止前的交易所带来的任何法律后果。</p>
</div>       
    
<div class="paragraph">
<div class="t bold"> 第七条  协议的效力和生效</div>
<p>本协议的任何条款如因任何原因而被确认无效,都不影响本协议其他未受影响条款的效力。本协议自乙方在电子银行系统为甲方完成注册起生效。</p>
<p>若甲方注册电子银行后又办理注册银行卡卡片更换,与原注册卡相关的电子银行服务事项自动转至新卡,本协议继续有效。</p>
</div>        
    
<div class="paragraph">
<div class="t bold">中国工商银行个人客户工银信使服务协议</div>
<p>中国工商银行遵循平等自愿、诚实守信、勤勉尽责的原则,努力为客户提供专业化、高质量的金融服务。在签订本合同之前,特提请客户充分了解工商银行提供的相关金融服务内容及收费标准 ,自主决定是否选择相关金融服务。</p>
<p>
为明确双方的权利和义务,规范双方业务行为,甲方(客户)和乙 方(中国工商银行)本着平等互利的原则,就工银信使服务相关事宜达成本协议。
<p> 一、工银信使服务是指乙方按特定方式向甲方发送电子信息的业务。工银信使发送的方式包括但不限于短信、电子邮件、融e联客户端信息、手机银行客户端信息等。</p>
<p>二、甲方定制乙方工银信使服务,应选定具体的服务项目和发送方式,预留相应的手机号码、电子邮箱等联系信息,并保证预留信息真实、准确。若甲方预留信息变更,应及时通知乙方修改。</p>
<p>三、甲方使用乙方工银信使服务,甲方应向乙方支付相应费用,并同意乙方从其账户自动扣收。具体收费标准及优惠政策等,详见乙方在网站及营业网点公布的《服务价目表》。各项收费如有变动,以乙方最新公告为准。收费相关咨询(投诉)请联系95588或乙方营业网点。</p>
<p>
四、甲方使用乙方工银信使服务,需满足下列要求:
<p>(一)甲方应向乙方提供准确的预留信息,并在预留信息发生变更时及时通知乙方进行修改;</p>
<p>(二)甲方应确保乙方能够正常扣收工银信使服务费用,避免因账户已销户、账户状态不正常、余额不足等原因导致无法正常扣收;</p>
<p>(三)甲方如选择使用融e联客户端、手机银行客户端等互联网方式接收乙方工银信使服务,应保证接收终端使用正常、网络连接畅通并按客户端提示进行正确设置。</p>
<p> 如果甲方未满足上述要求,可能导致乙方无法正常提供工银信使服务,乙方不承担任何责任。因乙方故意或重大过失导致的计算机黑客袭击、系统故障、通讯故障、网络拥堵、供电系统故障、电脑病毒、恶意程序攻击除外。</p>
</p>
<p>
 五、乙方遇到不可抗力、计算机黑客袭击、系统故障、通讯故障、网络拥堵、供电系统故障、电脑病毒、恶意程序攻击及其他不可归因于乙方的情况时,可能导致甲方未收到或延迟收到工银信使信息,乙方不承担任何责任。
</p>
<p>
 六、甲方在下述情况下未及时终止服务的,乙方有权单方终止服务并终止协议:
<p>(一)因甲方手机号码录入错误造成手机机主投诉;</p>
<p>(二)甲方变更手机号码或电子邮箱后未及时通知乙方;</p>
<p>(三)甲方未按期缴纳服务费。</p>
</p>
<p>七、乙方有权根据业务发展需要对工银信使服务功能、服务内容、信息发送方式、收费标准等进行调整,但应通过网站等适当方式提前通告。</p>
<p>八、服务有效期内,如甲方(客户)提前解除或终止本协议,应向乙方(我行)支付违约补偿金,违约补偿金金额为甲方(客户)已缴纳的剩余期限的服务费用。甲方终止信使服务协议后,乙方将终止对甲方提供的所有信使服务。</p>
<p>九、乙方应对甲方提供的信息保密,但法律法规和规章另有规定除外。</p>
<p>十、本协议自甲方签订、在线点击确认或以乙方规定的其他方式签订时起生效。</p>
<p>十一、本协议的成立、生效、履行和解释,均适用中华人民共和国法律。</p>
</p>
</div>       
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
.container {
padding:20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top:20rpx;
font-size:14px;
}
.paragraph .t{
font-size:16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">晋尚学服务协议</div>
感谢您选择晋尚学服务。
<div class="paragraph">
<div class="t bold">第一条 总则</div>
<p>
1、本服务协议(以下简称“本协议”)是太原市茗庐科贸有限公司(以下简称“晋尚学”)与晋尚学用户(以下简称“用户”或“您”)就“人脸服务”(以下简称“本服务”)的使用等相关事项所订立的有效合约。您通过网络页面点击确认或以其他方式选择接受本协议,即表示您与晋尚学已达成协议并同意接受本协议的全部约定内容。
</p>
<p>
2、由于晋尚学服务是本公司依托微信支付提供的服务,在使用本服务前,您应阅读并遵守本协议和<span class="bold">《微信支付用户服务协议》</span><span class="bold">
在接受本协议之前,请您仔细阅读本协议的全部内容,尤其是加粗的文字部分。如果您不同意本协议的任意内容,或者无法准确理解晋尚学对条款的解释,请不要进行后续操作。</span>
</p>
<p class="bold">
3、如您为无民事行为能力人或为限制民事行为能力人,请告知您的监护人,并在您监护人的指导下阅读本协议和使用我们的服务。
</p>
</div>
<div class="paragraph">
<div class="t bold">第二条 定义</div>
<p>1、刷脸服务:指用户开通刷脸服务并完成人脸图片的采集后,用户可通过在商家处扫描人脸即识别您的晋尚学账户信息,并完成相关O2O服务。</p>
</div>
<div class="paragraph">
<div class="t bold">第三条 基础条款</div>
<p>
1、您在开通刷脸服务过程中进行脸部拍摄所得的脸部图片(以下简称“原图”),仅用于达成您的刷脸服务。您应根据晋尚学页面的提示做出相应动作,晋尚学系统判断您的动作符合要求后,即可完成脸部拍摄。晋尚学承诺不通过任何技术手段留存您的任何敏感信息,包括但不限于银行账户账号、账户余额及用于客户鉴别的个人生物识别信息等。
</p>
<p>
2、晋尚学应在现有技术能力上保障刷脸服务的有效、正常运行。
</p>
<p>
3、除本协议另有规定外,晋尚学在提前邮件通知您或在网站公告的情况下,可以单方面终止向您提供刷脸服务,并不承担任何赔偿责任。晋尚学在终止提供刷脸服务后,若发现您之前存在违法或违反本协议目的的使用行为,给晋尚学造成损失的,则晋尚学仍可据此要求您承担相应赔偿责任并保留通过司法途径予以解决的权利。
</p>
<p>
4、晋尚学负责向您提供刷脸服务的咨询,并在晋尚学网站公布功能介绍、使用规则等内容。
</p>
<p>
5、晋尚学应根据<span class="bold"
@click="ToOtherPage('rule')">《晋尚学隐私权政策》</span>的约定严格保护您的信息及使用您在使用本服务过程中留存在晋尚学的相关信息。
</p>
</div>
<div class="paragraph">
<div class="t bold">第四条 刷脸服务特别约定</div>
<p>1、您开通刷脸服务后,可在开通了刷脸服务的商家处直接通过商家收银设备扫描您的人脸直接完成O2O服务,而不需要输入微信账户支付密码。</p>
<p>2、您理解并同意,您使用刷脸服务扫描您人脸的行为,视为您向晋尚学发出了不可撤销地支付、核销等指令;且该行为与您使用微信账户、密码的行为具有相同的法律效力。</p>
<p>3、本协议所称的O2O服务,是指在晋尚学特约商户的线下门店中开展的折扣核销、线下支付等。</p>
<p>4、您理解并同意晋尚学支持的O2O服务将根据市场情况不断进行调整,具体以晋尚学支持的场景为准。</p>
</div>
<div class="paragraph">
<div class="t bold">第五条用户信息的收集和使用</div>
<p>1.您理解并同意,<span
class="bold">您通过网络页面点击确认或以其他方式选择接受本协议时,您即授权我们收集、存储并为提供服务之目的合理使用您的用户信息,包括创建晋尚学账户的登记注册信息,以及基于晋尚学使用产生的消费数据信息等。</span>
</p>
<p>
2.我们出于如下目的,使用您提交以及我们收集的用户信息:
<p>(1)为了向您和您的孩子提供产品服务(如实名认证信息、用来接受验证码的手机号,是继续获得服务的前提;如身份证号、人脸信息是您孩子在学校享受人脸识别产品的认证前提)。</p>
<p>(2)为了维护、改进服务(如您提交的手机号用来接收服务通知和进行服务沟通)。</p>
<p>(3)因校方管理需要提供的消费数据报表内包含您的消费数据信息,或者为您提供您孩子一定时间阶段的个人消费报表而进行的必要数据采集加工。</p>
<p>(4)在法律法规允许的前提下,向您推广、介绍产品。</p>
<p>(5)经您许可的其他用途。</p>
</p>
<p>
3.个人信息不被泄露和买卖的服务保障
<p>
为保障您的信息安全,我们努力采取各种合理的物理、电子和管理方面的安全措施来保护您的信息,使您和您孩子的信息不会被泄露、毁损或者丢失。我们对可能接触到您的信息的员工采取了严格的管理,包括但不限于根据岗位的不同采取不同的权限控制,与他们签署保密协议。晋尚学会按现有技术提供相应的安全措施来保护您的信息,提供合理的安全保障,晋尚学将尽力做到使您的信息不被泄露、毁损或丢失。
<p class="bold">鉴于国家信息中心安全要求,对于您孩子因刷脸消费所采集的人脸信息,由深圳市腾讯计算机系统有限公司进行存管。</p>
</p>
</p>
<p>
4.如您为未成年人的监护人,当您对您所监护的未成年人的信息处理存在疑问时,请通过客服热线<span class="bold">0351-3200799</span>联系我们。更多详情,敬请查阅<span
class="bold" @click="ToOtherPage('privacy')">《晋尚学未成年人个人信息保护规则》</span>
</p>
</div>
<div class="paragraph">
<div class="t bold">第六条 协议修改</div>
<p>
1、晋尚学将有权随时修改本协议的有关条款,一旦相关内容发生变动,晋尚学公司将会通过电子邮件或网站公告等方式向您提示修改内容。
</p>
<p>
2、如果您不同意晋尚学对本协议相关条款所做的修改或者晋尚学不时公布的《晋尚学服务协议》及相关附属规则,您应立即停止使用晋尚学提供的本项服务。如果您继续使用晋尚学提供的服务,则视为您接受并认可本协议相关条款的修改及晋尚学不时公布的《晋尚学服务协议》及相关附属规则。
</p>
</div>
<div class="paragraph bold">
<div class="t bold">第七条 不可抗力、免责及责任限制</div>
<p>免责条款</p>
<p>因下列原因导致我们无法正常提供服务,我们免于承担责任:</p>
<p>1、我们的系统停机维护或升级;</p>
<p>2、因台风、地震、洪水、雷电或恐怖袭击等不可抗力原因;</p>
<p>3、您的电子设备软硬件和通信线路、供电线路出现故障的;</p>
<p>4、因您操作不当或通过非经我们授权或认可的方式使用我们服务的;</p>
<p>5、因病毒、木马、恶意程序攻击、网络拥堵、系统不稳定、系统或设备故障、通讯故障、电力故障、银行原因、第三方服务瑕疵或政府行为等原因。
尽管有前款约定,我们将采取合理行动积极促使服务恢复正常。</p>
</div>
<div class="paragraph">
<div class="t bold">第八条 争议的解决</div>
<p>本协议签订地为中华人民共和国山西省太原市万柏林区人民法院。</p>
<p>双方在履行本协议的过程中,如发生争议,应协商解决。协商不成的,<span class="bold">何一方均可向合同签订地(山西省太原市万柏林区)有管辖权的人民法院提起诉讼。</span></p>
</div>
<div class="paragraph">
<div class="t bold">第九条 协议的解释</div>
<p>本协议的成立、生效、履行和解释,均适用中华人民共和国法律。<span
class="bold">本服务协议未规定部分依照《微信支付用户服务协议》及相关附属规则予以履行;本协议与《微信支付用户服务协议》及相关附属规则不一致的,以本协议为准。</span></p>
</div>
</view>
</template>
<script>
export default {
name: "agreement",
data() {
return {
}
},
onLoad: function(options) {
// AppID
},
methods: {
async ToOtherPage(name) {
uni.navigateTo({
url: `../${name}/main`
})
}
}
}
</script>
<style scoped>
.container {
padding: 20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top: 20rpx;
font-size: 14px;
}
.paragraph .t {
font-size: 16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">晋尚学未成年人个人信息保护规则</div>
<div class="bold" style="text-indent: 2em;">
我们非常理解个人信息对未成年人及其监护人而言的重要性,也感谢未成年人及其监护人对我们的信任。为了更好地保护未成年人信息,除《晋尚学隐私权政策》以外,我们还将通过《晋尚学未成年人个人信息保护规则》(以下简称“本规则”)向未成年人及其监护人说明晋尚学会怎样对外提供未成年人的个人信息(以下简称“未成年人信息”),并说明未成年人及其监护人所享有的权利。为了维护未成年人的合法权益,未成年人应当在其监护人的指导下使用我们的服务。
</div>
<div class="paragraph">
<div class="t bold">一、我们如何收集未成年人信息</div>
<p>
在用户使用我们提供的各项业务功能(以下统称“服务”)的过程中,我们可能需要收集一些信息来向用户提供服务,这些信息当中涉及部分未成年人信息。我们在
<span class="bold"
@click="ToOtherPage('rule')">《晋尚学隐私权政策》</span>当中,结合具体服务逐一说明了需要用户同意我们收集的信息类型与用途以及拒绝同意的后果。
<p class="bold">
当用户使用我们提供的与未成年人有关的服务时,我们在服务中将按照如下约定收集信息:
</p>
</p>
<div class="bold">1.1 校园相关服务</div>
<p>
我们专为学校提供服务(例如:校园人脸支付、电子校园卡等,具体服务以实际提供的为准)。可以按照页面提示输入必要的未成年人信息,例如:姓名、证件号码,我们将与学校进行信息核验。核验通过后,我们将根据机构反馈的信息提供相应的服务。如用户不提供前述信息,可能无法使用校园相关服务。
</p>
<p class="bold">
1.2 我们提供的与未成年人有关的服务是不断迭代更新的。如果我们需要使用本规则尚未说明的有关信息,我们会通过页面提示、协议约定的方式另行说明信息收集的范围、目的与用途,并征得未成年人及其监护人的同意。
</p>
</div>
<div class="paragraph">
<div class="t bold">二、我们如何对外提供未成年人信息</div>
<p>
2.1 我们承诺对未成年人信息进行严格保密,仅在<span class="bold"
@click="ToOtherPage('rule')">《晋尚学隐私权政策》</span>约定的情况下对外提供未成年人信息。
<span class="bold">
如果为了向用户提供服务而需要将未成年人信息共享至第三方,我们会按照法律法规及国家标准的要求征得未成年人及其监护人的同意,或确认第三方已经征得未成年人及其监护人的同意。
</span>
</p>
</div>
<div class="paragraph">
<div class="t bold">三、我们如何存储和保护未成年人信息</div>
<p style="margin-top: 20rpx;">
3.1
我们会按照<span class="bold"
@click="ToOtherPage('rule')">《晋尚学隐私权政策》</span>的约定存储与保护未成年人信息。我们指定了专人负责未成年人信息的保护,严格设定信息访问权限,对可能接触到未成年人信息的工作人员采取最小够用授权原则,并采取技术措施对工作人员处理未成年人信息的行为进行记录和管控,避免违法复制、下载未成年人个人信息。
</p>
<p style="margin-top: 20rpx;">3.2
若不幸发生未成年人信息安全事件,我们将按照法律法规的要求,及时向未成年人及其监护人告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、未成年人及其监护人可自主防范和降低风险的建议、对未成年人及其监护人的补救措施等。我们将及时将事件相关情况以微信推送通知、发送邮件/短消息等方式告知未成年人及其监护人。难以逐一告知时,我们会采取合理、有效的方式发布相关警示信息。同时,我们还将按照监管部门要求,主动上报未成年人信息安全事件的处置情况。若未成年人及其监护人的合法权益受损,我们将承担相应的法律责任。
</p>
<p style="margin-top:20rpx;">3.3
在未成年人终止使用晋尚学服务后,我们会停止对未成年人信息的使用,法律法规或监管部门另有规定的除外。如我们停止运营,我们将及时停止运营的通知以逐一送达或公告的形式进行通知,并对所持有的未成年人信息进行删除。
</p>
</div>
<div class="paragraph">
<div style="margin-top:20rpx;" class="t bold">四、我们如何使用未成年人信息</div>
<p>4.1 为了遵守国家法律法规及监管要求,以及向用户提供服务及提升服务质量,或保障用户的账户和资金安全,我们会按照《晋尚学隐私权政策》及本规则的约定使用未成年人信息。</p>
<p style="margin-top:20rpx;" class="bold">4.2
当我们要将未成年人信息用于《晋尚学隐私权政策》及本规则未载明的其他用途时,会按照法律法规及国家标准的要求再次征得未成年人及其监护人的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">五、如何访问和管理未成年人信息</div>
<p>
5.1 下列情形下,监护人及学校可联系我们,要求删除相应的未成年人信息:
<p>(1)我们违反法律、行政法规的规定或者双方的约定收集、存储、使用、对外提供未成年人信息的;</p>
<p>(2)超出目的范围或者必要期限收集、存储、使用、对外提供未成年人信息的;</p>
<p>(3)未成年人的监护人撤回同意的;</p>
<p>(4)未成年的监护人通过注销等方式终止使用产品或者服务的。</p>
</p>
<p style="margin-top:20rpx;">
5.2
为保障未成年人信息的安全,如发生投诉等情况,我们会在收到投诉后的三个工作日内处理完成,特殊情形下最长将在不超过三十天或法律法规规定期限内作出答复。如未成年人或者其监护人不满意我们的答复,还可以通过电话12315向消费者权益保护部门投诉或向有管辖权的法院提起诉讼。
</p>
</div>
<div class="paragraph bold">
<div class="t bold">六、本规则的适用及更新</div>
<p>
6.1 发生下列重大变化情形时,我们会适时对本规则进行更新:
<p>(1)我们的基本情况发生变化,例如:兼并、收购、重组引起的所有者变更;</p>
<p>(2)收集、存储、使用、对外提供未成年人信息的范围、目的、规则发生变化;</p>
<p>(3)未成年人信息存储的地点、期限和到期后的处理方式发生变化;</p>
<p>(4)数据安全能力、信息安全风险、未成年人信息的安全保障措施发生变化;</p>
<p>(5)拒绝同意的后果发生变化;</p>
<p>(6)用户询问、投诉的渠道和机制,以及外部纠纷解决机构及联络方式发生变化;</p>
<p>(7)更正、删除未成年人信息的途径和方法发生变化;</p>
<p>(8)其他可能对未成年人信息权益产生重大影响的变化。</p>
</p>
<p>如本规则发生更新,我们将以微信推送通知、小程序弹窗提示、发送邮件/短消息或者在晋尚学官方网站发布公告的方式来通知未成年人及其监护人。为了未成年人及其监护人能及时接收到通知,建议未成年人及其监护人在联系方式更新时及时通知我们。如未成年人在本规则更新生效后继续使用晋尚学服务,即表示未成年人及其监护人已充分阅读、理解并接受更新后的规则并愿意受更新后的规则约束。
</p>
</div>
<div class="paragraph bold">
<div class="t bold">七、本规则中关键词说明</div>
<p>7.1 本规则中的“未成年人”是指:不满十四周岁的中华人民共和国公民。</p>
</div>
</view>
</template>
<script>
export default {
name: "privacy",
data() {
return {
}
},
methods: {
async ToOtherPage(name) {
uni.navigateTo({
url: `../${name}/main`
})
}
}
}
</script>
<style scoped>
.container {
padding: 20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top: 20rpx;
font-size: 14px;
}
.paragraph .t {
font-size: 16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">晋尚学隐私权政策</div>
<div class="bold">概述:</div>
<div class="paragraph bold">
<div class="bold">我们深知个人信息对您而言的重要性,也感谢您对我们的信任。我们将通过本政策向您说明晋尚学会如何收集、保护、使用及对外提供您的信息的情况,并说明您享有的权利,其中要点如下:
</div>
<p style="margin-top: 20rpx;">1.为了便于您了解您在使用我们的服务时,我们需要收集的信息类型与用途,我们将结合具体服务向您逐一说明。</p>
<p style="margin-top: 20rpx;">2.为了向您提供服务所需,我们会按照合法、正当、必要的原则收集您的信息。</p>
<p style="margin-top: 20rpx;">
3.如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估该第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意或确认第三方已经征得您的同意。
</p>
<p style="margin-top: 20rpx;">
4.如果为了向您提供服务而需要从第三方获取您的信息,我们将要求第三方说明信息来源,并要求第三方保障其提供信息的合法性;如果我们开展业务需进行的个人信息处理活动超出您原本向第三方提供个人信息时的授权范围,我们将征得您的明确同意。
</p>
<p style="margin-top: 20rpx;">5.您可以通过本政策介绍的方式管理您的信息、注销晋尚学账户或进行投诉举报。</p>
</div>
<div class="paragraph">
<p>太原市茗庐科贸有限公司(注册地址/常用办公地址:太原市杏花岭区晋安东街2号创新大厦102室/太原市万柏林区迎泽西大街20号闫家沟华清苑18号楼5单元11层;联系方式:0351-3200799;以下或称“我们”)尊重并保护您的隐私。您使用我们的服务时,我们将按照晋尚学隐私权政策(以下简称“本政策”)收集、保护、使用及对外提供您的信息。同时,我们会通过本政策向您说明,我们如何为您提供访问、更新、管理和保护您的信息的服务。
<span
class="bold">本政策与您使用我们的服务关系紧密,我们建议您仔细阅读并理解本政策全部内容,做出您认为适当的选择。我们努力用通俗易懂、简明扼要的文字表达,并对本政策中与您的权益存在重大关系的条款和个人敏感信息,采用粗体字进行标注以提示您注意。</span>
</p>
</div>
<div class="paragraph">
<p>为了遵守国家法律法规及监管规定(例如:安全管理),也为了向您提供服务及提升服务质量,我们需要收集、保护、使用及对外提供您的信息。您同意我们按照本政策约定处理您的信息,以便您享受优质、便捷、个性化的服务,同时更好地保护您的账户及资金安全。
</p>
</div>
<div class="paragraph">
<div class="t bold">一、我们如何收集信息</div>
<p>在您使用晋尚学以下各项业务功能(以下简称“服务”)的过程中,我们需要收集您的一些信息,用以向您提供服务、提升我们的服务质量、保障您的账户和资金安全以及符合国家法律法规及监管规定:
<p class="bold">1.登录</p>
<p>在您使用晋尚学服务时,您需提供<span class="bold">手机号码</span> 作为账户登录名。如您不提供前述信息,则无法使用晋尚学服务。</p>
<p class="bold">
2.消费
<p>(1)如果您选择通过晋尚学合作的商业银行进行消费,则需要提供您的Ⅰ类银行账户、银行预留手机号及身份证号码,以便完成验证及开户。如您不提供前述信息,则可能无法完成交易,但不影响您使用我们提供的其他服务。
<p>(2)当您在商家进行消费时,我们需要按照法律法规及监管规定对商家进行管理,防范套现或欺诈风险,因此,我们将直接收集或向商家收集您的交易信息,包括交易金额、交易对象、交易时间。如您不同意我们记录前述信息,则可能无法完成交易,但不影响您使用我们提供的其他服务。
</p>
</p>
<P class="">
3.账单查询
<p>您可以在账单页面查看您的<span class="bold">账单详情</span>(即:您的支付账户交易信息)。如您不提供前述信息,不影响您查看账单详情。</p>
</P>
<p class="bold">
4.客户服务
<p>我们会收集您使用晋尚学服务时您与客户服务团队联系过程中提供的信息,及您参与问卷调查时向我们发送的信息。如您不提供前述信息,不影响您使用我们提供的其他服务。</p>
</P>
<p class="bold">
5.根据相关法律法规及国家标准,在以下情形中,我们可能会依法收集并使用您的个人信息无需征得您的同意:
<p class="bold">(1)与履行国家法律法规及行业主管部门有关规定的义务相关的;</p>
<p class="bold">(2)与国家安全、国防安全直接相关的;</p>
<p class="bold">(3)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p class="bold">(4)与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
<p class="bold">(5)出于维护您或他人的生命、财产等重大合法权益但又很难得到您本人同意的;</p>
<p class="bold">(6)所收集的个人信息是您自行向社会公众公开的;</p>
<p class="bold">(7)从合法公开披露的信息中收集个人信息,例如:合法的新闻报道、政府信息公开等渠道;</p>
<p class="bold">(8)根据您的要求签订和履行合同所必需的;</p>
<p class="bold">(9)用于维护所提供的服务的安全稳定运行所必需的,例如:发现、处置服务的故障;</p>
<p class="bold">(10)法律法规规定的其他情形。</p>
</p>
<p class="bold">
6.其他
<p class="bold">
请您理解,我们向您提供的服务是不断更新和发展的。如果您选择使用了前述说明当中尚未涵盖的其他服务,基于该服务我们需要收集您的信息的,我们会通过页面提示、交互流程、协议约定的方式另行向您说明信息收集的范围与目的,并征得您的同意。我们会按照本政策以及相应的用户协议约定使用、对外提供及保护您的信息;如您选择不提供前述信息,您可能无法使用某项或某部分服务,但不影响您使用我们提供的其他服务。此外,第三方主体可能会通过晋尚学小程序向您提供服务。当您选择第三方主体提供的服务时,请注意相关服务由第三方主体向您提供。涉及到第三方主体向您收集个人信息的,建议您仔细查看第三方主体的隐私政策或协议约定。
</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">二、我们如何保护信息</div>
<p>1.为了保障您的信息安全,我们在收集您的信息后,将采取各种合理必要的措施保护您的信息。例如,在技术开发环境当中,我们仅使用经过去标识化处理的信息进行统计分析。我们会将去标识化后的信息与可用于恢复识别个人的信息分开存储,确保在针对去标识化信息的后续处理中不重新识别个人。
</p>
<p>2.在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以官网公示、微信推送通知、发送邮件/短消息等方式告知您。如果难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。若您的合法权益受损,我们将承担相应的法律责任。
</p>
<p class="bold">
3.请您务必妥善保管好您的晋尚学登录名及其他身份要素。您在使用晋尚学服务时,我们会通过您的登录名及其他身份要素来识别您的身份。一旦您泄漏了前述信息,您可能会蒙受损失,并可能对您产生不利。如您发现晋尚学登录名及/或其他身份要素可能或已经泄露时,请您立即和我们取得联系,以便我们及时采取相应措施以避免或降低相关损失。
</p>
<p>4.在您终止使用晋尚学服务后,我们会停止对您的信息的收集和使用,法律法规或监管部门另有规定的除外。如我们停止运营,我们将及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,并对所持有的您的个人信息进行删除或匿名化处理。
</p>
</div>
<div class="paragraph">
<div class="t bold">三、我们如何使用信息</div>
<p>
1.为了遵守国家法律法规及监管要求,以及向您提供服务及提升服务质量,或保障您的账户和资金安全,我们会在以下情形中使用您的信息:
<p>(1)(1)实现本政策中“我们如何收集信息”所述目的;</p>
<p class="bold">(2)为了使您知晓使用晋尚学服务的状态,我们会向您发送服务提醒。为了保障您的账户和资金安全,付款提醒不可退订;</p>
<p>(3)为了保障服务的稳定性与安全性,保护您的账户与资金安全,我们会将您的信息用于身份验证、安全防范、降低风险及防止风险传导用途;</p>
<p>(4)根据法律法规或监管要求向相关部门进行报告;</p>
<p>(5)邀请您参与我们服务有关的客户调研;</p>
<p class="bold">(6)我们会采取脱敏、去标识化等方式对您的信息进行综合统计、分析加工,以便为您提供更加准确、个性、流畅及便捷的服务,或帮助我们评估、改善或设计服务及运营活动;</p>
<p class="bold">(7)为了提升用户服务体验,为用户推荐更为优质或适合的服务,我们可能会根据用户信息形成群体特征标签,用于向用户提供其可能感兴趣的营销活动通知。</p>
</p>
<p class="bold">2.当我们要将信息用于本政策未载明的其他用途时,会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认动作等形式再次征得您的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">四、我们如何对外提供信息</div>
<p>
1.共享
<p class="bold">(一)业务共享</p>
<p>我们承诺对您的信息进行严格保密。除法律法规及监管部门另有规定外,我们仅在以下情形中与第三方共享您的信息,第三方包括我们合作的金融机构以及其他合作伙伴。如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估该第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施,并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意,或确认第三方已经征得您的同意。
</p>
<p>(1)某些产品或服务可能由第三方提供或由我们与第三方共同提供,因此,<span class="bold">只有共享您的信息,才能提供您需要的产品或服务;</span>
<p>(2)事先获得您明确同意的情况下,我们会在法律法规允许且不违背公序良俗的范围内,依据您的授权范围与第三方共享您的信息。</p>
<p class="bold">(二)投诉处理</p>
<p>当您投诉他人或被他人投诉时,为了保护您及他人的合法权益,维护校园正常购物环境,我们可能会将您的姓名及有效证件号码、联系方式、投诉相关内容提供给消费者权益保护部门及监管机关,以便及时解决投诉纠纷,但法律法规明确禁止提供的除外。
</p>
</p>
<p class="bold">
2.转让
<p>我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</p>
<p class="bold">(1)事先获得您的明确同意;</p>
<p class="bold">(2)根据法律法规或强制性的行政或司法要求;</p>
<p class="bold">
(3)在涉及资产转让、收购、兼并、重组或破产清算时,如涉及到个人信息转让,我们会向您告知有关情况,并要求新的持有您个人信息的公司、组织继续受本政策的约束。如变更个人信息使用目的时,我们将要求该公司、组织重新取得您的明确同意。
</p>
</p>
<p class="bold">
3.委托处理
<p>
为了提升信息处理效率,降低信息处理成本,或提高信息处理准确性,我们可能会委托有能力的专业机构代表我们来处理信息。我们会通过书面协议、现场审计等方式要求受托公司遵守严格的保密义务及采取有效的保密措施,禁止其将这些信息用于未经您授权的用途。在委托关系解除时,受托公司不再保存个人信息。我们承诺对此负责。
</p>
</p>
<p class="bold">
4.根据相关法律法规及国家标准,在以下情形中,我们可能会依法共享、转让、公开披露您的个人信息无需征得您的同意:
<p class="bold">(1)与履行法律法规及行业主管部门规定的义务相关的;</p>
<p class="bold">(2)与国家安全、国防安全直接相关的;</p>
<p class="bold">(3)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p class="bold">(4)与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
<p class="bold">(5)出于维护您或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;</p>
<p class="bold">(6)您自行向社会公众公开的个人信息;</p>
<p class="bold">(7)从合法公开披露的信息中收集的个人信息,例如:合法的新闻报道、政府信息公开等渠道。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">五、您如何访问和管理自己的信息</div>
<div>在您使用晋尚学服务期间,为了您可以更加便捷地访问和管理您的信息,同时保障您注销账户的权利,我们在客户端中为您提供了相应的操作设置,您可以参考下面的指引进行操作。</div>
<p>
1、您的信息管理
<p>(1)如发现您的信息有误,您可以联系我们的客服电话400-9656-210或通过在线客服要求更正。出于安全性和身份识别的考虑或根据法律法规及监管规定,您需通过验证方可修改您已认证的姓名或已绑定的手机号码;
</p>
<p>(2)您可注销绑定的银行卡。</p>
</p>
<p class="bold">
2、您可通过如下路径解约笑脸校园服务:
<p class="bold">(1)晋尚学解约操作路径:微信“我”→“支付”→右上角“…”→“扣费服务”→“校园刷脸扣费服务”→关闭服务;</p>
<p class="bold">(2)电子校园卡解约路径:进入晋尚学小程序→电子校园卡→注销银行卡。</p>
</p>
<p>当您符合约定的账户注销条件并注销晋尚学账户后,您该账户内的所有信息将被清空,我们将不会再使用或对外提供与该账户相关的个人信息,
<span class="bold">但您在使用晋尚学服务期间提供或产生的信息我们仍需按照监管要求的时间进行保存,且在该保存的时间内依法配合有权机关的查询。</span>
</p>
<p>
3、如您发现我们收集、使用您个人信息的行为,违反了法律法规规定或违反了与您的约定,您可联系我们的客服热线0351-3200799或通过在线客服,要求删除相应的信息。
</p>
<p class="bold">
4、尽管有上述约定,但按照相关法律法规及国家标准,在以下情形中,我们可能无法响应您的请求:
<p class="bold">(1)与国家安全、国防安全直接相关的;</p>
<p class="bold">(2)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p class="bold">(3)与犯罪侦查、起诉、审判和执行判决等直接相关的;</p>
<p class="bold">(4)有充分证据表明您存在主观恶意或滥用权利的;</p>
<p class="bold">(5)响应您的请求将导致其他个人、组织的合法权益受到严重损害的;</p>
<p class="bold">(6)涉及商业秘密的。</p>
</p>
<p class="bold">
5、如您对本政策存在任何疑问,或对于您的个人信息处理存在任何投诉、意见,请通过以下渠道联系我们:
<p class="bold">(1)客服热线0351-3200799;</p>
<p class="bold">(2)在线客服:进入晋尚学小程序→右上角“…”→“反馈与投诉”,选择相应的问题反馈类型。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">六、对第三方责任的声明</div>
<p class="bold">
请您注意,通过晋尚学小程序接入的第三方服务(例如:晋尚学小程序中微信提供的人脸信息采集服务)和由晋尚学处接收您的个人信息的第三方可能有自己的隐私权保护政策,当您使用第三方服务时,对它们的使用不受本政策的约束。我们会努力去要求这些主体对您的个人信息采取保护措施,建议您与他们联系以获得关于他们的隐私权政策的详细情况。如您发现这些第三方提供的服务存在风险时,建议您终止相关操作以保护您的合法权益。
</p>
</div>
<div class="paragraph">
<div class="t bold">七、我们如何保护未成年人的信息</div>
<p>1.我们期望监护人(比如未成年人的父母)指导未成年人使用我们的服务。我们将根据国家相关法律法规的规定保护未成年人的信息的保密性及安全性。
<p>2.
<span class="bold">如您为未满14周岁的未成年人,建议请您的监护人阅读本政策,并在征得您监护人的书面同意的前提下使用我们的服务或向我们提供您的信息。</span>
对于经监护人同意而收集您的信息的情况,我们只会在受到法律允许、您的监护人明确同意或者保护您的权益所必要的情况下使用或公开披露此信息。
<span class="bold"> 如您的监护人不同意您按照本政策使用我们的服务或向我们提供信息,请您立即终止使用我们的服务并及时通知我们,以便我们采取相应的措施。</span>
</p>
<p>3.如您为未成年人的监护人,当您对您所监护的未成年人的信息处理存在疑问时,请通过上文中第五款第5项的联系方式联系我们。更多详情,敬请查阅《晋尚学未成年人个人信息保护规则》。</p>
</div>
<div class="paragraph bold">
<div class="t bold">八、本政策的适用及更新</div>
<p>晋尚学所有服务均适用本政策,除非相关服务已有独立的隐私权政策或相应的用户服务协议当中存在特殊约定。</p>
<p>
发生下列重大变化情形时,我们会适时对本政策进行更新:
<p>(1)我们的基本情况发生变化,例如:兼并、收购、重组引起的所有者变更;</p>
<p>(2)收集、使用个人信息的范围、目的、规则发生变化;</p>
<p>(3)对外提供个人信息的对象、范围、目的发生变化;</p>
<p>(4)数据安全能力、信息安全风险发生变化;</p>
<p>(5)用户询问、投诉的渠道和机制,以及外部纠纷解决机构及联络方式发生变化;</p>
<p>(6)其他可能对您的个人信息权益产生重大影响的变化。</p>
</p>
<p>如本政策发生更新,我们将以微信推送通知、弹窗提示、发送邮件/短消息或者在晋尚学官方网站发布公告的方式来通知您。为了您能及时接收到通知,建议您在联系方式更新时及时通知我们。如您在本政策更新生效后继续使用晋尚学服务,即表示您已充分阅读、理解并接受更新后的政策并愿意受更新后的政策约束。
</p>
</div>
<div class="paragraph">
<div class="t bold">九、本政策中关键词说明</div>
<p class="bold">1、本政策中的“身份要素”是指:密码、短信校验码、电话号码、手机号码、证件号码及生物识别信息。</p>
<p class="bold">2、本政策中的“个人敏感信息”是指:身份证件号码、个人生物识别信息、银行账号、财产信息、交易信息、精准定位信息等个人信息。</p>
</div>
</view>
</template>
<script>
export default {
name: "rule",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
.container {
padding: 20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top: 20rpx;
font-size: 14px;
}
.paragraph .t {
font-size: 16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">数字校园服务协议</div>
感谢您选择数字校园服务。
<div class="paragraph">
<div class="t bold">第一条 总则</div>
<p>
1、本服务协议(以下简称“本协议”)是广州市安开信息科技有限公司(以下简称“数字校园”)与数字校园用户(以下简称“用户”或“您”)就“人脸服务”(以下简称“本服务”)的使用等相关事项所订立的有效合约。您通过网络页面点击确认或以其他方式选择接受本协议,即表示您与数字校园已达成协议并同意接受本协议的全部约定内容。
</p>
<p>
2、由于数字校园服务是本公司依托微信支付提供的服务,在使用本服务前,您应阅读并遵守本协议和<span class="bold">《微信支付用户服务协议》</span>。在接受本协议之前,请您仔细阅读本协议的全部内容,<span class="bold">尤其是加粗的文字部分。如果您不同意本协议的任意内容,或者无法准确理解数字校园对条款的解释,请不要进行后续操作。</span>
</p>
<p class="bold">
3、如您为无民事行为能力人或为限制民事行为能力人,请告知您的监护人,并在您监护人的指导下阅读本协议和使用我们的服务。
</p>
</div>
<div class="paragraph">
<div class="t bold">第二条 定义</div>
<p>1、刷脸服务:指用户开通刷脸服务并完成人脸图片的采集后,用户可通过在商家处扫描人脸即识别您的数字校园账户信息,并完成相关O2O服务。</p>
</div>
<div class="paragraph">
<div class="t bold">第三条 基础条款</div>
<p>1、您在开通刷脸服务过程中进行脸部拍摄所得的脸部图片(以下简称“原图”),仅用于达成您的刷脸服务。您应根据数字校园页面的提示做出相应动作,数字校园系统判断您的动作符合要求后,即可完成脸部拍摄。数字校园承诺不通过任何技术手段留存您的任何敏感信息,包括但不限于银行账户账号、账户余额及用于客户鉴别的个人生物识别信息等。
</p>
<p>2、数字校园应在现有技术能力上保障刷脸服务的有效、正常运行。</p>
<p>3、除本协议另有规定外,数字校园在提前邮件通知您或在网站公告的情况下,可以单方面终止向您提供刷脸服务,并不承担任何赔偿责任。数字校园在终止提供刷脸服务后,若发现您之前存在违法或违反本协议目的的使用行为,给数字校园造成损失的,则数字校园仍可据此要求您承担相应赔偿责任并保留通过司法途径予以解决的权利。
</p>
<p>4、数字校园负责向您提供刷脸服务的咨询,并在数字校园网站公布功能介绍、使用规则等内容。</p>
<p>5、数字校园应根据 <span class="bold"
@click="ToOtherPage('rule')">《数字校园隐私权政策》</span>的约定严格保护您的信息及使用您在使用本服务过程中留存在数字校园的相关信息。</p>
</div>
<div class="paragraph">
<div class="t bold">第四条 刷脸服务特别约定</div>
<p>1、您开通刷脸服务后,可在开通了刷脸服务的商家处直接通过商家收银设备扫描您的人脸直接完成O2O服务,而不需要输入微信账户支付密码。</p>
<p>2、您理解并同意,您使用刷脸服务扫描您人脸的行为,视为您向数字校园发出了不可撤销地支付、核销等指令;且该行为与您使用微信账户、密码的行为具有相同的法律效力。</p>
<p>3、本协议所称的O2O服务,是指在数字校园特约商户的线下门店中开展的折扣核销、线下支付等。</p>
<p>4、您理解并同意数字校园支持的O2O服务将根据市场情况不断进行调整,具体以数字校园支持的场景为准。</p>
</div>
<div class="paragraph">
<div class="t bold">第五条用户信息的收集和使用</div>
<p class="bold">
1.您理解并同意,<span class="bold">您通过网络页面点击确认或以其他方式选择接受本协议时,您即授权我们收集、存储并为提供服务之目的合理使用您的用户信息,包括创建数字校园账户的登记注册信息,以及基于数字校园使用产生的消费数据信息等。</span>
</p>
<p>
2.我们出于如下目的,使用您提交以及我们收集的用户信息:
<p>(1)为了向您和您的孩子提供产品服务(如实名认证信息、用来接受验证码的手机号,是继续获得服务的前提;如身份证号、人脸信息是您孩子在学校享受人脸识别产品的认证前提)。</p>
<p>(2)为了维护、改进服务(如您提交的手机号用来接收服务通知和进行服务沟通)。</p>
<p>(3)因校方管理需要提供的消费数据报表内包含您的消费数据信息,或者为您提供您孩子一定时间阶段的个人消费报表而进行的必要数据采集加工。</p>
<p>(4)在法律法规允许的前提下,向您推广、介绍产品。</p>
<p>(5)经您许可的其他用途。</p>
</p>
<p>
3.个人信息不被泄露和买卖的服务保障
<p>
为保障您的信息安全,我们努力采取各种合理的物理、电子和管理方面的安全措施来保护您的信息,使您和您孩子的信息不会被泄露、毁损或者丢失。我们对可能接触到您的信息的员工采取了严格的管理,包括但不限于根据岗位的不同采取不同的权限控制,与他们签署保密协议。数字校园会按现有技术提供相应的安全措施来保护您的信息,提供合理的安全保障,数字校园将尽力做到使您的信息不被泄露、毁损或丢失。
<p class="bold">鉴于国家信息中心安全要求,对于您孩子因刷脸消费所采集的人脸信息,由深圳市腾讯计算机系统有限公司进行存管。</p>
</p>
</p>
<p>4.如您为未成年人的监护人,当您对您所监护的未成年人的信息处理存在疑问时,请通过客服热线<span class="bold">020-22092396</span>联系我们。更多详情,敬请查阅<span
class="bold" @click="ToOtherPage('privacy')">《数字校园未成年人个人信息保护规则》</span></p>
</div>
<div class="paragraph">
<div class="t bold">第六条 协议修改</div>
<p>1、数字校园将有权随时修改本协议的有关条款,一旦相关内容发生变动,数字校园公司将会通过电子邮件或网站公告等方式向您提示修改内容。</p>
<p>2、如果您不同意数字校园对本协议相关条款所做的修改或者数字校园不时公布的《数字校园服务协议》及相关附属规则,您应立即停止使用数字校园提供的本项服务。如果您继续使用数字校园提供的服务,则视为您接受并认可本协议相关条款的修改及数字校园不时公布的《数字校园服务协议》及相关附属规则。
</p>
</div>
<div class="paragraph bold">
<div class="t bold">第七条 不可抗力、免责及责任限制</div>
<p class="bold">免责条款</p>
<p class="bold">因下列原因导致我们无法正常提供服务,我们免于承担责任:</p>
<p class="bold">1、我们的系统停机维护或升级;</p>
<p class="bold">2、因台风、地震、洪水、雷电或恐怖袭击等不可抗力原因;</p>
<p class="bold">3、您的电子设备软硬件和通信线路、供电线路出现故障的;</p>
<p class="bold">4、因您操作不当或通过非经我们授权或认可的方式使用我们服务的;</p>
<p class="bold">5、因病毒、木马、恶意程序攻击、网络拥堵、系统不稳定、系统或设备故障、通讯故障、电力故障、银行原因、第三方服务瑕疵或政府行为等原因。</p>
<p class="bold">尽管有前款约定,我们将采取合理行动积极促使服务恢复正常。</p>
</div>
<div class="paragraph">
<div class="t bold">第八条 争议的解决</div>
<p>本协议签订地为中华人民共和国广东省广州市天河区人民法院。</p>
<p>双方在履行本协议的过程中,如发生争议,应协商解决。协商不成的,<span class="bold">任何一方均可向合同签订地(广东省广州市天河区)有管辖权的人民法院提起诉讼。</span></p>
</div>
<div class="paragraph">
<div class="t bold">第九条 协议的解释</div>
<p>本协议的成立、生效、履行和解释,均适用中华人民共和国法律。<span
class="bold">本服务协议未规定部分依照《微信支付用户服务协议》及相关附属规则予以履行;本协议与《微信支付用户服务协议》及相关附属规则不一致的,以本协议为准。</span> </p>
</div>
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
onLoad: function(options) {
// AppID
},
methods: {
async ToOtherPage(name) {
uni.navigateTo({
url: `../${name}/main`
})
}
}
}
</script>
<style scoped>
.container {
padding: 20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top: 20rpx;
font-size: 14px;
}
.paragraph .t {
font-size: 16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">数字校园未成年人个人信息保护规则</div>
<div class="bold" style="text-indent: 2em;">
我们非常理解个人信息对未成年人及其监护人而言的重要性,也感谢未成年人及其监护人对我们的信任。为了更好地保护未成年人信息,除《数字校园隐私权政策》以外,我们还将通过《数字校园未成年人个人信息保护规则》(以下简称“本规则”)向未成年人及其监护人说明数字校园会怎样对外提供未成年人的个人信息(以下简称“未成年人信息”),并说明未成年人及其监护人所享有的权利。为了维护未成年人的合法权益,未成年人应当在其监护人的指导下使用我们的服务。
</div>
<div class="paragraph">
<div class="t bold">一、我们如何收集未成年人信息</div>
<p>
在用户使用我们提供的各项业务功能(以下统称“服务”)的过程中,我们可能需要收集一些信息来向用户提供服务,这些信息当中涉及部分未成年人信息。我们在《数字校园隐私权政策》当中,结合具体服务逐一说明了需要用户同意我们收集的信息类型与用途以及拒绝同意的后果。<span class="bold">当用户使用我们提供的与未成年人有关的服务时,我们在服务中将按照如下约定收集信息:</span>
</p>
<p class="bold">1.1 校园相关服务</p>
<p>我们专为学校提供服务(例如:校园人脸支付、电子校园卡等,具体服务以实际提供的为准)。可以按照页面提示输入必要的未成年人信息,例如:姓名、证件号码,我们将与学校进行信息核验。核验通过后,我们将根据机构反馈的信息提供相应的服务。如用户不提供前述信息,可能无法使用校园相关服务。</p>
<p class="bold">1.2 我们提供的与未成年人有关的服务是不断迭代更新的。如果我们需要使用本规则尚未说明的有关信息,我们会通过页面提示、协议约定的方式另行说明信息收集的范围、目的与用途,并征得未成年人及其监护人的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">二、我们如何对外提供未成年人信息</div>
<p>2.1 我们承诺对未成年人信息进行严格保密,仅在《数字校园隐私权政策》约定的情况下对外提供未成年人信息。<span class="bold">如果为了向用户提供服务而需要将未成年人信息共享至第三方,我们会按照法律法规及国家标准的要求征得未成年人及其监护人的同意,或确认第三方已经征得未成年人及其监护人的同意。</span> </p>
</div>
<div class="paragraph">
<div class="t bold">三、我们如何存储和保护未成年人信息</div>
<p>3.1 我们会按照《数字校园隐私权政策》的约定存储与保护未成年人信息。我们指定了专人负责未成年人信息的保护,严格设定信息访问权限,对可能接触到未成年人信息的工作人员采取最小够用授权原则,并采取技术措施对工作人员处理未成年人信息的行为进行记录和管控,避免违法复制、下载未成年人个人信息。</p>
<p>3.2 若不幸发生未成年人信息安全事件,我们将按照法律法规的要求,及时向未成年人及其监护人告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、未成年人及其监护人可自主防范和降低风险的建议、对未成年人及其监护人的补救措施等。我们将及时将事件相关情况以微信推送通知、发送邮件/短消息等方式告知未成年人及其监护人。难以逐一告知时,我们会采取合理、有效的方式发布相关警示信息。同时,我们还将按照监管部门要求,主动上报未成年人信息安全事件的处置情况。若未成年人及其监护人的合法权益受损,我们将承担相应的法律责任。</p>
<p>3.3 在未成年人终止使用数字校园服务后,我们会停止对未成年人信息的使用,法律法规或监管部门另有规定的除外。如我们停止运营,我们将及时停止运营的通知以逐一送达或公告的形式进行通知,并对所持有的未成年人信息进行删除。</p>
</div>
<div class="paragraph">
<div class="t bold">四、我们如何使用未成年人信息</div>
<p>4.1 为了遵守国家法律法规及监管要求,以及向用户提供服务及提升服务质量,或保障用户的账户和资金安全,我们会按照《数字校园隐私权政策》及本规则的约定使用未成年人信息。</p>
<p class="bold">4.2 当我们要将未成年人信息用于《数字校园隐私权政策》及本规则未载明的其他用途时,会按照法律法规及国家标准的要求再次征得未成年人及其监护人的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">五、如何访问和管理未成年人信息</div>
<p>
5.1 下列情形下,监护人及学校可联系我们,要求删除相应的未成年人信息:
<p>(1)我们违反法律、行政法规的规定或者双方的约定收集、存储、使用、对外提供未成年人信息的;</p>
<p>(2)超出目的范围或者必要期限收集、存储、使用、对外提供未成年人信息的;</p>
<p>(3)未成年人的监护人撤回同意的;</p>
<p>(4)未成年人的监护人通过注销等方式终止使用产品或者服务的。</p>
</p>
<p>5.2 为保障未成年人信息的安全,如发生投诉等情况,我们会在收到投诉后的三个工作日内处理完成,特殊情形下最长将在不超过三十天或法律法规规定期限内作出答复。如未成年人或者其监护人不满意我们的答复,还可以通过电话12315向消费者权益保护部门投诉或向有管辖权的法院提起诉讼。</p>
</div>
<div class="paragraph">
<div class="t bold">六、本规则的适用及更新</div>
<p class="bold">
6.1 发生下列重大变化情形时,我们会适时对本规则进行更新:
<p class="bold">(1)我们的基本情况发生变化,例如:兼并、收购、重组引起的所有者变更;</p>
<p class="bold">(2)收集、存储、使用、对外提供未成年人信息的范围、目的、规则发生变化;</p>
<p class="bold">(3)未成年人信息存储的地点、期限和到期后的处理方式发生变化;</p>
<p class="bold">(4)数据安全能力、信息安全风险、未成年人信息的安全保障措施发生变化;</p>
<p class="bold">(5)拒绝同意的后果发生变化;</p>
<p class="bold">(6)用户询问、投诉的渠道和机制,以及外部纠纷解决机构及联络方式发生变化;</p>
<p class="bold">(7)更正、删除未成年人信息的途径和方法发生变化;</p>
<p class="bold">(8)其他可能对未成年人信息权益产生重大影响的变化。</p>
</p>
<p class="bold">
如本规则发生更新,我们将以微信推送通知、小程序弹窗提示、发送邮件/短消息或者在数字校园官方网站发布公告的方式来通知未成年人及其监护人。为了未成年人及其监护人能及时接收到通知,建议未成年人及其监护人在联系方式更新时及时通知我们。如未成年人在本规则更新生效后继续使用数字校园服务,即表示未成年人及其监护人已充分阅读、理解并接受更新后的规则并愿意受更新后的规则约束。
</p>
</div>
<div class="paragraph">
<div class="t bold">七、本规则中关键词说明</div>
<p class="bold">7.1 本规则中的“未成年人”是指:不满十四周岁的中华人民共和国公民。</p>
</div>
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
.container {
padding:20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top:20rpx;
font-size:14px;
}
.paragraph .t{
font-size:16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">数字校园隐私权政策</div>
概述:
<div class="paragraph">
<div class="bold">我们深知个人信息对您而言的重要性,也感谢您对我们的信任。我们将通过本政策向您说明数字校园会如何收集、保护、使用及对外提供您的信息的情况,并说明您享有的权利,其中要点如下:</div>
<p class="bold">1.为了便于您了解您在使用我们的服务时,我们需要收集的信息类型与用途,我们将结合具体服务向您逐一说明。</p>
<p class="bold">2.为了向您提供服务所需,我们会按照合法、正当、必要的原则收集您的信息。</p>
<p class="bold">3.如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估该第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意或确认第三方已经征得您的同意。</p>
<p class="bold">4.如果为了向您提供服务而需要从第三方获取您的信息,我们将要求第三方说明信息来源,并要求第三方保障其提供信息的合法性;如果我们开展业务需进行的个人信息处理活动超出您原本向第三方提供个人信息时的授权范围,我们将征得您的明确同意。</p>
<p class="bold">5.您可以通过本政策介绍的方式管理您的信息、注销数字校园账户或进行投诉举报。</p>
</div>
<div class="paragraph">
<p>广州市安开信息科技有限公司(注册地址/常用办公地址:广东省广州市天河区五山路267号瑞华大厦北塔22GH;联系方式:020-22092396;以下或称“我们”)尊重并保护您的隐私。您使用我们的服务时,我们将按照数字校园隐私权政策(以下简称“本政策”)收集、保护、使用及对外提供您的信息。同时,我们会通过本政策向您说明,我们如何为您提供访问、更新、管理和保护您的信息的服务。</p>
</div>
<div class="paragraph bold">
<p>本政策与您使用我们的服务关系紧密,我们建议您仔细阅读并理解本政策全部内容,做出您认为适当的选择。我们努力用通俗易懂、简明扼要的文字表达,并对本政策中与您的权益存在重大关系的条款和个人敏感信息,采用粗体字进行标注以提示您注意。</p>
</div>
<div class="paragraph bold">
<p>为了遵守国家法律法规及监管规定(例如:安全管理),也为了向您提供服务及提升服务质量,我们需要收集、保护、使用及对外提供您的信息。您同意我们按照本政策约定处理您的信息,以便您享受优质、便捷、个性化的服务,同时更好地保护您的账户及资金安全。</p>
</div>
<div class="paragraph">
<div class="t bold">一、我们如何收集信息</div>
<p>在您使用数字校园以下各项业务功能(以下简称“服务”)的过程中,我们需要收集您的一些信息,用以向您提供服务、提升我们的服务质量、保障您的账户和资金安全以及符合国家法律法规及监管规定:</p>
<p class="bold">1.登录</p>
<p>在您使用数字校园服务时,您需提供<span class="bold">手机号码</span>作为账户登录名。如您不提供前述信息,则无法使用数字校园服务。</p>
<p>
<p class="bold">2.消费</p>
<p>(1)如果您选择通过数字校园合作的商业银行进行消费,则需要提供您的<span class="bold">Ⅰ类银行账户、银行预留手机号及身份证号码</span>,以便完成验证及开户。如您不提供前述信息,则可能无法完成交易,但不影响您使用我们提供的其他服务。</p>
<p>(2)当您在商家进行消费时,我们需要按照法律法规及监管规定对商家进行管理,防范套现或欺诈风险,因此,我们将直接收集或向商家收集您的交易信息,包括<span class="bold">交易金额、交易对象、交易时间</span>。如您不同意我们记录前述信息,则可能无法完成交易,但不影响您使用我们提供的其他服务。</p>
</p>
<P>
<p class="bold">3.账单查询</p>
<p>您可以在账单页面查看您的<span class="bold">账单详情</span>(即:您的支付账户交易信息)。如您不提供前述信息,不影响您查看账单详情。</p>
</P>
<P>
<p class="bold">4.客户服务</p>
<p>我们会收集您使用数字校园服务时您与客户服务团队联系过程中提供的信息,及您参与问卷调查时向我们发送的信息。如您不提供前述信息,不影响您使用我们提供的其他服务。</p>
<p class="bold">
5.根据相关法律法规及国家标准,在以下情形中,我们可能会依法收集并使用您的个人信息无需征得您的同意:
<p class="bold">(1)与履行国家法律法规及行业主管部门有关规定的义务相关的;</p>
<p class="bold">(2)与国家安全、国防安全直接相关的;</p>
<p class="bold">(3)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p class="bold">(4)与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
<p class="bold">(5)出于维护您或他人的生命、财产等重大合法权益但又很难得到您本人同意的;</p>
<p class="bold">(6)所收集的个人信息是您自行向社会公众公开的;</p>
<p class="bold">(7)从合法公开披露的信息中收集个人信息,例如:合法的新闻报道、政府信息公开等渠道;</p>
<p class="bold">(8)根据您的要求签订和履行合同所必需的;</p>
<p class="bold">(9)用于维护所提供的服务的安全稳定运行所必需的,例如:发现、处置服务的故障;</p>
<p class="bold">(10)法律法规规定的其他情形。</p>
</p>
<p class="bold">
6.其他
<p class="bold">请您理解,我们向您提供的服务是不断更新和发展的。如果您选择使用了前述说明当中尚未涵盖的其他服务,基于该服务我们需要收集您的信息的,我们会通过页面提示、交互流程、协议约定的方式另行向您说明信息收集的范围与目的,并征得您的同意。我们会按照本政策以及相应的用户协议约定使用、对外提供及保护您的信息;如您选择不提供前述信息,您可能无法使用某项或某部分服务,但不影响您使用我们提供的其他服务。此外,第三方主体可能会通过数字校园小程序向您提供服务。当您选择第三方主体提供的服务时,请注意相关服务由第三方主体向您提供。涉及到第三方主体向您收集个人信息的,建议您仔细查看第三方主体的隐私政策或协议约定。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">二、我们如何保护信息</div>
<p>1.为了保障您的信息安全,我们在收集您的信息后,将采取各种合理必要的措施保护您的信息。例如,在技术开发环境当中,我们仅使用经过去标识化处理的信息进行统计分析。我们会将去标识化后的信息与可用于恢复识别个人的信息分开存储,确保在针对去标识化信息的后续处理中不重新识别个人。</p>
<p>2.在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以官网公示、微信推送通知、发送邮件/短消息等方式告知您。如果难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。若您的合法权益受损,我们将承担相应的法律责任。</p>
<p class="bold">3.请您务必妥善保管好您的数字校园登录名及其他身份要素。您在使用数字校园服务时,我们会通过您的登录名及其他身份要素来识别您的身份。一旦您泄漏了前述信息,您可能会蒙受损失,并可能对您产生不利。如您发现数字校园登录名及/或其他身份要素可能或已经泄露时,请您立即和我们取得联系,以便我们及时采取相应措施以避免或降低相关损失。</p>
<p>4.在您终止使用数字校园服务后,我们会停止对您的信息的收集和使用,法律法规或监管部门另有规定的除外。如我们停止运营,我们将及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,并对所持有的您的个人信息进行删除或匿名化处理。</p>
</div>
<div class="paragraph">
<div class="t bold">三、我们如何使用信息</div>
<p>
1.为了遵守国家法律法规及监管要求,以及向您提供服务及提升服务质量,或保障您的账户和资金安全,我们会在以下情形中使用您的信息:
<p>(1)实现本政策中“我们如何收集信息”所述目的;</p>
<p class="bold">(2)为了使您知晓使用数字校园服务的状态,我们会向您发送服务提醒。为了保障您的账户和资金安全,付款提醒不可退订;</p>
<p>(3)为了保障服务的稳定性与安全性,保护您的账户与资金安全,我们会将您的信息用于身份验证、安全防范、降低风险及防止风险传导用途;</p>
<p>(4)根据法律法规或监管要求向相关部门进行报告;</p>
<p>(5)邀请您参与我们服务有关的客户调研;</p>
<p class="bold">(6)我们会采取脱敏、去标识化等方式对您的信息进行综合统计、分析加工,以便为您提供更加准确、个性、流畅及便捷的服务,或帮助我们评估、改善或设计服务及运营活动;</p>
<p class="bold">(7)为了提升用户服务体验,为用户推荐更为优质或适合的服务,我们可能会根据用户信息形成群体特征标签,用于向用户提供其可能感兴趣的营销活动通知。</p>
</p>
<p class="bold">2.当我们要将信息用于本政策未载明的其他用途时,会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认动作等形式再次征得您的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">四、我们如何对外提供信息</div>
<p>
1.共享
<p class="bold">(一)业务共享</p>
<p>我们承诺对您的信息进行严格保密。除法律法规及监管部门另有规定外,我们仅在以下情形中与第三方共享您的信息,第三方包括我们合作的金融机构以及其他合作伙伴。如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估该第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施,并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意,或确认第三方已经征得您的同意。</p>
<p>(1)某些产品或服务可能由第三方提供或由我们与第三方共同提供,因此,<span class="bold">只有共享您的信息,才能提供您需要的产品或服务;</span></p>
<p>(2)事先获得您明确同意的情况下,我们会在法律法规允许且不违背公序良俗的范围内,依据您的授权范围与第三方共享您的信息。</p>
<p class="bold">(二)投诉处理</p>
<p>当您投诉他人或被他人投诉时,为了保护您及他人的合法权益,维护校园正常购物环境,我们可能会将您的姓名及有效证件号码、联系方式、投诉相关内容提供给消费者权益保护部门及监管机关,以便及时解决投诉纠纷,但法律法规明确禁止提供的除外。</p>
</p>
<p class="bold">
2.转让
<p>我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</p>
<p class="bold">(1)事先获得您的明确同意;</p>
<p class="bold">(2)根据法律法规或强制性的行政或司法要求;</p>
<p class="bold">(3)在涉及资产转让、收购、兼并、重组或破产清算时,如涉及到个人信息转让,我们会向您告知有关情况,并要求新的持有您个人信息的公司、组织继续受本政策的约束。如变更个人信息使用目的时,我们将要求该公司、组织重新取得您的明确同意。</p>
</p>
</p>
<p class="bold">
3.委托处理
<p>
为了提升信息处理效率,降低信息处理成本,或提高信息处理准确性,我们可能会委托有能力的专业机构代表我们来处理信息。我们会通过书面协议、现场审计等方式要求受托公司遵守严格的保密义务及采取有效的保密措施,禁止其将这些信息用于未经您授权的用途。在委托关系解除时,受托公司不再保存个人信息。我们承诺对此负责。
</p>
</p>
<p class="bold">
4.根据相关法律法规及国家标准,在以下情形中,我们可能会依法共享、转让、公开披露您的个人信息无需征得您的同意:
<p class="bold">(1)与履行法律法规及行业主管部门规定的义务相关的;</p>
<p class="bold">(2)与国家安全、国防安全直接相关的;</p>
<p class="bold">(3)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p class="bold">(4)与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
<p class="bold">(5)出于维护您或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;</p>
<p class="bold">(6)您自行向社会公众公开的个人信息;</p>
<p class="bold">(7)从合法公开披露的信息中收集的个人信息,例如:合法的新闻报道、政府信息公开等渠道。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">五、您如何访问和管理自己的信息</div>
<div>在您使用数字校园服务期间,为了您可以更加便捷地访问和管理您的信息,同时保障您注销账户的权利,我们在客户端中为您提供了相应的操作设置,您可以参考下面的指引进行操作。</div>
<p class="bold">
1、您的信息管理
<p>(1)如发现您的信息有误,您可以联系我们的客服电话400-9656-210或通过在线客服要求更正。出于安全性和身份识别的考虑或根据法律法规及监管规定,您需通过验证方可修改您已认证的姓名或已绑定的手机号码;</p>
<p>(2)您可注销绑定的银行卡。</p>
</p>
<p class="bold">
2、您可通过如下路径解约数字校园服务:
<p class="bold">(1)数字校园解约操作路径:微信“我”→“支付”→右上角“…”→“扣费服务”→“校园刷脸扣费服务”→关闭服务;</p>
<p class="bold">(2)电子校园卡解约路径:进入数字校园小程序→电子校园卡→注销银行卡。</p>
</p>
<p>当您符合约定的账户注销条件并注销数字校园账户后,您该账户内的所有信息将被清空,我们将不会再使用或对外提供与该账户相关的个人信息,<span class="bold">但您在使用数字校园服务期间提供或产生的信息我们仍需按照监管要求的时间进行保存,且在该保存的时间内依法配合有权机关的查询。</span></p>
<p>
3、如您发现我们收集、使用您个人信息的行为,违反了法律法规规定或违反了与您的约定,您可联系我们的客服热线0351-3200799或通过在线客服,要求删除相应的信息。
</p>
<p class="bold">
4、尽管有上述约定,但按照相关法律法规及国家标准,在以下情形中,我们可能无法响应您的请求:
<p class="bold">(1)与国家安全、国防安全直接相关的;</p>
<p class="bold">(2)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p class="bold">(3)与犯罪侦查、起诉、审判和执行判决等直接相关的;</p>
<p class="bold">(4)有充分证据表明您存在主观恶意或滥用权利的;</p>
<p class="bold">(5)响应您的请求将导致其他个人、组织的合法权益受到严重损害的;</p>
<p class="bold">(6)涉及商业秘密的。</p>
</p>
<p class="bold">
5、如您对本政策存在任何疑问,或对于您的个人信息处理存在任何投诉、意见,请通过以下渠道联系我们:
<p class="bold">(1)客服热线020-22092396;</p>
<p class="bold">(2)在线客服:进入数字校园小程序→右上角“…”→“反馈与投诉”,选择相应的问题反馈类型。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">六、对第三方责任的声明</div>
<p class="bold">请您注意,通过数字校园小程序接入的第三方服务(例如:数字校园小程序中微信提供的人脸信息采集服务)和由数字校园处接收您的个人信息的第三方可能有自己的隐私权保护政策,当您使用第三方服务时,对它们的使用不受本政策的约束。我们会努力去要求这些主体对您的个人信息采取保护措施,建议您与他们联系以获得关于他们的隐私权政策的详细情况。如您发现这些第三方提供的服务存在风险时,建议您终止相关操作以保护您的合法权益。</p>
</div>
<div class="paragraph">
<div class="t bold">七、我们如何保护未成年人的信息</div>
<p>1.我们期望监护人(比如未成年人的父母)指导未成年人使用我们的服务。我们将根据国家相关法律法规的规定保护未成年人的信息的保密性及安全性。</p>
<p>2.<span class="bold">如您为未满14周岁的未成年人,建议请您的监护人阅读本政策,并在征得您监护人的书面同意的前提下使用我们的服务或向我们提供您的信息。</span>对于经监护人同意而收集您的信息的情况,我们只会在受到法律允许、您的监护人明确同意或者保护您的权益所必要的情况下使用或公开披露此信息。<span class="bold">如您的监护人不同意您按照本政策使用我们的服务或向我们提供信息,请您立即终止使用我们的服务并及时通知我们,以便我们采取相应的措施。</span></p>
<p>3.如您为未成年人的监护人,当您对您所监护的未成年人的信息处理存在疑问时,请通过上文中第五款第5项的联系方式联系我们。更多详情,敬请查阅《数字校园未成年人个人信息保护规则》。</p>
</div>
<div class="paragraph">
<div class="t bold">八、本政策的适用及更新</div>
<p class="bold">数字校园所有服务均适用本政策,除非相关服务已有独立的隐私权政策或相应的用户服务协议当中存在特殊约定。</p>
<p class="bold">
发生下列重大变化情形时,我们会适时对本政策进行更新:
<p class="bold">(1)我们的基本情况发生变化,例如:兼并、收购、重组引起的所有者变更;</p>
<p class="bold">(2)收集、使用个人信息的范围、目的、规则发生变化;</p>
<p class="bold">(3)对外提供个人信息的对象、范围、目的发生变化;</p>
<p class="bold">(4)数据安全能力、信息安全风险发生变化;</p>
<p class="bold">(5)用户询问、投诉的渠道和机制,以及外部纠纷解决机构及联络方式发生变化;</p>
<p class="bold">(6)其他可能对您的个人信息权益产生重大影响的变化。</p>
</p>
<p class="bold">如本政策发生更新,我们将以微信推送通知、弹窗提示、发送邮件/短消息或者在数字校园官方网站发布公告的方式来通知您。为了您能及时接收到通知,建议您在联系方式更新时及时通知我们。如您在本政策更新生效后继续使用数字校园服务,即表示您已充分阅读、理解并接受更新后的政策并愿意受更新后的政策约束。</p>
</div>
<div class="paragraph">
<div class="t bold">九、本政策中关键词说明</div>
<p class="bold">1、本政策中的“身份要素”是指:密码、短信校验码、电话号码、手机号码、证件号码及生物识别信息。</p>
<p class="bold">2、本政策中的“个人敏感信息”是指:身份证件号码、个人生物识别信息、银行账号、财产信息、交易信息、精准定位信息等个人信息。</p>
</div>
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
.container {
padding:20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top:20rpx;
font-size:14px;
}
.paragraph .t{
font-size:16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">笑脸校园服务协议</div>
感谢您选择笑脸校园服务。
<div class="paragraph">
<div class="t bold">第一条 总则</div>
<p>
1、本服务协议(以下简称“本协议”)是北京笑脸校园科技有限公司(以下简称“笑脸校园”)与笑脸校园用户(以下简称“用户”或“您”)就“人脸服务”(以下简称“本服务”)的使用等相关事项所订立的有效合约。您通过网络页面点击确认或以其他方式选择接受本协议,即表示您与笑脸校园已达成协议并同意接受本协议的全部约定内容。
</p>
<p>
2、由于笑脸校园服务是本公司依托微信支付提供的服务,在使用本服务前,您应阅读并遵守本协议和<span class="bold">《微信支付用户服务协议》</span><span
class="bold">在接受本协议之前,请您仔细阅读本协议的全部内容,尤其是加粗的文字部分。如果您不同意本协议的任意内容,或者无法准确理解笑脸校园对条款的解释,请不要进行后续操作</span>
</p>
<p class="bold">
3、如您为无民事行为能力人或为限制民事行为能力人,请告知您的监护人,并在您监护人的指导下阅读本协议和使用我们的服务。
</p>
</div>
<div class="paragraph">
<div class="t bold">第二条 定义</div>
<p>1、刷脸服务:指用户开通刷脸服务并完成人脸图片的采集后,用户可通过在商家处扫描人脸即识别您的笑脸校园账户信息,并完成相关O2O服务。</p>
</div>
<div class="paragraph">
<div class="t bold">第三条 基础条款</div>
<p>
1、您在开通刷脸服务过程中进行脸部拍摄所得的脸部图片(以下简称“原图”),仅用于达成您的刷脸服务。您应根据笑脸校园页面的提示做出相应动作,笑脸校园系统判断您的动作符合要求后,即可完成脸部拍摄。笑脸校园承诺不通过任何技术手段留存您的任何敏感信息,包括但不限于银行账户账号、账户余额及用于客户鉴别的个人生物识别信息等。
</p>
<p>
2、笑脸校园应在现有技术能力上保障刷脸服务的有效、正常运行。
</p>
<p>
3、除本协议另有规定外,笑脸校园在提前邮件通知您或在网站公告的情况下,可以单方面终止向您提供刷脸服务,并不承担任何赔偿责任。笑脸校园在终止提供刷脸服务后,若发现您之前存在违法或违反本协议目的的使用行为,给笑脸校园造成损失的,则笑脸校园仍可据此要求您承担相应赔偿责任并保留通过司法途径予以解决的权利。
</p>
<p>
4、笑脸校园负责向您提供刷脸服务的咨询,并在笑脸校园网站公布功能介绍、使用规则等内容。
</p>
<p>
5、笑脸校园应根据<span class="bold"
@click="ToOtherPage('rule')">《笑脸校园隐私权政策》</span>的约定严格保护您的信息及使用您在使用本服务过程中留存在笑脸校园的相关信息。
</p>
</div>
<div class="paragraph">
<div class="t bold">第四条 刷脸服务特别约定</div>
<p>1、您开通刷脸服务后,可在开通了刷脸服务的商家处直接通过商家收银设备扫描您的人脸直接完成O2O服务,而不需要输入微信账户支付密码。</p>
<p>2、您理解并同意,您使用刷脸服务扫描您人脸的行为,视为您向笑脸校园发出了不可撤销地支付、核销等指令;且该行为与您使用微信账户、密码的行为具有相同的法律效力。</p>
<p>3、本协议所称的O2O服务,是指在笑脸校园特约商户的线下门店中开展的折扣核销、线下支付等。</p>
<p>4、您理解并同意笑脸校园支持的O2O服务将根据市场情况不断进行调整,具体以笑脸校园支持的场景为准。</p>
</div>
<div class="paragraph">
<div class="t bold">第五条用户信息的收集和使用</div>
<p>1.您理解并同意,<span
class="bold">您通过网络页面点击确认或以其他方式选择接受本协议时,您即授权我们收集、存储并为提供服务之目的合理使用您的用户信息,包括创建笑脸校园账户的登记注册信息,以及基于笑脸校园使用产生的消费数据信息等。</span>
</p>
<p>
2.我们出于如下目的,使用您提交以及我们收集的用户信息:
<p>(1)为了向您和您的孩子提供产品服务(如实名认证信息、用来接受验证码的手机号,是继续获得服务的前提;如身份证号、人脸信息是您孩子在学校享受人脸识别产品的认证前提)。</p>
<p>(2)为了维护、改进服务(如您提交的手机号用来接收服务通知和进行服务沟通)。</p>
<p>(3)因校方管理需要提供的消费数据报表内包含您的消费数据信息,或者为您提供您孩子一定时间阶段的个人消费报表而进行的必要数据采集加工。</p>
<p>(4)在法律法规允许的前提下,向您推广、介绍产品。</p>
<p>(5)经您许可的其他用途。</p>
</p>
<p>
3.个人信息不被泄露和买卖的服务保障
<p>
为保障您的信息安全,我们努力采取各种合理的物理、电子和管理方面的安全措施来保护您的信息,使您和您孩子的信息不会被泄露、毁损或者丢失。我们对可能接触到您的信息的员工采取了严格的管理,包括但不限于根据岗位的不同采取不同的权限控制,与他们签署保密协议。笑脸校园会按现有技术提供相应的安全措施来保护您的信息,提供合理的安全保障,笑脸校园将尽力做到使您的信息不被泄露、毁损或丢失。
<p class="bold">鉴于国家信息中心安全要求,对于您孩子因刷脸消费所采集的人脸信息,由深圳市腾讯计算机系统有限公司进行存管。</p>
</p>
</p>
<p>
4.如您为未成年人的监护人,当您对您所监护的未成年人的信息处理存在疑问时,请通过客服热线<span class="bold">400-1661-276</span>联系我们。更多详情,敬请查阅<span
class="bold" @click="ToOtherPage('privacy')">《笑脸校园未成年人个人信息保护规则》</span>
</p>
</div>
<div class="paragraph">
<div class="t bold">第六条 协议修改</div>
<p>
1、笑脸校园将有权随时修改本协议的有关条款,一旦相关内容发生变动,笑脸校园公司将会通过电子邮件或网站公告等方式向您提示修改内容。
</p>
<p>
2、如果您不同意笑脸校园对本协议相关条款所做的修改或者笑脸校园不时公布的《笑脸校园服务协议》及相关附属规则,您应立即停止使用笑脸校园提供的本项服务。如果您继续使用笑脸校园提供的服务,则视为您接受并认可本协议相关条款的修改及笑脸校园不时公布的《笑脸校园服务协议》及相关附属规则。
</p>
</div>
<div class="paragraph bold">
<div class="t bold">第七条 不可抗力、免责及责任限制</div>
<p>免责条款</p>
<p>因下列原因导致我们无法正常提供服务,我们免于承担责任:</p>
<p>1、我们的系统停机维护或升级;</p>
<p>2、因台风、地震、洪水、雷电或恐怖袭击等不可抗力原因;</p>
<p>3、您的电子设备软硬件和通信线路、供电线路出现故障的;</p>
<p>4、因您操作不当或通过非经我们授权或认可的方式使用我们服务的;</p>
<p>5、因病毒、木马、恶意程序攻击、网络拥堵、系统不稳定、系统或设备故障、通讯故障、电力故障、银行原因、第三方服务瑕疵或政府行为等原因。
尽管有前款约定,我们将采取合理行动积极促使服务恢复正常。</p>
</div>
<div class="paragraph">
<div class="t bold">第八条 争议的解决</div>
<p>本协议签订地为中华人民共和国北京市海淀区人民法院。</p>
<p>双方在履行本协议的过程中,如发生争议,应协商解决。协商不成的,<span class="bold">任何一方均可向合同签订地(北京市海淀区)有管辖权的人民法院提起诉讼</span></p>
</div>
<div class="paragraph">
<div class="t bold">第九条 协议的解释</div>
<p>本协议的成立、生效、履行和解释,均适用中华人民共和国法律。<span
class="bold">本服务协议未规定部分依照《微信支付用户服务协议》及相关附属规则予以履行;本协议与《微信支付用户服务协议》及相关附属规则不一致的,以本协议为准</span></p>
</div>
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
onLoad: function(options) {
// AppID
},
methods: {
async ToOtherPage(name) {
uni.navigateTo({
url: `../${name}/main`
})
}
}
}
</script>
<style scoped>
.container {
padding: 20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top: 20rpx;
font-size: 14px;
}
.paragraph .t {
font-size: 16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">笑脸校园未成年人个人信息保护规则</div>
<div class="bold" style="text-indent: 2em;">
我们非常理解个人信息对未成年人及其监护人而言的重要性,也感谢未成年人及其监护人对我们的信任。为了更好地保护未成年人信息,除《笑脸校园隐私权政策》以外,我们还将通过《笑脸校园未成年人个人信息保护规则》(以下简称“本规则”)向未成年人及其监护人说明笑脸校园会怎样对外提供未成年人的个人信息(以下简称“未成年人信息”),并说明未成年人及其监护人所享有的权利。为了维护未成年人的合法权益,未成年人应当在其监护人的指导下使用我们的服务。
</div>
<div class="paragraph">
<div class="t bold">一、我们如何收集未成年人信息</div>
<p>
在用户使用我们提供的各项业务功能(以下统称“服务”)的过程中,我们可能需要收集一些信息来向用户提供服务,这些信息当中涉及部分未成年人信息。我们在《笑脸校园隐私权政策》当中,结合具体服务逐一说明了需要用户同意我们收集的信息类型与用途以及拒绝同意的后果。当用户使用我们提供的与未成年人有关的服务时,我们在服务中将按照如下约定收集信息:
</p>
<p>1.1 校园相关服务</p>
<p>
我们专为学校提供服务(例如:校园人脸支付、电子校园卡等,具体服务以实际提供的为准)。可以按照页面提示输入必要的未成年人信息,例如:姓名、证件号码,我们将与学校进行信息核验。核验通过后,我们将根据机构反馈的信息提供相应的服务。如用户不提供前述信息,可能无法使用校园相关服务。
</p>
<p>
1.2 我们提供的与未成年人有关的服务是不断迭代更新的。如果我们需要使用本规则尚未说明的有关信息,我们会通过页面提示、协议约定的方式另行说明信息收集的范围、目的与用途,并征得未成年人及其监护人的同意。
</p>
</div>
<div class="paragraph">
<div class="t bold">二、我们如何对外提供未成年人信息</div>
<p>
2.1 我们承诺对未成年人信息进行严格保密,仅在《笑脸校园隐私权政策》约定的情况下对外提供未成年人信息。如果为了向用户提供服务而需要将未成年人信息共享至第三方,我们会按照法律法规及国家标准的要求征得未成年人及其监护人的同意,或确认第三方已经征得未成年人及其监护人的同意。
</p>
</div>
<div class="paragraph">
<div class="t bold">三、我们如何存储和保护未成年人信息</div>
<p>
3.1 我们会按照《笑脸校园隐私权政策》的约定存储与保护未成年人信息。我们指定了专人负责未成年人信息的保护,严格设定信息访问权限,对可能接触到未成年人信息的工作人员采取最小够用授权原则,并采取技术措施对工作人员处理未成年人信息的行为进行记录和管控,避免违法复制、下载未成年人个人信息。
</p>
<p>3.2 若不幸发生未成年人信息安全事件,我们将按照法律法规的要求,及时向未成年人及其监护人告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、未成年人及其监护人可自主防范和降低风险的建议、对未成年人及其监护人的补救措施等。我们将及时将事件相关情况以微信推送通知、发送邮件/短消息等方式告知未成年人及其监护人。难以逐一告知时,我们会采取合理、有效的方式发布相关警示信息。同时,我们还将按照监管部门要求,主动上报未成年人信息安全事件的处置情况。若未成年人及其监护人的合法权益受损,我们将承担相应的法律责任。</p>
<p>3.3 在未成年人终止使用笑脸校园服务后,我们会停止对未成年人信息的使用,法律法规或监管部门另有规定的除外。如我们停止运营,我们将及时停止运营的通知以逐一送达或公告的形式进行通知,并对所持有的未成年人信息进行删除。</p>
</div>
<div class="paragraph">
<div class="t bold">四、我们如何使用未成年人信息</div>
<p>4.1 为了遵守国家法律法规及监管要求,以及向用户提供服务及提升服务质量,或保障用户的账户和资金安全,我们会按照《笑脸校园隐私权政策》及本规则的约定使用未成年人信息。</p>
<p>4.2 当我们要将未成年人信息用于《笑脸校园隐私权政策》及本规则未载明的其他用途时,会按照法律法规及国家标准的要求再次征得未成年人及其监护人的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">五、如何访问和管理未成年人信息</div>
<p>
5.1 下列情形下,监护人及学校可联系我们,要求删除相应的未成年人信息:
<p>(1)我们违反法律、行政法规的规定或者双方的约定收集、存储、使用、对外提供未成年人信息的;</p>
<p>(2)超出目的范围或者必要期限收集、存储、使用、对外提供未成年人信息的;</p>
<p>(3)未成年人的监护人撤回同意的;</p>
<p>(4)未成年的监护人通过注销等方式终止使用产品或者服务的。</p>
</p>
<p>
5.2 为保障未成年人信息的安全,如发生投诉等情况,我们会在收到投诉后的三个工作日内处理完成,特殊情形下最长将在不超过三十天或法律法规规定期限内作出答复。如未成年人或者其监护人不满意我们的答复,还可以通过电话12315向消费者权益保护部门投诉或向有管辖权的法院提起诉讼。
</p>
</div>
<div class="paragraph">
<div class="t bold">六、本规则的适用及更新</div>
<p>
6.1 发生下列重大变化情形时,我们会适时对本规则进行更新:
<p>(1)我们的基本情况发生变化,例如:兼并、收购、重组引起的所有者变更;</p>
<p>(2)收集、存储、使用、对外提供未成年人信息的范围、目的、规则发生变化;</p>
<p>(3)未成年人信息存储的地点、期限和到期后的处理方式发生变化;</p>
<p>(4)数据安全能力、信息安全风险、未成年人信息的安全保障措施发生变化;</p>
<p>(5)拒绝同意的后果发生变化;</p>
<p>(6)用户询问、投诉的渠道和机制,以及外部纠纷解决机构及联络方式发生变化;</p>
<p>(7)更正、删除未成年人信息的途径和方法发生变化;</p>
<p>(8)其他可能对未成年人信息权益产生重大影响的变化。</p>
</p>
<p>如本规则发生更新,我们将以微信推送通知、小程序弹窗提示、发送邮件/短消息或者在笑脸校园官方网站发布公告的方式来通知未成年人及其监护人。为了未成年人及其监护人能及时接收到通知,建议未成年人及其监护人在联系方式更新时及时通知我们。如未成年人在本规则更新生效后继续使用笑脸校园服务,即表示未成年人及其监护人已充分阅读、理解并接受更新后的规则并愿意受更新后的规则约束。</p>
</div>
<div class="paragraph">
<div class="t bold">七、本规则中关键词说明</div>
<p>7.1 本规则中的“未成年人”是指:不满十四周岁的中华人民共和国公民。</p>
</div>
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
.container {
padding:20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top:20rpx;
font-size:14px;
}
.paragraph .t{
font-size:16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">笑脸校园隐私权政策</div>
概述:
<div class="paragraph">
<div class="bold">我们深知个人信息对您而言的重要性,也感谢您对我们的信任。我们将通过本政策向您说明笑脸校园会如何收集、保护、使用及对外提供您的信息的情况,并说明您享有的权利,其中要点如下:</div>
<p>1.为了便于您了解您在使用我们的服务时,我们需要收集的信息类型与用途,我们将结合具体服务向您逐一说明。</p>
<p>2.为了向您提供服务所需,我们会按照合法、正当、必要的原则收集您的信息。</p>
<p>3.如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估该第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意或确认第三方已经征得您的同意。</p>
<p>4.如果为了向您提供服务而需要从第三方获取您的信息,我们将要求第三方说明信息来源,并要求第三方保障其提供信息的合法性;如果我们开展业务需进行的个人信息处理活动超出您原本向第三方提供个人信息时的授权范围,我们将征得您的明确同意。</p>
<p>5.您可以通过本政策介绍的方式管理您的信息、注销笑脸校园账户或进行投诉举报。</p>
</div>
<div class="paragraph bold">
<p>北京笑脸校园科技有限公司(注册地址/常用办公地址:北京市海淀区高梁桥斜街59号院6号楼2层202-20;联系方式:4001661276;以下或称“我们”)尊重并保护您的隐私。您使用我们的服务时,我们将按照笑脸校园隐私权政策(以下简称“本政策”)收集、保护、使用及对外提供您的信息。同时,我们会通过本政策向您说明,我们如何为您提供访问、更新、管理和保护您的信息的服务。本政策与您使用我们的服务关系紧密,我们建议您仔细阅读并理解本政策全部内容,做出您认为适当的选择。我们努力用通俗易懂、简明扼要的文字表达,并对本政策中与您的权益存在重大关系的条款和个人敏感信息,采用粗体字进行标注以提示您注意。</p>
</div>
<div class="paragraph bold">
<p>为了遵守国家法律法规及监管规定(例如:安全管理),也为了向您提供服务及提升服务质量,我们需要收集、保护、使用及对外提供您的信息。您同意我们按照本政策约定处理您的信息,以便您享受优质、便捷、个性化的服务,同时更好地保护您的账户及资金安全。</p>
</div>
<div class="paragraph">
<div class="t bold">一、我们如何收集信息</div>
<p>在您使用笑脸校园以下各项业务功能(以下简称“服务”)的过程中,我们需要收集您的一些信息,用以向您提供服务、提升我们的服务质量、保障您的账户和资金安全以及符合国家法律法规及监管规定:</p>
<p>1.登录</p>
<p>在您使用笑脸校园服务时,您需提供手机号码作为账户登录名。如您不提供前述信息,则无法使用笑脸校园服务。</p>
<p>
2.消费
<p>(1)如果您选择通过笑脸校园合作的商业银行进行消费,则需要提供您的Ⅰ类银行账户、银行预留手机号及身份证号码,以便完成验证及开户。如您不提供前述信息,则可能无法完成交易,但不影响您使用我们提供的其他服务。</p>
<p>(2)当您在商家进行消费时,我们需要按照法律法规及监管规定对商家进行管理,防范套现或欺诈风险,因此,我们将直接收集或向商家收集您的交易信息,包括交易金额、交易对象、交易时间。如您不同意我们记录前述信息,则可能无法完成交易,但不影响您使用我们提供的其他服务。</p>
</p>
<P>
3.账单查询
<p>您可以在账单页面查看您的账单详情(即:您的支付账户交易信息)。如您不提供前述信息,不影响您查看账单详情。</p>
</P>
<P>
4.客户服务
<p>我们会收集您使用笑脸校园服务时您与客户服务团队联系过程中提供的信息,及您参与问卷调查时向我们发送的信息。如您不提供前述信息,不影响您使用我们提供的其他服务。</p>
</P>
<p>
5.根据相关法律法规及国家标准,在以下情形中,我们可能会依法收集并使用您的个人信息无需征得您的同意:
<p>(1)与履行国家法律法规及行业主管部门有关规定的义务相关的;</p>
<p>(2)与国家安全、国防安全直接相关的;</p>
<p>(3)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p>(4)与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
<p>(5)出于维护您或他人的生命、财产等重大合法权益但又很难得到您本人同意的;</p>
<p>(6)所收集的个人信息是您自行向社会公众公开的;</p>
<p>(7)从合法公开披露的信息中收集个人信息,例如:合法的新闻报道、政府信息公开等渠道;</p>
<p>(8)根据您的要求签订和履行合同所必需的;</p>
<p>(9)用于维护所提供的服务的安全稳定运行所必需的,例如:发现、处置服务的故障;</p>
<p>(10)法律法规规定的其他情形。</p>
</p>
<p>
6.其他
<p>请您理解,我们向您提供的服务是不断更新和发展的。如果您选择使用了前述说明当中尚未涵盖的其他服务,基于该服务我们需要收集您的信息的,我们会通过页面提示、交互流程、协议约定的方式另行向您说明信息收集的范围与目的,并征得您的同意。我们会按照本政策以及相应的用户协议约定使用、对外提供及保护您的信息;如您选择不提供前述信息,您可能无法使用某项或某部分服务,但不影响您使用我们提供的其他服务。此外,第三方主体可能会通过笑脸校园小程序向您提供服务。当您选择第三方主体提供的服务时,请注意相关服务由第三方主体向您提供。涉及到第三方主体向您收集个人信息的,建议您仔细查看第三方主体的隐私政策或协议约定。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">二、我们如何保护信息</div>
<p>1.为了保障您的信息安全,我们在收集您的信息后,将采取各种合理必要的措施保护您的信息。例如,在技术开发环境当中,我们仅使用经过去标识化处理的信息进行统计分析。我们会将去标识化后的信息与可用于恢复识别个人的信息分开存储,确保在针对去标识化信息的后续处理中不重新识别个人。</p>
<p>2.在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以官网公示、微信推送通知、发送邮件/短消息等方式告知您。如果难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。若您的合法权益受损,我们将承担相应的法律责任。</p>
<p>3.请您务必妥善保管好您的笑脸校园登录名及其他身份要素。您在使用笑脸校园服务时,我们会通过您的登录名及其他身份要素来识别您的身份。一旦您泄漏了前述信息,您可能会蒙受损失,并可能对您产生不利。如您发现笑脸校园登录名及/或其他身份要素可能或已经泄露时,请您立即和我们取得联系,以便我们及时采取相应措施以避免或降低相关损失。</p>
<p>4.在您终止使用笑脸校园服务后,我们会停止对您的信息的收集和使用,法律法规或监管部门另有规定的除外。如我们停止运营,我们将及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,并对所持有的您的个人信息进行删除或匿名化处理。</p>
</div>
<div class="paragraph">
<div class="t bold">三、我们如何使用信息</div>
<p>
1.为了遵守国家法律法规及监管要求,以及向您提供服务及提升服务质量,或保障您的账户和资金安全,我们会在以下情形中使用您的信息:
<p>(1)实现本政策中“我们如何收集信息”所述目的;</p>
<p>(2)为了使您知晓使用笑脸校园服务的状态,我们会向您发送服务提醒。为了保障您的账户和资金安全,付款提醒不可退订;</p>
<p>(3)为了保障服务的稳定性与安全性,保护您的账户与资金安全,我们会将您的信息用于身份验证、安全防范、降低风险及防止风险传导用途;</p>
<p>(4)根据法律法规或监管要求向相关部门进行报告;</p>
<p>(5)邀请您参与我们服务有关的客户调研;</p>
<p>(6)我们会采取脱敏、去标识化等方式对您的信息进行综合统计、分析加工,以便为您提供更加准确、个性、流畅及便捷的服务,或帮助我们评估、改善或设计服务及运营活动;</p>
<p>(7)为了提升用户服务体验,为用户推荐更为优质或适合的服务,我们可能会根据用户信息形成群体特征标签,用于向用户提供其可能感兴趣的营销活动通知。</p>
</p>
<p>2.当我们要将信息用于本政策未载明的其他用途时,会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认动作等形式再次征得您的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">四、我们如何对外提供信息</div>
<p>
1.共享
<p>(一)业务共享</p>
<p>我们承诺对您的信息进行严格保密。除法律法规及监管部门另有规定外,我们仅在以下情形中与第三方共享您的信息,第三方包括我们合作的金融机构以及其他合作伙伴。如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估该第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施,并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意,或确认第三方已经征得您的同意。</p>
<p>(1)某些产品或服务可能由第三方提供或由我们与第三方共同提供,因此,只有共享您的信息,才能提供您需要的产品或服务;</p>
<p>(2)事先获得您明确同意的情况下,我们会在法律法规允许且不违背公序良俗的范围内,依据您的授权范围与第三方共享您的信息。</p>
<p>(二)投诉处理</p>
<p>当您投诉他人或被他人投诉时,为了保护您及他人的合法权益,维护校园正常购物环境,我们可能会将您的姓名及有效证件号码、联系方式、投诉相关内容提供给消费者权益保护部门及监管机关,以便及时解决投诉纠纷,但法律法规明确禁止提供的除外。</p>
</p>
<p>
2.转让
<p>我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</p>
<p>(1)事先获得您的明确同意;</p>
<p>(2)根据法律法规或强制性的行政或司法要求;</p>
<p>(3)在涉及资产转让、收购、兼并、重组或破产清算时,如涉及到个人信息转让,我们会向您告知有关情况,并要求新的持有您个人信息的公司、组织继续受本政策的约束。如变更个人信息使用目的时,我们将要求该公司、组织重新取得您的明确同意。</p>
</p>
<p>
3.委托处理
<p>
为了提升信息处理效率,降低信息处理成本,或提高信息处理准确性,我们可能会委托有能力的专业机构代表我们来处理信息。我们会通过书面协议、现场审计等方式要求受托公司遵守严格的保密义务及采取有效的保密措施,禁止其将这些信息用于未经您授权的用途。在委托关系解除时,受托公司不再保存个人信息。我们承诺对此负责。
</p>
</p>
<p>
4.根据相关法律法规及国家标准,在以下情形中,我们可能会依法共享、转让、公开披露您的个人信息无需征得您的同意:
<p>(1)与履行法律法规及行业主管部门规定的义务相关的;</p>
<p>(2)与国家安全、国防安全直接相关的;</p>
<p>(3)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p>(4)与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
<p>(5)出于维护您或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;</p>
<p>(6)您自行向社会公众公开的个人信息;</p>
<p>(7)从合法公开披露的信息中收集的个人信息,例如:合法的新闻报道、政府信息公开等渠道。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">五、您如何访问和管理自己的信息</div>
<div>在您使用笑脸校园服务期间,为了您可以更加便捷地访问和管理您的信息,同时保障您注销账户的权利,我们在客户端中为您提供了相应的操作设置,您可以参考下面的指引进行操作。</div>
<p>
1、您的信息管理
<p>(1)如发现您的信息有误,您可以联系我们的客服电话400-9656-210或通过在线客服要求更正。出于安全性和身份识别的考虑或根据法律法规及监管规定,您需通过验证方可修改您已认证的姓名或已绑定的手机号码;</p>
<p>(2)您可注销绑定的银行卡。</p>
</p>
<p>
2、您可通过如下路径解约笑脸校园服务:
<p>(1)笑脸校园解约操作路径:微信“我”→“支付”→右上角“…”→“扣费服务”→“校园刷脸扣费服务”→关闭服务;</p>
<p>(2)电子校园卡解约路径:进入笑脸校园小程序→电子校园卡→注销银行卡。</p>
</p>
<p>当您符合约定的账户注销条件并注销笑脸校园账户后,您该账户内的所有信息将被清空,我们将不会再使用或对外提供与该账户相关的个人信息,但您在使用笑脸校园服务期间提供或产生的信息我们仍需按照监管要求的时间进行保存,且在该保存的时间内依法配合有权机关的查询。</p>
<p>
3、如您发现我们收集、使用您个人信息的行为,违反了法律法规规定或违反了与您的约定,您可联系我们的客服热线400-1661-276或通过在线客服,要求删除相应的信息。
</p>
<p>
4、尽管有上述约定,但按照相关法律法规及国家标准,在以下情形中,我们可能无法响应您的请求:
<p>(1)与国家安全、国防安全直接相关的;</p>
<p>(2)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p>(3)与犯罪侦查、起诉、审判和执行判决等直接相关的;</p>
<p>(4)有充分证据表明您存在主观恶意或滥用权利的;</p>
<p>(5)响应您的请求将导致其他个人、组织的合法权益受到严重损害的;</p>
<p>(6)涉及商业秘密的。</p>
</p>
<p>
5、如您对本政策存在任何疑问,或对于您的个人信息处理存在任何投诉、意见,请通过以下渠道联系我们:
<p>(1)客服热线400-1661-276;</p>
<p>(2)在线客服:进入笑脸校园小程序→右上角“…”→“反馈与投诉”,选择相应的问题反馈类型。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">六、对第三方责任的声明</div>
<p>请您注意,通过笑脸校园小程序接入的第三方服务(例如:笑脸校园小程序中微信提供的人脸信息采集服务)和由笑脸校园处接收您的个人信息的第三方可能有自己的隐私权保护政策,当您使用第三方服务时,对它们的使用不受本政策的约束。我们会努力去要求这些主体对您的个人信息采取保护措施,建议您与他们联系以获得关于他们的隐私权政策的详细情况。如您发现这些第三方提供的服务存在风险时,建议您终止相关操作以保护您的合法权益。</p>
</div>
<div class="paragraph">
<div class="t bold">七、我们如何保护未成年人的信息</div>
<p>1.我们期望监护人(比如未成年人的父母)指导未成年人使用我们的服务。我们将根据国家相关法律法规的规定保护未成年人的信息的保密性及安全性。</p>
<p>2.如您为未满14周岁的未成年人,建议请您的监护人阅读本政策,并在征得您监护人的书面同意的前提下使用我们的服务或向我们提供您的信息。对于经监护人同意而收集您的信息的情况,我们只会在受到法律允许、您的监护人明确同意或者保护您的权益所必要的情况下使用或公开披露此信息。如您的监护人不同意您按照本政策使用我们的服务或向我们提供信息,请您立即终止使用我们的服务并及时通知我们,以便我们采取相应的措施。</p>
<p>3.如您为未成年人的监护人,当您对您所监护的未成年人的信息处理存在疑问时,请通过上文中第五款第5项的联系方式联系我们。更多详情,敬请查阅《笑脸校园未成年人个人信息保护规则》。</p>
</div>
<div class="paragraph">
<div class="t bold">八、本政策的适用及更新</div>
<p>笑脸校园所有服务均适用本政策,除非相关服务已有独立的隐私权政策或相应的用户服务协议当中存在特殊约定。</p>
<p>
发生下列重大变化情形时,我们会适时对本政策进行更新:
<p>(1)我们的基本情况发生变化,例如:兼并、收购、重组引起的所有者变更;</p>
<p>(2)收集、使用个人信息的范围、目的、规则发生变化;</p>
<p>(3)对外提供个人信息的对象、范围、目的发生变化;</p>
<p>(4)数据安全能力、信息安全风险发生变化;</p>
<p>(5)用户询问、投诉的渠道和机制,以及外部纠纷解决机构及联络方式发生变化;</p>
<p>(6)其他可能对您的个人信息权益产生重大影响的变化。</p>
</p>
<p>如本政策发生更新,我们将以微信推送通知、弹窗提示、发送邮件/短消息或者在笑脸校园官方网站发布公告的方式来通知您。为了您能及时接收到通知,建议您在联系方式更新时及时通知我们。如您在本政策更新生效后继续使用笑脸校园服务,即表示您已充分阅读、理解并接受更新后的政策并愿意受更新后的政策约束。</p>
</div>
<div class="paragraph">
<div class="t bold">九、本政策中关键词说明</div>
<p>1、本政策中的“身份要素”是指:密码、短信校验码、电话号码、手机号码、证件号码及生物识别信息。</p>
<p>2、本政策中的“个人敏感信息”是指:身份证件号码、个人生物识别信息、银行账号、财产信息、交易信息、精准定位信息等个人信息。</p>
</div>
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
.container {
padding:20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top:20rpx;
font-size:14px;
}
.paragraph .t{
font-size:16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">校智付服务协议</div>
感谢您选择校智付服务。
<div class="paragraph">
<div class="t bold">第一条 总则</div>
<p>
1、本服务协议(以下简称“本协议”)是湖南校智付网络科技有限公司(以下简称“校智付”)与校智付用户(以下简称“用户”或“您”)就“人脸服务”(以下简称“本服务”)的使用等相关事项所订立的有效合约。您通过网络页面点击确认或以其他方式选择接受本协议,即表示您与校智付已达成协议并同意接受本协议的全部约定内容。
</p>
<p>
2、由于校智付服务是本公司依托微信支付提供的服务,在使用本服务前,您应阅读并遵守本协议和<span class="bold">《微信支付用户服务协议》</span><span
class="bold">在接受本协议之前,请您仔细阅读本协议的全部内容,尤其是加粗的文字部分。如果您不同意本协议的任意内容,或者无法准确理解校智付对条款的解释,请不要进行后续操作。</span>
</p>
<p class="bold">
3、如您为无民事行为能力人或为限制民事行为能力人,请告知您的监护人,并在您监护人的指导下阅读本协议和使用我们的服务。
</p>
</div>
<div class="paragraph">
<div class="t bold">第二条 定义</div>
<p>1、刷脸服务:指用户开通刷脸服务并完成人脸图片的采集后,用户可通过在商家处扫描人脸即识别您的校智付账户信息,并完成相关O2O服务。</p>
</div>
<div class="paragraph">
<div class="t bold">第三条 基础条款</div>
<p>1、您在开通刷脸服务过程中进行脸部拍摄所得的脸部图片(以下简称“原图”),仅用于达成您的刷脸服务。您应根据校智付页面的提示做出相应动作,校智付系统判断您的动作符合要求后,即可完成脸部拍摄。校智付承诺不通过任何技术手段留存您的任何敏感信息,包括但不限于银行账户账号、账户余额及用于客户鉴别的个人生物识别信息等。
</p>
<p>2、校智付应在现有技术能力上保障刷脸服务的有效、正常运行。</p>
<p>3、除本协议另有规定外,校智付在提前邮件通知您或在网站公告的情况下,可以单方面终止向您提供刷脸服务,并不承担任何赔偿责任。校智付在终止提供刷脸服务后,若发现您之前存在违法或违反本协议目的的使用行为,给校智付造成损失的,则校智付仍可据此要求您承担相应赔偿责任并保留通过司法途径予以解决的权利。
</p>
<p>4、校智付负责向您提供刷脸服务的咨询,并在校智付网站公布功能介绍、使用规则等内容。</p>
<p>5、校智付应根据 <span class="bold"
@click="ToOtherPage('rule')">《校智付隐私权政策》</span>的约定严格保护您的信息及使用您在使用本服务过程中留存在校智付的相关信息。</p>
</div>
<div class="paragraph">
<div class="t bold">第四条 刷脸服务特别约定</div>
<p>1、您开通刷脸服务后,可在开通了刷脸服务的商家处直接通过商家收银设备扫描您的人脸直接完成O2O服务,而不需要输入微信账户支付密码。</p>
<p>2、您理解并同意,您使用刷脸服务扫描您人脸的行为,视为您向校智付发出了不可撤销地支付、核销等指令;且该行为与您使用微信账户、密码的行为具有相同的法律效力。</p>
<p>3、本协议所称的O2O服务,是指在校智付特约商户的线下门店中开展的折扣核销、线下支付等。</p>
<p>4、您理解并同意校智付支持的O2O服务将根据市场情况不断进行调整,具体以校智付支持的场景为准。</p>
</div>
<div class="paragraph">
<div class="t bold">第五条用户信息的收集和使用</div>
<p class="bold">
1.您理解并同意,您通过网络页面点击确认或以其他方式选择接受本协议时,您即授权我们收集、存储并为提供服务之目的合理使用您的用户信息,包括创建校智付账户的登记注册信息,以及基于校智付使用产生的消费数据信息等。
</p>
<p>
2.我们出于如下目的,使用您提交以及我们收集的用户信息:
<p>(1)为了向您和您的孩子提供产品服务(如实名认证信息、用来接受验证码的手机号,是继续获得服务的前提;如身份证号、人脸信息是您孩子在学校享受人脸识别产品的认证前提)。</p>
<p>(2)为了维护、改进服务(如您提交的手机号用来接收服务通知和进行服务沟通)。</p>
<p>(3)因校方管理需要提供的消费数据报表内包含您的消费数据信息,或者为您提供您孩子一定时间阶段的个人消费报表而进行的必要数据采集加工。</p>
<p>(4)在法律法规允许的前提下,向您推广、介绍产品。</p>
<p>(5)经您许可的其他用途。</p>
</p>
<p>
3.个人信息不被泄露和买卖的服务保障
<p>
为保障您的信息安全,我们努力采取各种合理的物理、电子和管理方面的安全措施来保护您的信息,使您和您孩子的信息不会被泄露、毁损或者丢失。我们对可能接触到您的信息的员工采取了严格的管理,包括但不限于根据岗位的不同采取不同的权限控制,与他们签署保密协议。校智付会按现有技术提供相应的安全措施来保护您的信息,提供合理的安全保障,校智付将尽力做到使您的信息不被泄露、毁损或丢失。
<p class="bold">鉴于国家信息中心安全要求,对于您孩子因刷脸消费所采集的人脸信息,由深圳市腾讯计算机系统有限公司进行存管。</p>
</p>
</p>
<p>4.如您为未成年人的监护人,当您对您所监护的未成年人的信息处理存在疑问时,请通过客服热线<span class="bold">400-9656-210</span>联系我们。更多详情,敬请查阅<span
class="bold" @click="ToOtherPage('privacy')">《校智付未成年人个人信息保护规则》</span></p>
</div>
<div class="paragraph">
<div class="t bold">第六条 协议修改</div>
<p>1、校智付将有权随时修改本协议的有关条款,一旦相关内容发生变动,校智付公司将会通过电子邮件或网站公告等方式向您提示修改内容。</p>
<p>2、如果您不同意校智付对本协议相关条款所做的修改或者校智付不时公布的《校智付服务协议》及相关附属规则,您应立即停止使用校智付提供的本项服务。如果您继续使用校智付提供的服务,则视为您接受并认可本协议相关条款的修改及校智付不时公布的《校智付服务协议》及相关附属规则。
</p>
</div>
<div class="paragraph bold">
<div class="t bold">第七条 不可抗力、免责及责任限制</div>
<p>免责条款</p>
<p>因下列原因导致我们无法正常提供服务,我们免于承担责任:</p>
<p>1、我们的系统停机维护或升级;</p>
<p>2、因台风、地震、洪水、雷电或恐怖袭击等不可抗力原因;</p>
<p>3、您的电子设备软硬件和通信线路、供电线路出现故障的;</p>
<p>4、因您操作不当或通过非经我们授权或认可的方式使用我们服务的;</p>
<p>5、因病毒、木马、恶意程序攻击、网络拥堵、系统不稳定、系统或设备故障、通讯故障、电力故障、银行原因、第三方服务瑕疵或政府行为等原因。
尽管有前款约定,我们将采取合理行动积极促使服务恢复正常。</p>
</div>
<div class="paragraph">
<div class="t bold">第八条 争议的解决</div>
<p>本协议签订地为中华人民共和国湖南省长沙市岳麓区人民法院。</p>
<p>双方在履行本协议的过程中,如发生争议,应协商解决。协商不成的,<span class="bold">任何一方均可向合同签订地(长沙市岳麓区)有管辖权的人民法院提起诉讼。</span></p>
</div>
<div class="paragraph">
<div class="t bold">第九条 协议的解释</div>
<p>本协议的成立、生效、履行和解释,均适用中华人民共和国法律。<span
class="bold">本服务协议未规定部分依照《微信支付用户服务协议》及相关附属规则予以履行;本协议与《微信支付用户服务协议》及相关附属规则不一致的,以本协议为准</span></p>
</div>
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
onLoad: function(options) {
// AppID
},
methods: {
async ToOtherPage(name) {
uni.navigateTo({
url: `../${name}/main`
})
}
}
}
</script>
<style scoped>
.container {
padding: 20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top: 20rpx;
font-size: 14px;
}
.paragraph .t {
font-size: 16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">校智付未成年人个人信息保护规则</div>
<div class="bold" style="text-indent: 2em;">
我们非常理解个人信息对未成年人及其监护人而言的重要性,也感谢未成年人及其监护人对我们的信任。为了更好地保护未成年人信息,除《校智付隐私权政策》以外,我们还将通过《校智付未成年人个人信息保护规则》(以下简称“本规则”)向未成年人及其监护人说明校智付会怎样对外提供未成年人的个人信息(以下简称“未成年人信息”),并说明未成年人及其监护人所享有的权利。为了维护未成年人的合法权益,未成年人应当在其监护人的指导下使用我们的服务。
</div>
<div class="paragraph">
<div class="t bold">一、我们如何收集未成年人信息</div>
<p>
在用户使用我们提供的各项业务功能(以下统称“服务”)的过程中,我们可能需要收集一些信息来向用户提供服务,这些信息当中涉及部分未成年人信息。我们在《校智付隐私权政策》当中,结合具体服务逐一说明了需要用户同意我们收集的信息类型与用途以及拒绝同意的后果。当用户使用我们提供的与未成年人有关的服务时,我们在服务中将按照如下约定收集信息:
</p>
<p>1.1 校园相关服务</p>
<p>我们专为学校提供服务(例如:校园人脸支付、电子校园卡等,具体服务以实际提供的为准)。可以按照页面提示输入必要的未成年人信息,例如:姓名、证件号码,我们将与学校进行信息核验。核验通过后,我们将根据机构反馈的信息提供相应的服务。如用户不提供前述信息,可能无法使用校园相关服务。</p>
<p>1.2 我们提供的与未成年人有关的服务是不断迭代更新的。如果我们需要使用本规则尚未说明的有关信息,我们会通过页面提示、协议约定的方式另行说明信息收集的范围、目的与用途,并征得未成年人及其监护人的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">二、我们如何对外提供未成年人信息</div>
<p>2.1 我们承诺对未成年人信息进行严格保密,仅在《校智付隐私权政策》约定的情况下对外提供未成年人信息。如果为了向用户提供服务而需要将未成年人信息共享至第三方,我们会按照法律法规及国家标准的要求征得未成年人及其监护人的同意,或确认第三方已经征得未成年人及其监护人的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">三、我们如何存储和保护未成年人信息</div>
<p>3.1 我们会按照《校智付隐私权政策》的约定存储与保护未成年人信息。我们指定了专人负责未成年人信息的保护,严格设定信息访问权限,对可能接触到未成年人信息的工作人员采取最小够用授权原则,并采取技术措施对工作人员处理未成年人信息的行为进行记录和管控,避免违法复制、下载未成年人个人信息。</p>
<p>3.2 若不幸发生未成年人信息安全事件,我们将按照法律法规的要求,及时向未成年人及其监护人告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、未成年人及其监护人可自主防范和降低风险的建议、对未成年人及其监护人的补救措施等。我们将及时将事件相关情况以微信推送通知、发送邮件/短消息等方式告知未成年人及其监护人。难以逐一告知时,我们会采取合理、有效的方式发布相关警示信息。同时,我们还将按照监管部门要求,主动上报未成年人信息安全事件的处置情况。若未成年人及其监护人的合法权益受损,我们将承担相应的法律责任。</p>
<p>3.3 在未成年人终止使用校智付服务后,我们会停止对未成年人信息的使用,法律法规或监管部门另有规定的除外。如我们停止运营,我们将及时停止运营的通知以逐一送达或公告的形式进行通知,并对所持有的未成年人信息进行删除。</p>
</div>
<div class="paragraph">
<div class="t bold">四、我们如何使用未成年人信息</div>
<p>4.1 为了遵守国家法律法规及监管要求,以及向用户提供服务及提升服务质量,或保障用户的账户和资金安全,我们会按照《校智付隐私权政策》及本规则的约定使用未成年人信息。</p>
<p>4.2 当我们要将未成年人信息用于《校智付隐私权政策》及本规则未载明的其他用途时,会按照法律法规及国家标准的要求再次征得未成年人及其监护人的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">五、如何访问和管理未成年人信息</div>
<p>
5.1 下列情形下,监护人及学校可联系我们,要求删除相应的未成年人信息:
<p>(1)我们违反法律、行政法规的规定或者双方的约定收集、存储、使用、对外提供未成年人信息的;</p>
<p>(2)超出目的范围或者必要期限收集、存储、使用、对外提供未成年人信息的;</p>
<p>(3)未成年人的监护人撤回同意的;</p>
<p>(4)未成年人的监护人通过注销等方式终止使用产品或者服务的。</p>
</p>
<p>5.2 为保障未成年人信息的安全,如发生投诉等情况,我们会在收到投诉后的三个工作日内处理完成,特殊情形下最长将在不超过三十天或法律法规规定期限内作出答复。如未成年人或者其监护人不满意我们的答复,还可以通过电话12315向消费者权益保护部门投诉或向有管辖权的法院提起诉讼。</p>
</div>
<div class="paragraph">
<div class="t bold">六、本规则的适用及更新</div>
<p>
6.1 发生下列重大变化情形时,我们会适时对本规则进行更新:
<p>(1)我们的基本情况发生变化,例如:兼并、收购、重组引起的所有者变更;</p>
<p>(2)收集、存储、使用、对外提供未成年人信息的范围、目的、规则发生变化;</p>
<p>(3)未成年人信息存储的地点、期限和到期后的处理方式发生变化;</p>
<p>(4)数据安全能力、信息安全风险、未成年人信息的安全保障措施发生变化;</p>
<p>(5)拒绝同意的后果发生变化;</p>
<p>(6)用户询问、投诉的渠道和机制,以及外部纠纷解决机构及联络方式发生变化;</p>
<p>(7)更正、删除未成年人信息的途径和方法发生变化;</p>
<p>(8)其他可能对未成年人信息权益产生重大影响的变化。</p>
</p>
<p>
如本规则发生更新,我们将以微信推送通知、小程序弹窗提示、发送邮件/短消息或者在校智付官方网站发布公告的方式来通知未成年人及其监护人。为了未成年人及其监护人能及时接收到通知,建议未成年人及其监护人在联系方式更新时及时通知我们。如未成年人在本规则更新生效后继续使用校智付服务,即表示未成年人及其监护人已充分阅读、理解并接受更新后的规则并愿意受更新后的规则约束。
</p>
</div>
<div class="paragraph">
<div class="t bold">七、本规则中关键词说明</div>
<p>7.1 本规则中的“未成年人”是指:不满十四周岁的中华人民共和国公民。</p>
</div>
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
.container {
padding:20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top:20rpx;
font-size:14px;
}
.paragraph .t{
font-size:16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<div class="title">校智付隐私权政策</div>
概述:
<div class="paragraph">
<div class="bold">我们深知个人信息对您而言的重要性,也感谢您对我们的信任。我们将通过本政策向您说明校智付会如何收集、保护、使用及对外提供您的信息的情况,并说明您享有的权利,其中要点如下:</div>
<p>1.为了便于您了解您在使用我们的服务时,我们需要收集的信息类型与用途,我们将结合具体服务向您逐一说明。</p>
<p>2.为了向您提供服务所需,我们会按照合法、正当、必要的原则收集您的信息。</p>
<p>3.如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估该第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意或确认第三方已经征得您的同意。</p>
<p>4.如果为了向您提供服务而需要从第三方获取您的信息,我们将要求第三方说明信息来源,并要求第三方保障其提供信息的合法性;如果我们开展业务需进行的个人信息处理活动超出您原本向第三方提供个人信息时的授权范围,我们将征得您的明确同意。</p>
<p>5.您可以通过本政策介绍的方式管理您的信息、注销校智付账户或进行投诉举报。</p>
</div>
<div class="paragraph bold">
<p>湖南校智付网络科技有限公司(注册地址/常用办公地址:长沙高新开发区岳麓西大道588号芯城科技园5栋1201房;联系方式:0731-83869906;以下或称“我们”)尊重并保护您的隐私。您使用我们的服务时,我们将按照校智付隐私权政策(以下简称“本政策”)收集、保护、使用及对外提供您的信息。同时,我们会通过本政策向您说明,我们如何为您提供访问、更新、管理和保护您的信息的服务。本政策与您使用我们的服务关系紧密,我们建议您仔细阅读并理解本政策全部内容,做出您认为适当的选择。我们努力用通俗易懂、简明扼要的文字表达,并对本政策中与您的权益存在重大关系的条款和个人敏感信息,采用粗体字进行标注以提示您注意。</p>
</div>
<div class="paragraph bold">
<p>为了遵守国家法律法规及监管规定(例如:安全管理),也为了向您提供服务及提升服务质量,我们需要收集、保护、使用及对外提供您的信息。您同意我们按照本政策约定处理您的信息,以便您享受优质、便捷、个性化的服务,同时更好地保护您的账户及资金安全。</p>
</div>
<div class="paragraph">
<div class="t bold">一、我们如何收集信息</div>
<p>在您使用校智付以下各项业务功能(以下简称“服务”)的过程中,我们需要收集您的一些信息,用以向您提供服务、提升我们的服务质量、保障您的账户和资金安全以及符合国家法律法规及监管规定:</p>
<p>1.登录</p>
<p>在您使用校智付服务时,您需提供手机号码作为账户登录名。如您不提供前述信息,则无法使用校智付服务。</p>
<p>
2.消费
<p>(1)如果您选择通过校智付合作的商业银行进行消费,则需要提供您的Ⅰ类银行账户、银行预留手机号及身份证号码,以便完成验证及开户。如您不提供前述信息,则可能无法完成交易,但不影响您使用我们提供的其他服务。</p>
<p>(2)当您在商家进行消费时,我们需要按照法律法规及监管规定对商家进行管理,防范套现或欺诈风险,因此,我们将直接收集或向商家收集您的交易信息,包括交易金额、交易对象、交易时间。如您不同意我们记录前述信息,则可能无法完成交易,但不影响您使用我们提供的其他服务。</p>
</p>
<P>
3.账单查询
<p>您可以在账单页面查看您的账单详情(即:您的支付账户交易信息)。如您不提供前述信息,不影响您查看账单详情。</p>
</P>
<P>
4.客户服务
<p>我们会收集您使用校智付服务时您与客户服务团队联系过程中提供的信息,及您参与问卷调查时向我们发送的信息。如您不提供前述信息,不影响您使用我们提供的其他服务。
<p>
5.根据相关法律法规及国家标准,在以下情形中,我们可能会依法收集并使用您的个人信息无需征得您的同意:
<p>(1)与履行国家法律法规及行业主管部门有关规定的义务相关的;</p>
<p>(2)与国家安全、国防安全直接相关的;</p>
<p>(3)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p>(4)与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
<p>(5)出于维护您或他人的生命、财产等重大合法权益但又很难得到您本人同意的;</p>
<p>(6)所收集的个人信息是您自行向社会公众公开的;</p>
<p>(7)从合法公开披露的信息中收集个人信息,例如:合法的新闻报道、政府信息公开等渠道;</p>
<p>(8)根据您的要求签订和履行合同所必需的;</p>
<p>(9)用于维护所提供的服务的安全稳定运行所必需的,例如:发现、处置服务的故障;</p>
<p>(10)法律法规规定的其他情形。</p>
</p>
<p>
6.其他
<p>请您理解,我们向您提供的服务是不断更新和发展的。如果您选择使用了前述说明当中尚未涵盖的其他服务,基于该服务我们需要收集您的信息的,我们会通过页面提示、交互流程、协议约定的方式另行向您说明信息收集的范围与目的,并征得您的同意。我们会按照本政策以及相应的用户协议约定使用、对外提供及保护您的信息;如您选择不提供前述信息,您可能无法使用某项或某部分服务,但不影响您使用我们提供的其他服务。此外,第三方主体可能会通过校智付小程序向您提供服务。当您选择第三方主体提供的服务时,请注意相关服务由第三方主体向您提供。涉及到第三方主体向您收集个人信息的,建议您仔细查看第三方主体的隐私政策或协议约定。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">二、我们如何保护信息</div>
<p>1.为了保障您的信息安全,我们在收集您的信息后,将采取各种合理必要的措施保护您的信息。例如,在技术开发环境当中,我们仅使用经过去标识化处理的信息进行统计分析。我们会将去标识化后的信息与可用于恢复识别个人的信息分开存储,确保在针对去标识化信息的后续处理中不重新识别个人。</p>
<p>2.在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以官网公示、微信推送通知、发送邮件/短消息等方式告知您。如果难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。若您的合法权益受损,我们将承担相应的法律责任。</p>
<p>3.请您务必妥善保管好您的校智付登录名及其他身份要素。您在使用校智付服务时,我们会通过您的登录名及其他身份要素来识别您的身份。一旦您泄漏了前述信息,您可能会蒙受损失,并可能对您产生不利。如您发现校智付登录名及/或其他身份要素可能或已经泄露时,请您立即和我们取得联系,以便我们及时采取相应措施以避免或降低相关损失。</p>
<p>4.在您终止使用校智付服务后,我们会停止对您的信息的收集和使用,法律法规或监管部门另有规定的除外。如我们停止运营,我们将及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,并对所持有的您的个人信息进行删除或匿名化处理。</p>
</div>
<div class="paragraph">
<div class="t bold">三、我们如何使用信息</div>
<p>
1.为了遵守国家法律法规及监管要求,以及向您提供服务及提升服务质量,或保障您的账户和资金安全,我们会在以下情形中使用您的信息:
<p>(1)实现本政策中“我们如何收集信息”所述目的;</p>
<p>(2)为了使您知晓使用校智付服务的状态,我们会向您发送服务提醒。为了保障您的账户和资金安全,付款提醒不可退订;</p>
<p>(3)为了保障服务的稳定性与安全性,保护您的账户与资金安全,我们会将您的信息用于身份验证、安全防范、降低风险及防止风险传导用途;</p>
<p>(4)根据法律法规或监管要求向相关部门进行报告;</p>
<p>(5)邀请您参与我们服务有关的客户调研;</p>
<p>(6)我们会采取脱敏、去标识化等方式对您的信息进行综合统计、分析加工,以便为您提供更加准确、个性、流畅及便捷的服务,或帮助我们评估、改善或设计服务及运营活动;</p>
<p>(7)为了提升用户服务体验,为用户推荐更为优质或适合的服务,我们可能会根据用户信息形成群体特征标签,用于向用户提供其可能感兴趣的营销活动通知。</p>
</p>
<p>2.当我们要将信息用于本政策未载明的其他用途时,会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认动作等形式再次征得您的同意。</p>
</div>
<div class="paragraph">
<div class="t bold">四、我们如何对外提供信息</div>
<p>
1.共享
<p>(一)业务共享</p>
<p>我们承诺对您的信息进行严格保密。除法律法规及监管部门另有规定外,我们仅在以下情形中与第三方共享您的信息,第三方包括我们合作的金融机构以及其他合作伙伴。如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估该第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施,并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意,或确认第三方已经征得您的同意。</p>
<p>(1)某些产品或服务可能由第三方提供或由我们与第三方共同提供,因此,只有共享您的信息,才能提供您需要的产品或服务;</p>
<p>(2)事先获得您明确同意的情况下,我们会在法律法规允许且不违背公序良俗的范围内,依据您的授权范围与第三方共享您的信息。</p>
<p>(二)投诉处理</p>
<p>当您投诉他人或被他人投诉时,为了保护您及他人的合法权益,维护校园正常购物环境,我们可能会将您的姓名及有效证件号码、联系方式、投诉相关内容提供给消费者权益保护部门及监管机关,以便及时解决投诉纠纷,但法律法规明确禁止提供的除外。</p>
</p>
<p>
2.转让
<p>我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</p>
<p>(1)事先获得您的明确同意;</p>
<p>(2)根据法律法规或强制性的行政或司法要求;</p>
<p>(3)在涉及资产转让、收购、兼并、重组或破产清算时,如涉及到个人信息转让,我们会向您告知有关情况,并要求新的持有您个人信息的公司、组织继续受本政策的约束。如变更个人信息使用目的时,我们将要求该公司、组织重新取得您的明确同意。</p>
</p>
<p>
3.委托处理
<p>
为了提升信息处理效率,降低信息处理成本,或提高信息处理准确性,我们可能会委托有能力的专业机构代表我们来处理信息。我们会通过书面协议、现场审计等方式要求受托公司遵守严格的保密义务及采取有效的保密措施,禁止其将这些信息用于未经您授权的用途。在委托关系解除时,受托公司不再保存个人信息。我们承诺对此负责。
</p>
</p>
<p>
4.根据相关法律法规及国家标准,在以下情形中,我们可能会依法共享、转让、公开披露您的个人信息无需征得您的同意:
<p>(1)与履行法律法规及行业主管部门规定的义务相关的;</p>
<p>(2)与国家安全、国防安全直接相关的;</p>
<p>(3)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p>(4)与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
<p>(5)出于维护您或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;</p>
<p>(6)您自行向社会公众公开的个人信息;</p>
<p>(7)从合法公开披露的信息中收集的个人信息,例如:合法的新闻报道、政府信息公开等渠道。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">五、您如何访问和管理自己的信息</div>
<div>在您使用校智付服务期间,为了您可以更加便捷地访问和管理您的信息,同时保障您注销账户的权利,我们在客户端中为您提供了相应的操作设置,您可以参考下面的指引进行操作。</div>
<p>
1、您的信息管理
<p>(1)如发现您的信息有误,您可以联系我们的客服电话400-9656-210或通过在线客服要求更正。出于安全性和身份识别的考虑或根据法律法规及监管规定,您需通过验证方可修改您已认证的姓名或已绑定的手机号码;</p>
<p>(2)您可注销绑定的银行卡。</p>
</p>
<p>
2、您可通过如下路径解约校智付服务:
<p>(1)校智付解约操作路径:微信“我”→“支付”→右上角“…”→“扣费服务”→“校园刷脸扣费服务”→关闭服务;</p>
<p>(2)电子校园卡解约路径:进入校智付小程序→电子校园卡→注销银行卡。</p>
</p>
<p>当您符合约定的账户注销条件并注销校智付账户后,您该账户内的所有信息将被清空,我们将不会再使用或对外提供与该账户相关的个人信息,但您在使用校智付服务期间提供或产生的信息我们仍需按照监管要求的时间进行保存,且在该保存的时间内依法配合有权机关的查询。</p>
<p>
3、如您发现我们收集、使用您个人信息的行为,违反了法律法规规定或违反了与您的约定,您可联系我们的客服热线400-9656-210或通过在线客服,要求删除相应的信息。
</p>
<p>
4、尽管有上述约定,但按照相关法律法规及国家标准,在以下情形中,我们可能无法响应您的请求:
<p>(1)与国家安全、国防安全直接相关的;</p>
<p>(2)与公共安全、公共卫生、重大公共利益直接相关的;</p>
<p>(3)与犯罪侦查、起诉、审判和执行判决等直接相关的;</p>
<p>(4)有充分证据表明您存在主观恶意或滥用权利的;</p>
<p>(5)响应您的请求将导致其他个人、组织的合法权益受到严重损害的;</p>
<p>(6)涉及商业秘密的。</p>
</p>
<p>
5、如您对本政策存在任何疑问,或对于您的个人信息处理存在任何投诉、意见,请通过以下渠道联系我们:
<p>(1)客服热线400-9656-210</p>
<p>(2)在线客服:进入校智付小程序→右上角“…”→“反馈与投诉”,选择相应的问题反馈类型。</p>
</p>
</div>
<div class="paragraph">
<div class="t bold">六、对第三方责任的声明</div>
<p>请您注意,通过校智付小程序接入的第三方服务(例如:校智付小程序中微信提供的人脸信息采集服务)和由校智付处接收您的个人信息的第三方可能有自己的隐私权保护政策,当您使用第三方服务时,对它们的使用不受本政策的约束。我们会努力去要求这些主体对您的个人信息采取保护措施,建议您与他们联系以获得关于他们的隐私权政策的详细情况。如您发现这些第三方提供的服务存在风险时,建议您终止相关操作以保护您的合法权益。</p>
</div>
<div class="paragraph">
<div class="t bold">七、我们如何保护未成年人的信息</div>
<p>1.我们期望监护人(比如未成年人的父母)指导未成年人使用我们的服务。我们将根据国家相关法律法规的规定保护未成年人的信息的保密性及安全性。</p>
<p>2.如您为未满14周岁的未成年人,建议请您的监护人阅读本政策,并在征得您监护人的书面同意的前提下使用我们的服务或向我们提供您的信息。对于经监护人同意而收集您的信息的情况,我们只会在受到法律允许、您的监护人明确同意或者保护您的权益所必要的情况下使用或公开披露此信息。如您的监护人不同意您按照本政策使用我们的服务或向我们提供信息,请您立即终止使用我们的服务并及时通知我们,以便我们采取相应的措施。</p>
<p>3.如您为未成年人的监护人,当您对您所监护的未成年人的信息处理存在疑问时,请通过上文中第五款第5项的联系方式联系我们。更多详情,敬请查阅《校智付未成年人个人信息保护规则》。</p>
</div>
<div class="paragraph">
<div class="t bold">八、本政策的适用及更新</div>
<p>校智付所有服务均适用本政策,除非相关服务已有独立的隐私权政策或相应的用户服务协议当中存在特殊约定。</p>
<p>
发生下列重大变化情形时,我们会适时对本政策进行更新:
<p>(1)我们的基本情况发生变化,例如:兼并、收购、重组引起的所有者变更;</p>
<p>(2)收集、使用个人信息的范围、目的、规则发生变化;</p>
<p>(3)对外提供个人信息的对象、范围、目的发生变化;</p>
<p>(4)数据安全能力、信息安全风险发生变化;</p>
<p>(5)用户询问、投诉的渠道和机制,以及外部纠纷解决机构及联络方式发生变化;</p>
<p>(6)其他可能对您的个人信息权益产生重大影响的变化。</p>
</p>
<p>如本政策发生更新,我们将以微信推送通知、弹窗提示、发送邮件/短消息或者在校智付官方网站发布公告的方式来通知您。为了您能及时接收到通知,建议您在联系方式更新时及时通知我们。如您在本政策更新生效后继续使用校智付服务,即表示您已充分阅读、理解并接受更新后的政策并愿意受更新后的政策约束。</p>
</div>
<div class="paragraph">
<div class="t bold">九、本政策中关键词说明</div>
<p>1、本政策中的“身份要素”是指:密码、短信校验码、电话号码、手机号码、证件号码及生物识别信息。</p>
<p>2、本政策中的“个人敏感信息”是指:身份证件号码、个人生物识别信息、银行账号、财产信息、交易信息、精准定位信息等个人信息。</p>
</div>
</view>
</template>
<script>
export default {
name: "StudentAttendance",
data() {
return {
}
},
methods: {
}
}
</script>
<style scoped>
.container {
padding:20rpx;
}
.title {
text-align: center;
font-weight: bold;
font-size: 16px;
padding: 20rpx 0;
}
.paragraph {
margin-top:20rpx;
font-size:14px;
}
.paragraph .t{
font-size:16px;
}
.bold {
font-weight: bold;
}
</style>
<template>
<view class="container">
<!-- 头部背景图 -->
<view class="headerImg">
<image src="../../static/images/header.png" mode="aspectFit"></image>
</view>
<view class="bgmbox">
<!-- 班级汇总选择切换 -->
<picker class="classpicker" @change="bindPickerChange" :value="index" :range="array" range-key="Name">
<view class="selectClass" @click="selectReport">
<view>{{array[index].Name||"未知班级名"}}</view>
<image src="../../static/images/Triangle.png" mode="aspectFit"></image>
</view>
</picker>
<!-- 日期展示 -->
<view class="huizong">
<image src="../../static/images/message_1.png" mode="aspectFit"></image>
<view class="huizongTime">{{week_desc}}</view>
</view>
<!-- 列表数据 -->
<view class="dataBox">
<view class="listitem" v-for="(item,index) in [1,2,3]" :key="index">
<view class="labelbox">
<image src="../../static/images/Group.png" mode="aspectFit"></image>
<view class="labeltext">{{['每周要点','每周消费趋势','每周消费偏好区域'][index]}}</view>
<image style="width: 32rpx;height: 32rpx;padding-left: 15rpx;" v-if="index==-1"
src="../../static/images/wenhao.png" mode="aspectFit"></image>
</view>
<!-- 展示内容区 -->
<view class="content">
<view class="content1" v-if="index==0">
<view v-for="(item,index) in summary" :key="index">
{{item}}
</view>
</view>
<view class="content2" v-if="index==1">
<!-- 折线图 -->
<view ref="zhexian" id="zhexian" style="width: 100%;height: 600rpx;">
</view>
</view>
<view class="content3" v-if="index==2">
<!-- 饼状图 -->
<view ref="mychars" id="mychars" style="width: 100%;height: 500rpx;">
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 就餐情况表格 -->
<view class="bgmbox2">
<view class="labelbox">
<image src="../../static/images/Group.png" mode="aspectFit"></image>
<view class="labeltext">未就餐学生情况</view>
<image @click="doubtTips" style="width: 32rpx;height: 32rpx;padding-left: 15rpx;"
src="../../static/images/wenhao.png" mode="aspectFit"></image>
</view>
<!-- 表格数据 -->
<view class="uni-table-box">
<view class="table">
<view class="table-head">
<view>日期</view>
<view>学生姓名</view>
<view>次数</view>
</view>
<view v-for="(item,index) in unconsume_table.List" :key="index">
<!-- -->
<view class="table-body" v-for="(item2,index2) in item.List" :key="index2">
<view>{{item2.date}}</view>
<view>{{item2.student_name}}</view>
<view>{{item2.cnt}}</view>
</view>
<!-- 总计 -->
<view class="table-body total">
<view>总计 {{index+1}}</view>
<view>/</view>
<view>{{item.total}}</view>
</view>
</view>
<!-- 总计 -->
<view class="table-body zongji">
<view>总计</view>
<view>/</view>
<view>{{unconsume_table.total}}</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
var option;
let myChartzhexian, myChart;
var gHost = "https://" + window.location.host;
if (window.location.protocol != "https:") {
gHost = "https://fpdev.xiaopay.net";
}
//获取参数
function getQueryParams(params) {
let href = window.location.href
let query = href.substring(href.indexOf('?') + 1);
let vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
let pair = vars[i].split("=");
if (pair[0] == params) {
return pair[1];
}
}
return (false);
}
let icon = {
'0': 'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAh0lEQVQoU2NkYGBg0Njaq8bwl7GdgZHBBcRn+M+wh4H5f+UN7+JbjCBJxn8MJxgYGAXBknDw//1/JgYLRo1NfWsZGRmCGBj+b/jxjzkDJM/B9HcGAwNjwP//DOsYNTb3fWRkYOD78Y9J4r5/wUuQAsWNE8Q5mP69+M/A8IkIBQStIORIQt4EAOTOTgf3b2UWAAAAAElFTkSuQmCC',
'1': 'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAhUlEQVQoU2NkYGBgCHz9RI35P0M7A+N/FxCf4T/jnr+MDJXrRWVuMYIlGRhOMDAwCIIlEeD9XwYGC8aQV0/WMjAyBP1nZNzw+y9LBkielfnPDMb//wMY/jOsYwx5/fgjAwMj369/rBKbxMVfghT4vXwpzsb0+wUDw/9PRCggZAVBRxLyJgBtFlJZuXamlAAAAABJRU5ErkJggg==',
'2': 'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAe0lEQVQoU4WPvQnCUACEv3u1BKy0VnAGB3AAcYqs4ARZIUskOEAGcAbBpNVK8rB+Fx42du+64477EcDT8RCgMZwyFwwJrntVD2VRcAfWWfzDx3DU5NgZLoKbCfUvIbWGs6DX6DgDFYTtTqt3Noz+biC9gFg2FCuKI0s3F9F1Rmtx2vOzAAAAAElFTkSuQmCC',
}
export default {
name: "ClsWeekReport",
data() {
return {
title: 'picker',
array: [{
DepId: '',
Name: ""
}],
index: 0,
time: '12:01',
token: "",
weekid: -1,
consume_prefs: [],
consume_trend: [],
summary: [],
unconsume_table: {},
week_desc: ''
}
},
onLoad() {
},
created: function() {
// console.log(this.$echarts);
},
methods: {
// 点击问好提示
async doubtTips() {
uni.showModal({
title: "系统提示",
showCancel: false,
content: "统计周期为上周一至上周五",
})
},
async bindPickerChange(e) {
try {
uni.showLoading({
title: "加载中....."
})
console.log('picker发送选择改变,携带值为', e.target.value)
this.index = e.target.value
// 切换班级获取报告
await this.QueryClsReport(this.array[e.target.value].DepId)
uni.setNavigationBarTitle({
title: (this.array[e.target.value].Name || "未知名班级") + "周消费报告"
})
uni.hideLoading()
} catch (e) {
//TODO handle the exception
uni.hideLoading()
uni.showModal({
title: "系统提示",
showCancel: false,
content: e.message,
})
}
},
// 切换班级选择汇总
async selectReport() {
console.log(111);
},
// 微信JS-SDK鉴权
async js_sdk_init() {
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: '', // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '', // 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
wx.ready(function() {
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
wx.error(function(res) {
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
uni.showToast({
icon: "none",
title: JSON.stringify(res)
})
});
},
// 二维码加密内容转tokenqrcode2Token
async tokenqrcode2Token() {
let this_ = this
return new Promise((resolve, reject) => {
// 二维码加密内容获取token
$.ajax({
url: gHost + '/qyxp/qyapp/qrcode2Token',
type: "get",
timeout: 8000,
contentType: "application/x-www-form-urlencoded",
data: {
hex: getQueryParams('hex')
},
success: function(res) {
if (res.code == 10000) {
this_.schoolName = res.results.schoolName
this_.teacherName = res.results.teacherName
this_.token = res.results.token
resolve(res)
} else {
reject(res)
}
},
error: function(error) {
reject(error)
}
})
})
},
// 埋点接口,用户点击班级周消费报告推送消息后调用此接口
async CaptureEvent() {
return new Promise((resolve, reject) => {
// 二维码加密内容获取token
$.ajax({
url: gHost + '/qyxp/qyapp/CaptureEvent',
type: "post",
dataType: 'json',
contentType: 'application/json; charset=UTF-8',
cache: false,
data: JSON.stringify({
"event": "view_week_report",
"hex": getQueryParams('hex'),
"qyToken": this.token,
"weekId": 0
}),
success: function(res) {
if (res.code == 10000) {
resolve(res)
} else {
resolve(res)
uni.showToast({
icon: "none",
title: res.message
})
}
},
error: function(error) {
reject(error)
}
})
})
},
// 获取管理的班级列表
async QueryAdminCls() {
return new Promise((resolve, reject) => {
// 二维码加密内容获取token
$.ajax({
url: gHost + '/qyxp/qyapp/QueryAdminCls',
type: "post",
dataType: 'json',
contentType: 'application/json; charset=UTF-8',
cache: false,
data: JSON.stringify({
qyToken: this.token
}),
success: function(res) {
if (res.code == 10000) {
resolve(res)
} else {
reject(res)
}
},
error: function(error) {
reject(error)
}
})
})
},
// 获取班级周消费报告
async QueryClsReport(clsId) {
let this_ = this;
return new Promise((resolve, reject) => {
// 二维码加密内容获取token
$.ajax({
url: gHost + '/qyxp/qyapp/QueryClsReport',
type: "post",
dataType: 'json',
contentType: 'application/json; charset=UTF-8',
cache: false,
data: JSON.stringify({
"clsId": clsId + '',
"qyToken": this_.token,
"weekId": getQueryParams('weekid') ? parseInt(getQueryParams(
'weekid')) : -1
}),
success: function(res) {
if (res.code == 10000) {
let {
consume_prefs,
consume_trend,
summary,
unconsume_table,
week_desc
} = res.results
this_.consume_prefs = consume_prefs
this_.consume_trend = consume_trend
this_.summary = summary
this_.unconsume_table = unconsume_table
this_.week_desc = week_desc
// 折线图重新渲染
this_.Linechart()
// 饼图渲染
this_.piechart()
resolve(res)
} else {
reject(res)
}
},
error: function(error) {
reject(error)
}
})
})
},
// 折线图渲染
async Linechart() {
let this_ = this;
this.$nextTick(function() {
let zhexianchartDom = document.getElementById('zhexian');
console.log(zhexianchartDom);
myChartzhexian = echarts.init(zhexianchartDom);
myChartzhexian.setOption({
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
legend: {
},
// 高亮样式。
emphasis: {
itemStyle: {},
label: {
show: false,
// 高亮时标签的文字
formatter: ''
}
},
tooltip: {
trigger: 'axis',
extraCssText: 'width: 35%;text-align: center;border-radius: 0px 100px 100px 200px;', // 额外附加到浮层的 css 样式
borderWidth: 0,
backgroundColor: '#729487', // 提示框浮层的背景颜色。
formatter: function(name) {
// console.log(name[0].data);
return name[0].data.name + ' ' + name[0].value + '';
},
textStyle: {
fontWeight: 'bold',
color: "#F1F4F3"
},
axisPointer: { //坐标轴指示器,坐标轴触发有效,
type: 'shadow', //默认为line,line直线,cross十字准星,shadow阴影
shadowStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0,
color: '#E4F6EF' // 0% 处的颜色
}, {
offset: 1,
color: '#34e7b5' // 100% 处的颜色
}],
global: false // 缺省为 false
},
opacity: 0.5
}
}
},
xAxis: {
type: 'category',
data: this_.consume_trend.map(v => {
return v.Date
})
},
yAxis: {
type: 'value'
},
series: [{
itemStyle: {
normal: {
lineStyle: {
color: '#29B38E'
}
}
},
data: this_.consume_trend.map(v => {
return {
name: v.Date,
value: v.Amount,
itemStyle: {
normal: {
color: "#29B38E"
}
}
}
}),
type: 'line',
smooth: true,
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 1,
color: '#E4F6EF' // 0% 处的颜色
}, {
offset: 0,
color: '#34e7b5' // 100% 处的颜色
}],
global: false // 缺省为 false
},
opacity: 0.3
}
}],
media: {
minHeight: 200
}
});
})
},
// 饼图渲染
async piechart() {
let this_ = this;
let pieChartData = [{
value: 1,
name: '系统工具'
},
{
value: 3,
name: '课程表'
},
{
value: 0,
name: '意见反馈'
},
{
value: 43,
name: '其他'
}
]
this.$nextTick(function() {
let chartDom = document.getElementById('mychars');
myChart = echarts.init(chartDom);
let sum = 0,
obj = {};
this_.consume_prefs.forEach(ele => {
obj[ele.scene] = parseFloat(ele.amount)
sum += parseFloat(ele.amount);
})
myChart.setOption({
//设置主副标题
title: {
show: false,
text: sum.toFixed(2), //主标题
left: "23%",
top: "40%",
z: 0,
zlevel: 100,
textStyle: { //设置主标题的 样式
textAlign: "center",
color: '#29B38E',
fontSize: 14
}
},
grid: {
show: false,
containLabel: false,
},
tooltip: {
show: false,
triggerOn: 'none',
trigger: 'item',
appendToBody: true
},
legend: {
top: '35%',
right: '0',
orient: 'vertical',
selector: false,
formatter: function(name) {
console.log(name);
return `{a|${name}}: {x|共花费${obj[name]}元}`;
},
textStyle: {
fontWeight: 'normal',
rich: {
a: {
fontWeight: 'bold',
padding: [0, 0, 0, 15]
},
b: {
},
x: {
}
}
},
itemWidth: 10, // 图例图形宽度
itemHeight: 10, // 图例图形高度
data: this_.consume_prefs.map((v, index) => {
return {
name: v.scene,
// 强制设置图形为圆。
icon: icon[index + '0'],
// 设置文本为红色
textStyle: {
itemStyle: {
// color: "#aa0000"
}
}
}
})
},
series: [{
name: '访问来源',
type: 'pie',
// 设置成相对的百分比
center: ['30%', '45%'],
radius: ['40%', '55%'],
avoidLabelOverlap: false,
legendHoverLink: false, //移入leged不显示在中间
textAlign: "center",
label: {
show: true,
fontSize: '15',
fontWeight: 'bold',
formatter: '{@name}元',
position: 'center',
color: '#29B38E',
itemStyle: {
}
},
emphasis: {
itemStyle: {},
label: {
show: true,
fontSize: '15',
fontWeight: 'bold'
}
},
select: {
label: {
show: true
},
labelLine: {},
itemStyle: {
color: '#29B38E'
}
},
labelLine: {
show: false
},
data: this_.consume_prefs.map((v, index) => {
console.log(this_.consume_prefs);
return {
value: parseFloat(v.amount),
name: v.scene,
itemStyle: {
normal: {
color: ["#29B38E", "#54EBE4", "#DEFFF2"][
index
]
}
}
}
})
}]
});
})
},
// 初始化
async init_() {
uni.showLoading({
title: "加载中....."
})
try {
await this.tokenqrcode2Token();
let AdminCls = await this.QueryAdminCls();
if (AdminCls.results) {
this.array = AdminCls.results
// this.array = [{
// DepId: 39,
// Name: "未知班级姓名"
// }, {
// DepId: 40,
// Name: "101班周消费报告 "
// }, {
// DepId: 41,
// Name: "102班周消费报告 "
// }]
}
await this.QueryClsReport(AdminCls.results[0].DepId);
uni.setNavigationBarTitle({
title: (this.array[0].Name || "未知名班级") + "周消费报告"
})
await this.CaptureEvent()
uni.hideLoading()
} catch (e) {
//TODO handle the exception
uni.hideLoading()
uni.showModal({
title: "系统提示",
showCancel: false,
content: e.message,
})
}
}
},
mounted: function() {
let this_ = this;
if (!getQueryParams('hex')) {
return uni.showModal({
title: "系统提示",
showCancel: false,
content: "hex参数错误",
})
}
this_.init_()
window.addEventListener('resize', () => {
this.$nextTick(function() {
myChartzhexian.resize()
myChart.resize()
})
})
// setTimeout(function() {
// this_.js_sdk_init()
// }, 2000)
}
}
</script>
<style scoped>
page {
background: #FFFFFF;
height: 100%;
}
canvas {
display: block;
margin: 0 auto;
border: 1px solid red;
}
.container {
padding-top: 26rpx;
padding-bottom: 26rpx;
}
.container image {
position: relative;
}
.headerImg {
width: 670rpx;
height: 130rpx;
margin: 0 auto;
}
.headerImg image {
width: 100%;
height: 100%;
position: relative;
}
.selectClass {
width: 60%;
height: 50rpx;
font-size: 36rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #FFFFFF;
line-height: 50rpx;
text-shadow: 0rpx 4rpx 8rpx rgba(0, 0, 0, 0.5);
margin: 0 auto;
display: flex;
justify-content: center;
}
.classpicker {
position: relative;
top: -90rpx;
}
.selectClass image {
width: 40rpx;
height: 30rpx;
position: relative;
top: 12rpx;
}
.bgmbox {
width: 670rpx;
/* height: 1352rpx; */
background-image: url(../../static/images/Slice.png);
background-repeat: no-repeat;
background-size: 100% 100%;
background-attachment: fixed;
box-shadow: 0rpx 6rpx 7rpx 0rpx rgba(0, 171, 207, 0.58);
margin: 0 auto;
padding-bottom: 50rpx;
}
.bgmbox2 {
width: 670rpx;
/* height: 718rpx; */
box-shadow: 0rpx 6rpx 7rpx 0rpx rgba(0, 171, 207, 0.58);
margin: 0 auto;
padding-bottom: 50rpx;
}
.bgmbox2>.labelbox {
padding-top: 40rpx;
}
.huizong {
display: flex;
justify-content: flex-end;
align-items: center;
padding-right: 20rpx;
margin-top: -30rpx;
}
.huizongTime {
/* width: 204rpx; */
height: 42rpx;
font-size: 30rpx;
font-family: PingFang-SC-Regular, PingFang-SC;
font-weight: 400;
color: #6F747A;
line-height: 42rpx;
}
.listitem {
margin-top: 56rpx;
}
.huizong image {
width: 32rpx;
height: 32rpx;
padding-right: 10rpx;
top: -5rpx;
}
.labelbox {
display: flex;
align-items: center;
justify-content: flex-start;
margin-left: 24rpx;
}
.labelbox .labeltext {
height: 44rpx;
font-size: 32rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 600;
color: #3D3D3D;
line-height: 44rpx;
margin-left: 10rpx;
}
.labelbox image {
width: 36rpx;
height: 20rpx;
}
.content1 {
/* height: 280rpx; */
}
.content1,
.content2,
.content3 {
width: 626rpx;
margin: 0 auto;
}
.content1 {
font-size: 28rpx;
font-family: PingFang-SC-Regular, PingFang-SC;
font-weight: 400;
color: #3D3D3D;
line-height: 50rpx;
}
.content1 view:first-child {
margin-top: 20rpx;
}
.content1 view:not(:first-child) {
margin-top: 40rpx;
}
.table-head,
.table-body {
width: 616rpx;
height: 62rpx;
line-height: 62rpx;
margin: 0 auto;
display: flex;
justify-content: space-between;
}
.table-body {
height: 80rpx;
font-size: 28rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #3D3D3D;
line-height: 80rpx;
}
.table-body view {
width: 120rpx;
text-align: center;
}
.table-head {
background-color: #F3F3F3;
color: #3D3D3D;
margin-top: 44rpx;
font-size: 30rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
}
.table-head view {
padding-left: 34rpx;
padding-right: 36rpx;
}
.total {
height: 72rpx;
font-size: 28rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #3D3D3D;
line-height: 72rpx;
background-color: #D7F6F4;
}
.zongji {
font-size: 28rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #29B38E;
}
.zongji view {
width: 130rpx;
text-align: center;
}
.table-head,
.total {
border-radius: 10rpx;
}
</style>
<template>
<view class="container">
<div class="weui-tab__content" id="smb_view" style="display: block;display: none;">
<div style="margin-top: 50px;">
<div class=" weui-cells_form" style="border:none !important;">
<img style="width: 30vw;margin: 0vh 30vw;" src="/mpwechat/img/success.png" alt="" srcset="">
<div style="font-size: 20px;margin: 30px 0 20vh 0;">
<label id="smbcontext"></label>
</div>
<div class="weui-btn-area"> <a onclick="knowCloseWindow()" href="javascript:"
class="weui-btn weui-btn_primary">知道了</a></div>
</div>
</div>
</div>
<div class="weui-tab__content" id="form_checkuser" style="display: block;display: none;">
<div style="margin-top: 50px;">
<div class="weui-cells weui-cells_form">
<div class="weui-cell">
<div class="weui-cell__hd"><label class="weui-label">姓名</label></div>
<div class="weui-cell__bd"> <input id="stuname" class="weui-input" type="text" required=""
pattern="REG_IDNUM" maxlength="18" placeholder="请输入孩子/老师姓名" style="text-align:right;"
emptytips="请输入孩子/老师姓名" notmatchtips="请输入孩子/老师姓名">
</div>
<div class="weui-cell__ft"> <i class="weui-icon-warn"></i> </div>
</div>
<div class="weui-cell">
<div class="weui-cell__hd"><label class="weui-label">手机号</label></div>
<div class="weui-cell__bd"> <input id="phonenumber" class="weui-input" type="tel" required=""
pattern="^\d{11}$" maxlength="11" placeholder="请输入签约手机号" style="text-align:right;"
emptytips="请输入签约手机号" notmatchtips="请输入签约手机号">
</div>
<div class="weui-cell__ft"> <i class="weui-icon-warn"></i> </div>
</div>
<div class="weui-cell">
<div class="weui-cell__hd"><label style="width: 69px;" class="weui-label">验证码</label></div>
<div class="weui-cell__bd"> <input id="checkcode" style="width:100%;text-align: right;"
class="weui-input" maxlength="6" type="number" required="" pattern="REG_VCODE"
placeholder="输入验证码" tips="输入验证码"> </div>
<div class="weui-cell__ft"> <i class="weui-icon-warn"> </i><a id="sendcodebtn"
href="javascript:;" onclick="sendsmscode(this)"
style="font-size: 15px;margin-left: 10px;">获取验证码</a>
</div>
</div>
</div>
<div class="weui-btn-area"> <a id="formSubmitBtn" onclick="subcheckuser(this)" href="javascript:"
class="weui-btn weui-btn_primary">立即验证</a>
</div>
</div>
</div>
<div class="weui-tab__content" id="credit_view" style="display: block;display: none;">
<div style="margin-top: 20px;padding-bottom:50px;">
<div class="weui-cells">
<div class="weui-cell">
<div class="weui-cell__hd"><label class="weui-label">学校</label></div>
<div class="weui-cell__bd">
<label id="schname"></label>
</div>
</div>
<div class="weui-cell">
<div class="weui-cell__hd"><label class="weui-label">姓名</label></div>
<div class="weui-cell__bd">
<label id="username"></label>
</div>
</div>
<div class="weui-cell">
<div class="weui-cell__hd"><label class="weui-label">用户类型</label></div>
<div class="weui-cell__bd">
<label id="usertype"></label>
</div>
</div>
<div class="weui-cell" id="gcinfo_dev" style="display: none;">
<div class="weui-cell__hd"><label class="weui-label">年级/班级</label></div>
<div class="weui-cell__bd">
<label id="gcinfo"></label>
</div>
</div>
<div class="weui-cell">
<div class="weui-cell__hd"><label class="weui-label">信用金金额</label></div>
<div class="weui-cell__bd">
<label id="amount"></label>
</div>
</div>
<div class="weui-cell">
<div class="weui-cell__hd"><label class="weui-label">缴费方式</label></div>
<div class="weui-cell__bd">
<label id="soutype"></label>
</div>
</div>
<div class="weui-cell">
<div class="weui-cell__hd"><label class="weui-label">缴费时间</label></div>
<div class="weui-cell__bd">
<label id="paytime"></label>
</div>
</div>
<div class="weui-cell" id="outno_dev" style="display: none;flex-wrap: wrap;">
<div class="weui-cell__hd"><label class="weui-label" style="width:65px;">商户单号</label></div>
<div class="weui-cell__bd" style="font-size:11px;">
<label id="outno"></label>
</div>
</div>
<div class="weui-cell" id="wxno_dev" style="display: none;flex-wrap: wrap;">
<div class="weui-cell__hd"><label class="weui-label" style="width:65px;">微信单号</label></div>
<div class="weui-cell__bd" style="font-size:11px;">
<label id="wxno"></label>
</div>
</div>
</div>
<div class="weui-btn-area">
<a id="applyrefoundbtn" href="javascript:" onclick="subrefund(this)"
class="weui-btn weui-btn_primary">申请退款</a>
</div>
<div id="norftext" class="weui-btn-area" style="display: none;">
<a id="applyrefoundbtn" href="javascript:" onclick="norefound(this)"
style="color:#348FF6;display: block;font-size:14px;position: fixed;text-align: center;bottom: 3vh;width: 100%;left: 0;">为什么我无法申请退款?</a>
</div>
</div>
</div>
</view>
</template>
<script>
//公共参数
let gHost = "https://" + window.location.host;
if (window.location.protocol != "https:") {
gHost = "http://" + window.location.host;
}
let sessionid = "";
let binduserid = 0;
let msgid = "";
let curCount = 60;
export default {
name:"CreditRefund",
data() {
return {
}
},
created: function() {
console.log("created");
},
mounted: function() {
let this_ = this
this_.$nextTick(function() {
let loading = weui.loading('玩命加载中.');
let params = this_.parseUrl();
if (!params.code || params.code == "" || !params.state || params.state == "") {
loading.hide();
weui.alert('请通过微信扫一扫学校退款二维码打开!', function() {
console.log('ok');
}, {
title: '提示'
});
return;
}
let ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('micromessenger') == -1) {
// 非微信浏览器H5支付
loading.hide();
weui.alert('请通过微信浏览器打开!', function() {
console.log('ok');
}, {
title: '错误'
});
return;
}
console.log(params);
$.ajax({
url: gHost + '/mp_wechat/x/access_token',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: params,
success: function(resp1) {
if (resp1.code != "10000") {
loading.hide();
weui.alert(resp1.message, function() {
console.log('ok');
wx.closeWindow();
}, {
title: '错误'
});
} else {
sessionid = resp1.results
//查询联合关联关系
$.ajax({
url: gHost + '/mp_wechat/svmpwechat/QueryBindInfoByUnionid',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: {
"mp_session_id": sessionid
},
success: function(resp2) {
console.log(resp2)
if (resp2.code != "10000") {
loading.hide();
weui.alert(resp2.message, function() {
console.log('ok');
wx.closeWindow();
}, {
title: '提示'
});
} else {
if (resp2.results.islist) { //多人
var myArray=new Array();
for ( var i = 0; i <resp2.results.bindlist.length; i++){
var item = new Object();
item.label = resp2.results.bindlist[i].username;
item.value = resp2.results.bindlist[i].userid;
myArray.push(item);
}
loading.hide();
weui.picker(myArray, {
defaultValue: [0],
className: 'custom-classname',
onChange: function onChange(result) {
//console.log(item, index);
//console.log(result[0].value);
},
onConfirm: function onConfirm(result) {
console.log('confirm');
console.log(result[0].value);
binduserid = result[0].value;
var loading2 = weui.loading('玩命加载中.');
//查询待退款的信用金信息
$.ajax({
url: gHost + '/mp_wechat/svmpwechat/QueryCreditInfo',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: {
"mp_session_id": sessionid,
"userid": binduserid
},
success: function(resp3) {
console.log(resp3)
if (resp3.code != "10000") {
loading2.hide();
weui.alert(resp3.message, function() {
console.log('ok');
wx.closeWindow();
}, {
title: '提示'
});
} else {
if (resp3.results.status == 1) {
loading2.hide();
$("#smbcontext").text("退款申请已提交,审核通过后,预计1-7个工作日通过商户退款或现金红包形式退款到当前微信账户!")
$("#smb_view").show()
} else {
$("#schname").text(resp3.results.schoolname)
$("#username").text(resp3.results.username)
var utstr = resp3.results.usertype == "1" ? "学生" : "教职工";
$("#usertype").text(utstr);
if (resp3.results.usertype == "1") {
$("#gcinfo_dev").show();
$("#gcinfo").text(resp3.results.gradename + "/" + resp3.results.classname)
}
$("#amount").text("" + (resp3.results.amount / 100).toFixed(2))
var soustr = resp3.results.sourcetype == "1" ? "现金缴纳" : resp3.results.sourcetype == "2" ?
"微信支付" : resp3.results.sourcetype == "3" ? "生活费抵扣" : "免交信用金"
$("#soutype").text(soustr)
$("#paytime").text(resp3.results.paytime)
if (resp3.results.sourcetype != "2") {
$("#applyrefoundbtn").css("opacity", "0.3");
$("#applyrefoundbtn").css("pointer-events", "none");
$("#norftext").show();
}
if (resp3.results.outno != "") {
$("#outno").text(resp3.results.outno)
$("#outno_dev").show()
}
if (resp3.results.wxno != "") {
$("#wxno").text(resp3.results.wxno)
$("#wxno_dev").show()
}
loading2.hide();
$("#credit_view").show();
}
}
},
error: function(err3) {
loading2.hide();
weui.alert(err3.toString(), function() {
console.log('ok');
wx.closeWindow();
}, {
title: 'ERROR'
});
}
});
},
id: 'picker',
title: '当前手机号存在多个关联用户,请选择其中一个'
});
return
} else { //单人
if (resp2.results.bindflag) {
binduserid = resp2.results.userid;
//查询待退款的信用金信息
$.ajax({
url: gHost + '/mp_wechat/svmpwechat/QueryCreditInfo',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: {
"mp_session_id": sessionid,
"userid": binduserid
},
success: function(resp3) {
console.log(resp3)
if (resp3.code != "10000") {
loading.hide();
weui.alert(resp3.message, function() {
console.log('ok');
wx.closeWindow();
}, {
title: '提示'
});
} else {
if (resp3.results.status == 1) {
loading.hide();
$("#smbcontext").text("退款申请已提交,审核通过后,预计1-7个工作日通过商户退款或现金红包形式退款到当前微信账户!")
$("#smb_view").show()
} else {
$("#schname").text(resp3.results.schoolname)
$("#username").text(resp3.results.username)
var utstr = resp3.results.usertype == "1" ? "学生" : "教职工";
$("#usertype").text(utstr);
if (resp3.results.usertype == "1") {
$("#gcinfo_dev").show();
$("#gcinfo").text(resp3.results.gradename + "/" + resp3.results.classname)
}
$("#amount").text("" + (resp3.results.amount / 100).toFixed(2))
var soustr = resp3.results.sourcetype == "1" ? "现金缴纳" : resp3.results.sourcetype == "2" ?
"微信支付" : resp3.results.sourcetype == "3" ? "生活费抵扣" : "免交信用金"
$("#soutype").text(soustr)
$("#paytime").text(resp3.results.paytime)
if (resp3.results.sourcetype != "2") {
$("#applyrefoundbtn").css("opacity", "0.3");
$("#applyrefoundbtn").css("pointer-events", "none");
$("#norftext").show();
}
if (resp3.results.outno != "") {
$("#outno").text(resp3.results.outno)
$("#outno_dev").show()
}
if (resp3.results.wxno != "") {
$("#wxno").text(resp3.results.wxno)
$("#wxno_dev").show()
}
loading.hide();
$("#credit_view").show();
}
}
},
error: function(err3) {
loading.hide();
weui.alert(err3.toString(), function() {
console.log('ok');
wx.closeWindow();
}, {
title: 'ERROR'
});
}
});
} else {
loading.hide();
//没有任何绑定的人
weui.confirm('此微信不是绑定该学生(教师)的微信,需要验证后进行退款!', function() {
console.log('yes');
$("#form_checkuser").show();
}, function() {
console.log('no');
wx.closeWindow();
}, {
title: '提示'
});
}
}
}
},
error: function(err2) {
loading.hide();
weui.alert(err2.toString(), function() {
console.log('ok');
wx.closeWindow();
}, {
title: 'ERROR'
});
}
});
}
},
error: function(err) {
loading.hide();
weui.alert(err.toString(), function() {
console.log('ok');
}, {
title: 'ERROR'
});
}
});
})
console.log("mounted");
},
methods: {
//获取验证码
sendsmscode(self) {
curCount = 60;
var phonestr = $("#phonenumber").val()
if (phonestr == "") {
weui.topTips('手机号码不能为空', {
duration: 3000,
className: "custom-classname",
callback: function callback() {
console.log('close');
}
});
return;
}
if (!isPoneAvailable(phonestr)) {
weui.topTips('手机号码格式不正确', {
duration: 3000,
className: "custom-classname",
callback: function callback() {
console.log('close');
}
});
return;
}
var loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/mp_wechat/svmpwechat/SendSMSAuthCode',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: {
"mp_session_id": sessionid,
"phone": phonestr
},
success: function(resp3) {
console.log(resp3)
if (resp3.code != "10000") {
loading.hide();
weui.alert(resp3.message, function() {
console.log('ok');
wx.closeWindow();
}, {
title: '提示'
});
} else {
loading.hide();
$("#sendcodebtn").css("pointer-events", "none");
$("#sendcodebtn").css("color", "dimgrey");
$("#sendcodebtn").html(curCount + "秒后重新获取");
msgid = resp3.message;
InterValObj = window.setInterval(SetRemainTime, 1000); //启动计时器,1秒执行一次
}
},
error: function(err3) {
loading.hide();
weui.alert(err3.toString(), function() {
console.log('ok');
wx.closeWindow();
}, {
title: 'ERROR'
});
}
});
},
//验证信息
subcheckuser(self) {
var phonestr = $("#phonenumber").val()
if (phonestr == "") {
weui.topTips('手机号码不能为空', {
duration: 3000,
className: "custom-classname",
callback: function callback() {
console.log('close');
}
});
return;
}
if (!isPoneAvailable(phonestr)) {
weui.topTips('手机号码格式不正确', {
duration: 3000,
className: "custom-classname",
callback: function callback() {
console.log('close');
}
});
return;
}
var checkcode = $("#checkcode").val()
if (checkcode == "") {
weui.topTips('验证码不能为空', {
duration: 3000,
className: "custom-classname",
callback: function callback() {
console.log('close');
}
});
return;
}
var stuname = $("#stuname").val()
if (stuname == "") {
weui.topTips('姓名不能为空', {
duration: 3000,
className: "custom-classname",
callback: function callback() {
console.log('close');
}
});
return;
}
if (msgid == "") {
weui.topTips('请先获取验证码', {
duration: 3000,
className: "custom-classname",
callback: function callback() {
console.log('close');
}
});
return;
}
var loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/mp_wechat/svmpwechat/CheckSMSAuthCode',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: {
"mp_session_id": sessionid,
"phone": phonestr,
"msgid": msgid,
"code": checkcode,
},
success: function(resp3) {
console.log(resp3)
if (resp3.code != "10000") {
loading.hide();
weui.alert(resp3.message, function() {
console.log('ok');
wx.closeWindow();
}, {
title: '提示'
});
} else {
//验证通过,查询人
$.ajax({
url: gHost + '/mp_wechat/svmpwechat/QueryUserIDByPhone',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: {
"mp_session_id": sessionid,
"phone": phonestr,
"username": stuname,
},
success: function(resp4) {
console.log(resp4)
if (resp4.code != "10000") {
loading.hide();
weui.alert(resp4.message, function() {
console.log('ok');
wx.closeWindow();
}, {
title: '提示'
});
} else {
if (resp4.results.bindflag) {
binduserid = resp4.results.userid;
//查询待退款的信用金信息
$.ajax({
url: gHost + '/mp_wechat/svmpwechat/QueryCreditInfo',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: {
"mp_session_id": sessionid,
"userid": binduserid
},
success: function(resp5) {
console.log(resp5)
if (resp5.code != "10000") {
loading.hide();
weui.alert(resp5.message, function() {
console.log('ok');
wx.closeWindow();
}, {
title: '提示'
});
} else {
$("#form_checkuser").hide();
if (resp5.results.status == 1) {
loading.hide();
$("#smbcontext").text("退款申请已提交,审核通过后,预计1-7个工作日通过商户退款或现金红包形式退款到当前微信账户!")
$("#smb_view").show()
} else {
$("#schname").text(resp5.results.schoolname)
$("#username").text(resp5.results.username)
var utstr = resp5.results.usertype == "1" ? "学生" : "教职工";
$("#usertype").text(utstr);
if (resp5.results.usertype == "1") {
$("#gcinfo_dev").show();
$("#gcinfo").text(resp5.results.gradename + "/" + resp5.results.classname)
}
$("#amount").text("" + (resp5.results.amount / 100).toFixed(2))
var soustr = resp5.results.sourcetype == "1" ? "现金缴纳" : resp5.results.sourcetype == "2" ?
"线上支付" : resp5.results.sourcetype == "3" ? "钱包抵扣" : "免交信用金"
$("#soutype").text(soustr)
$("#paytime").text(resp5.results.paytime)
if (resp5.results.sourcetype != "2") {
$("#applyrefoundbtn").css("opacity", "0.3");
$("#applyrefoundbtn").css("pointer-events", "none");
$("#norftext").show();
}
if (resp5.results.outno != "") {
$("#outno").text(resp5.results.outno)
$("#outno_dev").show()
}
if (resp5.results.wxno != "") {
$("#wxno").text(resp5.results.wxno)
$("#wxno_dev").show()
}
$("#credit_view").show();
}
loading.hide();
}
},
error: function(err5) {
loading.hide();
weui.alert(err5.toString(), function() {
console.log('ok');
wx.closeWindow();
}, {
title: 'ERROR'
});
}
});
} else {
loading.hide();
weui.alert("验证信息有误,请核实后重新进行验证!", function() {
console.log('ok');
wx.closeWindow();
}, {
title: '提示'
});
}
}
},
error: function(err4) {
loading.hide();
weui.alert(err4.toString(), function() {
console.log('ok');
wx.closeWindow();
}, {
title: 'ERROR'
});
}
});
}
},
error: function(err3) {
loading.hide();
weui.alert(err3.toString(), function() {
console.log('ok');
wx.closeWindow();
}, {
title: 'ERROR'
});
}
});
},
//申请退款
subrefund(self) {
if (binduserid < 1) {
weui.alert("非法请求", function() {
console.log('ok');
wx.closeWindow();
}, {
title: '错误'
});
return
}
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/mp_wechat/svmpwechat/ApplyCreditRefund',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: {
"mp_session_id": sessionid,
"userid": binduserid,
},
success: function(resp) {
console.log(resp)
if (resp.code != "10000") {
loading.hide();
weui.alert(resp.message, function() {
console.log('ok');
wx.closeWindow();
}, {
title: '提示'
});
} else {
loading.hide();
$("#credit_view").hide();
$("#smbcontext").text("退款申请已提交,审核通过后,预计1-7个工作日通过商户退款或现金红包形式退款到当前微信账户!")
$("#smb_view").show()
}
},
error: function(err) {
loading.hide();
weui.alert(err.toString(), function() {
console.log('ok');
wx.closeWindow();
}, {
title: 'ERROR'
});
}
});
},
//timer处理函数
SetRemainTime() {
if (curCount == 0) {
window.clearInterval(InterValObj); //停止计时器
$("#sendcodebtn").css("pointer-events", "");
$("#sendcodebtn").css("color", "");
$("#sendcodebtn").html("获取验证码");
} else {
curCount--;
$("#sendcodebtn").html(curCount + "秒后重新获取");
}
},
norefound(self) {
weui.alert("信用金缴纳方式为现金缴纳的,仅支持线下现金退款,请联系学校管理员!", function() {
console.log('ok');
wx.closeWindow();
}, {
title: '无法申请退款'
});
},
parseUrl() {
var searchHref = window.location.search.replace('?', '');
var params = searchHref.split('&');
var returnParam = {};
params.forEach(function(param) {
var paramSplit = param.split('=');
returnParam[paramSplit[0]] = paramSplit[1];
});
return returnParam;
},
// 判断是否为手机号
isPoneAvailable(pone) {
var myreg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
if (!myreg.test(pone)) {
return false;
} else {
return true;
}
},
//关闭窗口
knowCloseWindow() {
wx.closeWindow();
}
}
}
</script>
<style scoped>
.weui-tab__content {
width: 86vw;
margin-left: 7vw;
}
.weui-label,
.weui-input {
font-size: 15px;
}
.weui-btn {
font-size: 17px !important;
width: 60vw !important;
z-index: 999;
letter-spacing: 2px;
line-height: 50px;
height: 50px;
padding: 0;
position: fixed;
bottom: 8vh;
left: 20vw;
margin: 0 !important;
}
.weui-icon-btn_close {
display: none;
}
.weui-cell:before {
left: 0;
}
#weui-picker-confirm {
bottom: 20px !important;
}
.weui-cell {
padding: 16px 0;
}
.weui-cell__bd {
font-size: 14px;
text-align: right;
color: gray;
}
</style>
<template>
<view class="container">
<view class="contentBox" v-if="!depotMoneyother">
<!-- <image mode='widthFix' src="https://xiaopay2020.oss-cn-shenzhen.aliyuncs.com/static/weapp/images/xiaopaycard (31).png"></image> -->
<view class="contentDiv">
<view class="headview">
<view class="schoolname">{{PersonalInfo.schoolname}}</view>
<view class="IconCls">电子校园卡</view>
</view>
<!-- 卡号显示 -->
<view class="cardNum">
<view class="cardNumleft"><span>账户:</span> **** **** ****
{{bankInfo_.accountNo.slice(bankInfo_.accountNo.length-4)}} <span>(工商III类户)</span>
</view>
<view class="cardNumright" id="cardNumright" @click="CopyCardNumber">复制</view>
</view>
<view class="HidenText">
<view class="userName">姓名:<span>{{PersonalInfo.name}}</span></view>
<view class="StudentCls" v-if="PersonalInfo.usertype=='1'">
班级:{{PersonalInfo.gradename}}({{PersonalInfo.classname}})</view>
<view class='TeacherCls' v-else>教职工</view>
</view>
<view class="Balance">
<view class="cardBalanceTx">余额:¥<span>{{cardBalanceTx}}</span></view>
<view @click="ToWalletTx">
<span style="display: inline-block;padding-right: 10rpx;">余额提现</span>
<image style="position: relative;width: 13rpx;height: 20rpx;" class='ImgIcon1' mode='widthFix'
:src="ImgUrl+'images/xiaopaycard (17).png'" alt=""></image>
</view>
</view>
</view>
<!-- 充值明细 -->
<view class="RechargeDetailed" @click="BackToMini('purchaseDetail')">
账户明细
</view>
<!-- 充值账户 -->
<view class="Recharge">
<span></span>
<span>账户充值</span>
</view>
<!-- 充值的金额 -->
<view class="MoneyBox">
<view class="depotMoney" @click="depotMoney(item.value,index)"
v-bind:class="(MoneyIndex==index)?'choiceClass':''" :data-money="item.value||0"
v-for="(item,index) in MoneyList" :key="index">
<span class="value">
{{item.value}}
</span>
<span style="font-size: 28rpx;font-weight: 600;margin-left: 7rpx;">{{item.lable}}</span>
<!-- <span class="tips" v-show="item.tips">
{{item.tips}}
</span> -->
</view>
</view>
<!-- 充值限额提示 -->
<view class="depositbox">
<image mode='widthFix' class="depositImg" src="../../../static/img/depositIcon.png"></image>
<span style="vertical-align:middle;font-size: 28rpx;color: #333333;font-weight: 500;">最大可充值金额:<span
style="color:red;"><span class="canDepositTx">2000</span></span></span>
</view>
<!-- 充值其它金额 -->
<view class="OtherMoney" v-if="isOtherMoney">
<span></span>
<input v-model="inputOtherM" @input="inputControl" @blur="ReturnToTop" placeholder="请输入其他金额,最低3元"
placeholder-class="placeholderinputOtherM" type="text" maxlength="6" />
</view>
<!-- 支付方式 -->
<view class="payType" @click="queryBindCardList">
<view>付款方式</view>
<view> {{ bankInfo_.bindCardName}} {{ bankInfo_.bindCardNo.slice(bankInfo_.bindCardNo.length-4) }}<span
class="arrow"></span></view>
<!-- <view>{{bankInfo_.accountName}}({{bankInfo_.accountNo.slice(bankInfo_.accountNo.length-4)}}) <span
class="arrow"></span></view> -->
</view>
<!-- <view class="" style="height: 1rpx;background-color: #DFDFDF;"></view> -->
<!-- 充值生活费 -->
<view class="bottomdiv">
<view class="DepositID" @click="toDeposit"
v-bind:style="Money!=''?'':'background: #e6e6e6 !important;'">
<span>充值生活费</span>
</view>
<!-- -->
<view class="switchbankCard" @click="ChangeBankPay">我要换银行卡支付</view>
</view>
</view>
<!-- 其他充值金额 -->
<view class="contentBox" v-if="depotMoneyother">
<view class="OtherTitle">充值金额</view>
<view class="inputOtherM">
<span></span>
<input v-model="inputOtherM" @input="inputControl" placeholder-class="placeholderinputOtherM"
type="text" maxlength="6" />
</view>
<view class="OtherLine"></view>
<!-- 充值范围 -->
<view class="Recharge_">
<!-- <image mode="widthFix" class="depositImg" src="../../static/img/depositIcon.png"></image> -->
<span>最大可充值金额:</span>
<span><span>3.00 ~ 2000.00</span></span>
</view>
</view>
<!-- 弹出层 -->
<uni-popup ref="popup" :mask-click="false">
<!-- 充值确认 -->
<view class="RechargeConfirmationBox">
<view class="RechargeInfo">
<view class="closePhoneBox" @click="close()">
<image src="../../../static/img/close.png" mode="aspectFit"></image>
</view>
<view class="RechargeInfo1">
充值生活费
</view>
<view style="width: 520rpx;height: 1rpx;background: #EEEEEE;"></view>
<view class="ContenInfo">
<view class="" v-if="isOtherMoney">
充值金额:{{inputOtherM}}
</view>
<view class="" v-else>
充值金额:{{Money}}
</view>
<view class="">
付款账户:{{bankInfo_.bindCardName}}({{bankInfo_.bindCardNo && bankInfo_.bindCardNo.slice(bankInfo_.accountNo.length-4)}})
</view>
</view>
<view style="width: 520rpx;height: 1rpx;background: #EEEEEE;"></view>
<!-- 取消 确认充值按钮 -->
<view class="BtngGoup">
<view class="" @click="close()">
取消
</view>
<view class="" @click="ExchangeRecharge">
确认充值
</view>
</view>
</view>
</view>
</uni-popup>
<!-- 选择银行卡 -->
<view class="selectCard">
<van-popup v-model="popshow" round position="bottom" :style="{ height: '30%' }">
<!-- 银行卡列表 -->
<view class="accountlist">
<!-- 切换绑定的一类卡列表 -->
<view class="showBindCardList">
<view class="choiceBox">选择付款账户</view>
<view class="ListItem" @click="ChangeCardPay(item)" v-for="(item,index) in bindcardList"
:key="index">
<span style="padding-right:10px;">{{item.bindCardName}} </span>
<span>尾号:{{item.bindCardNo.slice(item.bindCardNo.length-4)}}</span>
<!-- <image class='BankListImg' src='../../../static/img/choiceBank.png'></image> -->
</view>
</view>
</view>
</van-popup>
</view>
</view>
</template>
<script>
import {
Dialog,
Toast
} from 'vant';
import keyboardPackage from "@/components/keyboard-package/keyboard-package.vue"
import cityData from "@/common/js/city.js"
var gHost = "https://" + window.location.host;
if (window.location.protocol != "https:") {
gHost = "https://fpdev.xiaopay.net";
// gHost = "/api";
}
let times = 0;
var limitClick = false; //禁止重复点击
var sessionID = '',
userID = '';
var payCardNumber = ''; //一类卡号
var orderSerialNo = ''; //提现结果查询 指令号
var businessNo = '',
otpOrderNo = '',
mobileNo = '';
var msCount = 60; //定时器
var MyTimer = null;
var fromType = 0; //0转账 1提现
var opeType = 0; //0充值 1提现 手机号验证
var bankInfo = {
acctNoArray: '',
idNo: '',
schoolId: '',
trueName: '',
userId: '',
sessionid: '',
wechattype: 1
}
/**
* 对象转拼接字符串
* @param {*} res Object 需要转换的数据对象
*/
function OforS(res) {
var resL = 0;
var outS = "";
for (var i in res) {
if (resL == 0) {
outS += "" + i + "=" + res[i];
} else {
outS += "&" + i + "=" + res[i];
}
resL++;
}
return outS;
}
export default {
components: {
keyboardPackage
},
name: "Recharge",
data() {
return {
popshow: false,
// 输入其它金额
isOtherMoney: false,
inputOtherM: '',
RechargeException: false,
depotMoneyother: false, //其他充值
Money: '', //选择金额
MoneyIndex: -1,
RechargeMax: '2000', //最大充值限制
ReflectMoney: '', //提现金额
VerifyCode: '', //验证码
cardBalanceTx: '0', //余额
CodeMsg: "获取验证码",
type: 'number',
PersonalInfo: {
schoolname: "",
name: "",
usertype: "1"
},
bankInfo_: {
accountNo: '**** **** **** 1234',
bindCardName: '',
bindCardNo: ''
},
ImgUrl: this.$ImgUrl,
MoneyList: Array(6).fill(1).map((v, index) => {
return {
lable: index == 5 ? '其他金额' : '',
value: index == 5 ? '' : 50 * (index + 1),
tips: index == 1 ? "推荐充值" : null
}
}),
numberList: [],
tempFiles1: '../../static/img/idCardBg1.png', //上传身份证临时选择文件
tempFiles2: '../../static/img/idCardBg0.png',
//绑定的一类卡列表
bindcardList: []
}
},
onLoad: function(options) {
console.log(options);
// 初始化
userID = options['userID'] || '';
sessionID = options['seesionID'] || '';
fromType = options['fromType'] || '';
bankInfo.sessionid = sessionID || '';
this.QueryUserInfo()
},
created: function() {
},
mounted: function() {
},
methods: {
async ChangeBankPay(){
uni.showLoading({ mask:true });
let status = await this.accountCloseacceptStatusQuery();
uni.hideLoading();
if( status !== 0 ) return false;
this.BackToMini('AssignAddCard')
},
accountCloseacceptStatusQuery(){
return new Promise(( resolve,reject) => {
$.ajax({ //查询是否提交销户
url:gHost + "/bank-wechat/icbc/account/manager/accountCloseacceptStatusQuery",
type:'post',
data:{
schoolId:this.PersonalInfo.schoolid,
userId:this.PersonalInfo.id,
wechattype: 1,
'sessionid': sessionID,
},
contentType: "application/x-www-form-urlencoded",
headers: {
'sessionid': sessionID,
},
success:( { code , message , results } ) => {
let status = results && results.status ; // 0表示未申请,1申请中,2已销户,3销户申请失败
if(code === '10000' && status == '0'){
}else if(code === '10000' && status == '1'){
uni.showToast({
title: "您已提交销户申请,银行正在审核中。",
icon:'none',
})
}else{
uni.showToast({
title: message,
icon:'none',
})
}
resolve(status)
},
error: function(err) {
uni.showToast({
title: err.message || '请求失败',
icon:'none',
});
reject(-1)
},
});
})
},
// 验证码弹出框开启
toDeposit() {
if (this.isOtherMoney) {
if (this.inputOtherM == '') {
uni.showModal({
title: "系统提示",
content: "请输入要充值的金额!"
})
return
}
if (parseFloat(this.inputOtherM) * 1 < 3) {
weui.topTips('充值金额必须大于3元');
return
}
} else {
if (this.Money == '') {
uni.showModal({
title: "系统提示",
content: "请选择要充值的金额!"
})
return
}
if (parseFloat(this.inputOtherM) * 1 < 3) {
weui.topTips('充值金额必须大于3元');
return
}
}
this.$refs.popup.open('top')
},
// 验证码弹出框关闭
close() {
this.$refs.popup.close()
},
//切换到提现
ToWalletTx() {
$('#DepositBox').css('display', 'none');
$('#TxWalletBox').css('display', 'block');
// $('.TitleHeader').html('电子账户提现');
$('.doBtnTx').html('提现');
opeType = 1;
uni.navigateTo({
url: "../Reflect/Reflect?" + OforS({
sessionID: sessionID,
userID: userID
})
})
},
//全部提现
TxAllFun() {
this.ReflectMoney = this.cardBalanceTx * 1
// $('.TxClsTx').val($('.cardBalanceTx')[0].textContent * 1);
},
// 输入限制
inputControl(e) {
let this_ = this
let obj = e.detail
this.$nextTick(function() {
obj.value = obj.value.replace(/[^\d.]/g, ""); //清除"数字"和"."以外的字符
obj.value = obj.value.replace(/^\./g, ""); //验证第一个字符是数字而不是.
obj.value = obj.value.replace(/\.{2,}/g, "."); //只保留第一个. 清除多余的.
obj.value = obj.value.replace(".", "$#$").replace(/\./g, "").replace("$#$", "."); //只允许输入一个小数点
obj.value = obj.value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
obj.value = obj.value * 1 > 2000 ? 2000 : obj.value;
if (obj.value == '' || obj.value * 1 < 3) {
$('.DepositID').attr('style', 'background: rgb(230, 230, 230) !important;');
} else {
$('.DepositID').removeAttr('style');
}
this_.inputOtherM = obj.value
})
},
//input键盘弹起不会弹
ReturnToTop() {
this.$nextTick(function() {
document.scrollingElement.scrollTo(0, this.scrollTop);
})
},
// 充值
async ExchangeRecharge() {
let amount,
bindMedium,
summary;
if (this.isOtherMoney) {
if (this.inputOtherM == '') {
uni.showModal({
title: "系统提示",
content: "请输入要充值的金额!"
})
return
}
amount = this.inputOtherM * 1
} else {
if (this.Money == '') {
uni.showModal({
title: "系统提示",
content: "请选择要充值的金额!"
})
return
}
amount = this.Money * 1
}
let this_ = this;
uni.showLoading({
mask: true,
title: "处理中......"
})
try{
let status = await this.accountCloseacceptStatusQuery();
if(status !== 0) { uni.hideLoading(); return false };
}catch(e){
uni.hideLoading();
return false
}
$.ajax({
url: gHost + '/bank-wechat/icbc/account/exchange/recharge',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
amount: amount,
bindMedium: this.bankInfo_.bindCardNo,
summary: "充值",
},
headers: {
'sessionid': sessionID,
},
success: function(res5) {
uni.hideLoading()
if (res5.code == "10000") {
this_.close();
setTimeout(() => {
this_.queryBankInfo();
},3000);
wx.showModal({
title:'充值申请已提交',
content:'银行处理需要1-5分钟时间,充值结果以余额查询为准。',
showCancel:false
})
} else {
weui.topTips(res5.message)
}
},
error: function(err) {
uni.hideLoading();
},
});
},
// 充值结果查询
async ExchangeRechargeQuery(flowId, oriCorpSerno) {
let this_ = this;
let loading = Toast.loading({
message: '加载中...',
forbidClick: true,
loadingType: 'spinner',
duration: 0
});
$.ajax({
url: gHost + '/bank-wechat/icbc/account/exchange/rechargeQuery',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
flowId: flowId,
oriCorpSerno: oriCorpSerno,
},
headers: {
'sessionid': sessionID,
},
success: function(res5) {
loading.clear();
if (res5.code == "10000") {
let appStatus = res5.results.appStatus;
if (appStatus == '4') {
uni.showModal({
title: "系统提示",
content: "充值成功!"
})
this_.queryBankInfo();
} else {
uni.showModal({
title: "系统提示",
content: appStatus == '1' ? '申请已受理' : res5.message
})
}
} else {
weui.topTips(res5.message)
uni.showModal({
title: "系统提示",
content: res5.message
})
}
},
error: function(err) {
loading.clear();
},
});
},
// 复制我卡号
async CopyCardNumber() {
let value = this.bankInfo_.accountNo
Dialog({
title: '系统提示',
message: '复制成功!'
});
this.$nextTick(function() {
let clipboard = new ClipboardJS('#cardNumright', {
text: function() {
return value
}
})
})
},
//选择输入其他金额
OtherMoney() {
this.depotMoneyother = true
},
// 快捷选择金额
async depotMoney(value, MoneyIndex) {
console.log(value)
if (!value) {
this.isOtherMoney = true
this.Money = ''
this.MoneyIndex = MoneyIndex
return
}
this.isOtherMoney = false
this.Money = parseInt(value)
this.MoneyIndex = MoneyIndex
},
//按钮操作
HideHTML(dom, type) {
this.$nextTick(function() {
if (type == 0) {
$('.' + dom).css('display', 'none');
} else {
$('.' + dom).css('display', 'block');
}
})
},
//返回小程序 跳转指定页面
BackToMini(page) {
if (page == 'UserMain' || page == 'personalCenter') {
jWeixin.miniProgram.switchTab({
url: `/pages/${page}/main`,
});
} else {
jWeixin.miniProgram.redirectTo({
url: `/pages/${page}/main`,
});
}
},
//换绑卡
ChangeCardPay(item) {
let this_ = this;
if (bankInfo.bindCardNo == item.bindCardNo) {
return
}
var loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/icbc/account/bindcard/changeDefaultBinding',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
bindMedium: item.bindCardNo,
bindMediumName: item.bindCardName
},
success: function(res5) {
loading.hide();
if (res5.code == "10000") {
this_.queryUserBankInfo();
this_.close();
} else {
weui.topTips(res5.message)
}
this_.popshow = false;
},
error: function(err) {
loading.hide();
},
});
},
//查询一类卡绑定列表
queryBindCardList() {
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/icbc/account/bindcard/bindingList',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
mediumId: bankInfo.accountNo,
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1
},
success: function(res4) {
loading.hide();
if (res4.code == "10000") {
this_.bindcardList = res4.results;
this_.popshow = true
} else {
weui.topTips(res4.message)
}
},
error: function(err) {
loading.hide();
},
});
},
//获取银行余额
queryBankInfo() {
let this_ = this;
// let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/icbc/account/balance/balanceQuery',
type: "POST",
timeout: 8000,
contentType: "application/x-www-form-urlencoded",
data: {
mediumId: bankInfo.accountNo || '',
schoolId: bankInfo.schoolId || '',
userId: bankInfo.userId || '',
sessionid: sessionID,
wechattype: 1,
},
success: function(res3) {
// loading.hide();
if (res3.code == "10000") {
if (res3.results.accountBalance == null) {
weui.topTips("账户信息为空,余额查询失败");
} else {
this_.cardBalanceTx = (res3.results.accountBalance * 1).toFixed(2);
$('.TxClsTx').attr('placeholder',
`可提现金额${(res3.results.accountBalance * 1).toFixed(2)}元`
)
this_.RechargeMax = ((2000 - ((res3.results.accountBalance * 1).toFixed(2) *
1)).toFixed(2));
}
} else {
weui.topTips(res3.message)
}
},
error: function(err) {
// loading.hide();
},
complete: function(XMLHttpRequest, status) {
// loading.hide();
if (status == 'timeout') {
weui.topTips("请求超时,余额查询失败");
}
}
})
},
//获取用户已填写银行信息
queryUserBankInfo() {
let this_ = this;
// let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/user/bank/get',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1
},
success: function(res2) {
if (res2.code == "10000") {
if (!res2.results) {
weui.topTips("获取用户银行信息失败!")
// loading.hide();
return
}
bankInfo = res2.results;
bankInfo.sessionid = sessionID;
this_.queryBankInfo(); //查余额
this_.bankInfo_ = bankInfo;
// this_.getBindingList(bankInfo.accountNo,bankInfo.schoolId,bankInfo.id);
} else {
weui.topTips(res2.message)
}
},
error: function(err) {
// loading.hide();
},
});
},
//查询用户信息
QueryUserInfo() {
let this_ = this;
let loading = Toast.loading({
message: '加载中...',
forbidClick: true,
loadingType: 'spinner',
duration: 0
});
$.ajax({
url: gHost + '/wechat/svweapp/QueryPersonalInfo',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
userid: userID,
sessionid: sessionID,
wechattype: 1
},
success: function(res1) {
loading.clear();
if (res1.code == "10000") {
bankInfo.schoolId = res1.results.schoolid;
bankInfo.userId = res1.results.id;
this_.PersonalInfo = res1.results
if (res1.results.usertype == 1) {
$('.StudentCls').css('display', 'block');
$('.TeacherCls').css('display', 'none');
} else {
$('.StudentCls').css('display', 'none');
$('.TeacherCls').css('display', 'block');
}
this_.queryUserBankInfo();
} else {
weui.topTips(res1.message);
setTimeout(() => {
this_.BackToMini('UserMain');
}, 1500)
}
},
error: function(err) {
loading.clear();
},
});
},
}
}
</script>
<style lang="scss">
html,
body,
page {
width: 750rpx;
background: linear-gradient(180deg, #FFFFFF 0%, #FAFAFA 100%);
}
.showBindCardList {
.choiceBox {
text-align: center;
font-weight: bold;
height: 50px;
line-height: 50px;
padding: 0;
border-bottom: 0.5px solid #e6e6e6;
}
.ListItem {
border-bottom: 1rpx solid #e6e6e6;
font-size: 30rpx;
padding: 25rpx 0;
background: #fff;
position: relative;
text-align: center;
}
}
.SubmittedSuccessfully {
width: 400rpx !important;
height: 200rpx !important;
margin: 0 auto !important;
background: #000000;
opacity: 0.8;
border-radius: 8rpx;
}
.cardNum {
width: 574rpx;
margin: 0 auto;
display: flex;
justify-content: space-between;
padding-top: 36rpx;
font-size: 24rpx;
.cardNumleft {
font-family: PingFang SC;
font-weight: 500;
color: #FFFFFF;
}
.cardNumright {
font-family: PingFang SC;
font-weight: 500;
text-decoration: underline;
color: #FFFFFF;
}
}
.RechargeDetailed {
text-align: center;
// width: 118rpx;
height: 32rpx;
margin: 0 auto;
font-size: 30rpx;
font-family: PingFang SC;
font-weight: 500;
text-decoration: underline;
color: #36A8FF;
margin-top: 50rpx;
}
.contentBox {
width: 670rpx;
height: 376rpx;
margin: 0 auto;
}
.contentDiv {
height: 100%;
// margin-top: 36rpx;
border-radius: 15rpx;
background-image: url('https://xiaopay2020.oss-cn-shenzhen.aliyuncs.com/static/weapp/images/xiaopaycard (31).png');
background-repeat: no-repeat;
background-size: 100% 100%;
position: relative;
top: 36rpx;
}
.HidenText {
width: 574rpx;
margin: 0 auto;
padding-top: 88rpx;
}
.HidenText,
.Balance {
padding-left: 46rpx;
padding-right: 40rpx;
display: flex;
justify-content: space-between;
font-size: 28rpx;
color: #FFFFFF;
}
.Balance {
width: 574rpx;
margin: 0 auto;
margin-top: 20rpx;
font-size: 30rpx;
font-family: PingFang SC;
font-weight: bold;
color: #FFFFFF;
}
.Recharge {
// height: 30rpx;
font-size: 32rpx;
font-family: PingFang SC;
font-weight: bold;
color: #333333;
margin-top: 58rpx;
span:nth-child(1) {
width: 4rpx;
height: 30rpx;
background: #23D6A3;
border-radius: 2rpx;
display: inline-block;
position: relative;
top: 5rpx;
}
span:nth-child(2) {
display: inline-block;
margin-left: 16rpx;
}
}
.headview {
display: flex;
justify-content: space-between;
// padding-left: 40rpx;
// padding-right: 40rpx;
padding-top: 36rpx;
width: 574rpx;
margin: 0 auto;
}
.headview .schoolname {
width: 252rpx;
height: 50rpx;
font-size: 36rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #FFFFFF;
line-height: 50rpx;
}
.headview .IconCls {
width: 170rpx;
height: 48rpx;
background: #20946D;
border-radius: 25rpx;
font-size: 24rpx;
font-weight: 400;
color: #FFFFFF;
line-height: 48rpx;
text-align: center;
}
.MoneyBox {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
height: auto;
color: #888888;
width: 686rpx;
margin: 0 auto;
}
.choiceClass {
background: rgba(39, 266, 148, 0.1) !important;
color: #28D79C;
}
.MoneyBox view {
width: 220rpx;
height: 120rpx;
background: #FFFFFF;
border-radius: 8rpx;
border: 1rpx solid #EEEEEE;
margin-top: 16rpx;
text-align: center;
position: relative;
box-shadow: 0px 9rpx 23rpx 0rpx rgba(25, 26, 88, 0.07);
}
.depotMoney .value {
font-size: 45rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
line-height: 120rpx;
text-align: center;
}
.depotMoney .tips {
// width: 79rpx;
// height: 33rpx;
// background: linear-gradient(180deg, #FA6400 0%, #FD9D00 100%);
// border-radius: 4rpx;
// font-size: 18rpx;
// font-weight: 500;
// padding: 4rpx;
// text-align: center;
// float: right;
// position: absolute;
// right: 0rpx;
// line-height: 33rpx;
}
.OtherMoney {
display: flex;
justify-content: flex-start;
// color: #999999;
// font-size: 28rpx;
// font-family: PingFangSC-Regular, PingFang SC;
// font-weight: 400;
// color: #999999;
// line-height: 40rpx;
width: 686rpx;
height: 100rpx;
background: #F7F6FB;
border-radius: 10rpx;
margin: 0 auto;
line-height: 100rpx;
margin-top: 32rpx;
span {
display: inline-block;
font-size: 40rpx;
font-family: PingFang SC;
font-weight: bold;
color: #000000;
padding-left: 26rpx;
}
input {
height: 100%;
}
}
.OtherMoney view:nth-child(2) {
// width: 30rpx;
// height: 30rpx;
// background: #F0F0F0;
// border-radius: 50%;
// text-align: center;
// line-height: 30rpx;
// margin-top: 7rpx;
// margin-left: 5rpx;
}
.payType {
height: 98rpx;
line-height: 98rpx;
display: flex;
justify-content: space-between;
}
.payType view:nth-child(1) {
// width: 120rpx;
height: 42rpx;
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 500;
color: #888888;
line-height: 98rpx;
}
.payType view::nth-child(2) {
width: 225rpx;
height: 45rpx;
font-size: 32rpx;
font-family: PingFang SC;
font-weight: bold;
color: #333333;
line-height: 45rpx;
}
.arrow {
transform: rotate(-45deg);
top: -3rpx;
border: solid #999999;
border-width: 0 1rpx 1rpx 0;
display: inline-block;
padding: 8rpx;
position: relative;
}
@media (min-height: 650px) {
.bottomdiv {
position: fixed;
left: 0;
right: 0;
bottom: 30rpx;
}
}
.DepositID {
width: 630rpx;
height: 92rpx;
background: #04BA73;
border-radius: 8rpx;
margin: 0 auto;
text-align: center;
bottom: 30rpx;
}
.DepositID span {
height: 50rpx;
font-size: 36rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #FFFFFF;
line-height: 92rpx;
}
.switchbankCard {
text-align: center;
/* width: 205px; */
// height: 28rpx;
font-size: 26rpx;
font-family: PingFang SC;
font-weight: 500;
text-decoration: underline;
color: #268EF8;
margin-top: 23rpx;
}
.RechargeConfirmationBox {
position: fixed;
left: 0;
right: 0;
top: 400rpx;
width: 618rpx;
height: 478rpx;
background: #FFFFFF;
border-radius: 8rpx;
margin: 0 auto;
.RechargeInfo {
width: 520rpx;
height: 100%;
margin: 0 auto;
.RechargeInfo1 {
height: 124rpx;
line-height: 124rpx;
font-size: 36rpx;
font-family: PingFang SC;
font-weight: bold;
color: #000000;
text-align: center;
}
.ContenInfo {
text-align: center;
// width: 383rpx;
height: 159rpx;
margin: 0 auto;
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 500;
color: #010101;
view {
line-height: 75rpx;
}
}
.BtngGoup {
justify-content: space-between;
display: flex;
margin-top: 40rpx;
view {
width: 250rpx;
height: 88rpx;
border-radius: 8rpx;
text-align: center;
line-height: 88rpx;
}
view:nth-child(1) {
background: #EBEBEB;
font-size: 36rpx;
font-family: PingFang SC;
font-weight: 500;
color: #1CC48B;
}
view:nth-child(2) {
background: #1CC48B;
font-size: 36rpx;
font-family: PingFang SC;
font-weight: 500;
color: #FFFFFF;
}
}
}
}
.closePhoneBox {
// width: 35rpx;
height: 35rpx;
position: relative;
right: -20rpx;
top: 20rpx;
text-align: right;
image {
width: 40rpx;
height: 40rpx;
position: relative;
}
}
.doBtnTx {
width: 506rpx;
height: 92rpx;
background: #04BA73;
border-radius: 8rpx;
color: #FFFFFF;
position: absolute;
left: 0;
right: 0;
margin: 0 auto;
bottom: 38rpx;
}
.PhoneNum,
.VerifyCode {
width: 506rpx;
height: 80rpx;
line-height: 60rpx;
background: #F7F6FB;
margin: 0 auto;
margin-top: 20rpx;
}
.VerifyCode {
display: flex;
justify-content: space-between;
}
.VerifyCode input {
width: 200rpx;
}
.CodeMsg {
color: #01BC73;
background: #F7F6FB;
font-size: 32rpx;
font-weight: 600;
line-height: 80rpx;
letter-spacing: 3rpx;
}
.placeholderInput {
color: #AAAAAA;
font-size: 42rpx;
font-weight: 500;
letter-spacing: 3rpx;
// padding-left: 50rpx;
height: 80rpx;
}
.OtherTitle {
height: 67rpx;
font-size: 48rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #010101;
line-height: 67rpx;
padding-top: 60rpx;
}
.inputOtherM {
display: flex;
height: 100rpx;
margin-top: 40rpx;
}
.inputOtherM input {
border: none;
outline: none;
height: 50rpx;
padding-left: 16rpx;
font-size: 72rpx;
font-weight: 600;
}
.inputOtherM span:nth-child(1) {
width: 72rpx;
font-size: 80rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #010101;
line-height: 100rpx;
}
.OtherLine {
width: 631rpx;
height: 1rpx;
background-color: #CCCCCC;
margin-top: 19rpx;
}
.depositbox {
margin-top: 31rpx;
height: 30rpx;
line-height: 30rpx;
}
.depositImg {
width: 24rpx;
height: 24rpx;
vertical-align: middle;
margin-right: 8rpx;
position: relative;
top: -2rpx;
}
.Recharge_ {
height: 40rpx;
font-size: 28rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
line-height: 40rpx;
margin-top: 40rpx;
}
.Recharge_ span:nth-child(2) {
font-size: 28rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #FA6400;
}
.placeholderinputOtherM {
height: 50rpx;
// font-family: PingFangSC-Semibold, PingFang SC;
// font-weight: 600;
// color: #010101;
line-height: 50rpx;
width: 323rpx;
font-size: 28rpx;
font-family: PingFang SC;
font-weight: 500;
color: #888888;
}
// 异常处理
.RechargeException {
padding-top: 20rpx;
}
.weui-label {
// width: 118rpx;
height: 42rpx;
font-size: 30rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #3D3D3D;
line-height: 42rpx;
font-weight: bold;
margin-left: 30rpx;
}
.tiptext {
height: 1.06rem;
font-size: 0.75rem;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #03BC73;
line-height: 1.06rem;
margin-bottom: 0.625rem;
text-align: center;
}
.bottomDetail {
width: 628rpx;
height: 88rpx;
color: white;
// position: fixed;
// left: 0;
// right: 0;
margin: 0 auto;
background-color: #03BC73;
text-align: center;
line-height: 88rpx;
margin-top: 84rpx;
}
.RechargeException input::placeholder {
color: #A1A4A8;
}
.RechargeException .weui-cell {
height: 4rem;
padding: 0 !important;
}
.idCardPhoto1,
.idCardPhoto2 {
width: 388rpx;
height: 224rpx;
margin: 0 auto;
margin-top: 20rpx;
}
.idCardPhoto1 image,
.idCardPhoto2 image {
width: 100%;
height: 100%;
position: relative;
}
.weui-toptips_success {
background-color: #03BC73 !important
}
.positionCam {
height: 32rpx;
font-size: 22rpx;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
color: #6D7278;
line-height: 32rpx;
text-align: center;
position: relative;
top: -29px;
}
.BgCoverBox {
width: 100vw;
height: 100vh;
position: fixed;
left: 0;
top: 0;
z-index: 10;
background: #000000;
opacity: 0.5;
}
.hideListCover {
max-height: 50vh;
overflow-y: auto;
padding: 0;
}
.bottomDiv {
font-weight: bold;
height: 50px;
line-height: 50px;
border-bottom: 1px solid #e6e6e6;
}
</style>
<template>
<view class="container">
<view class="ReflectBox">
<view class="left_">提现金额 </view>
<view class="right_">每日可提现一次</view>
</view>
<view class="OtherMoney" v-if="true">
<span></span>
<input class="TxClsTx" v-model="inputOtherM" @input="inputControl" @blur="ReturnToTop"
:placeholder="placeholder" placeholder-class="placeholderinputOtherM" type="text" maxlength="6" />
<span class="ALL" @click="TxAllFun">全部</span>
</view>
<!-- 提现账户 -->
<view class="payType" @click="queryBindCardList">
<view>提现账户</view>
<view>{{bankInfo_.accountName}}({{bankInfo_.accountNo.slice(bankInfo_.accountNo.length-4)}}) <span
class="arrow"></span></view>
</view>
<view class="OtherMoney" v-if="false" style="color: #BFBFBF;font-weight: 500;">
每日仅可提现一次,请明日再来。
</view>
<view class="bottomdiv">
<view class="DepositID" @click="toDeposit(0)" v-bind:style="inputOtherM>0?'':'opacity: 0.5 !important;'">
<span>提现</span>
</view>
<view class="switchbankCard" @click="BackToMini('TxHistory')">提现记录</view>
</view>
</view>
</template>
<script>
import {
Dialog
} from 'vant';
import keyboardPackage from "@/components/keyboard-package/keyboard-package.vue"
import cityData from "@/common/js/city.js"
var gHost = "https://" + window.location.host;
if (window.location.protocol != "https:") {
gHost = "https://fpdev.xiaopay.net";
}
let times = 0;
var limitClick = false; //禁止重复点击
var sessionID = '',
userID = '';
var payCardNumber = ''; //一类卡号
var orderSerialNo = ''; //提现结果查询 指令号
var businessNo = '',
otpOrderNo = '',
mobileNo = '';
var msCount = 60; //定时器
var MyTimer = null;
var fromType = 0; //0转账 1提现
var opeType = 0; //0充值 1提现 手机号验证
var bankInfo = {
acctNoArray: '',
idNo: '',
schoolId: '',
trueName: '',
userId: '',
sessionid: '',
wechattype: 1
}
export default {
components: {
},
name: "Reflect",
data() {
return {
Money: '',
inputOtherM: '',
ImgUrl: this.$ImgUrl,
ReflectMoney: 3,
cardBalanceTx: '',
placeholder: "可提现金额0.00元",
bankInfo_: {
accountNo: '**** **** **** 1234'
},
}
},
onLoad: function(options) {
console.log(options);
// 初始化
userID = options['userID'] || '';
sessionID = options['sessionID'] || '';
fromType = options['fromType'] || '';
bankInfo.sessionid = sessionID || '';
this.QueryUserInfo()
},
created: function() {
},
mounted: function() {
},
methods: {
//全部提现
TxAllFun() {
let this_ = this
this.inputOtherM = this.cardBalanceTx * 1
this.$nextTick(function() {
// if (this_.inputOtherM == '' || this_.inputOtherM * 1 < 3) {
// $('.DepositID').attr('style', 'background: rgb(230, 230, 230) !important;');
// } else {
// $('.DepositID').removeAttr('style');
// }
})
},
//查询一类卡绑定列表
queryBindCardList() {
return
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/query/account',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1
},
success: function(res4) {
loading.hide();
if (res4.code == "10000") {
this_.bindcardList = res4.results.accountList[0].bindcardList
this_.popshow = true
} else {
weui.topTips(res4.message)
}
},
error: function(err) {
loading.hide();
},
});
},
// 提现
async toDeposit() {
if (!this.inputOtherM) {
uni.showModal({
title: "系统提示",
content: "请输入要提现的金额!"
})
return
}
if (this.inputOtherM * 1 < 0.01) {
weui.topTips('提现金额须大于等于0.01元');
return
}
if (this.inputOtherM * 1 > this.ReflectMoney) {
weui.topTips(`提现金额不可大于账户余额`);
return
}
await this.ExchangeWithdraw()
},
// 提现
async ExchangeWithdraw() {
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/icbc/account/exchange/withdraw',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
amount: this_.inputOtherM * 1,
bindMedium: this_.bankInfo_.bindCardNo,
summary: "提现",
},
headers: {
'sessionid': sessionID,
},
success: function(res5) {
loading.hide();
if (res5.code == "10000") {
// this_.ExchangeWithdrawQuery(res5.results.flowId, res5.results.corpSerno);
wx.showModal({
title:'提现申请已提交',
content:'银行处理需要1-5分钟时间,充值结果以余额查询为准。',
showCancel:false
})
} else {
weui.topTips(res5.message)
}
},
error: function(err) {
loading.hide();
},
});
},
// 充值结果查询
async ExchangeWithdrawQuery(flowId, oriCorpSerno) {
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/icbc/account/exchange/withdrawQuery',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
flowId: flowId,
oriCorpSerno: oriCorpSerno,
},
headers: {
'sessionid': sessionID,
},
success: function(res5) {
loading.hide();
if (res5.code == "10000") {
let appStatus = res5.results.appStatus;
if (appStatus == '4') {
uni.showModal({
title: "系统提示",
content: "提现成功!"
})
uni.navigateBack({})
} else {
uni.showModal({
title: "系统提示",
content: appStatus == '1' ? '申请已受理' : res5.message
})
}
} else {
weui.topTips(res5.message)
uni.showModal({
title: "系统提示",
content: res5.message
})
}
},
error: function(err) {
loading.hide();
},
});
},
// 输入限制
inputControl(e) {
let this_ = this
let obj = e.detail
this.$nextTick(function() {
obj.value = obj.value.replace(/[^\d.]/g, ""); //清除"数字"和"."以外的字符
obj.value = obj.value.replace(/^\./g, ""); //验证第一个字符是数字而不是.
obj.value = obj.value.replace(/\.{2,}/g, "."); //只保留第一个. 清除多余的.
obj.value = obj.value.replace(".", "$#$").replace(/\./g, "").replace("$#$", "."); //只允许输入一个小数点
obj.value = obj.value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
obj.value = obj.value * 1 > 2000 ? 2000 : obj.value;
// if (obj.value == '' || obj.value * 1 < 3) {
// $('.DepositID').attr('style', 'background: rgb(230, 230, 230) !important;');
// } else {
// $('.DepositID').removeAttr('style');
// }
this_.inputOtherM = obj.value
})
},
//input键盘弹起不会弹
ReturnToTop() {
this.$nextTick(function() {
document.scrollingElement.scrollTo(0, this.scrollTop);
})
},
// 复制我卡号
async CopyCardNumber() {
let value = "sdfsdf"
Dialog({
title: '系统提示',
message: '复制成功!'
});
this.$nextTick(function() {
let clipboard = new ClipboardJS('#cardNumright', {
text: function() {
return value
}
})
})
},
//选择输入其他金额
OtherMoney() {
this.depotMoneyother = true
},
// 快捷选择金额
async depotMoney(value, MoneyIndex) {
console.log(value)
if (!value) {
this.isOtherMoney = true
this.Money = ''
this.MoneyIndex = MoneyIndex
return
}
this.isOtherMoney = false
this.Money = parseInt(value)
this.MoneyIndex = MoneyIndex
},
//按钮操作
HideHTML(dom, type) {
if (type == 0) {
$('.' + dom).css('display', 'none');
} else {
$('.' + dom).css('display', 'block');
}
},
//返回小程序 跳转指定页面
BackToMini(page) {
if (page == 'UserMain' || page == 'personalCenter') {
jWeixin.miniProgram.switchTab({
url: `/pages/${page}/main`,
});
} else {
jWeixin.miniProgram.redirectTo({
url: `/pages/${page}/main`,
});
}
},
//换绑卡
ChangeCardPay(bankName, bindCard) {
let this_ = this;
if (bindCard == payCardNumber) {
return
}
var loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/user/bank/change/bind',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
accountName: bankName,
accountNo: bindCard,
},
success: function(res5) {
loading.hide();
if (res5.code == "10000") {
this_.HideHTML('showBindCardList', 0);
this_.queryUserBankInfo();
} else {
weui.topTips(res5.message)
}
},
error: function(err) {
loading.hide();
},
});
},
//获取银行余额
queryBankInfo() {
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/icbc/account/balance/balanceQuery',
type: "POST",
timeout: 8000,
contentType: "application/x-www-form-urlencoded",
data: {
mediumId: bankInfo.accountNo || '',
schoolId: bankInfo.schoolId || '',
userId: bankInfo.userId || '',
sessionid: sessionID,
wechattype: 1,
},
success: function(res3) {
loading.hide();
if (res3.code == "10000") {
if (res3.results.accountBalance == null) {
weui.topTips("账户信息为空,余额查询失败");
} else {
this_.ReflectMoney = res3.results.accountBalance * 1
this_.cardBalanceTx = (res3.results.accountBalance * 1).toFixed(2);
$('.TxClsTx').attr('placeholder',
`可提现金额${(res3.results.accountBalance * 1).toFixed(2)}元`
)
this_.RechargeMax = ((2000 - ((res3.results.accountBalance * 1).toFixed(2) *
1)).toFixed(2));
this_.placeholder = `可提现金额${(res3.results.accountBalance * 1).toFixed(2)}元`
}
} else {
weui.topTips(res3.message)
}
},
error: function(err) {
loading.hide();
},
complete: function(XMLHttpRequest, status) {
loading.hide();
if (status == 'timeout') {
weui.topTips("请求超时,余额查询失败");
}
}
})
},
//获取用户已填写银行信息
queryUserBankInfo() {
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/user/bank/get',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1
},
success: function(res2) {
if (res2.code == "10000") {
bankInfo = res2.results;
bankInfo.sessionid = sessionID;
this_.bankInfo_ = bankInfo
this_.queryBankInfo();
} else {
weui.topTips(res2.message)
}
},
error: function(err) {
loading.hide();
},
});
},
//查询用户信息
QueryUserInfo() {
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/wechat/svweapp/QueryPersonalInfo',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
userid: userID,
sessionid: sessionID,
wechattype: 1
},
success: function(res1) {
loading.hide();
if (res1.code == "10000") {
bankInfo.schoolId = res1.results.schoolid;
bankInfo.userId = res1.results.id;
this_.PersonalInfo = res1.results
if (res1.results.usertype == 1) {
$('.StudentCls').css('display', 'block');
$('.TeacherCls').css('display', 'none');
} else {
$('.StudentCls').css('display', 'none');
$('.TeacherCls').css('display', 'block');
}
this_.queryUserBankInfo();
} else {
weui.topTips(res1.message);
setTimeout(() => {
this_.BackToMini('UserMain');
}, 1500)
}
},
error: function(err) {
loading.hide();
},
});
},
}
}
</script>
<style scoped lang="scss">
html,
body,
page {
width: 750rpx;
background: linear-gradient(180deg, #FFFFFF 0%, #FAFAFA 100%);
}
.OtherMoney {
display: flex;
justify-content: flex-start;
// color: #999999;
// font-size: 28rpx;
// font-family: PingFangSC-Regular, PingFang SC;
// font-weight: 400;
// color: #999999;
// line-height: 40rpx;
width: 686rpx;
height: 100rpx;
background: #F7F6FB;
border-radius: 10rpx;
margin: 0 auto;
line-height: 100rpx;
margin-top: 32rpx;
padding-left: 26rpx;
span {
display: inline-block;
font-size: 40rpx;
font-family: PingFang SC;
font-weight: bold;
color: #000000;
}
input {
height: 100%;
}
.ALL {
position: absolute !important;
font-size: 26rpx !important;
font-family: PingFang SC;
font-weight: bold !important;
color: #129A5E !important;
right: 31rpx !important;
}
}
.ReflectBox {
width: 680rpx;
margin: 0 auto;
display: flex;
justify-content: space-between;
height: 100rpx;
line-height: 100rpx;
.left_ {
font-size: 36rpx;
font-family: PingFang SC;
font-weight: bold;
color: #000000;
}
.right_ {
font-size: 26rpx;
font-family: PingFang SC;
font-weight: 500;
color: #888888;
}
}
.bottomdiv {
position: fixed;
left: 0;
right: 0;
bottom: 80rpx;
}
.DepositID {
width: 654rpx;
height: 92rpx;
background: #04BA73;
border-radius: 8rpx;
margin: 0 auto;
text-align: center;
bottom: 30rpx;
}
.DepositID span {
height: 50rpx;
font-size: 36rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #FFFFFF;
line-height: 92rpx;
}
.switchbankCard {
text-align: center;
/* width: 205px; */
// height: 28rpx;
font-size: 26rpx;
font-family: PingFang SC;
font-weight: 500;
text-decoration: underline;
color: #268EF8;
margin-top: 23rpx;
}
.payType {
width: 654rpx;
margin: 0 auto;
height: 98rpx;
line-height: 98rpx;
display: flex;
justify-content: space-between;
}
.payType view:nth-child(1) {
// width: 120rpx;
height: 42rpx;
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 500;
color: #888888;
line-height: 98rpx;
}
.payType view::nth-child(2) {
width: 225rpx;
height: 45rpx;
font-size: 32rpx;
font-family: PingFang SC;
font-weight: bold;
color: #333333;
line-height: 45rpx;
}
.arrow {
transform: rotate(-45deg);
top: -3rpx;
border: solid #999999;
border-width: 0 1rpx 1rpx 0;
display: inline-block;
padding: 8rpx;
position: relative;
}
</style>
<template>
<view class="container">
<view class="NoticeInfo" v-html="NoticeInfo">
</view>
</view>
</template>
<script>
let gHost = "https://" + window.location.host;
if (window.location.protocol != "https:") {
gHost = "https://fpdev.xiaopay.net";
}
//获取参数
function getQueryParams(params) {
let href = window.location.href
let query = href.substring(href.indexOf('?') + 1);
let vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
let pair = vars[i].split("=");
if (pair[0] == params) {
return pair[1];
}
}
return (false);
}
export default {
name: "NoticeInfo",
data() {
return {
NoticeInfo: ""
}
},
onLoad: function(options) {
console.log(options);
let this_ = this
if (!options.sessionid) {
uni.showModal({
title: "系统提示",
showCancel: false,
content: "参数错误",
})
return
}
// uni.showModal({
// title: "系统提示",
// showCancel: false,
// content: JSON.stringify(options),
// success: function() {
// },
// })
if (options.NoticeTitle) {
uni.setNavigationBarTitle({
title: options.NoticeTitle
})
}
this_.selectContentById(options.sessionid, options.schoolid, options.operatorId,
options.NoticeId)
},
methods: {
// 小程序端查询通知公告
async selectContentById(sessionid, schoolid, operatorId, NoticeId) {
let this_ = this;
try {
await new Promise((resolve, reject) => {
// 二维码加密内容获取token
$.ajax({
url: gHost +
'/xpaynotice/notice/noticeConfig/selectContentById', //开发者服务器接口地址",
type: "get",
dataType: 'json',
contentType: 'application/json; charset=UTF-8',
cache: false,
data: {
schoolid: parseInt(schoolid),
operatorId: parseInt(operatorId),
sessionid,
wechattype: 1,
id: NoticeId
},
success: function(res) {
if (res.code == 200) {
this_.NoticeInfo = res.data
resolve(res)
} else {
reject(res)
}
},
error: function(error) {
reject(error)
}
})
})
} catch (err) {
//TODO handle the exception
uni.showModal({
title: "系统提示",
content: err.message
})
}
}
}
}
</script>
<style scoped>
.NoticeInfo{
padding: 15rpx;
}
</style>
<template>
<view class="container">
<view class="WechatUserInfo">
<view class="left">
<image class="avatarurl" :src="WechatUserInfo.avatarurl" mode="aspectFit"></image>
</view>
<view class="right">
<view class="nickname">昵称:{{WechatUserInfo.nickname}}</view>
</view>
<van-cell-group class="cell-group">
<van-cell label="点击可复制" center title="openid" @click="CellGroup(WechatUserInfo.openid)"
:clickable="true" :value="WechatUserInfo.openid" />
<van-cell label="点击可复制" center title="appid" @click="CellGroup(WechatUserInfo.appid)" :clickable="true"
:value="WechatUserInfo.appid" />
<van-cell label="点击可复制" center title="unionid" @click="CellGroup(WechatUserInfo.unionid)"
:clickable="true" :value="WechatUserInfo.unionid" />
<van-cell label="点击可复制" center title="用户渠道来源" @click="CellGroup(WechatUserInfo.subscribe)"
:clickable="true" :value="WechatUserInfo.subscribe" />
<van-cell label="点击可复制" center title="国家" @click="CellGroup(WechatUserInfo.country)" :clickable="true"
:value="WechatUserInfo.country" />
<van-cell label="点击可复制" center title="省份" @click="CellGroup(WechatUserInfo.province)" :clickable="true"
:value="WechatUserInfo.province" />
<van-cell label="点击可复制" center title="城市" @click="CellGroup(WechatUserInfo.city)" :clickable="true"
:value="WechatUserInfo.city" />
<!-- //性别 0:未知、1:男、2:女 -->
<van-cell label="点击可复制" center title="性别" @click="CellGroup(WechatUserInfo.gender)" :clickable="true"
:value="['未知','男','女'][WechatUserInfo.gender]" />
<van-cell label="点击可复制" center title="语言" @click="CellGroup(WechatUserInfo.language)" :clickable="true"
:value="WechatUserInfo.language" />
</van-cell-group>
</view>
</view>
</template>
<script>
import {
Dialog
} from 'vant';
//公共参数
var gHost = "https://" + window.location.host;
if (window.location.protocol != "https:") {
gHost = "http://" + window.location.host;
}
export default {
name: "QueryMyWechat",
data() {
return {
WechatUserInfo: {
appid: "",
avatarurl: "",
city: "",
country: "",
gender: 1,
id: 6496,
language: "",
nickname: "",
openid: "",
province: "",
subscribe: "",
unionid: ""
}
}
},
onLoad: function(options) {
console.log(options)
let ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('micromessenger') == -1) {
Dialog({
title: '系统提示',
message: '请通过微信浏览器打开!'
});
return;
}
let {
code,
state
} = options
this.QueryMyWechatInfo({
code,
state
})
},
mounted: function() {
},
methods: {
async QueryMyWechatInfo(params) {
try {
let sessionid = await new Promise((resolve, reject) => {
$.ajax({
url: gHost + '/mp_wechat/x/access_token',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: params,
success: function(resp1) {
if (resp1.code != "10000") {
reject(resp1)
} else {
resolve(resp1.results)
}
},
error: function(err) {
reject(err)
}
});
})
let results = await new Promise((resolve, reject) => {
//查询微信信息
$.ajax({
url: gHost + '/mp_wechat/svmpwechat/QueryMyWechatInfo',
type: "POST",
dataType: "json",
contentType: "application/x-www-form-urlencoded",
async: false,
data: {
"mp_session_id": sessionid
},
success: function(resp2) {
console.log(resp2)
if (resp2.code != "10000") {
weui.alert(resp2.message, function() {
console.log('ok');
}, {
title: '提示'
});
reject(resp2.message)
} else {
resolve(resp2.results)
}
},
error: function(err2) {
weui.alert(err2.toString(), function() {
console.log('ok');
}, {
title: 'ERROR'
});
}
});
})
this.WechatUserInfo = results
} catch (e) {
//TODO handle the exception
console.log(e);
Dialog({
title: '系统提示',
message: '发生错误!'
});
}
},
CellGroup(value) {
console.log(value);
Dialog({
title: '系统提示',
message: '复制成功!'
});
this.$nextTick(function() {
let clipboard = new ClipboardJS('.van-cell', {
text: function() {
return value
}
})
})
}
}
}
</script>
<style scoped>
page {
background-color: #f7f8fa;
}
.container {
width: 700rpx;
margin: 0 auto;
background-color: #FFFFFF;
}
.WechatUserInfo {
margin-top: 30rpx;
}
.WechatUserInfo .left {
text-align: center;
height: 250rpx;
line-height: 250rpx;
}
.WechatUserInfo .right {
text-align: center;
height: 100rpx;
line-height: 100rpx;
font-size: 40rpx;
font-weight: bold;
}
.WechatUserInfo .avatarurl {
width: 200rpx;
height: 200rpx;
border-radius: 10rpx;
position: relative;
top: 30rpx;
}
.cell-group {
margin-bottom: 100rpx;
}
</style>
<template>
<view class="container">
<view class="StudentsGraduate">
<image src="../../static/images/StudentsGraduate.png" mode="aspectFit"></image>
</view>
<view class="StudentsGraduateInfo">
<view class="schoolname">
{{StudentsGraduateInfo.schoolname}}
</view>
<view class="StudentInfo">
<span>{{StudentsGraduateInfo.name}}</span>
<span>{{StudentsGraduateInfo.classname}}</span>
</view>
<view class="Graduate">
恭喜您的小孩已经毕业!
</view>
</view>
<!-- 返回小程序切换未毕业用户 -->
<view style="width: 300rpx;text-align: center;margin: 0 auto;color: #08C379; margin-top: 50rpx;cursor: pointer;"
@click="SwitchUser">
<span style="text-decoration:underline;"> 切换小孩账号</span>
</view>
</view>
</template>
<script>
export default {
name: "StudentsGraduate",
data() {
return {
StudentsGraduateInfo: {
schoolname: "隆回县第一中学",
classname: "高一63班",
gradename: "高一",
name: "王宇涵"
}
}
},
onLoad: function(options) {
console.log(options);
this.StudentsGraduateInfo = options
},
methods: {
// 返回小程序切换用户
async SwitchUser() {
jWeixin.miniProgram.redirectTo({
url: `/pages/setting/main`,
success: function() {
},
fail: function(fail) {
console.warn(fail)
uni.showModal({
content: JSON.stringify(fail)
})
}
});
}
}
}
</script>
<style scoped lang="scss">
.container {
padding-top: 128rpx;
}
.StudentsGraduate {
width: 691rpx;
height: 633rpx;
margin: 0 auto;
// margin-top: 136rpx;
text-align: center;
}
.StudentsGraduateInfo {
margin-top: 109rpx;
text-align: center;
.schoolname {
height: 45rpx;
font-size: 32rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #08C379;
line-height: 45rpx;
}
.StudentInfo {
width: 372rpx;
height: 70rpx;
line-height: 70rpx;
background: #08C379;
border-radius: 40rpx;
margin: 0 auto;
margin-top: 21rpx;
span:nth-child(1) {
width: 132rpx;
height: 62rpx;
font-size: 44rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #FFFFFF;
line-height: 62rpx;
}
span:nth-child(2) {
margin-left: 17rpx;
width: 101rpx;
height: 33rpx;
font-size: 24rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #FFFFFF;
line-height: 33rpx;
}
}
.Graduate {
height: 62rpx;
font-size: 44rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
line-height: 62rpx;
margin-top: 75rpx;
}
}
.StudentsGraduate image {
width: 100%;
height: 100%;
}
</style>
<template>
<view class="container">
<view>
<image style="width: 100%;display: none;" src="../../static/img/123456.png" mode="aspectFit"></image>
</view>
<view id="showTips">
<image src="../../static/img/shareImg.png" mode="aspectFit"></image>
</view>
<view id="qrcode" ref="qrcode">
<image class="bg" src="../../static/img/qrcode_bg.png" mode="aspectFill">
</image>
<view class="main">
<h5 id="school_name">安智教育学校</h5>
<view class="info" style="padding-top: 50rpx;">
<view class="top_tip">(二维码仅限教职工使用)</view>
<view class="class_name">企业微信教职工采集签约助手</view>
<view class="qrcode_box">
<view id="comFirmCode"></view>
<image src="../../static/img/logo.png" class="sub" mode="aspectFit"></image>
</view>
<view class="tip">扫码或长按识别二维码<br />登录校智付小程序</view>
<view class="top_tip" id="DateTime">过期</view>
</view>
</view>
</view>
</view>
</template>
<script>
console.log(location.href)
var HOST = location.host;
var fromApp = ''; //校智付还是光海 wxwork / ghwxwork
export default {
name: "WxworkTearch",
data() {
return {
}
},
created: function() {
},
mounted: function() {
let {
screenHeight
} = uni.getSystemInfoSync()
console.log(screenHeight / 750);
if (this.WxWordBro()) { //企微
$('#showTips').css('display', 'block');
weui.topTips('请在微信中打开');
return
}
if (!this.getQueryParams('hex')) {
weui.topTips('跳转参数hex不能为空');
return
}
if (!this.getQueryParams('app')) {
weui.topTips('跳转参数app不能为空');
return
}
let this_ = this;
this.$nextTick(function() {
$('#qrcode').css('display', 'block');
$('#school_name').html(decodeURI(this_.getQueryParams('schoolname')));
fromApp = this_.getQueryParams('app');
setTimeout(function() {
this_.CreateQrCode(screenHeight / 750);
this_.getDate();
}, 300)
})
},
methods: {
//获取参数
getQueryParams(params) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == params) {
return pair[1];
}
}
return (false);
},
//生成二维码
CreateQrCode(pit) {
var qrCode = new QRCode(document.getElementById("comFirmCode"), {
width: 201 * pit,
height: 201 * pit
})
var url = `https://${HOST}/wechat/qr/${fromApp}?hex=${this.getQueryParams('hex')}&et=123456`;
console.log('url = ' + url)
qrCode.makeCode(url);
},
//判断是否企微浏览器
WxWordBro() {
var agent = navigator.userAgent.toLowerCase();
if (agent.match(/WxWork/i) == "wxwork") {
return true;
} else {
return false;
}
},
//设置二维码有效期为1个月
getDate() {
let addZero = (num) => (num < 10 ? '0' + num : num),
date = new Date(),
m = date.getMonth();
date.setMonth(m + 1);
let endTime = date.getFullYear() + '' + addZero(date.getMonth() + 1) + '' + addZero(date.getDate()) +
'';
document.getElementById('DateTime').innerText = endTime + '过期';
}
}
}
</script>
<style scoped lang="scss">
body {
margin: 0;
overflow: hidden;
}
#qrcode {
top: 20vh;
display: none;
position: relative;
text-align: center;
}
.top_tip {
color: #AAAAAA;
font-size: 14rpx;
margin-top: 5rpx;
}
#showTips {
text-align: center;
display: none;
overflow: hidden;
width: 100vw;
height: 100vh;
background: #F9F9F9;
}
#showTips>image {
margin-top: 40rpx;
}
.qrcode_box {
position: relative;
}
.class_name {
font-size: 14rpx;
margin-bottom: 10rpx;
}
.main {
position: absolute;
top: 0;
width: 70vw;
margin-left: 15vw;
}
.bg {
width: 70%;
height: 750rpx;
}
.tip {
margin: 10rpx 0;
font-size: 14rpx;
}
#comFirmCode {
margin-left: 80rpx;
}
.sub {
position: absolute;
width: 50rpx;
height: 50rpx;
left: 31vw;
top: 20vw;
}
#school_name {
font-size: 25rpx;
line-height: 47rpx;
color: #FFFFFF;
white-space: nowrap;
text-overflow: ellipsis;
margin-top: 30rpx;
}
@media screen and (min-width: 900rpx) {
#qrcode {
top: 0;
position: relative;
margin: 10vh auto;
}
.bg {
width: 360rpx;
height: 490rpx;
margin: 0;
}
#school_name {
line-height: 65rpx;
}
.top_tip {
color: #AAAAAA;
font-size: 16rpx;
margin: 10rpx 5rpx;
}
.main {
width: 360rpx;
margin-left: 0;
left: calc(50vw - 180rpx);
}
.sub {
position: absolute;
width: 40rpx;
height: 40rpx;
left: 160rpx;
top: 80rpx;
}
}
</style>
<template>
<view class="container">
<view class="contentBox" v-if="!depotMoneyother">
<!-- <image mode='widthFix' src="https://xiaopay2020.oss-cn-shenzhen.aliyuncs.com/static/weapp/images/xiaopaycard (31).png"></image> -->
<view class="contentDiv">
<view class="headview">
<view class="schoolname">{{PersonalInfo.schoolname}}</view>
<view class="IconCls">电子校园卡</view>
</view>
<view class="HidenText">
<view class="userName">姓名:<span>张三</span></view>
<view class="StudentCls" v-if="PersonalInfo.usertype=='1'">班级:高一(63班)</view>
<view class='TeacherCls' v-else>教职工</view>
</view>
<view class="Balance">
<view class="cardBalanceTx">余额:¥<span>0.00</span></view>
<view @click="ToWalletTx">余额提现
<image style="position: relative;width: 13rpx;height: 20rpx;" class='ImgIcon1' mode='widthFix'
:src="ImgUrl+'images/xiaopaycard (17).png'" alt=""></image>
</view>
</view>
</view>
<!-- 充值账户 -->
<view class="Recharge">
<view class="leftdiv">账户充值</view>
<view class="rightdiv">
<span>账户明细 <span class="arrow"></span></span>
</view>
</view>
<!-- -->
<view class="MoneyBox">
<view class="depotMoney" @click="depotMoney(item.value,index)"
v-bind:class="(Money!=''&&MoneyIndex==index)?'choiceClass':''" :data-money="item.value"
v-for="(item,index) in MoneyList" :key="index">
<span class="value">
{{item.value}}
</span>
<span style="font-size: 28rpx;font-weight: 600;margin-left: 7rpx;">{{item.lable}}</span>
<span class="tips" v-show="item.tips">
{{item.tips}}
</span>
</view>
</view>
<!-- -->
<view class="OtherMoney" @click="OtherMoney">
<view>其他充值金额</view>
<view>></span></view>
</view>
<!-- 支付方式 -->
<view class="payType" @click="queryBindCardList">
<view>付款方式</view>
<view>招商银行(5947) <span class="arrow"></span></view>
</view>
<view class="" style="height: 1rpx;background-color: #DFDFDF;"></view>
<!-- -->
<view class="switchbankCard" @click="BackToMini('AssignAddCard')">我要换银行卡支付 <span class="arrow"
style="transform: rotate(45deg);left: 15rpx;top: -8rpx;"></span></view>
<!-- 充值生活费 -->
<view class="DepositID" @click="toDeposit(0)" v-bind:style="Money!=''?'':'background: #e6e6e6 !important;'">
<span>充值生活费</span>
</view>
</view>
<!-- 其他充值金额 -->
<view class="contentBox" v-if="depotMoneyother">
<view class="OtherTitle">充值金额</view>
<view class="inputOtherM">
<span></span>
<input @focus="openKeyBoard('number')" v-model="inputOtherM" @input="inputControl"
placeholder-class="placeholderinputOtherM" type="text" maxlength="6" />
</view>
<view class="OtherLine"></view>
<!-- 充值范围 -->
<view class="Recharge_">
<!-- <image mode="widthFix" class="depositImg" src="../../static/img/depositIcon.png"></image> -->
<span>最大可充值金额:</span>
<span><span>3.00 ~ 2000.00</span></span>
</view>
</view>
<!-- 短信发送 -->
<uni-popup ref="popup" :mask-click="false">
<!-- 手机号验证 -->
<view class="PhoneConfirmBox MyPhoneCls">
<view class="closePhoneBox" @click="close()">
<span>x</span>
</view>
<p style='text-align:center;font-size:18px;font-weight:bold;margin-bottom:30px;'>验证开卡手机号</p>
<view class="PhoneNum">
<input type="number" disabled placeholder-class="placeholderInput" maxlength="11"
placeholder="请输入手机号" />
</view>
<view class="VerifyCode">
<input v-model="VerifyCode" placeholder-class="placeholderInput" type="number" maxlength="6"
placeholder="请输入验证码" />
<view class="CodeMsg" @click="SendMsg">获取验证码</view>
</view>
<button class="doBtnTx" @click="DoNextStep">充值</button>
</view>
</uni-popup>
<!-- 数字键盘 -->
<keyboard-package ref="number" @onInput="onInput" @onDelete="onDelete" @onConfirm="onConfirm"
:disableDot="false" />
<!-- 体现 -->
<view class="TxWalletBox">
</view>
<!-- 体现异常处理 -->
<view class="RechargeException" v-if="RechargeException">
<view class="tiptext">您在银行预留的身份信息已过期,请更新身份信息后再继续交易</view>
<view class="weui-form">
<view class="weui-form__control-area">
<view class="weui-cells__group weui-cells__group_form">
<view
class="weui-cell weui-cell_active weui-cell_access weui-cell_select weui-cell_select-after">
<view class="weui-cell__hd"><label class="weui-label">所属职业</label></view>
<view class="weui-cell__bd" id="showPicker"
style="color: #A1A4A8;text-align: center;overflow: hidden;text-overflow: ellipsis; white-space: nowrap;padding-right: 30px;">
请选择职业类型</view>
</view>
<view
class="weui-cell weui-cell_active weui-cell_access weui-cell_select weui-cell_select-after"
id="showCityPicker3">
<view class="weui-cell__hd"><label class="weui-label" id="city3-label">家庭地址</label></view>
<view class="weui-cell__bd" id="homeAddress"
style="color: #A1A4A8;text-align: center;overflow: hidden;text-overflow: ellipsis; white-space: nowrap; padding-right: 30px;">
请选择家庭地址</view>
</view>
<view class="weui-cell weui-cell_active weui-cell_access ">
<view class="weui-cell__hd"><label class="weui-label">所在街道</label></view>
<view class="weui-cell__bd weui-flex">
<input class="weui-input" maxlength="30" style="text-align: right;padding-right: 17px;"
type="text" oninput="StreetInformation(this)" placeholder="请输入具体街道和门牌号">
</view>
</view>
<view class="weui-cell__hd">
<label class="weui-label">身份证照片</label>
<view class="idCardPhoto1" @click="idCardUpload('1')">
<image :src="tempFiles1" mode="aspectFill">
</image>
<view class="positionCam">
【点击可上传】
</view>
</view>
<view class="idCardPhoto2" @click="idCardUpload('2')">
<image :src="tempFiles2" mode="aspectFill">
</image>
<view class="positionCam">
【点击可上传】
</view>
</view>
</view>
<view class="bottomDetail" @click="UpdateRechargeException">
立即更新</view>
</view>
</view>
</view>
</view>
<!-- 充值异常弹框 -->
<view class="js_dialog" id="iosDialog2" style="display: none;">
<view class="weui-mask"></view>
<view class="weui-dialog">
<view class="weui-dialog__bd">弹窗内容,告知当前状态、信息和解决方法,描述文字尽量控制在三行内</view>
<view class="weui-dialog__ft">
<a href="javascript:" class="weui-dialog__btn weui-dialog__btn_primary">知道了</a>
</view>
</view>
</view>
</view>
</template>
<script>
import keyboardPackage from "@/components/keyboard-package/keyboard-package.vue"
import cityData from "@/common/js/city.js"
var gHost = "https://" + window.location.host;
if (window.location.protocol != "https:") {
gHost = "https://fpdev.xiaopay.net";
}
let times = 0;
var limitClick = false; //禁止重复点击
var sessionID = '',
userID = '';
var payCardNumber = ''; //一类卡号
var orderSerialNo = ''; //提现结果查询 指令号
var businessNo = '',
otpOrderNo = '',
mobileNo = '';
var msCount = 60; //定时器
var MyTimer = null;
var fromType = 0; //0转账 1提现
var opeType = 0; //0充值 1提现 手机号验证
var bankInfo = {
acctNoArray: '',
idNo: '',
schoolId: '',
trueName: '',
userId: '',
sessionid: '',
wechattype: 1
}
// 20210422 充值账户异常资料补充参数
var acctErrorUpdateParms = {
backSideImgId: '', //反面身份证图片Id
frontSideImgId: '', //正面身份证图片Id
homeAddress: '', //家庭住址
occupation: '', //职业代码
StreetInformation: '', //街道
businessNo: ''
}
// /wefile/wefileId
// 获取上传影像的Token接口
let wefileId = {}
// bizCode: "000000"
// bizMsg: "获取上传影像token成功"
// businessNo: "OB89d5ed802cRA202104226389071452"
// expiredTime: 1619072725503
// project: "BOBS-OBP"
// uuid: "8238f256d8f54209a0e9a2a3b25e7393"
// wefileToken: "QplB0tfvjtzOU+tWgKI2+L+4B9HE8kbpJVREUTwXZCsVqXcUwyDxHAbTU3bW8ziGb4hKAaWiLQXAyZUbYRB9hBKhSt1VVvoFl5qOCR4GT+X1KpcQgBlhKYi/NYPkmsjeZO/qn9YXGDp/1sGmxazv6T05y8EbU9HXreRhF/jh8G1HtUCwprFoaulGFShvV819EUBdHifDF5IjpPekLtgzIm8C/kYYX8xproKvxV4maRji5p1Krkyv/U1K3C18/TyjHwPpC4KlOEqA6QpFujR8yZ42qvLZqfqgUkRFZ4WC27/nN3+do9VNpNbK4MAMSLTRaxdGmKe2wStKbZ5OQ+1WFA=="
// wefileUrl: "https://bfiles-stg.pingan.com.cn/brcp/secfile/sec_wefiles_udmp_upload.do"
export default {
components: {
keyboardPackage
},
name: "assignDeposit",
data() {
return {
inputOtherM: '',
RechargeException: false,
depotMoneyother: false, //其他充值
Money: '', //选择金额
MoneyIndex: '',
RechargeMax: '2000', //最大充值限制
ReflectMoney: '', //提现金额
VerifyCode: '', //验证码
cardBalanceTx: '0', //余额
CodeMsg: "获取验证码",
type: 'number',
PersonalInfo: {
schoolname: "微微学测试",
name: "李智书",
usertype: "1"
},
ImgUrl: this.$ImgUrl,
MoneyList: Array(6).fill(1).map((v, index) => {
return {
lable: '',
value: 50 * (index + 1),
tips: index == 1 ? "推荐充值" : null
}
}),
numberList: [],
tempFiles1: '../../static/img/idCardBg1.png', //上传身份证临时选择文件
tempFiles2: '../../static/img/idCardBg0.png'
}
},
created: function() {
},
mounted: function() {
let this_ = this
this.$nextTick(function() {
// $(".RechargeException").siblings().hide()
// $(".RechargeException").show()
// 家庭住址
$('#homeAddress').on('click', function() {
weui.picker(cityData, {
defaultValue: [110000, 110000, 110101],
depth: 3,
onChange: function(result) {
console.log(result);
},
onConfirm: function(result) {
console.log(result);
console.log(result);
acctErrorUpdateParms.homeAddress = result[0].label + '/' +
result[1].label + '/' +
result[2].label
$("#homeAddress")[0].innerText = result[0].label + '/' +
result[1].label + '/' +
result[2].label
$("#homeAddress").css("color", "#000");
},
title: '家庭地址'
});
});
// 选择职业
$('#showPicker').on('click', function() {
// 获取职业信息
this_.getOccupationList().then(OccupationList => {
let data = OccupationList.map(v => {
return {
label: v.comment,
value: v.code
}
})
weui.picker(data, {
onChange: function(result) {
console.log(result);
},
onConfirm: function(result) {
console.log(result[0].value);
acctErrorUpdateParms.occupation = result[0].value
$("#showPicker")[0].innerText = result[0].label
$("#showPicker").css("color", "#000");
},
title: '职业信息选择'
});
}).catch(err => {
weui.topTips("获取职业信息列表失败");
})
});
// 初始化
userID = this_.getQueryParams('userID');
sessionID = this_.getQueryParams('seesionID');
fromType = this_.getQueryParams('fromType');
let windowHeight = window.innerHeight;
if (this_.getQueryParams('tabbar')) { //usermain打开加返回按钮
$('#ReturnBox').css('display', 'block');
$('.bottom2').css('margin-top', (windowHeight - 370 < 0 ? 30 : windowHeight -
370) + 'px');
$('.bottom1').css('margin-top', (windowHeight - 570 < 0 ? 30 : windowHeight -
570) + 'px');
} else {
$('.bottom2').css('margin-top', (windowHeight - 320 < 0 ? 30 : windowHeight -
320) + 'px');
$('.bottom1').css('margin-top', (windowHeight - 590 < 0 ? 30 : windowHeight -
590) + 'px');
}
bankInfo.sessionid = sessionID;
this_.QueryUserInfo();
$('#AssginBox').css('display', 'block');
if (fromType == 0) {
// $('.TitleHeader').html('电子账户充值');
} else {
this_.ToWalletTx();
}
setTimeout(function() {
this_.getWefileId()
}, 500)
})
},
methods: {
// 身份证上传
async idCardUpload(type) {
let this_ = this
uni.chooseImage({
count: 6, //默认9
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'], //从相册选择
success: function(res) {
this_['tempFiles' + type] = res.tempFilePaths[0]
this_.uploaderInput(res.tempFiles, type)
}
});
},
// 验证码弹出框开启
open() {
this.$refs.popup.open('top')
},
// 验证码弹出框关闭
close() {
this.$refs.popup.close()
},
//键盘谈起
openKeyBoard(key) {
this.type = key;
this.$refs[key].open();
},
onInput(val) {
this.numberList.push(val);
this.inputOtherM = this.inputOtherM + val
console.log(val);
},
onDelete() {
this.numberList.pop()
this.inputOtherM = this.numberList.join("")
},
onConfirm() {
// 充值提现输入验证码确认框
this.open()
},
//选择输入其他金额
OtherMoney() {
this.depotMoneyother = true
},
// 快捷选择金额
async depotMoney(value, MoneyIndex) {
console.log(value)
this.Money = parseInt(value)
this.MoneyIndex = MoneyIndex
},
//定时器
IntervalFun() {
if (msCount == 1) {
window.clearInterval(MyTimer); //停止计时器
$('.CodeMsg').css('color', '#01BC73');
this.CodeMsg = "获取验证码"
msCount = 60;
} else {
msCount--;
$('.CodeMsg').css('color', 'gray');
this.CodeMsg = (msCount + "s后获取")
}
},
//按钮操作
HideHTML(dom, type) {
if (type == 0) {
$('.' + dom).css('display', 'none');
} else {
$('.' + dom).css('display', 'block');
}
},
//切换到提现
ToWalletTx() {
$('#DepositBox').css('display', 'none');
$('#TxWalletBox').css('display', 'block');
// $('.TitleHeader').html('电子账户提现');
$('.doBtnTx').html('提现');
opeType = 1;
},
//全部提现
TxAllFun() {
this.ReflectMoney = this.cardBalanceTx * 1
// $('.TxClsTx').val($('.cardBalanceTx')[0].textContent * 1);
},
//隐藏验证码弹框
hidePhoneBox() {
$('.PhoneConfirmBox').css('display', 'none');
// $('.VerifyCode').val('');
this.VerifyCode = ''
orderSerialNo = '';
businessNo = '';
otpOrderNo = '';
},
//返回小程序 跳转指定页面
BackToMini(page) {
if (page == 'UserMain' || page == 'personalCenter') {
jWeixin.miniProgram.switchTab({
url: `/pages/${page}/main`,
});
} else {
jWeixin.miniProgram.redirectTo({
url: `/pages/${page}/main`,
});
}
},
// 输入限制
inputControl(obj, val) {
console.log(obj, val);
obj.value = obj.target.value
obj.value = obj.value.replace(/[^\d.]/g, ""); //清除"数字"和"."以外的字符
obj.value = obj.value.replace(/^\./g, ""); //验证第一个字符是数字而不是.
obj.value = obj.value.replace(/\.{2,}/g, "."); //只保留第一个. 清除多余的.
obj.value = obj.value.replace(".", "$#$").replace(/\./g, "").replace("$#$", "."); //只允许输入一个小数点
obj.value = obj.value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
obj.value = obj.value * 1 > 2000 ? 2000 : obj.value;
this.Money = obj.value + '';
this.ReflectMoney = obj.value + '';
if (obj.value == '' || obj.value * 1 < 3) {
$('.DepositID').addClass('DisaBledBtn');
} else {
$('.DepositID').removeClass('DisaBledBtn');
}
},
//input键盘弹起不会弹
ReturnToTop() {
document.scrollingElement.scrollTo(0, this.scrollTop);
},
//提现结果查询
transferResults() {
let this_ = this;
times++;
let loading = weui.loading('请稍后');
let params = {
accountNo: bankInfo.acctNoArray,
businessNo: businessNo,
orderSerialNo: orderSerialNo, //提现指令号
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
}
$.ajax({
url: gHost + '/bank-wechat/transfer/query',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: params,
success: function(res7) {
if (res7.code == "10000") {
if (res7.results.status == 0 || res7.results.status ==
1) { //status 状态 0:失败;1:成功;2:处理中 返回处理中,需要调用“提现(提现)结果查询”接口查结果
loading.hide();
if (res7.results.status == 0) {
weui.topTips(res7.results.bizMsg)
} else {
weui.toast('提现成功!', 1500);
}
setTimeout(() => {
location.reload();
}, 2000)
} else {
if (times == 3) {
loading.hide();
weui.topTips('当前提现人数过多,请至我的账户中查看余额');
setTimeout(() => {
this_.BackToMini('UserMain');
}, 1500)
} else {
setTimeout(res => {
this_.transferResults();
}, 2000)
}
}
} else {
loading.hide();
weui.topTips(res7.message)
}
},
error: function(err) {
loading.hide();
},
});
},
//充值结果查询
depositResults() {
let this_ = this;
times++;
let loading = weui.loading('请稍后');
let params = {
businessNo: businessNo,
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
}
$.ajax({
url: gHost + '/bank-wechat/recharge/query',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: params,
success: function(res8) {
if (res8.code == "10000") {
if (res8.results.orderStatus == 3 || res8.results.orderStatus ==
4) { //orderStatus 0:初始值,1:已提交,2:未知,3:失败,4:成功,5:成功未打款
loading.hide();
if (res8.results.orderStatus == 3) {
weui.topTips(res8.results.errMsg)
} else {
weui.toast('充值成功!', 1500);
}
setTimeout(() => {
location.reload();
}, 2000)
} else {
if (times == 3) {
loading.hide();
weui.topTips('当前充值人数过多,请至我的账户中查看余额');
setTimeout(() => {
this_.BackToMini('UserMain');
}, 1500)
} else {
setTimeout(res => {
this_.depositResults();
}, 2000)
}
}
} else {
loading.hide();
weui.topTips(res8.message);
}
},
error: function(err) {
loading.hide();
},
});
},
//充值/提现方法
DoNextStep() {
let this_ = this;
console.log('请填写验证码');
if (this_.VerifyCode == '') {
weui.topTips('请填写验证码')
return
};
if (limitClick) {
return
} else {
limitClick = true;
setTimeout(() => {
limitClick = false;
}, 3000);
}
let loading = weui.loading('请稍后');
times = 0;
if (opeType == 0) { //充值
let params = {
businessNo: businessNo,
otpOrderNo: otpOrderNo,
fromAccNo: payCardNumber, //付款账户
otpValue: this.VerifyCode, //验证码
transAmt: this.inputOtherM * 1, //交易金额
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
}
$.ajax({
url: gHost + '/bank-wechat/recharge',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: params,
success: function(res5) {
if (res5.code == "10000") {
if (res5.errCode && res5.errCode == 'TI009') {
loading.hide();
weui.topTips(res5.results.errMsg);
setTimeout(function() {
$(".RechargeException").siblings().hide()
$(".RechargeException").show()
})
return
};
if (res5.results.orderStatus == 3 || res5.results.orderStatus ==
4) { //orderStatus 0:初始值,1:已提交,2:未知,3:失败,4:成功,5:成功未打款
if (res5.results.orderStatus == 3) {
loading.hide();
weui.topTips(res5.results.errMsg);
} else {
loading.hide();
weui.toast('充值成功!', 1500);
}
setTimeout(() => {
location.reload();
}, 2000)
} else {
setTimeout(() => {
// loading.hide();
this_.depositResults();
}, 2000)
}
} else {
loading.hide();
weui.topTips(res5.message)
}
},
error: function(err) {
loading.hide();
},
});
} else if (opeType == 1) { //提现
let params = {
accountName: bankInfo.trueName,
amount: $('.TxClsTx')[0].value * 1,
businessNo: businessNo,
fromAccountName: bankInfo.trueName,
fromAccountNo: bankInfo.acctNoArray,
otpOrderNo: otpOrderNo,
otpValue: $('.VerifyCode')[0].value, //验证码
toAccountNo: payCardNumber,
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
}
$.ajax({
url: gHost + '/bank-wechat/transfer/withdrawal',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: params,
success: function(res6) {
if (res6.code == "10000") {
orderSerialNo = res6.results.orderSerialNo;
if (res6.results.status == 1 || res6.results.status ==
0) { //状态 0:失败;1:成功;2:处理中 返回处理中,需要调用“提现(转账)结果查询”接口查结果
if (res6.results.status == 0) {
loading.hide();
weui.topTips(res6.results.bizMsg)
} else {
loading.hide();
weui.toast('提现成功!', 1500);
}
setTimeout(() => {
location.reload();
}, 2000)
} else {
setTimeout(() => {
// loading.hide();
transferResults();
}, 2000)
}
} else {
loading.hide();
weui.topTips(res6.message)
}
},
error: function(err) {
loading.hide();
},
});
}
},
//充值/提现判断
toDeposit(type) { //type 0充值 1提现
let this_ = this;
businessNo = '';
otpOrderNo = '';
opeType = type;
if (type == 0) {
if (this.Money * 1 < 3) {
weui.topTips('充值金额必须大于3元');
return
}
if (this.Money * 1 > this.RechargeMax * 1) {
weui.topTips(`充值金额不能大于${this.RechargeMax*1}元`);
return
}
} else {
if ($('.TxClsTx')[0].value * 1 < 0.01) {
weui.topTips('提现金额须大于等于0.01元');
return
}
if ($('.TxClsTx')[0].value * 1 > this.RechargeMax * 1) {
weui.topTips(
`提现金额不可大于账户余额`);
return
}
}
this.open()
},
//发送验证码
SendMsg() {
let this_ = this;
if (this_.CodeMsg != '获取验证码') return false;
let loading = weui.loading('发送中');
if (opeType == 0) { //充值
let params = {
fromAccNo: payCardNumber, //付款账户,
transAmt: this.Money * 1, //交易金额
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
}
$.ajax({
url: gHost + '/bank-wechat/otp/send/recharge',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: params,
success: function(res5) {
loading.hide();
if (res5.code == "10000") {
otpOrderNo = res5.results.otpOrderNo;
businessNo = res5.results.businessNo;
weui.toast('验证码已发送,请注意查收!', 1000);
this_.IntervalFun();
MyTimer = window.setInterval(IntervalFun, 1000);
} else {
weui.topTips(res5.message)
}
},
error: function(err) {
loading.hide();
},
});
} else if (opeType == 1) { //提现
let params = {
accountNo: bankInfo.acctNoArray, //银行卡号
mobileNo: mobileNo, //手机号
'transferAccountBizKeyVO.accountName': bankInfo.trueName, //收款方户名
'transferAccountBizKeyVO.amount': $('.TxClsTx')[0].value * 1, //提现金额
'transferAccountBizKeyVO.fromAccountName': bankInfo.trueName, //转出户名
'transferAccountBizKeyVO.fromAccountNo': bankInfo.acctNoArray, //转出卡号(互联网账户卡号)
'transferAccountBizKeyVO.toAccountNo': payCardNumber, //收款方卡号(绑定卡卡号)
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
}
$.ajax({
url: gHost + '/bank-wechat/otp/send/transfer/account',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: params,
success: function(res5) {
loading.hide();
if (res5.code == "10000") {
otpOrderNo = res5.results.otpOrderNo;
businessNo = res5.results.businessNo;
weui.toast('验证码已发送,请注意查收!', 1000);
this_.IntervalFun();
MyTimer = window.setInterval(this_.IntervalFun, 1000);
} else {
weui.topTips(res5.message)
}
},
error: function(err) {
loading.hide(res5.message);
},
});
}
},
//换绑卡
ChangeCardPay(bankName, bindCard) {
let this_ = this;
if (bindCard == payCardNumber) {
return
}
var loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/user/bank/change/bind',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1,
accountName: bankName,
accountNo: bindCard,
},
success: function(res5) {
loading.hide();
if (res5.code == "10000") {
this_.HideHTML('showBindCardList', 0);
this_.queryUserBankInfo();
} else {
weui.topTips(res5.message)
}
},
error: function(err) {
loading.hide();
},
});
},
//查询一类卡绑定列表
queryBindCardList() {
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/query/account',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1
},
success: function(res4) {
loading.hide();
if (res4.code == "10000") {
var divList = '';
var choiceIndex = 0;
for (let i = 0; i < res4.results.accountList[0].bindcardList.length; i++) {
divList += `<div onclick=ChangeCardPay('${res4.results.accountList[0].bindcardList[i].bankName}','${res4.results.accountList[0].bindcardList[i].bindCardNo}')>
<p>${res4.results.accountList[0].bindcardList[i].bankName}</p>
<p>${res4.results.accountList[0].bindcardList[i].bindCardNo.substr(0,4)+" **** **** "+res4.results.accountList[0].bindcardList[i].bindCardNo.substr(-4)}</p>
<img class='myImg${i} BankListImg' src='img/choiceBank.png'>
</div>`
if (res4.results.accountList[0].bindcardList[i].bindCardNo == payCardNumber) {
choiceIndex = i;
}
}
$('.hideListCover').html(divList);
$(`.myImg${choiceIndex}`).css('display', 'block');
$('.showBindCardList').css('display', 'block');
} else {
weui.topTips(res4.message)
}
},
error: function(err) {
loading.hide();
},
});
},
//获取银行余额
queryBankInfo() {
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/query/balance',
type: "POST",
timeout: 8000,
contentType: "application/x-www-form-urlencoded",
data: bankInfo,
success: function(res3) {
loading.hide();
if (res3.code == "10000") {
if (res3.results.acctInfoList == null) {
weui.topTips("账户信息为空,余额查询失败");
} else {
this_.cardBalanceTx = ((res3.results.acctInfoList[0].hqBalanceDTOList[0]
.balance *
1).toFixed(2));
$('.TxClsTx').attr('placeholder',
`可提现金额${(res3.results.acctInfoList[0].hqBalanceDTOList[0].balance*1).toFixed(2)}元`
)
this_.RechargeMax = ((2000 - ((res3.results.acctInfoList[0]
.hqBalanceDTOList[0]
.balance * 1).toFixed(2) * 1)).toFixed(2));
}
} else {
weui.topTips(res3.message)
}
},
error: function(err) {
loading.hide();
},
complete: function(XMLHttpRequest, status) {
loading.hide();
if (status == 'timeout') {
weui.topTips("请求超时,余额查询失败");
}
}
})
},
//获取用户已填写银行信息
queryUserBankInfo() {
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/bank-wechat/user/bank/get',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1
},
success: function(res2) {
if (res2.code == "10000") {
bankInfo.acctNoArray = res2.results.accountNo;
bankInfo.idNo = res2.results.idNo;
bankInfo.trueName = res2.results.trueName;
payCardNumber = res2.results.bindCardNo;
$('.bankNameClass').html(
`${res2.results.bindCardName}(${res2.results.bindCardNo.substr(-4)})`);
$('.bankNameClass1').html(res2.results.bindCardName + '(储蓄卡)');
$('.payCardEndNo').html('尾号' + res2.results.bindCardNo.substr(-4));
$('.myPhoneTx').html(res2.results.mobileNo);
mobileNo = res2.results.mobileNo;
this_.queryBankInfo();
} else {
weui.topTips(res2.message)
}
},
error: function(err) {
loading.hide();
},
});
},
//查询用户信息
QueryUserInfo() {
let this_ = this;
let loading = weui.loading('请稍后');
$.ajax({
url: gHost + '/wechat/svweapp/QueryPersonalInfo',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: {
userid: userID,
sessionid: sessionID,
wechattype: 1
},
success: function(res1) {
loading.hide();
if (res1.code == "10000") {
bankInfo.schoolId = res1.results.schoolid;
bankInfo.userId = res1.results.id;
$('.userNameTx').html(res1.results.name);
$('.schoolNameTx').html(res1.results.schoolname);
$('.ClsNameTx').html(res1.results.gradename + res1.results.classname);
if (res1.results.usertype == 1) {
$('.StudentCls').css('display', 'block');
$('.TeacherCls').css('display', 'none');
} else {
$('.StudentCls').css('display', 'none');
$('.TeacherCls').css('display', 'block');
}
this_.queryUserBankInfo();
} else {
weui.topTips(res1.message);
setTimeout(() => {
this_.BackToMini('UserMain');
}, 1500)
}
},
error: function(err) {
loading.hide();
},
});
},
// 充值账户异常资料补充
// recharge/acctErrorUpdateResource
acctErrorUpdateResource() {
acctErrorUpdateParms.businessNo = wefileId.businessNo; //业务流水号
acctErrorUpdateParms.schoolId = bankInfo.schoolId;
acctErrorUpdateParms.userId = userID;
acctErrorUpdateParms.homeAddress = acctErrorUpdateParms.homeAddress + acctErrorUpdateParms
.StreetInformation
let {
backSideImgId,
frontSideImgId,
homeAddress,
occupation
} = acctErrorUpdateParms
acctErrorUpdateParms.sessionid = sessionID
acctErrorUpdateParms.wechattype = 1
if (!occupation) {
weui.topTips("请选择职业信息");
return
}
if (!homeAddress) {
weui.topTips("请选择家庭住址");
return
}
if (!backSideImgId) {
weui.topTips("请上传反面身份证图片");
return
}
if (!frontSideImgId) {
weui.topTips("请上传正面身份证图片");
return
}
let loading = weui.loading('信息更新中,请稍后');
return new Promise((resolve, reject) => {
$.ajax({
url: gHost + '/bank-wechat/recharge/acctErrorUpdateResource',
type: "POST",
contentType: "application/x-www-form-urlencoded",
data: acctErrorUpdateParms,
timeout: 8000, //超时时间设置,单位毫秒
success: function(res) {
loading.hide();
if (res.code == '000000') {
weui.topTips("信息更新成功", {
duration: 3000, //3秒后消失
className: 'weui-toptips_success', //自定义类名
callback: function() {
//回调函数
console.log('close')
window.location.reload()
}
});
resolve(res)
} else {
weui.topTips("信息更新失败," + res.message);
loading.hide();
reject(res.message)
}
},
error: function(err) {
loading.hide();
reject(err)
},
})
})
},
//点击上传文件
uploaderInput(e, CredType) {
let fileInfo = e[0];
let fileTypeList = fileInfo.name.split(".");
let fileType = fileTypeList[fileTypeList.length - 1];
if (!(fileType == "jpg" || fileType == "png")) {
weui.topTips("不符合的文件格式,请重新选择");
return;
}
let formData = new FormData();
formData.append("project", wefileId.project)
formData.append("file", fileInfo)
formData.append("fileName", fileInfo.name)
formData.append("expiredTime", wefileId.expiredTime)
formData.append("uuid", wefileId.uuid)
formData.append("wefileToken", wefileId.wefileToken)
formData.append("wefileUrl", wefileId.wefileUrl)
formData.append("sessionid", sessionID)
formData.append("wechattype", 1)
this.UploadIDCardInfo(wefileId.wefileUrl, formData, CredType)
},
// 【获取上传影像token接口】中已经返回了请求地址
UploadIDCardInfo(url, formData, type) {
let loading = weui.loading('请稍后,正在上传');
return new Promise((resolve, reject) => {
return new Promise((resolve, reject) => {
$.ajax({
url: gHost +
`/bank-wechat-server/wefile/upload?wechattype=1&sessionid=${sessionID}`,
type: "post",
data: formData,
processData: false,
contentType: false,
success: function(res) {
console.log(res);
if (res.code == '10000') {
if (type == 1) {
acctErrorUpdateParms.frontSideImgId = res.results;
} else {
acctErrorUpdateParms.backSideImgId = res.results;
}
weui.topTips("上传成功", {
duration: 3000, //3秒后消失
className: 'weui-toptips_success', //自定义类名
callback: function() {}
});
loading.hide();
resolve(res)
} else {
weui.topTips(res.message);
loading.hide();
reject(res.message)
}
},
error: function(err) {
loading.hide();
weui.topTips("上传失败!请检查");
reject(err)
},
})
})
})
},
getWefileId(fileType = 'jpg/png/jpeg') {
let loading = weui.loading('请稍后');
return new Promise((resolve, reject) => {
$.ajax({
url: gHost + '/bank-wechat/wefile/wefileId',
type: "post",
data: {
Authorization: this.getQueryParams('seesionID'),
businessNo: businessNo,
fileType: fileType, //jpg/png/doc/docx/txt/pdf/ppt/xls/xlsx/pptx/jpeg
schoolId: bankInfo.schoolId,
userId: userID,
sessionid: sessionID,
wechattype: 1
},
success: function(res) {
loading.hide();
if (res.code == "10000") {
wefileId = res.results
resolve(res.results)
} else {
reject(res.message)
}
},
error: function(err) {
loading.hide();
reject(err)
},
})
})
},
//街道信息
StreetInformation(e) {
let value = $(e)[0].value;
console.log(value);
acctErrorUpdateParms.StreetInformation = value
},
//立即更新
UpdateRechargeException() {
this.acctErrorUpdateResource()
},
// query/getOccupationList职业信息接口
getOccupationList() {
let loading = weui.loading('请稍后');
return new Promise((resolve, reject) => {
$.ajax({
url: gHost + '/bank-wechat/query/getOccupationList',
type: "post",
data: {
sessionid: sessionID,
wechattype: 1
},
headers: {
'Authorization': getQueryParams('seesionID'),
},
success: function(res) {
loading.hide();
if (res.code == "10000") {
resolve(res.results)
} else {
reject(res.message)
}
},
error: function(err) {
loading.hide();
reject(err)
},
})
})
},
//获取参数
getQueryParams(params) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == params) {
return pair[1];
}
}
return (false);
}
}
}
</script>
<style scoped lang="scss">
html,
body,
page {
width: 750rpx;
background: linear-gradient(180deg, #FFFFFF 0%, #FAFAFA 100%);
}
.contentBox {
width: 670rpx;
height: 376rpx;
margin: 0 auto;
}
.contentDiv {
height: 100%;
// margin-top: 36rpx;
border-radius: 15rpx;
background-image: url('https://xiaopay2020.oss-cn-shenzhen.aliyuncs.com/static/weapp/images/xiaopaycard (31).png');
background-repeat: no-repeat;
background-size: 100% 100%;
position: relative;
top: 36rpx;
}
.HidenText {
margin-top: 147rpx;
}
.HidenText,
.Balance {
padding-left: 46rpx;
padding-right: 40rpx;
display: flex;
justify-content: space-between;
font-size: 28rpx;
color: #FFFFFF;
}
.Balance {
margin-top: 20rpx;
}
.Recharge {
display: flex;
justify-content: space-between;
margin-top: 70rpx;
}
.Recharge .leftdiv {
width: 192rpx;
height: 67rpx;
font-size: 48rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #010101;
line-height: 67rpx;
}
.Recharge .rightdiv {
height: 67rpx;
font-size: 28rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
line-height: 67rpx;
}
.Recharge .rightdiv image {
position: relative;
width: 20rpx;
height: 20rpx;
}
.headview {
display: flex;
justify-content: space-between;
padding-left: 40rpx;
padding-right: 40rpx;
padding-top: 36rpx;
}
.headview .schoolname {
width: 252rpx;
height: 50rpx;
font-size: 36rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #FFFFFF;
line-height: 50rpx;
}
.headview .IconCls {
width: 170rpx;
height: 48rpx;
background: #20946D;
border-radius: 25rpx;
font-size: 24rpx;
font-weight: 400;
color: #FFFFFF;
line-height: 48rpx;
text-align: center;
}
.MoneyBox {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
height: auto;
color: #333333;
}
.choiceClass {
background: #01BC73 !important;
color: #fff;
}
.MoneyBox view {
width: 206rpx;
height: 133rpx;
background: #F5F5F5;
border-radius: 8rpx;
margin-top: 26rpx;
text-align: center;
position: relative;
}
.depotMoney .value {
font-size: 48rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
line-height: 133rpx;
text-align: center;
}
.depotMoney .tips {
// width: 79rpx;
height: 33rpx;
background: linear-gradient(180deg, #FA6400 0%, #FD9D00 100%);
border-radius: 4rpx;
font-size: 18rpx;
font-weight: 500;
padding: 4rpx;
text-align: center;
float: right;
position: absolute;
right: 0rpx;
line-height: 33rpx;
}
.OtherMoney {
display: flex;
justify-content: center;
color: #999999;
font-size: 28rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
line-height: 40rpx;
margin-top: 26rpx;
}
.OtherMoney view:nth-child(2) {
width: 30rpx;
height: 30rpx;
background: #F0F0F0;
border-radius: 50%;
text-align: center;
line-height: 30rpx;
margin-top: 7rpx;
margin-left: 5rpx;
}
.payType {
height: 98rpx;
line-height: 98rpx;
display: flex;
justify-content: space-between;
}
.payType view:nth-child(1) {
width: 120rpx;
height: 42rpx;
font-size: 30rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #666666;
line-height: 98rpx;
}
.payType view::nth-child(2) {
width: 225rpx;
height: 45rpx;
font-size: 32rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
line-height: 45rpx;
}
.switchbankCard {
width: 224px;
height: 40rpx;
font-size: 28rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
line-height: 40rpx;
margin-top: 12rpx;
}
.arrow {
transform: rotate(-45deg);
top: -1rpx;
border: solid #999999;
border-width: 0 1rpx 1rpx 0;
display: inline-block;
padding: 8rpx;
position: relative;
}
.DepositID {
width: 630rpx;
height: 92rpx;
background: #04BA73;
border-radius: 8rpx;
margin: 0 auto;
text-align: center;
bottom: 30rpx;
position: fixed;
left: 0;
right: 0;
}
.DepositID span {
height: 50rpx;
font-size: 36rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #FFFFFF;
line-height: 92rpx;
}
.MyPhoneCls {
position: fixed;
width: 562rpx;
height: 497rpx;
left: 0;
right: 0;
top: 460rpx;
margin: 0 auto;
font-size: 30rpx;
background: #fff;
border-radius: 8rpx;
}
.closePhoneBox {
width: 35rpx;
height: 35rpx;
background: #7E7E7E;
position: relative;
left: 522rpx;
top: -52rpx;
line-height: 30rpx;
text-align: center;
color: #BEBEBE;
border-radius: 100%;
border: 2px solid #BEBEBE;
}
.doBtnTx {
width: 506rpx;
height: 92rpx;
background: #04BA73;
border-radius: 8rpx;
color: #FFFFFF;
position: absolute;
left: 0;
right: 0;
margin: 0 auto;
bottom: 38rpx;
}
.MyPhoneCls input {
border: none;
outline: none;
height: 80rpx;
line-height: 80rpx;
padding-left: 50rpx;
}
.PhoneNum,
.VerifyCode {
width: 506rpx;
height: 80rpx;
line-height: 60rpx;
background: #F7F6FB;
margin: 0 auto;
margin-top: 20rpx;
}
.VerifyCode {
display: flex;
justify-content: space-between;
}
.VerifyCode input {
width: 200rpx;
}
.CodeMsg {
color: #01BC73;
background: #F7F6FB;
font-size: 32rpx;
font-weight: 600;
line-height: 80rpx;
letter-spacing: 3rpx;
}
.placeholderInput {
color: #AAAAAA;
font-size: 32rpx;
font-weight: 500;
letter-spacing: 3rpx;
// padding-left: 50rpx;
height: 80rpx;
}
.OtherTitle {
height: 67rpx;
font-size: 48rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #010101;
line-height: 67rpx;
padding-top: 60rpx;
}
.inputOtherM {
display: flex;
height: 100rpx;
margin-top: 40rpx;
}
.inputOtherM input {
border: none;
outline: none;
height: 50rpx;
padding-left: 16rpx;
font-size: 72rpx;
font-weight: 600;
}
.inputOtherM span:nth-child(1) {
width: 72rpx;
font-size: 80rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #010101;
line-height: 100rpx;
}
.OtherLine {
width: 631rpx;
height: 1rpx;
background-color: #CCCCCC;
margin-top: 19rpx;
}
.depositImg {
width: 14rpx;
vertical-align: middle;
margin-right: 8rpx;
}
.Recharge_ {
height: 40rpx;
font-size: 28rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
line-height: 40rpx;
margin-top: 40rpx;
}
.Recharge_ span:nth-child(2) {
font-size: 28rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #FA6400;
}
.placeholderinputOtherM {
height: 50rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #010101;
line-height: 50rpx;
}
// 异常处理
.RechargeException {
padding-top: 20rpx;
}
.weui-label {
// width: 118rpx;
height: 42rpx;
font-size: 30rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #3D3D3D;
line-height: 42rpx;
font-weight: bold;
margin-left: 30rpx;
}
.tiptext {
height: 1.06rem;
font-size: 0.75rem;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #03BC73;
line-height: 1.06rem;
margin-bottom: 0.625rem;
text-align: center;
}
.bottomDetail {
width: 628rpx;
height: 88rpx;
color: white;
// position: fixed;
// left: 0;
// right: 0;
margin: 0 auto;
background-color: #03BC73;
text-align: center;
line-height: 88rpx;
margin-top: 84rpx;
}
.RechargeException input::placeholder {
color: #A1A4A8;
}
.RechargeException .weui-cell {
height: 4rem;
padding: 0 !important;
}
.idCardPhoto1,
.idCardPhoto2 {
width: 388rpx;
height: 224rpx;
margin: 0 auto;
margin-top: 20rpx;
}
.idCardPhoto1 image,
.idCardPhoto2 image {
width: 100%;
height: 100%;
position: relative;
}
.weui-toptips_success {
background-color: #03BC73 !important
}
.positionCam {
height: 32rpx;
font-size: 22rpx;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
color: #6D7278;
line-height: 32rpx;
text-align: center;
position: relative;
top: -29px;
}
</style>
<template>
<view class="container">
<view id="comFirmCode"></view>
<p>请使用微信扫码识别二维码,确认采集信息</p>
</view>
</template>
<script>
export default {
name:"confirmQrCode",
data() {
return {
}
},
created: function() {
},
mounted: function() {
let this_ = this;
this.$nextTick(function() {
setTimeout(function() {
var qrCode = new QRCode(document.getElementById("comFirmCode"), {
width: 201,
height: 201
})
console.log(location.href)
var myCode = location.href.split('mpwechat/confirmQrCode.html?');
var url = `${myCode[0]}wechat/qr/qrreacquire?${myCode[1]}`;
console.log('url = ' + url)
qrCode.makeCode(url.replace("invitation", "main"));
$("#comFirmCode").find('img').css({
"width": "50vw",
"height": "50vw",
"padding": "3vw",
"border": "4px solid #39ddb0"
})
}, 100)
})
},
methods: {
}
}
</script>
<style scoped>
body {
margin: 0;
}
#comFirmCode {
width: 50vw;
height: 50vw;
margin: 10vh 0 0 21vw;
}
img {
width: 50vw;
height: 50vw;
padding: 3vw;
border: 4px solid #39ddb0;
}
p {
font-size: 14px;
color: gray;
margin-top: 50px;
text-align: center;
}
</style>
<template>
<view class="container">
</view>
</template>
<script>
export default {
data() {
return {
}
},
onLoad() {
uni.showLoading({
mask: true,
title: "请稍后......."
})
uni.navigateTo({
url: "/pages/ClsWeekReport/ClsWeekReport?hex=5cfced54d879e4b8ef17d3f8d87e4567",
success: function() {
uni.hideLoading()
}
})
},
created: function() {
// console.log(this.$echarts);
},
methods: {
},
mounted: function() {}
}
</script>
<style scoped>
</style>
<template>
<view class="container">
<view class="logonBox" id="Login1">
<p>请确认是否登录【校智付平台】</p>
<view id="inputDiv" onclick="InputClick()">
点击上传通讯录
</view>
<input id="inputBox" type="file" @input="upload(this)" accept=".txt" />
<button onclick="LoginTo()">登录</button>
</view>
<view id="Login2">
<p>API同步设置<img class="imgBox" src="../../static/img/question.png" title="通过API同步通讯录可获取到应用中的通讯录可见范围内全部数据"
alt=""></p>
<view style="display: flex;justify-content: space-between;margin:30rpx 0;">
<view style="line-height: 40rpx;">
<span style="color: red;font-size: 18rpx;">*</span>
<span>secret:</span>
</view>
<input id="inputBox2" onkeyup="this.value=this.value.replace(/\s+/g,'')" type="text" />
</view>
<view class="btngroup" style='display:flex;width: 60%;margin-left: 20%;justify-content: space-between;'>
<view class="cancel" @click='windowClose'>取消</view>
<view class="enture" @click="handleSecret">确定</view>
</view>
</view>
<view class="copyRight">
<p>湖南校智付网络科技有限公司All Rights Reserved 湘ICP备 17004139号-1 Copyright ©<span id="NowYear"></span></p>
</view>
</view>
</template>
<script>
let Host = '',
Token = '',
authUrl = '',
JsonList = [],
upLoadSuccess = false,
syncMode = 1; //采集流程区分
let AuthCode, HostService;
export default {
name:"wxWorkAuth",
data() {
return {
}
},
created: function() {
},
mounted: function() {
let this_ = this;
AuthCode = this_.getQueryParams('auth_code');
HostService = this_.getQueryParams('app');
this.$nextTick(function() {
if (AuthCode === undefined || AuthCode == '') {
uni.showToast({
icon: "none",
title: "auth_code参数确失"
})
return
};
$('#NowYear').html(new Date().getFullYear())
this_.wxLogin();
$("#inputDiv").click(function() {
$("#inputBox").click();
});
})
},
methods: {
//获取参数
getQueryParams(params) {
let href = window.location.href
let query = href.substring(href.indexOf('?') + 1);
let vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
let pair = vars[i].split("=");
if (pair[0] == params) {
return pair[1];
}
}
return (false);
},
//企微单点登录
wxLogin() {
// $('#Login2').css('display', 'block');
// Token = "res.results.token";
// syncMode = 2;
// return
$.ajax({
url: `${Host}/${HostService}/admin/code2Token`,
data: JSON.stringify({
authCode: AuthCode
}),
type: "POST",
// contentType: "application/json",
dataType: "json",
success: function(res) {
if (res.code == 10000) {
if (res.results.syncMode == 2) { //secret 流程2
$('#Login2').css('display', 'block');
Token = res.results.token;
syncMode = 2;
} else { //默认流程
syncMode = 1;
$('#Login1').css('display', 'block');
Token = res.results.token;
getTxtUrl();
}
} else {
alert(res.message);
}
}
})
},
//提交secret
handleSecret() {
if ($('#inputBox2').val() == '') {
alert('请先填写secret')
return
}
$.ajax({
url: `${Host}/${HostService}/admin/SubmitContactSecret`,
data: JSON.stringify({
secret: $('#inputBox2').val()
}),
type: "POST",
// contentType: "application/json",
dataType: "json",
success: function(res) {
if (res.code == 10000) {
alert('提交成功');
window.location = location.href.split('mpwechat/wxWorkAuth.html')[0];
} else {
alert(res.msg);
}
},
beforeSend: function(xhr) {
xhr.setRequestHeader("token", Token);
}
})
},
//获取转义后的下载地址
getTxtUrl() {
$.ajax({
url: `${Host}/${HostService}/admin/getIdTranslateFileUrl`,
data: {},
type: "GET",
contentType: "application/json",
dataType: "json",
success: function(res) {
if (res.code == 10000) {
authUrl = res.results.url;
download()
// alert('链接='+authUrl)
} else {
alert(res.message);
}
},
beforeSend: function(xhr) {
xhr.setRequestHeader("token", Token);
}
})
},
//下载
download() {
this.$nextTick(function() {
let a = document.createElement('a');
let event = new MouseEvent('click');
a.href = authUrl;
console.log('导出路径 = ' + authUrl)
a.dispatchEvent(event);
})
},
//上传转义内容
sendTXTContent() {
console.log(JsonList);
if (JsonList && JSON.parse(JsonList) != '' && JSON.parse(JsonList).length && JSON.parse(JsonList)[0]
.corp_id) {} else {
$("#inputDiv").html('点击上传通讯录');
return alert('上传文件有误,请重新上传');
}
$.ajax({
url: `${Host}/${HostService}/admin/uploadIdTranslateFileContent`,
data: JSON.stringify({
fileContent: JsonList
}),
contentType: "application/json",
type: "POST",
dataType: "json",
success: function(res) {
if (res.code == 10000) {
upLoadSuccess = true;
} else {
upLoadSuccess = false;
alert(res.message);
}
},
beforeSend: function(xhr) {
xhr.setRequestHeader("token", Token);
}
})
},
//跳转
LoginTo() {
if (!upLoadSuccess) {
alert('通讯录未导入,请导入通讯录!');
return
}
window.location = location.href.split('mpwechat/wxWorkAuth.html')[0];
},
windowClose() {
window.close();
},
//本地文件的内容
upload(input) { //支持chrome IE10
if (window.FileReader) {
var file = input.files[0];
event.target.value = ''; //解决同一个文件不能二次上传
$("#inputDiv").html(file.name);
filename = file.name.split(".")[0];
var reader = new FileReader();
reader.onload = function() {
JsonList = this.result;
sendTXTContent()
// alert(this.result);
}
reader.readAsText(file);
}
//支持IE 7 8 9 10
else if (typeof window.ActiveXObject != 'undefined') {
var xmlDoc;
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.load(input.value);
JsonList = xmlDoc.xml;
sendTXTContent()
// alert(xmlDoc.xml);
}
// //支持FF
else if (document.implementation && document.implementation.createDocument) {
var xmlDoc;
xmlDoc = document.implementation.createDocument("", "", null);
xmlDoc.async = false;
xmlDoc.load(input.value);
JsonList = xmlDoc.xml;
sendTXTContent()
// alert(xmlDoc.xml);
} else {
alert('error');
}
console.log(JsonList)
}
}
}
</script>
<style scoped>
page {
width: 100vw;
height: 100vh;
margin: 0;
padding: 0;
background-image: url(../../static/img/loginBg.png);
}
.imgBox {
display: inline-block;
width: 17rpx;
margin-left: 5rpx;
vertical-align: middle;
}
.logonBox {
margin: 20vh auto;
text-align: center;
background: #fff;
width: 300rpx;
display: none;
border-radius: 5rpx;
padding: 20rpx 50rpx 30rpx 50rpx;
}
#Login2 {
margin: 20vh auto;
text-align: center;
background: #fff;
width: 100%;
display: none;
border-radius: 5rpx;
padding: 20rpx 20rpx 30rpx 20rpx;
}
#Login2>p {
text-align: left;
margin: 0;
padding-bottom: 10rpx;
border-bottom: 1rpx solid #e6e6e6;
}
#inputBox2 {
height: 40rpx;
border: 1rpx solid #e6e6e6;
width: 75%;
padding: 0 2%;
outline: none;
}
#Login2>div>button {
width: 45% !important;
height: 40rpx !important;
cursor: pointer;
font-size: 15rpx;
}
#Login2>div>button:hover {
opacity: 0.8;
}
.btngroup view{
width: 300rpx;
height: 60rpx;
text-align: center;
line-height: 60rpx;
margin: 0 auto;
border: 2rpx solid #ccc;
}
.cancel {
background: #fff;
color: #888;
}
.enture {
background: linear-gradient(to top, #0BC5B7, #2FDE97);
}
.logonBox>p {
font-size: 18rpx;
font-weight: bold;
}
button {
width: 90%;
height: 45rpx;
outline: none;
border-radius: 5rpx;
margin-top: 15rpx;
border: none;
line-height: 0;
color: #fff;
font-size: 20rpx;
background: -webkit-linear-gradient(left, #0BC5B7, #2FDE97);
}
.copyRight {
position: fixed;
bottom: 20rpx;
}
.copyRight>p {
text-align: center;
font-size: 14rpx;
width: 100vw;
color: #3BBDB1;
}
#inputBox {
height: 100%;
width: 100%;
opacity: 0;
}
#inputDiv {
background: #fff;
border: 1rpx dashed #2FDE97;
text-align: center;
width: 200rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 15rpx;
color: #2FDE97;
height: 35rpx;
margin-left: 50rpx;
border-radius: 2rpx;
line-height: 35rpx;
margin-top: 30rpx;
}
</style>
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
/*
* desc
* CreateTime
* Copyright @zilvzsy
* author @zilvzsy
*/
import Vue from 'vue'
import Vuex from 'vuex'
//挂载Vuex
Vue.use(Vuex)
//创建VueX对象
const store = new Vuex.Store({
state: {
//存放的键值对就是所要管理的状态
dialogPramas:{
cancelText:'',
confirmText:'',
content:'',
titleText:'',
showDialog:false,
showCancel:true,
showBtnT:0,
toastStyle:'',
toastStatus:null,
toastTime:2000,
countDown:null,
confirmTip:'',
fail(){},
success(){},
},
showModel:null
},
mutations: {
//es6语法,等同edit:funcion(){...}
handleDialog(state,res){
state.showModel = res
//在点击事件处理增加
// 要改变就
// store.commit("hadleDialog",要改变的参数)
// store.commit("hadleDialog",res)
}
},
actions: {
},
// modules:{
// utils:{
// state:{
// showModel:null,
// }
// }
// }
})
export default store
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="shortcut icon" type="image/x-icon" href="./faceico.ico"/>
<title>
<%= htmlWebpackPlugin.options.title %>
</title>
<script src="//s1.pstatp.com/cdn/expire-1-M/jquery/1.8.0/jquery-1.8.0.min.js" async="async"></script>
<script src="//res.wx.qq.com/open/libs/weuijs/1.2.1/weui.min.js" async="async"></script>
<script src="//res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script src="//static.runoob.com/assets/qrcode/qrcode.min.js" async="async"></script>
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS
.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
<script src="//cdn.bootcdn.net/ajax/libs/clipboard.js/2.0.6/clipboard.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/eruda" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
// eruda.init();
</script>
</head>
<body>
<noscript>
<strong>Please enable JavaScript to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
/**
* 这里是uni-app内置的常用样式变量
*
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
*
*/
/**
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
*
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
*/
/* 颜色变量 */
/* 行为相关颜色 */
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
/* 文字基本颜色 */
$uni-text-color:#333;//基本色
$uni-text-color-inverse:#fff;//反色
$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
$uni-text-color-placeholder: #808080;
$uni-text-color-disable:#c0c0c0;
/* 背景颜色 */
$uni-bg-color:#ffffff;
$uni-bg-color-grey:#f8f8f8;
$uni-bg-color-hover:#f1f1f1;//点击状态颜色
$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
/* 边框颜色 */
$uni-border-color:#c8c7cc;
/* 尺寸变量 */
/* 文字尺寸 */
$uni-font-size-sm:24rpx;
$uni-font-size-base:28rpx;
$uni-font-size-lg:32rpx;
/* 图片尺寸 */
$uni-img-size-sm:40rpx;
$uni-img-size-base:52rpx;
$uni-img-size-lg:80rpx;
/* Border Radius */
$uni-border-radius-sm: 4rpx;
$uni-border-radius-base: 6rpx;
$uni-border-radius-lg: 12rpx;
$uni-border-radius-circle: 50%;
/* 水平间距 */
$uni-spacing-row-sm: 10px;
$uni-spacing-row-base: 20rpx;
$uni-spacing-row-lg: 30rpx;
/* 垂直间距 */
$uni-spacing-col-sm: 8rpx;
$uni-spacing-col-base: 16rpx;
$uni-spacing-col-lg: 24rpx;
/* 透明度 */
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
/* 文章场景相关 */
$uni-color-title: #2C405A; // 文章标题颜色
$uni-font-size-title:40rpx;
$uni-color-subtitle: #555555; // 二级标题颜色
$uni-font-size-subtitle:36rpx;
$uni-color-paragraph: #3F536E; // 文章段落颜色
$uni-font-size-paragraph:30rpx;
\ No newline at end of file
## 1.4.2(2021-05-12)
- 新增 组件示例地址
## 1.4.1(2021-04-29)
- 修复 组件内放置 input 、textarea 组件,无法聚焦的问题
## 1.4.0 (2021-04-29)
- 新增 type 属性的 left\right 值,支持左右弹出
- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗
- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色
- 新增 safeArea 属性,是否适配底部安全区
- 修复 App\h5\微信小程序底部安全区占位不对的Bug
- 修复 App 端弹出等待的Bug
- 优化 提升低配设备性能,优化动画卡顿问题
- 优化 更简单的组件自定义方式
## 1.4.0
- 新增 type 属性的 left\right 值,支持左右弹出
- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗
- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色
- 新增 safeArea 属性,是否适配底部安全区
- 修复 App\h5\微信小程序底部安全区占位不对的Bug
- 修复 App 端弹出等待的Bug
- 优化 提升低配设备性能,优化动画卡顿问题
- 优化 更简单的组件自定义方式
## 1.2.9(2021-02-05)
- 优化 组件引用关系,通过uni_modules引用组件
## 1.2.8(2021-02-05)
- 调整为uni_modules目录规范
## 1.2.7(2021-02-05)
- 调整为uni_modules目录规范
- 新增 支持 PC 端
- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端
// #ifdef H5
export default {
name: 'Keypress',
props: {
disable: {
type: Boolean,
default: false
}
},
mounted () {
const keyNames = {
esc: ['Esc', 'Escape'],
tab: 'Tab',
enter: 'Enter',
space: [' ', 'Spacebar'],
up: ['Up', 'ArrowUp'],
left: ['Left', 'ArrowLeft'],
right: ['Right', 'ArrowRight'],
down: ['Down', 'ArrowDown'],
delete: ['Backspace', 'Delete', 'Del']
}
const listener = ($event) => {
if (this.disable) {
return
}
const keyName = Object.keys(keyNames).find(key => {
const keyName = $event.key
const value = keyNames[key]
return value === keyName || (Array.isArray(value) && value.includes(keyName))
})
if (keyName) {
// 避免和其他按键事件冲突
setTimeout(() => {
this.$emit(keyName, {})
}, 0)
}
}
document.addEventListener('keyup', listener)
this.$once('hook:beforeDestroy', () => {
document.removeEventListener('keyup', listener)
})
},
render: () => {}
}
// #endif
<template>
<view class="uni-popup-dialog">
<view class="uni-dialog-title">
<text class="uni-dialog-title-text" :class="['uni-popup__'+dialogType]">{{title}}</text>
</view>
<view v-if="mode === 'base'" class="uni-dialog-content">
<slot>
<text class="uni-dialog-content-text">{{content}}</text>
</slot>
</view>
<view v-else class="uni-dialog-content">
<slot>
<input class="uni-dialog-input" v-model="val" type="text" :placeholder="placeholder" :focus="focus" >
</slot>
</view>
<view class="uni-dialog-button-group">
<view class="uni-dialog-button" @click="closeDialog">
<text class="uni-dialog-button-text">取消</text>
</view>
<view class="uni-dialog-button uni-border-left" @click="onOk">
<text class="uni-dialog-button-text uni-button-color">确定</text>
</view>
</view>
</view>
</template>
<script>
import popup from '../uni-popup/popup.js'
/**
* PopUp 弹出层-对话框样式
* @description 弹出层-对话框样式
* @tutorial https://ext.dcloud.net.cn/plugin?id=329
* @property {String} value input 模式下的默认值
* @property {String} placeholder input 模式下输入提示
* @property {String} type = [success|warning|info|error] 主题样式
* @value success 成功
* @value warning 提示
* @value info 消息
* @value error 错误
* @property {String} mode = [base|input] 模式、
* @value base 基础对话框
* @value input 可输入对话框
* @property {String} content 对话框内容
* @property {Boolean} beforeClose 是否拦截取消事件
* @event {Function} confirm 点击确认按钮触发
* @event {Function} close 点击取消按钮触发
*/
export default {
name: "uniPopupDialog",
mixins: [popup],
props: {
value: {
type: [String, Number],
default: ''
},
placeholder: {
type: [String, Number],
default: '请输入内容'
},
type: {
type: String,
default: 'error'
},
mode: {
type: String,
default: 'base'
},
title: {
type: String,
default: '提示'
},
content: {
type: String,
default: ''
},
beforeClose: {
type: Boolean,
default: false
}
},
data() {
return {
dialogType: 'error',
focus: false,
val: ""
}
},
watch: {
type(val) {
this.dialogType = val
},
mode(val) {
if (val === 'input') {
this.dialogType = 'info'
}
},
value(val) {
this.val = val
}
},
created() {
// 对话框遮罩不可点击
this.popup.disableMask()
// this.popup.closeMask()
if (this.mode === 'input') {
this.dialogType = 'info'
this.val = this.value
} else {
this.dialogType = this.type
}
},
mounted() {
this.focus = true
},
methods: {
/**
* 点击确认按钮
*/
onOk() {
if (this.mode === 'input'){
this.$emit('confirm', this.val)
}else{
this.$emit('confirm')
}
if(this.beforeClose) return
this.popup.close()
},
/**
* 点击取消按钮
*/
closeDialog() {
this.$emit('close')
if(this.beforeClose) return
this.popup.close()
},
close(){
this.popup.close()
}
}
}
</script>
<style lang="scss" scoped>
.uni-popup-dialog {
width: 300px;
border-radius: 15px;
background-color: #fff;
}
.uni-dialog-title {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: center;
padding-top: 15px;
padding-bottom: 5px;
}
.uni-dialog-title-text {
font-size: 16px;
font-weight: 500;
}
.uni-dialog-content {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: center;
align-items: center;
padding: 5px 15px 15px 15px;
}
.uni-dialog-content-text {
font-size: 14px;
color: #6e6e6e;
}
.uni-dialog-button-group {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
border-top-color: #f5f5f5;
border-top-style: solid;
border-top-width: 1px;
}
.uni-dialog-button {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex: 1;
flex-direction: row;
justify-content: center;
align-items: center;
height: 45px;
}
.uni-border-left {
border-left-color: #f0f0f0;
border-left-style: solid;
border-left-width: 1px;
}
.uni-dialog-button-text {
font-size: 14px;
}
.uni-button-color {
color: #007aff;
}
.uni-dialog-input {
flex: 1;
font-size: 14px;
border: 1px #eee solid;
height: 40px;
padding: 0 10px;
border-radius: 5px;
color: #555;
}
.uni-popup__success {
color: #4cd964;
}
.uni-popup__warn {
color: #f0ad4e;
}
.uni-popup__error {
color: #dd524d;
}
.uni-popup__info {
color: #909399;
}
</style>
<template>
<view class="uni-popup-message">
<view class="uni-popup-message__box fixforpc-width" :class="'uni-popup__'+type">
<slot>
<text class="uni-popup-message-text" :class="'uni-popup__'+type+'-text'">{{message}}</text>
</slot>
</view>
</view>
</template>
<script>
import popup from '../uni-popup/popup.js'
/**
* PopUp 弹出层-消息提示
* @description 弹出层-消息提示
* @tutorial https://ext.dcloud.net.cn/plugin?id=329
* @property {String} type = [success|warning|info|error] 主题样式
* @value success 成功
* @value warning 提示
* @value info 消息
* @value error 错误
* @property {String} message 消息提示文字
* @property {String} duration 显示时间,设置为 0 则不会自动关闭
*/
export default {
name: 'uniPopupMessage',
mixins:[popup],
props: {
/**
* 主题 success/warning/info/error 默认 success
*/
type: {
type: String,
default: 'success'
},
/**
* 消息文字
*/
message: {
type: String,
default: ''
},
/**
* 显示时间,设置为 0 则不会自动关闭
*/
duration: {
type: Number,
default: 3000
},
maskShow:{
type:Boolean,
default:false
}
},
data() {
return {}
},
created() {
this.popup.maskShow = this.maskShow
this.popup.messageChild = this
},
methods: {
timerClose(){
if(this.duration === 0) return
clearTimeout(this.timer)
this.timer = setTimeout(()=>{
this.popup.close()
},this.duration)
}
}
}
</script>
<style lang="scss" scoped>
.uni-popup-message {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: center;
}
.uni-popup-message__box {
background-color: #e1f3d8;
padding: 10px 15px;
border-color: #eee;
border-style: solid;
border-width: 1px;
flex: 1;
}
@media screen and (min-width: 500px) {
.fixforpc-width {
margin-top: 20px;
border-radius: 4px;
flex: none;
min-width: 380px;
/* #ifndef APP-NVUE */
max-width: 50%;
/* #endif */
/* #ifdef APP-NVUE */
max-width: 500px;
/* #endif */
}
}
.uni-popup-message-text {
font-size: 14px;
padding: 0;
}
.uni-popup__success {
background-color: #e1f3d8;
}
.uni-popup__success-text {
color: #67C23A;
}
.uni-popup__warn {
background-color: #faecd8;
}
.uni-popup__warn-text {
color: #E6A23C;
}
.uni-popup__error {
background-color: #fde2e2;
}
.uni-popup__error-text {
color: #F56C6C;
}
.uni-popup__info {
background-color: #F2F6FC;
}
.uni-popup__info-text {
color: #909399;
}
</style>
<template>
<view class="uni-popup-share">
<view class="uni-share-title"><text class="uni-share-title-text">{{title}}</text></view>
<view class="uni-share-content">
<view class="uni-share-content-box">
<view class="uni-share-content-item" v-for="(item,index) in bottomData" :key="index" @click.stop="select(item,index)">
<image class="uni-share-image" :src="item.icon" mode="aspectFill"></image>
<text class="uni-share-text">{{item.text}}</text>
</view>
</view>
</view>
<view class="uni-share-button-box">
<button class="uni-share-button" @click="close">取消</button>
</view>
</view>
</template>
<script>
import popup from '../uni-popup/popup.js'
export default {
name: 'UniPopupShare',
mixins:[popup],
props: {
title: {
type: String,
default: '分享到'
},
beforeClose: {
type: Boolean,
default: false
}
},
data() {
return {
bottomData: [{
text: '微信',
icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/c2b17470-50be-11eb-b680-7980c8a877b8.png',
name: 'wx'
},
{
text: '支付宝',
icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/d684ae40-50be-11eb-8ff1-d5dcf8779628.png',
name: 'wx'
},
{
text: 'QQ',
icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/e7a79520-50be-11eb-b997-9918a5dda011.png',
name: 'qq'
},
{
text: '新浪',
icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/0dacdbe0-50bf-11eb-8ff1-d5dcf8779628.png',
name: 'sina'
},
{
text: '百度',
icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/1ec6e920-50bf-11eb-8a36-ebb87efcf8c0.png',
name: 'copy'
},
{
text: '其他',
icon: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/2e0fdfe0-50bf-11eb-b997-9918a5dda011.png',
name: 'more'
}
]
}
},
created() {},
methods: {
/**
* 选择内容
*/
select(item, index) {
this.$emit('select', {
item,
index
})
this.close()
},
/**
* 关闭窗口
*/
close() {
if(this.beforeClose) return
this.popup.close()
}
}
}
</script>
<style lang="scss" scoped>
.uni-popup-share {
background-color: #fff;
}
.uni-share-title {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
justify-content: center;
height: 40px;
}
.uni-share-title-text {
font-size: 14px;
color: #666;
}
.uni-share-content {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
justify-content: center;
padding-top: 10px;
}
.uni-share-content-box {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
flex-wrap: wrap;
width: 360px;
}
.uni-share-content-item {
width: 90px;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
justify-content: center;
padding: 10px 0;
align-items: center;
}
.uni-share-content-item:active {
background-color: #f5f5f5;
}
.uni-share-image {
width: 30px;
height: 30px;
}
.uni-share-text {
margin-top: 10px;
font-size: 14px;
color: #3B4144;
}
.uni-share-button-box {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
padding: 10px 15px;
}
.uni-share-button {
flex: 1;
border-radius: 50px;
color: #666;
font-size: 16px;
}
.uni-share-button::after {
border-radius: 50px;
}
</style>
// #ifdef H5
export default {
name: 'Keypress',
props: {
disable: {
type: Boolean,
default: false
}
},
mounted () {
const keyNames = {
esc: ['Esc', 'Escape'],
tab: 'Tab',
enter: 'Enter',
space: [' ', 'Spacebar'],
up: ['Up', 'ArrowUp'],
left: ['Left', 'ArrowLeft'],
right: ['Right', 'ArrowRight'],
down: ['Down', 'ArrowDown'],
delete: ['Backspace', 'Delete', 'Del']
}
const listener = ($event) => {
if (this.disable) {
return
}
const keyName = Object.keys(keyNames).find(key => {
const keyName = $event.key
const value = keyNames[key]
return value === keyName || (Array.isArray(value) && value.includes(keyName))
})
if (keyName) {
// 避免和其他按键事件冲突
setTimeout(() => {
this.$emit(keyName, {})
}, 0)
}
}
document.addEventListener('keyup', listener)
this.$once('hook:beforeDestroy', () => {
document.removeEventListener('keyup', listener)
})
},
render: () => {}
}
// #endif
export default {
data() {
return {
}
},
created(){
this.popup = this.getParent()
},
methods:{
/**
* 获取父元素实例
*/
getParent(name = 'uniPopup') {
let parent = this.$parent;
let parentName = parent.$options.name;
while (parentName !== name) {
parent = parent.$parent;
if (!parent) return false
parentName = parent.$options.name;
}
return parent;
},
}
}
<template>
<view v-if="showPopup" class="uni-popup" :class="[popupstyle, isDesktop ? 'fixforpc-z-index' : '']" @touchmove.stop.prevent="clear">
<view @touchstart="touchstart" >
<uni-transition key="1" v-if="maskShow" name="mask" mode-class="fade" :styles="maskClass" :duration="duration" :show="showTrans" @click="onTap" />
</view>
<uni-transition key="2" :mode-class="ani" name="content" :styles="transClass" :duration="duration" :show="showTrans" @click="onTap">
<view class="uni-popup__wrapper" :style="{ backgroundColor: bg }" :class="[popupstyle]" @click="clear"><slot /></view>
</uni-transition>
<!-- #ifdef H5 -->
<keypress v-if="maskShow" @esc="onTap" />
<!-- #endif -->
</view>
</template>
<script>
// #ifdef H5
import keypress from './keypress.js'
// #endif
/**
* PopUp 弹出层
* @description 弹出层组件,为了解决遮罩弹层的问题
* @tutorial https://ext.dcloud.net.cn/plugin?id=329
* @property {String} type = [top|center|bottom|left|right|message|dialog|share] 弹出方式
* @value top 顶部弹出
* @value center 中间弹出
* @value bottom 底部弹出
* @value left 左侧弹出
* @value right 右侧弹出
* @value message 消息提示
* @value dialog 对话框
* @value share 底部分享示例
* @property {Boolean} animation = [ture|false] 是否开启动画
* @property {Boolean} maskClick = [ture|false] 蒙版点击是否关闭弹窗
* @property {String} backgroundColor 主窗口背景色
* @property {Boolean} safeArea 是否适配底部安全区
* @event {Function} change 打开关闭弹窗触发,e={show: false}
*/
export default {
name: 'uniPopup',
components: {
// #ifdef H5
keypress
// #endif
},
props: {
// 开启动画
animation: {
type: Boolean,
default: true
},
// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
// message: 消息提示 ; dialog : 对话框
type: {
type: String,
default: 'center'
},
// maskClick
maskClick: {
type: Boolean,
default: true
},
backgroundColor: {
type: String,
default: 'none'
},
safeArea:{
type: Boolean,
default: true
}
},
watch: {
/**
* 监听type类型
*/
type: {
handler: function(type) {
if (!this.config[type]) return
this[this.config[type]](true)
},
immediate: true
},
isDesktop: {
handler: function(newVal) {
if (!this.config[newVal]) return
this[this.config[this.type]](true)
},
immediate: true
},
/**
* 监听遮罩是否可点击
* @param {Object} val
*/
maskClick: {
handler: function(val) {
this.mkclick = val
},
immediate: true
},
safeArea: {
type: Boolean,
default: true
}
},
data() {
return {
duration: 300,
ani: [],
showPopup: false,
showTrans: false,
popupWidth: 0,
popupHeight: 0,
config: {
top: 'top',
bottom: 'bottom',
center: 'center',
left: 'left',
right: 'right',
message: 'top',
dialog: 'center',
share: 'bottom'
},
maskClass: {
position: 'fixed',
bottom: 0,
top: 0,
left: 0,
right: 0,
backgroundColor: 'rgba(0, 0, 0, 0.4)'
},
transClass: {
position: 'fixed',
left: 0,
right: 0
},
maskShow: true,
mkclick: true,
popupstyle: this.isDesktop ? 'fixforpc-top' : 'top'
}
},
computed: {
isDesktop() {
return this.popupWidth >= 500 && this.popupHeight >= 500
},
bg() {
if (this.backgroundColor === '' || this.backgroundColor === 'none') {
return 'transparent'
}
return this.backgroundColor
}
},
mounted() {
const fixSize = () => {
const { windowWidth, windowHeight, windowTop, safeAreaInsets } = uni.getSystemInfoSync()
this.popupWidth = windowWidth
this.popupHeight = windowHeight + windowTop
// 是否适配底部安全区
if(this.safeArea){
this.safeAreaInsets = safeAreaInsets
}else{
this.safeAreaInsets = 0
}
}
fixSize()
// #ifdef H5
window.addEventListener('resize', fixSize)
this.$once('hook:beforeDestroy', () => {
window.removeEventListener('resize', fixSize)
})
// #endif
},
created() {
this.mkclick = this.maskClick
if (this.animation) {
this.duration = 300
} else {
this.duration = 0
}
// TODO 处理 message 组件生命周期异常的问题
this.messageChild = null
// TODO 解决头条冒泡的问题
this.clearPropagation = false
},
methods: {
/**
* 公用方法,不显示遮罩层
*/
closeMask() {
this.maskShow = false
},
/**
* 公用方法,遮罩层禁止点击
*/
disableMask() {
this.mkclick = false
},
// TODO nvue 取消冒泡
clear(e) {
// #ifndef APP-NVUE
e.stopPropagation()
// #endif
this.clearPropagation = true
},
open(direction) {
let innerType = ['top', 'center', 'bottom', 'left', 'right', 'message', 'dialog', 'share']
if (!(direction && innerType.indexOf(direction) !== -1)) {
direction = this.type
}
if (!this.config[direction]) {
console.error('缺少类型:', direction)
return
}
this[this.config[direction]]()
this.$emit('change', {
show: true,
type: direction
})
},
close(type) {
this.showTrans = false
this.$emit('change', {
show: false,
type: this.type
})
clearTimeout(this.timer)
// // 自定义关闭事件
// this.customOpen && this.customClose()
this.timer = setTimeout(() => {
this.showPopup = false
}, 300)
},
// TODO 处理冒泡事件,头条的冒泡事件有问题 ,先这样兼容
touchstart(){
this.clearPropagation = false
},
onTap() {
if(this.clearPropagation) return
if (!this.mkclick) return
this.close()
},
/**
* 顶部弹出样式处理
*/
top(type) {
this.popupstyle = this.isDesktop ? 'fixforpc-top' : 'top'
this.ani = ['slide-top']
this.transClass = {
position: 'fixed',
left: 0,
right: 0,
backgroundColor: this.bg
}
// TODO 兼容 type 属性 ,后续会废弃
if (type) return
this.showPopup = true
this.showTrans = true
this.$nextTick(() => {
if (this.messageChild && this.type === 'message') {
this.messageChild.timerClose()
}
})
},
/**
* 底部弹出样式处理
*/
bottom(type) {
this.popupstyle = 'bottom'
this.ani = ['slide-bottom']
this.transClass = {
position: 'fixed',
left: 0,
right: 0,
bottom: 0,
paddingBottom: (this.safeAreaInsets && this.safeAreaInsets.bottom) || 0,
backgroundColor: this.bg
}
// TODO 兼容 type 属性 ,后续会废弃
if (type) return
this.showPopup = true
this.showTrans = true
},
/**
* 中间弹出样式处理
*/
center(type) {
this.popupstyle = 'center'
this.ani = ['zoom-out', 'fade']
this.transClass = {
position: 'fixed',
/* #ifndef APP-NVUE */
display: 'flex',
flexDirection: 'column',
/* #endif */
bottom: 0,
left: 0,
right: 0,
top: 0,
justifyContent: 'center',
alignItems: 'center'
}
// TODO 兼容 type 属性 ,后续会废弃
if (type) return
this.showPopup = true
this.showTrans = true
},
left(type) {
this.popupstyle = 'left'
this.ani = ['slide-left']
this.transClass = {
position: 'fixed',
left: 0,
bottom: 0,
top: 0,
backgroundColor: this.bg,
/* #ifndef APP-NVUE */
display: 'flex',
flexDirection: 'column'
/* #endif */
}
// TODO 兼容 type 属性 ,后续会废弃
if (type) return
this.showPopup = true
this.showTrans = true
},
right(type) {
this.popupstyle = 'right'
this.ani = ['slide-right']
this.transClass = {
position: 'fixed',
bottom: 0,
right: 0,
top: 0,
backgroundColor: this.bg,
/* #ifndef APP-NVUE */
display: 'flex',
flexDirection: 'column'
/* #endif */
}
// TODO 兼容 type 属性 ,后续会废弃
if (type) return
this.showPopup = true
this.showTrans = true
}
}
}
</script>
<style lang="scss" scoped>
.uni-popup {
position: fixed;
/* #ifndef APP-NVUE */
z-index: 99;
/* #endif */
&.top,
&.left,
&.right {
/* #ifdef H5 */
top: var(--window-top);
/* #endif */
/* #ifndef H5 */
top: 0;
/* #endif */
}
.uni-popup__wrapper {
/* #ifndef APP-NVUE */
display: block;
/* #endif */
position: relative;
/* iphonex 等安全区设置,底部安全区适配 */
/* #ifndef APP-NVUE */
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
/* #endif */
&.left,
&.right {
/* #ifdef H5 */
padding-top: var(--window-top);
/* #endif */
/* #ifndef H5 */
padding-top: 0;
/* #endif */
flex: 1;
}
}
}
.fixforpc-z-index {
/* #ifndef APP-NVUE */
z-index: 999;
/* #endif */
}
.fixforpc-top {
top: 0;
}
</style>
{
"id": "uni-popup",
"displayName": "uni-popup 弹出层",
"version": "1.4.2",
"description": " Popup 组件,提供常用的弹层",
"keywords": [
"uni-ui",
"uniui",
"弹出层"
],
"repository": "https://github.com/dcloudio/uni-ui",
"engines": {
"HBuilderX": ""
},
"directories": {
"example": "../../temps/example_temps"
},
"dcloudext": {
"category": [
"前端组件",
"通用组件"
],
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
},
"uni_modules": {
"dependencies": [
"uni-transition"
],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"App": {
"app-vue": "y",
"app-nvue": "y"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "y",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "y",
"阿里": "y",
"百度": "y",
"字节跳动": "y",
"QQ": "y"
},
"快应用": {
"华为": "u",
"联盟": "u"
}
}
}
}
}
\ No newline at end of file
## Popup 弹出层
> **组件名:uni-popup**
> 代码块: `uPopup`
> 关联组件:`uni-popup-dialog`,`uni-popup-message`,`uni-popup-share`,`uni-transition`
弹出层组件,在应用中弹出一个消息提示窗口、提示框等
> **注意事项**
> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。
> - 组件需要依赖 `sass` 插件 ,请自行手动安装
> - `uni-popup-message` 、 `uni-popup-dialog` 等扩展ui组件,需要和 `uni-popup` 配套使用,暂不支持单独使用
> - `nvue` 中使用 `uni-popup` 时,尽量将组件置于其他元素后面,避免出现层级问题
> - `uni-popup` 并不能完全阻止页面滚动,可在打开 `uni-popup` 的时候手动去做一些处理,禁止页面滚动
> - 如果想在页面渲染完毕后就打开 `uni-popup` ,请在 `onReady` 或 `mounted` 生命周期内调用,确保组件渲染完毕
> - 在微信小程序开发者工具中,启用真机调试,popup 会延时出现,是因为 setTimeout 在真机调试中的延时问题导致的,预览和发布小程序不会出现此问题
> - 使用 `npm` 方式引入组件,如果确认引用正确,但是提示未注册组件或显示不正常,请尝试重新编译项目
> - `uni-popup` 中尽量不要使用 `scroll-view` 嵌套过多的内容,可能会影响组件的性能,导致组件无法打开或者打开卡顿
> - `uni-popup` 不会覆盖原生 tabbar 和原生导航栏
> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
### 安装方式
本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`
如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
### 基本用法
**示例**
```html
<button @click="open">打开弹窗</button>
<uni-popup ref="popup" type="bottom">底部弹出 Popup</uni-popup>
```
```javascript
export default {
methods:{
open(){
// 通过组件定义的ref调用uni-popup方法 ,如果传入参数 ,type 属性将失效 ,仅支持 ['top','left','bottom','right','center']
this.$refs.popup.open('top')
}
}
}
```
### 设置主窗口背景色
在大多数场景下,并不需要设置 `background-color` 属性,因为`uni-popup`的主窗口默认是透明的,在向里面插入内容的时候 ,样式完全交由用户定制,如果设置了背景色 ,例如 `uni-popup-dialog` 中的圆角就很难去实现,不设置背景色,更适合用户去自由发挥。
而也有特例,需要我们主动去设置背景色,例如 `type = 'bottom'` 的时候 ,在异型屏中遇到了底部安全区问题(如 iphone 11),因为 `uni-popup`的主要内容避开了安全区(设置`safe-area:true`),导致底部的颜色我们无法自定义,这时候使用 `background-color` 就可以解决这个问题。
**示例**
```html
<button @click="open">打开弹窗</button>
<uni-popup ref="popup" type="bottom" background-color="#fff">底部弹出 Popup</uni-popup>
```
### 禁用打开动画
在某些场景 ,可能不希望弹层有动画效果 ,只需要将 `animation` 属性设置为 `false` 即可以关闭动画。
**示例**
```html
<button @click="open">打开弹窗</button>
<uni-popup ref="popup" type="center" :animation="false">中间弹出 Popup</uni-popup>
```
### 禁用点击遮罩关闭
默认情况下,点击遮罩会自动关闭`uni-popup`,如不想点击关闭,只需将`mask-click`设置为`false`,这时候要关闭`uni-popup`,只能手动调用 `close` 方法。
**示例**
```html
<button @click="open">打开弹窗</button>
<uni-popup ref="popup" :mask-click="false">
<text>Popup</text>
<button @click="close">关闭</button>
</uni-popup>
```
```javascript
export default {
data() {
return {}
},
onReady() {},
methods: {
open() {
this.$refs.popup.open('top')
},
close() {
this.$refs.popup.close()
}
}
}
```
## API
### Popup Props
|属性名|类型|默认值|说明|
|:-:|:-:|:-:|:-:|
|animation|Boolean|true|是否开启动画|
|type|String|'center'|弹出方式|
|mask-click|Boolean|true|蒙版点击是否关闭弹窗|
|background-color|String|'none'|主窗口背景色|
|safe-area|Boolean|true|是否适配底部安全区|
#### Type Options
|属性名|说明|
|:-:| :-:|
|top|顶部弹出 |
|center|居中弹出|
|bottom|底部弹出|
|left|左侧弹出|
|right|右侧弹出|
|message|预置样式 :消息提示|
|dialog|预置样式 :对话框|
|share|预置样式 :底部弹出分享示例 |
### Popup Methods
|方法称名 |说明|参数|
|:-:|:-:|:-:|
|open|打开弹出层|open(String:type) ,如果参数可代替 type 属性|
|close|关闭弹出层 |-|
### Popup Events
|事件称名|说明|返回值|
|:-:|:-:|:-:|
|change|组件状态发生变化触发|e={show: true|false,type:当前模式}|
## 扩展组件说明
`uni-popup` 其实并没有任何样式,只提供基础的动画效果,给用户一个弹出层解决方案,仅仅是这样并不能满足开发需求,所以我们提供了三种基础扩展样式
### uni-popup-message 提示信息
`uni-popup``type`属性改为 `message`,并引入对应组件即可使用消息提示 ,*该组件不支持单独使用*
**示例**
```html
<uni-popup ref="popup" type="message">
<uni-popup-message type="success" message="成功消息" :duration="2000"></uni-popup-message>
</uni-popup>
```
### PopupMessage Props
|属性名|类型|默认值|说明|
|:-:|:-:|:-:|:-:|
|type|String|success|消息提示主题|
|message|String|-|消息提示文字|
|duration|Number|3000|消息显示时间,超过显示时间组件自动关闭,设置为0 将不会关闭,需手动调用 close 方法关闭|
#### Type Options
|属性名|说明|
|:-:| :-:|
|success|成功 |
|warn|警告|
|error|失败|
|info|消息|
### PopupMessage Slots
|名称|说明|
|:-:|:-:|
|default|消息内容,会覆盖 message 属性|
### uni-popup-dialog 对话框
`uni-popup``type`属性改为 `dialog`,并引入对应组件即可使用对话框 ,*该组件不支持单独使用*
**示例**
```html
<button @click="open">打开弹窗</button>
<uni-popup ref="popup" type="dialog">
<uni-popup-dialog mode="input" message="成功消息" :duration="2000" :before-close="true" @close="close" @confirm="confirm"></uni-popup-dialog>
</uni-popup>
```
```javascript
export default {
methods: {
open() {
this.$refs.popup.open()
},
/**
* 点击取消按钮触发
* @param {Object} done
*/
close() {
// TODO 做一些其他的事情,before-close 为true的情况下,手动执行 close 才会关闭对话框
// ...
this.$refs.popup.close()
},
/**
* 点击确认按钮触发
* @param {Object} done
* @param {Object} value
*/
confirm(value) {
// 输入框的值
console.log(value)
// TODO 做一些其他的事情,手动执行 close 才会关闭对话框
// ...
this.$refs.popup.close()
}
}
}
```
### PopupDialog Props
|属性名|类型|默认值|说明|
|:-:|:-:|:-:|:-:|
|type|String|success|对话框标题主题,可选值: success/warn/info/error|
|mode|String|base| 对话框模式,可选值:base(提示对话框)/input(可输入对话框)|
|title|String|-|对话框标题|
|content|String|-|对话框内容,base模式下生效|
|value| String\Number|-|输入框默认值,input模式下生效|
|placeholder|String|-|输入框提示文字,input模式下生效|
|before-close|Boolean|false | 是否拦截按钮事件,如为true,则不会关闭对话框,关闭需要手动执行 uni-popup 的 close 方法|
#### PopupDialog Events
|事件称名 |说明|返回值|
|:-:|:-:|:-:|
|close|点击dialog取消按钮触发|-|
|confirm|点击dialog确定按钮触发|e={value:input模式下输入框的值}|
### PopupDialog Slots
|名称|说明|
|:-:|:-:|
|default|自定义内容,回覆盖原有的内容显示|
### uni-popup-share 分享示例
分享示例,不作为最终可使用的组件,只做为样式组件,供用户自行修改,`后续的开发计划是实现实际的分享逻辑,参数可配置`
`uni-popup``type` 属性改为 `share`,并引入对应组件即可使用 ,*该组件不支持单独使用*
**示例**
```html
<uni-popup ref="popup" type="share">
<uni-popup-share title="分享到" @select="select"></uni-popup-share>
</uni-popup>
```
### PopupShare Props
|属性名|类型|默认值|说明|
|:-:|:-:|:-:| :-: |
|title|String|-|分享弹窗标题|
|before-close|Boolean|false | 是否拦截按钮事件,如为true,则不会关闭对话框,关闭需要手动执行 uni-popup 的 close 方法|
### PopupShare Events
|事件称名|说明|返回值|
|:-:|:-:|:-:|
|select|选择触发|e = {item,index}:所选参数|
**Tips**
- share 分享组件,只是作为一个扩展示例,如果需要修改数据源,请到组件内修改
## 帮助
在使用中如遇到无法解决的问题,请提 [Issues](https://github.com/dcloudio/uni-ui/issues) 给我们。
## 组件示例
点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/popup/popup](https://hellouniapp.dcloud.net.cn/pages/extUI/popup/popup)
\ No newline at end of file
## 1.1.1(2021-05-12)
- 新增 示例地址
- 修复 示例项目缺少组件的Bug
## 1.1.0(2021-04-22)
- 新增 通过方法自定义动画
- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式
- 优化 动画触发逻辑,使动画更流畅
- 优化 支持单独的动画类型
- 优化 文档示例
## 1.0.2(2021-02-05)
- 调整为uni_modules目录规范
// const defaultOption = {
// duration: 300,
// timingFunction: 'linear',
// delay: 0,
// transformOrigin: '50% 50% 0'
// }
// #ifdef APP-NVUE
const nvueAnimation = uni.requireNativePlugin('animation')
// #endif
class MPAnimation {
constructor(options, _this) {
this.options = options
this.animation = uni.createAnimation(options)
this.currentStepAnimates = {}
this.next = 0
this.$ = _this
}
_nvuePushAnimates(type, args) {
let aniObj = this.currentStepAnimates[this.next]
let styles = {}
if (!aniObj) {
styles = {
styles: {},
config: {}
}
} else {
styles = aniObj
}
if (animateTypes1.includes(type)) {
if (!styles.styles.transform) {
styles.styles.transform = ''
}
let unit = ''
if(type === 'rotate'){
unit = 'deg'
}
styles.styles.transform += `${type}(${args+unit}) `
} else {
styles.styles[type] = `${args}`
}
this.currentStepAnimates[this.next] = styles
}
_animateRun(styles = {}, config = {}) {
let ref = this.$.$refs['ani'].ref
if (!ref) return
return new Promise((resolve, reject) => {
nvueAnimation.transition(ref, {
styles,
...config
}, res => {
resolve()
})
})
}
_nvueNextAnimate(animates, step = 0, fn) {
let obj = animates[step]
if (obj) {
let {
styles,
config
} = obj
this._animateRun(styles, config).then(() => {
step += 1
this._nvueNextAnimate(animates, step, fn)
})
} else {
this.currentStepAnimates = {}
typeof fn === 'function' && fn()
this.isEnd = true
}
}
step(config = {}) {
// #ifndef APP-NVUE
this.animation.step(config)
// #endif
// #ifdef APP-NVUE
this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
this.next++
// #endif
return this
}
run(fn) {
// #ifndef APP-NVUE
this.$.animationData = this.animation.export()
this.$.timer = setTimeout(() => {
typeof fn === 'function' && fn()
}, this.$.durationTime)
// #endif
// #ifdef APP-NVUE
this.isEnd = false
let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref
if(!ref) return
this._nvueNextAnimate(this.currentStepAnimates, 0, fn)
this.next = 0
// #endif
}
}
const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
'translateZ'
]
const animateTypes2 = ['opacity', 'backgroundColor']
const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom']
animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
MPAnimation.prototype[type] = function(...args) {
// #ifndef APP-NVUE
this.animation[type](...args)
// #endif
// #ifdef APP-NVUE
this._nvuePushAnimates(type, args)
// #endif
return this
}
})
export function createAnimation(option, _this) {
if(!_this) return
clearTimeout(_this.timer)
return new MPAnimation(option, _this)
}
<template>
<view v-if="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
</template>
<script>
import { createAnimation } from './createAnimation'
/**
* Transition 过渡动画
* @description 简单过渡动画组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=985
* @property {Boolean} show = [false|true] 控制组件显示或隐藏
* @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
* @value fade 渐隐渐出过渡
* @value slide-top 由上至下过渡
* @value slide-right 由右至左过渡
* @value slide-bottom 由下至上过渡
* @value slide-left 由左至右过渡
* @value zoom-in 由小到大过渡
* @value zoom-out 由大到小过渡
* @property {Number} duration 过渡动画持续时间
* @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
*/
export default {
name: 'uniTransition',
props: {
show: {
type: Boolean,
default: false
},
modeClass: {
type: [Array, String],
default() {
return 'fade'
}
},
duration: {
type: Number,
default: 300
},
styles: {
type: Object,
default() {
return {}
}
},
customClass:{
type: String,
default: ''
}
},
data() {
return {
isShow: false,
transform: '',
opacity: 1,
animationData: {},
durationTime: 300,
config: {}
}
},
watch: {
show: {
handler(newVal) {
if (newVal) {
this.open()
} else {
// 避免上来就执行 close,导致动画错乱
if (this.isShow) {
this.close()
}
}
},
immediate: true
}
},
computed: {
// 生成样式数据
stylesObject() {
let styles = {
...this.styles,
'transition-duration': this.duration / 1000 + 's'
}
let transform = ''
for (let i in styles) {
let line = this.toLine(i)
transform += line + ':' + styles[i] + ';'
}
return transform
},
// 初始化动画条件
transformStyles() {
return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject
}
},
created() {
// 动画默认配置
this.config = {
duration: this.duration,
timingFunction: 'ease',
transformOrigin: '50% 50%',
delay: 0
}
this.durationTime = this.duration
},
methods: {
/**
* ref 触发 初始化动画
*/
init(obj = {}) {
if (obj.duration) {
this.durationTime = obj.duration
}
this.animation = createAnimation(Object.assign(this.config, obj))
},
/**
* 点击组件触发回调
*/
onClick() {
this.$emit('click', {
detail: this.isShow
})
},
/**
* ref 触发 动画分组
* @param {Object} obj
*/
step(obj, config = {}) {
if (!this.animation) return
for (let i in obj) {
try {
if(typeof obj[i] === 'object'){
this.animation[i](...obj[i])
}else{
this.animation[i](obj[i])
}
} catch (e) {
console.error(`方法 ${i} 不存在`)
}
}
this.animation.step(config)
return this
},
/**
* ref 触发 执行动画
*/
run(fn) {
if (!this.animation) return
this.animation.run(fn)
},
// 开始过度动画
open() {
clearTimeout(this.timer)
this.transform = ''
this.isShow = true
let { opacity, transform } = this.styleInit(false)
if (typeof opacity !== 'undefined') {
this.opacity = opacity
}
this.transform = transform
// 确保动态样式已经生效后,执行动画,如果不加 nextTick ,会导致 wx 动画执行异常
this.$nextTick(() => {
// TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器
this.timer = setTimeout(() => {
this.animation = createAnimation(this.config, this)
this.tranfromInit(false).step()
this.animation.run()
this.$emit('change', {
detail: this.isShow
})
}, 20)
})
},
// 关闭过度动画
close(type) {
if (!this.animation) return
this.tranfromInit(true)
.step()
.run(() => {
this.isShow = false
this.animationData = null
this.animation = null
let { opacity, transform } = this.styleInit(false)
this.opacity = opacity || 1
this.transform = transform
this.$emit('change', {
detail: this.isShow
})
})
},
// 处理动画开始前的默认样式
styleInit(type) {
let styles = {
transform: ''
}
let buildStyle = (type, mode) => {
if (mode === 'fade') {
styles.opacity = this.animationType(type)[mode]
} else {
styles.transform += this.animationType(type)[mode] + ' '
}
}
if (typeof this.modeClass === 'string') {
buildStyle(type, this.modeClass)
} else {
this.modeClass.forEach(mode => {
buildStyle(type, mode)
})
}
return styles
},
// 处理内置组合动画
tranfromInit(type) {
let buildTranfrom = (type, mode) => {
let aniNum = null
if (mode === 'fade') {
aniNum = type ? 0 : 1
} else {
aniNum = type ? '-100%' : '0'
if (mode === 'zoom-in') {
aniNum = type ? 0.8 : 1
}
if (mode === 'zoom-out') {
aniNum = type ? 1.2 : 1
}
if (mode === 'slide-right') {
aniNum = type ? '100%' : '0'
}
if (mode === 'slide-bottom') {
aniNum = type ? '100%' : '0'
}
}
this.animation[this.animationMode()[mode]](aniNum)
}
if (typeof this.modeClass === 'string') {
buildTranfrom(type, this.modeClass)
} else {
this.modeClass.forEach(mode => {
buildTranfrom(type, mode)
})
}
return this.animation
},
animationType(type) {
return {
fade: type ? 1 : 0,
'slide-top': `translateY(${type ? '0' : '-100%'})`,
'slide-right': `translateX(${type ? '0' : '100%'})`,
'slide-bottom': `translateY(${type ? '0' : '100%'})`,
'slide-left': `translateX(${type ? '0' : '-100%'})`,
'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`,
'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})`
}
},
// 内置动画类型与实际动画对应字典
animationMode() {
return {
fade: 'opacity',
'slide-top': 'translateY',
'slide-right': 'translateX',
'slide-bottom': 'translateY',
'slide-left': 'translateX',
'zoom-in': 'scale',
'zoom-out': 'scale'
}
},
// 驼峰转中横线
toLine(name) {
return name.replace(/([A-Z])/g, '-$1').toLowerCase()
}
}
}
</script>
<style></style>
{
"id": "uni-transition",
"displayName": "uni-transition 过渡动画",
"version": "1.1.1",
"description": "元素的简单过渡动画",
"keywords": [
"uni-ui",
"uniui",
"动画",
"过渡",
"过渡动画"
],
"repository": "https://github.com/dcloudio/uni-ui",
"engines": {
"HBuilderX": ""
},
"directories": {
"example": "../../temps/example_temps"
},
"dcloudext": {
"category": [
"前端组件",
"通用组件"
],
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
},
"uni_modules": {
"dependencies": [],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"App": {
"app-vue": "y",
"app-nvue": "y"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "y",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "y",
"阿里": "y",
"百度": "y",
"字节跳动": "y",
"QQ": "y"
},
"快应用": {
"华为": "u",
"联盟": "u"
}
}
}
}
}
\ No newline at end of file
## Transition 过渡动画
> **组件名:uni-transition**
> 代码块: `uTransition`
元素过渡动画
> **注意事项**
> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。
> - 组件需要依赖 `sass` 插件 ,请自行手动安装
> - rotate 旋转动画不需要填写 deg 单位,在小程序上填写单位动画不会执行
> - NVUE 下修改宽高动画,不能定位到中心点
> - 百度小程序下修改宽高 ,可能会影响其他动画,需注意
> - nvue 不支持 costom-class , 请使用 styles
> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
### 安装方式
本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`
如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
### 基本用法
``template`` 中使用组件
```html
<template>
<view>
<button type="primary" @click="open">fade</button>
<uni-transition mode-class="fade" :styles="{'width':'100px','height':'100px','backgroundColor':'red'}" :show="show" @change="change" />
</view>
</template>
<script>
export default {
data() {
return {
show: false,
}
},
onLoad() {},
methods: {
open(mode) {
this.show = !this.show
},
change() {
console.log('触发动画')
}
}
}
</script>
```
### 样式覆盖
**注意:`nvue` 不支持 `custom-class` 属性 ,需要使用 `styles` 属性进行兼容**
使用 `custom-class` 属性绑定样式,可以自定义 `uni-transition` 的样式
```html
<template>
<view class="content">
<uni-transition custom-class="custom-transition" mode-class="fade" :duration="0" :show="true" />
</view>
</template>
<style>
/* 常规样式覆盖 */
.content >>> .custom-transition {
width:100px;
height:100px;
background-color:red;
}
</style>
<style lang="scss">
/* 如果使用 scss 需要使用 /deep/ */
.content /deep/ .custom-transition {
width:100px;
height:100px;
background-color:red;
}
</style>
```
如果使用 `styles` 注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
```html
<template>
<view class="content">
<uni-transition :styles="styles" mode-class="fade" :duration="0" :show="true" />
</view>
</template>
<script>
export default {
data() {
return {
styles:{
'width':'100px',
'height':'100px',
'backgroundColor':'red'
}
}
}
}
</script>
```
### 自定义动画
当内置动画类型不能满足需求的时候 ,可以使用 `step()``run()` 自定义动画,入参以及具体用法参考下方属性说明
`init()` 方法可以覆盖默认配置
```html
<template>
<view>
<button type="primary" @click="run">执行动画</button>
<uni-transition ref="ani" :styles="{'width':'100px','height':'100px','backgroundColor':'red'}" :show="show" />
</view>
</template>
<script>
export default {
data() {
return {
show: true,
}
},
onReady() {
this.$refs.ani.init({
duration: 1000,
timingFunction: 'linear',
transformOrigin: '50% 50%',
delay: 500
})
},
methods: {
run() {
// 同时右平移到 100px,旋转 360 读
this.$refs.ani.step({
translateX: '100px',
rotate: '360'
})
// 上面的动画执行完成后,等待200毫秒平移到 0px,旋转到 0 读
this.$refs.ani.step({
translateX: '0px',
rotate: '0'
},
{
timingFunction: 'ease-in',
duration: 200
})
// 开始执行动画
this.$refs.ani.run(()=>{
console.log('动画支持完毕')
})
}
}
}
</script>
```
## API
### Transition Props
|属性名 |类型 |默认值 |说明 |
|:-: |:-: |:-: |:-:|
|show |Boolean|false |控制组件显示或隐藏 |
|mode-class |Array/String |- |内置过渡动画类型 |
|custom-class |String |- |自定义类名 |
|duration |Number |300 |过渡动画持续时间 |
|styles |Object |- |组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red` |
#### mode-class 内置过渡动画类型说明
**格式为**`'fade'` 或者 `['fade','slide-top']`
|属性名 |说明 |
|:-: |:-: |
|fade |渐隐渐出过渡 |
|slide-top |由上至下过渡 |
|slide-right |由右至左过渡 |
|slide-bottom |由下至上过渡 |
|slide-left |由左至右过渡 |
|zoom-in |由小到大过渡 |
|zoom-out |由大到小过渡 |
**注意**
组合使用时,同一种类型相反的过渡动画如(slide-top、slide-bottom)同时使用时,只有最后一个生效
### Transition Events
|事件名 |说明 |返回值 |
|:-: |:-: |:-: |
|click |点击组件触发 |- |
|change |过渡动画结束时触发 | e = {detail:true} |
### Transition Methons
|方法名|说明|参数|
|:-:|:-:|:-:|
|init()|手动初始化配置|Function(OBJECT:config)|
|step()|动画队列|Function(OBJECT:type,OBJECT:config)|
|run()|执行动画|Function(FUNCTION:callback) |
### init(OBJECT:config)
**通过 ref 调用方法**
手动设置动画配置,需要在页面渲染完毕后调用
```javascript
this.$refs.ani.init({
duration: 1000,
timingFunction:'ease',
delay:500,
transformOrigin:'left center'
})
```
### step(OBJECT:type,OBJECT:config) 动画队列
**通过 ref 调用方法**
调用 `step()` 来表示一组动画完成,`step` 第一个参数可以传入任意多个动画方法,一组动画中的所有动画会同时开始,一组动画完成后才会进行下一组动画。`step` 第二个参数可以传入一个跟 `uni.createAnimation()` 一样的配置参数用于指定当前组动画的配置。
Tips
- 第一个参数支持的动画参考下面的 `支持的动画`
- 第二个参数参考下面的 `动画配置`,可省略,如果省略继承`init`的配置
```javascript
this.$refs.ani.step({
translateX: '100px'
},{
duration: 1000,
timingFunction:'ease',
delay:500,
transformOrigin:'left center'
})
```
### run(FUNCTION:callback) 执行动画
**通过 ref 调用方法**
在执行 `step()` 后,需要调用 `run()` 来运行动画 ,否则动画会一直等待
`run()` 方法可以传入一个 `callback` 函数 ,会在所有动画执行完毕后回调
```javascript
this.$refs.ani.step({
translateX: '100px'
})
this.$refs.ani.run(()=>{
console.log('动画执行完毕')
})
```
### 动画配置
动画配置 , `init()``step()` 第二个参数配置相同 ,如果配置`step() `第二个参数,将会覆盖 `init()` 的配置
|属性名|值|必填|默认值|说明|平台差异|
|:-:|:-:|:-:|:-:|:-:|:-:|
|duration|Number|否|400|动画持续时间,单位ms|-|
|timingFunction|String|否|"linear"|定义动画的效果|-|
|delay|Number|否|0|动画延迟时间,单位 ms|-|
|needLayout|Boolean|否|false |动画执行是否影响布局|仅 nvue 支持|
|transformOrigin|String |否|"center center"|设置 [transform-origin](https://developer.mozilla.org/en-US/docs/Web/CSS/transform-origin)|-|
### timingFunction 属性说明
|值|说明|平台差异|
|:-:|:-:|:-:|
|linear|动画从头到尾的速度是相同的|-|
|ease|动画以低速开始,然后加快,在结束前变慢|-|
|ease-in| 动画以低速开始|-|
|ease-in-out| 动画以低速开始和结束|-|
|ease-out|动画以低速结束|-|
|step-start|动画第一帧就跳至结束状态直到结束|nvue不支持|
|step-end|动画一直保持开始状态,最后一帧跳到结束状态|nvue不支持|
```javascript
// init 配置
this.$refs.ani.init({
duration: 1000,
timingFunction:'ease',
delay:500,
transformOrigin:'left center'
})
// step 配置
this.$refs.ani.step({
translateX: '100px'
},{
duration: 1000,
timingFunction:'ease',
delay:500,
transformOrigin:'left center'
})
```
### 支持的动画
动画方法
如果同一个动画方法有多个值,多个值使用数组分隔
```javascript
this.$refs.ani.step({
width:'100px',
scale: [1.2,0.8],
})
```
**样式:**
|属性名|值|说明|平台差异|
|:-:|:-:|:-:|:-:|
|opacity|value|透明度,参数范围 0~1|-|
|backgroundColor|color|颜色值|-|
|width|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|-|
|height|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|-|
|top|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持|
|left|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持|
|bottom|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持|
|right|length|长度值,如果传入 Number 则默认使用 px,可传入其他自定义单位的长度值|nvue 不支持|
```javascript
this.$refs.ani.step({
opacity: 1,
backgroundColor: '#ff5a5f',
widht:'100px',
height:'50rpx',
})
```
**旋转:**
旋转属性的值不需要填写单位
|属性名|值|说明|平台差异 |
|:-:|:-:|:-:|:-:|
|rotate|deg|deg的范围-180~180,从原点顺时针旋转一个deg角度 |-|
|rotateX|deg|deg的范围-180~180,在X轴旋转一个deg角度 |-|
|rotateY|deg|deg的范围-180~180,在Y轴旋转一个deg角度 |-|
|rotateZ|deg|deg的范围-180~180,在Z轴旋转一个deg角度 |nvue不支持|
|rotate3d|x,y,z,deg| 同 [transform-function rotate3d](https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/rotate3d()) |nvue不支持|
```javascript
this.$refs.ani.step({
rotateX: 45,
rotateY: 45
})
```
**缩放:**
|属性名|值|说明|平台差异|
|:-:|:-:|:-: |:-:|
|scale|sx,[sy]|一个参数时,表示在X轴、Y轴同时缩放sx倍数;两个参数时表示在X轴缩放sx倍数,在Y轴缩放sy倍数|-|
|scaleX|sx|在X轴缩放sx倍数|-|
|scaleY|sy|在Y轴缩放sy倍数|-|
|scaleZ|sz|在Z轴缩放sy倍数|nvue不支持|
|scale3d|sx,sy,sz|在X轴缩放sx倍数,在Y轴缩放sy倍数,在Z轴缩放sz倍数|nvue不支持|
```javascript
this.$refs.ani.step({
scale: [1.2,0.8]
})
```
**偏移:**
|属性名|值|说明|平台差异|
|:-:|:-:|:-:|:-:|
|translate|tx,[ty]|一个参数时,表示在X轴偏移tx,单位px;两个参数时,表示在X轴偏移tx,在Y轴偏移ty,单位px。|-|
|translateX|tx| 在X轴偏移tx,单位px|-|
|translateY|ty| 在Y轴偏移tx,单位px|-|
|translateZ|tz| 在Z轴偏移tx,单位px|nvue不支持|
|translate3d|tx,ty,tz| 在X轴偏移tx,在Y轴偏移ty,在Z轴偏移tz,单位px|nvue不支持|
```javascript
this.$refs.ani.step({
translateX: '100px'
})
```
## 组件示例
点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/transition/transition](https://hellouniapp.dcloud.net.cn/pages/extUI/transition/transition)
\ No newline at end of file
import { VantComponent } from '../common/component';
import { button } from '../mixins/button';
import { openType } from '../mixins/open-type';
VantComponent({
mixins: [button, openType],
classes: ['hover-class', 'loading-class'],
data: {
style: ''
},
props: {
icon: String,
plain: Boolean,
block: Boolean,
round: Boolean,
square: Boolean,
loading: Boolean,
hairline: Boolean,
disabled: Boolean,
loadingText: String,
customStyle: String,
loadingType: {
type: String,
value: 'circular'
},
type: {
type: String,
value: 'default'
},
size: {
type: String,
value: 'normal'
},
loadingSize: {
type: String,
value: '20px'
},
color: {
type: String,
observer(color) {
let style = '';
if (color) {
style += `color: ${this.data.plain ? color : 'white'};`;
if (!this.data.plain) {
// Use background instead of backgroundColor to make linear-gradient work
style += `background: ${color};`;
}
// hide border when color is linear-gradient
if (color.indexOf('gradient') !== -1) {
style += 'border: 0;';
}
else {
style += `border-color: ${color};`;
}
}
if (style !== this.data.style) {
this.setData({ style });
}
}
}
},
methods: {
onClick() {
if (!this.data.disabled && !this.data.loading) {
this.$emit('click');
}
}
}
});
{
"component": true,
"usingComponents": {
"van-icon": "../icon/index",
"van-loading": "../loading/index"
}
}
<template>
<uni-shadow-root class="vant-button-index"><button :id="id" :class="'custom-class '+(utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]))+' '+(hairline ? 'van-hairline--surround' : '')" hover-class="van-button--active hover-class" :lang="lang" :style="(style)+' '+(customStyle)" :open-type="openType" :business-id="businessId" :session-from="sessionFrom" :send-message-title="sendMessageTitle" :send-message-path="sendMessagePath" :send-message-img="sendMessageImg" :show-message-card="showMessageCard" :app-parameter="appParameter" :aria-label="ariaLabel" @click="onClick" @getuserinfo="bindGetUserInfo" @contact="bindContact" @getphonenumber="bindGetPhoneNumber" @error="bindError" @launchapp="bindLaunchApp" @opensetting="bindOpenSetting">
<block v-if="loading">
<van-loading custom-class="loading-class" :size="loadingSize" :type="loadingType" :color="type === 'default' ? '#c9c9c9' : 'white'"></van-loading>
<view v-if="loadingText" class="van-button__loading-text">
{{ loadingText }}
</view>
</block>
<block v-else>
<van-icon v-if="icon" size="1.2em" :name="icon" class="van-button__icon" custom-style="line-height: inherit;"></van-icon>
<view class="van-button__text">
<slot></slot>
</view>
</block>
</button></uni-shadow-root>
</template>
<wxs src="../wxs/utils.wxs" module="utils"></wxs>
<script>
import VanIcon from '../icon/index.vue'
import VanLoading from '../loading/index.vue'
global['__wxVueOptions'] = {components:{'van-icon': VanIcon,'van-loading': VanLoading}}
global['__wxRoute'] = 'vant/button/index'
import { VantComponent } from '../common/component';
import { button } from '../mixins/button';
import { openType } from '../mixins/open-type';
VantComponent({
mixins: [button, openType],
classes: ['hover-class', 'loading-class'],
data: {
style: ''
},
props: {
icon: String,
plain: Boolean,
block: Boolean,
round: Boolean,
square: Boolean,
loading: Boolean,
hairline: Boolean,
disabled: Boolean,
loadingText: String,
customStyle: String,
loadingType: {
type: String,
value: 'circular'
},
type: {
type: String,
value: 'default'
},
size: {
type: String,
value: 'normal'
},
loadingSize: {
type: String,
value: '20px'
},
color: {
type: String,
observer(color) {
let style = '';
if (color) {
style += `color: ${this.data.plain ? color : 'white'};`;
if (!this.data.plain) {
// Use background instead of backgroundColor to make linear-gradient work
style += `background: ${color};`;
}
// hide border when color is linear-gradient
if (color.indexOf('gradient') !== -1) {
style += 'border: 0;';
}
else {
style += `border-color: ${color};`;
}
}
if (style !== this.data.style) {
this.setData({ style });
}
}
}
},
methods: {
onClick() {
if (!this.data.disabled && !this.data.loading) {
this.$emit('click');
}
}
}
});
export default global['__wxComponents']['vant/button/index']
</script>
<style platform="mp-weixin">
@import '../common/index.css';.van-button{position:relative;display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;padding:0;line-height:20px;text-align:center;vertical-align:middle;-webkit-appearance:none;-webkit-text-size-adjust:100%;height:44px;height:var(--button-default-height,44px);font-size:16px;font-size:var(--button-default-font-size,16px);transition:opacity .2s;transition:opacity var(--animation-duration-fast,.2s);border-radius:2px;border-radius:var(--button-border-radius,2px)}.van-button:before{position:absolute;top:50%;left:50%;width:100%;height:100%;border:inherit;border-radius:inherit;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;content:" ";background-color:#000;background-color:var(--black,#000);border-color:#000;border-color:var(--black,#000)}.van-button:after{border-width:0}.van-button--active:before{opacity:.15}.van-button--unclickable:after{display:none}.van-button--default{color:#323233;color:var(--button-default-color,#323233);background-color:#fff;background-color:var(--button-default-background-color,#fff);border:1px solid #ebedf0;border:1px solid var(--button-default-border-color,#ebedf0)}.van-button--primary{color:#fff;color:var(--button-primary-color,#fff);background-color:#07c160;background-color:var(--button-primary-background-color,#07c160);border:1px solid #07c160;border:1px solid var(--button-primary-border-color,#07c160)}.van-button--info{color:#fff;color:var(--button-info-color,#fff);background-color:#1989fa;background-color:var(--button-info-background-color,#1989fa);border:1px solid #1989fa;border:1px solid var(--button-info-border-color,#1989fa)}.van-button--danger{color:#fff;color:var(--button-danger-color,#fff);background-color:#ee0a24;background-color:var(--button-danger-background-color,#ee0a24);border:1px solid #ee0a24;border:1px solid var(--button-danger-border-color,#ee0a24)}.van-button--warning{color:#fff;color:var(--button-warning-color,#fff);background-color:#ff976a;background-color:var(--button-warning-background-color,#ff976a);border:1px solid #ff976a;border:1px solid var(--button-warning-border-color,#ff976a)}.van-button--plain{background-color:#fff;background-color:var(--button-plain-background-color,#fff)}.van-button--plain.van-button--primary{color:#07c160;color:var(--button-primary-background-color,#07c160)}.van-button--plain.van-button--info{color:#1989fa;color:var(--button-info-background-color,#1989fa)}.van-button--plain.van-button--danger{color:#ee0a24;color:var(--button-danger-background-color,#ee0a24)}.van-button--plain.van-button--warning{color:#ff976a;color:var(--button-warning-background-color,#ff976a)}.van-button--large{width:100%;height:50px;height:var(--button-large-height,50px)}.van-button--normal{padding:0 15px;font-size:14px;font-size:var(--button-normal-font-size,14px)}.van-button--small{min-width:60px;min-width:var(--button-small-min-width,60px);height:30px;height:var(--button-small-height,30px);padding:0 8px;padding:0 var(--padding-xs,8px);font-size:12px;font-size:var(--button-small-font-size,12px)}.van-button--mini{display:inline-block;min-width:50px;min-width:var(--button-mini-min-width,50px);height:22px;height:var(--button-mini-height,22px);font-size:10px;font-size:var(--button-mini-font-size,10px)}.van-button--mini+.van-button--mini{margin-left:5px}.van-button--block{display:-webkit-flex;display:flex;width:100%}.van-button--round{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--square{border-radius:0}.van-button--disabled{opacity:.5;opacity:var(--button-disabled-opacity,.5)}.van-button__text{display:inline}.van-button__icon+.van-button__text:not(:empty),.van-button__loading-text{margin-left:4px}.van-button__icon{min-width:1em;line-height:inherit!important;vertical-align:top}.van-button--hairline{padding-top:1px;border-width:0}.van-button--hairline:after{border-color:inherit;border-width:1px;border-radius:4px;border-radius:calc(var(--button-border-radius, 2px)*2)}.van-button--hairline.van-button--round:after{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--hairline.van-button--square:after{border-radius:0}
</style>
\ No newline at end of file
<wxs src="../wxs/utils.wxs" module="utils" />
<button
id="{{ id }}"
class="custom-class {{ utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]) }} {{ hairline ? 'van-hairline--surround' : '' }}"
hover-class="van-button--active hover-class"
lang="{{ lang }}"
style="{{ style }} {{ customStyle }}"
open-type="{{ openType }}"
business-id="{{ businessId }}"
session-from="{{ sessionFrom }}"
send-message-title="{{ sendMessageTitle }}"
send-message-path="{{ sendMessagePath }}"
send-message-img="{{ sendMessageImg }}"
show-message-card="{{ showMessageCard }}"
app-parameter="{{ appParameter }}"
aria-label="{{ ariaLabel }}"
bindtap="onClick"
bindgetuserinfo="bindGetUserInfo"
bindcontact="bindContact"
bindgetphonenumber="bindGetPhoneNumber"
binderror="bindError"
bindlaunchapp="bindLaunchApp"
bindopensetting="bindOpenSetting"
>
<block wx:if="{{ loading }}">
<van-loading
custom-class="loading-class"
size="{{ loadingSize }}"
type="{{ loadingType }}"
color="{{ type === 'default' ? '#c9c9c9' : 'white' }}"
/>
<view
wx:if="{{ loadingText }}"
class="van-button__loading-text"
>
{{ loadingText }}
</view>
</block>
<block wx:else>
<van-icon
wx:if="{{ icon }}"
size="1.2em"
name="{{ icon }}"
class="van-button__icon"
custom-style="line-height: inherit;"
/>
<view class="van-button__text">
<slot />
</view>
</block>
</button>
@import '../common/index.wxss';.van-button{position:relative;display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;padding:0;line-height:20px;text-align:center;vertical-align:middle;-webkit-appearance:none;-webkit-text-size-adjust:100%;height:44px;height:var(--button-default-height,44px);font-size:16px;font-size:var(--button-default-font-size,16px);transition:opacity .2s;transition:opacity var(--animation-duration-fast,.2s);border-radius:2px;border-radius:var(--button-border-radius,2px)}.van-button:before{position:absolute;top:50%;left:50%;width:100%;height:100%;border:inherit;border-radius:inherit;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;content:" ";background-color:#000;background-color:var(--black,#000);border-color:#000;border-color:var(--black,#000)}.van-button:after{border-width:0}.van-button--active:before{opacity:.15}.van-button--unclickable:after{display:none}.van-button--default{color:#323233;color:var(--button-default-color,#323233);background-color:#fff;background-color:var(--button-default-background-color,#fff);border:1px solid #ebedf0;border:1px solid var(--button-default-border-color,#ebedf0)}.van-button--primary{color:#fff;color:var(--button-primary-color,#fff);background-color:#07c160;background-color:var(--button-primary-background-color,#07c160);border:1px solid #07c160;border:1px solid var(--button-primary-border-color,#07c160)}.van-button--info{color:#fff;color:var(--button-info-color,#fff);background-color:#1989fa;background-color:var(--button-info-background-color,#1989fa);border:1px solid #1989fa;border:1px solid var(--button-info-border-color,#1989fa)}.van-button--danger{color:#fff;color:var(--button-danger-color,#fff);background-color:#ee0a24;background-color:var(--button-danger-background-color,#ee0a24);border:1px solid #ee0a24;border:1px solid var(--button-danger-border-color,#ee0a24)}.van-button--warning{color:#fff;color:var(--button-warning-color,#fff);background-color:#ff976a;background-color:var(--button-warning-background-color,#ff976a);border:1px solid #ff976a;border:1px solid var(--button-warning-border-color,#ff976a)}.van-button--plain{background-color:#fff;background-color:var(--button-plain-background-color,#fff)}.van-button--plain.van-button--primary{color:#07c160;color:var(--button-primary-background-color,#07c160)}.van-button--plain.van-button--info{color:#1989fa;color:var(--button-info-background-color,#1989fa)}.van-button--plain.van-button--danger{color:#ee0a24;color:var(--button-danger-background-color,#ee0a24)}.van-button--plain.van-button--warning{color:#ff976a;color:var(--button-warning-background-color,#ff976a)}.van-button--large{width:100%;height:50px;height:var(--button-large-height,50px)}.van-button--normal{padding:0 15px;font-size:14px;font-size:var(--button-normal-font-size,14px)}.van-button--small{min-width:60px;min-width:var(--button-small-min-width,60px);height:30px;height:var(--button-small-height,30px);padding:0 8px;padding:0 var(--padding-xs,8px);font-size:12px;font-size:var(--button-small-font-size,12px)}.van-button--mini{display:inline-block;min-width:50px;min-width:var(--button-mini-min-width,50px);height:22px;height:var(--button-mini-height,22px);font-size:10px;font-size:var(--button-mini-font-size,10px)}.van-button--mini+.van-button--mini{margin-left:5px}.van-button--block{display:-webkit-flex;display:flex;width:100%}.van-button--round{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--square{border-radius:0}.van-button--disabled{opacity:.5;opacity:var(--button-disabled-opacity,.5)}.van-button__text{display:inline}.van-button__icon+.van-button__text:not(:empty),.van-button__loading-text{margin-left:4px}.van-button__icon{min-width:1em;line-height:inherit!important;vertical-align:top}.van-button--hairline{padding-top:1px;border-width:0}.van-button--hairline:after{border-color:inherit;border-width:1px;border-radius:4px;border-radius:calc(var(--button-border-radius, 2px)*2)}.van-button--hairline.van-button--round:after{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--hairline.van-button--square:after{border-radius:0}
\ No newline at end of file
export declare const RED = "#ee0a24";
export declare const BLUE = "#1989fa";
export declare const WHITE = "#fff";
export declare const GREEN = "#07c160";
export declare const ORANGE = "#ff976a";
export declare const GRAY = "#323233";
export declare const GRAY_DARK = "#969799";
export const RED = '#ee0a24';
export const BLUE = '#1989fa';
export const WHITE = '#fff';
export const GREEN = '#07c160';
export const ORANGE = '#ff976a';
export const GRAY = '#323233';
export const GRAY_DARK = '#969799';
import { VantComponentOptions, CombinedComponentInstance } from '../definitions/index';
declare function VantComponent<Data, Props, Methods>(vantOptions?: VantComponentOptions<Data, Props, Methods, CombinedComponentInstance<Data, Props, Methods>>): void;
export { VantComponent };
import { basic } from '../mixins/basic';
import { observe } from '../mixins/observer/index';
function mapKeys(source, target, map) {
Object.keys(map).forEach(key => {
if (source[key]) {
target[map[key]] = source[key];
}
});
}
function VantComponent(vantOptions = {}) {
const options = {};
mapKeys(vantOptions, options, {
data: 'data',
props: 'properties',
mixins: 'behaviors',
methods: 'methods',
beforeCreate: 'created',
created: 'attached',
mounted: 'ready',
relations: 'relations',
destroyed: 'detached',
classes: 'externalClasses'
});
const { relation } = vantOptions;
if (relation) {
options.relations = Object.assign(options.relations || {}, {
[`../${relation.name}/index`]: relation
});
}
// add default externalClasses
options.externalClasses = options.externalClasses || [];
options.externalClasses.push('custom-class');
// add default behaviors
options.behaviors = options.behaviors || [];
options.behaviors.push(basic);
// map field to form-field behavior
if (vantOptions.field) {
options.behaviors.push('wx://form-field');
}
// add default options
options.options = {
multipleSlots: true,
addGlobalClass: true
};
observe(vantOptions, options);
Component(options);
}
export { VantComponent };
.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{display:table;clear:both;content:""}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}
\ No newline at end of file
.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{display:table;clear:both;content:""}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}
\ No newline at end of file
.van-clearfix:after{display:table;clear:both;content:""}
\ No newline at end of file
.van-clearfix:after{display:table;clear:both;content:""}
\ No newline at end of file
.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}
\ No newline at end of file
.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}
\ No newline at end of file
.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}
\ No newline at end of file
.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}
\ No newline at end of file
/// <reference types="miniprogram-api-typings" />
export declare function isDef(value: any): boolean;
export declare function isObj(x: any): boolean;
export declare function isNumber(value: any): boolean;
export declare function range(num: number, min: number, max: number): number;
export declare function nextTick(fn: Function): void;
export declare function getSystemInfoSync(): WechatMiniprogram.GetSystemInfoSuccessCallbackResult;
export declare function addUnit(value?: string | number): string | undefined;
export function isDef(value) {
return value !== undefined && value !== null;
}
export function isObj(x) {
const type = typeof x;
return x !== null && (type === 'object' || type === 'function');
}
export function isNumber(value) {
return /^\d+(\.\d+)?$/.test(value);
}
export function range(num, min, max) {
return Math.min(Math.max(num, min), max);
}
export function nextTick(fn) {
setTimeout(() => {
fn();
}, 1000 / 30);
}
let systemInfo = null;
export function getSystemInfoSync() {
if (systemInfo == null) {
systemInfo = wx.getSystemInfoSync();
}
return systemInfo;
}
export function addUnit(value) {
if (!isDef(value)) {
return undefined;
}
value = String(value);
return isNumber(value) ? `${value}px` : value;
}
import { VantComponent } from '../common/component';
import { addUnit } from '../common/utils';
VantComponent({
props: {
dot: Boolean,
info: null,
size: {
type: null,
observer: 'setSizeWithUnit'
},
color: String,
customStyle: String,
classPrefix: {
type: String,
value: 'van-icon'
},
name: {
type: String,
observer(val) {
this.setData({
isImageName: val.indexOf('/') !== -1
});
}
}
},
data: {
sizeWithUnit: null,
},
methods: {
onClick() {
this.$emit('click');
},
setSizeWithUnit(size) {
this.setData({
sizeWithUnit: addUnit(size)
});
}
}
});
{
"component": true,
"usingComponents": {
"van-info": "../info/index"
}
}
<template>
<uni-shadow-root class="vant-icon-index"><view :class="'custom-class '+(classPrefix)+' '+(isImageName ? 'van-icon--image' : classPrefix + '-' + name)" :style="(color ? 'color: ' + color + ';' : '')+(size ? 'font-size: ' + sizeWithUnit + ';' : '')+(customStyle)" @click="onClick">
<van-info v-if="info !== null || dot" :dot="dot" :info="info" custom-class="van-icon__info"></van-info>
<image v-if="isImageName" :src="name" mode="aspectFit" class="van-icon__image"></image>
</view></uni-shadow-root>
</template>
<script>
import VanInfo from '../info/index.vue'
global['__wxVueOptions'] = {components:{'van-info': VanInfo}}
global['__wxRoute'] = 'vant/icon/index'
import { VantComponent } from '../common/component';
import { addUnit } from '../common/utils';
VantComponent({
props: {
dot: Boolean,
info: null,
size: {
type: null,
observer: 'setSizeWithUnit'
},
color: String,
customStyle: String,
classPrefix: {
type: String,
value: 'van-icon'
},
name: {
type: String,
observer(val) {
this.setData({
isImageName: val.indexOf('/') !== -1
});
}
}
},
data: {
sizeWithUnit: null,
},
methods: {
onClick() {
this.$emit('click');
},
setSizeWithUnit(size) {
this.setData({
sizeWithUnit: addUnit(size)
});
}
}
});
export default global['__wxComponents']['vant/icon/index']
</script>
<style platform="mp-weixin">
@import '../common/index.css';
@font-face {
font-weight: 400;
font-family: vant-icon;
font-style: normal;
font-display: auto;
src: url(https://img.yzcdn.cn/vant/vant-icon-d3825a.woff2) format("woff2"), url(https://img.yzcdn.cn/vant/vant-icon-d3825a.woff) format("woff"), url(https://img.yzcdn.cn/vant/vant-icon-d3825a.ttf) format("truetype")
}
.van-icon {
position: relative;
font: normal normal normal 14px/1 vant-icon;
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased
}
.van-icon,
.van-icon:before {
display: inline-block
}
.van-icon-add-o:before {
content: "\F000"
}
.van-icon-add-square:before {
content: "\F001"
}
.van-icon-add:before {
content: "\F002"
}
.van-icon-after-sale:before {
content: "\F003"
}
.van-icon-aim:before {
content: "\F004"
}
.van-icon-alipay:before {
content: "\F005"
}
.van-icon-apps-o:before {
content: "\F006"
}
.van-icon-arrow-down:before {
content: "\F007"
}
.van-icon-arrow-left:before {
content: "\F008"
}
.van-icon-arrow-up:before {
content: "\F009"
}
.van-icon-arrow:before {
content: "\F00A"
}
.van-icon-ascending:before {
content: "\F00B"
}
.van-icon-audio:before {
content: "\F00C"
}
.van-icon-award-o:before {
content: "\F00D"
}
.van-icon-award:before {
content: "\F00E"
}
.van-icon-bag-o:before {
content: "\F00F"
}
.van-icon-bag:before {
content: "\F010"
}
.van-icon-balance-list-o:before {
content: "\F011"
}
.van-icon-balance-list:before {
content: "\F012"
}
.van-icon-balance-o:before {
content: "\F013"
}
.van-icon-balance-pay:before {
content: "\F014"
}
.van-icon-bar-chart-o:before {
content: "\F015"
}
.van-icon-bars:before {
content: "\F016"
}
.van-icon-bell:before {
content: "\F017"
}
.van-icon-bill-o:before {
content: "\F018"
}
.van-icon-bill:before {
content: "\F019"
}
.van-icon-birthday-cake-o:before {
content: "\F01A"
}
.van-icon-bookmark-o:before {
content: "\F01B"
}
.van-icon-bookmark:before {
content: "\F01C"
}
.van-icon-browsing-history-o:before {
content: "\F01D"
}
.van-icon-browsing-history:before {
content: "\F01E"
}
.van-icon-brush-o:before {
content: "\F01F"
}
.van-icon-bulb-o:before {
content: "\F020"
}
.van-icon-bullhorn-o:before {
content: "\F021"
}
.van-icon-calender-o:before {
content: "\F022"
}
.van-icon-card:before {
content: "\F023"
}
.van-icon-cart-circle-o:before {
content: "\F024"
}
.van-icon-cart-circle:before {
content: "\F025"
}
.van-icon-cart-o:before {
content: "\F026"
}
.van-icon-cart:before {
content: "\F027"
}
.van-icon-cash-back-record:before {
content: "\F028"
}
.van-icon-cash-on-deliver:before {
content: "\F029"
}
.van-icon-cashier-o:before {
content: "\F02A"
}
.van-icon-certificate:before {
content: "\F02B"
}
.van-icon-chart-trending-o:before {
content: "\F02C"
}
.van-icon-chat-o:before {
content: "\F02D"
}
.van-icon-chat:before {
content: "\F02E"
}
.van-icon-checked:before {
content: "\F02F"
}
.van-icon-circle:before {
content: "\F030"
}
.van-icon-clear:before {
content: "\F031"
}
.van-icon-clock-o:before {
content: "\F032"
}
.van-icon-clock:before {
content: "\F033"
}
.van-icon-close:before {
content: "\F034"
}
.van-icon-closed-eye:before {
content: "\F035"
}
.van-icon-cluster-o:before {
content: "\F036"
}
.van-icon-cluster:before {
content: "\F037"
}
.van-icon-column:before {
content: "\F038"
}
.van-icon-comment-circle-o:before {
content: "\F039"
}
.van-icon-comment-circle:before {
content: "\F03A"
}
.van-icon-comment-o:before {
content: "\F03B"
}
.van-icon-comment:before {
content: "\F03C"
}
.van-icon-completed:before {
content: "\F03D"
}
.van-icon-contact:before {
content: "\F03E"
}
.van-icon-coupon-o:before {
content: "\F03F"
}
.van-icon-coupon:before {
content: "\F040"
}
.van-icon-credit-pay:before {
content: "\F041"
}
.van-icon-cross:before {
content: "\F042"
}
.van-icon-debit-pay:before {
content: "\F043"
}
.van-icon-delete:before {
content: "\F044"
}
.van-icon-descending:before {
content: "\F045"
}
.van-icon-description:before {
content: "\F046"
}
.van-icon-desktop-o:before {
content: "\F047"
}
.van-icon-diamond-o:before {
content: "\F048"
}
.van-icon-diamond:before {
content: "\F049"
}
.van-icon-discount:before {
content: "\F04A"
}
.van-icon-down:before {
content: "\F04B"
}
.van-icon-ecard-pay:before {
content: "\F04C"
}
.van-icon-edit:before {
content: "\F04D"
}
.van-icon-ellipsis:before {
content: "\F04E"
}
.van-icon-empty:before {
content: "\F04F"
}
.van-icon-envelop-o:before {
content: "\F050"
}
.van-icon-exchange:before {
content: "\F051"
}
.van-icon-expand-o:before {
content: "\F052"
}
.van-icon-expand:before {
content: "\F053"
}
.van-icon-eye-o:before {
content: "\F054"
}
.van-icon-eye:before {
content: "\F055"
}
.van-icon-fail:before {
content: "\F056"
}
.van-icon-failure:before {
content: "\F057"
}
.van-icon-filter-o:before {
content: "\F058"
}
.van-icon-fire-o:before {
content: "\F059"
}
.van-icon-fire:before {
content: "\F05A"
}
.van-icon-flag-o:before {
content: "\F05B"
}
.van-icon-flower-o:before {
content: "\F05C"
}
.van-icon-free-postage:before {
content: "\F05D"
}
.van-icon-friends-o:before {
content: "\F05E"
}
.van-icon-friends:before {
content: "\F05F"
}
.van-icon-gem-o:before {
content: "\F060"
}
.van-icon-gem:before {
content: "\F061"
}
.van-icon-gift-card-o:before {
content: "\F062"
}
.van-icon-gift-card:before {
content: "\F063"
}
.van-icon-gift-o:before {
content: "\F064"
}
.van-icon-gift:before {
content: "\F065"
}
.van-icon-gold-coin-o:before {
content: "\F066"
}
.van-icon-gold-coin:before {
content: "\F067"
}
.van-icon-good-job-o:before {
content: "\F068"
}
.van-icon-good-job:before {
content: "\F069"
}
.van-icon-goods-collect-o:before {
content: "\F06A"
}
.van-icon-goods-collect:before {
content: "\F06B"
}
.van-icon-graphic:before {
content: "\F06C"
}
.van-icon-home-o:before {
content: "\F06D"
}
.van-icon-hot-o:before {
content: "\F06E"
}
.van-icon-hot-sale-o:before {
content: "\F06F"
}
.van-icon-hot-sale:before {
content: "\F070"
}
.van-icon-hot:before {
content: "\F071"
}
.van-icon-hotel-o:before {
content: "\F072"
}
.van-icon-idcard:before {
content: "\F073"
}
.van-icon-info-o:before {
content: "\F074"
}
.van-icon-info:before {
content: "\F075"
}
.van-icon-invition:before {
content: "\F076"
}
.van-icon-label-o:before {
content: "\F077"
}
.van-icon-label:before {
content: "\F078"
}
.van-icon-like-o:before {
content: "\F079"
}
.van-icon-like:before {
content: "\F07A"
}
.van-icon-live:before {
content: "\F07B"
}
.van-icon-location-o:before {
content: "\F07C"
}
.van-icon-location:before {
content: "\F07D"
}
.van-icon-lock:before {
content: "\F07E"
}
.van-icon-logistics:before {
content: "\F07F"
}
.van-icon-manager-o:before {
content: "\F080"
}
.van-icon-manager:before {
content: "\F081"
}
.van-icon-map-marked:before {
content: "\F082"
}
.van-icon-medal-o:before {
content: "\F083"
}
.van-icon-medal:before {
content: "\F084"
}
.van-icon-more-o:before {
content: "\F085"
}
.van-icon-more:before {
content: "\F086"
}
.van-icon-music-o:before {
content: "\F087"
}
.van-icon-music:before {
content: "\F088"
}
.van-icon-new-arrival-o:before {
content: "\F089"
}
.van-icon-new-arrival:before {
content: "\F08A"
}
.van-icon-new-o:before {
content: "\F08B"
}
.van-icon-new:before {
content: "\F08C"
}
.van-icon-newspaper-o:before {
content: "\F08D"
}
.van-icon-notes-o:before {
content: "\F08E"
}
.van-icon-orders-o:before {
content: "\F08F"
}
.van-icon-other-pay:before {
content: "\F090"
}
.van-icon-paid:before {
content: "\F091"
}
.van-icon-passed:before {
content: "\F092"
}
.van-icon-pause-circle-o:before {
content: "\F093"
}
.van-icon-pause-circle:before {
content: "\F094"
}
.van-icon-pause:before {
content: "\F095"
}
.van-icon-peer-pay:before {
content: "\F096"
}
.van-icon-pending-payment:before {
content: "\F097"
}
.van-icon-phone-circle-o:before {
content: "\F098"
}
.van-icon-phone-circle:before {
content: "\F099"
}
.van-icon-phone-o:before {
content: "\F09A"
}
.van-icon-phone:before {
content: "\F09B"
}
.van-icon-photo-o:before {
content: "\F09C"
}
.van-icon-photo:before {
content: "\F09D"
}
.van-icon-photograph:before {
content: "\F09E"
}
.van-icon-play-circle-o:before {
content: "\F09F"
}
.van-icon-play-circle:before {
content: "\F0A0"
}
.van-icon-play:before {
content: "\F0A1"
}
.van-icon-plus:before {
content: "\F0A2"
}
.van-icon-point-gift-o:before {
content: "\F0A3"
}
.van-icon-point-gift:before {
content: "\F0A4"
}
.van-icon-points:before {
content: "\F0A5"
}
.van-icon-printer:before {
content: "\F0A6"
}
.van-icon-qr-invalid:before {
content: "\F0A7"
}
.van-icon-qr:before {
content: "\F0A8"
}
.van-icon-question-o:before {
content: "\F0A9"
}
.van-icon-question:before {
content: "\F0AA"
}
.van-icon-records:before {
content: "\F0AB"
}
.van-icon-refund-o:before {
content: "\F0AC"
}
.van-icon-replay:before {
content: "\F0AD"
}
.van-icon-scan:before {
content: "\F0AE"
}
.van-icon-search:before {
content: "\F0AF"
}
.van-icon-send-gift-o:before {
content: "\F0B0"
}
.van-icon-send-gift:before {
content: "\F0B1"
}
.van-icon-service-o:before {
content: "\F0B2"
}
.van-icon-service:before {
content: "\F0B3"
}
.van-icon-setting-o:before {
content: "\F0B4"
}
.van-icon-setting:before {
content: "\F0B5"
}
.van-icon-share:before {
content: "\F0B6"
}
.van-icon-shop-collect-o:before {
content: "\F0B7"
}
.van-icon-shop-collect:before {
content: "\F0B8"
}
.van-icon-shop-o:before {
content: "\F0B9"
}
.van-icon-shop:before {
content: "\F0BA"
}
.van-icon-shopping-cart-o:before {
content: "\F0BB"
}
.van-icon-shopping-cart:before {
content: "\F0BC"
}
.van-icon-shrink:before {
content: "\F0BD"
}
.van-icon-sign:before {
content: "\F0BE"
}
.van-icon-smile-comment-o:before {
content: "\F0BF"
}
.van-icon-smile-comment:before {
content: "\F0C0"
}
.van-icon-smile-o:before {
content: "\F0C1"
}
.van-icon-smile:before {
content: "\F0C2"
}
.van-icon-star-o:before {
content: "\F0C3"
}
.van-icon-star:before {
content: "\F0C4"
}
.van-icon-stop-circle-o:before {
content: "\F0C5"
}
.van-icon-stop-circle:before {
content: "\F0C6"
}
.van-icon-stop:before {
content: "\F0C7"
}
.van-icon-success:before {
content: "\F0C8"
}
.van-icon-thumb-circle-o:before {
content: "\F0C9"
}
.van-icon-thumb-circle:before {
content: "\F0CA"
}
.van-icon-todo-list-o:before {
content: "\F0CB"
}
.van-icon-todo-list:before {
content: "\F0CC"
}
.van-icon-tosend:before {
content: "\F0CD"
}
.van-icon-tv-o:before {
content: "\F0CE"
}
.van-icon-umbrella-circle:before {
content: "\F0CF"
}
.van-icon-underway-o:before {
content: "\F0D0"
}
.van-icon-underway:before {
content: "\F0D1"
}
.van-icon-upgrade:before {
content: "\F0D2"
}
.van-icon-user-circle-o:before {
content: "\F0D3"
}
.van-icon-user-o:before {
content: "\F0D4"
}
.van-icon-video-o:before {
content: "\F0D5"
}
.van-icon-video:before {
content: "\F0D6"
}
.van-icon-vip-card-o:before {
content: "\F0D7"
}
.van-icon-vip-card:before {
content: "\F0D8"
}
.van-icon-volume-o:before {
content: "\F0D9"
}
.van-icon-volume:before {
content: "\F0DA"
}
.van-icon-wap-home-o:before {
content: "\F0DB"
}
.van-icon-wap-home:before {
content: "\F0DC"
}
.van-icon-wap-nav:before {
content: "\F0DD"
}
.van-icon-warn-o:before {
content: "\F0DE"
}
.van-icon-warning-o:before {
content: "\F0DF"
}
.van-icon-warning:before {
content: "\F0E0"
}
.van-icon-weapp-nav:before {
content: "\F0E1"
}
.van-icon-wechat:before {
content: "\F0E2"
}
.van-icon-youzan-shield:before {
content: "\F0E3"
}
.vant-icon-index {
display: -webkit-inline-flex;
display: inline-flex;
-webkit-align-items: center;
align-items: center;
-webkit-justify-content: center;
justify-content: center
}
.van-icon--image {
width: 1em;
height: 1em
}
.van-icon__image {
width: 100%;
height: 100%
}
.van-icon__info {
z-index: 1
}
</style>
\ No newline at end of file
<view
class="custom-class {{ classPrefix }} {{ isImageName ? 'van-icon--image' : classPrefix + '-' + name }}"
style="{{ color ? 'color: ' + color + ';' : '' }}{{ size ? 'font-size: ' + sizeWithUnit + ';' : '' }}{{ customStyle }}"
bind:tap="onClick"
>
<van-info
wx:if="{{ info !== null || dot }}"
dot="{{ dot }}"
info="{{ info }}"
custom-class="van-icon__info"
/>
<image
wx:if="{{ isImageName }}"
src="{{ name }}"
mode="aspectFit"
class="van-icon__image"
/>
</view>
@import '../common/index.wxss';
@font-face {
font-weight: 400;
font-family: vant-icon;
font-style: normal;
font-display: auto;
src: url(https://img.yzcdn.cn/vant/vant-icon-d3825a.woff2) format("woff2"), url(https://img.yzcdn.cn/vant/vant-icon-d3825a.woff) format("woff"), url(https://img.yzcdn.cn/vant/vant-icon-d3825a.ttf) format("truetype")
}
.van-icon {
position: relative;
font: normal normal normal 14px/1 vant-icon;
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased
}
.van-icon,
.van-icon:before {
display: inline-block
}
.van-icon-add-o:before {
content: "\F000"
}
.van-icon-add-square:before {
content: "\F001"
}
.van-icon-add:before {
content: "\F002"
}
.van-icon-after-sale:before {
content: "\F003"
}
.van-icon-aim:before {
content: "\F004"
}
.van-icon-alipay:before {
content: "\F005"
}
.van-icon-apps-o:before {
content: "\F006"
}
.van-icon-arrow-down:before {
content: "\F007"
}
.van-icon-arrow-left:before {
content: "\F008"
}
.van-icon-arrow-up:before {
content: "\F009"
}
.van-icon-arrow:before {
content: "\F00A"
}
.van-icon-ascending:before {
content: "\F00B"
}
.van-icon-audio:before {
content: "\F00C"
}
.van-icon-award-o:before {
content: "\F00D"
}
.van-icon-award:before {
content: "\F00E"
}
.van-icon-bag-o:before {
content: "\F00F"
}
.van-icon-bag:before {
content: "\F010"
}
.van-icon-balance-list-o:before {
content: "\F011"
}
.van-icon-balance-list:before {
content: "\F012"
}
.van-icon-balance-o:before {
content: "\F013"
}
.van-icon-balance-pay:before {
content: "\F014"
}
.van-icon-bar-chart-o:before {
content: "\F015"
}
.van-icon-bars:before {
content: "\F016"
}
.van-icon-bell:before {
content: "\F017"
}
.van-icon-bill-o:before {
content: "\F018"
}
.van-icon-bill:before {
content: "\F019"
}
.van-icon-birthday-cake-o:before {
content: "\F01A"
}
.van-icon-bookmark-o:before {
content: "\F01B"
}
.van-icon-bookmark:before {
content: "\F01C"
}
.van-icon-browsing-history-o:before {
content: "\F01D"
}
.van-icon-browsing-history:before {
content: "\F01E"
}
.van-icon-brush-o:before {
content: "\F01F"
}
.van-icon-bulb-o:before {
content: "\F020"
}
.van-icon-bullhorn-o:before {
content: "\F021"
}
.van-icon-calender-o:before {
content: "\F022"
}
.van-icon-card:before {
content: "\F023"
}
.van-icon-cart-circle-o:before {
content: "\F024"
}
.van-icon-cart-circle:before {
content: "\F025"
}
.van-icon-cart-o:before {
content: "\F026"
}
.van-icon-cart:before {
content: "\F027"
}
.van-icon-cash-back-record:before {
content: "\F028"
}
.van-icon-cash-on-deliver:before {
content: "\F029"
}
.van-icon-cashier-o:before {
content: "\F02A"
}
.van-icon-certificate:before {
content: "\F02B"
}
.van-icon-chart-trending-o:before {
content: "\F02C"
}
.van-icon-chat-o:before {
content: "\F02D"
}
.van-icon-chat:before {
content: "\F02E"
}
.van-icon-checked:before {
content: "\F02F"
}
.van-icon-circle:before {
content: "\F030"
}
.van-icon-clear:before {
content: "\F031"
}
.van-icon-clock-o:before {
content: "\F032"
}
.van-icon-clock:before {
content: "\F033"
}
.van-icon-close:before {
content: "\F034"
}
.van-icon-closed-eye:before {
content: "\F035"
}
.van-icon-cluster-o:before {
content: "\F036"
}
.van-icon-cluster:before {
content: "\F037"
}
.van-icon-column:before {
content: "\F038"
}
.van-icon-comment-circle-o:before {
content: "\F039"
}
.van-icon-comment-circle:before {
content: "\F03A"
}
.van-icon-comment-o:before {
content: "\F03B"
}
.van-icon-comment:before {
content: "\F03C"
}
.van-icon-completed:before {
content: "\F03D"
}
.van-icon-contact:before {
content: "\F03E"
}
.van-icon-coupon-o:before {
content: "\F03F"
}
.van-icon-coupon:before {
content: "\F040"
}
.van-icon-credit-pay:before {
content: "\F041"
}
.van-icon-cross:before {
content: "\F042"
}
.van-icon-debit-pay:before {
content: "\F043"
}
.van-icon-delete:before {
content: "\F044"
}
.van-icon-descending:before {
content: "\F045"
}
.van-icon-description:before {
content: "\F046"
}
.van-icon-desktop-o:before {
content: "\F047"
}
.van-icon-diamond-o:before {
content: "\F048"
}
.van-icon-diamond:before {
content: "\F049"
}
.van-icon-discount:before {
content: "\F04A"
}
.van-icon-down:before {
content: "\F04B"
}
.van-icon-ecard-pay:before {
content: "\F04C"
}
.van-icon-edit:before {
content: "\F04D"
}
.van-icon-ellipsis:before {
content: "\F04E"
}
.van-icon-empty:before {
content: "\F04F"
}
.van-icon-envelop-o:before {
content: "\F050"
}
.van-icon-exchange:before {
content: "\F051"
}
.van-icon-expand-o:before {
content: "\F052"
}
.van-icon-expand:before {
content: "\F053"
}
.van-icon-eye-o:before {
content: "\F054"
}
.van-icon-eye:before {
content: "\F055"
}
.van-icon-fail:before {
content: "\F056"
}
.van-icon-failure:before {
content: "\F057"
}
.van-icon-filter-o:before {
content: "\F058"
}
.van-icon-fire-o:before {
content: "\F059"
}
.van-icon-fire:before {
content: "\F05A"
}
.van-icon-flag-o:before {
content: "\F05B"
}
.van-icon-flower-o:before {
content: "\F05C"
}
.van-icon-free-postage:before {
content: "\F05D"
}
.van-icon-friends-o:before {
content: "\F05E"
}
.van-icon-friends:before {
content: "\F05F"
}
.van-icon-gem-o:before {
content: "\F060"
}
.van-icon-gem:before {
content: "\F061"
}
.van-icon-gift-card-o:before {
content: "\F062"
}
.van-icon-gift-card:before {
content: "\F063"
}
.van-icon-gift-o:before {
content: "\F064"
}
.van-icon-gift:before {
content: "\F065"
}
.van-icon-gold-coin-o:before {
content: "\F066"
}
.van-icon-gold-coin:before {
content: "\F067"
}
.van-icon-good-job-o:before {
content: "\F068"
}
.van-icon-good-job:before {
content: "\F069"
}
.van-icon-goods-collect-o:before {
content: "\F06A"
}
.van-icon-goods-collect:before {
content: "\F06B"
}
.van-icon-graphic:before {
content: "\F06C"
}
.van-icon-home-o:before {
content: "\F06D"
}
.van-icon-hot-o:before {
content: "\F06E"
}
.van-icon-hot-sale-o:before {
content: "\F06F"
}
.van-icon-hot-sale:before {
content: "\F070"
}
.van-icon-hot:before {
content: "\F071"
}
.van-icon-hotel-o:before {
content: "\F072"
}
.van-icon-idcard:before {
content: "\F073"
}
.van-icon-info-o:before {
content: "\F074"
}
.van-icon-info:before {
content: "\F075"
}
.van-icon-invition:before {
content: "\F076"
}
.van-icon-label-o:before {
content: "\F077"
}
.van-icon-label:before {
content: "\F078"
}
.van-icon-like-o:before {
content: "\F079"
}
.van-icon-like:before {
content: "\F07A"
}
.van-icon-live:before {
content: "\F07B"
}
.van-icon-location-o:before {
content: "\F07C"
}
.van-icon-location:before {
content: "\F07D"
}
.van-icon-lock:before {
content: "\F07E"
}
.van-icon-logistics:before {
content: "\F07F"
}
.van-icon-manager-o:before {
content: "\F080"
}
.van-icon-manager:before {
content: "\F081"
}
.van-icon-map-marked:before {
content: "\F082"
}
.van-icon-medal-o:before {
content: "\F083"
}
.van-icon-medal:before {
content: "\F084"
}
.van-icon-more-o:before {
content: "\F085"
}
.van-icon-more:before {
content: "\F086"
}
.van-icon-music-o:before {
content: "\F087"
}
.van-icon-music:before {
content: "\F088"
}
.van-icon-new-arrival-o:before {
content: "\F089"
}
.van-icon-new-arrival:before {
content: "\F08A"
}
.van-icon-new-o:before {
content: "\F08B"
}
.van-icon-new:before {
content: "\F08C"
}
.van-icon-newspaper-o:before {
content: "\F08D"
}
.van-icon-notes-o:before {
content: "\F08E"
}
.van-icon-orders-o:before {
content: "\F08F"
}
.van-icon-other-pay:before {
content: "\F090"
}
.van-icon-paid:before {
content: "\F091"
}
.van-icon-passed:before {
content: "\F092"
}
.van-icon-pause-circle-o:before {
content: "\F093"
}
.van-icon-pause-circle:before {
content: "\F094"
}
.van-icon-pause:before {
content: "\F095"
}
.van-icon-peer-pay:before {
content: "\F096"
}
.van-icon-pending-payment:before {
content: "\F097"
}
.van-icon-phone-circle-o:before {
content: "\F098"
}
.van-icon-phone-circle:before {
content: "\F099"
}
.van-icon-phone-o:before {
content: "\F09A"
}
.van-icon-phone:before {
content: "\F09B"
}
.van-icon-photo-o:before {
content: "\F09C"
}
.van-icon-photo:before {
content: "\F09D"
}
.van-icon-photograph:before {
content: "\F09E"
}
.van-icon-play-circle-o:before {
content: "\F09F"
}
.van-icon-play-circle:before {
content: "\F0A0"
}
.van-icon-play:before {
content: "\F0A1"
}
.van-icon-plus:before {
content: "\F0A2"
}
.van-icon-point-gift-o:before {
content: "\F0A3"
}
.van-icon-point-gift:before {
content: "\F0A4"
}
.van-icon-points:before {
content: "\F0A5"
}
.van-icon-printer:before {
content: "\F0A6"
}
.van-icon-qr-invalid:before {
content: "\F0A7"
}
.van-icon-qr:before {
content: "\F0A8"
}
.van-icon-question-o:before {
content: "\F0A9"
}
.van-icon-question:before {
content: "\F0AA"
}
.van-icon-records:before {
content: "\F0AB"
}
.van-icon-refund-o:before {
content: "\F0AC"
}
.van-icon-replay:before {
content: "\F0AD"
}
.van-icon-scan:before {
content: "\F0AE"
}
.van-icon-search:before {
content: "\F0AF"
}
.van-icon-send-gift-o:before {
content: "\F0B0"
}
.van-icon-send-gift:before {
content: "\F0B1"
}
.van-icon-service-o:before {
content: "\F0B2"
}
.van-icon-service:before {
content: "\F0B3"
}
.van-icon-setting-o:before {
content: "\F0B4"
}
.van-icon-setting:before {
content: "\F0B5"
}
.van-icon-share:before {
content: "\F0B6"
}
.van-icon-shop-collect-o:before {
content: "\F0B7"
}
.van-icon-shop-collect:before {
content: "\F0B8"
}
.van-icon-shop-o:before {
content: "\F0B9"
}
.van-icon-shop:before {
content: "\F0BA"
}
.van-icon-shopping-cart-o:before {
content: "\F0BB"
}
.van-icon-shopping-cart:before {
content: "\F0BC"
}
.van-icon-shrink:before {
content: "\F0BD"
}
.van-icon-sign:before {
content: "\F0BE"
}
.van-icon-smile-comment-o:before {
content: "\F0BF"
}
.van-icon-smile-comment:before {
content: "\F0C0"
}
.van-icon-smile-o:before {
content: "\F0C1"
}
.van-icon-smile:before {
content: "\F0C2"
}
.van-icon-star-o:before {
content: "\F0C3"
}
.van-icon-star:before {
content: "\F0C4"
}
.van-icon-stop-circle-o:before {
content: "\F0C5"
}
.van-icon-stop-circle:before {
content: "\F0C6"
}
.van-icon-stop:before {
content: "\F0C7"
}
.van-icon-success:before {
content: "\F0C8"
}
.van-icon-thumb-circle-o:before {
content: "\F0C9"
}
.van-icon-thumb-circle:before {
content: "\F0CA"
}
.van-icon-todo-list-o:before {
content: "\F0CB"
}
.van-icon-todo-list:before {
content: "\F0CC"
}
.van-icon-tosend:before {
content: "\F0CD"
}
.van-icon-tv-o:before {
content: "\F0CE"
}
.van-icon-umbrella-circle:before {
content: "\F0CF"
}
.van-icon-underway-o:before {
content: "\F0D0"
}
.van-icon-underway:before {
content: "\F0D1"
}
.van-icon-upgrade:before {
content: "\F0D2"
}
.van-icon-user-circle-o:before {
content: "\F0D3"
}
.van-icon-user-o:before {
content: "\F0D4"
}
.van-icon-video-o:before {
content: "\F0D5"
}
.van-icon-video:before {
content: "\F0D6"
}
.van-icon-vip-card-o:before {
content: "\F0D7"
}
.van-icon-vip-card:before {
content: "\F0D8"
}
.van-icon-volume-o:before {
content: "\F0D9"
}
.van-icon-volume:before {
content: "\F0DA"
}
.van-icon-wap-home-o:before {
content: "\F0DB"
}
.van-icon-wap-home:before {
content: "\F0DC"
}
.van-icon-wap-nav:before {
content: "\F0DD"
}
.van-icon-warn-o:before {
content: "\F0DE"
}
.van-icon-warning-o:before {
content: "\F0DF"
}
.van-icon-warning:before {
content: "\F0E0"
}
.van-icon-weapp-nav:before {
content: "\F0E1"
}
.van-icon-wechat:before {
content: "\F0E2"
}
.van-icon-youzan-shield:before {
content: "\F0E3"
}
:host {
display: -webkit-inline-flex;
display: inline-flex;
-webkit-align-items: center;
align-items: center;
-webkit-justify-content: center;
justify-content: center
}
.van-icon--image {
width: 1em;
height: 1em
}
.van-icon__image {
width: 100%;
height: 100%
}
.van-icon__info {
z-index: 1
}
import { VantComponent } from '../common/component';
VantComponent({
props: {
dot: Boolean,
info: null,
customStyle: String
}
});
<template>
<uni-shadow-root class="vant-info-index"><view v-if="info !== null && info !== '' || dot" :class="'custom-class van-info '+(utils.bem('info', { dot }))" :style="customStyle">{{ dot ? '' : info }}</view></uni-shadow-root>
</template>
<wxs src="../wxs/utils.wxs" module="utils"></wxs>
<script>
global['__wxRoute'] = 'vant/info/index'
import { VantComponent } from '../common/component';
VantComponent({
props: {
dot: Boolean,
info: null,
customStyle: String
}
});
export default global['__wxComponents']['vant/info/index']
</script>
<style platform="mp-weixin">
@import '../common/index.css';.van-info{position:absolute;top:0;right:0;box-sizing:border-box;white-space:nowrap;text-align:center;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);-webkit-transform-origin:100%;transform-origin:100%;min-width:16px;min-width:var(--info-size,16px);padding:0 3px;padding:var(--info-padding,0 3px);color:#fff;color:var(--info-color,#fff);font-weight:500;font-weight:var(--info-font-weight,500);font-size:12px;font-size:var(--info-font-size,12px);font-family:PingFang SC,Helvetica Neue,Arial,sans-serif;font-family:var(--info-font-family,PingFang SC,Helvetica Neue,Arial,sans-serif);line-height:14px;line-height:calc(var(--info-size, 16px) - var(--info-border-width, 1px)*2);background-color:#ee0a24;background-color:var(--info-background-color,#ee0a24);border:1px solid #fff;border:var(--info-border-width,1px) solid var(--white,#fff);border-radius:16px;border-radius:var(--info-size,16px)}.van-info--dot{min-width:0;border-radius:100%;width:8px;width:var(--info-dot-size,8px);height:8px;height:var(--info-dot-size,8px);background-color:#ee0a24;background-color:var(--info-dot-color,#ee0a24)}
</style>
\ No newline at end of file
<wxs src="../wxs/utils.wxs" module="utils" />
<view
wx:if="{{ info !== null && info !== '' || dot }}"
class="custom-class van-info {{ utils.bem('info', { dot }) }}"
style="{{ customStyle }}"
>{{ dot ? '' : info }}</view>
@import '../common/index.wxss';.van-info{position:absolute;top:0;right:0;box-sizing:border-box;white-space:nowrap;text-align:center;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);-webkit-transform-origin:100%;transform-origin:100%;min-width:16px;min-width:var(--info-size,16px);padding:0 3px;padding:var(--info-padding,0 3px);color:#fff;color:var(--info-color,#fff);font-weight:500;font-weight:var(--info-font-weight,500);font-size:12px;font-size:var(--info-font-size,12px);font-family:PingFang SC,Helvetica Neue,Arial,sans-serif;font-family:var(--info-font-family,PingFang SC,Helvetica Neue,Arial,sans-serif);line-height:14px;line-height:calc(var(--info-size, 16px) - var(--info-border-width, 1px)*2);background-color:#ee0a24;background-color:var(--info-background-color,#ee0a24);border:1px solid #fff;border:var(--info-border-width,1px) solid var(--white,#fff);border-radius:16px;border-radius:var(--info-size,16px)}.van-info--dot{min-width:0;border-radius:100%;width:8px;width:var(--info-dot-size,8px);height:8px;height:var(--info-dot-size,8px);background-color:#ee0a24;background-color:var(--info-dot-color,#ee0a24)}
\ No newline at end of file
import { VantComponent } from '../common/component';
import { addUnit } from '../common/utils';
VantComponent({
props: {
color: String,
vertical: Boolean,
type: {
type: String,
value: 'circular'
},
size: {
type: String,
observer: 'setSizeWithUnit'
},
textSize: {
type: String,
observer: 'setTextSizeWithUnit'
}
},
methods: {
setSizeWithUnit(size) {
this.setData({
sizeWithUnit: addUnit(size)
});
},
setTextSizeWithUnit(size) {
this.set({
textSizeWithUnit: addUnit(size)
});
}
}
});
{
"component": true
}
\ No newline at end of file
<template>
<uni-shadow-root class="vant-loading-index"><view :class="'custom-class van-loading '+(vertical ? 'van-loading--vertical' : '')">
<view :class="'van-loading__spinner van-loading__spinner--'+(type)" :style="'color: '+(color)+'; width: '+(sizeWithUnit)+'; height: '+(sizeWithUnit)">
<view v-for="(item,index) in ('item in 12')" :key="item.index" v-if="type === 'spinner'" class="van-loading__dot"></view>
</view>
<view class="van-loading__text" :style="'font-size: '+(textSizeWithUnit)+';'">
<slot></slot>
</view>
</view></uni-shadow-root>
</template>
<script>
global['__wxRoute'] = 'vant/loading/index'
import { VantComponent } from '../common/component';
import { addUnit } from '../common/utils';
VantComponent({
props: {
color: String,
vertical: Boolean,
type: {
type: String,
value: 'circular'
},
size: {
type: String,
observer: 'setSizeWithUnit'
},
textSize: {
type: String,
observer: 'setTextSizeWithUnit'
}
},
methods: {
setSizeWithUnit(size) {
this.setData({
sizeWithUnit: addUnit(size)
});
},
setTextSizeWithUnit(size) {
this.set({
textSizeWithUnit: addUnit(size)
});
}
}
});
export default global['__wxComponents']['vant/loading/index']
</script>
<style platform="mp-weixin">
@import '../common/index.css';.vant-loading-index{font-size:0;line-height:1}.van-loading{display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;color:#c8c9cc;color:var(--loading-spinner-color,#c8c9cc)}.van-loading__spinner{position:relative;box-sizing:border-box;width:30px;width:var(--loading-spinner-size,30px);max-width:100%;max-height:100%;height:30px;height:var(--loading-spinner-size,30px);-webkit-animation:van-rotate .8s linear infinite;animation:van-rotate .8s linear infinite;-webkit-animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite;animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite}.van-loading__spinner--spinner{-webkit-animation-timing-function:steps(12);animation-timing-function:steps(12)}.van-loading__spinner--circular{border:1px solid transparent;border-top-color:initial;border-radius:100%}.van-loading__text{margin-left:8px;margin-left:var(--padding-xs,8px);color:#969799;color:var(--loading-text-color,#969799);font-size:14px;font-size:var(--loading-text-font-size,14px);line-height:20px;line-height:var(--loading-text-line-height,20px)}.van-loading__text:empty{display:none}.van-loading--vertical{-webkit-flex-direction:column;flex-direction:column}.van-loading--vertical .van-loading__text{margin:8px 0 0;margin:var(--padding-xs,8px) 0 0}.van-loading__dot{position:absolute;top:0;left:0;width:100%;height:100%}.van-loading__dot:before{display:block;width:2px;height:25%;margin:0 auto;background-color:currentColor;border-radius:40%;content:" "}.van-loading__dot:first-of-type{-webkit-transform:rotate(30deg);transform:rotate(30deg);opacity:1}.van-loading__dot:nth-of-type(2){-webkit-transform:rotate(60deg);transform:rotate(60deg);opacity:.9375}.van-loading__dot:nth-of-type(3){-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:.875}.van-loading__dot:nth-of-type(4){-webkit-transform:rotate(120deg);transform:rotate(120deg);opacity:.8125}.van-loading__dot:nth-of-type(5){-webkit-transform:rotate(150deg);transform:rotate(150deg);opacity:.75}.van-loading__dot:nth-of-type(6){-webkit-transform:rotate(180deg);transform:rotate(180deg);opacity:.6875}.van-loading__dot:nth-of-type(7){-webkit-transform:rotate(210deg);transform:rotate(210deg);opacity:.625}.van-loading__dot:nth-of-type(8){-webkit-transform:rotate(240deg);transform:rotate(240deg);opacity:.5625}.van-loading__dot:nth-of-type(9){-webkit-transform:rotate(270deg);transform:rotate(270deg);opacity:.5}.van-loading__dot:nth-of-type(10){-webkit-transform:rotate(300deg);transform:rotate(300deg);opacity:.4375}.van-loading__dot:nth-of-type(11){-webkit-transform:rotate(330deg);transform:rotate(330deg);opacity:.375}.van-loading__dot:nth-of-type(12){-webkit-transform:rotate(1turn);transform:rotate(1turn);opacity:.3125}@-webkit-keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}
</style>
\ No newline at end of file
<view class="custom-class van-loading {{ vertical ? 'van-loading--vertical' : '' }}">
<view
class="van-loading__spinner van-loading__spinner--{{ type }}"
style="color: {{ color }}; width: {{ sizeWithUnit }}; height: {{ sizeWithUnit }}"
>
<view
wx:if="{{ type === 'spinner' }}"
wx:for="item in 12"
wx:key="index"
class="van-loading__dot"
/>
</view>
<view class="van-loading__text" style="font-size: {{ textSizeWithUnit }};">
<slot />
</view>
</view>
@import '../common/index.wxss';:host{font-size:0;line-height:1}.van-loading{display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;color:#c8c9cc;color:var(--loading-spinner-color,#c8c9cc)}.van-loading__spinner{position:relative;box-sizing:border-box;width:30px;width:var(--loading-spinner-size,30px);max-width:100%;max-height:100%;height:30px;height:var(--loading-spinner-size,30px);-webkit-animation:van-rotate .8s linear infinite;animation:van-rotate .8s linear infinite;-webkit-animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite;animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite}.van-loading__spinner--spinner{-webkit-animation-timing-function:steps(12);animation-timing-function:steps(12)}.van-loading__spinner--circular{border:1px solid transparent;border-top-color:initial;border-radius:100%}.van-loading__text{margin-left:8px;margin-left:var(--padding-xs,8px);color:#969799;color:var(--loading-text-color,#969799);font-size:14px;font-size:var(--loading-text-font-size,14px);line-height:20px;line-height:var(--loading-text-line-height,20px)}.van-loading__text:empty{display:none}.van-loading--vertical{-webkit-flex-direction:column;flex-direction:column}.van-loading--vertical .van-loading__text{margin:8px 0 0;margin:var(--padding-xs,8px) 0 0}.van-loading__dot{position:absolute;top:0;left:0;width:100%;height:100%}.van-loading__dot:before{display:block;width:2px;height:25%;margin:0 auto;background-color:currentColor;border-radius:40%;content:" "}.van-loading__dot:first-of-type{-webkit-transform:rotate(30deg);transform:rotate(30deg);opacity:1}.van-loading__dot:nth-of-type(2){-webkit-transform:rotate(60deg);transform:rotate(60deg);opacity:.9375}.van-loading__dot:nth-of-type(3){-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:.875}.van-loading__dot:nth-of-type(4){-webkit-transform:rotate(120deg);transform:rotate(120deg);opacity:.8125}.van-loading__dot:nth-of-type(5){-webkit-transform:rotate(150deg);transform:rotate(150deg);opacity:.75}.van-loading__dot:nth-of-type(6){-webkit-transform:rotate(180deg);transform:rotate(180deg);opacity:.6875}.van-loading__dot:nth-of-type(7){-webkit-transform:rotate(210deg);transform:rotate(210deg);opacity:.625}.van-loading__dot:nth-of-type(8){-webkit-transform:rotate(240deg);transform:rotate(240deg);opacity:.5625}.van-loading__dot:nth-of-type(9){-webkit-transform:rotate(270deg);transform:rotate(270deg);opacity:.5}.van-loading__dot:nth-of-type(10){-webkit-transform:rotate(300deg);transform:rotate(300deg);opacity:.4375}.van-loading__dot:nth-of-type(11){-webkit-transform:rotate(330deg);transform:rotate(330deg);opacity:.375}.van-loading__dot:nth-of-type(12){-webkit-transform:rotate(1turn);transform:rotate(1turn);opacity:.3125}@-webkit-keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}
\ No newline at end of file
export declare const basic: string;
export const basic = Behavior({
methods: {
$emit(...args) {
this.triggerEvent(...args);
},
getRect(selector, all) {
return new Promise(resolve => {
wx.createSelectorQuery()
.in(this)[all ? 'selectAll' : 'select'](selector)
.boundingClientRect(rect => {
if (all && Array.isArray(rect) && rect.length) {
resolve(rect);
}
if (!all && rect) {
resolve(rect);
}
})
.exec();
});
}
}
});
export declare const button: string;
export const button = Behavior({
externalClasses: ['hover-class'],
properties: {
id: String,
lang: {
type: String,
value: 'en'
},
businessId: Number,
sessionFrom: String,
sendMessageTitle: String,
sendMessagePath: String,
sendMessageImg: String,
showMessageCard: Boolean,
appParameter: String,
ariaLabel: String
}
});
export declare const link: string;
export const link = Behavior({
properties: {
url: String,
linkType: {
type: String,
value: 'navigateTo'
}
},
methods: {
jumpLink(urlKey = 'url') {
const url = this.data[urlKey];
if (url) {
wx[this.data.linkType]({ url });
}
}
}
});
export declare const behavior: string;
export const behavior = Behavior({
methods: {
set(data, callback) {
return new Promise(resolve => {
this.setData(data, () => {
if (callback && typeof callback === 'function') {
callback.call(this);
}
resolve();
});
});
}
}
});
export declare function observe(vantOptions: any, options: any): void;
import { behavior } from './behavior';
export function observe(vantOptions, options) {
const { watch } = vantOptions;
options.behaviors.push(behavior);
if (watch) {
const props = options.properties || {};
Object.keys(watch).forEach(key => {
if (key in props) {
let prop = props[key];
if (prop === null || !('type' in prop)) {
prop = { type: prop };
}
prop.observer = watch[key];
props[key] = prop;
}
});
options.properties = props;
}
}
export declare const openType: string;
export const openType = Behavior({
properties: {
openType: String
},
methods: {
bindGetUserInfo(event) {
this.$emit('getuserinfo', event.detail);
},
bindContact(event) {
this.$emit('contact', event.detail);
},
bindGetPhoneNumber(event) {
this.$emit('getphonenumber', event.detail);
},
bindError(event) {
this.$emit('error', event.detail);
},
bindLaunchApp(event) {
this.$emit('launchapp', event.detail);
},
bindOpenSetting(event) {
this.$emit('opensetting', event.detail);
},
}
});
export declare const touch: string;
const MIN_DISTANCE = 10;
function getDirection(x, y) {
if (x > y && x > MIN_DISTANCE) {
return 'horizontal';
}
if (y > x && y > MIN_DISTANCE) {
return 'vertical';
}
return '';
}
export const touch = Behavior({
methods: {
resetTouchStatus() {
this.direction = '';
this.deltaX = 0;
this.deltaY = 0;
this.offsetX = 0;
this.offsetY = 0;
},
touchStart(event) {
this.resetTouchStatus();
const touch = event.touches[0];
this.startX = touch.clientX;
this.startY = touch.clientY;
},
touchMove(event) {
const touch = event.touches[0];
this.deltaX = touch.clientX - this.startX;
this.deltaY = touch.clientY - this.startY;
this.offsetX = Math.abs(this.deltaX);
this.offsetY = Math.abs(this.deltaY);
this.direction = this.direction || getDirection(this.offsetX, this.offsetY);
}
}
});
export declare const transition: (showDefaultValue: boolean) => any;
import { isObj } from '../common/utils';
const getClassNames = (name) => ({
enter: `van-${name}-enter van-${name}-enter-active enter-class enter-active-class`,
'enter-to': `van-${name}-enter-to van-${name}-enter-active enter-to-class enter-active-class`,
leave: `van-${name}-leave van-${name}-leave-active leave-class leave-active-class`,
'leave-to': `van-${name}-leave-to van-${name}-leave-active leave-to-class leave-active-class`
});
const nextTick = () => new Promise(resolve => setTimeout(resolve, 1000 / 30));
export const transition = function (showDefaultValue) {
return Behavior({
properties: {
customStyle: String,
// @ts-ignore
show: {
type: Boolean,
value: showDefaultValue,
observer: 'observeShow'
},
// @ts-ignore
duration: {
type: null,
value: 300,
observer: 'observeDuration'
},
name: {
type: String,
value: 'fade'
}
},
data: {
type: '',
inited: false,
display: false
},
attached() {
if (this.data.show) {
this.enter();
}
},
methods: {
observeShow(value) {
value ? this.enter() : this.leave();
},
enter() {
const { duration, name } = this.data;
const classNames = getClassNames(name);
const currentDuration = isObj(duration) ? duration.enter : duration;
this.status = 'enter';
this.$emit('before-enter');
Promise.resolve()
.then(nextTick)
.then(() => {
this.checkStatus('enter');
this.$emit('enter');
this.setData({
inited: true,
display: true,
classes: classNames.enter,
currentDuration
});
})
.then(nextTick)
.then(() => {
this.checkStatus('enter');
this.transitionEnded = false;
this.setData({
classes: classNames['enter-to']
});
})
.catch(() => { });
},
leave() {
if (!this.data.display) {
return;
}
const { duration, name } = this.data;
const classNames = getClassNames(name);
const currentDuration = isObj(duration) ? duration.leave : duration;
this.status = 'leave';
this.$emit('before-leave');
Promise.resolve()
.then(nextTick)
.then(() => {
this.checkStatus('leave');
this.$emit('leave');
this.setData({
classes: classNames.leave,
currentDuration
});
})
.then(nextTick)
.then(() => {
this.checkStatus('leave');
this.transitionEnded = false;
setTimeout(() => this.onTransitionEnd(), currentDuration);
this.setData({
classes: classNames['leave-to']
});
})
.catch(() => { });
},
checkStatus(status) {
if (status !== this.status) {
throw new Error(`incongruent status: ${status}`);
}
},
onTransitionEnd() {
if (this.transitionEnded) {
return;
}
this.transitionEnded = true;
this.$emit(`after-${this.status}`);
const { show, display } = this.data;
if (!show && display) {
this.setData({ display: false });
}
}
}
});
};
function isArray(array) {
return array && (array.constructor === 'Array' || (typeof Array !== 'undefined' && Array.isArray(array)));
}
module.exports.isArray = isArray;
var array = require('./array.wxs');
var object = require('./object.wxs');
var PREFIX = 'van-';
function join(name, mods) {
name = PREFIX + name;
mods = mods.map(function(mod) {
return name + '--' + mod;
});
mods.unshift(name);
return mods.join(' ');
}
function traversing(mods, conf) {
if (!conf) {
return;
}
if (typeof conf === 'string' || typeof conf === 'number') {
mods.push(conf);
} else if (array.isArray(conf)) {
conf.forEach(function(item) {
traversing(mods, item);
});
} else if (typeof conf === 'object') {
object.keys(conf).forEach(function(key) {
conf[key] && mods.push(key);
});
}
}
function bem(name, conf) {
var mods = [];
traversing(mods, conf);
return join(name, mods);
}
module.exports.bem = bem;
/**
* Simple memoize
* wxs doesn't support fn.apply, so this memoize only support up to 2 args
*/
function isPrimitive(value) {
var type = typeof value;
return (
type === 'boolean' ||
type === 'number' ||
type === 'string' ||
type === 'undefined' ||
value === null
);
}
// mock simple fn.call in wxs
function call(fn, args) {
if (args.length === 2) {
return fn(args[0], args[1]);
}
if (args.length === 1) {
return fn(args[0]);
}
return fn();
}
function serializer(args) {
if (args.length === 1 && isPrimitive(args[0])) {
return args[0];
}
var obj = {};
for (var i = 0; i < args.length; i++) {
obj['key' + i] = args[i];
}
return JSON.stringify(obj);
}
function memoize(fn) {
var cache = {};
return function() {
var key = serializer(arguments);
if (cache[key] === undefined) {
cache[key] = call(fn, arguments);
}
return cache[key];
};
}
module.exports.memoize = memoize;
/* eslint-disable */
var REGEXP = getRegExp('{|}|"', 'g');
function keys(obj) {
return JSON.stringify(obj)
.replace(REGEXP, '')
.split(',')
.map(function(item) {
return item.split(':')[0];
});
}
module.exports.keys = keys;
var bem = require('./bem.wxs').bem;
var memoize = require('./memoize.wxs').memoize;
module.exports = {
bem: memoize(bem),
memoize: memoize
};
{
"compilerOptions": {
"types": [
"@dcloudio/types",
"miniprogram-api-typings",
"mini-types"
]
}
}
/**
*
* cli-构建配置
*
*/
module.exports={
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment