tools.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. // 节流函数
  2. export function throttle(fn, gaptime) {
  3. if (gaptime == null || gaptime == undefined) {
  4. gaptime = 200
  5. }
  6. let _lastTime = null
  7. return function() {
  8. let _nowTime = +new Date()
  9. if (_nowTime - _lastTime > gaptime || !_lastTime) {
  10. fn.apply(this, arguments)
  11. _lastTime = _nowTime
  12. }
  13. }
  14. }
  15. // 图片转Base64,pad 平台
  16. export const imgToBase64 = function (path,callback){
  17. // plus.nativeUI.previewImage([path]);
  18. // return
  19. plus.io.resolveLocalFileSystemURL(path, function (entry) {
  20. // 可通过entry对象操作文件
  21. entry.file(function (file){
  22. var fileReader = new plus.io.FileReader()
  23. fileReader.readAsDataURL(file, 'utf-8')
  24. fileReader.onloadend = function (evt) {
  25. let result = evt.target.result
  26. callback(1,result.split(',')[1])
  27. // remove this file
  28. entry.remove( function ( entry ) {
  29. console.log( "Remove succeeded" );
  30. }, function ( e ) {
  31. console.log( e.message );
  32. });
  33. }
  34. fileReader.onerror = function (e){
  35. callback(0,'文件读取失败')
  36. }
  37. })
  38. }, function (e) {
  39. console.log(JSON.stringify(e))
  40. uni.showToast({icon: 'none',title: 'Resolve file URL failed: ' + e.message})
  41. })
  42. }
  43. /**
  44. * @param {*} obj1 对象
  45. * @param {*} obj2 对象
  46. * @description 遍历赋值
  47. */
  48. export const objExtend = (obj1, obj2) => {
  49. for (let a in obj1){
  50. obj2[a] = obj1[a]
  51. }
  52. return obj2
  53. }
  54. // 正则验证车牌,验证通过返回true,不通过返回false
  55. export const isLicensePlate = function (str) {
  56. return /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/.test(str)
  57. }
  58. /**
  59. * 校验身份证号合法性
  60. */
  61. export const checkIdNumberValid = (tex) => {
  62. // var tip = '输入的身份证号有误,请检查后重新输入!'
  63. let num = tex
  64. num = num.toUpperCase()
  65. let len = num.length
  66. let re
  67. if (len == 0) return true
  68. // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
  69. if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))){
  70. return false
  71. }
  72. // 验证前两位地区是否有效
  73. let aCity = {11: '北京',12: '天津',13: '河北',14: '山西',15: '内蒙古',21: '辽宁',22: '吉林',23: '黑龙江',31: '上海',32: '江苏',33: '浙江',
  74. 34: '安徽',35: '福建',36: '江西',37: '山东',41: '河南',42: '湖北',43: '湖南',44: '广东',45: '广西',46: '海南',50: '重庆',51: '四川',
  75. 52: '贵州',53: '云南',54: '西藏',61: '陕西',62: '甘肃',63: '青海',64: '宁夏',65: '新疆',71: '台湾',81: '香港',82: '澳门',91: '国外'}
  76. if (aCity[parseInt(num.substr(0, 2))] == null){
  77. return false
  78. }
  79. // 当身份证为15位时的验证出生日期。
  80. if (len == 15){
  81. re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/)
  82. let arrSplit = num.match(re)
  83. // 检查生日日期是否正确
  84. let dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4])
  85. let bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]))
  86. if (!bGoodDay){
  87. return false
  88. }
  89. }
  90. // 当身份证号为18位时,校验出生日期和校验位。
  91. if (len == 18){
  92. re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/)
  93. let arrSplit = num.match(re)
  94. // 检查生日日期是否正确
  95. let dtmBirth = new Date(arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4])
  96. let bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]))
  97. if (!bGoodDay){
  98. return false
  99. } else {
  100. // 检验18位身份证的校验码是否正确。
  101. // 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
  102. let valnum
  103. let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
  104. let arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
  105. let nTemp = 0
  106. let i
  107. for (i = 0; i < 17; i++){
  108. nTemp += num.substr(i, 1) * arrInt[i]
  109. }
  110. valnum = arrCh[nTemp % 11]
  111. if (valnum != num.substr(17, 1)){
  112. return false
  113. }
  114. }
  115. }
  116. return true
  117. }
  118. // 正则有效手机号码
  119. export const isvalidPhone = function (str) {
  120. const reg = /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/
  121. return reg.test(str)
  122. }
  123. // 日期格式化
  124. export const formatSubmitDate = (val, type) => {
  125. if (val == null || val == '' || val == undefined) {
  126. return ''
  127. } else {
  128. let _date = new Date(val)
  129. let _year = _date.getFullYear()
  130. let _montn = (_date.getMonth() + 1) < 10 ? '0' + (_date.getMonth() + 1) : (_date.getMonth() + 1)
  131. let _day = _date.getDate() < 10 ? '0' + _date.getDate() : _date.getDate()
  132. let _hour = _date.getHours() < 10 ? '0' + _date.getHours() : _date.getHours()
  133. let _minutes = _date.getMinutes() < 10 ? '0' + _date.getMinutes() : _date.getMinutes()
  134. let _seconds = _date.getSeconds() < 10 ? '0' + _date.getSeconds() : _date.getSeconds()
  135. if (type == 'minutes') return _year + '-' + _montn + '-' + _day + ' ' + _hour + ':' + _minutes
  136. else if (type == 'seconds') return _year + '-' + _montn + '-' + _day + ' ' + _hour + ':' + _minutes + ':' + _seconds
  137. else return _year + '-' + _montn + '-' + _day
  138. }
  139. }
  140. /**
  141. * //设置应用版本号对应的缓存信息
  142. * @param {Object} currTimeStamp 当前获取的时间戳
  143. */
  144. export const setStorageForAppVersion = function(currTimeStamp){
  145. uni.setStorage({
  146. key: 'tip_version_update_time',
  147. data: currTimeStamp,
  148. success: function () {
  149. console.log('setStorage-success');
  150. }
  151. });
  152. }
  153. /**
  154. * 进行版本型号的比对 以及下载更新请求
  155. * @param {Object} server_version 服务器最新 应用版本号
  156. * @param {Object} curr_version 当前应用版本号
  157. * isQzgx 是否强制更新
  158. * market 打开应用市场
  159. */
  160. export const checkVersionToLoadUpdate = function(newVersion,type,market){
  161. const curVer = getApp().globalData.version
  162. const server_version = newVersion.version
  163. const curr_version = curVer.versionCode
  164. const isQzgx = newVersion.forceUpgrade != 1
  165. let isWifi = plus.networkinfo.getCurrentType()!=3 ? '有新的版本发布,检测到您目前非Wifi连接,' : '有新的版本发布,'
  166. let msg = isWifi + (!isQzgx ? '请立即更新?' : '是否立即更新版本?')
  167. // 下载app并安装
  168. let downloadApp = function(downloadApkUrl){
  169. var dtask = plus.downloader.createDownload( downloadApkUrl, {}, function ( d, status ) {
  170. // 下载完成
  171. if ( status == 200 ) {
  172. plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename),{},{},function(error){
  173. uni.showToast({
  174. icon: 'none',
  175. title: '安装失败',
  176. duration: 1500
  177. });
  178. })
  179. } else {
  180. uni.showToast({
  181. icon: 'none',
  182. title: '更新失败',
  183. duration: 1500
  184. });
  185. }
  186. uni.hideLoading()
  187. });
  188. dtask.start();
  189. }
  190. // 打开应用市场
  191. const marketOpen = function(){
  192. market.open({
  193. ios:'',
  194. android:'com.zyucgj.car'
  195. });
  196. }
  197. console.log(curr_version)
  198. if(Number(server_version) > Number(curr_version)){
  199. // #ifndef APP-PLUS
  200. uni.showModal({
  201. title: msg,
  202. content: '更新内容:'+newVersion.upgradeContent,
  203. showCancel: isQzgx,
  204. confirmText:'立即更新',
  205. cancelText:'稍后进行',
  206. success: function (res) {
  207. if (res.confirm) {
  208. uni.showLoading({
  209. title: '正在更新中...',
  210. mask: true,
  211. });
  212. //设置 最新版本apk的下载链接
  213. downloadApp(newVersion.attachment);
  214. // marketOpen()
  215. } else if (res.cancel) {
  216. console.log('稍后更新');
  217. }
  218. }
  219. });
  220. // #endif
  221. // #ifdef APP-PLUS
  222. plus.nativeUI.confirm('更新内容:'+newVersion.upgradeContent, function(e){
  223. if(e.index == 0){ // 确认
  224. uni.showLoading({
  225. title: '正在更新中...',
  226. mask: true,
  227. });
  228. //设置 最新版本apk的下载链接
  229. downloadApp(newVersion.attachment)
  230. // marketOpen()
  231. }
  232. },{"title":msg,"buttons": !isQzgx ? ["立即更新"] : ["立即更新","稍后进行"]})
  233. // #endif
  234. }else{
  235. if(type){
  236. uni.showToast({
  237. icon: 'none',
  238. title: '已是最新版本',
  239. duration: 1500
  240. });
  241. }
  242. }
  243. }
  244. // 确认弹框
  245. export const clzConfirm = function(opts){
  246. // #ifndef APP-PLUS
  247. uni.showModal({
  248. title: opts.title,
  249. content: opts.content,
  250. showCancel: opts.showCancel == false ? false : true,
  251. confirmText: opts.confirmText || '确定',
  252. cancelText: opts.cancelText || '取消',
  253. success: opts.success,
  254. })
  255. // #endif
  256. // #ifdef APP-PLUS
  257. plus.nativeUI.confirm(
  258. opts.content,
  259. opts.success,
  260. {"title":opts.title,"buttons": opts.buttons || ["确定","取消"]},
  261. )
  262. // #endif
  263. }
  264. // 保存图片到阿里云
  265. export const saveImgToAliOss = function(src,callback){
  266. uni.uploadFile({
  267. url: getApp().globalData.baseUrl + 'upload', //自行修改各自的对应的接口
  268. filePath: src,
  269. name: 'file',
  270. success: (uploadFileRes) => {
  271. if (uploadFileRes) {
  272. let res = JSON.parse(uploadFileRes.data);
  273. callback(res)
  274. }
  275. uni.showToast({
  276. icon: 'none',
  277. title: uploadFileRes ? '保存图片成功' : '保存图片失败'
  278. })
  279. },
  280. fail:(error) => {
  281. console.log(error)
  282. }
  283. });
  284. }
  285. // 保存base64 图片数据到阿里云
  286. export const saveBase64ToAliOss = function(base64,callback){
  287. let bitmap = new plus.nativeObj.Bitmap();
  288. uni.showLoading({
  289. mask:true,
  290. title: '正在保存图片...'
  291. })
  292. // 保存图片到相册
  293. bitmap.loadBase64Data(base64, function() {
  294. var itemId = new Date().getTime()
  295. //保存到系统相册
  296. let filePath = "_doc/poster_"+itemId+".jpg"
  297. bitmap.save(filePath, {
  298. overwrite: true, //是否覆盖已有图片, true 是
  299. quality: 100 //图片质量,1-100 默认50, 100质量最高
  300. }, function(e) {
  301. uni.uploadFile({
  302. url: getApp().globalData.baseUrl + 'upload', //自行修改各自的对应的接口
  303. filePath: e.target,
  304. name: 'file',
  305. success: (uploadFileRes) => {
  306. if (uploadFileRes) {
  307. let res = JSON.parse(uploadFileRes.data);
  308. callback(res)
  309. }
  310. uni.showToast({
  311. icon: 'none',
  312. title: uploadFileRes ? '保存图片成功' : '保存图片失败'
  313. })
  314. uni.hideLoading()
  315. }
  316. });
  317. bitmap.clear()
  318. }, function(e) {
  319. bitmap.clear()
  320. uni.showToast({
  321. icon: 'none',
  322. title: '图片保存失败'
  323. })
  324. uni.hideLoading()
  325. });
  326. }, function(e) {
  327. bitmap.clear()
  328. uni.showToast({
  329. icon: 'none',
  330. title: '图片保存失败'
  331. })
  332. uni.hideLoading()
  333. });
  334. }
  335. // 获取当前gps 坐标
  336. export const getGpsLocation = function(callback){
  337. //定义一些常量
  338. var x_PI = 3.14159265358979324 * 3000.0 / 180.0;
  339. var PI = 3.1415926535897932384626;
  340. var a = 6378245.0;
  341. var ee = 0.00669342162296594323;
  342. /**
  343. * 判断是否在国内,不在国内则不做偏移
  344. * @param lng
  345. * @param lat
  346. * @returns {boolean}
  347. */
  348. function out_of_china(lng, lat) {
  349. return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
  350. }
  351. function transformlat(lng, lat) {
  352. var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
  353. ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
  354. ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
  355. ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
  356. return ret
  357. }
  358. function transformlng(lng, lat) {
  359. var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
  360. ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
  361. ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
  362. ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
  363. return ret
  364. }
  365. /**
  366. * WGS84转GCj02
  367. * @param lng
  368. * @param lat
  369. * @returns {*[]}
  370. */
  371. function wgs84togcj02(lng, lat) {
  372. if (out_of_china(lng, lat)) {
  373. return [lng, lat]
  374. }
  375. else {
  376. var dlat = transformlat(lng - 105.0, lat - 35.0);
  377. var dlng = transformlng(lng - 105.0, lat - 35.0);
  378. var radlat = lat / 180.0 * PI;
  379. var magic = Math.sin(radlat);
  380. magic = 1 - ee * magic * magic;
  381. var sqrtmagic = Math.sqrt(magic);
  382. dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
  383. dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
  384. var mglat = lat + dlat;
  385. var mglng = lng + dlng;
  386. return [mglng, mglat]
  387. }
  388. }
  389. // 获取gps
  390. // 获取系统信息同步接口
  391. const getSystemInfo = uni.getSystemInfoSync()
  392. uni.getLocation({
  393. type: 'gcj02',
  394. geocode: true,
  395. success: function(res) {
  396. console.log(res);
  397. let gps = wgs84togcj02(res.longitude,res.latitude)
  398. callback(getSystemInfo.platform == 'android' ? gps : getSystemInfo.platform == 'ios' ? res : '')
  399. },
  400. fail: function(error){
  401. console.log(error)
  402. uni.showToast({
  403. icon: 'none',
  404. title: '定位失败'
  405. })
  406. }
  407. });
  408. }
  409. /**检查是否打开GPS功能(android)**/
  410. export const checkOpenGPSServiceByAndroid = () => {
  411. let system = uni.getSystemInfoSync();// 获取系统信息
  412. console.log(system)
  413. if (system.platform === 'android') { // 判断平台
  414. var context = plus.android.importClass("android.content.Context");
  415. var locationManager = plus.android.importClass("android.location.LocationManager");
  416. var main = plus.android.runtimeMainActivity();
  417. var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
  418. console.log(mainSvr,'===mainSvr')
  419. if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
  420. uni.showModal({
  421. title: '提示',
  422. content: '请打开定位服务功能',
  423. showCancel: false, // 不显示取消按钮
  424. success() {
  425. if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
  426. var Intent = plus.android.importClass('android.content.Intent');
  427. var Settings = plus.android.importClass('android.provider.Settings');
  428. var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
  429. main.startActivity(intent); // 打开系统设置GPS服务页面
  430. } else {
  431. console.log('GPS功能已开启');
  432. }
  433. }
  434. });
  435. }
  436. }
  437. }