js统一公共请求处理与常用工具封装

         一个完整的前端项目往往会进行一些必要的抽取公用代码进行封装,这里记录js常用工具及统一的公共请求的封装。

一  2017年 第一版web管理后台在用

   web后台管理页面用

/**
 * Created by hua on 2017/8/24.
 */
var requestResult={
    success :0,
    failure:1,
    failureMsg:2
}

jx={
    reqAjax:function (isSync,url,fnSuccess,fnFailure) {
        $.ajax({
            type: "post",
            dataType:"json",
            async: isSync||true,
            url: url,
            success: function (data) {
                console.log(data);
                if (data.code ==requestResult.success ){
                        if ( jQuery.isFunction( fnSuccess ) ) {
                            fnSuccess.call();
                        }else{
                            alert("操作成功。");
                        }
                }else{
                    if (data.code ==requestResult.failure){
                        alert("操作失败!");
                    }
                    if (data.code ==requestResult.failureMsg){
                        if (data.errMsg!=''){
                            alert(data.errMsg);
                        }else{
                            alert("操作失败,返回信息异常!")
                        }
                    }

                    if ( jQuery.isFunction( fnFailure ) ) {
                        fnFailure.call();
                    }
                }

            },
            error:function(err){

                alert("系统请求错误,请联系管理员!");
            }
        });

    },
    req:function (url,fnSuccess) {
        jx.reqAjax(false,url, fnSuccess,null);
    },
    createNativeRequest: function createRequest()
    {
        var xmlHttp;
        try
        {
            // Firefox, Opera 8.0+, Safari
            xmlHttp=new XMLHttpRequest();
        }
        catch (e)
        {
            // Internet Explorer
            try
            {
                xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (e)
            {
                try
                {
                    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch (e)
                {
                    alert("您的浏览器不支持登陆!");
                    return false;
                }
            }
        }
        return xmlHttp;
    }
    ,nativeReq:function (async,url,param,fuSccess,fuFail) {
        console.log('using native ajax.');
       var xmlhttp= jx.createNativeRequest();
        console.log('create native xmlhttp');
        console.log(xmlhttp);
        xmlhttp.open("POST",url,async||false);// 为空时同步
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        if (!async){
            xmlhttp.send(param);
            var result= xmlhttp.responseText;
            console.log(result);
            return result;
        }else{

            xmlhttp.onreadystatechange=function state_Change() {
                if (xmlhttp.readyState==4)
                {// 4 = "loaded"
                    if (xmlhttp.status==200) {
                        if (fuSccess && typeof(fuSccess) == "function") {
                            fuSccess();
                        }
                    }else
                    {
                        if (fuFail && typeof(fuFail) == "function") {
                            fuFail();
                        }
                    }
                }
            };
            xmlhttp.send(param);

        }

    }

    };

jxCookie={
    setCookie:function (name,value)
    {   var Days = 7;
        var exp = new Date();
        exp.setTime(exp.getTime() + Days*24*60*60*1000);
         document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
    },
    getCookie:function (name)
    {
       var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
       if(arr=document.cookie.match(reg))
           return unescape(arr[2]);
        else
        return null;
    },
    delCookie:function (name)
    {
    var exp = new Date();
    exp.setTime(exp.getTime() - 1);
    var cval=getCookie(name);
    if(cval!=null)
        document.cookie= name + "="+cval+";expires="+exp.toGMTString();
     }
}

/**按钮等待进度   使用方法: jxProcess.run(butid, txtid, 1,30,'已发送成功(_sec_)')    说明:butid 和 txtid 为Input元素对象ID,1 代表每隔几秒刷新次数, 30代表等待30秒,最后的参数为等时间显示到按钮的字体动态显示参数 _sec_      **/
var jxProcess={
    cur:60,
    jqElemBut:undefined,
    jqElemTxt:undefined,
    normalButLabel:undefined,
    dyTimeLabel:undefined,
    t:undefined,
    startWait:function () {
        if (jxProcess.cur > 0){
            var label= jxProcess.dyTimeLabel.replace("_sec_",jxProcess.cur);
            jxProcess.cur--;
            jxProcess.jqElemBut.html(label);
        }else{
           jxProcess.runStop();
        }
    },
    getJqueryObjById:function(id){
        var _id="#"+id;
        return $(_id);
    },
    run:function (butId,txtId,timeSec,sumSec,dyTimeLabel) {
        var  $elemBut= jxProcess.getJqueryObjById(butId);
        var  $elemTxt=jxProcess.getJqueryObjById(txtId);
        $elemBut.attr("disabled",true);
        $elemTxt.attr("readonly",true);
        jxProcess.cur = sumSec||60;
        jxProcess.jqElemBut=$elemBut;
        jxProcess.jqElemTxt=$elemTxt;
        jxProcess.normalButLabel=$elemBut.html();
        jxProcess.dyTimeLabel=dyTimeLabel||'请耐心等待_sec_秒.'
        jxProcess.t  = window.setInterval('jxProcess.startWait()',timeSec*1000||1000);
    },
    runStop:function () {
        if (jxProcess.t!=undefined){
            jxProcess.jqElemBut.attr("disabled",false);
            if (jxProcess.jqElemTxt){
                jxProcess.jqElemTxt.attr("readonly",false);
            }
            jxProcess.jqElemBut.html(jxProcess.normalButLabel);
            window.clearInterval(jxProcess.t);
            console.log("clearInterval");
            jxProcess.t=undefined;
        }

    }

}

二  2018年,在微信小程序在使用,项目要求加密请求要用rc4算法加密。


//引用配置文件
const cfg = require('../config.js');
 
//打印调试信息
function tag(obj,msg) {
  console.log(new Date());
  console.log("==========begin("+msg+")===========")
  try {
    console.log(obj);
  } catch (e) {
    console.log('print err !!!');
  }
  console.log("==========end("+msg+")===========")
}

//封包
function getPackage(data){
  var data_str='';
  if(data){
    data_str=JSON.stringify(data);
  }
  var pack={
    appKey:'123456',
    version:'1.0.0',
    isEncrypt:'N',
    data:data_str
  }
  return pack;
}


//取得用户openid
function getOpenid(){

  var openid = getCache("openid");
  if (openid) {
    return openid;
  }

  wx.login({
    //获取code
    success: function (res) {
      var code = res.code //返回code
      var url = cfg.config.getOpenIdUrl+'&js_code=' + code + '&grant_type=authorization_code';
      tag(url,"get openid url");
     
      wx.request({
        url: url,
        data: {},
        header: {
          'content-type': 'application/json'
        },
        success: function (res) {
          if (res.data.openid){
            setCache("openid", res.data.openid);
          }
         
        }
      })

    }
  });


  return openid;

}

function setCache(key, value) {
  if (key != null && value != null) {
    try {
      wx.setStorageSync(key, value);
      tag(value, "保存缓存成功 key=" + key);
      return true;
    } catch (e) {
      tag(e, "保存到缓存失败 key=" + key + " value=" + value);
    }
  }
  return false;
}

function getCache(key) {
  var obj = null;
  if (key) {
    try {
      obj = wx.getStorageSync(key);
      tag(obj, "从缓存取 key=" + key);
    } catch (e) {
      tag(e, "从缓存取数据失败 key=" + key);
    }
  }
  return obj;
}

function isMobile(mobile) {
  var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1})|(17[0-9]{1}))+\d{8})$/;
  return myreg.test(mobile);
  
}

