分类目录归档:编程技术

cordova-plugin-camera在某些android机型中拍照或选择文件时闪退出错的解决办法

cordova-plugin-camera在某些android机中会出现拍照完成时,无法进入照片编辑,导致直接闪退,特别在ionic中使用闪退后,再次进入APP,APP则直接就是重新reload了,我尝试过很多手机,比如华为、魅族等,未出现闪退问题,但是偏偏小米9se上出现了闪退,不知道其他型号的小米手机是否也会出现此问题。欢迎大家自行验证。

出现这个问题,大概原因就是当我们再拍照或者进入选择图片的时候,APP自认为我们已经退出了APP去使用拍照功能了,由此导致APP自动退出了。因此解决的方法就是当我们打开拍照的时候让当前APP处于背景运行状态即可

继续阅读cordova-plugin-camera在某些android机型中拍照或选择文件时闪退出错的解决办法

JavaScript nodeJS base64加密解密url参数

为了保证全段传递都后端的数据安全性,比如用户登录时输入的密码,在post发送请求中可能会直接暴露了明文。因此可能需要前端进行相应的加密传递到后端,再由后端进行解密后再继续操作。

我使用base64的加密方式对密码进行加密,不过大家都知道base64很容易就被破解了,因此,我会替换掉几个base64生成字符串中的字母,这样就可以达到别人很难破解的目的了。具体直接看代码!

<br>
//利用base64加密传输数据<br>
function base64Encryption(str) {<br>
    let base64 = Buffer.from(str, 'utf-8').toString('base64')<br>
    // 把base64源数据中的M与Q替换成其他字符串,防止别人破解<br>
    let base64Confusion = base64.replace(/\M/, '=J=')<br>
    base64Confusion = base64Confusion.replace(/\Q/, '=V=')<br>
    return base64Confusion<br>
}<br>
function base64Decrypt(str) {<br>
    // 先把base64混淆后的字符串转换为正常额base64字符串,在进行解密<br>
    let base64 = str.replace(/=J=/, 'M')<br>
    base64 = base64.replace(/=V=/, 'Q')<br>
    return Buffer.from(base64, 'base64').toString('utf-8')<br>
}<br>
// 此加密不仅可以用于用户密码加密,也可以用于url传参加密<br>
// 一下是加密一般字符串<br>
var data = '123m你好'<br>
console.log('加密:', base64Encryption(data))<br>
console.log('解密:',base64Decrypt(base64Encryption(data)))<br>

// 一下是加密url传参,如url为http://localhost/users?userName=Jack&amp;&amp;password=1234567890<br>
var userName = 'Jack'<br>
var password = '1234567890'<br>
console.log(`加密: http://localhost/users?userName=${base64Encryption(userName)}&amp;&amp;password=${base64Encryption(password)}`)<br>
// 后端解码<br>
console.log(`解密: http://localhost/users?userName=${base64Decrypt(base64Encryption(userName))}&amp;&amp;password=${base64Decrypt(base64Encryption(password))}`)<br>
// 我们可以这样进行加密连接参数的字符串, 比如字符串是userName=Jack&amp;&amp;password=1234567890<br>
var params = `userName=${userName}&amp;&amp;password=${password}`<br>
console.log(`加密:http://localhost/users?data=${base64Encryption(params)}`)<br>
// 后端解码应该是拿到data的值为dXNlck5hbWU9SmFjayYmcGFzc3dvcm=V=9=J=TIzNDU2Nzg5MA==,并解码此值并对其进行分割获取相应的数据内容<br>
console.log(`解密data:${base64Decrypt(base64Encryption(params))}, 后端分割:${base64Decrypt(base64Encryption(params)).split('&amp;&amp;')}`)<br>

采用XMLHttpRequest验证URL是否有效

