utils.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. import { PAGE_CODE } from '~/common/c.js'
  2. // 把多次encodeURIComponent结果decode到最终不变
  3. export const parseEncodeURIComponent = (s = '') => {
  4. let decodeStr = decodeURIComponent(s)
  5. if (decodeStr === s) {
  6. return decodeStr
  7. } else {
  8. return parseEncodeURIComponent(decodeStr)
  9. }
  10. }
  11. export const getPageCode = href => {
  12. if (typeof window === 'undefined') {
  13. // console.log('此方法只支持在浏览器中执行')
  14. return PAGE_CODE.defaultCode
  15. }
  16. if (!href) {
  17. return PAGE_CODE.defaultCode
  18. }
  19. let pageCode = PAGE_CODE.defaultCode
  20. let domA = document.createElement('a')
  21. domA.href = href
  22. const path = domA.pathname
  23. domA = null
  24. // 首页路径 匹配范围 / /cn /cn/ /en /en/ //nuxt会报错 忽略
  25. // 文章路径 /articles /articles/ /cn/articles /cn/articles/ /en/articles /en/articles/
  26. if (
  27. /^(\/|\/cn|\/en)(\/?)$/.test(path) ||
  28. /^(\/cn|\/en)?\/articles(\/?)$/.test(path)
  29. ) {
  30. pageCode = PAGE_CODE.articleList
  31. } else if (/^(\/cn|\/en)?\/article\/\d+(\/?)$/.test(path)) {
  32. // 文章详情路径 /article/:id /article/:id/ /cn/article/:id /cn/article/:id/ /en/article/:id /en/article/:id/
  33. pageCode = PAGE_CODE.article
  34. } else if (/^(\/cn|\/en)?\/videos(\/?)$/.test(path)) {
  35. // 视频路径 /videos /videos/ /cn/videos /cn/videos/ /en/videos /en/videos/
  36. pageCode = PAGE_CODE.videoList
  37. }
  38. return pageCode
  39. }
  40. export const MyCookie = {
  41. transferCookieStrToObj: cookieStr => {
  42. if (!cookieStr) {
  43. // console.log('请传入cookies string')
  44. return {}
  45. }
  46. const pairs = cookieStr.split(';')
  47. const cookies = {}
  48. for (let i = 0; i < pairs.length; i++) {
  49. const pair = pairs[i].split('=')
  50. // cookies[pair[0].trim()] = unescape(pair[1].trim())
  51. cookies[pair[0].trim()] = pair[1].trim()
  52. }
  53. return cookies
  54. },
  55. setCookie: (key, value = '', exdays = 1, domainCtrl = false) => {
  56. if (typeof window === 'undefined') {
  57. // console.log('此方法只支持在浏览器中执行')
  58. return false
  59. }
  60. if (!key) {
  61. // console.log('请传入cookie name')
  62. return false
  63. }
  64. const d = new Date()
  65. d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000)
  66. if (domainCtrl) {
  67. const domain =
  68. window.location.host.indexOf('hoolihome.com') !== -1
  69. ? '.hoolihome.com'
  70. : ''
  71. document.cookie = `${key}=${value}; domain=${domain}; path=/; expires=${d.toGMTString()}`
  72. } else {
  73. document.cookie = `${key}=${value}; path=/; expires=${d.toGMTString()}`
  74. }
  75. },
  76. getCookie: key => {
  77. if (typeof window === 'undefined') {
  78. // console.log('此方法只支持在浏览器中执行')
  79. return false
  80. }
  81. if (!key) {
  82. // console.log('请传入cookie name')
  83. return false
  84. }
  85. const cookieStr = document.cookie
  86. if (cookieStr.length > 0) {
  87. let cStart = cookieStr.indexOf(key + '=')
  88. if (cStart !== -1) {
  89. cStart = cStart + key.length + 1
  90. let cEnd = cookieStr.indexOf(';', cStart)
  91. if (cEnd === -1) cEnd = cookieStr.length
  92. // return unescape(cookieStr.substring(cStart, cEnd))
  93. return cookieStr.substring(cStart, cEnd)
  94. }
  95. }
  96. return ''
  97. },
  98. deleteCookie: (key, domainCtrl = false) => {
  99. if (typeof window === 'undefined') {
  100. // console.log('此方法只支持在浏览器中执行')
  101. return false
  102. }
  103. if (!key) {
  104. // console.log('请传入cookie name')
  105. return false
  106. }
  107. if (domainCtrl) {
  108. const domain =
  109. window.location.host.indexOf('hoolihome.com') !== -1
  110. ? '.hoolihome.com'
  111. : ''
  112. document.cookie = `${key}=; domain=${domain}; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`
  113. } else {
  114. document.cookie = `${key}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`
  115. }
  116. }
  117. }
  118. export const isObjectEmpty = obj => {
  119. if (!obj || typeof obj !== 'object') {
  120. return true
  121. }
  122. for (let key in obj) {
  123. return false
  124. }
  125. return true
  126. }
  127. export const loadSrc = (url, domId, type) => {
  128. if (typeof window === 'undefined') {
  129. return false
  130. }
  131. return new Promise((resolve, reject) => {
  132. if (!url) {
  133. reject(new Error('请设置加载资源的url'))
  134. return false
  135. }
  136. if (!domId) {
  137. reject(new Error('请设置加载资源的dom Id'))
  138. return false
  139. }
  140. if (document.getElementById(domId)) {
  141. resolve()
  142. } else {
  143. if (type === 'css') {
  144. let cssLink = document.createElement('link')
  145. cssLink.id = domId
  146. cssLink.type = 'text/css'
  147. cssLink.rel = 'stylesheet'
  148. cssLink.href = url
  149. cssLink.onload = () => {
  150. resolve()
  151. }
  152. document.head.appendChild(cssLink)
  153. } else {
  154. let jsScript = document.createElement('script')
  155. jsScript.id = domId
  156. jsScript.type = 'text/javascript'
  157. jsScript.onload = () => {
  158. resolve()
  159. }
  160. jsScript.src = url
  161. document.body.appendChild(jsScript)
  162. }
  163. }
  164. })
  165. }
  166. // ahex 转 rgba
  167. export const colorToRgba = color => {
  168. let rgba = ''
  169. color = color.substr(1)
  170. let colorLen = color.length
  171. let aValue, rValue, gValue, bValue
  172. aValue = '0xFF'
  173. if (colorLen === 6 || colorLen === 8) {
  174. if (colorLen === 8) {
  175. aValue = '0x' + color.substr(0, 2)
  176. color = color.substr(2)
  177. }
  178. rValue = '0x' + color.substr(0, 2)
  179. gValue = '0x' + color.substr(2, 2)
  180. bValue = '0x' + color.substr(4, 2)
  181. rgba =
  182. 'rgba(' +
  183. parseInt(rValue) +
  184. ',' +
  185. parseInt(gValue) +
  186. ',' +
  187. parseInt(bValue) +
  188. ',' +
  189. parseInt(aValue) / 255 +
  190. ')'
  191. }
  192. return rgba
  193. }
  194. export const countStringBytes = str => {
  195. var r = 0
  196. for (var i = 0; i < str.length; i++) {
  197. var c = str.charCodeAt(i)
  198. // Shift_JIS: 0x0 ~ 0x80, 0xa0 , 0xa1 ~ 0xdf , 0xfd ~ 0xff
  199. // Unicode : 0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3
  200. if (
  201. (c >= 0x0 && c < 0x81) ||
  202. c == 0xf8f0 ||
  203. (c >= 0xff61 && c < 0xffa0) ||
  204. (c >= 0xf8f1 && c < 0xf8f4)
  205. ) {
  206. r += 1
  207. } else {
  208. r += 2
  209. }
  210. }
  211. return r
  212. }
  213. export const cstr = s => {
  214. /*处理null、undefined或NaN字符串*/
  215. if (s) {
  216. return s.toString()
  217. } else {
  218. return ''
  219. }
  220. }
  221. export const formatTimeCountToStr = t => {
  222. /*格式化时间戳差*/
  223. if (t > 0) {
  224. let h = Math.floor((t / 60 / 60) % 24)
  225. if (h < 10) {
  226. h = `0${h}`
  227. }
  228. let m = Math.floor((t / 60) % 60)
  229. if (m < 10) {
  230. m = `0${m}`
  231. }
  232. let s = Math.floor(t % 60)
  233. if (s < 10) {
  234. s = `0${s}`
  235. }
  236. return `${h}:${m}:${s}`
  237. }
  238. return ''
  239. }
  240. export const formatTimeToStr = t => {
  241. if (t) {
  242. t = parseInt(t)
  243. let time = new Date(t * 1000)
  244. let year = time.getFullYear()
  245. let month = time.getMonth() + 1
  246. if (month < 10) {
  247. month = `0${month}`
  248. }
  249. let date = time.getDate()
  250. if (date < 10) {
  251. date = `0${date}`
  252. }
  253. let hour = time.getHours()
  254. if (hour < 10) {
  255. hour = `0${hour}`
  256. }
  257. let minute = time.getMinutes()
  258. if (minute < 10) {
  259. minute = `0${minute}`
  260. }
  261. let second = time.getSeconds()
  262. if (second < 10) {
  263. second = `0${second}`
  264. }
  265. return `${year}-${month}-${date} ${hour}:${minute}:${second}`
  266. }
  267. return ''
  268. }
  269. export const deepClone = obj => {
  270. /* 深度克隆对象 */
  271. try {
  272. return JSON.parse(JSON.stringify(obj))
  273. } catch (e) {
  274. return obj
  275. }
  276. }
  277. export const money = (m, c, w) => {
  278. /*m:金额;c:保留小数位数,只能取值0,1,2;w:1返回整个金额,2返回整数部分,3返回小数部分*/
  279. if (c !== 0 && c !== 1 && c !== 2) {
  280. // console.log('传入保留小数位数参数错误')
  281. return ''
  282. }
  283. if (w !== 1 && w !== 2 && w !== 3) {
  284. // console.log('传入返回类型参数错误')
  285. return ''
  286. }
  287. if (0 === m) {
  288. /*由于0=false,需特殊处理*/
  289. return deal('0', '')
  290. } else {
  291. if (!m || isNaN(m)) {
  292. return ''
  293. }
  294. m = m.toString()
  295. if (-1 === m.indexOf('.')) {
  296. return deal(m, '')
  297. } else {
  298. var s_arr = m.split('.')
  299. return deal(s_arr[0], s_arr[1])
  300. }
  301. }
  302. function deal(p, f) {
  303. /*p为整数部分*/
  304. if (0 === c) {
  305. if (1 === w) {
  306. return p
  307. } else if (2 === w) {
  308. return p
  309. } else if (3 === w) {
  310. return ''
  311. }
  312. } else if (1 === c) {
  313. if (0 === f.length) {
  314. f = '0'
  315. } else if (f.length >= 2) {
  316. f = f.substring(0, 1)
  317. }
  318. if (1 === w) {
  319. return p + '.' + f
  320. } else if (2 === w) {
  321. return p
  322. } else if (3 === w) {
  323. return f
  324. }
  325. } else if (2 === c) {
  326. if (0 === f.length) {
  327. f = '00'
  328. } else if (1 === f.length) {
  329. f = f + '0'
  330. } else if (f.length >= 3) {
  331. f = f.substring(0, 2)
  332. }
  333. if (1 === w) {
  334. return p + '.' + f
  335. } else if (2 === w) {
  336. return p
  337. } else if (3 === w) {
  338. return f
  339. }
  340. }
  341. }
  342. }
  343. export const myValidator = {
  344. /* 校验字段合法性rule */
  345. checkMobile: s => {
  346. /* 校验手机号格式是否正确 */
  347. if (s) {
  348. s = s.toString().trim()
  349. var rule = /^\d{3,20}$/
  350. return rule.test(s)
  351. }
  352. return false
  353. },
  354. checkEmail: s => {
  355. /* 校验邮箱格式是否正确 */
  356. if (s) {
  357. s = s.toString().trim()
  358. let rule = /^(([^()[\]\\.,;:\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
  359. return rule.test(s)
  360. }
  361. return false
  362. },
  363. checkPwd: s => {
  364. /* 校验登录密码格式是否正确 */
  365. if (s) {
  366. s = s.toString().trim()
  367. var rule = /^(?=.*[a-zA-Z]+)(?=.*[0-9]+)[a-zA-Z0-9]{8,16}$/
  368. return rule.test(s)
  369. }
  370. return false
  371. },
  372. checkCode: s => {
  373. /* 校验短信或邮箱验证码格式是否正确 */
  374. if (s) {
  375. s = s.toString().trim()
  376. var rule = /^\d{6}$/
  377. return rule.test(s)
  378. }
  379. return false
  380. },
  381. checkImgCode: s => {
  382. /* 校验图片验证码格式是否正确 */
  383. if (s) {
  384. s = s.toString().trim()
  385. var rule = /^[a-zA-Z]{4}$/
  386. return rule.test(s)
  387. }
  388. return false
  389. },
  390. checkNickname: s => {
  391. /* 校验昵称格式是否正确 */
  392. if (s) {
  393. s = s.toString().trim()
  394. var rule = /^[A-Za-z0-9\u4e00-\u9fa5]{2,20}$/
  395. return rule.test(s)
  396. }
  397. return false
  398. }
  399. }