//显示成功信息
function show(title,icon){
  wx.showToast({
    title: title||'JX信息提示',
    icon:icon||'success',
    duration: 1500
  });
}

//显示错误信息
function showErr(title){
  show(title,'loading');
}

function getLoginToken(){
  return getCache('loginToken');
}

function setLoginToken(loginToken) {
  return setCache('loginToken', loginToken);
}

//原始处理,不对外开发
function reqPackOrg(reqUrl, pack, fnSuccess, fnFail) {
  wx.request({
    method: 'POST',
    url: reqUrl,
    data: pack,
    header: {
       'content-type': 'application/x-www-form-urlencoded',
       'Cookie': 'loginToken='+getLoginToken()
    },
    success: function (result) {
      tag(result, "结果处理");
      if (fnSuccess) {
        fnSuccess.call(result);
      } else {
        show("操作成功");
      }
    },
    fail: function (result) {
      tag(res, "调用API submit fail");
      if (fnFail) {
        fnFail.call(result);
      } else {
        showErr("操作失败!");
      }
    },
    complete: function (result) {
      tag(result, "调用API结果submit complete");
    }
  });

}

//结合后台业务处理,统一调用
function reqPack(reqUrl, pack, fnSuccess, fnFail, fnComplete){
  wx.request({
    method: 'POST',
    url: reqUrl,
    data: pack,
    header: {
      'content-type': 'application/x-www-form-urlencoded'
    },
    success: function (result) {

     var pack= result.data;
     tag(pack, "结果处理");
      
     if (pack.resultCode==200){
       var busData = pack.data;
       if (typeof busData== 'string') {
         busData = busData.replace(/\ufeff/g, "");//重点
         var jsonObj = JSON.parse(busData);
         pack.data = jsonObj;
       }
       

       if (fnSuccess) {
         if (fnSuccess.length == 1){
           fnSuccess.call(this, pack);
         }else{
           fnSuccess.call();
         }
        

       } else {
         show("操作成功");
       }
     }else{
 
       if (fnFail) {
         fnFail.call(result);
       }else{
         if (pack.resultCode && pack.resultMsg) {
           showErr( pack.resultMsg + "[" + pack.resultCode + "]");
         } else {
           showErr("处理错误!");

         }
       }


       
     } 
    },
    fail: function (result) {
    tag(res, "调用API submit fail");
    if (fnFail) {
      fnFail.call(result);
    }else{
      showErr("操作失败!");
    }
    },
    complete: function (result) {
      tag(result, "调用API结果submit complete");
      if (fnComplete){
        fnComplete.call();
      }
    }
  });

}

  function reqData(api, jsonData, fnSuccess, fnFail,fnComplete) {
    var reqUrl=cfg.config.jx_url+api;
    var pack = getPackage(jsonData);
    reqPack(reqUrl, pack, fnSuccess, fnFail, fnComplete);
  }

  function req(api, fnSuccess, fnFail) {
    var reqUrl = cfg.config.jx_url + api;
    var pack = getPackage(null);
    reqPack(reqUrl, pack, fnSuccess, fnFail,null)
  }

  



  let curUserInfo = 'curUserInfo';
  function setUserInfoCache(userInfo) {

    var memberInfo = {
      nickName: userInfo.nickName,
      org: userInfo
    };

    setCache(curUserInfo, memberInfo)
  }

  function getUserInfo(){
    return getCache(curUserInfo);
  }

