刘嘉炜
4 years ago
18 changed files with 1483 additions and 38 deletions
-
21README.md
-
6package.json
-
23src/App.vue
-
149src/components/authorize_modal/authorize_modal.vue
-
12src/js/api.js
-
91src/js/server.js
-
27src/pages.json
-
151src/pages/feedback/feedback.vue
-
230src/pages/index/index.vue
-
205src/pages/login/login.vue
-
94src/pages/message_list/message_list.vue
-
BINsrc/static/images/authorize.png
-
BINsrc/static/logo.png
-
16src/store/actions.js
-
54src/store/index.js
-
15src/store/mutations.js
-
89src/style/public.scss
-
338src/utils/util.js
@ -0,0 +1,149 @@ |
|||
<template> |
|||
<view class="authorize-modal"> |
|||
<view class="am-content"> |
|||
<view class="ac-tit">微信授权</view> |
|||
<view class="ac-tip">您的信息和数据将受到保护</view> |
|||
<image class="ac-img" mode="aspectFit" src="/static/images/authorize.png"></image> |
|||
<view class="ac-btns"> |
|||
<button plain class="ab-btn" hover-class="hover-active" @click="cancel">取消</button> |
|||
<button |
|||
plain |
|||
class="ab-btn" |
|||
hover-class="hover-active" |
|||
open-type="getUserInfo" |
|||
lang="zh_CN" |
|||
@getuserinfo="getUserInfo" |
|||
>授权并登录</button> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
<script> |
|||
import { API } from '../../js/api'; |
|||
import { servers } from '../../js/server'; |
|||
import util from '../../utils/util'; |
|||
import Vuex from 'vuex'; |
|||
const uniLogin = util.promisify(uni.login); |
|||
|
|||
export default { |
|||
methods: { |
|||
cancel(){ |
|||
this.closeThis(); |
|||
}, |
|||
closeThis(){ |
|||
this.$emit('close'); |
|||
}, |
|||
async getUserInfo(userRes){ |
|||
|
|||
if(!userRes.detail.userInfo){ |
|||
this.$emit('loginFail'); |
|||
this.closeThis(); |
|||
return util.showNone('获取用户信息失败!请稍后重试'); |
|||
} |
|||
let loginRes = await uniLogin(); |
|||
if(!loginRes.code){ |
|||
this.$emit('loginFail'); |
|||
this.closeThis(); |
|||
return util.showNone('获取登陆凭证失败!稍后重试'); |
|||
} |
|||
const APPID = uni.getAccountInfoSync().miniProgram.appId; |
|||
util.showLoad(); |
|||
servers.post({ |
|||
url: API.wechatMiniAppLoginAndSync, |
|||
data: { |
|||
code:loginRes.code, |
|||
appid:APPID, |
|||
encryptedData:userRes.detail.encryptedData, |
|||
iv:userRes.detail.iv, |
|||
'avatar_url': userRes.detail.userInfo.avatarUrl, |
|||
...userRes.detail.userInfo, |
|||
}, |
|||
isDefaultGet: false, |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
if(res.data.code == 0){ |
|||
util.showNone(res.data.message || '登陆成功!'); |
|||
let _data = res.data.data; |
|||
uni.setStorageSync('token',_data.token); |
|||
uni.setStorageSync('userInfo',_data.user); |
|||
this.$emit('loginSuccess',res); |
|||
setTimeout(_=>this.closeThis(), 1200); |
|||
}else{ |
|||
util.showNone(res.data.message || '后台登陆失败!'); |
|||
this.$emit('loginFail'); |
|||
setTimeout(_=>this.closeThis(), 1200); |
|||
} |
|||
|
|||
}).catch(util.hideLoad) |
|||
|
|||
// this.$store.dispatch('initStoreInfo') |
|||
// .then(store=>console.log('店铺信息---',store)) |
|||
|
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped lang="scss"> |
|||
@import "../../style/public.scss"; |
|||
.authorize-modal{ |
|||
position: fixed; |
|||
left: 0; |
|||
right: 0; |
|||
top: 0; |
|||
bottom: 0; |
|||
background-color: rgba($color: #000, $alpha: .5); |
|||
z-index: 10; |
|||
.am-content{ |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%, -50%); |
|||
padding-top: 60upx; |
|||
width: 626upx; |
|||
border-radius: 16upx; |
|||
background-color: #fff; |
|||
.ac-tit{ |
|||
margin-bottom: 22upx; |
|||
text-align: center; |
|||
line-height: 44upx; |
|||
font-size: 32upx; |
|||
color: #181818; |
|||
} |
|||
.ac-tip{ |
|||
margin-bottom: 50upx; |
|||
text-align: center; |
|||
line-height: 40upx; |
|||
font-size: 28upx; |
|||
color: #9A9A9D; |
|||
} |
|||
.ac-img{ |
|||
display: block; |
|||
margin: 0 auto; |
|||
width: 488upx; |
|||
height: 416upx; |
|||
} |
|||
.ac-btns{ |
|||
padding: 60upx 56upx 80upx; |
|||
@include centerFlex(space-between); |
|||
.ab-btn{ |
|||
height: 88upx; |
|||
width: 240upx; |
|||
line-height: 84upx; |
|||
text-align: center; |
|||
border: 2upx solid #C9C9CB; |
|||
border-radius: 44upx; |
|||
font-size: 28upx; |
|||
color: #9a9a9d; |
|||
&+.ab-btn{ |
|||
background-color: $themeColor; |
|||
border-color: $themeColor; |
|||
color: #fff; |
|||
} |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
} |
|||
</style> |
@ -0,0 +1,12 @@ |
|||
export const ORIGIN = ``; // 测试
|
|||
// export const ORIGIN = ``; // 正式
|
|||
|
|||
export const API = { |
|||
ex: `${ORIGIN}/test/test`, |
|||
} |
|||
|
|||
|
|||
export default { ORIGIN, API }; |
|||
|
|||
|
|||
|
@ -0,0 +1,91 @@ |
|||
import util from '../utils/util'; |
|||
// import { app as vm } from '../main';
|
|||
const islog = true; |
|||
|
|||
export class Server { |
|||
request(url,data,method,header,isDefaultGet,failMsg){ |
|||
return new Promise(async (rs,rj)=>{ |
|||
// const _store = vm.$store;
|
|||
// let storeInfo = _store.state.storeInfo || null;
|
|||
// if(storeInfo)data['brand_id'] = storeInfo.brand_id;
|
|||
|
|||
const _token = uni.getStorageSync('token') || ''; |
|||
if(_token)data['token'] = _token; |
|||
if(method === 'POST'&&_token)url = url + `?token=${_token}` |
|||
uni.request({ |
|||
url, |
|||
data, |
|||
method, // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
|
|||
header: {...header}, // 设置请求的 header // {'custom-header': 'application/json'}
|
|||
success: res=>{ |
|||
if(islog)console.log('req success---->',{ |
|||
link: url, |
|||
query: data, |
|||
method: method, |
|||
data: res, |
|||
}) |
|||
if(isDefaultGet){ |
|||
if(failMsg == '')throw Error('默认回调,失败提示不能为空 key -> failMsg'); |
|||
defaultGet({ |
|||
url, |
|||
data, |
|||
res, |
|||
failMsg, |
|||
resolve: rs, |
|||
reject: rj |
|||
}); |
|||
return |
|||
} |
|||
rs(res); |
|||
}, |
|||
fail: err=>{ |
|||
if(islog)console.log('req fail---->',{ |
|||
link: url, |
|||
query: data, |
|||
method: method, |
|||
data: err, |
|||
}) |
|||
util.hideLoad(); |
|||
if(typeof(err.errMsg) == 'string'&&(err.errMsg.indexOf('timeout')!=-1 || err.errMsg.indexOf('interrupted')!=-1 || err.errMsg.indexOf('请求超时')!=-1)){ |
|||
util.showNone('网络超时!'); |
|||
}else if(typeof(err.errMsg) == 'string'){ |
|||
util.showNone(err.errMsg); |
|||
}else{ |
|||
util.showNone('请求数据失败!请检查当前网络状态。'); |
|||
} |
|||
rj(err); |
|||
}, |
|||
}) |
|||
}) |
|||
|
|||
function defaultGet({res,failMsg,resolve,reject,url,data}){ |
|||
if(res.data.code == 0){ |
|||
resolve(res.data.data); |
|||
}else{ |
|||
util.hideLoad(); |
|||
util.showNone(res.data.message || failMsg || ''); |
|||
reject({url,res,data}); |
|||
} |
|||
} |
|||
} |
|||
get({url,data={},header={},isDefaultGet=true,failMsg=''}){ |
|||
return this.request(url,data,'GET',header,isDefaultGet,failMsg); |
|||
} |
|||
|
|||
post({url,data={},header={'custom-header': 'application/json'},isDefaultGet=true,failMsg=''}){ |
|||
return this.request(url,data,'POST',header,isDefaultGet,failMsg); |
|||
} |
|||
|
|||
uploadFile({url,filePath,onProgressCallBack,formData={}}){ |
|||
return new Promise((rs,rj)=>{ |
|||
let uploadTask = wx.uploadFile({ |
|||
url,filePath,formData,name:'file',success:rs,fail:rj |
|||
}) |
|||
uploadTask.onProgressUpdate(res=>onProgressCallBack&&onProgressCallBack(res)) |
|||
}) |
|||
} |
|||
} |
|||
|
|||
export const servers = new Server(); |
|||
|
|||
export default { servers, Server }; |
@ -0,0 +1,151 @@ |
|||
<template> |
|||
<view class="feedback-container"> |
|||
<view class="fc-textarea"> |
|||
<textarea placeholder="请输入您的反馈、建议或者发现的问题"></textarea> |
|||
</view> |
|||
<view class="fc-tit"><text>上传照片</text>(最多上传3张,只支持.jpg、png 格式)</view> |
|||
<view class="fc-imgs"> |
|||
<view class="fi-item" v-for="i in 5" :key="i"> |
|||
<image class="fi-img"></image> |
|||
<image class="fi-close"></image> |
|||
</view> |
|||
<view class="fi-item fi-add"> |
|||
<view></view> |
|||
<view>上传照片</view> |
|||
</view> |
|||
</view> |
|||
<view class="fc-fixed-bar"> |
|||
<view hover-class="hover-active">保存</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
|
|||
} |
|||
</script> |
|||
|
|||
<style lang='scss'> |
|||
@import '~style/public.scss'; |
|||
page{ |
|||
background-color: #fff; |
|||
} |
|||
.feedback-container{ |
|||
padding-top: 44upx; |
|||
padding-bottom: 108upx; |
|||
padding-bottom: calc( 108upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 108upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
.fc-textarea{ |
|||
padding: 20upx; |
|||
margin: 0 auto 36upx; |
|||
width: 692upx; |
|||
height: 360upx; |
|||
border-radius: 10upx; |
|||
border: 2upx solid #D8D8D8; |
|||
>textarea{ |
|||
width: 100%; |
|||
height: 100%; |
|||
font-size: 28upx; |
|||
line-height: 40upx; |
|||
color: #1a1a1a; |
|||
} |
|||
} |
|||
.fc-tit{ |
|||
padding: 0 30upx; |
|||
margin-bottom: 24upx; |
|||
line-height: 44upx; |
|||
font-size: 24upx; |
|||
color: #9a9a9d; |
|||
@include textHide(1); |
|||
>text{ |
|||
font-size: 32upx; |
|||
color: #333; |
|||
} |
|||
} |
|||
.fc-imgs{ |
|||
padding-left: 6upx; |
|||
font-size: 0; |
|||
.fi-item{ |
|||
position: relative; |
|||
margin: 0 24upx 24upx; |
|||
display: inline-block; |
|||
width: 200upx; |
|||
height: 200upx; |
|||
background-color: skyblue; |
|||
border-radius: 10upx; |
|||
overflow: hidden; |
|||
&.fi-add{ |
|||
padding-top: 36upx; |
|||
>view{ |
|||
&:first-child{ |
|||
position: relative; |
|||
margin: 0 auto 30upx; |
|||
width: 60upx; |
|||
height: 60upx; |
|||
&::before{ |
|||
content: ''; |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%, -50%); |
|||
width: 60upx; |
|||
height: 4upx; |
|||
background-color: #d8d8d8; |
|||
|
|||
} |
|||
&::after{ |
|||
content: ''; |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%, -50%); |
|||
height: 60upx; |
|||
width: 4upx; |
|||
background-color: #d8d8d8; |
|||
|
|||
} |
|||
} |
|||
&+view{ |
|||
text-align: center; |
|||
font-size: 28upx; |
|||
color: #9a9a9d; |
|||
} |
|||
} |
|||
} |
|||
.fi-img{ |
|||
width: 100%; |
|||
height: 100%; |
|||
background-color: slateblue; |
|||
} |
|||
.fi-close{ |
|||
position: absolute; |
|||
right: 6upx; |
|||
top: 6upx; |
|||
width: 40upx; |
|||
height: 40upx; |
|||
background-color: red; |
|||
} |
|||
} |
|||
} |
|||
.fc-fixed-bar{ |
|||
position: fixed; |
|||
width: 100%; |
|||
left: 0; |
|||
bottom: 0; |
|||
padding: 10upx 20upx; |
|||
padding-bottom: calc( 10upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 10upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
>view{ |
|||
height: 88upx; |
|||
line-height: 88upx; |
|||
text-align: center; |
|||
border-radius: 44upx; |
|||
font-size: 32upx; |
|||
background-color: $themeColor; |
|||
color: #fff; |
|||
|
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -1,49 +1,215 @@ |
|||
<template> |
|||
<view class="content"> |
|||
<image class="logo" src="/static/logo.png"></image> |
|||
<view> |
|||
<text class="title">{{title}}</text> |
|||
<view class="index-container"> |
|||
<view class="ic-header"> |
|||
<!-- <button hover-class="hover-active">前往登录</button> --> |
|||
<view class="ih-store-name"> |
|||
<view>广州欧轩智能场馆(共6家)</view> |
|||
<image></image> |
|||
</view> |
|||
<view class="ih-tip">本月课时</view> |
|||
<view class="ih-num">0</view> |
|||
</view> |
|||
<view class="ic-notice"> |
|||
<view class="in-left"> |
|||
<image></image> |
|||
<text>欧轩智能场馆商家助手上线啦!</text> |
|||
</view> |
|||
<view class="in-right"> |
|||
<view>99</view> |
|||
<image></image> |
|||
</view> |
|||
</view> |
|||
<view class="ic-tab-section"> |
|||
<view class="its-item" v-for="e in 8" :key="e"> |
|||
<image></image> |
|||
<view>我的课程</view> |
|||
</view> |
|||
</view> |
|||
<view class="ic-feedback"> |
|||
<view class="if-right"> |
|||
<image></image> |
|||
<text>在线反馈</text> |
|||
</view> |
|||
<image></image> |
|||
</view> |
|||
<authorize-modal v-if="false"></authorize-modal> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import authorize_modal from '../../components/authorize_modal/authorize_modal'; |
|||
export default { |
|||
data() { |
|||
return { |
|||
title: 'Hello' |
|||
} |
|||
components: { |
|||
'authorize-modal': authorize_modal |
|||
}, |
|||
onLoad() { |
|||
data(){ |
|||
return { |
|||
|
|||
} |
|||
}, |
|||
methods: { |
|||
|
|||
onLoad(){ |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style> |
|||
.content { |
|||
display: flex; |
|||
flex-direction: column; |
|||
align-items: center; |
|||
justify-content: center; |
|||
} |
|||
|
|||
.logo { |
|||
height: 200rpx; |
|||
width: 200rpx; |
|||
margin: 200rpx auto 50rpx auto; |
|||
} |
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
.index-container{ |
|||
padding-top: 24upx; |
|||
padding: 24upx; |
|||
.ic-header{ |
|||
padding-top: 66upx; |
|||
margin-bottom: 24upx; |
|||
height: 364upx; |
|||
border-radius: 10upx; |
|||
background-color: $themeColor; |
|||
button{ |
|||
margin: 0 auto 42upx; |
|||
padding: 0; |
|||
width: 160upx; |
|||
line-height: 40upx; |
|||
height: 40upx; |
|||
text-align: center; |
|||
border-radius: 20upx; |
|||
border: none; |
|||
font-size: 28upx; |
|||
background-color: #fff; |
|||
color: $themeColor; |
|||
} |
|||
.ih-store-name{ |
|||
margin-top: 22upx; |
|||
margin-bottom: 10upx; |
|||
@include centerFlex(center); |
|||
>view{ |
|||
max-width: 80%; |
|||
line-height: 50upx; |
|||
text-align: center; |
|||
font-size: 36upx; |
|||
font-weight: 500; |
|||
color: #fff; |
|||
@include textHide(1); |
|||
} |
|||
>image{ |
|||
margin-left: 20upx; |
|||
width: 28upx; |
|||
height: 28upx; |
|||
background-color: skyblue; |
|||
} |
|||
} |
|||
.ih-tip{ |
|||
text-align: center; |
|||
line-height: 40upx; |
|||
font-size: 28upx; |
|||
color: rgba($color: #fff, $alpha: .7); |
|||
} |
|||
.ih-num{ |
|||
padding: 0 20upx; |
|||
font-size: 104upx; |
|||
text-align: center; |
|||
line-height: 146upx; |
|||
font-weight: 600; |
|||
color: #fff; |
|||
@include textHide(1); |
|||
} |
|||
} |
|||
@mixin sec{ |
|||
margin-bottom: 24upx; |
|||
border-radius: 10upx; |
|||
background-color: #fff; |
|||
} |
|||
.ic-notice{ |
|||
padding: 0 24upx; |
|||
height: 108upx; |
|||
@include sec; |
|||
@include centerFlex(space-between); |
|||
.in-left{ |
|||
flex-shrink: 0; |
|||
flex-grow: 1; |
|||
font-size: 28upx; |
|||
color: #1a1a1a; |
|||
@include textHide(1); |
|||
>image{ |
|||
vertical-align: middle; |
|||
width: 52upx; |
|||
height: 52upx; |
|||
margin-right: 10upx; |
|||
background-color: skyblue; |
|||
} |
|||
|
|||
.text-area { |
|||
display: flex; |
|||
justify-content: center; |
|||
} |
|||
} |
|||
.in-right{ |
|||
@include centerFlex(flex-end); |
|||
>view{ |
|||
margin-right: 14upx; |
|||
width: 40upx; |
|||
height: 40upx; |
|||
border-radius: 50%; |
|||
background-color: #EA5061; |
|||
line-height: 40upx; |
|||
text-align: center; |
|||
font-size: 24upx; |
|||
color: #fff; |
|||
@include textHide(1); |
|||
} |
|||
>image{ |
|||
flex-shrink: 0; |
|||
width: 28upx; |
|||
height: 28upx; |
|||
background-color: skyblue; |
|||
} |
|||
} |
|||
} |
|||
.ic-tab-section{ |
|||
padding: 10upx 0; |
|||
font-size: 0; |
|||
@include sec; |
|||
.its-item{ |
|||
display: inline-block; |
|||
padding: 30upx 10upx; |
|||
width: 33.33%; |
|||
height: auto; |
|||
>image{ |
|||
background-color: skyblue; |
|||
margin: 0 auto 20upx; |
|||
display: block; |
|||
width: 52upx; |
|||
height: 52upx; |
|||
} |
|||
>view{ |
|||
text-align: center; |
|||
height: 40upx; |
|||
line-height: 40upx; |
|||
font-size: 28upx; |
|||
color: #1a1a1a; |
|||
@include textHide(1); |
|||
} |
|||
} |
|||
} |
|||
.ic-feedback{ |
|||
padding: 0 24upx; |
|||
height: 108upx; |
|||
@include sec; |
|||
@include centerFlex(space-between); |
|||
.if-right{ |
|||
font-size: 28upx; |
|||
line-height: 40upx; |
|||
color: #1a1a1a; |
|||
@include textHide(1); |
|||
>image{ |
|||
vertical-align: middle; |
|||
margin-right: 16upx; |
|||
width: 52upx; |
|||
height: 52upx; |
|||
background-color: skyblue; |
|||
} |
|||
} |
|||
>image{ |
|||
flex-shrink: 0; |
|||
flex-grow: 0; |
|||
width: 28upx; |
|||
height: 28upx; |
|||
background-color: skyblue; |
|||
} |
|||
} |
|||
|
|||
.title { |
|||
font-size: 36rpx; |
|||
color: #8f8f94; |
|||
} |
|||
</style> |
@ -0,0 +1,205 @@ |
|||
<template> |
|||
<view class="login-container"> |
|||
<view class="lc-header"> |
|||
<view class="lh-logo"></view> |
|||
<view class="lh-name">欧轩智能场馆</view> |
|||
</view> |
|||
<view class="lc-form"> |
|||
<view class="lf-frame"><input placeholder="请输入品牌ID" v-model="formData.brand_id" /></view> |
|||
<view class="lf-frame"><input placeholder="请输入账号" v-model="formData.account" /></view> |
|||
<view class="lf-frame"><input placeholder="请输入密码" v-model="formData.password" password /></view> |
|||
</view> |
|||
|
|||
<button |
|||
class="lf-btn" |
|||
hover-class="hover-active" |
|||
open-type="getUserInfo" |
|||
lang="zh_CN" |
|||
@getuserinfo="submitBtn" |
|||
>登录</button> |
|||
<!-- <view class="lf-tip">提示:请联系管理员添加您为员工账号</view> |
|||
<view class="lf-bot-btn" @click="toWebView">成为商家</view> --> |
|||
|
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
import { API } from '../../js/api'; |
|||
import { servers } from '../../js/server'; |
|||
import util from '../../utils/util'; |
|||
const uniGetSetting = util.promisify(uni.getSetting); |
|||
const uniLogin = util.promisify(uni.login); |
|||
const APPID = ''; |
|||
export default { |
|||
data(){ |
|||
return { |
|||
formData: { |
|||
brand_id: '', |
|||
account: '', |
|||
password: '', |
|||
} |
|||
} |
|||
}, |
|||
methods: { |
|||
async submitBtn(userRes){ |
|||
try{ |
|||
util.showLoad(); |
|||
if(!userRes.detail.userInfo){ |
|||
util.hideLoad(); |
|||
return util.showNone('获取用户信息失败!请稍后重试'); |
|||
} |
|||
|
|||
let loginRes = await uniLogin(); |
|||
|
|||
if(!loginRes.code){ |
|||
util.hideLoad(); |
|||
return util.showNone('获取登陆凭证失败!稍后重试'); |
|||
} |
|||
let userInfo = userRes.detail || {}; |
|||
console.log(userRes) |
|||
let { formData } = this; |
|||
servers.post({ |
|||
url: API.WechatMiniApplogin, |
|||
data: { |
|||
appid: APPID, |
|||
code: loginRes.code, |
|||
encryptedData: userInfo.encryptedData, |
|||
// is_details: 1, |
|||
// 后端解密错误,直接传用户信息 |
|||
user_info: userInfo.userInfo, |
|||
user_raw_data: userInfo.rawData, |
|||
...userInfo.userInfo, |
|||
username: formData.account, |
|||
password: formData.password, |
|||
brand_id: formData.brand_id, |
|||
}, |
|||
isDefaultGet: false, |
|||
}) |
|||
.then(res=>{ |
|||
util.hideLoad(); |
|||
let _data = res.data || {}; |
|||
if(_data.code == 0){ |
|||
util.showNone(_data.message || '操作成功!'); |
|||
|
|||
uni.setStorageSync('token',_data.data); |
|||
setTimeout(_=>{ |
|||
util.routeTo(`/pages/index/index`, 'rL'); |
|||
}, 1200); |
|||
}else{ |
|||
util.showNone(_data.message || '操作失败!'); |
|||
} |
|||
|
|||
}) |
|||
.catch(util.hideLoad) |
|||
}catch(err){ |
|||
util.hideLoad(); |
|||
console.warn('login err', err); |
|||
} |
|||
}, |
|||
toWebView(){ |
|||
util.routeTo(`/pages/web_view/web_view`,'rL'); |
|||
} |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
page{ |
|||
background-color: #fff; |
|||
} |
|||
.login-container{ |
|||
padding-bottom: 0; |
|||
padding-bottom: calc( 0 + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 0 + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
.lc-header{ |
|||
position: relative; |
|||
padding-top: 70upx; |
|||
margin-bottom: 46upx; |
|||
height: 390upx; |
|||
width: 100%; |
|||
overflow: hidden; |
|||
&::before{ |
|||
content: ''; |
|||
display: block; |
|||
position: absolute; |
|||
left: 50%; |
|||
bottom: 0upx; |
|||
z-index: -1; |
|||
transform: translateX(-50%); |
|||
background-color: $themeColor; |
|||
width: 3000upx; |
|||
height: 3000upx; |
|||
border-radius: 50%; |
|||
} |
|||
.lh-logo{ |
|||
margin: 0 auto 20upx; |
|||
width: 170upx; |
|||
height: 170upx; |
|||
border-radius: 50%; |
|||
background-color: #fff; |
|||
overflow: hidden; |
|||
>image{ |
|||
width: 100%; |
|||
height: 100%; |
|||
} |
|||
} |
|||
.lh-name{ |
|||
padding: 0 24upx; |
|||
text-align: center; |
|||
line-height: 50upx; |
|||
font-weight: 500; |
|||
font-size: 36upx; |
|||
color: #fff; |
|||
} |
|||
} |
|||
.lc-form{ |
|||
margin-bottom: 80upx; |
|||
.lf-frame{ |
|||
margin: 0 auto 24upx; |
|||
padding: 0 20upx; |
|||
width: 610upx; |
|||
height: 108upx; |
|||
border: 2upx solid #dddddd; |
|||
border-radius: 54upx; |
|||
>input{ |
|||
width: 100%; |
|||
height: 100%; |
|||
text-align: center; |
|||
font-size: 32upx; |
|||
color: #333; |
|||
} |
|||
&:last-child{ |
|||
margin-bottom: 0; |
|||
} |
|||
} |
|||
} |
|||
.lf-btn{ |
|||
margin-bottom: 16upx; |
|||
width: 610upx; |
|||
height: 108upx; |
|||
border-radius: 54upx; |
|||
border: none; |
|||
background-color: $themeColor; |
|||
font-size: 36upx; |
|||
line-height: 108upx; |
|||
color: #fff; |
|||
} |
|||
.lf-tip{ |
|||
margin-bottom: 120upx; |
|||
text-align: center; |
|||
line-height: 40upx; |
|||
text-align: center; |
|||
font-size: 28upx; |
|||
color: #9A9A9D; |
|||
} |
|||
.lf-bot-btn{ |
|||
margin-bottom: 20upx; |
|||
line-height: 40upx; |
|||
text-align: center; |
|||
font-size: 28upx; |
|||
color: $themeColor; |
|||
text-decoration: underline; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,94 @@ |
|||
<template> |
|||
<view class="message-list"> |
|||
<view class="ml-item" v-for="i in 10" :key="i"> |
|||
<view class="mi-tit"> |
|||
<view class="mt-name" > |
|||
<view :class="[i==5?'active':'']">欧轩智能商家助手功能更新</view> |
|||
</view> |
|||
<view class="mt-date">2020/11/23</view> |
|||
</view> |
|||
<view class="mi-desc"> |
|||
<view>喜欢喜欢需和许 i 会修 hi 休闲鞋被选行啊学…休闲鞋被选行啊学…休闲鞋被选行啊学…</view> |
|||
<image></image> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
|
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
@import '~style/public.scss'; |
|||
page{ |
|||
background-color: #fff; |
|||
} |
|||
.message-list{ |
|||
padding-left: 24upx; |
|||
padding-bottom: 24upx; |
|||
padding-bottom: calc( 24upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */ |
|||
padding-bottom: calc( 24upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */ |
|||
.ml-item{ |
|||
padding: 54upx 24upx 40upx 0; |
|||
border-bottom: 2upx solid #D8D8D8; |
|||
.mi-tit{ |
|||
margin-bottom: 20upx; |
|||
@include centerFlex(space-between); |
|||
.mt-name{ |
|||
position: relative; |
|||
flex-shrink: 1; |
|||
min-width: 0; |
|||
&::after{ |
|||
content: ''; |
|||
position: absolute; |
|||
right: -16upx; |
|||
top: 6upx; |
|||
width: 12upx; |
|||
height: 12upx; |
|||
border-radius: 50%; |
|||
background-color: #FF4444; |
|||
} |
|||
>view{ |
|||
line-height: 44upx; |
|||
font-size: 32upx; |
|||
color: #333; |
|||
@include textHide(1); |
|||
&.active{ |
|||
color: #9A9A9D; |
|||
} |
|||
} |
|||
} |
|||
.mt-date{ |
|||
flex-shrink: 0; |
|||
flex-grow: 0; |
|||
max-width: 50%; |
|||
margin-left: 24upx; |
|||
font-size: 28upx; |
|||
color: #9a9a9d; |
|||
@include textHide(1); |
|||
} |
|||
} |
|||
.mi-desc{ |
|||
@include centerFlex(space-between); |
|||
>view{ |
|||
flex-grow: 1; |
|||
flex-shrink: 0; |
|||
max-width: 80%; |
|||
font-size: 24upx; |
|||
line-height: 34upx; |
|||
color: #9a9a9d; |
|||
@include textHide(1); |
|||
} |
|||
>image{ |
|||
flex-shrink: 0; |
|||
width: 32upx; |
|||
height: 32upx; |
|||
background-color: skyblue; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</style> |
After Width: 488 | Height: 416 | Size: 14 KiB |
Before Width: 72 | Height: 72 | Size: 3.9 KiB |
@ -0,0 +1,16 @@ |
|||
// 异步方法
|
|||
import { servers } from '../js/server'; |
|||
import { API } from '../js/api'; |
|||
export default { |
|||
getBrandInfo({commit, state}){ |
|||
return servers.get({ |
|||
url: API.calc, |
|||
data: {}, |
|||
failMsg: '加载数据失败!' |
|||
}) |
|||
.then(res=>{ |
|||
commit('setBrandInfo',res); |
|||
return res; |
|||
}) |
|||
} |
|||
} |
@ -0,0 +1,54 @@ |
|||
import Vue from 'vue'; |
|||
import Vuex from 'vuex'; |
|||
import mutations from './mutations'; |
|||
import actions from './actions'; |
|||
import device from './device'; |
|||
Vue.use(Vuex); |
|||
|
|||
export default new Vuex.Store({ |
|||
modules: { |
|||
device |
|||
}, |
|||
state: { |
|||
// #ifdef H5
|
|||
APPID: uni.getAccountInfoSync().miniProgram.appId, |
|||
// #endif
|
|||
brandInfo: { |
|||
brand: {} |
|||
}, |
|||
permissionObj: { // 权限代号对应
|
|||
'1001': '营业额', |
|||
'1002': '收款记录', |
|||
'1003': '经营分析', |
|||
'1004': '预约订单', |
|||
'1005': '会员卡订单', |
|||
'1006': '积分订单', |
|||
'1007': '员工管理', |
|||
'1008': '查询核销', |
|||
'1009': '场地管理', |
|||
'1010': '设备管理', |
|||
}, |
|||
|
|||
// 场地占用提交页面信息
|
|||
occupyInfo: { |
|||
storeInfo: {}, // 店铺信息
|
|||
dateInfo: {}, // 时间信息
|
|||
typeInfo: {}, // 球场类型
|
|||
venueList: [], // 选择场地列表
|
|||
} |
|||
}, |
|||
mutations, |
|||
actions, |
|||
getters: { |
|||
permissionArr: state=>{ |
|||
let _arr = [], _obj = state.permissionObj; |
|||
for(let key in _obj){ |
|||
_arr.push({ |
|||
key, |
|||
name: _obj[key], |
|||
}) |
|||
} |
|||
return _arr; |
|||
} |
|||
} |
|||
}); |
@ -0,0 +1,15 @@ |
|||
// 同步方法
|
|||
|
|||
|
|||
export default { |
|||
// 设置品牌信息
|
|||
setBrandInfo(state, brandInfo){ |
|||
// console.log(storeInfo,'-----')
|
|||
state.brandInfo = brandInfo |
|||
}, |
|||
|
|||
// 场地占用信息
|
|||
setOccupyInfo(state, _occupyInfo){ |
|||
state.occupyInfo = _occupyInfo; |
|||
} |
|||
} |
@ -0,0 +1,89 @@ |
|||
@charset "utf-8"; |
|||
|
|||
$themeColor: #009874; |
|||
|
|||
/*每个页面公共css */ |
|||
/* view,scroll-view,text,picker{ |
|||
box-sizing: border-box; |
|||
} */ |
|||
|
|||
@mixin textHide($line) { |
|||
display: -webkit-box; |
|||
word-break: break-all; |
|||
text-overflow: ellipsis; |
|||
overflow: hidden; |
|||
-webkit-box-orient: vertical; |
|||
-webkit-line-clamp:$line; |
|||
} |
|||
|
|||
@mixin centerFlex($justtify){ |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: $justtify; |
|||
} |
|||
|
|||
@mixin botLine{ |
|||
border-bottom: 2upx solid #e5e5e5; |
|||
} |
|||
|
|||
@mixin picBgc{ |
|||
background-color: #f9f9f9; |
|||
} |
|||
|
|||
|
|||
@mixin closeIcon($width,$height,$color) { |
|||
transform: rotateZ(45deg); |
|||
&::before{ |
|||
content: ''; |
|||
display: block; |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%,-50%); |
|||
width: $width; |
|||
height: $height; |
|||
background-color: $color; |
|||
border-radius: $height; |
|||
} |
|||
&::after{ |
|||
content: ''; |
|||
display: block; |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%,-50%); |
|||
width: $height; |
|||
height: $width; |
|||
background-color: $color; |
|||
border-radius: $height; |
|||
} |
|||
} |
|||
|
|||
@mixin hover { |
|||
position: relative; |
|||
overflow: hidden; |
|||
&::after{ |
|||
content: ''; |
|||
position: absolute; |
|||
left: 0; |
|||
right: 0; |
|||
top: 0; |
|||
bottom: 0; |
|||
z-index: 2; |
|||
background-color: rgba(0,0,0,.1); |
|||
} |
|||
} |
|||
|
|||
@mixin arrowIcon($size,$line,$radius,$angle,$color) { |
|||
&::after{ |
|||
content:''; |
|||
display: inline-block; |
|||
vertical-align: middle; |
|||
transform: rotateZ($angle); |
|||
width: $size; |
|||
height: $size; |
|||
border-right: $line solid $color; |
|||
border-bottom: $line solid $color; |
|||
border-bottom-right-radius: $radius; |
|||
} |
|||
} |
@ -0,0 +1,338 @@ |
|||
// import {emojiMap,emojiUrl} from './emojiMap';
|
|||
|
|||
export const phoneReg = new RegExp(/^1(3|4|5|6|7|8|9)\d{9}$/); |
|||
export const mailReg = new RegExp(/^\w+((.\w+)|(-\w+))@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+).[A-Za-z0-9]+$/); |
|||
export const specialReg = new RegExp("[^a-zA-Z0-9\_\u4e00-\u9fa5]","i"); |
|||
|
|||
export const formatTime = date => { |
|||
const year = date.getFullYear() |
|||
const month = date.getMonth() + 1 |
|||
const day = date.getDate() |
|||
const hour = date.getHours() |
|||
const minute = date.getMinutes() |
|||
const second = date.getSeconds() |
|||
|
|||
return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':') |
|||
} |
|||
|
|||
export const formatDate = ({ date= new Date(), partition= '-' }) => { |
|||
let _date; |
|||
if(typeof (date) === 'string'&&date.indexOf('-')!=-1){ |
|||
_date = new Date(date.replace(/\-/g,'/')) |
|||
}else{ |
|||
_date = new Date(date) |
|||
} |
|||
const year = _date.getFullYear(); |
|||
const month = formatNumber(_date.getMonth() + 1); |
|||
const day = formatNumber(_date.getDate()); |
|||
|
|||
if(partition == 'zh')return `${year}年${month}月${day}日` |
|||
return [year, month, day].map(formatNumber).join(partition); |
|||
} |
|||
|
|||
export const formatNumber = n => { |
|||
n = n.toString() |
|||
return n[1] ? n : '0' + n |
|||
} |
|||
// 路由跳转
|
|||
export const routeTo = (url,type) => { |
|||
switch(type){ |
|||
case 'nT': uni.navigateTo({url}); |
|||
break |
|||
case 'rT': uni.redirectTo({url}); |
|||
break |
|||
case 'rL': uni.reLaunch({url}); |
|||
break |
|||
case 'sT': uni.switchTab({url}); |
|||
break |
|||
default: uni.navigateBack({delta: 1}) |
|||
break |
|||
} |
|||
} |
|||
|
|||
function showNone(txt,duration=1500){ |
|||
uni.hideToast(); |
|||
uni.hideLoading(); |
|||
uni.showToast({ |
|||
mask: true, |
|||
title: txt, |
|||
icon: 'none', |
|||
duration, |
|||
}) |
|||
} |
|||
|
|||
function showLoad(title='加载中', mask=true){ |
|||
uni.showLoading({ |
|||
mask, |
|||
title, |
|||
}) |
|||
} |
|||
function hideLoad(){ |
|||
uni.hideLoading() |
|||
} |
|||
function showModal({ |
|||
title='提示', |
|||
content='', |
|||
showCancel=false, |
|||
cancelText='取消', |
|||
confirmText='确定', |
|||
confirmColor='#009874', |
|||
success, |
|||
fail, |
|||
complete |
|||
}){ |
|||
uni.showModal({ |
|||
title, |
|||
content, |
|||
showCancel, |
|||
cancelText, |
|||
confirmColor, |
|||
confirmText, |
|||
success, |
|||
fail, |
|||
complete |
|||
}) |
|||
} |
|||
|
|||
function debounce(func, wait, immediate) { |
|||
let timeout, args, context, timestamp, result; |
|||
const later = function() { |
|||
// 据上一次触发时间间隔
|
|||
const last = +new Date() - timestamp; |
|||
// 上次被包装函数被调用时间间隔last小于设定时间间隔wait
|
|||
if (last < wait && last > 0) { |
|||
timeout = setTimeout(later, wait - last); |
|||
} else { |
|||
timeout = null; |
|||
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
|
|||
if (!immediate) { |
|||
result = func.apply(context, args); |
|||
if (!timeout) context = args = null; |
|||
} |
|||
} |
|||
} |
|||
return function(...args) { |
|||
context = this; |
|||
timestamp = +new Date(); |
|||
const callNow = immediate && !timeout; |
|||
// 如果延时不存在,重新设定延时
|
|||
if (!timeout) timeout = setTimeout(later, wait); |
|||
if (callNow) { |
|||
result = func.apply(context, args); |
|||
context = args = null; |
|||
} |
|||
return result; |
|||
} |
|||
} |
|||
|
|||
function jsonStr(data){ |
|||
return encodeURIComponent(JSON.stringify(data)) |
|||
} |
|||
function jsonPar(json){ |
|||
return JSON.parse(decodeURIComponent(json)) |
|||
} |
|||
|
|||
export let promisify = api => { |
|||
return (options, ...params) => { |
|||
return new Promise((resolve, reject) => { |
|||
api(Object.assign({}, options, { success: resolve, fail: reject }), ...params); |
|||
}); |
|||
} |
|||
} |
|||
|
|||
function previousPageFunction({fnName,query}){ |
|||
return new Promise((rs,rj)=>{ |
|||
try{ |
|||
if(getCurrentPages().length>1){ |
|||
console.log(getCurrentPages()) |
|||
getCurrentPages()[getCurrentPages().length-2]['$vm'][fnName](query); |
|||
rs('success'); |
|||
}else{ |
|||
console.error('当前路由栈为一,无法调取上一页数据'); |
|||
rj('当前路由栈为一,无法调取上一页数据'); |
|||
} |
|||
}catch(err){ |
|||
console.error('调用上一页面栈方法失败!',err); |
|||
rj('调用上一页面栈方法失败!'); |
|||
} |
|||
}) |
|||
|
|||
} |
|||
|
|||
// 获取节点信息
|
|||
function getNodeMes(selector,_this=null){ |
|||
return new Promise(rs=>{ |
|||
let query = _this ? uni.createSelectorQuery().in(_this) : uni.createSelectorQuery(); |
|||
query.select(selector).boundingClientRect(res=>{ |
|||
rs(res) |
|||
// this.height = uni.getSystemInfoSync().windowHeight - res.height;
|
|||
}).exec() |
|||
}) |
|||
} |
|||
|
|||
export const convertBase64 = function(base64data){ |
|||
const fsm = uni.getFileSystemManager(); |
|||
const FILE_BASE_NAME = 'tmp_base64src';//临时文件名
|
|||
return new Promise((resolve, reject) => { |
|||
const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || []; //去掉 base64 的头信息:
|
|||
if (!format) { |
|||
reject(new Error('ERROR_BASE64SRC_PARSE')); |
|||
} |
|||
const filePath = `${uni.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`; |
|||
const buffer = bodyData&&uni.base64ToArrayBuffer(bodyData); //将 base64 数据转换为 ArrayBuffer 数据
|
|||
// console.log(uni.base64ToArrayBuffer(bodyData))
|
|||
fsm.writeFile({ //将 ArrayBuffer 写为本地用户路径的二进制图片文件 //图片文件路径在 uni.env.USER_DATA_PATH 中
|
|||
filePath, |
|||
data: buffer, |
|||
encoding: 'binary', |
|||
success() { |
|||
// console.log(buffer)
|
|||
resolve(filePath); |
|||
}, |
|||
fail() { |
|||
reject(new Error('ERROR_BASE64SRC_WRITE')); |
|||
}, |
|||
}); |
|||
}); |
|||
} |
|||
export function failAuthorizeTosetting(content='调用失败,请打开检查授权状态'){ |
|||
showModal({ |
|||
title:'提示', |
|||
content, |
|||
showCancel:true, |
|||
confirmText:'打开', |
|||
success:res=>{if(res.confirm)uni.openSetting()} |
|||
}) |
|||
} |
|||
|
|||
// 解析小程序码 scene 参数
|
|||
export function getSceneQuery(scene){ |
|||
const queryStr = decodeURIComponent(scene) || null; |
|||
let queryObj = queryStr.split('&').reduce((obj,el)=>{ |
|||
let arr = el.split('='); |
|||
obj[`${arr[0]}`] = arr[1]; |
|||
return obj; |
|||
},{}) || null; |
|||
return queryObj; |
|||
} |
|||
|
|||
//获取地址栏里(URL)传递的参数
|
|||
function getUrlQuery(key,url){ |
|||
var _url = decodeURI(url).split('?a=1').join(''); //剪切'?a=1'安卓兼容,再获取参数
|
|||
if(_url.indexOf(`${key}=`) !=-1){ |
|||
return _url.split(`${key}=`)[1].split('&')[0] |
|||
} |
|||
return null |
|||
} |
|||
|
|||
//获取地址字段栏信息 腾讯获取授权码时
|
|||
function getQueryString(name) { |
|||
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); |
|||
var r = window.location.search.substr(1).match(reg); |
|||
if (r != null) return (r[2]); // 编码的字符串进行解码
|
|||
return null; |
|||
} |
|||
|
|||
function getRandom(min, max) { |
|||
return Math.round(Math.random() * (max - min)) + min; |
|||
} |
|||
|
|||
export function get_zh_day(date){ |
|||
if(isSameDay(new Date().getTime(),new Date(date).getTime()))return '今天' |
|||
const Arr = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; |
|||
return Arr[new Date(date).getDay()] || ''; |
|||
} |
|||
|
|||
// 判断是否同一天
|
|||
export function isSameDay(timeStampA, timeStampB) { |
|||
let dateA = new Date(timeStampA); |
|||
let dateB = new Date(timeStampB); |
|||
return (dateA.setHours(0, 0, 0, 0) == dateB.setHours(0, 0, 0, 0)); |
|||
} |
|||
|
|||
// 获取中文日期
|
|||
export function get_zh_date(date = new Date()){ |
|||
return `${new Date(date).getMonth()+1}月${new Date(date).getDate()}日` |
|||
} |
|||
|
|||
export function substrDate(date){ |
|||
if(!date)return; |
|||
return date.substr(0,10) || '-' |
|||
} |
|||
|
|||
// package 貌似为保留字,作为参数时 编译报错
|
|||
export function requestPayment(query = {}){ |
|||
showLoad(); |
|||
uni.requestPayment({ |
|||
timeStamp: query.timeStamp || '', |
|||
nonceStr: query.nonceStr || '', |
|||
package: query.package || '', |
|||
signType: query.signType || '', |
|||
paySign: query.paySign || '', |
|||
success: function(res){ |
|||
query.success&&query.success(res) |
|||
}, |
|||
fail: function(res){ |
|||
query.fail&&query.fail(res) |
|||
}, |
|||
complete: function(res){ |
|||
hideLoad(); |
|||
query.complete&&query.complete(res) |
|||
}, |
|||
}) |
|||
} |
|||
|
|||
function getQueryStr({url,name}){ |
|||
let queryArr = (url.split('?')[1] || '').split("&") || []; |
|||
// let vars = query.split("&");
|
|||
for (let i=0;i<queryArr.length;i++) { |
|||
let pair = queryArr[i].split("="); |
|||
if(pair[0] == name)return pair[1] || ''; |
|||
} |
|||
return ''; |
|||
} |
|||
|
|||
// 小程序码参数 -> '{}'
|
|||
function formatScene(sceneStr = ''){ |
|||
let scene = decodeURIComponent(sceneStr); |
|||
let queryArr = scene.split('&'); |
|||
return queryArr.reduce((obj,e,i)=>{ |
|||
let _arr = e.split('='); |
|||
obj[_arr[0]] = _arr[1]; |
|||
return obj; |
|||
},{}) || {}; |
|||
} |
|||
|
|||
function changeLowerCase(str){ |
|||
return str.toString().toLocaleLowerCase(); |
|||
} |
|||
|
|||
export default { |
|||
formatTime, |
|||
formatNumber, |
|||
formatDate, |
|||
routeTo, |
|||
showNone, |
|||
showLoad, |
|||
hideLoad, |
|||
showModal, |
|||
debounce, |
|||
jsonStr, |
|||
jsonPar, |
|||
promisify, |
|||
previousPageFunction, |
|||
getNodeMes, |
|||
failAuthorizeTosetting, |
|||
getSceneQuery, |
|||
getUrlQuery, |
|||
getQueryString, |
|||
getRandom, |
|||
get_zh_day, |
|||
isSameDay, |
|||
get_zh_date, |
|||
substrDate, |
|||
requestPayment, |
|||
getQueryStr, |
|||
formatScene, |
|||
changeLowerCase |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue