mm_os 1.3.3 → 1.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/README.en.md +36 -0
  2. package/README.md +25 -166
  3. package/conf.json +3 -0
  4. package/core/base/index.js +29 -0
  5. package/core/base/mqtt/index.js +268 -0
  6. package/core/base/mqtt/lib.js +40 -0
  7. package/core/base/web/index.js +110 -0
  8. package/core/com/api/com.json +4 -0
  9. package/{bin → core}/com/api/config.tpl.json +9 -7
  10. package/{bin → core}/com/api/drive.js +239 -64
  11. package/{bin → core}/com/api/index.js +8 -9
  12. package/{bin → core}/com/api/oauth.js +23 -14
  13. package/core/com/api/script.js +32 -0
  14. package/core/com/db/com.json +4 -0
  15. package/{bin → core}/com/db/drive.js +99 -65
  16. package/{bin → core}/com/db/index.js +2 -2
  17. package/core/com/event/com.json +4 -0
  18. package/{bin → core}/com/event/config.tpl.json +2 -2
  19. package/core/com/event/drive.js +125 -0
  20. package/{bin → core}/com/event/index.js +5 -10
  21. package/core/com/event/script.js +26 -0
  22. package/core/com/eventer/com.js +450 -0
  23. package/core/com/eventer/com.json +4 -0
  24. package/core/com/middleware/com.js +128 -0
  25. package/core/com/middleware/com.json +4 -0
  26. package/core/com/middleware/config.tpl.json +8 -0
  27. package/core/com/middleware/script.js +9 -0
  28. package/core/com/mqtt/com.json +4 -0
  29. package/core/com/mqtt/config.tpl.json +12 -0
  30. package/core/com/mqtt/drive.js +139 -0
  31. package/core/com/mqtt/index.js +138 -0
  32. package/core/com/mqtt/script.js +33 -0
  33. package/core/com/msg/com.js +296 -0
  34. package/core/com/msg/com.json +4 -0
  35. package/{bin → core}/com/nav/drive.js +42 -17
  36. package/{bin → core}/com/nav/index.js +4 -4
  37. package/core/com/nav/tpl/admin_pc/page_channel.vue +299 -0
  38. package/core/com/nav/tpl/admin_pc/page_config.vue +279 -0
  39. package/core/com/nav/tpl/admin_pc/page_config_form.vue +194 -0
  40. package/core/com/nav/tpl/admin_pc/page_default.vue +287 -0
  41. package/core/com/nav/tpl/admin_pc/page_form.vue +180 -0
  42. package/core/com/nav/tpl/admin_pc/page_lang.vue +265 -0
  43. package/core/com/nav/tpl/admin_pc/page_nav.vue +313 -0
  44. package/core/com/nav/tpl/admin_pc/page_table.vue +285 -0
  45. package/core/com/nav/tpl/admin_pc/page_type.vue +313 -0
  46. package/core/com/nav/tpl/dev_pc/page_channel.vue +253 -0
  47. package/core/com/nav/tpl/dev_pc/page_config.vue +253 -0
  48. package/core/com/nav/tpl/dev_pc/page_default.vue +247 -0
  49. package/core/com/nav/tpl/dev_pc/page_form.vue +162 -0
  50. package/core/com/nav/tpl/dev_pc/page_nav.vue +253 -0
  51. package/core/com/nav/tpl/dev_pc/page_table.vue +247 -0
  52. package/core/com/nav/tpl/dev_pc/page_type.vue +253 -0
  53. package/{bin/com/nav/tpl/home_phone → core/com/nav/tpl/home_pc}/page_channel.vue +231 -231
  54. package/{bin/com/nav/tpl/home_phone → core/com/nav/tpl/home_pc}/page_default.vue +231 -231
  55. package/{bin → core}/com/nav/tpl/home_pc/page_form.vue +9 -9
  56. package/{bin → core}/com/nav/tpl/home_pc/page_list.vue +231 -231
  57. package/{bin → core}/com/nav/tpl/home_pc/page_nav.vue +221 -221
  58. package/{bin/com/nav/tpl/home_phone → core/com/nav/tpl/home_pc}/page_type.vue +231 -231
  59. package/{bin → core}/com/nav/tpl/home_pc/page_view.vue +8 -8
  60. package/{bin/com/nav/tpl/home_pc → core/com/nav/tpl/home_phone}/page_channel.vue +231 -231
  61. package/{bin/com/nav/tpl/home_pc → core/com/nav/tpl/home_phone}/page_default.vue +231 -231
  62. package/{bin → core}/com/nav/tpl/home_phone/page_form.vue +9 -9
  63. package/{bin → core}/com/nav/tpl/home_phone/page_list.vue +231 -231
  64. package/{bin/com/nav/tpl/admin_pc → core/com/nav/tpl/home_phone}/page_nav.vue +236 -220
  65. package/{bin/com/nav/tpl/home_pc → core/com/nav/tpl/home_phone}/page_type.vue +231 -231
  66. package/{bin → core}/com/nav/tpl/home_phone/page_view.vue +8 -8
  67. package/core/com/nav/viewmodel.js +296 -0
  68. package/{bin → core}/com/param/config.tpl.json +24 -0
  69. package/{bin → core}/com/param/drive.js +47 -15
  70. package/core/com/plugin/com.json +4 -0
  71. package/core/com/plugin/config.tpl.json +20 -0
  72. package/{bin → core}/com/plugin/drive.js +5 -8
  73. package/{bin → core}/com/plugin/index.js +11 -56
  74. package/core/com/socket/README.md +47 -0
  75. package/core/com/socket/com.json +4 -0
  76. package/core/com/socket/config.tpl.json +14 -0
  77. package/{bin → core}/com/socket/drive.js +74 -51
  78. package/{bin → core}/com/socket/index.js +4 -2
  79. package/{bin → core}/com/socket/script.js +8 -6
  80. package/core/com/sql/config.tpl.json +70 -0
  81. package/{bin → core}/com/sql/drive.js +281 -58
  82. package/core/com/static/com.json +4 -0
  83. package/core/com/static/config.tpl.json +20 -0
  84. package/{bin → core}/com/static/drive.js +6 -4
  85. package/{bin → core}/com/static/index.js +5 -1
  86. package/core/com/task/com.json +4 -0
  87. package/core/com/task/config.tpl.json +24 -0
  88. package/core/com/task/drive.js +374 -0
  89. package/{bin → core}/com/task/index.js +14 -20
  90. package/core/com/task/script.js +37 -0
  91. package/core/com/timer/com.js +217 -0
  92. package/core/com/timer/com.json +4 -0
  93. package/core/com/tpl/com.js +19 -0
  94. package/core/com/tpl/com.json +4 -0
  95. package/index.js +161 -740
  96. package/lib/actions.js +50 -0
  97. package/lib/app.js +73 -0
  98. package/lib/base.js +355 -0
  99. package/lib/com.js +31 -0
  100. package/lib/game.js +31 -0
  101. package/lib/ref.js +121 -0
  102. package/middleware/cors/index.js +57 -0
  103. package/middleware/cors/middleware.json +7 -0
  104. package/middleware/mqtt_base/index.js +10 -0
  105. package/middleware/mqtt_base/middleware.json +8 -0
  106. package/{waf.js → middleware/waf/index.js} +12 -2
  107. package/middleware/waf/middleware.json +9 -0
  108. package/middleware/web_base/index.js +67 -0
  109. package/middleware/web_base/middleware.json +9 -0
  110. package/middleware/web_event/index.js +411 -0
  111. package/middleware/web_event/middleware.json +10 -0
  112. package/middleware/web_proxy/index.js +24 -0
  113. package/middleware/web_proxy/middleware.json +9 -0
  114. package/middleware/web_router/index.js +33 -0
  115. package/middleware/web_router/middleware.json +10 -0
  116. package/middleware/web_socket/index.js +21 -0
  117. package/middleware/web_socket/middleware.json +9 -0
  118. package/middleware/web_static/index.js +26 -0
  119. package/middleware/web_static/middleware.json +9 -0
  120. package/nodemon.json +12 -2
  121. package/package.json +56 -66
  122. package/.gitattributes +0 -5
  123. package/bin/com/README.md +0 -2
  124. package/bin/com/api/script.js +0 -14
  125. package/bin/com/cmd/README.md +0 -3
  126. package/bin/com/cmd/config.tpl.json +0 -41
  127. package/bin/com/cmd/drive.js +0 -512
  128. package/bin/com/cmd/index.js +0 -213
  129. package/bin/com/cmd/old/5w2h.js +0 -54
  130. package/bin/com/cmd/old/drive.js +0 -423
  131. package/bin/com/cmd/script.js +0 -11
  132. package/bin/com/event/drive.js +0 -69
  133. package/bin/com/event/script.js +0 -12
  134. package/bin/com/nav/tpl/admin_pc/page_channel.vue +0 -234
  135. package/bin/com/nav/tpl/admin_pc/page_default.vue +0 -236
  136. package/bin/com/nav/tpl/admin_pc/page_form.vue +0 -152
  137. package/bin/com/nav/tpl/admin_pc/page_table.vue +0 -236
  138. package/bin/com/nav/tpl/admin_pc/page_type.vue +0 -234
  139. package/bin/com/nav/tpl/home_phone/page_nav.vue +0 -221
  140. package/bin/com/nav/viewmodel.js +0 -161
  141. package/bin/com/plugin/config.tpl.json +0 -11
  142. package/bin/com/socket/config.tpl.json +0 -8
  143. package/bin/com/sql/config.tpl.json +0 -34
  144. package/bin/com/static/config.tpl.json +0 -11
  145. package/bin/com/task/config.tpl.json +0 -13
  146. package/bin/com/task/drive.js +0 -288
  147. package/bin/com/task/script.js +0 -38
  148. package/bin/com.js +0 -74
  149. package/bin/mm.conf +0 -48
  150. package/bin/static/404.html +0 -52
  151. package/bin/static/README.md +0 -1
  152. package/bin/static/css/font-awesome.min.css +0 -7
  153. package/bin/static/css/mm_base.css +0 -220
  154. package/bin/static/css/mm_common.css +0 -518
  155. package/bin/static/css/mm_component.css +0 -307
  156. package/bin/static/css/mm_expand.css +0 -634
  157. package/bin/static/css/mm_theme.css +0 -291
  158. package/bin/static/css/new_file.css +0 -79
  159. package/bin/static/css/swiper.min.css +0 -12
  160. package/bin/static/favicon.ico +0 -0
  161. package/bin/static/font/FontAwesome.otf +0 -0
  162. package/bin/static/font/HelveticaNeue.eot +0 -0
  163. package/bin/static/font/HelveticaNeue.otf +0 -0
  164. package/bin/static/font/HelveticaNeue.svg +0 -1273
  165. package/bin/static/font/HelveticaNeue.woff +0 -0
  166. package/bin/static/font/HelveticaNeue.woff2 +0 -0
  167. package/bin/static/font/fontawesome-webfont.eot +0 -0
  168. package/bin/static/font/fontawesome-webfont.svg +0 -2671
  169. package/bin/static/font/fontawesome-webfont.ttf +0 -0
  170. package/bin/static/font/fontawesome-webfont.woff +0 -0
  171. package/bin/static/font/fontawesome-webfont.woff2 +0 -0
  172. package/bin/static/h5.html +0 -325
  173. package/bin/static/highlight/highlight.pack.js +0 -2
  174. package/bin/static/highlight/styles/a11y-dark.css +0 -99
  175. package/bin/static/highlight/styles/a11y-light.css +0 -99
  176. package/bin/static/highlight/styles/agate.css +0 -108
  177. package/bin/static/highlight/styles/an-old-hope.css +0 -89
  178. package/bin/static/highlight/styles/androidstudio.css +0 -66
  179. package/bin/static/highlight/styles/arduino-light.css +0 -88
  180. package/bin/static/highlight/styles/arta.css +0 -73
  181. package/bin/static/highlight/styles/ascetic.css +0 -45
  182. package/bin/static/highlight/styles/atelier-cave-dark.css +0 -83
  183. package/bin/static/highlight/styles/atelier-cave-light.css +0 -85
  184. package/bin/static/highlight/styles/atelier-dune-dark.css +0 -69
  185. package/bin/static/highlight/styles/atelier-dune-light.css +0 -69
  186. package/bin/static/highlight/styles/atelier-estuary-dark.css +0 -84
  187. package/bin/static/highlight/styles/atelier-estuary-light.css +0 -84
  188. package/bin/static/highlight/styles/atelier-forest-dark.css +0 -69
  189. package/bin/static/highlight/styles/atelier-forest-light.css +0 -69
  190. package/bin/static/highlight/styles/atelier-heath-dark.css +0 -69
  191. package/bin/static/highlight/styles/atelier-heath-light.css +0 -69
  192. package/bin/static/highlight/styles/atelier-lakeside-dark.css +0 -69
  193. package/bin/static/highlight/styles/atelier-lakeside-light.css +0 -69
  194. package/bin/static/highlight/styles/atelier-plateau-dark.css +0 -84
  195. package/bin/static/highlight/styles/atelier-plateau-light.css +0 -84
  196. package/bin/static/highlight/styles/atelier-savanna-dark.css +0 -84
  197. package/bin/static/highlight/styles/atelier-savanna-light.css +0 -84
  198. package/bin/static/highlight/styles/atelier-seaside-dark.css +0 -69
  199. package/bin/static/highlight/styles/atelier-seaside-light.css +0 -69
  200. package/bin/static/highlight/styles/atelier-sulphurpool-dark.css +0 -69
  201. package/bin/static/highlight/styles/atelier-sulphurpool-light.css +0 -69
  202. package/bin/static/highlight/styles/atom-one-dark-reasonable.css +0 -77
  203. package/bin/static/highlight/styles/atom-one-dark.css +0 -96
  204. package/bin/static/highlight/styles/atom-one-light.css +0 -96
  205. package/bin/static/highlight/styles/brown-paper.css +0 -64
  206. package/bin/static/highlight/styles/brown-papersq.png +0 -0
  207. package/bin/static/highlight/styles/codepen-embed.css +0 -60
  208. package/bin/static/highlight/styles/color-brewer.css +0 -71
  209. package/bin/static/highlight/styles/darcula.css +0 -77
  210. package/bin/static/highlight/styles/dark.css +0 -63
  211. package/bin/static/highlight/styles/darkula.css +0 -6
  212. package/bin/static/highlight/styles/default.css +0 -99
  213. package/bin/static/highlight/styles/docco.css +0 -97
  214. package/bin/static/highlight/styles/dracula.css +0 -76
  215. package/bin/static/highlight/styles/far.css +0 -71
  216. package/bin/static/highlight/styles/foundation.css +0 -88
  217. package/bin/static/highlight/styles/github-gist.css +0 -79
  218. package/bin/static/highlight/styles/github.css +0 -99
  219. package/bin/static/highlight/styles/gml.css +0 -78
  220. package/bin/static/highlight/styles/googlecode.css +0 -89
  221. package/bin/static/highlight/styles/grayscale.css +0 -101
  222. package/bin/static/highlight/styles/gruvbox-dark.css +0 -108
  223. package/bin/static/highlight/styles/gruvbox-light.css +0 -108
  224. package/bin/static/highlight/styles/hopscotch.css +0 -83
  225. package/bin/static/highlight/styles/hybrid.css +0 -102
  226. package/bin/static/highlight/styles/idea.css +0 -97
  227. package/bin/static/highlight/styles/ir-black.css +0 -73
  228. package/bin/static/highlight/styles/isbl-editor-dark.css +0 -112
  229. package/bin/static/highlight/styles/isbl-editor-light.css +0 -112
  230. package/bin/static/highlight/styles/kimbie.dark.css +0 -74
  231. package/bin/static/highlight/styles/kimbie.light.css +0 -74
  232. package/bin/static/highlight/styles/lightfair.css +0 -87
  233. package/bin/static/highlight/styles/magula.css +0 -70
  234. package/bin/static/highlight/styles/mono-blue.css +0 -59
  235. package/bin/static/highlight/styles/monokai-sublime.css +0 -83
  236. package/bin/static/highlight/styles/monokai.css +0 -70
  237. package/bin/static/highlight/styles/nord.css +0 -309
  238. package/bin/static/highlight/styles/obsidian.css +0 -88
  239. package/bin/static/highlight/styles/ocean.css +0 -74
  240. package/bin/static/highlight/styles/paraiso-dark.css +0 -72
  241. package/bin/static/highlight/styles/paraiso-light.css +0 -72
  242. package/bin/static/highlight/styles/pojoaque.css +0 -83
  243. package/bin/static/highlight/styles/pojoaque.jpg +0 -0
  244. package/bin/static/highlight/styles/purebasic.css +0 -96
  245. package/bin/static/highlight/styles/qtcreator_dark.css +0 -83
  246. package/bin/static/highlight/styles/qtcreator_light.css +0 -83
  247. package/bin/static/highlight/styles/railscasts.css +0 -106
  248. package/bin/static/highlight/styles/rainbow.css +0 -85
  249. package/bin/static/highlight/styles/routeros.css +0 -108
  250. package/bin/static/highlight/styles/school-book.css +0 -69
  251. package/bin/static/highlight/styles/school-book.png +0 -0
  252. package/bin/static/highlight/styles/shades-of-purple.css +0 -97
  253. package/bin/static/highlight/styles/solarized-dark.css +0 -84
  254. package/bin/static/highlight/styles/solarized-light.css +0 -84
  255. package/bin/static/highlight/styles/sunburst.css +0 -102
  256. package/bin/static/highlight/styles/tomorrow-night-blue.css +0 -75
  257. package/bin/static/highlight/styles/tomorrow-night-bright.css +0 -74
  258. package/bin/static/highlight/styles/tomorrow-night-eighties.css +0 -74
  259. package/bin/static/highlight/styles/tomorrow-night.css +0 -75
  260. package/bin/static/highlight/styles/tomorrow.css +0 -72
  261. package/bin/static/highlight/styles/vs.css +0 -68
  262. package/bin/static/highlight/styles/vs2015.css +0 -115
  263. package/bin/static/highlight/styles/xcode.css +0 -104
  264. package/bin/static/highlight/styles/xt256.css +0 -92
  265. package/bin/static/highlight/styles/zenburn.css +0 -80
  266. package/bin/static/highlight/vue-highlight.js +0 -29
  267. package/bin/static/ifame.html +0 -24
  268. package/bin/static/img/add.png +0 -0
  269. package/bin/static/img/avatar.png +0 -0
  270. package/bin/static/img/banner_2.png +0 -0
  271. package/bin/static/img/default.png +0 -0
  272. package/bin/static/img/loading.svg +0 -1
  273. package/bin/static/img/logo.png +0 -0
  274. package/bin/static/img/logo1.png +0 -0
  275. package/bin/static/img/logo_gray.png +0 -0
  276. package/bin/static/img/logo_round.png +0 -0
  277. package/bin/static/img/mm.ico +0 -0
  278. package/bin/static/img/mm.jpg +0 -0
  279. package/bin/static/img/select.png +0 -0
  280. package/bin/static/img/web.png +0 -0
  281. package/bin/static/index.html +0 -12
  282. package/bin/static/js/clipboard.min.js +0 -257
  283. package/bin/static/js/css.min.js +0 -1
  284. package/bin/static/js/echarts.js +0 -22
  285. package/bin/static/js/html5.min.js +0 -1
  286. package/bin/static/js/jquery.lazyload.min.js +0 -2
  287. package/bin/static/js/jquery.min.js +0 -4189
  288. package/bin/static/js/jquery.scrollstop.min.js +0 -2
  289. package/bin/static/js/mm-requirejs-vue.js +0 -283
  290. package/bin/static/js/mm_check.js +0 -490
  291. package/bin/static/js/mm_flexble.js +0 -112
  292. package/bin/static/js/mm_picker.js +0 -1417
  293. package/bin/static/js/mm_pinyinlite.js +0 -873
  294. package/bin/static/js/mm_sdk.js +0 -2841
  295. package/bin/static/js/mm_ui_expand.js +0 -468
  296. package/bin/static/js/mm_vue.js +0 -376
  297. package/bin/static/js/mm_vue_ui.js +0 -2375
  298. package/bin/static/js/mm_websocket.js +0 -145
  299. package/bin/static/js/require.js +0 -5
  300. package/bin/static/js/sortable.min.js +0 -3
  301. package/bin/static/js/swiper.min.js +0 -13
  302. package/bin/static/js/text.min.js +0 -1
  303. package/bin/static/js/vue-router.min.js +0 -6
  304. package/bin/static/js/vue.js +0 -12338
  305. package/bin/static/js/vuedraggable.min.js +0 -2
  306. package/bin/static/js/vuex.min.js +0 -6
  307. package/bin/static/src/components/bar/mm_action.vue +0 -19
  308. package/bin/static/src/components/bar/mm_buy.vue +0 -19
  309. package/bin/static/src/components/bar/mm_chat.vue +0 -18
  310. package/bin/static/src/components/bar/mm_count.vue +0 -18
  311. package/bin/static/src/components/bar/mm_filter.vue +0 -18
  312. package/bin/static/src/components/bar/mm_search.vue +0 -18
  313. package/bin/static/src/components/bar/mm_sort.vue +0 -18
  314. package/bin/static/src/components/bar/mm_tag.vue +0 -18
  315. package/bin/static/src/components/bar/mm_title.vue +0 -19
  316. package/bin/static/src/components/content/mm_pre.vue +0 -70
  317. package/bin/static/src/components/expand/mm_drag.vue +0 -39
  318. package/bin/static/src/components/item/mm_article.vue +0 -115
  319. package/bin/static/src/components/item/mm_base.vue +0 -26
  320. package/bin/static/src/components/item/mm_contact.vue +0 -25
  321. package/bin/static/src/components/item/mm_goods.vue +0 -23
  322. package/bin/static/src/components/item/mm_img.vue +0 -21
  323. package/bin/static/src/components/item/mm_media.vue +0 -18
  324. package/bin/static/src/components/item/mm_message.vue +0 -18
  325. package/bin/static/src/components/item/mm_music.vue +0 -95
  326. package/bin/static/src/components/item/mm_news.vue +0 -22
  327. package/bin/static/src/components/item/mm_number.vue +0 -26
  328. package/bin/static/src/components/item/mm_question.vue +0 -35
  329. package/bin/static/src/components/item/mm_user.vue +0 -22
  330. package/bin/static/src/components/item/mm_video.vue +0 -95
  331. package/bin/static/src/components/slide/mm_slide_card.vue +0 -64
  332. package/bin/static/src/components/slide/mm_slide_img.vue +0 -47
  333. package/bin/static/src/components/slide/mm_slide_page.vue +0 -8
  334. package/bin/static/src/components/slide/mm_slide_text.vue +0 -54
  335. package/bin/static/src/main.js +0 -84
  336. package/bin/static/src/mixins/form.js +0 -223
  337. package/bin/static/src/mixins/item.js +0 -242
  338. package/bin/static/src/mixins/list.js +0 -244
  339. package/bin/static/src/mixins/page.js +0 -1011
  340. package/bin/static/src/mm_component.js +0 -74
  341. package/bin/static/src/router.js +0 -72
  342. package/bin/static/src/store/user.js +0 -75
  343. package/bin/static/src/store/web.js +0 -50
  344. package/bin/static/user/1/number_info.xlsx +0 -0
  345. package/bin/static/w3c.html +0 -94
  346. package/init.js +0 -55
  347. package/update.md +0 -1
  348. /package/{bin → core}/com/api/README.md +0 -0
  349. /package/{bin → core}/com/api/rpc.js +0 -0
  350. /package/{bin → core}/com/db/README.md +0 -0
  351. /package/{bin → core}/com/event/README.md +0 -0
  352. /package/{bin/com/socket → core/com/mqtt}/README.md +0 -0
  353. /package/{bin → core}/com/nav/README.md +0 -0
  354. /package/{bin → core}/com/nav/config.tpl.json +0 -0
  355. /package/{bin → core}/com/param/README.md +0 -0
  356. /package/{bin → core}/com/param/index.js +0 -0
  357. /package/{bin → core}/com/param/script.js +0 -0
  358. /package/{bin → core}/com/param/test.js +0 -0
  359. /package/{bin → core}/com/plugin/README.md +0 -0
  360. /package/{bin → core}/com/plugin/script.js +0 -0
  361. /package/{bin → core}/com/sql/README.md +0 -0
  362. /package/{bin → core}/com/sql/index.js +0 -0
  363. /package/{bin → core}/com/sql/script.js +0 -0
  364. /package/{bin → core}/com/static/README.md +0 -0
  365. /package/{bin → core}/com/static/script.js +0 -0
  366. /package/{bin → core}/com/task/README.md +0 -0
  367. /package/{bin/rps.bat → rps.bat} +0 -0
  368. /package/{bin/tps.bat → tps.bat} +0 -0
@@ -1,2841 +0,0 @@
1
- /**
2
- * @fileOverview JavaScript拓展函数
3
- * @author <a href="http://qww.elins.cn">邱文武</a>
4
- * @version 1.2
5
- */
6
-
7
- /* == 基础函数 == */
8
- /**
9
- * @description 延迟执行(休眠)
10
- * @param {Number} milliSeconds 毫秒
11
- * @param {Object} obj 判断对象或函数
12
- * @param {String} key 判断的对象属性, 为存在的情况下提成退出循环
13
- * @example var obj = {ok: false}; sleep(2000, obj, 'ok');
14
- * @example sleep(2000);
15
- */
16
- function sleep(milliSeconds, obj, key) {
17
- var endTime = new Date().getTime() + milliSeconds;
18
- if (obj) {
19
- if (key) {
20
- while (new Date().getTime() < endTime) {
21
- if (obj[key]) {
22
- continue;
23
- }
24
- }
25
- } else {
26
- var func = obj;
27
- while (new Date().getTime() < endTime) {
28
- if (!func()) {
29
- continue;
30
- }
31
- }
32
- }
33
- } else {
34
- while (new Date().getTime() < endTime) {}
35
- }
36
- }
37
-
38
- /**
39
- * @description 判断对象是否相似
40
- * @param {Object} obj 被判断对象
41
- * @param {Object} query 用作判断的对象
42
- * @param {Boolean} all 是否完全相同
43
- * @return {Boolean} 相似返回true,否则返回false
44
- */
45
- function as(obj, query, all) {
46
- var bl = true;
47
- var type = typeof(obj);
48
- if (type !== typeof(query)) {
49
- // 如果类型不一致 则两个无相似
50
- bl = false;
51
- } else if (type === 'string' || type === 'bool' || type === 'number') {
52
- bl = obj === query;
53
- } else if (obj.constructor == Array) {
54
- // 如果都是数组
55
- var lh = obj.length;
56
- if (all && lh !== query.length) {
57
- // 要求完全一致 而长度不一致 说明不相似
58
- bl = false;
59
- } else {
60
- // 否则判断数组里的每个成员是否相似
61
- for (var i = 0; i < lh; i++) {
62
- if (!as(obj[i], query[i])) {
63
- bl = false;
64
- break;
65
- }
66
- }
67
- }
68
- } else {
69
- // 如果类型为对象
70
- if (all && Object.getOwnPropertyNames(obj).length !== Object.getOwnPropertyNames(query).length) {
71
- // 如果要求完全一致, 而属性长度不一致,则不相似
72
- bl = false;
73
- } else {
74
- // 否则都为对象则判断其值是否一致
75
- for (var k in query) {
76
- if (!as(obj[k], query[k], all)) {
77
- bl = false;
78
- break;
79
- }
80
- }
81
- }
82
- }
83
- return bl;
84
- }
85
-
86
- /**
87
- * @description 测试函数执行速度
88
- * @param {Function()} func 测试的函数
89
- * @param {Number} times = [value] 测试次数
90
- */
91
- function speed(func, times) {
92
- if (!times) {
93
- times = 1000000;
94
- }
95
- var t1 = (new Date()).valueOf();
96
- for (var i = 0; i < times; i++) {
97
- func();
98
- }
99
- var t2 = (new Date()).valueOf();
100
- var s = t2 - t1;
101
- console.log('耗时' + s + '毫秒, 平均' + (s / times) + 'ms/次');
102
- }
103
-
104
-
105
- /**
106
- * @description 添加对象属性
107
- * @param {Object} objA 被添加的对象
108
- * @param {Object} objB 用作添加的对象
109
- * @param {Boolean} bl 是否补充没有的对象
110
- * @return {Object} 新对象
111
- */
112
- function push(objA, objB, bl) {
113
- if (!objA || !objB) {
114
- return;
115
- }
116
- if (bl) {
117
- for (var k in objB) {
118
- var value = objB[k];
119
- if (objA[k] === undefined || objA[k] === null || value === null) {
120
- objA[k] = value;
121
- } else {
122
- var type = typeof(objA[k]);
123
- var p = typeof(value);
124
- if (type !== p) {
125
- if (type === "number") {
126
- var n = Number(value);
127
- if (n === NaN) {
128
- n = 0;
129
- }
130
- objA[k] = n;
131
- } else if (type === "boolean") {
132
- if (value === '0' || value === 'false' || value === 'False') {
133
- objA[k] = false;
134
- } else {
135
- objA[k] = Boolean(value);
136
- }
137
- } else if (type === "string") {
138
- objA[k] = value.toString();
139
- } else {
140
- objA[k] = value;
141
- }
142
- } else if (type === "object") {
143
- if (objA[k].constructor == Array && value.constructor == Array) {
144
- objA[k].clear();
145
- objA[k].addList(value);
146
- } else {
147
- push(objA[k], value, bl);
148
- }
149
- } else {
150
- objA[k] = value;
151
- }
152
- }
153
- }
154
- } else {
155
- for (var k in objA) {
156
- var value = objB[k];
157
- if (value !== undefined && objA[k] !== null && value !== null) {
158
- var type = typeof(objA[k]);
159
- var p = typeof(value);
160
- if (type !== p) {
161
- if (type === "number") {
162
- var n = Number(value);
163
- if (n === NaN) {
164
- n = 0;
165
- }
166
- objA[k] = n;
167
- } else if (type === "boolean") {
168
- if (value === '0' || value === 'false' || value === 'False') {
169
- objA[k] = false;
170
- } else {
171
- objA[k] = Boolean(value);
172
- }
173
- } else if (type === "string") {
174
- objA[k] = value.toString();
175
- } else {
176
- objA[k] = value;
177
- }
178
- } else if (type === "object") {
179
- if (objA[k].constructor == Array && value.constructor == Array) {
180
- objA[k].clear();
181
- objA[k].addList(value);
182
- } else {
183
- push(objA[k], value, bl);
184
- }
185
- } else {
186
- objA[k] = value;
187
- }
188
- }
189
- }
190
- }
191
- return objA;
192
- }
193
-
194
- /**
195
- * @description 清空对象值
196
- * @param {Object} obj 对象
197
- * @return {Object} 返回对象自身
198
- */
199
- function clear(obj) {
200
- if (obj) {
201
- for (var k in obj) {
202
- var val = obj[k];
203
- if (val) {
204
- var name = typeof val === 'undefined' ? 'undefined' : typeof(val);
205
- switch (name) {
206
- case "string":
207
- obj[k] = "";
208
- break;
209
- case "number":
210
- obj[k] = 0;
211
- break;
212
- case "array":
213
- obj[k].clear();
214
- break;
215
- case "object":
216
- clear(obj[k]);
217
- break;
218
- case "function":
219
- break;
220
- case "symbol":
221
- obj[k] = "";
222
- break;
223
- }
224
- }
225
- }
226
- }
227
- return obj;
228
- }
229
-
230
- /**
231
- * @description 转为json字符串
232
- * @param {Object} obj 被转换的对象
233
- * @param {Boolean} format 是否格式化
234
- * @return {String} json格式字符串
235
- */
236
- function toJson(obj, format) {
237
- if (format) {
238
- return JSON.stringify(obj, null, 4);
239
- } else {
240
- return JSON.stringify(obj);
241
- }
242
- }
243
-
244
- /**
245
- * @description 转url字符串
246
- * @param {Object} obj 被转换的对象
247
- * @param {String} url 请求地址
248
- * @return {String} url参数格式字符串
249
- */
250
- function toUrl(obj, url) {
251
- var queryStr = "";
252
- for (var key in obj) {
253
- var value = obj[key];
254
- if (typeof(value) === 'number') {
255
- if (value > 0) {
256
- queryStr += "&" + key + "=" + obj[key];
257
- }
258
- } else if (value) {
259
- queryStr += "&" + key + "=" + encodeURI(value);
260
- }
261
- }
262
- if (url) {
263
- if (url.endWith('?') || url.endWith('&')) {
264
- return url + queryStr.replace('&', '');
265
- } else if(url.indexOf('?') === -1) {
266
- return url + queryStr.replace('&', '?');
267
- }
268
- else {
269
- return url + queryStr;
270
- }
271
- } else {
272
- return queryStr.replace('&', '');
273
- }
274
- };
275
-
276
- /**
277
- * @description 拷贝对象
278
- * @param {Object} obj 被拷贝的对象
279
- * @param {Boolean} has 是否非空拷贝,如果含有数据才拷贝,不含数据不拷贝
280
- * @return {Object} 新对象
281
- */
282
- function copy(obj, has) {
283
- var newObj = {};
284
- if (has) {
285
- for (var attr in obj) {
286
- var o = obj[attr];
287
- if (o) {
288
- newObj[attr] = o;
289
- }
290
- }
291
- } else {
292
- for (var attr in obj) {
293
- newObj[attr] = obj[attr];
294
- }
295
- }
296
- return newObj;
297
- };
298
-
299
- /**
300
- * @description 查看所有属性
301
- * @param {Object} obj 查看的对象
302
- * @param {String} file 保存位置
303
- */
304
- function keys(obj, file) {
305
- var text = "";
306
- for (var k in obj) {
307
- text += k + '\r\n'
308
- }
309
- console.log(text);
310
- }
311
-
312
- /**
313
- * @description 删除对象空属性
314
- * @param {Object} obj 对象
315
- * @param {Object} includeZero 是否包括0
316
- * @return {Object} 返回新对象
317
- */
318
- function delete_prop(obj, includeZero) {
319
- var o = Object.assign({}, obj);
320
- if (includeZero) {
321
- for (var k in o) {
322
- var v = o[k];
323
- if (!v) {
324
- delete o[k];
325
- }
326
- }
327
- } else {
328
- for (var k in o) {
329
- var v = o[k];
330
- if (v === '' || v === null || v === undefined) {
331
- delete o[k];
332
- }
333
- }
334
- }
335
- return o;
336
- }
337
-
338
-
339
-
340
- /**
341
- * @namespace
342
- * @property {Object} pool 数据连接池, 用于存储有关数据库的操作类
343
- * @property {Object} task 任务池, 用于存储定时任务操作类
344
- * @property {Object} api API接口,用于存储有关接口的操作类
345
- * @property {Object} val 全局变量,用于存储全局的配置
346
- * @property {Object} dict 字典,用于查询变量替换名
347
- * @property {Object} lang 语言包, 用于全局的语言替换
348
- * @property {String} sleep 延迟(休眠)
349
- * @property {Function()} speed 测试执行速度函数
350
- * @property {Function(Object, Object, Boolean):Boolean} as 判断对象是否相似
351
- * @property {Function(Object, Object):Boolean} push 为对象添加属性
352
- * @property {Function(Object):String} toJson 对象转json字符串
353
- * @property {Function(Object):String} toUrl 对象转url字符串
354
- * @property {Function(Object):Object} copy 复制一个新对象
355
- * @property {Function(Object):String} keys 查询获取对象属性键
356
- */
357
- var funcs = {
358
- // 数据连接池, 用于存储有关数据库的操作类
359
- pool: {},
360
- // 任务池, 用于存储定时任务操作类
361
- task: {},
362
- // API接口,用于存储有关接口的操作类
363
- api: {},
364
- // 全局变量,用于存储全局的配置
365
- val: {
366
- // 默认作用域, sys表示系统
367
- scope: "sys"
368
- },
369
- /**
370
- * @description 字典,用于查询变量替换名
371
- * @property {String} session_id session的ID
372
- * @property {String} user_id 用户的ID,用于数据库时查询用户唯一标识
373
- */
374
- dict: {
375
- session_id: "mm:uuid",
376
- user_id: "user_id",
377
- token: "x-auth-token"
378
- },
379
- /**
380
- * @description 语言包, 用于全局的语言替换
381
- * @property {String} now = [chinese|english] 当前语言
382
- * @property {Object} chinese 中文语言包
383
- * @property {Object} english 英文语言包
384
- */
385
- lang: {
386
- now: "chinese",
387
- chinese: {},
388
- english: {}
389
- },
390
- // 延迟
391
- sleep: sleep,
392
- // 测试执行速度函数
393
- speed: speed,
394
- // 判断对象是否相似
395
- as: as,
396
- // 添加对象
397
- push: push,
398
- // 清空对象值
399
- clear: clear,
400
- // 对象转json字符串
401
- toJson: toJson,
402
- // 对象转url字符串
403
- toUrl: toUrl,
404
- // 复制一个新对象
405
- copy: copy,
406
- // 查询获取对象属性键
407
- keys: keys,
408
- // 删除对象属性
409
- delete: delete_prop
410
- };
411
- if (typeof($) === "undefined") {
412
- window.$ = funcs
413
- } else {
414
- push($, funcs, true);
415
- }
416
-
417
- /* == 数字原型函数 == */
418
- (function() {
419
- /**
420
- * @description 去尾法
421
- * @param {Number} len 保留长度
422
- * @return {Number} 数值
423
- */
424
- Number.prototype.toFloor = function(len) {
425
- var n = Math.pow(10, len);
426
- return Math.floor(this * n) / n;
427
- };
428
- /**
429
- * @description 进一法
430
- * @param {Number} len 保留长度
431
- * @return {Number} 数值
432
- */
433
- Number.prototype.toCeil = function(len) {
434
- var n = Math.pow(10, len);
435
- return Math.ceil(this * n) / n;
436
- };
437
- /**
438
- * @description 四舍五入法
439
- * @param {Number} len 保留长度
440
- * @return {Number} 数值
441
- */
442
- Number.prototype.toRound = function(len) {
443
- var n = Math.pow(10, len);
444
- return Math.round(this * n) / n;
445
- };
446
- /**
447
- * @description 数值转字符串, 保留尾数长度
448
- * @param {Number} len 保留长度
449
- * @param {String} mode 保留方式
450
- * @return {String} 截取后字符串
451
- */
452
- Number.prototype.get = function(len, mode) {
453
- var n;
454
- switch (mode) {
455
- case 1:
456
- case "toRound":
457
- n = this.toRound(len)
458
- break;
459
- case 2:
460
- case "toCeil":
461
- n = this.toCeil(len)
462
- break;
463
- case 3:
464
- case "toFloor":
465
- n = this.toFloor(len)
466
- break;
467
- default:
468
- n = this.toString();
469
- break;
470
- }
471
- return n;
472
- }
473
- /**
474
- * @description 数值转字符串, 保留尾数长度
475
- * @param {Number} len 保留长度
476
- * @param {String} mode 保留方式
477
- * @return {String} 截取后字符串
478
- */
479
- Number.prototype.toStr = function(len, mode) {
480
- var n = this.get(len, mode);
481
- var s = n.toString();
482
- var rs = s.indexOf('.');
483
- if (len > 0 && rs < 0) {
484
- rs = s.length;
485
- s += '.';
486
- }
487
- while (s.length <= rs + len) {
488
- s += '0';
489
- }
490
- return s;
491
- }
492
- /**
493
- * @description 转为时间类型
494
- * @return {Date} 时间对象
495
- */
496
- Number.prototype.toTime = function() {
497
- return new Date(this * 1000);
498
- };
499
- })();
500
-
501
- /* == 时间原型函数 == */
502
- (function() {
503
- /**
504
- * @description 时间格式化
505
- * @param {String} format 指定格式
506
- * @return {String} 时间格式字符串
507
- */
508
- Date.prototype.toStr = function(format) {
509
- var o = {
510
- "M+": this.getMonth() + 1,
511
- "d+": this.getDate(),
512
- "h+": this.getHours(),
513
- "m+": this.getMinutes(),
514
- "s+": this.getSeconds(),
515
- "q+": Math.floor((this.getMonth() + 3) / 3),
516
- "S": this.getMilliseconds()
517
- };
518
- if (/(y+)/.test(format)) {
519
- var x = RegExp.$1;
520
- format = format.replace(x, (this.getFullYear() + "").substr(4 - x.length));
521
- }
522
- for (var k in o) {
523
- if (new RegExp("(" + k + ")").test(format)) {
524
- var x = RegExp.$1;
525
- format = format.replace(x, x.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
526
- }
527
- }
528
- return format;
529
- };
530
- /**
531
- * @description 获取当前时间戳
532
- * @return {Number} 返回时间戳
533
- */
534
- Date.prototype.stamp = function() {
535
- var timestamp = Date.parse(this);
536
- return timestamp / 1000;
537
- };
538
- /**
539
- * @description 计算时间差(时间间隔)
540
- * @param {String} endTime 结束时间
541
- * @param {String} time_unit = [day|hours|minutes] 时间单位
542
- * @return {Number} 间隔时长
543
- */
544
- Date.prototype.interval = function(endTime, time_unit) {
545
- var startTime = this; // startTime: 开始时间
546
- var stime = Date.parse(startTime);
547
- var etime = Date.parse(new Date(endTime));
548
- var usedTime = etime - stime; // 两个时间戳相差的毫秒数
549
- if (time_unit === "day") {
550
- return Math.floor(usedTime / (1000 * 60 * 60 * 24));
551
- } else if (time_unit === "hours") {
552
- return Math.floor(usedTime / (1000 * 60 * 60));
553
- } else if (time_unit === "minutes") {
554
- return Math.floor(usedTime / (1000 * 60));
555
- } else {
556
- return Math.floor(usedTime / 1000);
557
- }
558
- };
559
- /**
560
- * @description 时间添加天数
561
- * @param {Number} days 天数
562
- * @return {Date} 时间对象
563
- */
564
- Date.prototype.addDays = function(days) {
565
- this.setDate(this.getDate() + days);
566
- return this;
567
- };
568
- /**
569
- * @description 时间添加秒数
570
- * @param {Date} seconds 时间对象
571
- */
572
- Date.prototype.addSeconds = function(seconds) {
573
- this.setSeconds(this.getSeconds() + seconds);
574
- return this;
575
- };
576
- })();
577
-
578
- /* == 字符串拓展函数 == */
579
- (function() {
580
- /**
581
- * @description MD5加密
582
- * @return {String} 加密后的字符串
583
- */
584
- String.prototype.md5 = function() {
585
- var md5 = createHash("md5");
586
- md5.update(this + '');
587
- return md5.digest('hex');
588
- };
589
-
590
- /**
591
- * aes加密
592
- * @param data 待加密内容
593
- * @param key 必须为32位私钥
594
- * @returns {String}
595
- */
596
- String.prototype.aes_encode = function(key, iv) {
597
- iv = iv || "";
598
- var clearEncoding = 'utf8';
599
- var cipherEncoding = 'base64';
600
- var cipherChunks = [];
601
- var cipher = createCipheriv('aes-256-ecb', key, iv);
602
- cipher.setAutoPadding(true);
603
- cipherChunks.push(cipher.update(this + '', clearEncoding, cipherEncoding));
604
- cipherChunks.push(cipher.final(cipherEncoding));
605
- return cipherChunks.join('');
606
- };
607
-
608
- /**
609
- * @description aes解密
610
- * @param key 必须为32位私钥
611
- * @returns {String}
612
- */
613
- String.prototype.aes_decode = function(key, iv) {
614
- iv = iv || "";
615
- var clearEncoding = 'utf8';
616
- var cipherEncoding = 'base64';
617
- var cipherChunks = [];
618
- var decipher = createDecipheriv('aes-256-ecb', key, iv);
619
- decipher.setAutoPadding(true);
620
- cipherChunks.push(decipher.update(this + '', cipherEncoding, clearEncoding));
621
- cipherChunks.push(decipher.final(clearEncoding));
622
- return cipherChunks.join('');
623
- };
624
-
625
- /**
626
- * @description 获取字符串的拼音
627
- * @return {String} 拼音
628
- */
629
- String.prototype.pinyin = function() {
630
- return pinyin(this).join('');
631
- };
632
- /**
633
- * @description 获取字符串的拼音
634
- * @return {String} 拼音
635
- */
636
- String.prototype.pinyinS = function() {
637
- var arr = pinyin(this);
638
- var str = "";
639
- for (var i = 0; i < arr.length; i++) {
640
- var ar = arr[i];
641
- if (ar.length > 0) {
642
- var o = ar[0];
643
- str += o.charAt(0).toLocaleUpperCase() + o.substring(1);
644
- } else {
645
- str += ' ';
646
- }
647
- }
648
- return str;
649
- };
650
- /**
651
- * @description 将json字符串转为对象
652
- * @return {Object} 对象
653
- */
654
- String.prototype.toJson = function() {
655
- try {
656
- return JSON.parse(this);
657
- } catch (e) {
658
- console.log('json反序列化错误');
659
- return null;
660
- }
661
- };
662
- /**
663
- * @description 将url字符串转为对象
664
- * @return {Object} 对象
665
- */
666
- String.prototype.toUrl = function() {
667
- var arr = this.split('&');
668
- var obj = {};
669
- arr.func(function(o) {
670
- var ar = o.split('=');
671
- if (ar.length > 1) {
672
- obj[ar[0]] = decodeURI(ar[1]);
673
- } else {
674
- obj[ar[0]] = null;
675
- }
676
- });
677
- return obj;
678
- };
679
- /**
680
- * @description 删除首字符
681
- * @param {String} str 要删除的字符, 默认删除空字符
682
- * @return {String} 删除后字符串
683
- */
684
- String.prototype.startTrim = function(str) {
685
- if (!str) {
686
- str = "\\s";
687
- } else {
688
- str = str.replace("$", "\\$").replace("^", "\\^").replace("(", "\\(").replace(")", "\\)");
689
- }
690
- var rx = new RegExp("(^" + str + "*)", "g");
691
- return this.replace(rx, "");
692
- };
693
- /**
694
- * @description 删除尾字符
695
- * @param {String} str 要删除的字符, 默认删除空字符
696
- * @return {String} 删除后字符串
697
- */
698
- String.prototype.endTrim = function(str) {
699
- if (!str) {
700
- str = "\\s";
701
- } else {
702
- str = str.replace("$", "\\$").replace("^", "\\^").replace("(", "\\(").replace(")", "\\)");
703
- }
704
- var rx = new RegExp("(" + str + "*$)", "g");
705
- return this.replace(rx, "");
706
- };
707
- /**
708
- * @description 删除首尾字符
709
- * @param {String} str 要删除的字符, 默认删除空字符
710
- * @return {String} 删除后字符串
711
- */
712
- String.prototype.trim = function(str) {
713
- if (!str) {
714
- str = "\\s";
715
- } else {
716
- str = str.replace("$", "\\$").replace("^", "\\^").replace("(", "\\(").replace(")", "\\)");
717
- }
718
- var rx = new RegExp("(^" + str + "*)|(" + str + "*$)", "g");
719
- return this.replace(rx, "");
720
- };
721
- /**
722
- * @description 取文本左边
723
- * @param {String} str 索引的字符
724
- * @param {Boolean} bl 当索引字符不存在时是否保留左边
725
- * @return {String} 截取后的字符串
726
- */
727
- String.prototype.left = function(str, bl) {
728
- var i = this.indexOf(str);
729
- if (i == -1) {
730
- if (bl) {
731
- return this + '';
732
- } else {
733
- return "";
734
- }
735
- } else {
736
- return this.substring(0, i);
737
- }
738
- };
739
- /**
740
- * @description 取文本右边
741
- * @param {String} str 索引的字符
742
- * @param {Boolean} bl 当索引字符不存在时是否保留右边
743
- * @return {String} 截取后的字符串
744
- */
745
- String.prototype.right = function(str, bl) {
746
- var i = this.indexOf(str);
747
- if (i == -1) {
748
- if (bl) {
749
- return this + '';
750
- } else {
751
- return "";
752
- }
753
- } else {
754
- return this.substring(i + str.length);
755
- }
756
- };
757
- /**
758
- * @description 取文本之间
759
- * @param {String} str_l 索引的左边字符
760
- * @param {String} str_r 索引的右边字符
761
- * @param {Boolean} bl 当索引字符不存在时是否保留右边
762
- * @return {String} 截取后的字符串
763
- */
764
- String.prototype.between = function(str_l, str_r, bl) {
765
- var str = this.right(str_l, bl);
766
- return str.left(str_r, bl);
767
- };
768
- /**
769
- * @description 替换所有字符串
770
- * @param {String} oldStr 被替换的字符串
771
- * @param {String} newStr 替换后的字符串
772
- * @return {String} 替换后的字符串
773
- */
774
- String.prototype.replaceAll = function(oldStr, newStr) {
775
- var txt = this + '';
776
- if (!newStr) {
777
- newStr = '';
778
- }
779
- while (txt.indexOf(oldStr) !== -1) {
780
- txt = txt.replace(oldStr, newStr);
781
- }
782
- return txt;
783
- };
784
- /**
785
- * @description 验证开头字符串
786
- * @param {String} startStr 开头字符串
787
- * @return {Boolean} 验证成功返回true,失败返回false
788
- */
789
- String.prototype.startWith = function(startStr) {
790
- var d = this.length - startStr.length;
791
- if (d >= 0 && this.indexOf(startStr) === 0) {
792
- return true;
793
- }
794
- return false;
795
- };
796
- /**
797
- * @description 验证结束字符串
798
- * @param {String} endStr 结尾字符串
799
- * @return {Boolean} 验证成功返回true,失败返回false
800
- */
801
- String.prototype.endWith = function(endStr) {
802
- var d = this.length - endStr.length;
803
- if (d >= 0 && this.lastIndexOf(endStr) == d) {
804
- return true;
805
- }
806
- return false;
807
- };
808
- /**
809
- * @description 是否含字符串
810
- * @param {String} str = [word|word*|*word|*word*]字符串, 支持*号匹配, 前*表示匹配后面字符串, 后*表示匹配前面字符串, 前后*表示匹配包含字符串
811
- * @return {Boolean} 包含返回true, 不包含返回false
812
- */
813
- String.prototype.has = function(str) {
814
- var o = this + '';
815
- if (o === str) {
816
- return true;
817
- } else if (str.startWith("*")) {
818
- var k = str.replaceAll('*', '');
819
- if (str.endWith("*")) {
820
- return o.indexOf(k) !== -1;
821
- } else {
822
- return o.endWith(k);
823
- }
824
- } else if (str.endWith("*")) {
825
- var k = str.replaceAll('*', '');
826
- return o.startWith(k);
827
- } else {
828
- return false;
829
- }
830
- };
831
- /**
832
- * @description 转为时间对象
833
- * @return {Date} 时间对象
834
- */
835
- String.prototype.toTime = function() {
836
- var str = this.replace('T', ' ').replace('Z', '').replaceAll('.', '/').replaceAll('-', '/');
837
- return new Date(str);
838
- };
839
- /**
840
- * @description 转为时间格式字符串
841
- * @param {String} format 转换的格式
842
- * @return {String} 时间格式字符串
843
- */
844
- String.prototype.toTimeFormat = function(format) {
845
- var str = this.replace('T', ' ').replace('Z', '').replaceAll('.', '/').replaceAll('-', '/');
846
- return new Date(str).toStr(format);
847
- };
848
- /**
849
- * @description 转为数组
850
- * @param {String|Regex} separator 分隔符或正则
851
- * @param {Number} maxLen 最大长度
852
- * @return {Array} 数组
853
- */
854
- String.prototype.toArr = function(separator, maxLen) {
855
- return this.split(separator, maxLen);
856
- };
857
- /**
858
- * @description 转为数字
859
- * @param {Number} len 保留长度 ()
860
- * @param {String} mode 保留方式 ()
861
- * @return {Number} 浮点数
862
- */
863
- String.prototype.toNum = function(len, mode) {
864
- return new Number(num).get(len, mode);
865
- };
866
- /**
867
- * @description 转为对象
868
- * @return {Object} 对象
869
- */
870
- String.prototype.toObj = function() {
871
- return eval(this + '');
872
- };
873
- /**
874
- * @description 转正则表达式
875
- * @param {String} mode = [g|i|gi] 转换方式, g为全部, i为不区分大小写
876
- * @return {Regex} 返回正则对象
877
- */
878
- String.prototype.toRx = function(mode) {
879
- if (!mode) {
880
- mode = 'gi';
881
- }
882
- return eval("/" + this + "/" + mode);
883
- };
884
- /**
885
- * @description 正则判断
886
- * @param {String} str 用作判断的正则
887
- * @param {String} mode = [g|i|gi] 转换方式, g为全部, i为不区分大小写
888
- * @return {Boolean} 符合正则返回true, 否则返回false
889
- */
890
- String.prototype.regex = function(str, mode) {
891
- var rx = str.toRx(mode);
892
- return rx.test(this + '');
893
- };
894
- /**
895
- * @description 验证字符串格式
896
- * @param {String} format 所属格式
897
- * @return {Boolean} 验证通过返回true, 失败返回false
898
- */
899
- String.prototype.checkFormat = function(format) {
900
- var bl = false;
901
- var value = this + '';
902
- var f = format.toLowerCase();
903
- switch (f) {
904
- case "phone":
905
- bl = /^0?(13|14|15|16|17|18|19)[0-9]{9}$/.test(value)
906
- break;
907
- case "email":
908
- bl = /^\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}$/gi.test(value);
909
- break;
910
- case "username":
911
- bl = /^[a-z0-9A-Z_]+$/.test(value)
912
- break;
913
- case "password":
914
- bl = /^[a-z0-9A-Z]+$/.test(value)
915
- break;
916
- case "url":
917
- bl = /^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+/gi.test(value)
918
- break;
919
- case "date":
920
- bl = /^\d{4}(\-|\/|\.)(0[1-9]|1[012]|[1-9])(\-|\/|\.)([12][0-9]|0[1-9]|3[01]|[1-9])$/.test(value)
921
- break;
922
- case "time":
923
- bl = /^([01][0-9]|2[0-3]):([0-4][0-9]|5[0-9])(:([0-4][0-9]|5[0-9]))?$/.test(value)
924
- break;
925
- case "datetime":
926
- bl =
927
- /^\d{4}(\-|\/|\.)(0[1-9]|1[012]|[1-9])(\-|\/|\.)([12][0-9]|0[1-9]|3[01]|[1-9]) ([01][0-9]|2[0-3]):([0-4][0-9]|5[0-9])(:([0-4][0-9]|5[0-9]))?$/
928
- .test(value)
929
- break;
930
- case "dateiso":
931
- bl =
932
- /^\d{4}-(0[1-9]|1[012]|[1-9])-([12][0-9]|0[1-9]|3[01]|[1-9])( ([01][0-9]|2[0-3]):([0-4][0-9]|5[0-9])(:([0-4][0-9]|5[0-9]))?)?$/
933
- .test(value)
934
- break;
935
- case "number":
936
- bl = /^[1-9]+[0-9]*(\.[0-9]+|[0-9]*)|0\.[0-9]+|0$/.test(value)
937
- break;
938
- case "en":
939
- bl = /^[a-zA-Z]+$/.test(value)
940
- break;
941
- case "num":
942
- case "digits":
943
- bl = /^[0-9]+$/.test(value)
944
- break;
945
- case "ch":
946
- case "chs":
947
- case "chinese":
948
- bl = /^[\u4e00-\u9fa5]+$/.test(value)
949
- break;
950
- default:
951
- console.log('输入的类型错误')
952
- break;
953
- }
954
- return bl;
955
- };
956
- /**
957
- * @description 编译模板
958
- * @param {Object} obj 对象
959
- * @return {String} 编译后的字符串
960
- */
961
- String.prototype.tpl = function(obj) {
962
- var text = this + '';
963
-
964
- function render() {
965
- if (obj) {
966
- for (var k in obj) {
967
- this[k] = obj[k];
968
- }
969
- }
970
- return eval("`" + text + "`");
971
- }
972
- return render();
973
- };
974
- })();
975
-
976
- /* == 数组原型函数 == */
977
- (function() {
978
- /**
979
- * 列表转树形列表
980
- * @param {Array} list 列表
981
- * @param {String} id ID字段
982
- * @param {Number} value ID对应值
983
- * @param {String} father_id 上级ID字段
984
- * @param {String} sub 子类字段
985
- * @return {Array} 返回属性值
986
- */
987
- function toTree(list, id, value = 0, father_id = 'father_id', sub = 'sub') {
988
- var arr = [];
989
- for (var i = 0; i < list.length; i++) {
990
- var o = list[i];
991
- if (o[father_id] === value) {
992
- o[sub] = toTree(list, id, o[id]);
993
- arr.push(o);
994
- }
995
- }
996
- return arr;
997
- }
998
-
999
- function toList(list, sub = 'sub', arr = []) {
1000
- for (var i = 0; i < list.length; i++) {
1001
- var o = list[i];
1002
- var lt = o[sub];
1003
- delete o[sub];
1004
- arr.push(o);
1005
- if (lt && lt.length > 0) {
1006
- toList(lt, sub, arr);
1007
- }
1008
- }
1009
- return arr;
1010
- }
1011
-
1012
- /**
1013
- * 列表转树形列表
1014
- * @param {String} id ID字段
1015
- * @param {Number} value ID对应值
1016
- * @param {String} father_id 上级ID字段
1017
- * @param {String} sub 子类字段
1018
- * @return {Array} 返回数组
1019
- */
1020
- Array.prototype.toTree = function(id, value = 0, father_id = 'father_id', sub = 'sub') {
1021
- return toTree(this, id, value, father_id, sub);
1022
- };
1023
-
1024
- /**
1025
- * 列表转树形列表
1026
- * @param {String} sub 子类字段
1027
- * @param {Array} arr 结果数组
1028
- * @return {Array} 返回数组
1029
- */
1030
- Array.prototype.toList = function(sub = 'sub', arr = []) {
1031
- return toList(this, sub, arr);
1032
- };
1033
-
1034
- /**
1035
- * @description 拷贝对象
1036
- * @param {Boolean} has 是否非空拷贝,如果含有数据才拷贝,不含数据不拷贝
1037
- * @return {Array} 新数组
1038
- */
1039
- Array.prototype.copy = function(has) {
1040
- var arr_new = [];
1041
- var arr = this;
1042
- if (has) {
1043
- for (var i = 0; i < arr.length; i++) {
1044
- var o = arr[i];
1045
- if (o) {
1046
- arr_new[i] = o;
1047
- }
1048
- }
1049
- } else {
1050
- for (var i = 0; i < arr.length; i++) {
1051
- arr_new[i] = arr[i];
1052
- }
1053
- }
1054
- return arr_new;
1055
- };
1056
- /**
1057
- * @description 遍历对象执行函数
1058
- * @param {Function(Object):Boolean} func 函数名
1059
- */
1060
- Array.prototype.func = function(func) {
1061
- for (var i = 0; i < this.length; i++) {
1062
- if (func(this[i])) {
1063
- break;
1064
- }
1065
- }
1066
- };
1067
- /**
1068
- * @description 数组转字符串
1069
- * @param {String} splitStr 分隔符
1070
- * @param {String} key 对象属性名
1071
- * @return {String} 字符串
1072
- */
1073
- Array.prototype.toStr = function(splitStr, key) {
1074
- var arr = this;
1075
- var str = "";
1076
- if (key) {
1077
- for (var i = 0; i < arr.length; i++) {
1078
- var o = arr[i];
1079
- if (o[key]) {
1080
- str += splitStr + o[key];
1081
- }
1082
- }
1083
- } else {
1084
- for (var i = 0; i < arr.length; i++) {
1085
- var o = arr[i];
1086
- str += splitStr + o;
1087
- }
1088
- }
1089
- return str.replace(splitStr, "");
1090
- };
1091
- /**
1092
- * @description 清空数组
1093
- * @return {Array} 清空的数组
1094
- */
1095
- Array.prototype.clear = function() {
1096
- this.splice(0, this.length);
1097
- return this;
1098
- };
1099
- /**
1100
- * @description 修改数组成员
1101
- * @param {Object} query 搜索条件
1102
- * @param {Object} obj 修改项
1103
- * @return {Array} 删除后的数组
1104
- */
1105
- Array.prototype.set = function(query, obj) {
1106
- for (var i = 0; i < this.length; i++) {
1107
- var o = this[i];
1108
- for (var k in query) {
1109
- if (as(o, query)) {
1110
- this[i] = obj;
1111
- };
1112
- }
1113
- }
1114
- return this;
1115
- };
1116
-
1117
- /**
1118
- * @description 数组列表取数组
1119
- * @param {String} key 取的属性
1120
- * @return {Array} 截取的数组
1121
- */
1122
- Array.prototype.toArr = function(key) {
1123
- var arr = [];
1124
- var lt = this;
1125
- var len = lt.length;
1126
- for (var i = 0; i < len; i++) {
1127
- var o = lt[i];
1128
- arr.push(o[key]);
1129
- }
1130
- return arr;
1131
- };
1132
-
1133
- /**
1134
- * @description 从数组获取对象
1135
- * @param {Object} query 查询条件
1136
- * @param {Boolean} end 是否结束
1137
- * @return {Object} 对象
1138
- */
1139
- Array.prototype.get = function(query, end) {
1140
- if (query) {
1141
- if (end) {
1142
- var obj;
1143
- for (var i = 0; i < this.length; i++) {
1144
- var o = this[i];
1145
- if (as(o, query)) {
1146
- obj = o;
1147
- break;
1148
- }
1149
- }
1150
- return obj;
1151
- } else {
1152
- var list = [];
1153
- for (var i = 0; i < this.length; i++) {
1154
- var o = this[i];
1155
- if (as(o, query)) {
1156
- list.push(o);
1157
- }
1158
- }
1159
- return list;
1160
- }
1161
- } else {
1162
- var list = [];
1163
- list.addList(this);
1164
- return list;
1165
- }
1166
- };
1167
-
1168
- /**
1169
- * @description 从数组获取对象
1170
- * @param {Object} query 查询条件
1171
- * @return {Object} 对象
1172
- */
1173
- Array.prototype.getObj = function(query) {
1174
- var obj;
1175
- if (query) {
1176
- for (var i = 0; i < this.length; i++) {
1177
- var o = this[i];
1178
- if (as(o, query)) {
1179
- obj = o;
1180
- break;
1181
- }
1182
- }
1183
- }
1184
- return obj;
1185
- };
1186
- /**
1187
- * @description 获取数组对象的属性值
1188
- * @param {String} key 属性名
1189
- * @param {Object} query 查询条件
1190
- * @return {Object} 属性值
1191
- */
1192
- Array.prototype.getVal = function(key, query) {
1193
- var obj = this.getObj(query);
1194
- if (obj) {
1195
- console.log('ruchag', obj[key]);
1196
- return obj[key];
1197
- } else {
1198
- return null;
1199
- }
1200
- };
1201
- /**
1202
- * @description 获取符合条件的数组对象
1203
- * @param {Object} query 查询条件
1204
- * @return {Array} 对象数组
1205
- */
1206
- Array.prototype.getList = function(query) {
1207
- var arr = [];
1208
- if (query) {
1209
- for (var i = 0; i < this.length; i++) {
1210
- var o = this[i];
1211
- if (as(o, query)) {
1212
- arr.push(o);
1213
- }
1214
- }
1215
- } else {
1216
- arr = this.copy()
1217
- }
1218
- return arr;
1219
- };
1220
- /**
1221
- * @description 获取数组所有对象的属性值
1222
- * @param {String} key 属性名
1223
- * @param {Object} query 查询条件
1224
- * @return {Array} 属性值数组
1225
- */
1226
- Array.prototype.getArr = function(key, query) {
1227
- var arr = [];
1228
- if (query) {
1229
- for (var i = 0; i < this.length; i++) {
1230
- var o = this[i];
1231
- if (as(o, query)) {
1232
- arr.push(o[key]);
1233
- }
1234
- }
1235
- } else {
1236
- for (var i = 0; i < this.length; i++) {
1237
- var o = this[i];
1238
- arr.push(o[key]);
1239
- }
1240
- }
1241
- return arr;
1242
- };
1243
- /**
1244
- * @description 给数组对象添加属性值
1245
- * @param {String} key 属性名
1246
- * @param {Object} value 属性值
1247
- * @param {Object} query 查询条件
1248
- * @param {Boolean} end 是否中断循环,中断只添加给第一个符合条件的对象
1249
- * @return {Array} 对象数组
1250
- */
1251
- Array.prototype.addVal = function(key, value, query, end) {
1252
- if (query) {
1253
- for (var i = 0; i < this.length; i++) {
1254
- var o = this[i];
1255
- if (as(o, query)) {
1256
- if (!o[key]) {
1257
- o[key] = value;
1258
- if (end) {
1259
- break;
1260
- }
1261
- }
1262
- }
1263
- }
1264
- } else {
1265
- for (var i = 0; i < this.length; i++) {
1266
- var o = this[i];
1267
- if (!o[key]) {
1268
- o[key] = value;
1269
- if (end) {
1270
- break;
1271
- }
1272
- }
1273
- }
1274
- }
1275
- return this;
1276
- };
1277
- /**
1278
- * @description 给数组添加对象
1279
- * @param {Object} obj 对象
1280
- * @param {Object} query 查询条件
1281
- * @return {Array} 对象数组
1282
- */
1283
- Array.prototype.addObj = function(obj, query) {
1284
- var has = false;
1285
- if (query) {
1286
- for (var i = 0; i < this.length; i++) {
1287
- if (as(this[i], query)) {
1288
- has = true;
1289
- break;
1290
- }
1291
- }
1292
- } else {
1293
- for (var i = 0; i < this.length; i++) {
1294
- if (as(this[i], obj)) {
1295
- has = true;
1296
- break;
1297
- }
1298
- }
1299
- }
1300
- if (!has) {
1301
- this.push(obj);
1302
- }
1303
- return this;
1304
- };
1305
- /**
1306
- * @description 给数组添加多个对象
1307
- * @param {Array} list 数组
1308
- * @param {Object} query 查询条件
1309
- * @return {Array} 对象数组
1310
- */
1311
- Array.prototype.addList = function(list, query) {
1312
- var len = list.length;
1313
- for (var i = 0; i < len; i++) {
1314
- this.addObj(list[i], query);
1315
- }
1316
- return this;
1317
- };
1318
-
1319
- /**
1320
- * @description 给数组添加一个对象或列表
1321
- * @param {Object|Array} objOrList 对象或数组
1322
- * @param {Object} query 查询条件
1323
- * @return {Array} 对象数组
1324
- */
1325
- Array.prototype.add = function(objOrList, query) {
1326
- if (Array.isArray(objOrList)) {
1327
- this.addList(objOrList, query);
1328
- } else {
1329
- this.addObj(objOrList, query);
1330
- }
1331
- return this;
1332
- };
1333
-
1334
- /**
1335
- * @description 删除数组中对象的属性
1336
- * @param {String} key 对象属性键
1337
- * @param {Object} query 查询条件
1338
- * @param {Boolean} end 是否中断循环,中断只删除第一个符合条件的对象
1339
- * @return {Array} 对象数组
1340
- */
1341
- Array.prototype.delVal = function(key, query, end) {
1342
- if (query) {
1343
- if (end) {
1344
- for (var i = 0; i < this.length; i++) {
1345
- var o = this[i];
1346
- if (as(o, query)) {
1347
- delete o[key];
1348
- break;
1349
- }
1350
- }
1351
- } else {
1352
- for (var i = 0; i < this.length; i++) {
1353
- var o = this[i];
1354
- if (as(o, query)) {
1355
- delete o[key];
1356
- }
1357
- }
1358
- }
1359
- } else {
1360
- if (end) {
1361
- delete this[0][key];
1362
- } else {
1363
- for (var i = 0; i < this.length; i++) {
1364
- var o = this[i];
1365
- delete o[key];
1366
- }
1367
- }
1368
- }
1369
- return this;
1370
- };
1371
- /**
1372
- * @description 删除数组中的对象
1373
- * @param {Object} query 查询条件
1374
- * @param {Boolean} end 是否中断循环,中断只删除第一个符合条件的对象
1375
- * @return {Array} 对象数组
1376
- */
1377
- Array.prototype.del = function(query, end) {
1378
- var bl = false;
1379
- if (end) {
1380
- if (query) {
1381
- for (var i = 0; i < this.length; i++) {
1382
- if (as(this[i], query)) {
1383
- this.splice(i, 1);
1384
- break;
1385
- }
1386
- }
1387
- } else {
1388
- for (var i = 0; i < this.length; i++) {
1389
- this.splice(i, 1);
1390
- break;
1391
- }
1392
- }
1393
- } else {
1394
- if (query) {
1395
- for (var i = this.length - 1; i >= 0; i--) {
1396
- if (as(this[i], query)) {
1397
- this.splice(i, 1);
1398
- }
1399
- }
1400
- } else {
1401
- for (var i = this.length - 1; i >= 0; i--) {
1402
- this.splice(i, 1);
1403
- }
1404
- }
1405
- }
1406
- return this;
1407
- };
1408
- /**
1409
- * @description 删除多个不同的数组成员
1410
- * @param {Array} list 查询条件列表
1411
- * @param {Boolean} end 是否中断循环,中断只删除第一个符合条件的对象
1412
- * @return {Array} 对象数组
1413
- */
1414
- Array.prototype.delList = function(list, end) {
1415
- var len = list.length;
1416
- for (var i = 0; i < len; i++) {
1417
- this.del(list[i], end);
1418
- }
1419
- return this;
1420
- };
1421
- /**
1422
- * @description 设置数组中对象的属性值
1423
- * @param {String} key 属性键
1424
- * @param {Object} value 属性值
1425
- * @param {Object} query 查询条件
1426
- * @param {Boolean} end 是否中断循环,中断只修改第一个符合条件的对象
1427
- * @return {Array} 对象数组
1428
- */
1429
- Array.prototype.setVal = function(key, value, query, end) {
1430
- if (query) {
1431
- for (var i = 0; i < this.length; i++) {
1432
- if (as(this[i], query)) {
1433
- this[i][key] = value;
1434
- if (end) {
1435
- break;
1436
- }
1437
- }
1438
- }
1439
- } else {
1440
- for (var i = 0; i < this.length; i++) {
1441
- this[i][key] = value;
1442
- if (end) {
1443
- break;
1444
- }
1445
- }
1446
- }
1447
- return this;
1448
- };
1449
- /**
1450
- * @description 设置数组中对象的属性值
1451
- * @param {Object} obj 对象
1452
- * @param {Object} query 查询条件
1453
- * @param {Boolean} end 是否中断循环,中断只修改第一个符合条件的对象
1454
- * @return {Array} 对象数组
1455
- */
1456
- Array.prototype.setObj = function(obj, query, end) {
1457
- if (query) {
1458
- for (var i = 0; i < this.length; i++) {
1459
- var o = this[i];
1460
- if (as(o, query)) {
1461
- this[i] = obj;
1462
- if (end) {
1463
- break;
1464
- }
1465
- }
1466
- }
1467
- }
1468
- return this;
1469
- };
1470
- /**
1471
- * @description 设置数组中对象的属性值
1472
- * @param {Array} list 对象列表
1473
- * @param {Object} query 查询条件
1474
- * @param {Boolean} end 是否中断循环,中断只修改第一个符合条件的对象
1475
- * @return {Array} 对象数组
1476
- */
1477
- Array.prototype.setList = function(list, query, end) {
1478
- for (var i = 0; i < this.length; i++) {
1479
- this.setObj(this[i], query, end);
1480
- }
1481
- };
1482
- /**
1483
- * @description 搜索符合条件的成员
1484
- * @param {String} str 搜索关键词
1485
- * @param {String} key 主键, 用于列表数组时
1486
- * @return {Array} 返回符合条件的结果
1487
- */
1488
- Array.prototype.search = function(str, key) {
1489
- var arr = [];
1490
- var func;
1491
- var k = str.replaceAll('*', '');
1492
- if (str.startWith("*")) {
1493
- if (str.endWith("*")) {
1494
- if (key) {
1495
- func = function(o) {
1496
- if (o[key].indexOf(k) !== -1) {
1497
- arr.push(o);
1498
- }
1499
- }
1500
- } else {
1501
- func = function(o) {
1502
- if (o.indexOf(k) !== -1) {
1503
- arr.push(o);
1504
- }
1505
- }
1506
- }
1507
- } else {
1508
- if (key) {
1509
- func = function(o) {
1510
- if (o[key].endWith(k)) {
1511
- arr.push(o);
1512
- }
1513
- }
1514
- } else {
1515
- func = function(o) {
1516
- if (o.endWith(k)) {
1517
- arr.push(o);
1518
- }
1519
- }
1520
- }
1521
- }
1522
- } else if (str.endWith("*")) {
1523
- if (key) {
1524
- func = function(o) {
1525
- if (o[key].startWith(k)) {
1526
- arr.push(o);
1527
- }
1528
- }
1529
- } else {
1530
- func = function(o) {
1531
- if (o.startWith(k)) {
1532
- arr.push(o);
1533
- }
1534
- }
1535
- }
1536
-
1537
- } else {
1538
- if (key) {
1539
- func = function(o) {
1540
- if (o[key] === k) {
1541
- arr.push(o);
1542
- }
1543
- }
1544
- } else {
1545
- func = function(o) {
1546
- if (o === k) {
1547
- arr.push(o);
1548
- }
1549
- }
1550
- }
1551
- }
1552
- this.map(func);
1553
- return arr;
1554
- };
1555
- /**
1556
- * @description 判断是否包含成员
1557
- * @param {Object} query 查询条件
1558
- * @return {Boolean} 有则返回true,没有则返回false
1559
- */
1560
- Array.prototype.has = function(query) {
1561
- var has = false;
1562
- for (var i = 0; i < this.length; i++) {
1563
- if (as(this[i], query)) {
1564
- has = true;
1565
- break;
1566
- }
1567
- };
1568
- return has;
1569
- };
1570
-
1571
- /**
1572
- * @description 取含匹配项
1573
- * @param {String} str 被匹配的字符串
1574
- * @param {String} key 用于对象列表时查询
1575
- * @return {Object} 返回匹配的第一项
1576
- */
1577
- Array.prototype.getMatch = function(str, key) {
1578
- var obj;
1579
- if (key) {
1580
- for (var i = 0; i < this.length; i++) {
1581
- if (str.has(this[i][key])) {
1582
- obj = this[i];
1583
- break;
1584
- }
1585
- }
1586
- } else {
1587
- for (var i = 0; i < this.length; i++) {
1588
- if (str.has(this[i])) {
1589
- obj = this[i];
1590
- break;
1591
- }
1592
- }
1593
- }
1594
- return obj;
1595
- };
1596
-
1597
- /**
1598
- * @description 数组转对象
1599
- * @param {String} key 主键, 用作对象索引
1600
- * @return {Object} 对象
1601
- */
1602
- Array.prototype.toObj = function(key) {
1603
- var obj = {};
1604
- this.map(function(o) {
1605
- var name = o[key];
1606
- if (name) {
1607
- obj[name] = o;
1608
- }
1609
- });
1610
- return obj;
1611
- };
1612
- })();
1613
-
1614
-
1615
- /**
1616
- * 定时任务管理器
1617
- */
1618
- (function() {
1619
- function Timer() {
1620
- /**
1621
- * @description 回调对象集合
1622
- * @example
1623
- * [{
1624
- // 名称
1625
- name: "",
1626
- // 执行函数
1627
- async run(){}
1628
- }]
1629
- */
1630
- var list = [];
1631
-
1632
- // 定时器核心
1633
- this.core;
1634
-
1635
- /**
1636
- * @description 执行
1637
- */
1638
- Timer.prototype.run = function() {
1639
- var len = list.length;
1640
- for (var i = 0; i < len; i++) {
1641
- var run = list[i].run;
1642
- if (run) {
1643
- run();
1644
- }
1645
- }
1646
- };
1647
-
1648
- /**
1649
- * @description 启动
1650
- */
1651
- Timer.prototype.start = function() {
1652
- var _this = this;
1653
- if (!this.core) {
1654
- this.core = setInterval(this.run, 1000);
1655
- }
1656
- };
1657
-
1658
- /**
1659
- * @description 结束
1660
- */
1661
- Timer.prototype.end = function() {
1662
- clearInterval(this.core);
1663
- this.core = undefined;
1664
- };
1665
-
1666
- /**
1667
- * @description 添加定时执行任务
1668
- */
1669
- Timer.prototype.add = function(obj) {
1670
- if (typeof(obj) === "object") {
1671
- if (obj.name && obj.run && typeof(obj.run) === 'function') {
1672
- list.push(obj);
1673
- }
1674
- }
1675
- };
1676
- /**
1677
- * @description 删除定时执行任务
1678
- */
1679
- Timer.prototype.del = function(name) {
1680
- if (typeof(obj) === "object") {
1681
- list.del({
1682
- name: name
1683
- }, true);
1684
- }
1685
- };
1686
- };
1687
- $.timer = new Timer();
1688
- })();
1689
-
1690
-
1691
- /* MD5加密类 */
1692
- (function() {
1693
- /* md5加密(开始) */
1694
- var hexcase = 0;
1695
- /* hex output format. 0 - lowercase; 1 - uppercase */
1696
- var b64pad = "";
1697
- /* base-64 pad character. "=" for strict RFC compliance */
1698
- var chrsz = 8;
1699
- /* bits per input character. 8 - ASCII; 16 - Unicode */
1700
-
1701
- /*
1702
- * Perform a simple self-test to see if the VM is working
1703
- */
1704
- function md5_vm_test() {
1705
- return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
1706
- }
1707
- /*
1708
- * Calculate the MD5 of an array of little-endian words, and a bit length
1709
- */
1710
- function core_md5(x, len) {
1711
- /* append padding */
1712
- x[len >> 5] |= 0x80 << len % 32;
1713
- x[(len + 64 >>> 9 << 4) + 14] = len;
1714
- var a = 1732584193;
1715
- var b = -271733879;
1716
- var c = -1732584194;
1717
- var d = 271733878;
1718
- for (var i = 0; i < x.length; i += 16) {
1719
- var olda = a;
1720
- var oldb = b;
1721
- var oldc = c;
1722
- var oldd = d;
1723
- a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
1724
- d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
1725
- c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
1726
- b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
1727
- a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
1728
- d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
1729
- c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
1730
- b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
1731
- a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
1732
- d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
1733
- c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
1734
- b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
1735
- a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
1736
- d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
1737
- c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
1738
- b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
1739
- a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
1740
- d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
1741
- c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
1742
- b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
1743
- a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
1744
- d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
1745
- c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
1746
- b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
1747
- a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
1748
- d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
1749
- c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
1750
- b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
1751
- a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
1752
- d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
1753
- c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
1754
- b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
1755
- a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
1756
- d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
1757
- c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
1758
- b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
1759
- a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
1760
- d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
1761
- c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
1762
- b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
1763
- a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
1764
- d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
1765
- c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
1766
- b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
1767
- a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
1768
- d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
1769
- c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
1770
- b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
1771
- a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
1772
- d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
1773
- c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
1774
- b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
1775
- a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
1776
- d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
1777
- c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
1778
- b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
1779
- a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
1780
- d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
1781
- c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
1782
- b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
1783
- a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
1784
- d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
1785
- c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
1786
- b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
1787
- a = safe_add(a, olda);
1788
- b = safe_add(b, oldb);
1789
- c = safe_add(c, oldc);
1790
- d = safe_add(d, oldd);
1791
- }
1792
- return Array(a, b, c, d);
1793
- }
1794
- /*
1795
- * These functions implement the four basic operations the algorithm uses.
1796
- */
1797
- function md5_cmn(q, a, b, x, s, t) {
1798
- return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
1799
- }
1800
-
1801
- function md5_ff(a, b, c, d, x, s, t) {
1802
- return md5_cmn(b & c | ~b & d, a, b, x, s, t);
1803
- }
1804
-
1805
- function md5_gg(a, b, c, d, x, s, t) {
1806
- return md5_cmn(b & d | c & ~d, a, b, x, s, t);
1807
- }
1808
-
1809
- function md5_hh(a, b, c, d, x, s, t) {
1810
- return md5_cmn(b ^ c ^ d, a, b, x, s, t);
1811
- }
1812
-
1813
- function md5_ii(a, b, c, d, x, s, t) {
1814
- return md5_cmn(c ^ (b | ~d), a, b, x, s, t);
1815
- }
1816
- /*
1817
- * Calculate the HMAC-MD5, of a key and some data
1818
- */
1819
- function core_hmac_md5(key, data) {
1820
- var bkey = str2binl(key);
1821
- if (bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
1822
- var ipad = Array(16),
1823
- opad = Array(16);
1824
- for (var i = 0; i < 16; i++) {
1825
- ipad[i] = bkey[i] ^ 0x36363636;
1826
- opad[i] = bkey[i] ^ 0x5C5C5C5C;
1827
- }
1828
- var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
1829
- return core_md5(opad.concat(hash), 512 + 128);
1830
- }
1831
- /*
1832
- * Add integers, wrapping at 2^32. This uses 16-bit operations internally
1833
- * to work around bugs in some JS interpreters.
1834
- */
1835
- function safe_add(x, y) {
1836
- var lsw = (x & 0xFFFF) + (y & 0xFFFF);
1837
- var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
1838
- return msw << 16 | lsw & 0xFFFF;
1839
- }
1840
- /*
1841
- * Bitwise rotate a 32-bit number to the left.
1842
- */
1843
- function bit_rol(num, cnt) {
1844
- return num << cnt | num >>> 32 - cnt;
1845
- }
1846
- /*
1847
- * Convert a string to an array of little-endian words
1848
- * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
1849
- */
1850
- function str2binl(str) {
1851
- var bin = Array();
1852
- var mask = (1 << chrsz) - 1;
1853
- for (var i = 0; i < str.length * chrsz; i += chrsz) {
1854
- bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << i % 32;
1855
- }
1856
- return bin;
1857
- }
1858
- /*
1859
- * Convert an array of little-endian words to a string
1860
- */
1861
- function binl2str(bin) {
1862
- var str = "";
1863
- var mask = (1 << chrsz) - 1;
1864
- for (var i = 0; i < bin.length * 32; i += chrsz) {
1865
- str += String.fromCharCode(bin[i >> 5] >>> i % 32 & mask);
1866
- }
1867
- return str;
1868
- }
1869
- /*
1870
- * Convert an array of little-endian words to a hex string.
1871
- */
1872
- function binl2hex(binarray) {
1873
- var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
1874
- var str = "";
1875
- for (var i = 0; i < binarray.length * 4; i++) {
1876
- str += hex_tab.charAt(binarray[i >> 2] >> i % 4 * 8 + 4 & 0xF) + hex_tab.charAt(binarray[i >> 2] >> i % 4 * 8 & 0xF);
1877
- }
1878
- return str;
1879
- }
1880
- /*
1881
- * Convert an array of little-endian words to a base-64 string
1882
- */
1883
- function binl2b64(binarray) {
1884
- var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1885
- var str = "";
1886
- for (var i = 0; i < binarray.length * 4; i += 3) {
1887
- var triplet = (binarray[i >> 2] >> 8 * (i % 4) & 0xFF) << 16 | (binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4) & 0xFF) <<
1888
- 8 | binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4) & 0xFF;
1889
- for (var j = 0; j < 4; j++) {
1890
- if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
1891
- else str += tab.charAt(triplet >> 6 * (3 - j) & 0x3F);
1892
- }
1893
- }
1894
- return str;
1895
- }
1896
-
1897
- $.hex_md5 = function hex_md5(s) {
1898
- return binl2hex(core_md5(str2binl(s), s.length * chrsz));
1899
- };
1900
- $.b64_md5 = function b64_md5(s) {
1901
- return binl2b64(core_md5(str2binl(s), s.length * chrsz));
1902
- };
1903
- $.str_md5 = function str_md5(s) {
1904
- return binl2str(core_md5(str2binl(s), s.length * chrsz));
1905
- };
1906
- $.hex_hmac_md5 = function hex_hmac_md5(key, data) {
1907
- return binl2hex(core_hmac_md5(key, data));
1908
- };
1909
- $.b64_hmac_md5 = function b64_hmac_md5(key, data) {
1910
- return binl2b64(core_hmac_md5(key, data));
1911
- };
1912
- $.str_hmac_md5 = function str_hmac_md5(key, data) {
1913
- return binl2str(core_hmac_md5(key, data));
1914
- };
1915
-
1916
- $.md5 = $.hex_md5;
1917
- })();
1918
-
1919
- (function() {
1920
- /* == 网络请求 == */
1921
- $.http = {
1922
- /**
1923
- * @description GET请求——json
1924
- * @param {String} url 请求地址
1925
- * @param {Function} fun 回调函数
1926
- * @param {Object} headers 协议头
1927
- * @return {Object} 同步请求返回请求结果,否则返回undefined
1928
- */
1929
- get: function get(url, fun, headers) {
1930
- var json;
1931
- var hp = {
1932
- type: 'GET',
1933
- url: url,
1934
- async: fun !== null,
1935
- xhrFields: {
1936
- withCredentials: true
1937
- },
1938
- crossDomain: true,
1939
- success: function success(data, status) {
1940
- if (fun) {
1941
- fun(data, status);
1942
- } else {
1943
- json = {
1944
- data: data,
1945
- status: status
1946
- };
1947
- }
1948
- },
1949
- error: function error(data, status) {
1950
- if (fun) {
1951
- fun(data, status);
1952
- } else {
1953
- json = {
1954
- data: data,
1955
- status: status
1956
- };
1957
- }
1958
- },
1959
- complete: function complete(XHR, TS) {
1960
- XHR = null;
1961
- }
1962
- };
1963
- if (headers) {
1964
- hp.headers = headers;
1965
- }
1966
- $.ajax(hp);
1967
- return json;
1968
- },
1969
- /**
1970
- * @description POST请求
1971
- * @param {String} url 请求地址
1972
- * @param {Object} param 请求参数
1973
- * @param {Function} fun 回调函数
1974
- * @param {Object} headers 协议头
1975
- * @param {String} type 协议头
1976
- * @return {Object} 同步请求返回请求结果,否则返回undefined
1977
- */
1978
- post: function post(url, param, fun, headers, type) {
1979
- var contentType;
1980
- var pm;
1981
- if (type === 'xml') {
1982
- contentType = "text/xml; charset=utf-8";
1983
- pm = param;
1984
- } else if (type === 'form') {
1985
- contentType = "application/x-www-form-urlencoded; charset=utf-8";
1986
- pm = param;
1987
- } else {
1988
- contentType = "application/json; charset=utf-8";
1989
- pm = JSON.stringify(param);
1990
- }
1991
- var json;
1992
- var hp = {
1993
- type: 'POST',
1994
- url: url,
1995
- async: fun !== null,
1996
- xhrFields: {
1997
- withCredentials: true
1998
- },
1999
- crossDomain: true,
2000
- data: pm,
2001
- dataType: "json",
2002
- contentType: contentType,
2003
- success: function success(data, status) {
2004
- if (fun) {
2005
- fun(data, status);
2006
- } else {
2007
- json = {
2008
- data: data,
2009
- status: status
2010
- };
2011
- }
2012
- },
2013
- error: function error(data, status) {
2014
- if (fun) {
2015
- fun(data, status);
2016
- } else {
2017
- json = {
2018
- data: data,
2019
- status: status
2020
- };
2021
- }
2022
- },
2023
- complete: function complete(XHR, TS) {
2024
- XHR = null;
2025
- }
2026
- };
2027
- if (headers) {
2028
- hp.headers = headers;
2029
- }
2030
- $.ajax(hp);
2031
- return json;
2032
- }
2033
- };
2034
-
2035
- /* 缓存 */
2036
- $.cookies = {
2037
- /**
2038
- * @description 设置域
2039
- * @param {String} url 地址
2040
- */
2041
- domain: function domain(url) {
2042
- if (url) {
2043
- _domain = url;
2044
- }
2045
- return ";path=/";
2046
- },
2047
- /**
2048
- * @description 设置缓存
2049
- * @param {String} name 缓存对象
2050
- * @param {Object} value 缓存值
2051
- * @param {Number} minutes 缓存时长,单位: 分钟
2052
- * @param {String} domain 作用域
2053
- */
2054
- set: function set(name, value, minutes, domain) {
2055
- if (!domain) {
2056
- domain = $.cookies.domain();
2057
- }
2058
- var time = new Date();
2059
- if (minutes) {
2060
- time.setTime(time.getTime() + minutes * 60000);
2061
- document.cookie = name + "=" + encodeURIComponent(value) + ";expires=" + time.toGMTString();
2062
- } else {
2063
- time.setTime(time.getTime() + 7 * 24 * 3600 * 60000);
2064
- document.cookie = name + "=" + encodeURIComponent(value) + ";expires=" + time.toGMTString();
2065
- }
2066
- },
2067
-
2068
- /**
2069
- * @description 获取cookie
2070
- * @param {String} name 名称
2071
- */
2072
- get: function get(name) {
2073
- var value = null;
2074
- var str = document.cookie;
2075
- var arr = str.split("; ");
2076
- for (var i = 0; i < arr.length; i++) {
2077
- var ar = arr[i].split("=");
2078
- if (ar[0] == name) {
2079
- value = decodeURIComponent(ar[1]);
2080
- break;
2081
- }
2082
- }
2083
- return value;
2084
- },
2085
-
2086
- /**
2087
- * @description 删除cookie
2088
- * @param {String} name 名称
2089
- */
2090
- del: function del(name) {
2091
- this.set(name, "", -1);
2092
- }
2093
- };
2094
-
2095
- /**
2096
- * @description 设置或查询cookie缓存
2097
- * @param {String} key 缓存对象名
2098
- * @param {Object} value 缓存值
2099
- * @param {Number} minutes 缓存时长,单位: 分钟
2100
- */
2101
- $.cookie = function(key, value, minutes) {
2102
- if (value != undefined) {
2103
- if (!minutes) {
2104
- if (value == null) {
2105
- minutes = 0;
2106
- } else {
2107
- minutes = 120;
2108
- }
2109
- }
2110
- $.cookies.set(key, value, minutes);
2111
- } else {
2112
- return $.cookies.get(key);
2113
- }
2114
- };
2115
-
2116
- /* === 多媒体 === */
2117
- $.file = {
2118
- /**
2119
- * @description 上传文件
2120
- * @param {String} url 提交网址
2121
- * @param {Object} obj 对象
2122
- * @param {Function} func 函数
2123
- * @param {Object} headers 协议头
2124
- */
2125
- upload: function upload(url, obj, func, headers) {
2126
- var formData = new FormData();
2127
- for (var k in obj) {
2128
- formData.append(k, obj[k]);
2129
- }
2130
- var hp = {
2131
- type: 'POST',
2132
- url: url,
2133
- data: formData,
2134
- processData: false,
2135
- contentType: false,
2136
- async: func !== null,
2137
- xhrFields: {
2138
- withCredentials: true
2139
- },
2140
- success: function success(json, status) {
2141
- if (func) {
2142
- if (json) {
2143
- json["obj"] = obj;
2144
- }
2145
- func(json, status);
2146
- }
2147
- },
2148
- complete: function complete(XHR, TS) {
2149
- XHR = null;
2150
- }
2151
- };
2152
-
2153
- if (headers) {
2154
- hp.headers = headers;
2155
- }
2156
- $.ajax(hp);
2157
- }
2158
- };
2159
- })();
2160
-
2161
- /* 通讯 */
2162
- (function() {
2163
- $.html = {
2164
- tag: function(tag, prop, value) {
2165
- var obj;
2166
- var list = document.getElementsByTagName(tag);
2167
- var len = list.length;
2168
- for (var i = 0; i < len; i++) {
2169
- var o = list[i];
2170
- if (o && o.getAttribute(prop) && o.getAttribute(prop).has(value)) {
2171
- obj = o;
2172
- break;
2173
- }
2174
- }
2175
- return obj;
2176
- }
2177
- };
2178
-
2179
- /**
2180
- * 本地临时缓存,关闭浏览器后小时
2181
- */
2182
- $.cache = {
2183
- /**
2184
- * 设置值
2185
- * @param {String} key 键
2186
- * @param {Object} value 值
2187
- */
2188
- set: function(key, value) {
2189
- window.sessionStorage.setItem(key, value);
2190
- },
2191
- /**
2192
- * 获取值
2193
- * @param {String} key 键
2194
- * @return {Object} 值
2195
- */
2196
- get: function(key) {
2197
- return window.sessionStorage.getItem(key);
2198
- },
2199
- /**
2200
- * 删除值
2201
- * @param {Object} key 键
2202
- */
2203
- del: function(key) {
2204
- window.sessionStorage.removeItem(key);
2205
- },
2206
- /**
2207
- * 清除所有缓存
2208
- */
2209
- clear: function() {
2210
- window.sessionStorage.clear();
2211
- }
2212
- };
2213
-
2214
- /**
2215
- * 本地数据库存储
2216
- */
2217
- $.db = {
2218
- /**
2219
- * 设置值
2220
- * @param {String} key 键
2221
- * @param {Object} value 值
2222
- * @param {Number} longTime 保存时长(单位:分钟)
2223
- */
2224
- set: function(key, value, longTime) {
2225
- var expires = null;
2226
- if (longTime) {
2227
- var time = Date.now();
2228
- expires = time + longTime * 60000;
2229
- }
2230
- var data = {
2231
- value,
2232
- expires
2233
- };
2234
- window.localStorage.setItem(key, JSON.stringify(data));
2235
- },
2236
- /**
2237
- * 获取值
2238
- * @param {String} key 键
2239
- * @return {Object} 值
2240
- */
2241
- get: function(key) {
2242
- var value;
2243
- var text = window.localStorage.getItem(key);
2244
- if (text && text.indexOf('{') === 0) {
2245
- try {
2246
- var data = JSON.parse(text);
2247
- if (data) {
2248
- if (data.expires) {
2249
- var time = new Date(data.expires);
2250
- if (time > Date.now()) {
2251
- value = data.value;
2252
- } else {
2253
- window.localStorage.removeItem(key);
2254
- }
2255
- } else {
2256
- value = data.value;
2257
- }
2258
- }
2259
- } catch (e) {
2260
- console.log(e);
2261
- value = text;
2262
- }
2263
- } else {
2264
- value = text;
2265
- }
2266
- return value;
2267
- },
2268
- /**
2269
- * 删除值
2270
- * @param {Object} key 键
2271
- */
2272
- del: function(key) {
2273
- window.localStorage.removeItem(key);
2274
- }
2275
- };
2276
-
2277
- /**
2278
- * web socket通讯组
2279
- */
2280
- $.ws = {};
2281
-
2282
- /* 封装 WebSocket 实例化的方法 */
2283
- var CreateWebSocket = (function(url) {
2284
- return function(url) {
2285
- var ws;
2286
- try {
2287
- if (window.WebSocket) {
2288
- ws = new WebSocket(url)
2289
- } else if (window.MozWebSocket) {
2290
- ws = new MozWebSocket(url)
2291
- };
2292
- } catch (e) {
2293
- //TODO handle the exception
2294
- }
2295
- return ws;
2296
- }
2297
- })();
2298
-
2299
- /**
2300
- * 等待连接成功, 然后发送消息
2301
- */
2302
- function connect(_this) {
2303
- if (_this.try_connect) {
2304
- return;
2305
- }
2306
- _this.try_connect = true;
2307
- var ws = CreateWebSocket(_this.url);
2308
- ws.onmessage = function(event) {
2309
- _this.message(event);
2310
- };
2311
- ws.onclose = function() {
2312
- reconnect(_this);
2313
- };
2314
- ws.onerror = function(event) {
2315
- _this.noticy("error", event);
2316
- };
2317
- ws.onopen = function() {
2318
- _this.try_connect = false;
2319
- var arr = _this.arr_message;
2320
- var len = arr.length;
2321
- for (var i = 0; i < len; i++) {
2322
- if (ws.readyState === 1) {
2323
- _this.ws.send(arr[i]);
2324
- }
2325
- }
2326
- // 发送成功, 清空消息组
2327
- _this.arr_message.clear();
2328
- // 重置重新连接次数
2329
- _this.try_times = 0;
2330
- }
2331
- _this.ws = ws;
2332
- };
2333
-
2334
- /**
2335
- * 重新连接
2336
- * @param {Object} _this ws对象
2337
- */
2338
- function reconnect(_this) {
2339
- _this.try_times++;
2340
- if (_this.try_times <= _this.try_max_times) {
2341
- _this.try_connect = false;
2342
- // 没连接上会一直重连,设置延迟避免请求过多
2343
- setTimeout(function() {
2344
- connect(_this)
2345
- }, _this.seconds);
2346
- _this.noticy('reconnect', _this.try_times);
2347
- } else {
2348
- _this.noticy('error', '服务器连接失败!');
2349
- }
2350
- };
2351
-
2352
- /**
2353
- * 构造通讯函数
2354
- * @param {String} url
2355
- * @param {Function} noticy 通知函数
2356
- * @param {Function} receive 响应回调函数
2357
- * @param {Function} noticy 信息捕捉函数
2358
- * @param {String} name 名称
2359
- * @param {Number} seconds 重新连接次数
2360
- * @return {Object} 返回发信服务
2361
- */
2362
- function WS(url, receive, noticy, name, seconds) {
2363
- if (noticy) {
2364
- this.noticy = noticy;
2365
- } else {
2366
- /**
2367
- * 通知函数
2368
- * @param {String} type 通知类型
2369
- */
2370
- this.noticy = function(type, content) {
2371
- console.log(type, content);
2372
- };
2373
- }
2374
-
2375
- if (!window.WebSocket) {
2376
- console.error('错误: 浏览器不支持websocket');
2377
- this.noticy('error', '浏览器不支持websocket');
2378
- return;
2379
- }
2380
-
2381
- var u;
2382
- if (url.indexOf('//') !== -1) {
2383
- u = url.replace("https", "ws").replace("http", "ws");
2384
- } else {
2385
- u = "ws://" + url;
2386
- }
2387
- // 连接地址
2388
- this.url = u;
2389
-
2390
- if (name) {
2391
- this.name = name
2392
- } else {
2393
- this.name = u;
2394
- }
2395
-
2396
- this.receive = receive;
2397
-
2398
- // 消息数组, 在等待连接的过程中, 如果有多条消息, 则保存至此, 等待连接成功后发送
2399
- this.arr_message = [];
2400
-
2401
- if (seconds) {
2402
- this.seconds = seconds;
2403
- } else {
2404
- this.seconds = 6000;
2405
- }
2406
-
2407
- /**
2408
- * 尝试重连次数
2409
- */
2410
- this.try_times = 0;
2411
-
2412
- /**
2413
- * 最大尝试次数, 如果每次重试间隔1分钟, 那么10分钟后就不再重连
2414
- */
2415
- this.try_max_times = 10;
2416
-
2417
- /**
2418
- * 是否正在尝试连接
2419
- */
2420
- this.try_connect = false;
2421
-
2422
- // 连接 socket服务
2423
- connect(this);
2424
- }
2425
-
2426
-
2427
- /**
2428
- * 打开服务
2429
- */
2430
- WS.prototype.open = function() {
2431
- connect(this);
2432
- };
2433
-
2434
- /**
2435
- * 关闭服务
2436
- */
2437
- WS.prototype.close = function() {
2438
- this.ws.onclose = function(event) {};
2439
- this.ws.close()
2440
- };
2441
-
2442
-
2443
- /**
2444
- * 释放
2445
- */
2446
- WS.prototype.clear = function() {
2447
- this.close();
2448
- delete $.ws[key];
2449
- };
2450
-
2451
- /**
2452
- * 收到消息
2453
- */
2454
- WS.prototype.message = function(event) {
2455
- var data = event.data;
2456
- if (data && this.receive) {
2457
- this.receive(data);
2458
- }
2459
- };
2460
-
2461
-
2462
- /**
2463
- * 发送数据
2464
- * @param {String} bodyStr 消息主体字符串
2465
- */
2466
- WS.prototype.send = function(bodyStr) {
2467
- var ws = this.ws;
2468
- switch (ws.readyState) {
2469
- case 0:
2470
- // CONNECTING 正在连接
2471
- // 先将消息加入队列等待连接成功再发送
2472
- this.arr_message.push(bodyStr);
2473
- break;
2474
- case 1:
2475
- // OPEN 连接成功,可以通信了
2476
- ws.send(bodyStr);
2477
- break;
2478
- case 2:
2479
- // CLOSING 连接正在关闭
2480
- // 先将消息加入队列, 等待关闭 > 重新连接 > 连接成功 再发送消息
2481
- this.arr_message.push(bodyStr);
2482
- break;
2483
- default:
2484
- if (this.try_times > 9) {
2485
- this.try_times = 0;
2486
- this.try_connect = false;
2487
- }
2488
- // CLOSED 连接已经关闭,或者打开连接失败
2489
- // 先将消息加入队列, 重新连接 > 连接成功 再发送消息
2490
- this.arr_message.push(bodyStr);
2491
- connect(this);
2492
- break;
2493
- }
2494
- };
2495
-
2496
- /**
2497
- * 主动关闭连接
2498
- */
2499
- WS.prototype.close = function() {
2500
- this.ws.close();
2501
- };
2502
-
2503
- /**
2504
- * 创建web socket通讯服务
2505
- * @param {String} url URL地址
2506
- * @param {Function} receive 响应回调函数
2507
- * @param {Function} noticy 信息捕捉函数
2508
- * @param {String} name 名称
2509
- * @param {String} seconds 秒
2510
- * @return {Object} 返回发信服务
2511
- */
2512
- $.socket = function(url, receive, noticy, name, seconds) {
2513
- // 使用键方式去查询多个通讯
2514
- // 需要多通讯的原因是: 像交易所可能需要即时通讯的同时还需要试试变化交易信息
2515
- if (!name) {
2516
- name = url;
2517
- }
2518
- if (!$.ws[name]) {
2519
- $.ws[name] = new WS(url, receive, noticy, name, seconds);
2520
- } else {
2521
- $.ws[name].try_times = 0;
2522
- }
2523
- return $.ws[name];
2524
- };
2525
-
2526
- /**
2527
- * 路由
2528
- */
2529
- $.route = {
2530
- /**
2531
- * 重定向地址
2532
- */
2533
- redirect_url: "/",
2534
- /**
2535
- * 路由历史记录
2536
- */
2537
- history: {
2538
- list: [],
2539
- push: function(url) {
2540
- if (this.list.length > 0) {
2541
- var end_url = this.list[this.list.length - 1];
2542
- if (end_url !== url) {
2543
- this.list.push(url);
2544
- }
2545
- } else {
2546
- this.list.push(url);
2547
- }
2548
- }
2549
- },
2550
-
2551
- /**
2552
- * 添加路由
2553
- * @param {String} url
2554
- * @param {String} title
2555
- */
2556
- push: function(url, title) {
2557
- history.pushState({
2558
- status: 0
2559
- }, title, url);
2560
- }
2561
- };
2562
-
2563
- /**
2564
- * 浏览器
2565
- */
2566
- $.os = function() {
2567
- var u = navigator.userAgent;
2568
- return {
2569
- version: navigator.appVersion,
2570
- isApp: u.indexOf("Html5Plus") !== -1,
2571
- device: {
2572
- // 是否为移动终端
2573
- mobile: /AppleWebKit.*Mobile.*/.test(u),
2574
- // ios终端
2575
- ios: /\(i[^;]+;( U;)? CPU.+Mac OS X/.test(u),
2576
- // android终端或Linux浏览器
2577
- android: u.indexOf('Android') !== -1 || u.indexOf('Linux') !== -1,
2578
- // 是否为iPhone或者QQHD浏览器
2579
- iPhone: u.indexOf('iPhone') !== -1,
2580
- // 是否iPad
2581
- iPad: u.indexOf('iPad') !== -1,
2582
- // 是否电脑
2583
- pc: u.indexOf('Window') !== -1,
2584
- },
2585
- app: {
2586
- // 微信
2587
- wechat: /MicroMessenger/i.test(u),
2588
- // 微博
2589
- weibo: /WeiBo/i.test(u),
2590
- // QQ
2591
- qq: /QQ/i.test(u)
2592
- },
2593
- browser: {
2594
- // 浏览器版本信息
2595
- // IE内核
2596
- trident: u.indexOf('Trident') > -1,
2597
- // opera内核
2598
- presto: u.indexOf('Presto') > -1,
2599
- // 苹果、谷歌内核
2600
- webKit: u.indexOf('AppleWebKit') > -1,
2601
- // 火狐内核
2602
- gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,
2603
- // 苹果默认浏览器
2604
- safari: u.indexOf('Safari') === -1
2605
- }
2606
- }
2607
- }();
2608
- })();
2609
-
2610
- (function() {
2611
- /**
2612
- * @description 添加对象属性
2613
- * @param {Object} obj 对象
2614
- * @param {Object} query 查询条件
2615
- * @param {Object} value 添加值
2616
- * @return {Object} 返回添加的局部对象
2617
- */
2618
- function add(obj, query, value) {
2619
- if (query) {
2620
- var oj = get(obj, query);
2621
- if (oj) {
2622
- $.push(oj, value, true);
2623
- }
2624
- return oj;
2625
- } else {
2626
- $.push(obj, value, true);
2627
- return obj;
2628
- }
2629
- };
2630
- $.add = add;
2631
-
2632
- /**
2633
- * @description 删除对象属性
2634
- * @param {Object} obj 对象
2635
- * @param {Object} query 查询条件
2636
- * @param {Object} item 查询条件
2637
- * @return {Object} 返回删除结果
2638
- */
2639
- function del(obj, query, item) {
2640
- var o = {};
2641
- if (query) {
2642
- o = get(obj, query);
2643
- } else {
2644
- o = obj;
2645
- }
2646
- if (!item) {
2647
- item = Object.assign(o);
2648
- }
2649
- if (Array.isArray(o)) {
2650
- o.clear();
2651
- } else if (Array.isArray(item)) {
2652
- for (var i = 0; i < item.length; i++) {
2653
- var val = item[i];
2654
- if (typeof(val) === "object") {
2655
- del(o, null, val);
2656
- } else {
2657
- delete o[val];
2658
- }
2659
- }
2660
- } else if (typeof(item) === "object") {
2661
- for (var k in item) {
2662
- if (Array.isArray(o[k])) {
2663
- delete o[k];
2664
- } else if (typeof(o[k]) === "object") {
2665
- var type = typeof(item[k]);
2666
- if (type === "object") {
2667
- del(o[k], null, item[k]);
2668
- } else if (type === "string" || type === "number") {
2669
- delete o[k][item[k]];
2670
- } else {
2671
- delete o[k];
2672
- }
2673
- } else {
2674
- delete o[k];
2675
- }
2676
- }
2677
- } else {
2678
- delete o[item];
2679
- }
2680
- for (var k in o) {
2681
- if (Object.keys(o[k]).length === 0) {
2682
- delete o[k]
2683
- }
2684
- }
2685
- return o;
2686
- };
2687
- $.del = del;
2688
-
2689
- /**
2690
- * @description 修改对象属性
2691
- * @param {Object} obj 对象
2692
- * @param {Object} query 查询条件
2693
- * @param {Object} value 返回修改的局部对象
2694
- */
2695
- function set(obj, query, value) {
2696
- if (query) {
2697
- var oj = get(obj, query);
2698
- if (oj) {
2699
- $.push(oj, value);
2700
- }
2701
- return oj;
2702
- } else {
2703
- $.push(obj, value);
2704
- return obj;
2705
- }
2706
- };
2707
- $.set = set;
2708
-
2709
- function arrToObj(arr) {
2710
- var obj = {};
2711
- var ret = obj;
2712
- var len = arr.length;
2713
- for (var i = 0; i < len; i++) {
2714
- var k = arr[i];
2715
- if (typeof(k) == "object") {
2716
- if (Array.isArray(k)) {
2717
- $.push(obj, arrToObj(k), true);
2718
- } else {
2719
- $.push(obj, k, true);
2720
- }
2721
- } else if (!obj[k]) {
2722
- if (len - i > 1) {
2723
- obj[k] = {};
2724
- } else {
2725
- obj[k] = true;
2726
- }
2727
- obj = obj[k];
2728
- }
2729
- }
2730
- return ret;
2731
- }
2732
-
2733
- /**
2734
- * @description 查询对象属性
2735
- * @param {Object} obj 对象
2736
- * @param {Object} query
2737
- * @return {Object} 返回查询结果
2738
- */
2739
- function get(obj, query) {
2740
- var ret;
2741
- if (typeof(obj) === 'object' && !Array.isArray(obj)) {
2742
- // 只有非数组的对象才进行操作
2743
- if (Array.isArray(query)) {
2744
- var ret = obj;
2745
- // 如果是数字则循环数组
2746
- for (var i = 0; i < query.length; i++) {
2747
- var o = query[i];
2748
- if (Array.isArray(o)) {
2749
- ret = get(ret, o);
2750
- } else if (typeof(o) === 'object') {
2751
- var oj = {};
2752
- for (var k in o) {
2753
- if (o[k]) {
2754
- oj[k] = get(ret[k], o[k]);
2755
- } else {
2756
- oj[k] = ret[k];
2757
- }
2758
- }
2759
- ret = oj;
2760
- } else {
2761
- ret = ret[o];
2762
- if (typeof(ret) !== 'object') {
2763
- break;
2764
- }
2765
- }
2766
- }
2767
-
2768
- } else if (typeof(query) === 'object') {
2769
- var ret = {};
2770
- // 如果是对象则遍历对象
2771
- for (var k in query) {
2772
- ret[k] = get(obj[k], query[k]);
2773
- }
2774
- ret = ret;
2775
- } else if (query) {
2776
- if (typeof(query) == "string" || typeof(query) == "number") {
2777
- ret = {};
2778
- ret[query] = obj[query];
2779
- } else {
2780
- ret = obj;
2781
- }
2782
- } else {
2783
- // 如果query为空则返回整个对象
2784
- ret = null;
2785
- }
2786
- } else {
2787
- // 否则直接返回值
2788
- ret = obj;
2789
- }
2790
- return ret;
2791
- };
2792
- $.get = get;
2793
-
2794
- /**
2795
- * 遍历读写对象
2796
- * @param {Object} obj
2797
- * @param {String} key 键 多级对象用.分隔
2798
- * @param {Object} value 值,如果不传为查询,传为修改
2799
- */
2800
- function obj_for(obj, key, value) {
2801
- if (!key) {
2802
- return undefined;
2803
- }
2804
- var keys = key.split('.');
2805
- var len = keys.length;
2806
- if (len == 0) {
2807
- return undefined;
2808
- }
2809
- var k = keys[0];
2810
- var o = obj[k];
2811
- if (len == 1 && value !== undefined) {
2812
- obj[k] = value;
2813
- o = value;
2814
- } else if (typeof(o) == 'object') {
2815
- if (len > 1) {
2816
- return obj_for(o, keys.splice(1, len).join('.'), value);
2817
- }
2818
- } else if (len > 1) {
2819
- return undefined;
2820
- }
2821
- return o;
2822
- }
2823
-
2824
- $.obj = obj_for;
2825
- })();
2826
-
2827
- /**
2828
- * 跨站校验
2829
- */
2830
- function ifame_check() {
2831
- var domain = document.domain;
2832
- var _self = Object.assign({}, window.self.location);
2833
- try {
2834
- var host = window.top.location.host;
2835
- } catch (e) {
2836
- console.log('跨域嵌套ifame');
2837
- window.location.href = "/404.html";
2838
- }
2839
- }
2840
-
2841
- ifame_check();