//每个业务页面初始化处理
  function init(){
    var token=getLoginToken();
    tag(token,"检测在线标识状态");
    if(!token){
      wx.redirectTo({
        url: cfg.config.loginUrl
      });
    }
  }

module.exports = {
  getPackage: getPackage,
  tag: tag,
  getOpenid: getOpenid, 
  isMobile: isMobile,
  reqData: reqData,
  req:req, 
  setUserInfoCache: setUserInfoCache,
  show: show, 
  showErr: showErr,
  getLoginToken: getLoginToken,
  setLoginToken: setLoginToken,
  getUserInfo: getUserInfo,
  init: init
  }

三  2019年后,公司开始接很多的项目,小程序项目基本都用uni-app框架开发,再优化一点,根据使用情况对function request(method, reqUrl, pack, fnSuccess)去掉了失败函数传参。

"use strict";
//TestServer
//var baseUrl = 'http://192.168.22.193:8092'

//外网地址
var baseUrl = 'http://47.xx.xx.57:8063'

//线上
// var baseUrl = 'https://xcx.xxx.xxx'


//封包
function getPackage(data) {
    let data_str = '';
    if (data) {
        data_str = JSON.stringify(data);
    }
    let pack = {
			  language:1,
        isEncrypt: 'N',
        data: data_str
    }
    return pack;
}

function request(method, reqUrl, pack, fnSuccess) {
	pack = getPackage(pack);
	uni.request({
		method: method || 'POST',
		url: baseUrl + reqUrl,
		data: pack,
		header: {
			'Content-Type': 'application/x-www-form-urlencoded',
			'Authorization': getCache("token")? getCache("token") : ""
		},
		success: function(result) {
			let pack = result;

			 if (fnSuccess) {
			                if (fnSuccess.length == 1) {
			                    fnSuccess.call(this, pack);
			                } else if (fnSuccess.length == 2) {
			                    fnSuccess.call(this, pack, pack.data.data);
			                } else {
			                    fnSuccess.call();
			                }
			
			
			            } 
			            else {
			                showToast("操作成功");
			            }
		},
		fail: function(result) {
			try {
				if (result.errMsg.indexOf('request:fail') != -1) {
					alert("似乎已断开与互联网的连接");
				} else {
					alert("操作失败!");
				}
			} catch (e) {
				alert("操作失败!");
			}
		}
	})
}

