├── .gitignore ├── LICENSE ├── README.md ├── browser └── browserUtil.js ├── check └── checkUtil.js ├── dateUtil └── dateUtil.js ├── storage └── storageUtil.js └── util └── util.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | .vscode 4 | .idea -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 lin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MyUtils 2 | 平时汇总的JavaScript工具函数,在日常开发中可能会用到,希望对大家有所帮助~ 3 | 4 | 暂时分为下面几大类 5 | 1. [主工具函数](https://github.com/XmanLin/MyUtils/blob/master/util/util.js) 6 | 7 | 2. [日期工具date工具函数](https://github.com/XmanLin/MyUtils/blob/master/dateUtil/dateUtil.js) 8 | 9 | 3. [浏览器操作相关browser工具函数](https://github.com/XmanLin/MyUtils/blob/master/browser/browserUtil.js) 10 | 11 | 4. [浏览器存储相关storage工具函数](https://github.com/XmanLin/MyUtils/blob/master/storage/storageUtil.js) 12 | 13 | 5. [正则校验check工具函数](https://github.com/XmanLin/MyUtils/blob/master/check/checkUtil.js) 14 | 15 | 持续更新中... 16 | 17 | 有问题或者没有自己想要的工具函数,欢迎[issues](https://github.com/XmanLin/MyUtils/issues) 18 | -------------------------------------------------------------------------------- /browser/browserUtil.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 此文件下主要是针对浏览器上各种操作的工具函数 3 | */ 4 | 5 | /** 6 | * 返回当前url 7 | */ 8 | export const currentURL = () => window.location.href; 9 | 10 | /** 11 | * 获取url参数(第一种) 12 | * @param {*} name 13 | * @param {*} origin 14 | */ 15 | 16 | export function getUrlParam(name, origin = null) { 17 | let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); 18 | let r = null; 19 | if (origin == null) { 20 | r = window.location.search.substr(1).match(reg); 21 | } else { 22 | r = origin.substr(1).match(reg); 23 | } 24 | if (r != null) return decodeURIComponent(r[2]); 25 | return null; 26 | } 27 | 28 | /** 29 | * 获取url参数(第二种) 30 | * @param {*} name 31 | * @param {*} origin 32 | */ 33 | export function getUrlParams(name, origin = null) { 34 | let url = location.href; 35 | let temp1 = url.split('?'); 36 | let pram = temp1[1]; 37 | let keyValue = pram.split('&'); 38 | let obj = {}; 39 | for (let i = 0; i < keyValue.length; i++) { 40 | let item = keyValue[i].split('='); 41 | let key = item[0]; 42 | let value = item[1]; 43 | obj[key] = value; 44 | } 45 | return obj[name]; 46 | } 47 | 48 | /** 49 | * 修改url中的参数 50 | * @param { string } paramName 51 | * @param { string } replaceWith 52 | */ 53 | export function replaceParamVal(paramName,replaceWith) { 54 | var oUrl = location.href.toString(); 55 | var re=eval('/('+ paramName+'=)([^&]*)/gi'); 56 | location.href = oUrl.replace(re,paramName+'='+replaceWith); 57 | return location.href; 58 | } 59 | 60 | /** 61 | * 删除url中指定的参数 62 | * @param { string } name 63 | */ 64 | export function funcUrlDel(name){ 65 | var loca =location; 66 | var baseUrl = loca.origin + loca.pathname + "?"; 67 | var query = loca.search.substr(1); 68 | if (query.indexOf(name)>-1) { 69 | var obj = {}; 70 | var arr = query.split("&"); 71 | for (var i = 0; i < arr.length; i++) { 72 | arr[i] = arr[i].split("="); 73 | obj[arr[i][0]] = arr[i][1]; 74 | } 75 | delete obj[name]; 76 | var url = baseUrl + JSON.stringify(obj).replace(/[\"\{\}]/g,"").replace(/\:/g,"=").replace(/\,/g,"&"); 77 | return url 78 | } 79 | } 80 | 81 | /** 82 | * 获取全部url参数,并转换成json对象 83 | * @param { string } url 84 | */ 85 | export function getUrlAllParams (url) { 86 | var url = url ? url : window.location.href; 87 | var _pa = url.substring(url.indexOf('?') + 1), 88 | _arrS = _pa.split('&'), 89 | _rs = {}; 90 | for (var i = 0, _len = _arrS.length; i < _len; i++) { 91 | var pos = _arrS[i].indexOf('='); 92 | if (pos == -1) { 93 | continue; 94 | } 95 | var name = _arrS[i].substring(0, pos), 96 | value = window.decodeURIComponent(_arrS[i].substring(pos + 1)); 97 | _rs[name] = value; 98 | } 99 | return _rs; 100 | } 101 | 102 | /** 103 | * 获取窗口可视范围的高度 104 | */ 105 | export function getClientHeight() { 106 | let clientHeight = 0; 107 | if (document.body.clientHeight && document.documentElement.clientHeight) { 108 | clientHeight = (document.body.clientHeight < document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight; 109 | } 110 | else { 111 | clientHeight = (document.body.clientHeight > document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight; 112 | } 113 | return clientHeight; 114 | } 115 | 116 | /** 117 | * 获取窗口可视范围宽度 118 | */ 119 | export function getPageViewWidth() { 120 | let d = document, 121 | a = d.compatMode == "BackCompat" ? d.body : d.documentElement; 122 | return a.clientWidth; 123 | } 124 | 125 | /** 126 | * 获取窗口宽度 127 | */ 128 | export function getPageWidth() { 129 | let g = document, 130 | a = g.body, 131 | f = g.documentElement, 132 | d = g.compatMode == "BackCompat" ? a : g.documentElement; 133 | return Math.max(f.scrollWidth, a.scrollWidth, d.clientWidth); 134 | } 135 | 136 | /** 137 | * 获取窗口尺寸 138 | */ 139 | export function getViewportOffset() { 140 | if (window.innerWidth) { 141 | return { 142 | w: window.innerWidth, 143 | h: window.innerHeight 144 | } 145 | } else { 146 | // ie8及其以下 147 | if (document.compatMode === "BackCompat") { 148 | // 怪异模式 149 | return { 150 | w: document.body.clientWidth, 151 | h: document.body.clientHeight 152 | } 153 | } else { 154 | // 标准模式 155 | return { 156 | w: document.documentElement.clientWidth, 157 | h: document.documentElement.clientHeight 158 | } 159 | } 160 | } 161 | } 162 | 163 | /** 164 | * 获取滚动条距顶部高度 165 | */ 166 | export function getPageScrollTop() { 167 | let a = document; 168 | return a.documentElement.scrollTop || a.body.scrollTop; 169 | } 170 | 171 | /** 172 | * 获取滚动条距左边的高度 173 | */ 174 | function getPageScrollLeft() { 175 | let a = document; 176 | return a.documentElement.scrollLeft || a.body.scrollLeft; 177 | } 178 | 179 | 180 | /** 181 | * 开启全屏 182 | * @param {*} element 183 | */ 184 | export function launchFullscreen(element) { 185 | if (element.requestFullscreen) { 186 | element.requestFullscreen() 187 | } else if (element.mozRequestFullScreen) { 188 | element.mozRequestFullScreen() 189 | } else if (element.msRequestFullscreen) { 190 | element.msRequestFullscreen() 191 | } else if (element.webkitRequestFullscreen) { 192 | element.webkitRequestFullScreen() 193 | } 194 | } 195 | 196 | /** 197 | * 关闭全屏 198 | */ 199 | export function exitFullscreen() { 200 | if (document.exitFullscreen) { 201 | document.exitFullscreen() 202 | } else if (document.msExitFullscreen) { 203 | document.msExitFullscreen() 204 | } else if (document.mozCancelFullScreen) { 205 | document.mozCancelFullScreen() 206 | } else if (document.webkitExitFullscreen) { 207 | document.webkitExitFullscreen() 208 | } 209 | } 210 | 211 | /** 212 | * 返回当前滚动条位置 213 | */ 214 | export const getScrollPosition = (el = window) => ({ 215 | x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft, 216 | y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop 217 | }); 218 | 219 | /** 220 | * 滚动到指定元素区域 221 | */ 222 | export const smoothScroll = element =>{ 223 | document.querySelector(element).scrollIntoView({ 224 | behavior: 'smooth' 225 | }); 226 | }; 227 | 228 | /** 229 | * 平滑滚动到页面顶部 230 | */ 231 | export const scrollToTop = () => { 232 | const c = document.documentElement.scrollTop || document.body.scrollTop; 233 | if (c > 0) { 234 | window.requestAnimationFrame(scrollToTop); 235 | window.scrollTo(0, c - c / 8); 236 | } 237 | }; 238 | 239 | /** 240 | * http跳转https 241 | */ 242 | export const httpsRedirect = () => { 243 | if (location.protocol !== 'https:') location.replace('https://' + location.href.split('//')[1]); 244 | }; 245 | 246 | /** 247 | * 检查页面底部是否可见 248 | */ 249 | export const bottomVisible = () =>{ 250 | return document.documentElement.clientHeight + window.scrollY >= 251 | (document.documentElement.scrollHeight || document.documentElement.clientHeight); 252 | }; 253 | 254 | /** 255 | * 打开一个窗口 256 | * @param { string } url 257 | * @param { string } windowName 258 | * @param { number } width 259 | * @param { number } height 260 | */ 261 | export function openWindow(url, windowName, width, height) { 262 | var x = parseInt(screen.width / 2.0) - width / 2.0; 263 | var y = parseInt(screen.height / 2.0) - height / 2.0; 264 | var isMSIE = navigator.appName == "Microsoft Internet Explorer"; 265 | if (isMSIE) { 266 | var p = "resizable=1,location=no,scrollbars=no,width="; 267 | p = p + width; 268 | p = p + ",height="; 269 | p = p + height; 270 | p = p + ",left="; 271 | p = p + x; 272 | p = p + ",top="; 273 | p = p + y; 274 | window.open(url, windowName, p); 275 | } else { 276 | var win = window.open( 277 | url, 278 | "ZyiisPopup", 279 | "top=" + 280 | y + 281 | ",left=" + 282 | x + 283 | ",scrollbars=" + 284 | scrollbars + 285 | ",dialog=yes,modal=yes,width=" + 286 | width + 287 | ",height=" + 288 | height + 289 | ",resizable=no" 290 | ); 291 | eval("try { win.resizeTo(width, height); } catch(e) { }"); 292 | win.focus(); 293 | } 294 | } 295 | 296 | /** 297 | * 自适应页面(rem) 298 | * @param { number } width 299 | */ 300 | export function AutoResponse(width = 750) { 301 | const target = document.documentElement; 302 | target.clientWidth >= 750 303 | ? (target.style.fontSize = "100px") 304 | : (target.style.fontSize = target.clientWidth / width * 100 + "px"); 305 | } 306 | 307 | /** 308 | * 获取当前浏览器名称 309 | */ 310 | export const getExplorerName = () => { 311 | const userAgent = window.navigator.userAgent 312 | const isExplorer = (exp) => { 313 | return userAgent.indexOf(exp) > -1 314 | } 315 | if (isExplorer('MSIE')) return 'IE' 316 | else if (isExplorer('Firefox')) return 'Firefox' 317 | else if (isExplorer('Chrome')) return 'Chrome' 318 | else if (isExplorer('Opera')) return 'Opera' 319 | else if (isExplorer('Safari')) return 'Safari' 320 | } 321 | 322 | /** 323 | * 禁止鼠标右键、选择、复制 324 | */ 325 | export const contextmenuBan = () => { 326 | ['contextmenu', 'selectstart', 'copy'].forEach(function(ev){ 327 | document.addEventListener(ev, function(event){ 328 | return event.returnValue = false 329 | }) 330 | }); 331 | } 332 | -------------------------------------------------------------------------------- /check/checkUtil.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 此文件主要包含可以通过正则表达式来验证的工具函数 3 | * 感谢正则表达式作者:铁皮饭盒(https://juejin.im/user/58913fdf8d6d810058206a75)GitHub(https://github.com/any86/any-rule) 4 | * 最新正则表达式可以参考他的GitHub 5 | */ 6 | 7 | /** 8 | * 验证火车车次 9 | * @param { string } value 10 | */ 11 | export const isTrainNum = value => /^[GCDZTSPKXLY1-9]\d{1,4}$/g.test(value); 12 | 13 | /** 14 | * 验证手机机身码(IMEI) 15 | * @param { string } value 16 | */ 17 | export const isIMEI = value => /^\d{15,17}$/g.test(value); 18 | 19 | /** 20 | * 验证必须带端口号的网址(或ip) 21 | * @param { string } value 22 | */ 23 | export const isHttpAndPort = value => /^((ht|f)tps?:\/\/)?[\w-]+(\.[\w-]+)+:\d{1,5}\/?$/g.test(value); 24 | 25 | /** 26 | * 验证网址(支持端口和"?+参数"和"#+参数) 27 | * @param { string } value 28 | */ 29 | export const isRightWebsite = value => /^(((ht|f)tps?):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?$/g.test(value); 30 | 31 | /** 32 | * 验证统一社会信用代码 33 | * @param { string } value 34 | */ 35 | export const isCreditCode = value => /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/g.test(value); 36 | 37 | /** 38 | * 验证迅雷链接 39 | * @param { string } value 40 | */ 41 | export const isThunderLink = value => /^thunderx?:\/\/[a-zA-Z\d]+=$/g.test(value); 42 | 43 | /** 44 | * 验证ed2k链接(宽松匹配) 45 | * @param { string } value 46 | */ 47 | export const ised2k = value => /^ed2k:\/\/\|file\|.+\|\/$/g.test(value); 48 | 49 | /** 50 | * 验证磁力链接(宽松匹配) 51 | * @param { string } value 52 | */ 53 | export const isMagnet = value => /^magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.*$/g.test(value); 54 | 55 | /** 56 | * 验证子网掩码 57 | * @param { string } value 58 | */ 59 | export const isSubnetMask = value => /^(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/g.test(value); 60 | 61 | /** 62 | * 验证linux隐藏文件路径 63 | * @param { string } value 64 | */ 65 | export const isLinuxHiddenFilePath = value => /^\/(?:[^\/]+\/)*\.[^\/]*/g.test(value); 66 | 67 | /** 68 | * 验证linux文件夹路径 69 | * @param { string } value 70 | */ 71 | export const isLinuxFolderPath = value => /^\/(?:[^\/]+\/)*[^\/]+$/g.test(value); 72 | 73 | /** 74 | * 验证linux文件路径 75 | * @param { string } value 76 | */ 77 | export const isLinuxFilePath = value => /^\/(?:[^/]+\/)*[^/]+$/g.test(value); 78 | 79 | /** 80 | * 验证window"文件夹"路径 81 | * @param { string } value 82 | */ 83 | export const isWindowsFolderPath = value => /^[a-zA-Z]:\\(?:\w+\\?)*$/g.test(value); 84 | 85 | /** 86 | * 验证window下"文件"路径 87 | * @param { string } value 88 | */ 89 | export const isWindowsFilePath = value => /^[a-zA-Z]:\\(?:\w+\\)*\w+\.\w+$/g.test(value); 90 | 91 | /** 92 | * 验证股票代码(A股) 93 | * @param { string } value 94 | */ 95 | export const isAShare = value => /^(s[hz]|S[HZ])(000[\d]{3}|002[\d]{3}|300[\d]{3}|600[\d]{3}|60[\d]{4})$/g.test(value); 96 | 97 | /** 98 | * 验证大于等于0, 小于等于150, 支持小数位出现5, 如145.5, 用于判断考卷分数 99 | * @param { string } value 100 | */ 101 | export const isGrade = value => /^150$|^(?:\d|[1-9]\d|1[0-4]\d)(?:.5)?$/g.test(value); 102 | 103 | /** 104 | * 验证html注释 105 | * @param { string } value 106 | */ 107 | export const isHtmlComments = value => /^$/g.test(value); 108 | 109 | /** 110 | * 验证md5格式(32位) 111 | * @param { string } value 112 | */ 113 | export const isMD5 = value => /^([a-f\d]{32}|[A-F\d]{32})$/g.test(value); 114 | 115 | /** 116 | * 验证版本号格式必须为X.Y.Z 117 | * @param { string } value 118 | */ 119 | export const isVersion = value => /^\d+(?:\.\d+){2}$/g.test(value); 120 | 121 | /** 122 | * 验证视频链接地址(视频格式可按需增删) 123 | * @param { string } value 124 | */ 125 | export const isVideoUrl = value => /^https?:\/\/(.+\/)+.+(\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4))$/i.test(value); 126 | 127 | /** 128 | * 验证图片链接地址(图片格式可按需增删) 129 | * @param { string } value 130 | */ 131 | export const isImageUrl = value => /^https?:\/\/(.+\/)+.+(\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif))$/i.test(value); 132 | 133 | /** 134 | * 验证24小时制时间(HH:mm:ss) 135 | * @param { string } value 136 | */ 137 | export const is24Hour = value => /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/g.test(value); 138 | 139 | /** 140 | * 验证12小时制时间(hh:mm:ss) 141 | * @param { string } value 142 | */ 143 | export const is12Hour = value => /^(?:1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$/g.test(value); 144 | 145 | /** 146 | * 验证base64格式 147 | * @param { string } value 148 | */ 149 | export const isBase64 = value => /^\s*data:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*?)\s*$/i.test(value); 150 | 151 | /** 152 | * 验证数字/货币金额(支持负数、千分位分隔符) 153 | * @param { string } value 154 | */ 155 | export const isMoneyAll = value => /^-?\d+(,\d{3})*(\.\d{1,2})?$/g.test(value); 156 | 157 | /** 158 | * 验证数字/货币金额 (只支持正数、不支持校验千分位分隔符) 159 | * @param { string } value 160 | */ 161 | export const isMoney = value => /(?:^[1-9]([0-9]+)?(?:\.[0-9]{1,2})?$)|(?:^(?:0){1}$)|(?:^[0-9]\.[0-9](?:[0-9])?$)/g.test(value); 162 | 163 | /** 164 | * 验证银行卡号(10到30位, 覆盖对公/私账户, 参考微信支付) 165 | * @param { string } value 166 | */ 167 | export const isAccountNumber = value => /^[1-9]\d{9,29}$/g.test(value); 168 | 169 | /** 170 | * 验证中文姓名 171 | * @param { string } value 172 | */ 173 | export const isChineseName = value => /^(?:[\u4e00-\u9fa5·]{2,16})$/g.test(value); 174 | 175 | /** 176 | * 验证英文姓名 177 | * @param { string } value 178 | */ 179 | export const isEnglishName = value => /(^[a-zA-Z]{1}[a-zA-Z\s]{0,20}[a-zA-Z]{1}$)/g.test(value); 180 | 181 | /** 182 | * 验证车牌号(新能源) 183 | * @param { string } value 184 | */ 185 | export const isLicensePlateNumberNER = value => /[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-HJ-NP-Z]{1}(([0-9]{5}[DF])|([DF][A-HJ-NP-Z0-9][0-9]{4}))$/g.test(value); 186 | 187 | /** 188 | * 验证车牌号(非新能源) 189 | * @param { string } value 190 | */ 191 | export const isLicensePlateNumberNNER = value => /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-HJ-NP-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/g.test(value); 192 | 193 | /** 194 | * 验证车牌号(新能源+非新能源) 195 | * @param { string } value 196 | */ 197 | export const isLicensePlateNumber = value => /^(?:[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-HJ-NP-Z]{1}(?:(?:[0-9]{5}[DF])|(?:[DF](?:[A-HJ-NP-Z0-9])[0-9]{4})))|(?:[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9 挂学警港澳]{1})$/g.test(value); 198 | 199 | /** 200 | * 验证手机号中国(严谨), 根据工信部2019年最新公布的手机号段 201 | * @param { string } value 202 | */ 203 | export const isMPStrict = value => /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-7|9])|(?:5[0-3|5-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1|8|9]))\d{8}$/g.test(value); 204 | 205 | /** 206 | * 验证手机号中国(宽松), 只要是13,14,15,16,17,18,19开头即可 207 | * @param { string } value 208 | */ 209 | export const isMPRelaxed = value => /^(?:(?:\+|00)86)?1[3-9]\d{9}$/g.test(value); 210 | 211 | /** 212 | * 验证手机号中国(最宽松), 只要是1开头即可, 如果你的手机号是用来接收短信, 优先建议选择这一条 213 | * @param { string } value 214 | */ 215 | export const isMPMostRelaxed = value => /^(?:(?:\+|00)86)?1\d{10}$/g.test(value); 216 | 217 | /** 218 | * 验证日期 219 | * @param { string } value 220 | */ 221 | export const isDate = value => /^\d{4}(-)(1[0-2]|0?\d)\1([0-2]\d|\d|30|31)$/g.test(value); 222 | 223 | /** 224 | * 验证email(邮箱) 225 | * @param { string } value 226 | */ 227 | export const isEmail = value => /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/g.test(value); 228 | 229 | /** 230 | * 验证座机电话(国内),如: 0341-86091234 231 | * @param { string } value 232 | */ 233 | export const isLandlineTelephone = value => /^\d{3}-\d{8}$|^\d{4}-\d{7}$/g.test(value); 234 | 235 | /** 236 | * 验证身份证号(1代,15位数字) 237 | * @param { string } value 238 | */ 239 | export const isIDCardOld = value => /^[1-9]\d{7}(?:0\d|10|11|12)(?:0[1-9]|[1-2][\d]|30|31)\d{3}$/g.test(value); 240 | 241 | /** 242 | * 验证身份证号(2代,18位数字),最后一位是校验位,可能为数字或字符X 243 | * @param { string } value 244 | */ 245 | export const isIDCardNew = value => /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0\d|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/g.test(value); 246 | 247 | /** 248 | * 身份证号, 支持1/2代(15位/18位数字) 249 | * @param { string } value 250 | */ 251 | export const isIDCard = value => /(^\d{8}(0\d|10|11|12)([0-2]\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0\d|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$)/g.test(value); 252 | 253 | /** 254 | * 验证护照(包含香港、澳门) 255 | * @param { string } value 256 | */ 257 | export const isPassport = value => /(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/g.test(value); 258 | 259 | /** 260 | * 验证帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线组合 261 | * @param { string } value 262 | */ 263 | export const isWebAccount = value => /^[a-zA-Z]\w{4,15}$/g.test(value); 264 | 265 | /** 266 | * 验证中文/汉字 267 | * @param { string } value 268 | */ 269 | export const isChineseCharacter = value => /^(?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])+$/g.test(value); 270 | 271 | /** 272 | * 验证小数 273 | * @param { string } value 274 | */ 275 | export const isDecimal = value => /^\d+\.\d+$/g.test(value); 276 | 277 | /** 278 | * 验证数字 279 | * @param { string } value 280 | */ 281 | export const isNumber = value => /^\d{1,}$/g.test(value); 282 | 283 | /** 284 | * 验证html标签(宽松匹配) 285 | * @param { string } value 286 | */ 287 | export const isHTMLtags = value => /<(\w+)[^>]*>(.*?<\/\1>)?/g.test(value); 288 | 289 | /** 290 | * 验证qq号格式正确 291 | * @param { string } value 292 | */ 293 | export const isQQNum = value => /^[1-9][0-9]{4,10}$/g.test(value); 294 | 295 | /** 296 | * 验证数字和字母组成 297 | * @param { string } value 298 | */ 299 | export const isNumAndStr = value => /^[A-Za-z0-9]+$/g.test(value); 300 | 301 | /** 302 | * 验证英文字母 303 | * @param { string } value 304 | */ 305 | export const isEnglish = value => /^[a-zA-Z]+$/g.test(value); 306 | 307 | /** 308 | * 验证大写英文字母 309 | * @param { string } value 310 | */ 311 | export const isCapital = value => /^[A-Z]+$/g.test(value); 312 | 313 | /** 314 | * 验证小写英文字母组成 315 | * @param { string } value 316 | */ 317 | export const isLowercase = value => /^[a-z]+$/g.test(value); 318 | 319 | /** 320 | * 验证密码强度,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符 321 | * @param { string } value 322 | */ 323 | export const isCorrectFormatPassword = value => /^\S*(?=\S{6,})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])(?=\S*[!@#$%^&*? ])\S*$/g.test(value); 324 | 325 | /** 326 | * 验证用户名,4到16位(字母,数字,下划线,减号) 327 | * @param { string } value 328 | */ 329 | export const isCorrectFormatUsername = value => /^[a-zA-Z0-9_-]{4,16}$/g.test(value); 330 | 331 | /** 332 | * 验证ip-v4 333 | * @param { string } value 334 | */ 335 | export const isIPv4 = value => /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/g.test(value); 336 | 337 | /** 338 | * 验证ip-v6 339 | * @param { string } value 340 | */ 341 | export const isIPv6 = value => /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value); 342 | 343 | /** 344 | * 验证16进制颜色 345 | * @param { string } value 346 | */ 347 | export const isColor16 = value => /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/g.test(value); 348 | 349 | /** 350 | * 验证微信号,6至20位,以字母开头,字母,数字,减号,下划线 351 | * @param { string } value 352 | */ 353 | export const isWeChatNum = value => /^[a-zA-Z][-_a-zA-Z0-9]{5,19}$/g.test(value); 354 | 355 | /** 356 | * 验证邮政编码(中国) 357 | * @param { string } value 358 | */ 359 | export const isPostcode = value => /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/g.test(value); 360 | 361 | /** 362 | * 验证中文和数字 363 | * @param { string } value 364 | */ 365 | export const isCHNAndEN = value => /^((?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])|(\d))+$/g.test(value); 366 | 367 | /** 368 | * 验证不能包含字母 369 | * @param { string } value 370 | */ 371 | export const isNoWord = value => /^[^A-Za-z]*$/g.test(value); 372 | 373 | /** 374 | * 验证java包名 375 | * @param { string } value 376 | */ 377 | export const isJavaPackage = value => /^([a-zA-Z_][a-zA-Z0-9_]*)+([.][a-zA-Z_][a-zA-Z0-9_]*)+$/g.test(value); 378 | 379 | /** 380 | * 名称正则校验,规则:名称支持中文、英文、数字以及符号:_()—.- 且不能以 . 开头 381 | * @param { string } value 382 | */ 383 | export const nameReg = (value) => { 384 | return value.match(/^(?![.])[\u4e00-\u9fa5_a-zA-Z0-9-—\(\)\(\).]+$/g) 385 | } -------------------------------------------------------------------------------- /dateUtil/dateUtil.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 此js文件主要包含日期方面的工具函数 3 | */ 4 | 5 | 6 | /** 7 | * 获取当前时间的n天后的时间戳 8 | * @param {number} n 天数 9 | * @returns {Number} 返回值为时间毫秒值 10 | */ 11 | export function toNextTimes(n){ 12 | let timestamp = +new Date() + n * 86400000; 13 | return timestamp; 14 | } 15 | 16 | /*** 17 | * 本周第一天 18 | * @return {*} WeekFirstDay 返回本周第一天的时间 19 | */ 20 | export function showWeekFirstDay(){ 21 | let Nowdate=new Date(); 22 | let WeekFirstDay=new Date(Nowdate-(Nowdate.getDay()-1)*86400000); 23 | return WeekFirstDay; 24 | } 25 | 26 | /*** 27 | * 本周最后一天 28 | * @return {*} WeekLastDay 返回本周最后一天的时间 29 | */ 30 | export function showWeekLastDay(){ 31 | let Nowdate=new Date(); 32 | let WeekFirstDay=new Date(Nowdate-(Nowdate.getDay()-1)*86400000); 33 | let WeekLastDay=new Date((WeekFirstDay/1000+6*86400)*1000); 34 | return WeekLastDay; 35 | } 36 | 37 | 38 | /*** 39 | * 本月第一天 40 | * @return {*} MonthFirstDay 返回本月第一天的时间 41 | */ 42 | export function showMonthFirstDay(){ 43 | let Nowdate=new Date(); 44 | let MonthFirstDay=new Date(Nowdate.getFullYear(),Nowdate.getMonth()); 45 | return MonthFirstDay; 46 | } 47 | 48 | 49 | 50 | /*** 51 | * 本月最后一天 52 | * @return {*} MonthLastDay 返回本月最后一天的时间 53 | */ 54 | export function showMonthLastDay(){ 55 | let Nowdate=new Date(); 56 | let MonthNextFirstDay=new Date(Nowdate.getFullYear(),Nowdate.getMonth()+1); 57 | let MonthLastDay=new Date(MonthNextFirstDay-86400000); 58 | return MonthLastDay; 59 | } 60 | 61 | 62 | /** 63 | * 日期转时间戳 64 | * @param {String} time - 日期字符串,如'2018-8-8','2018,8,8','2018/8/8' 65 | * @returns {Number} 返回值为时间毫秒值 66 | */ 67 | export function timeToTimestamp (time) { 68 | let date = new Date(time); 69 | let timestamp = date.getTime(); 70 | return timestamp; 71 | } 72 | 73 | 74 | 75 | /*** 76 | * 格式化当前时间 77 | * @return {string} timeText 返回系统时间字符串 78 | */ 79 | export function getdataTimeSec() { 80 | let time = new Date(); 81 | let weekDay; 82 | let year = time.getFullYear(); 83 | let month = time.getMonth() + 1; 84 | let day = time.getDate(); 85 | //获取时分秒 86 | let h = time.getHours(); 87 | let m = time.getMinutes(); 88 | let s = time.getSeconds(); 89 | //检查是否小于10 90 | h = check(h); 91 | m = check(m); 92 | s = check(s); 93 | let now_day = time.getDay(); 94 | switch (now_day) { 95 | case 0: { 96 | weekDay = "星期日" 97 | } 98 | break; 99 | case 1: { 100 | weekDay = "星期一" 101 | } 102 | break; 103 | case 2: { 104 | weekDay = "星期二" 105 | } 106 | break; 107 | case 3: { 108 | weekDay = "星期三" 109 | } 110 | break; 111 | case 4: { 112 | weekDay = "星期四" 113 | } 114 | break; 115 | case 5: { 116 | weekDay = "星期五" 117 | } 118 | break; 119 | case 6: { 120 | weekDay = "星期六" 121 | } 122 | break; 123 | case 7: { 124 | weekDay = "星期日" 125 | } 126 | break; 127 | } 128 | let timeText = year + "年" + month + "月" + day + "日 " + " " + weekDay + " " + h + ":" + m +":" + s; 129 | 130 | return timeText 131 | } 132 | 133 | /** 134 | * 日期数字小于10,补“0” 135 | */ 136 | export function check(i) { 137 | let num; 138 | i < 10 ? num = "0" + i : num = i; 139 | return num; 140 | } 141 | 142 | 143 | /** 144 | * 返回指定时间戳之间的时间间隔 145 | * @param {*} startTime 开始时间的时间戳 146 | * @param {*} endTime 结束时间的时间戳 147 | * @return {string} str 返回时间字符串 148 | */ 149 | export function getTimeInterval(startTime, endTime) { 150 | let runTime = parseInt((endTime - startTime) / 1000); 151 | let year = Math.floor(runTime / 86400 / 365); 152 | runTime = runTime % (86400 * 365); 153 | let month = Math.floor(runTime / 86400 / 30); 154 | runTime = runTime % (86400 * 30); 155 | let day = Math.floor(runTime / 86400); 156 | runTime = runTime % 86400; 157 | let hour = Math.floor(runTime / 3600); 158 | runTime = runTime % 3600; 159 | let minute = Math.floor(runTime / 60); 160 | runTime = runTime % 60; 161 | let second = runTime; 162 | let str = ''; 163 | if (year > 0) { 164 | str = year + '年'; 165 | } 166 | if (year <= 0 && month > 0) { 167 | str = month + '月'; 168 | } 169 | if (year <= 0 && month <= 0 && day > 0) { 170 | str = day + '天'; 171 | } 172 | if (year <= 0 && month <= 0 && day <= 0 && hour > 0) { 173 | str = hour + '小时'; 174 | } 175 | if (year <= 0 && month <= 0 && day <= 0 && hour <= 0 && minute > 0) { 176 | str = minute + '分钟'; 177 | } 178 | if (year <= 0 && month <= 0 && day <= 0 && hour <= 0 && minute <= 0 && second > 0) { 179 | str += second + '秒'; 180 | } 181 | str += '前'; 182 | return str; 183 | } 184 | 185 | 186 | 187 | 188 | 189 | /** 190 | * 按类型格式化日期 191 | * @param {*} date 具体日期变量 192 | * @param {string} dateType 需要返回类型 193 | * @return {string} dateText 返回为指定格式的日期字符串 194 | */ 195 | export function getFormatDate(date, dateType) { 196 | let dateObj = new Date(date); 197 | let month = dateObj.getMonth() + 1; 198 | let strDate = dateObj.getDate(); 199 | let hours = dateObj.getHours(); 200 | let minutes = dateObj.getMinutes(); 201 | let seconds = dateObj.getSeconds(); 202 | if (month >= 1 && month <= 9) { 203 | month = "0" + month; 204 | } 205 | if (strDate >= 0 && strDate <= 9) { 206 | strDate = "0" + strDate; 207 | 208 | } 209 | if (hours >= 0 && hours <= 9) { 210 | hours = "0" + hours 211 | } 212 | if (minutes >= 0 && minutes <= 9) { 213 | minutes = "0" + minutes 214 | } 215 | if (seconds >= 0 && seconds <= 9) { 216 | seconds = "0" + seconds 217 | } 218 | 219 | let dateText = dateObj.getFullYear() + '年' + (dateObj.getMonth() + 1) + '月' + dateObj.getDate() + '日'; 220 | if (dateType == "yyyy-mm-dd") { 221 | dateText = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-' + dateObj.getDate(); 222 | } 223 | if (dateType == "yyyy.mm.dd") { 224 | dateText = dateObj.getFullYear() + '.' + (dateObj.getMonth() + 1) + '.' + dateObj.getDate(); 225 | } 226 | if (dateType == "yyyy-mm-dd MM:mm:ss") { 227 | dateText = dateObj.getFullYear() + '-' + month + '-' + strDate + ' ' + hours + ":" + minutes + ":" + seconds; 228 | } 229 | if (dateType == "mm-dd MM:mm:ss") { 230 | dateText = month + '-' + strDate + ' ' + hours + ":" + minutes + ":" + seconds; 231 | } 232 | if (dateType == "yyyy年mm月dd日 MM:mm:ss") { 233 | dateText = dateObj.getFullYear() + '年' + month + '月' + strDate + '日' + ' ' + hours + ":" + minutes + ":" + seconds; 234 | } 235 | return dateText; 236 | } 237 | 238 | 239 | 240 | /** 241 | * 判断是否为闰年 242 | * @param {number} year 要判断的年份 243 | * @return {boolean} 返回布尔值 244 | */ 245 | export function leapYear(year) { 246 | return !(year % (year % 100 ? 4 : 400)); 247 | } 248 | 249 | 250 | 251 | /** 252 | * 返回两个年份之间的闰年 253 | * @param {number} start 开始年份 254 | * @param {number} end 结束年份 255 | * @return {array} arr 返回符合闰年的数组 256 | */ 257 | export function leapYears(start, end) { 258 | let arr = []; 259 | for (var i=start; i= 24 || a[3] >= 60 || a[4] >= 60) { 279 | return false 280 | } 281 | return true; 282 | } 283 | 284 | /** 285 | * 短日期,形如 (2019-10-24) 286 | * @param {string} str 需要验证的短时间 287 | * @return {boolean} 返回布尔值 288 | */ 289 | export function strDateTime(str){ 290 | var result = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); 291 | if (result == null) return false; 292 | var d = new Date(result[1], result[3] - 1, result[4]); 293 | return (d.getFullYear() == result[1] && d.getMonth() + 1 == result[3] && d.getDate() == result[4]); 294 | } 295 | 296 | /** 297 | * 长日期时间,形如 (2019-10-24 10:24:06) 298 | * @param {string} str 需要验证的短时间 299 | * @return {boolean} 返回布尔值 300 | */ 301 | export function strDateTime(str){ 302 | var result = str.match(/^(\d{4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/); 303 | if (result == null) return false; 304 | var d = new Date(result[1], result[3] - 1, result[4], result[5], result[6], result[7]); 305 | return (d.getFullYear() == result[1] && (d.getMonth() + 1) == result[3] && d.getDate() == result[4] && d.getHours() == result[5] && d.getMinutes() == result[6] && d.getSeconds() == result[7]); 306 | } 307 | 308 | 309 | 310 | /** 311 | * 验证日期大小 312 | * 例:"2019-10-24" 和 "2019-10-25" 313 | * @param {string} d1需要验证的日期1 314 | * @param {string} d2需要验证的日期2 315 | * @return {boolean} 返回布尔值 316 | */ 317 | export function compareDate(d1, d2) { 318 | return ((new Date(d1.replace(/-/g, "\/"))) < (new Date(d2.replace(/-/g, "\/")))); 319 | } 320 | 321 | 322 | 323 | /** 324 | * 验证一个日期是不是今天 325 | * @param {string} val 需要验证的日期 326 | * @return {boolean} 返回布尔值 327 | */ 328 | export function isToday(val){ 329 | return new Date().toLocaleDateString() == new Date(val).toLocaleDateString(); 330 | } 331 | 332 | 333 | /** 334 | * 验证传入的日期是否是昨天 335 | * @param {string} val 需要验证的日期 336 | * @return {boolean} 返回布尔值 337 | */ 338 | export function isYesterday(val) { 339 | var today = new Date(); 340 | var yesterday = new Date(now - 1000 * 60 * 60 * 24); 341 | var test = new Date(val); 342 | if (yesterday.getYear() === test.getYear() && yesterday.getMonth() === test.getMonth() && yesterday.getDate() === test.getDate()) { 343 | return true; 344 | } else { 345 | return false; 346 | } 347 | } 348 | 349 | 350 | 351 | /** 352 | * 设置几天后的日期 353 | * @param {string} date 起始日期 354 | * @param {number} day 向后的天数 355 | * @return {string} 返回想要得到的日期 356 | */ 357 | export function convertDate (date, day) { 358 | let tempDate = new Date(date); 359 | tempDate.setDate(tempDate.getDate()+day); 360 | let Y = tempDate.getFullYear(); 361 | let M = tempDate.getMonth()+1 < 10 ? '0'+(tempDate.getMonth()+1) : tempDate.getMonth()+1; 362 | let D = tempDate.getDate() < 10 ? '0'+(tempDate.getDate()) : tempDate.getDate(); 363 | let result = Y + "-" + M + "-" + D 364 | return result; 365 | } -------------------------------------------------------------------------------- /storage/storageUtil.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 主要为存储方面的工具函数 3 | * 感谢主要来源作者: 火狼1-掘金(https://juejin.im/post/5de5be53f265da05c33fcbb4) 4 | */ 5 | 6 | /** 7 | * localStorage 存贮 8 | * 目前对象值如果是函数 、RegExp等特殊对象存贮会被忽略 9 | * @param { String } key 属性 10 | * @param { string } value 值 11 | */ 12 | export const localStorageSet = (key, value) => { 13 | if (typeof (value) === 'object') value = JSON.stringify(value); 14 | localStorage.setItem(key, value) 15 | }; 16 | 17 | /** 18 | * localStorage 获取 19 | * @param {String} key 属性 20 | */ 21 | export const localStorageGet = (key) => { 22 | return localStorage.getItem(key) 23 | }; 24 | 25 | /** 26 | * localStorage 移除 27 | * @param {String} key 属性 28 | */ 29 | export const localStorageRemove = (key) => { 30 | localStorage.removeItem(key) 31 | }; 32 | 33 | /** 34 | * localStorage 存贮某一段时间失效 35 | * @param {String} key 属性 36 | * @param {*} value 存贮值 37 | * @param { number } expire 过期时间,毫秒数 38 | */ 39 | export const localStorageSetExpire = (key, value, expire) => { 40 | if (typeof (value) === 'object') value = JSON.stringify(value); 41 | localStorage.setItem(key, value); 42 | setTimeout(() => { 43 | localStorage.removeItem(key) 44 | }, expire) 45 | }; 46 | 47 | /** 48 | * sessionStorage 存贮 49 | * @param {String} key 属性 50 | * @param {*} value 值 51 | */ 52 | export const sessionStorageSet = (key, value) => { 53 | if (typeof (value) === 'object') value = JSON.stringify(value); 54 | sessionStorage.setItem(key, value) 55 | }; 56 | 57 | /** 58 | * sessionStorage 获取 59 | * @param {String} key 属性 60 | */ 61 | export const sessionStorageGet = (key) => { 62 | return sessionStorage.getItem(key) 63 | }; 64 | 65 | /** 66 | * sessionStorage 删除 67 | * @param {String} key 属性 68 | */ 69 | export const sessionStorageRemove = (key) => { 70 | sessionStorage.removeItem(key) 71 | }; 72 | 73 | /** 74 | * sessionStorage 存贮某一段时间失效 75 | * @param {String} key 属性 76 | * @param {*} value 存贮值 77 | * @param {String} expire 过期时间,毫秒数 78 | */ 79 | export const sessionStorageSetExpire = (key, value, expire) => { 80 | if (typeof (value) === 'object') value = JSON.stringify(value); 81 | sessionStorage.setItem(key, value); 82 | setTimeout(() => { 83 | sessionStorage.removeItem(key) 84 | }, expire) 85 | }; 86 | 87 | /** 88 | * cookie 存贮 89 | * @param {String} key 属性 90 | * @param {*} value 值 91 | * @param { String } expire 过期时间,单位天 92 | */ 93 | export const cookieSet = (key, value, expire) => { 94 | const d = new Date(); 95 | d.setDate(d.getDate() + expire); 96 | document.cookie = `${key}=${value};expires=${d.toUTCString()}` 97 | }; 98 | 99 | /** 100 | * cookie 获取 101 | * @param {String} key 属性 102 | */ 103 | export const cookieGet = (key) => { 104 | const cookieStr = unescape(document.cookie); 105 | const arr = cookieStr.split('; '); 106 | let cookieValue = ''; 107 | for (let i = 0; i < arr.length; i++) { 108 | const temp = arr[i].split('='); 109 | if (temp[0] === key) { 110 | cookieValue = temp[1]; 111 | break 112 | } 113 | } 114 | return cookieValue 115 | }; 116 | 117 | /** 118 | * cookie 删除 119 | * @param {String} key 属性 120 | */ 121 | export const cookieRemove = (key) => { 122 | document.cookie = `${encodeURIComponent(key)}=;expires=${new Date()}` 123 | }; 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /util/util.js: -------------------------------------------------------------------------------- 1 | /** 2 | * lin 3 | * 此文件下主要为常用的工具函数 4 | */ 5 | 6 | /** 7 | * 金钱格式化,三位加逗号 8 | * @param { number } num 9 | */ 10 | export const formatMoney = num => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); 11 | 12 | 13 | /** 14 | * 截取字符串并加身略号 15 | */ 16 | export function subText(str, length) { 17 | if (str.length === 0) { 18 | return ''; 19 | } 20 | if (str.length > length) { 21 | return str.substr(0, length) + "..."; 22 | } else { 23 | return str; 24 | } 25 | } 26 | 27 | 28 | /** 29 | * 获取文件base64编码 30 | * @param file 31 | * @param format 指定文件格式 32 | * @param size 指定文件大小(字节) 33 | * @param formatMsg 格式错误提示 34 | * @param sizeMsg 大小超出限制提示 35 | * @returns {Promise} 36 | */ 37 | export function fileToBase64String(file, format = ['jpg', 'jpeg', 'png', 'gif'], size = 20 * 1024 * 1024, formatMsg = '文件格式不正确', sizeMsg = '文件大小超出限制') { 38 | return new Promise((resolve, reject) => { 39 | // 格式过滤 40 | let suffix = file.type.split('/')[1].toLowerCase(); 41 | let inFormat = false; 42 | for (let i = 0; i < format.length; i++) { 43 | if (suffix === format[i]) { 44 | inFormat = true; 45 | break; 46 | } 47 | } 48 | if (!inFormat) { 49 | reject(formatMsg); 50 | } 51 | // 大小过滤 52 | if (file.size > size) { 53 | reject(sizeMsg); 54 | } 55 | // 转base64字符串 56 | let fileReader = new FileReader(); 57 | fileReader.readAsDataURL(file); 58 | fileReader.onload = () => { 59 | let res = fileReader.result; 60 | resolve({base64String: res, suffix: suffix}); 61 | reject('异常文件,请重新选择'); 62 | } 63 | }) 64 | } 65 | 66 | /** 67 | * B转换到KB,MB,GB并保留两位小数 68 | * @param { number } fileSize 69 | */ 70 | export function formatFileSize(fileSize) { 71 | let temp; 72 | if (fileSize < 1024) { 73 | return fileSize + 'B'; 74 | } else if (fileSize < (1024 * 1024)) { 75 | temp = fileSize / 1024; 76 | temp = temp.toFixed(2); 77 | return temp + 'KB'; 78 | } else if (fileSize < (1024 * 1024 * 1024)) { 79 | temp = fileSize / (1024 * 1024); 80 | temp = temp.toFixed(2); 81 | return temp + 'MB'; 82 | } else { 83 | temp = fileSize / (1024 * 1024 * 1024); 84 | temp = temp.toFixed(2); 85 | return temp + 'GB'; 86 | } 87 | } 88 | 89 | /** 90 | * base64转file 91 | * @param { base64 } base64 92 | * @param { string } filename 转换后的文件名 93 | */ 94 | export const base64ToFile = (base64, filename )=> { 95 | let arr = base64.split(','); 96 | let mime = arr[0].match(/:(.*?);/)[1]; 97 | let suffix = mime.split('/')[1] ;// 图片后缀 98 | let bstr = atob(arr[1]); 99 | let n = bstr.length; 100 | let u8arr = new Uint8Array(n); 101 | while (n--) { 102 | u8arr[n] = bstr.charCodeAt(n) 103 | } 104 | return new File([u8arr], `${filename}.${suffix}`, { type: mime }) 105 | }; 106 | 107 | /** 108 | * base64转blob 109 | * @param { base64 } base64 110 | */ 111 | export const base64ToBlob = base64 => { 112 | let arr = base64.split(','), 113 | mime = arr[0].match(/:(.*?);/)[1], 114 | bstr = atob(arr[1]), 115 | n = bstr.length, 116 | u8arr = new Uint8Array(n); 117 | while (n--) { 118 | u8arr[n] = bstr.charCodeAt(n); 119 | } 120 | return new Blob([u8arr], { type: mime }); 121 | }; 122 | 123 | /** 124 | * blob转file 125 | * @param { blob } blob 126 | * @param { string } fileName 127 | */ 128 | export const blobToFile = (blob, fileName) => { 129 | blob.lastModifiedDate = new Date(); 130 | blob.name = fileName; 131 | return blob; 132 | }; 133 | 134 | /** 135 | * file转base64 136 | * @param { * } file 图片文件 137 | */ 138 | export const fileToBase64 = file => { 139 | let reader = new FileReader(); 140 | reader.readAsDataURL(file); 141 | reader.onload = function (e) { 142 | return e.target.result 143 | }; 144 | }; 145 | 146 | /** 147 | * 递归生成树形结构 148 | */ 149 | export function getTreeData(data, pid, pidName = 'parentId', idName = 'id', childrenName = 'children', key) { 150 | let arr = []; 151 | 152 | for (let i = 0; i < data.length; i++) { 153 | if (data[i][pidName] == pid) { 154 | data[i].key = data[i][idName]; 155 | data[i][childrenName] = getTreeData(data, data[i][idName], pidName, idName, childrenName); 156 | arr.push(data[i]); 157 | } 158 | } 159 | 160 | return arr; 161 | } 162 | 163 | 164 | /** 165 | * 遍历树节点 166 | */ 167 | export function foreachTree(data, childrenName = 'children', callback) { 168 | for (let i = 0; i < data.length; i++) { 169 | callback(data[i]); 170 | if (data[i][childrenName] && data[i][childrenName].length > 0) { 171 | foreachTree(data[i][childrenName], childrenName, callback); 172 | } 173 | } 174 | } 175 | 176 | 177 | /** 178 | * 追溯父节点 179 | */ 180 | export function traceParentNode(pid, data, rootPid, pidName = 'parentId', idName = 'id', childrenName = 'children') { 181 | let arr = []; 182 | foreachTree(data, childrenName, (node) => { 183 | if (node[idName] == pid) { 184 | arr.push(node); 185 | if (node[pidName] != rootPid) { 186 | arr = arr.concat(traceParentNode(node[pidName], data, rootPid, pidName, idName)); 187 | } 188 | } 189 | }); 190 | return arr; 191 | } 192 | 193 | 194 | /** 195 | * 寻找所有子节点 196 | */ 197 | export function traceChildNode(id, data, pidName = 'parentId', idName = 'id', childrenName = 'children') { 198 | let arr = []; 199 | foreachTree(data, childrenName, (node) => { 200 | if (node[pidName] == id) { 201 | arr.push(node); 202 | arr = arr.concat(traceChildNode(node[idName], data, pidName, idName, childrenName)); 203 | } 204 | }); 205 | return arr; 206 | } 207 | 208 | /** 209 | * 根据pid生成树形结构 210 | * @param { object } items 后台获取的数据 211 | * @param { * } id 数据中的id 212 | * @param { * } link 生成树形结构的依据 213 | */ 214 | export const createTree = (items, id = null, link = 'pid') =>{ 215 | items.filter(item => item[link] === id).map(item => ({ ...item, children: createTree(items, item.id) })); 216 | }; 217 | 218 | 219 | /** 220 | * 查询数组中是否存在某个元素并返回元素第一次出现的下标 221 | * @param {*} item 222 | * @param { array } data 223 | */ 224 | export function inArray(item, data) { 225 | for (let i = 0; i < data.length; i++) { 226 | if (item === data[i]) { 227 | return i; 228 | } 229 | } 230 | return -1; 231 | } 232 | 233 | 234 | /** 235 | * Windows根据详细版本号判断当前系统名称 236 | * @param { string } osVersion 237 | */ 238 | export function OutOsName(osVersion) { 239 | if(!osVersion){ 240 | return 241 | } 242 | let str = osVersion.substr(0, 3); 243 | if (str === "5.0") { 244 | return "Win 2000" 245 | } else if (str === "5.1") { 246 | return "Win XP" 247 | } else if (str === "5.2") { 248 | return "Win XP64" 249 | } else if (str === "6.0") { 250 | return "Win Vista" 251 | } else if (str === "6.1") { 252 | return "Win 7" 253 | } else if (str === "6.2") { 254 | return "Win 8" 255 | } else if (str === "6.3") { 256 | return "Win 8.1" 257 | } else if (str === "10.") { 258 | return "Win 10" 259 | } else { 260 | return "Win" 261 | } 262 | } 263 | 264 | 265 | /** 266 | * 判断手机是Andoird还是IOS 267 | * 0: ios 268 | * 1: android 269 | * 2: 其它 270 | */ 271 | export function getOSType() { 272 | let u = navigator.userAgent, app = navigator.appVersion; 273 | let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; 274 | let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); 275 | if (isIOS) { 276 | return 0; 277 | } 278 | if (isAndroid) { 279 | return 1; 280 | } 281 | return 2; 282 | } 283 | 284 | 285 | /** 286 | * @desc 函数防抖 287 | * @param { function } func 288 | * @param { number } wait 延迟执行毫秒数 289 | * @param { boolean } immediate true 表立即执行,false 表非立即执行 290 | */ 291 | export function debounce(func,wait,immediate) { 292 | let timeout; 293 | return function () { 294 | let context = this; 295 | let args = arguments; 296 | 297 | if (timeout) clearTimeout(timeout); 298 | if (immediate) { 299 | let callNow = !timeout; 300 | timeout = setTimeout(() => { 301 | timeout = null; 302 | }, wait); 303 | if (callNow) func.apply(context, args) 304 | } 305 | else { 306 | timeout = setTimeout(() => { 307 | func.apply(context, args) 308 | }, wait); 309 | } 310 | } 311 | } 312 | 313 | 314 | /** 315 | * @desc 函数节流 316 | * @param { function } func 函数 317 | * @param { number } wait 延迟执行毫秒数 318 | * @param { number } type 1 表时间戳版,2 表定时器版 319 | */ 320 | export function throttle(func, wait ,type) { 321 | let previous, timeout; 322 | if(type===1){ 323 | previous = 0; 324 | }else if(type===2){ 325 | timeout = null; 326 | } 327 | return function() { 328 | let context = this; 329 | let args = arguments; 330 | if(type===1){ 331 | let now = Date.now(); 332 | 333 | if (now - previous > wait) { 334 | func.apply(context, args); 335 | previous = now; 336 | } 337 | }else if(type===2){ 338 | if (!timeout) { 339 | timeout = setTimeout(() => { 340 | timeout = null; 341 | func.apply(context, args) 342 | }, wait) 343 | } 344 | } 345 | 346 | } 347 | } 348 | 349 | 350 | /** 351 | * 判断类型 352 | * @param {*} target 353 | */ 354 | export function type(target) { 355 | let ret = typeof(target); 356 | let template = { 357 | "[object Array]": "array", 358 | "[object Object]":"object", 359 | "[object Number]":"number - object", 360 | "[object Boolean]":"boolean - object", 361 | "[object String]":'string-object' 362 | }; 363 | 364 | if(target === null) { 365 | return 'null'; 366 | }else if(ret == "object"){ 367 | let str = Object.prototype.toString.call(target); 368 | return template[str]; 369 | }else{ 370 | return ret; 371 | } 372 | } 373 | 374 | /** 375 | * 生成指定范围随机数 376 | * @param { number } min 377 | * @param { number } max 378 | */ 379 | export const RandomNum = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; 380 | 381 | 382 | /** 383 | * 数组乱序 384 | * @param {array} arr 385 | */ 386 | export function arrScrambling(arr) { 387 | let array = arr; 388 | let index = array.length; 389 | while (index) { 390 | index -= 1; 391 | let randomIndex = Math.floor(Math.random() * index); 392 | let middleware = array[index]; 393 | array[index] = array[randomIndex]; 394 | array[randomIndex] = middleware 395 | } 396 | return array 397 | } 398 | 399 | 400 | /** 401 | * 数组交集 402 | * @param { array} arr1 403 | * @param { array } arr2 404 | */ 405 | export const similarity = (arr1, arr2) => arr1.filter(v => arr2.includes(v)); 406 | 407 | 408 | /** 409 | * 数组中某元素出现的次数 410 | * @param { array } arr 411 | * @param {*} value 412 | */ 413 | export function countOccurrences(arr, value) { 414 | return arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0); 415 | } 416 | 417 | /** 418 | * 加法函数(精度丢失问题) 419 | * @param { number } arg1 420 | * @param { number } arg2 421 | */ 422 | export function add(arg1, arg2) { 423 | let r1, r2, m; 424 | try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 } 425 | try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 } 426 | m = Math.pow(10, Math.max(r1, r2)); 427 | return (arg1 * m + arg2 * m) / m 428 | } 429 | 430 | /** 431 | * 减法函数(精度丢失问题) 432 | * @param { number } arg1 433 | * @param { number } arg2 434 | */ 435 | export function sub(arg1, arg2) { 436 | let r1, r2, m, n; 437 | try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 } 438 | try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 } 439 | m = Math.pow(10, Math.max(r1, r2)); 440 | n = (r1 >= r2) ? r1 : r2; 441 | return Number(((arg1 * m - arg2 * m) / m).toFixed(n)); 442 | } 443 | /** 444 | * 除法函数(精度丢失问题) 445 | * @param { number } num1 446 | * @param { number } num2 447 | */ 448 | export function division(num1,num2){ 449 | let t1,t2,r1,r2; 450 | try{ 451 | t1 = num1.toString().split('.')[1].length; 452 | }catch(e){ 453 | t1 = 0; 454 | } 455 | try{ 456 | t2=num2.toString().split(".")[1].length; 457 | }catch(e){ 458 | t2=0; 459 | } 460 | r1=Number(num1.toString().replace(".","")); 461 | r2=Number(num2.toString().replace(".","")); 462 | return (r1/r2)*Math.pow(10,t2-t1); 463 | } 464 | 465 | /** 466 | * 乘法函数(精度丢失问题) 467 | * @param { number } num1 468 | * @param { number } num2 469 | */ 470 | export function mcl(num1,num2){ 471 | let m=0,s1=num1.toString(),s2=num2.toString(); 472 | try{m+=s1.split(".")[1].length}catch(e){} 473 | try{m+=s2.split(".")[1].length}catch(e){} 474 | return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m); 475 | } 476 | 477 | 478 | /** 479 | * 递归优化(尾递归) 480 | * @param { function } f 481 | */ 482 | export function tco(f) { 483 | let value; 484 | let active = false; 485 | let accumulated = []; 486 | 487 | return function accumulator() { 488 | accumulated.push(arguments); 489 | if (!active) { 490 | active = true; 491 | while (accumulated.length) { 492 | value = f.apply(this, accumulated.shift()); 493 | } 494 | active = false; 495 | return value; 496 | } 497 | }; 498 | } 499 | 500 | 501 | /** 502 | * 生成随机整数 503 | * 504 | */ 505 | export function randomNumInteger(min, max) { 506 | switch (arguments.length) { 507 | case 1: 508 | return parseInt(Math.random() * min + 1, 10); 509 | case 2: 510 | return parseInt(Math.random() * (max - min + 1) + min, 10); 511 | default: 512 | return 0 513 | } 514 | } 515 | 516 | /** 517 | * 去除空格 518 | * @param { string } str 待处理字符串 519 | * @param { number } type 去除空格类型 1-所有空格 2-前后空格 3-前空格 4-后空格 默认为1 520 | */ 521 | export function trim(str, type = 1) { 522 | if (type && type !== 1 && type !== 2 && type !== 3 && type !== 4) return; 523 | switch (type) { 524 | case 1: 525 | return str.replace(/\s/g, ""); 526 | case 2: 527 | return str.replace(/(^\s)|(\s*$)/g, ""); 528 | case 3: 529 | return str.replace(/(^\s)/g, ""); 530 | case 4: 531 | return str.replace(/(\s$)/g, ""); 532 | default: 533 | return str; 534 | } 535 | } 536 | 537 | 538 | /** 539 | * 大小写转换 540 | * @param { string } str 待转换的字符串 541 | * @param { number } type 1-全大写 2-全小写 3-首字母大写 其他-不转换 542 | */ 543 | 544 | export function turnCase(str, type) { 545 | switch (type) { 546 | case 1: 547 | return str.toUpperCase(); 548 | case 2: 549 | return str.toLowerCase(); 550 | case 3: 551 | return str[0].toUpperCase() + str.substr(1).toLowerCase(); 552 | default: 553 | return str; 554 | } 555 | } 556 | 557 | /** 558 | * 随机16进制颜色 hexColor 559 | * 方法一 560 | */ 561 | 562 | export function hexColor() { 563 | 564 | let str = '#'; 565 | let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F']; 566 | for (let i = 0; i < 6; i++) { 567 | let index = Number.parseInt((Math.random() * 16).toString()); 568 | str += arr[index] 569 | } 570 | return str; 571 | } 572 | /** 573 | * 随机16进制颜色 randomHexColorCode 574 | * 方法二 575 | */ 576 | export const randomHexColorCode = () => { 577 | let n = (Math.random() * 0xfffff * 1000000).toString(16); 578 | return '#' + n.slice(0, 6); 579 | }; 580 | 581 | 582 | 583 | /** 584 | * 转义html(防XSS攻击) 585 | */ 586 | export const escapeHTML = str =>{ 587 | str.replace( 588 | /[&<>'"]/g, 589 | tag => 590 | ({ 591 | '&': '&', 592 | '<': '<', 593 | '>': '>', 594 | "'": ''', 595 | '"': '"' 596 | }[tag] || tag) 597 | ); 598 | }; 599 | 600 | /** 601 | * 检测移动/PC设备 602 | */ 603 | export const detectDeviceType = () => { return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop'; }; 604 | 605 | 606 | /** 607 | * 隐藏所有指定标签 608 | * 例: hide(document.querySelectorAll('img')) 609 | */ 610 | export const hideTag = (...el) => [...el].forEach(e => (e.style.display = 'none')); 611 | 612 | 613 | /** 614 | * 返回指定元素的生效样式 615 | * @param { element} el 元素节点 616 | * @param { string } ruleName 指定元素的名称 617 | */ 618 | export const getStyle = (el, ruleName) => getComputedStyle(el)[ruleName]; 619 | 620 | /** 621 | * 检查是否包含子元素 622 | * @param { element } parent 623 | * @param { element } child 624 | * 例:elementContains(document.querySelector('head'), document.querySelector('title')); // true 625 | */ 626 | export const elementContains = (parent, child) => parent !== child && parent.contains(child); 627 | 628 | 629 | /** 630 | * 数字超过规定大小加上加号“+”,如数字超过99显示99+ 631 | * @param { number } val 输入的数字 632 | * @param { number } maxNum 数字规定界限 633 | */ 634 | export const outOfNum = (val, maxNum) =>{ 635 | val = val ? val-0 :0; 636 | if (val > maxNum ) { 637 | return `${maxNum}+` 638 | }else{ 639 | return val; 640 | } 641 | }; 642 | 643 | /** 644 | * 计算多个数字或者数组中数字的总和 645 | * @param { number / array } arr 输入的数字 646 | * 647 | */ 648 | 649 | export const sumNum = (...arr) => [...arr].reduce((acc, val) => acc + val, 0); 650 | 651 | 652 | 653 | /** 654 | * 将阿拉伯数字翻译成中文的大写数字 655 | * @param { number } num 656 | */ 657 | export function numberToChinese (num) { 658 | var AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"); 659 | var BB = new Array("", "十", "百", "仟", "萬", "億", "点", ""); 660 | var a = ("" + num).replace(/(^0*)/g, "").split("."), 661 | k = 0, 662 | re = ""; 663 | for(var i = a[0].length - 1; i >= 0; i--) { 664 | switch(k) { 665 | case 0: 666 | re = BB[7] + re; 667 | break; 668 | case 4: 669 | if(!new RegExp("0{4}//d{" + (a[0].length - i - 1) + "}$") 670 | .test(a[0])) 671 | re = BB[4] + re; 672 | break; 673 | case 8: 674 | re = BB[5] + re; 675 | BB[7] = BB[5]; 676 | k = 0; 677 | break; 678 | } 679 | if(k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) 680 | re = AA[0] + re; 681 | if(a[0].charAt(i) != 0) 682 | re = AA[a[0].charAt(i)] + BB[k % 4] + re; 683 | k++; 684 | } 685 | 686 | if(a.length > 1) // 加上小数部分(如果有小数部分) 687 | { 688 | re += BB[6]; 689 | for(var i = 0; i < a[1].length; i++) 690 | re += AA[a[1].charAt(i)]; 691 | } 692 | if(re == '一十') 693 | re = "十"; 694 | if(re.match(/^一/) && re.length == 3) 695 | re = re.replace("一", ""); 696 | return re; 697 | } 698 | 699 | /** 700 | * 将数字转换为大写金额 701 | * @param { number } Num 702 | */ 703 | export function changeToChinese (Num) { 704 | //判断如果传递进来的不是字符的话转换为字符 705 | if(typeof Num == "number") { 706 | Num = new String(Num); 707 | }; 708 | Num = Num.replace(/,/g, "") //替换tomoney()中的“,” 709 | Num = Num.replace(/ /g, "") //替换tomoney()中的空格 710 | Num = Num.replace(/¥/g, "") //替换掉可能出现的¥字符 711 | if(isNaN(Num)) { //验证输入的字符是否为数字 712 | //alert("请检查小写金额是否正确"); 713 | return ""; 714 | }; 715 | //字符处理完毕后开始转换,采用前后两部分分别转换 716 | var part = String(Num).split("."); 717 | var newchar = ""; 718 | //小数点前进行转化 719 | for(var i = part[0].length - 1; i >= 0; i--) { 720 | if(part[0].length > 10) { 721 | return ""; 722 | //若数量超过拾亿单位,提示 723 | } 724 | var tmpnewchar = "" 725 | var perchar = part[0].charAt(i); 726 | switch(perchar) { 727 | case "0": 728 | tmpnewchar = "零" + tmpnewchar; 729 | break; 730 | case "1": 731 | tmpnewchar = "壹" + tmpnewchar; 732 | break; 733 | case "2": 734 | tmpnewchar = "贰" + tmpnewchar; 735 | break; 736 | case "3": 737 | tmpnewchar = "叁" + tmpnewchar; 738 | break; 739 | case "4": 740 | tmpnewchar = "肆" + tmpnewchar; 741 | break; 742 | case "5": 743 | tmpnewchar = "伍" + tmpnewchar; 744 | break; 745 | case "6": 746 | tmpnewchar = "陆" + tmpnewchar; 747 | break; 748 | case "7": 749 | tmpnewchar = "柒" + tmpnewchar; 750 | break; 751 | case "8": 752 | tmpnewchar = "捌" + tmpnewchar; 753 | break; 754 | case "9": 755 | tmpnewchar = "玖" + tmpnewchar; 756 | break; 757 | } 758 | switch(part[0].length - i - 1) { 759 | case 0: 760 | tmpnewchar = tmpnewchar + "元"; 761 | break; 762 | case 1: 763 | if(perchar != 0) tmpnewchar = tmpnewchar + "拾"; 764 | break; 765 | case 2: 766 | if(perchar != 0) tmpnewchar = tmpnewchar + "佰"; 767 | break; 768 | case 3: 769 | if(perchar != 0) tmpnewchar = tmpnewchar + "仟"; 770 | break; 771 | case 4: 772 | tmpnewchar = tmpnewchar + "万"; 773 | break; 774 | case 5: 775 | if(perchar != 0) tmpnewchar = tmpnewchar + "拾"; 776 | break; 777 | case 6: 778 | if(perchar != 0) tmpnewchar = tmpnewchar + "佰"; 779 | break; 780 | case 7: 781 | if(perchar != 0) tmpnewchar = tmpnewchar + "仟"; 782 | break; 783 | case 8: 784 | tmpnewchar = tmpnewchar + "亿"; 785 | break; 786 | case 9: 787 | tmpnewchar = tmpnewchar + "拾"; 788 | break; 789 | } 790 | var newchar = tmpnewchar + newchar; 791 | } 792 | //小数点之后进行转化 793 | if(Num.indexOf(".") != -1) { 794 | if(part[1].length > 2) { 795 | // alert("小数点之后只能保留两位,系统将自动截断"); 796 | part[1] = part[1].substr(0, 2) 797 | } 798 | for(i = 0; i < part[1].length; i++) { 799 | tmpnewchar = "" 800 | perchar = part[1].charAt(i) 801 | switch(perchar) { 802 | case "0": 803 | tmpnewchar = "零" + tmpnewchar; 804 | break; 805 | case "1": 806 | tmpnewchar = "壹" + tmpnewchar; 807 | break; 808 | case "2": 809 | tmpnewchar = "贰" + tmpnewchar; 810 | break; 811 | case "3": 812 | tmpnewchar = "叁" + tmpnewchar; 813 | break; 814 | case "4": 815 | tmpnewchar = "肆" + tmpnewchar; 816 | break; 817 | case "5": 818 | tmpnewchar = "伍" + tmpnewchar; 819 | break; 820 | case "6": 821 | tmpnewchar = "陆" + tmpnewchar; 822 | break; 823 | case "7": 824 | tmpnewchar = "柒" + tmpnewchar; 825 | break; 826 | case "8": 827 | tmpnewchar = "捌" + tmpnewchar; 828 | break; 829 | case "9": 830 | tmpnewchar = "玖" + tmpnewchar; 831 | break; 832 | } 833 | if(i == 0) tmpnewchar = tmpnewchar + "角"; 834 | if(i == 1) tmpnewchar = tmpnewchar + "分"; 835 | newchar = newchar + tmpnewchar; 836 | } 837 | } 838 | //替换所有无用汉字 839 | while(newchar.search("零零") != -1) 840 | newchar = newchar.replace("零零", "零"); 841 | newchar = newchar.replace("零亿", "亿"); 842 | newchar = newchar.replace("亿万", "亿"); 843 | newchar = newchar.replace("零万", "万"); 844 | newchar = newchar.replace("零元", "元"); 845 | newchar = newchar.replace("零角", ""); 846 | newchar = newchar.replace("零分", ""); 847 | if(newchar.charAt(newchar.length - 1) == "元") { 848 | newchar = newchar + "整" 849 | } 850 | return newchar; 851 | } 852 | 853 | /** 854 | * 根据数组中的某一属性的值(数字)进行升序或降序排序 855 | * @param { string } property 排序所依赖的属性 856 | * @param { string } flag "asc":升序 "desc": 降序 857 | * 调用方式:arr.sort(sortCompare('age','asc')); 858 | * 这里的 arr 为准备排序的数组 859 | */ 860 | function sortCompare(property,flag){ 861 | return function(a,b){ 862 | var value1 = a[property]; 863 | var value2 = b[property]; 864 | if(flag === "asc"){ 865 | return value1 - value2; 866 | } else if (flag === "desc"){ 867 | return value2 - value1; 868 | } 869 | 870 | } 871 | } 872 | 873 | 874 | /** 875 | * 查找两个数组中的相同元素 876 | * @param { array } arr1 877 | * @param { array } arr2 878 | */ 879 | export const filterSame = (arr1, arr2) => { 880 | if (arr1 && arr1.length > 0) { 881 | return arr1.filter((item) => { 882 | return arr2.indexOf(item) !== -1 883 | }) 884 | } else { 885 | return [] 886 | } 887 | } 888 | 889 | /** 890 | * 查找两个数组中的不同元素 891 | * @param { array } arr1 892 | * @param { array } arr2 893 | */ 894 | export const filterDiff = (arr1, arr2) => { 895 | if (arr1 && arr1.length > 0) { 896 | return arr1.filter((item) => { 897 | return arr2.indexOf(item) === -1 898 | }) 899 | } else { 900 | return [] 901 | } 902 | } 903 | 904 | /** 905 | * 判断数组中是否有重复元素 906 | * @param { Array } arr 907 | */ 908 | export const isRepeat = (arr) =>{ 909 | let hash; 910 | for(let i = 0; i < arr .length; i ++) { 911 | if(hash[arr[i]]) { 912 | return true; 913 | } 914 | hash[arr[i]] = true; 915 | } 916 | return false; 917 | } 918 | 919 | /** 920 | * 获取对象中值不为空的元素 921 | * @param { obj } value 922 | */ 923 | export const getNotNullItem = (value) => { 924 | let obj; 925 | for (let i in value) { 926 | if (value[i]) { 927 | obj[i] = value[i] 928 | } 929 | } 930 | return obj; 931 | } 932 | 933 | /** 934 | * 取出字符串中括号"{{}}"内的内容 935 | * 他类型的括号同理修改正则/\{\{(.*?)\}\}/g,如需取 "()"中的值,则可以这样:/\((.*?)\)/g 936 | * @param {string} text 937 | * @returns {Array} 938 | */ 939 | export const getBracketStr = (text) => { 940 | let result = [] 941 | if (text === ''){ 942 | return result 943 | } 944 | let options = str.match(/\{\{(.*?)\}\}/g); 945 | if(options) { 946 | options.forEach((item) => { 947 | const res = item.replace(/\{/gi,'').replace(/\}/gi,'') 948 | if(res) { 949 | result.push(res) 950 | } 951 | }) 952 | } 953 | return result 954 | } --------------------------------------------------------------------------------