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
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