function navigateTo(url) {
	uni.navigateTo({
		url: url
	});
}

function switchTab(url) {
	uni.switchTab({
		url: url
	});
}

function redirectTo(url) {
    uni.redirectTo({
        url: url
    });
}

function showToast(title, icon) {
	uni.showToast({
		title: title || '出错了',
		icon: icon || 'success',
		duration: 2000
	});
}
// alert
function alert(msg, title, success) {
    uni.showModal({
        title: '温馨提示' || title,
        content: msg,
        showCancel: false,
        confirmColor: "#000",
        success: success || {}
    })
}
//设置缓存
function setCache(key, value) {
	if (key != null && value != null) {
		try {
			uni.setStorageSync(key, value);
			// console.log('设置缓存' + key + '=' + value);
		} catch (e) {
			console.log(e, "保存缓存失败")
		}
	}
}
//取出缓存
function getCache(key) {
	var obj = null;
	if (key) {
		try {
			obj = uni.getStorageSync(key);
			// console.log("取出缓存", obj)
		} catch (e) {
			console.log(e, "取出缓存失败")
		}
	}
	return obj;
}
//分享页面
function onShareAppMessage(title,url) {
	return {
		title: title || '',
		path: 'pages/home/home'||url
	}
}
// 手机验证
function isMobile(mobile) {
    // 最新正则
    var myreg = /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/;
    return myreg.test(mobile);
}
// 身份证验证
function isId(isId) {
    var myreg = /\d{17}[\d|x]|\d{15}/;

    return myreg.test(isId);
}
// 邮箱验证
function iseMail(iseMail) {
    var myreg = /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/;

    return myreg.test(iseMail);
}
// QQ验证
function isQQ(isQQ) {
    var myreg = /^[1-9]\d{4,9}$/;

    return myreg.test(isQQ);
}
	//补全时间两位数
function prefixZero(n, m) {
				var _a = (Array(m).join(0) + n).slice(-m)
				return _a
			}
module.exports = {
	request: request,
	navigateTo: navigateTo,
	switchTab: switchTab,
	redirectTo:redirectTo,
	showToast: showToast,
	alert:	alert,
	setCache: setCache,
	getCache: getCache,
	onShareAppMessage:onShareAppMessage,
	baseUrl:baseUrl,
	isMobile:isMobile,
	isId:isId,
	iseMail:iseMail,
	isQQ:isQQ,
	prefixZero:prefixZero
}

这几年间公司加入专开发小程序的同事,这里太忙了我也没有时间怎么去关注了,后面发现他们具然所有的小程序项目都在用,而且连引用的文件名都没有改,如图:

四  2023年后小程序项目基本开始外包,查看了被外包修改后的代码,发现还是变化不大。

"use strict";



//TestServer
//var baseUrl = 'http://192.168.22.193:8888'
//外网地址
var baseUrl = 'https://xx.xx.xx.xx'
 
//线上
 // var baseUrl = 'https://xx.xx.xx'
//封包
function getPackage(data) {
    let data_str = '';
    if (data) {
        data_str = JSON.stringify(data);
    }
    let pack = {
			  language:1,
        isEncrypt: 'N',
        data: data_str
    }
    return pack;
}
//8d2df462-b665-4441-8ed5-f216c8babf53
function addImgFun(tempFilePaths,fun){
	for(var i=0;i<tempFilePaths.length;i++){
		uni.uploadFile({
			url:baseUrl+'/api/v1/file/uploadImgs', //仅为示例,非真实的接口地址
			filePath: tempFilePaths[i],
			header:{
				'Authorization': getCache("token")? getCache("token") : ""
			},
			name: 'files',
			success: (uploadFileRes) => {
				console.log(JSON.parse(uploadFileRes.data).data[0]);
				fun(JSON.parse(uploadFileRes.data).data[0])
			}
		});
	}
}



//xx测试账号
setCache("token",'9d307453-f0b1-4f7f-9a8c-41c1f803de73');

// setCache("token",'cccf7a52-855b-42d8-b5cf-d48eb7f678c2');
// setCache("token",'74bc8184-ac49-424f-9029-273cfcbfdd62');