有时候在处理某些URL时,可能会遇到404等情况,比如我们在国内使用谷歌地图api一样,我们在请求的时候可能会发生404问题,这个时候我们又想去判断下当前url为404的话,我们则采用其他地图的api,当然我这里所说的仅仅只是一个使用场景,可能你也会遇到其他更多场景,并且也需要验证当前URL的有效性,因此我就直接采用了XMLHttpRequest的方式进行对URL的有效性进行验证。当然对于谷歌地图这个场景,我不建议大家使用这种方法啦,毕竟谷歌地图的api总是抽风,有时候可以访问有时候又不能访问,并且经常不会出现404,基本都是延时很久,所以这个方法不适用与谷歌地图与百度地图的切换判断。
代码及其简单,并且测试也通过了,大部分情况下只要遇到404页面,到能判断到是否有效

let xmlhttp = new XMLHttpRequest();
if (xmlhttp != null) {
    xmlhttp.onreadystatechange = () => {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {
                console.log('验证成功,URL可用')
            }
            else {
                console.log("验证失败,URL不可用,错误信息:", xmlhttp.statusText);
            }
        }
    };
    xmlhttp.open("GET", url, false);
    xmlhttp.send(null);
} else {
    console.log('你的浏览器OUT了,不支持XMLHTTP,请更换Firefox、Chrome最新版本浏览器')
}

如果你有更好的方法,请在文章后面给我留言,谢谢!

Java Spring-Boot开发环境配置

我以前确实玩过一些java web,并且还写过java web,但是那是很久以前的事情了,而且悲催的是我还居然没有用过一个java框架。比如spring、Struts、hibernate之类的框架,我仅仅只是听说过,并未真正研究与使用过。由于工作的需要,我需要搭建一个可以跑起来的 reset api 服务,由此想起之前朋友给我推荐的spring-boot,听说很容易,不过我折腾了一下,环境搭建就花费了我不少时间。下面我就将这过程给大家说一说,当然请先确保你的电脑已经配置好了JDK环境。

一、环境配置

1、java环境配置

JDK配置、maven配置,JDK配置网上已经说得一大片了,再说了不论是搞后端还是搞前端开发基本也离不开JDK环境了,这里主要说一下maven配置。
首先到maven官方下载一个压缩包,https://maven.apache.org/download.cgi
解压后,放到任意位置,我将其放到了/Users/ubeing/Library/maven目录中,这个是MAC开发环境,如果你是windows开发环境,那你可以放到C盘或者其他盘都可以。 继续阅读Java Spring-Boot开发环境配置

JavaScript如何判断对象是否为空

我们都知道在JavaScript中,判断一个数组是否为空,我们可以直接使用length进行判断其长度是否为>0,从而来判断数组中是否有内容。而对象却不能使用length这样的方式去判断长度。下面我们就使用两种常用方法去判断下对象。

1、JSON.stringify方法

JSON.stringify()可以将对象转换为字符串,从而我们再去比对字符串即可。如下:

let str = {}
if(JSON.stringify(str)==='{}'){
    console.log('此对象是空对象')
}else{
    console.log('此对象不是空对象')
}

2、ES6语法直接使用Object.keys

Object.keys主要是用于直接获取对象中的所有key的名称,并将其输出为一个数组。因此我们这里需要用到length来判断这个数组的长度,代码如下:

let str = {}
if(Object.keys(str).length>0){
  console.log('对象不是空对象')
}else{
  console.log('对象是空对象')
}

另外我看到有些使用for...in的去循环,但是我尝试了一下,没有成功。不建议大家使用for...in去判断

JavaScript将有相同内容的数组或对象的值进行累加

一看到这个标题,确实标题过长,不过只有长标题才能真正的说明问题。下面就使用一个实例来讲解下我到底要做什么。
其实在平时的编程中,我们可能会经常遇到如下这样的问题,就像我们的后端要从数据库中读取相同id的内容,并且合并相同id已有的值。

var arry = [{
        pid:123,
        info: '男'
    },{
        pid:123,
        info:'女'
    },{
        pid:123,
        info: '未知'
    },{
        pid:456,
        info: '东'
    },{
        pid:456,
        info:'西'
    },{
        pid:456,
        info: '南'
    },{
        pid:456,
        info: '北'
    }]

