basic.js
import Vue from 'vue'
import store from '@/store'
1、运行环境判断
if(process.env.NODE_ENV == 'development'){
//本地环境 development
}else{
//线上环境 production
}
2、请求方法(异步/同步)
/** 删除对象空属性
* @method deleteObjNull
* @param {Object} obj 要处理的对象
*/
const deleteObjNull=(obj)=>{
for(let key in obj){
if(obj[key]==='' || obj[key]===undefined || obj[key]===null || obj[key]=='-' || obj[key]=='NaN'){
delete obj[key];
}
}
}
/** post异步请求的方法
* @method uniRequest
* @param {String} url 请求的地址
* @param {Object} data 请求传递的参数
* @param {function} suc 成功之后调用的方法
* @param {function} err 错误调用的方法
*/
const uniRequest=(url,data,suc,err)=>{
store.commit('setVariableVal',['loadingText',Vue.prototype.loadText]); //加载提示
deleteObjNull(data); //删除请求对象空值
uni.request({
url:url,
method: 'POST',
data: data?JSON.stringify(data):'',
success: res => {
if(res.data){
store.commit('setVariableVal',['loadingText','']); //加载提示置空
if(res.data.errcode){
uni.showToast({
'title':res.data.errmsg,
'icon':'none'
})
if(err){
err(res);
}
}else{
if(suc){
suc(res);
}
}
}
},
fail:error=>{
store.commit('setVariableVal',['loadingText','']); //加载提示置空
}
});
}
/** post异步请求的方法,不提示错误
* @method uniRequest2
* @param {String} url 请求的地址
* @param {Object} data 请求传递的参数
* @param {function} suc 成功之后调用的方法
*/
const uniRequest2=(url,data,suc)=>{
deleteObjNull(data); //删除请求对象空值
uni.request({
url:url,
method: 'POST',
data: data?JSON.stringify(data):'',
success: res => {
if(res.data){
if(suc){
suc(res);
}
}
}
});
}
/** post异步promise请求的方法
* @method promiseRequest
* @param {String} url 请求的地址
* @param {Object} data 请求传递的参数
* @return {Object} promise对象
*/
const promiseRequest=(url,data)=>{
deleteObjNull(data); //删除请求对象空值
return new Promise((resolve,reject)=>{
uni.request({
url:url,
method: 'POST',
data: data?JSON.stringify(data):''
}).then(resData=>{
let [error,res]=resData;
if(res){
// 请求成功
if(res.data.errcode){
uni.showToast({
'title':res.data.errmsg,
'icon':'none'
})
}else{
resolve(res);
}
}
}).catch(err=>{})
})
}
/** post同步请求的方法
* @method awaitRequest
* @param {String} url 请求的地址
* @param {Object} data 请求传递的参数
* @return {Object} 返回请求结果
*/
const awaitRequest=async (url,data,noCue)=>{
deleteObjNull(data); //删除请求对象空值
let [error,res]=await uni.request({
url:url,
method: 'POST',
data: data?JSON.stringify(data):''
})
// 请求成功
if(res && res.data.errcode && !noCue){
uni.showToast({
'title':res.data.errmsg,
'icon':'none'
})
}else{
return res;
}
}
3、是否可以加载更多数据
/** 判断是否可以加载更多数据
* @method judgeIsLoad
* @param {Array} data 请求返回的列表数据
* @param {Number} start 开始查询位置
* @return {Array} 返回提示文字和是否可加载
*/
const judgeIsLoad=(data,start,size)=>{
let loadingText='';
let isLoad=true;
if(data==''){
if(start>0){
loadingText='没有更多了';
}else{
loadingText='暂无数据';
}
isLoad=false;
}else if(data.length>0 && data.length<size){
loadingText='没有更多了';
isLoad=false;
}else{
loadingText='';
isLoad=true;
}
store.commit('setVariableVal',['loadingText',loadingText]); //加载提示
return isLoad;
}
4、获取页面路径
// 获取页面路径
const getPagePath=()=>{
let pageArr=getCurrentPages(); //页面集合
let currPage=pageArr[pageArr.length-1]; //当前页面数据
let pageParam={}; //当前页面参数
// #ifdef H5 || APP-PLUS
pageParam=currPage.$mp?currPage.$mp.query:{};
// #endif
// #ifdef MP
pageParam=currPage.options;
// #endif
let paramStr=''; //拼接的参数
// 判断对象不为空
if(Object.keys(pageParam).length>0){
for(let item in pageParam){
paramStr+=`&${item}=${pageParam[item]}`;
}
paramStr=paramStr.replace('&',''); //去掉第一个&
}
let pagePath=`/${currPage.route}?${paramStr}`; //当前页面地址,路由+参数
return pagePath;
}
5、判断登录
/** 判断用户是否登录
* @method judgeLogin
* @param {Boolean} forcedLogin 是否需要强制登录,默认为false
* @param {Boolean} relaunch 是否关闭所有页面,再打开新页面,默认为false
*/
const judgeLogin=(forcedLogin=false,relaunch=false)=>{
if(!store.state.userInfo['id']){
uni.getStorage({
key:'userInfo',
success:(res)=>{
// 用户已登录,给vuex中的userInfo赋值,防止刷新后vuex清空
store.state.userInfo=JSON.parse(res.data);
},
fail:() => {
// 判断未登录,跳转到登录页面
if(forcedLogin){
// 强制登录
if(relaunch){
// 关闭所有页面,打开登录页,用于tabbar强制登录
uni.reLaunch({
url: '/pages/login'
})
}else{
// 打开登录页
let pagePath=encodeURIComponent(getPagePath()); //编译url
uni.redirectTo({
url: '/pages/login?pagePath='+pagePath
})
}
}else{
//未登录
}
}
})
}
}
6、退出登录
// 复制和重置state,用于退出时重置vuex值
const copyResetState=(type)=>{
if(type){
// 退出时重置
store.commit('resetState',JSON.parse(Vue.prototype.stateStr));
}else{
// main.js中初始化复制
Vue.prototype.stateStr=JSON.stringify(store.state);
}
}
// 退出登录
const userLoginOut=()=>{
copyResetState(true); //重置vuex
store.commit('setUserInfo',{});
uni.removeStorage({
key:'userInfo'
})
uni.switchTab({
url:'/pages/index'
})
}
7、验证码
/** 获取验证码
* @method getVerificationCode
* @param {String} username 手机号,用于验证号码是否合规
* @param {String} codeUrl 请求的接口地址
* @param {Object} obj 请求发送的数据
*/
const getVerificationCode=(username,codeUrl,obj,countFn)=>{
//定义表单规则
const rule = [
{name:"username", checkType : "phoneno", checkRule:"11", errorMsg:"请输入正确的手机号码"},
];
let checkRes = graceChecker.check({'username':username}, rule); //验证手机号
if(checkRes){
store.state.securityTimeDec=true;
// 发送请求获取验证码
uniRequest(codeUrl,obj,res=>{
if(countFn){
countFn();
}else{
countDown();
}
})
}else{
uni.showToast({ title: graceChecker.error, icon: "none" });
}
}
// 验证码倒计时
const countDown=()=>{
store.state.securityTime=89;
let invalId=setInterval(()=>{
//发送验证码倒计时
store.state.securityTime--;
if(store.state.securityTime==0 || !store.state.securityTimeDec){
clearInterval(invalId);
store.state.securityTime=90;
}
},1000);
}
8、格式化时间
/* 格式化时间
* @method fmtDate
* @param {String} str 时间戳字符串
* @param {String} d 日期格式,默认为时间格式,1年月日,2月日时分,3年月1号
* @return {String} 返回格式化之后的日期
*/
const fmtDate=(str,d)=>{
let dt=str?new Date(str):new Date();
let year=dt.getFullYear();
let month=fixed2(dt.getMonth()+1);
let date=fixed2(dt.getDate());
let hours=fixed2(dt.getHours());
let minutes=fixed2(dt.getMinutes());
let secounds=fixed2(dt.getSeconds());
let times='';
if(d==1){
times= `${year}-${month}-${date}`;
}else if(d==2){
times= `${month}-${date} ${hours}:${minutes}`;
}else if(d==3){
times= `${year}-${month}-01`;
}else{
times= `${year}-${month}-${date} ${hours}:${minutes}:${secounds}`;
}
return times;
}
/* 保留两位小数
* @method fixed2
* @param {String} str 需要转换的字符串
* @return {String} 返回两位小数
*/
const fixed2=(str)=>{
return Number.parseInt(str)<10?'0'+str:str;
}
9、停止当前页面下拉刷新
//停止当前页面下拉刷新
const stopPullRefresh=()=>{
setTimeout(()=>{
uni.stopPullDownRefresh();
},800)
}
10、图片预览
// 预览图片
const previewImg=(arr,current)=>{
uni.previewImage({
urls:arr,
current:current
})
}
11、向上保留两位小数
// 向上保留两位小数
const ceilFixed2=(num)=>{
let ceilNum=Math.ceil(num*100)/100;
return ceilNum.toFixed(2);
}
store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
userInfo: {}, //用户的登录信息
securityTime:90, //发送验证码倒计时
securityTimeDec:true ,//倒计时是否自减
loadingText:'' //加载提示
},
mutations: {
resetState(state,val){ //重置state
for(let item in state){
state[item]=val[item];
}
},
setVariableVal(state,option){ //统一方法设置变量值
state[option[0]]=option[1];
}
}
})
export default store