// setCache("token",'fdd31cad-e9ce-4ad0-afc8-8c3ad42e0dc9');
function request(method, reqUrl, pack, fnSuccess,err) {

	// setCache("token",'8d2df462-b665-4441-8ed5-f216c8babf53');
	// console.log(baseUrl + reqUrl)
	if(!pack.noShowLoading){
		uni.showLoading({
			title: '加载中'
		});
		delete pack.noShowLoading;
	}
	pack = getPackage(pack);
	uni.request({
		method: method || 'POST',
		url: baseUrl + reqUrl,
		data: pack,
		header: {
			'Content-Type': 'application/x-www-form-urlencoded',
			'Authorization': getCache("token")? getCache("token") : ""
		},
		success: function(result) {
			uni.hideLoading();
			let pack = result;
			console.log("pack+++++++++",JSON.stringify(pack))
			if(pack.data.code==400){
				showToast(pack.data.msg);
				if(pack.data.failReason==1||pack.data.failReason==2||pack.data.failReason==3){
					setCache("token","");
					setTimeout(function(){
						uni.navigateTo({
							url:"/pages/home/home"
						})
					},2000)
				}else if(pack.data.failReason==26){
					setTimeout(function(){
						uni.reLaunch({
							url:"../charge/charge"
						})
					},2000)
				}else if(pack.data.failReason==12){
					setTimeout(function(){
						uni.navigateTo({
							url:"../order/order"
						})
					},2000)
				}else if(pack.data.failReason==13){
					setTimeout(function(){
						uni.navigateBack({
							delta:1
						})
					},2000)
				}
				if(err){
					err(pack);
				}
				return false;
			}else if (pack.data.code&&pack.data.code==200&&fnSuccess) {
				if (fnSuccess.length == 1) {
					fnSuccess.call(this, pack);
				} else if (fnSuccess.length == 2) {
					fnSuccess.call(this, pack, pack.data.data);
				} else {
					fnSuccess.call();
				}


			}else{
				showToast(pack.data.msg);
			} 
			// else {
			// 	showToast("操作成功");
			// }
		},
		fail: function(result) {
			uni.hideLoading();
			try {
				if (result.errMsg.indexOf('request:fail') != -1) {
					// alert("似乎已断开与互联网的连接");
				} else {
					// alert("操作失败!");
				}
			} catch (e) {
				// alert("操作失败!");
			}
		}
	})
}

function navigateTo(url) {
	uni.navigateTo({
		url: url
	});
}

function switchTab(url) {
	uni.switchTab({
		url: url
	});
}

function redirectTo(url) {
    uni.redirectTo({
        url: url
    });
}

function showToast(title, icon) {
	uni.showToast({
		title: title || '出错了',
		icon: icon || 'none',
		mask:true,
		duration: 2000
	});
}
// alert
function alert(msg, title, success) {
    uni.showModal({
        title: '温馨提示' || title,
        content: msg,
        showCancel: false,
        confirmColor: "#000",
        success: success || {}
    })
}
//设置缓存
function setCache(key, value) {
	if (key != null && value != null) {
		try {
			uni.setStorageSync(key, value);
			// console.log('设置缓存' + key + '=' + value);
		} catch (e) {
			console.log(e, "保存缓存失败")
		}
	}
}
//取出缓存
function getCache(key) {
	var obj = null;
	if (key) {
		try {
			obj = uni.getStorageSync(key);
			// console.log("取出缓存", obj)
		} catch (e) {
			console.log(e, "取出缓存失败")
		}
	}
	return obj;
}
//分享页面
function onShareAppMessage(title,url) {
	return {
		title: title || '',
		path: 'pages/home/home'||url
	}
}
// 手机验证
function isMobile(mobile) {
    // 最新正则
    var myreg = /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/;
    return myreg.test(mobile);
}
// 身份证验证
function isId(isId) {
    var myreg = /\d{17}[\d|x]|\d{15}/;

    return myreg.test(isId);
}
// 邮箱验证
function iseMail(iseMail) {
    var myreg = /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/;

    return myreg.test(iseMail);
}
// QQ验证
function isQQ(isQQ) {
    var myreg = /^[1-9]\d{4,9}$/;

    return myreg.test(isQQ);
}
	//补全时间两位数
function prefixZero(n, m) {
				var _a = (Array(m).join(0) + n).slice(-m)
				return _a
			}
	//补全时间两位数
