浙政钉⼩程序总结
浙政钉⼩程序总结
1. 扫码进⼊浙政钉⼩程序指定页⾯后前端怎么获取到⾥⾯的参数
⾸先⽣成⼆维码的链接: taurus://taurusclient/action/open_app?
appId=0201027143446479&type=2&page=pages%2Findex%2Findex%3FqrCodeId%3D168%26appId%3D1%26appName%3D%E6%B5%8B%E8%AF%95;appId:指的是创建的⼩程序appId,type:2 表⽰⼩程序,page=“”指定进⼊的页⾯以及参数传递。page= 后⾯的字符串需要进⾏UrIEncode编码,例如:pages/index/index?qrCodeId=168&appId=1&appName=测试编码后为 pages%2findex%2findex%3fqrCodeId%3d168%26appId%3d1%26appName%3d%e6%b5%8b%e8%af%95将下划线即编码后的字符串赋值给page。此时在指定页⾯中可以直接在onLoad的函数中通过options.appId等获取参数值。
2. 下拉刷新的事件不会触发
⾸先看下当前页⾯的.json⽂件中是否配置了 "pullRefresh": true ,同时app.json中的window对象中也需要配置"allowsBounceVertical": "YES"。如果两个值都配置了还是不可以进⾏下拉刷新或上拉加载那就是
css样式问题导致了,当页⾯内容不满时不会触发上拉加载。
3. ⽣命周期中的onLaunch和Load
正常情况下,打印⽇志或⼀些静态⽅法等可以看到是先打印app.js中onLaunch然后再试onLoad函数,但是如果是异步操作,⽐如你在⼩程序运⾏时onLaunch中刷新下Token,然后在⾸页的onLoad 函数中⽤这个刷新的token是不存在的,事实上会先执⾏Load函数中的异步请求,再执⾏onLaunch中的异步请求。和vue中created 函数和mounted函数是完全不⼀样,这种情况下可以在⾸页去做onLaunch中的异步操作。
4. 获取授权码
在编辑器中调⽤⽅法my.getAuthCode().then((res)=>{ console.log(res) this.setData({ de }) })会报错,此时不要慌,因为获取这个授权码需要在真机调试中才可以获取到。同时如果⽤my.去获取取值时为de,⽤dd.getAuthCode({}).then((res) => { resolve(res) })取值为de;
5. websocket
浙政钉⼩程序中每次建⽴websocket链接都需要重新监听其相关事件,如接受消息的onSocketMessag
e,以及监听链接成功的onSocketOpen等等。
6. ⾃⼰封装的util.js分享下
状态码判断这块符合restful风格接⼝
import dd from 'gdt-jsapi';;
const ip = "192.168.0.167:8080";//龙
// const ip = "192.168.0.238:8080";//熊
// const ip = "192.168.0.37:8080";//王者
// const ip = "192.168.0.136:8080";//超
// const ip = "192.168.0.223:8080";//伟
// const ip = "192.168.0.46";//斌
const baseUrl = ""+ip;
const wsbaseUrl = "ws://"+ip+"/websocket";
/**
*
* @param {*} callback 获取免登授权码成功回调
*
*/
const getAuthCode = function () {
return new Promise((resolve, reject) => {
resolve(res)
}).catch((err) => {
reject(err)
})
})
}
/**
*
* @param {*} content 弱提⽰内容
*/
const toast = function (content) {
dd.showToast({
content: content,
})
}
// 接⼝未调通错误处理
const errMsg = function (err) {
if ( == 19) {
// toast('异常http状态码错误' + err.status)
// toast(ssage || Message)
// 处理下token失效等问题
exceptionMsg(de, err);
} else if ( == 11) {
toast('⽆权跨域')
} else if ( == 12) {
toast('⽹络出错如⽹络不通等')
} else if ( == 13) {
toast('请求超时')
} else if ( == 14) {
toast('解码失败,http请求返回的内容格式是与dataType设置的类型不⼀致')
} else {
Message)
}
};
// 针对于code码处理
const exceptionMsg = function (code, res,options) {
switch (parseInt(code)) {
case 2001:
clearStorage();
if(options){
console.log(options)
}
redirectTo('/pages/index/index')
break;
default:
toast(ssage || Message);
return false;
}
}
const existsToken = function(url){
if(!getStorage('token') && url.indexOf('/tokens')==-1){
toast('token不存在')
return false;
}else{
return true;
}
};
/
**
*
* @param {*} url 接⼝地址
* @param {*} data 所传参数
*/
const post = function (url, data, headers, options) {
headers = headers || {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Bearer ' + getStorage('token')
};
// setNewToken();
return new Promise((resolve, reject) => {
if(!existsToken(url)){
return
}
dd.httpRequest({
url: baseUrl + url,
method: "POST",
data: data,
headers: headers,
dataType: "json",
timeout: 50000
}).then(res => {
hideLoading()
dd.stopPullDownRefresh();
if (de == 0) {
resolve(res.data)
} else {
dd.stopPullDownRefresh()
reject(res.data)
exceptionMsg(de, res)
}
}).catch(err => {
hideLoading()
dd.stopPullDownRefresh()
errMsg(err)
reject(err.data)
})
})
}
/**
*
* @param {*} url 接⼝地址
* @param {*} data 所传参数
*/
const get = function (url, data, headers) {
headers = headers || {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + getStorage('token')
};
// setNewToken();
return new Promise((resolve, reject) => {
if(!existsToken(url)){
return
}
dd.httpRequest({
url: baseUrl + url,
method: "GET",
data: data,
dataType: "json",
timeout: 50000,
headers
}).then(res => {
hideLoading()
if (res.data && de == 0) {
resolve(res.data)
} else {
dd.stopPullDownRefresh()
reject(res.data)
exceptionMsg(de, res)
}
}).catch(err => {
hideLoading()
reject(err)
errMsg(err)
})
})
}
/**
* 刷新token
* */
const refreshToken = function () {
return new Promise((resolve, reject) => {
if (getStorage('expiresIn') && getStorage('token')) {
// 判断token的有效期
if ((Number(getStorage('expiresIn')) * 1000 - new Date().getTime()) < 1000 * 60 * 60 * 24 * 3) {
post('/tokens/' + getStorage('token') + '/update', {}, {}).then(res => {
clearStorage(['token'])
setStorage('expiresIn', piresIn)
setStorage('token', res.data.accessToken)
setTimeout(() => {
resolve(res)
}, 1000);
}).catch((err) => {
reject(err)
})
} else {
reject({
errorMessage: 'token未过期'
})
}
}else{
reject({
errorMessage: ''
})
}
})
}
// 跳转成功页⾯
const toSuccess = function(res){
if(res.data.success){
navigateTo('/pages/success/success?title='+ssage+'&signature='+res.data.signature) }else{
toast(ssage||ssage)
}
}
// 登录
const login = function (options) {
return new Promise((resolve, reject) => {
getAuthCode().then((res) => {
post('/tokens', {
grantType: 'mini_app',
de,
secretKey: '',
}, {
'Content-Type': 'application/x-www-form-urlencoded' },options).then(res => {
hideLoading()
resolve(res)
}).catch(err => {
hideLoading()
reject(err)
})
}).catch((err) => {
hideLoading()
Message)
})
})
}
/**
* 创建socket连接
* @param {*} url ⽬标服务器地址
* @param {*} data 请求参数
*/
const connectWebSocket = function (url, data) {
return new Promise((resolve,reject)=>{
closeSocket();
console.log(wsbaseUrl)
url: wsbaseUrl,
data: data,
header: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + getStorage('token')
},
method: "GET",
complete:function(res){
// console.log(res)
resolve(res)
}
});
})
console.log(wsbaseUrl + url)
};
/**
*
* @param {*} successBack 连接打开的成功回调函数 */
const onSocketOpen = function () {
return new Promise((resolve,reject)=>{
console.log(res)
resolve(res)
}).catch(err => {
console.log('连接打开失败')
<(err)
reject(err)
})
})
}
const onSocketError = function () {
// console.log(res)
}).catch(err => {
<(err)
})
}
/**
*
* @param {String} toSendMessage 要发送的数据
* @param {*} successBack 成功回调
*/
const sendMessage = function (toSendMessage) {
return new Promise((resolve,reject)=>{
dd.sendSocketMessage({
data: toSendMessage, // 需要发送的内容
}).then(res => {
console.log('数据发送成功' + JSON.stringify(res)) resolve(res)
}).catch(err => {
<(err)
reject(err)
})
})
}
/**
* 关闭websocket
* */
const closeSocket = function () {
dd.closeSocket({}).then(res => {
console.log(res)
}).catch(err => {
<(err)
})
}
/**
*
* @param {*} callback websocket关闭后的回调函数 */
const onSocketClose = function (callback) {
console.log('WebSocket已关闭')
callback && callback(res)
}).catch(err => {
<(err)
})
}
const onSocketMessage = function (callback) {
return new Promise((resolve,reject)=>{
console.log('收到消息'+JSON.stringify(res))
resolve(res)
}).catch(err => {
<(err)
reject(err)
js获取json的key和value})
})
}
/**
* dateStr :时间字符串类似2020-11-11T02:32:03.000 0000
* fmt 所需要返回的格式
*/
const formatDate = function (dateStr, fmt) {
let dateArr = dateStr.split('T');
let yMr = dateArr[0].split('-');
let hms = dateArr[1].split('.')[0].split(':');
if (fmt == 'ymr') {
/
/ return [...yMr];
return yMr[0] + '年' + yMr[1] + '⽉' + yMr[2] + '⽇'
} else if (fmt == 'hms') {
// return [...hms];
return hms[0] + ':' + hms[1] + ':' + hms[2]
} else if (fmt == 'ymrhms') {
// return [...yMr,...hms];
return yMr[0] + '年' + yMr[1] + '⽉' + yMr[2] + '⽇' + ' ' + hms[0] + ':' + hms[1] + ':' + hms[2] }
// return [...ymr,...hms];
}
/**
*
* @param {*} url 带参地址
* @param {*} name 获取键值对中的键
*/
const getUrlParams = function (url, name) { // 不传name返回所有值,否则返回对应值
if (url.indexOf('?') == 1) { return false; }
url = url.substr(1);
url = url.split('&');
var name = name || '';
var nameres;
// 获取全部参数及其值
for (var i = 0; i < url.length; i++) {
var info = url[i].split('=');
var obj = {};
obj[info[0]] = decodeURI(info[1]);
url[i] = obj;
}
// 如果传⼊⼀个参数名称,就匹配其值
if (name) {
for (var i = 0; i < url.length; i++) {
for (const key in url[i]) {
if (key == name) {
nameres = url[i][key];
}
}
}
} else {
nameres = url;
}
// 返回结果
return nameres;
}
//-------------------------------------、钉钉不同配置--------------------------
const token = dd.getStorageSync({ key: 'token' }).data;
/**
* 获取本地存储的值
* */
const getStorage = function (key) {
StorageSync({ key: key }).data
}
/**
* 本地存储同步
* 存储的值为number string Array类型取值时直接Storage(键名).value;
* 存储值为对象时取值为Storage(键名)
* * */
const setStorage = function (key, value) {
if (typeof (value) === 'string' || typeof (value) === 'number' || structor === Array) { dd.setStorageSync({
key: key,
data: value
});
} else {
dd.setStorageSync({
key: key,
data: {
...value
}
});
}
}
/**
* 删除本地存储中的指定值不传key则默认清空所有缓存数据
* keyArr 格式 ['key1','key2']
* */
const clearStorage = function (keyArr) {
if (keyArr && keyArr.length > 0) {
keyArr.map((element, index) => {
key: element,
});
})
} else {
dd.clearStorageSync();
}
}
/**
*
* @param {*} text 设置导航栏标题
* @param {*} background 设置导航栏背景
*/
const topBarText = function (text, background) {
if (background) {
dd.setNavigationBar({
title: text,
backgroundColor: background,
})
} else {
dd.setNavigationBar({
title: text,
})
}
}
/**
*
* @param {*} callback 扫码后的回调
*/
const scanQrCode = function (callback) {
dd.scan({
type: 'all',
}).then((res) => {
callback&&callback(res)
}).catch((err) => {
})
}
/**
*
* @param {*} content 警⽰内容
* @param {*} callback 成功回调
* @param {*} title 警⽰标题
* @param {*} failback 失败回调
*/
const alert = function (content, callback, title, failback) {
dd.alert({
message: content,
title: title || "信息提⽰",
}).then(res => {
callback && callback(res)
}).catch(err => {
failback && failback(err)
})
}
/**
*
* @param {*} url 同级跳转地址
*/
const redirectTo = function (url) {
url: url,
})
}
/**
*
* @param {*} content 加载圈提⽰内容
*/
const showLoading = function (content) {
dd.showLoading({
text: content,
})
}
// 关闭加载圈
const hideLoading = function () {
dd.hideLoading({});
}
//页⾯跳转
const navigateTo = function (url) {
dd.navigateTo({
url: url,
})
}
// 重定向
const reLaunch = function (url) {
url: url,
})
}
/
**
*
* @param {*} content 确认框提⽰内容
* @param {*} confirmText 确认按钮的⽂案
* @param {*} callback 确认的回调
*/
const confirm = function (content, confirmText, callback) {
title: "注意",
message: content,
buttonLabels: [
confirmText,
"取消"
],
}).then((result) => {
console.log(result)
if (result.buttonIndex === 0) {
callback && callback(result);
} else {
}
})
}
/
*
根据〖中华⼈民共和国国家标准 GB 11643-1999〗中有关公民⾝份号码的规定,公民⾝份号码是特征组合码,由⼗七位数字本体码和⼀位数字校验码组成。排列顺序从左⾄右依次为:六位数字地址码,⼋位数字出⽣⽇期码,三位数字顺序码和⼀位数地址码表⽰编码对象常住户⼝所在县(市、旗、区)的⾏政区划代码。
出⽣⽇期码表⽰编码对象出⽣的年、⽉、⽇,其中年份⽤四位数字表⽰,年、⽉、⽇之间不⽤分隔符。
顺序码表⽰同⼀地址码所标识的区域范围内,对同年、⽉、⽇出⽣的⼈员编定的顺序号。顺序码的奇数分给男性,偶数分给⼥性。
校验码是根据前⾯⼗七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
出⽣⽇期计算⽅法。
15位的⾝份证编码⾸先把出⽣年扩展为4位,简单的就是增加⼀个19或18,这样就包含了所有1800-1999年出⽣的⼈;
2000年后出⽣的肯定都是18位的了没有这个烦恼,⾄于1800年前出⽣的,那啥那时应该还没⾝份证号这个东东,⊙﹏⊙b汗...
下⾯是正则表达式:
出⽣⽇期1800-2099 (18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])
⾝份证正则表达式 /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i
15位校验规则 6位地址编码+6位出⽣⽇期+3位顺序号
18位校验规则 6位地址编码+8位出⽣⽇期+3位顺序号+1位校验位
校验位规则公式:∑(ai×Wi)(mod 11) (1)
公式(1)中:
i----表⽰号码字符从由⾄左包括校验码在内的位置序号;
ai----表⽰第i位置上的号码字符值;
Wi----⽰第i位置上的加权因⼦,其数值依据公式Wi=2^(n-1)(mod 11)计算得出。
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
*/
//⾝份证号合法性验证
//⽀持15位和18位⾝份证号
//⽀持地址编码、出⽣⽇期、校验位验证
const IdentityCodeValid = function (code) {
var city = { 11: "北京", 12: "天津", 13: "河北", 14: "⼭西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "⿊龙江 ", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "⼭东", 41: "河南", 42: "湖北 ", 43: "湖南", 44: "⼴东", 45: "⼴西" var tip = "";
var pass = true;
if (!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论