我们看到以上数组对象中,可以看到有很多个相同pid的属性值,我的目的就是将其相同的pid值的对象的info值全部合并起来,诸如
[{pid:123,info:'男/女/未知'},{pid:456,info:'东/西/南/北'}]
也就是说将相同的pid的相关内容进行合并。 继续阅读JavaScript将有相同内容的数组或对象的值进行累加

老生常谈之惰性函数

首先我们得明白为什么要使用惰性函数?惰性函数就是第一次计算得到的值,供内部函数调用,然后用这个内部函数重置外部函数(因为同名),以后就不用计算了,也不用判断分支条件。这时函数就相当于一个被赋值的变量!
我们首先来看一个简单的实例:

var t;
function getTime(){
  if(t) return t;
  t = new Date();
  return t
}

继续阅读老生常谈之惰性函数

javascript编写属于自己的类型检测函数

不要跟我说类型检测不是很简单吗?好像直接使用typeof就可以检测了,这个有什么难度?但是大家都知道使用typeof检测出来的并无法检测出Arry、Date、RegExp、Error、Null等特殊类型,如我们遇到是arry的类型,检测出来的是object类型。因此我们想要得到更加精确的类型,就必须得自己动手写一个函数出来判断下类型

1、了解Object.prototype.toString

var b = null
Object.prototype.toString.call(b) //[object Null]
由Object.prototype.toString的方法我们可以知道这个方法可以获得[object Null],[object Error]等类型。这样我们就可以直接来拼接一个属于我们自己的类型检测函数啦

2、类型检测函数type

大致的思想是:假如我们检测到的是object,那么就使用Object.prototype.toString去检测,否则就使用typeof进行检测

var typeClass = {}
"Boolean Number String Function Array Date RegExp Object Error Null Undefined".split(' ').map(function(item, index){
  typeClass['[object '+ item +']'] = item.toLowerCase();
})

function type(obj){
  var objType = typeof obj ==='object' || typeof obj ==='function' ? typeClass[Object.prototype.toString.call(obj)] || 'object' : typeof obj;
  return objType
}
type(111) //number
type('111') //string
type([1,2,3]) //array
type(null) //null
type({a:1}) //object
type(new Date()) //date

JQ中的type函数

type: function( obj ) {
    if ( obj == null ) {
       return obj + "";
    }
    return typeof obj === "object" || typeof obj === "function" ?
       class2type[ toString.call( obj ) ] || "object" :
       typeof obj;
}

JQ中对IE浏览器做了兼容!

老生常谈系列之this、call、apply

在JavaScript中我们经常要使用到this关键字,但是有时候this的指向总是让我们搞不明白,理不清楚。总之刚开始接触的时候直接是一头雾水,当然this指向都没法搞清楚,那么就很难判断出很多代码输出的结果。比如以下代码中,大家可以猜一猜this指向的是谁?

function getUrl(){
  console.log(this)
}
getUrl()

以上代码中很简单的一个例子,其实我们打印出来后this指向的是window对象
然而这并没有什么卵用,最多就是我们知道了this的指向。由此JavaScript中就出现了call、apply方法,这两个方法主要是用于动态改变this指向的,他们的使用方法一样,只不过是传递的参数不一样罢了。
使用方法:
如果call或apply的第一参数是null的话, this指向window 继续阅读老生常谈系列之this、call、apply

javascript中数组去重的多种方法

数组去重,简单来说就是一个数组中如果同时存在两个相同的值,但是我们只需要其中一个即可,不需要将两个相同的值都一起展示出来,这个时候就必须得使用到javascript的数组去重方法了,在javascript中并没有专门的方法直接去重的,因此我们得自己来写一个这样的方法。下面我仅介绍其中的容易理解的4种方法,当然还有其他更多的方法,希望大家能够自己去寻找和学习了,因为目前我就仅能理解这3种方法。
大概的思路应该是这样的:
1)、定义一个变量数组 res 保存结果,遍历需要去重的数组,如果该元素已经存在在 res 中了,则说明是重复的元素,如果没有,则放入 res 中。
2)、将原数组中重复元素的最后一个元素放入结果数组中
下面我们直接来看代码,代码可以让你一目了然。

1、万能的for循环

继续阅读javascript中数组去重的多种方法