function login(fun) {
	if(getCache("token")){
		if(fun){
			fun();
		}
	}else{
		setCache("token",'')
		uni.login({
			provider: 'weixin',
			success: function(loginRes) {
				var data = {
					code: loginRes.code
				}
				request("POST", "/api/v1/common/wxLogin", data, (res) => {
					// if (res.data.ret_code == 200) {
						setCache("token", res.data.data.token)
						setCache("memberId",res.data.data.user.id)
						if(res.data.data.user.plateNo){
							setCache("memberPlateNo",res.data.data.user.plateNo);
						}
						if(fun){
							fun();
						}
					// } else {
					// 	comm.showToast(res.data.ret_msg, "none")
					// }
				})
			}
		})
	}
}
module.exports = {
	request: request,
	navigateTo: navigateTo,
	switchTab: switchTab,
	redirectTo:redirectTo,
	showToast: showToast,
	alert:	alert,
	setCache: setCache,
	getCache: getCache,
	onShareAppMessage:onShareAppMessage,
	baseUrl:baseUrl,
	isMobile:isMobile,
	isId:isId,
	iseMail:iseMail,
	isQQ:isQQ,
	prefixZero:prefixZero,
	addImgFun:addImgFun,
	login:login,
}

小程序引入调用部分

	import comm from '../../static/data/commFunc.js'


    //方法区
             

				let that = this
                uni.showLoading({
					title:"加载中"
				})
				//参数
				var data = {
					current: that.current
				}
                
                //调用
				comm.request("POST","/app/v200801/member/order/list",data,(res) => {
					console.log("res",res)
					that.data = res.data.data.records
					that.list = that.list.concat(res.data.data.records)
					that.total = res.data.data.total
					uni.hideLoading()
				})
		

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/290379.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PTA-C语言】编程练习5 - 函数与指针

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习5 - 函数与指针 6-1 求实数和的函数&#xff08;分数 10&#xff09;6-2 求解一元二次方程实根的函数&#xff08;分数 10&#xff09;6-3 求集合数据的均方差&#xff08;分数 10&#xff09;6-4 计…

来自云仓酒庄分享为什么同一种葡萄会使用不同的名称?

如果你只是刚刚走进葡萄酒世界&#xff0c;走在葡萄酒通道上可能会令人生畏&#xff0c;因为有不同的国家、地区和生产商&#xff0c;除此之外还有数千酿酒葡萄品种。更令人困惑的是&#xff0c;有些地方对同一种葡萄使用不同的名称&#xff01;一个著名的例子是西拉和它澳大利…

Yapi安装配置(CentOs)

环境要求 nodejs&#xff08;7.6) mongodb&#xff08;2.6&#xff09; git 准备工作 清除yum命令缓存 sudo yum clean all卸载低版本nodejs yum remove nodejs npm -y安装nodejs,获取资源,安装高版本nodejs curl -sL https://rpm.nodesource.com/setup_8.x | bash - #安装 s…

免费分享:中国地下水资源分布图(附下载方法)

中国地下水资源分布图是一种展示中国各地区地下水资源丰富程度的地图。它通过不同的颜色和图案来表示地下水资源的分布情况&#xff0c;帮助我们了解中国地下水资源的分布特点和规律。 数据简介 中国地下水资源分布图展示了中国各地区地下水资源的丰富程度&#xff0c;包括地…

当老了的完美世界,押注了更老的MMO端游

​“一个测试激活码至少上千&#xff0c;还只是租号&#xff0c;只能玩几天。” 12月29日&#xff0c;完美世界重磅产品《诛仙世界》开启二测&#xff0c;斗鱼包含PPD在内等多位大主播进驻游戏&#xff0c;将游戏冲至斗鱼端游热度第一位。 游戏的测试码也被卖到了天价&#x…

移动神器RAX3000M路由器变身家庭云之四:开放LuCI管理界面,网站服务

前面已经改造成了家庭云供外网访问了。由于这个路由本来就是openwrt&#xff0c;openwrt本身的管理界面LuCI-admin很好用&#xff0c;但被屏蔽了&#xff0c;需要打开。 打开界面 ssh登录路由器&#xff0c;修改 /etc/config/uhttpd配置文件如下&#xff1a; config uhttpd …

AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

解决方案是降级您的版本&#xff1a; pip install pillow9.5.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

Liunx(CentOS)安装Nacos(单机启动,绑定Mysql)

Liunx安装Nacos(单机启动&#xff0c;绑定Mysql) 一&#xff0c;准备安装包 github下载点 二&#xff0c;在/usr/local/目录下创建一个文件夹用于上传和解压Nacos cd /usr/local/ #这里创建文件夹名字可随意&#xff0c;解压后会生成一个名为nacos的文件夹&#xff0c;后续…

CSS免费在线字体格式转换器 CSS @font-face 生成器

今天竟意外发现的一款免费的“网页字体生成器”&#xff0c;功能强大又好用~ 工具地址&#xff1a;https://transfonter.org/ 根据你设置生成后的文件预览&#xff1a; 支持TTF、OTF、WOFF、WOFF2 或 SVG字体格式转换生成&#xff0c;每个文件最大15MB。转换完成以后还会生成一…

【LeetCode每日一题】2487. 从链表中移除节点(调用栈+递归+翻转链表)

2024-1-3 文章目录 [2487. 从链表中移除节点](https://leetcode.cn/problems/remove-nodes-from-linked-list/)方法一&#xff1a;调用栈方法二&#xff1a;递归方法三&#xff1a;翻转链表 2487. 从链表中移除节点 方法一&#xff1a;调用栈 1.将所有节点按顺序压入栈中 2.从…

2020年认证杯SPSSPRO杯数学建模D题(第一阶段)让电脑桌面飞起来全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现&#xff1a; 对于一些必须每天使用电脑工作的白领来说&#xff0c;电脑桌面有着非常特殊的意义&#xff0c;通常一些频繁使用或者比较重要的图标会一直保留在桌面上&#xff0c;但是随着时间的推移&#xff0c;…

WSL2连接USB设备

准备在WSL2上继续搞点事情&#xff0c;可是当我在WSL内的Linux操作系统上连接USB存储设备时却出现了问题。本文是我解决这个问题的简单记录&#xff0c;以备后查&#xff0c;如果能够帮助到您&#xff0c;那更是我莫大的荣幸。 我的环境。 windows11 22h2WSL 2 Ubuntu 2004 w…

计算机毕业设计-----SSM在线个人PC电脑商城平台网站系统

项目介绍 该项目为前后台项目&#xff0c;分为普通用户与管理员两种角色&#xff0c;前台普通用户登录&#xff0c;后台管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,用户管理,一级分类管理,二级分类管理,商品管理,所有订单管理,留言管理,公告管理…

html中的form表单以及相关控件input、文本域、下拉select等等的详细解释 ,点赞加关注持续更新~

文章目录 表单创建表单forminput 标签input标签的value属性设置input标签格式单选框多选框上传文件下拉菜单文本域设置文本域格式label 标签按钮 表单 作用&#xff1a;收集用户信息。 使用场景&#xff1a; 登录页面注册页面搜索区域 创建表单form <form action".…

Spring 七种事务传播性介绍

作者&#xff1a;vivo 互联网服务器团队 - Zhou Shaobin 本文主要介绍了Spring事务传播性的相关知识。 Spring中定义了7种事务传播性&#xff1a; PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED…

QT上位机开发(简易图像处理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大家都知道图像处理非常地重要&#xff0c;因为它不仅仅是可以用于拍照美颜&#xff0c;而且在工业、医疗和军事等方面也发挥着巨大的作用。另外一…

Python办公自动化 – 人脸识别和自动化测试

Python办公自动化 – 人脸识别和自动化测试 以下是往期的文章目录&#xff0c;需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自动化 – 对Ex…

nodejs-day1——模块、第三方包管理

自定义模块 我们创建的每个JS文件都是一个自定义模块&#xff0c;并且具有模块作用域&#xff0c;也就是在一个模块中创建的变量、常量、函数等等一切&#xff0c;都只能在当前模块中使用 优点&#xff1a; 1.共享&#xff08;导出/暴露&#xff09;内容给其它模块用&#x…

门店总数超9000家,手握大众茶饮“下沉市场牌”的古茗冲刺上市

奶茶品牌上市潮来袭。1月2日&#xff0c;奶茶品牌古茗控股有限公司&#xff08;下称“古茗”&#xff09;、蜜雪冰城股份有限公司&#xff08;下称“蜜雪冰城”&#xff09;一同递交招股书&#xff0c;计划在港交所主板上市。 近年来&#xff0c;随着现制茶饮的爆火&#xff0…

使用pytorch搭建ResNet并基于迁移学习训练

这里的迁移学习方法是载入预训练权重的方法 net resnet34()# load pretrain weights# download url: https://download.pytorch.org/models/resnet34-333f7ec4.pthmodel_weight_path "./resnet34-pre.pth"assert os.path.exists(model_weight_path), "file {}…