mm_os 1.3.4 → 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.
- package/README.en.md +36 -0
- package/README.md +25 -166
- package/conf.json +3 -0
- package/core/base/index.js +29 -0
- package/core/base/mqtt/index.js +268 -0
- package/core/base/mqtt/lib.js +40 -0
- package/core/base/web/index.js +110 -0
- package/core/com/api/com.json +4 -0
- package/{bin → core}/com/api/config.tpl.json +9 -7
- package/{bin → core}/com/api/drive.js +239 -64
- package/{bin → core}/com/api/index.js +8 -9
- package/{bin → core}/com/api/oauth.js +23 -14
- package/core/com/api/script.js +32 -0
- package/core/com/db/com.json +4 -0
- package/{bin → core}/com/db/drive.js +99 -65
- package/{bin → core}/com/db/index.js +2 -2
- package/core/com/event/com.json +4 -0
- package/{bin → core}/com/event/config.tpl.json +2 -2
- package/core/com/event/drive.js +125 -0
- package/{bin → core}/com/event/index.js +5 -10
- package/core/com/event/script.js +26 -0
- package/core/com/eventer/com.js +450 -0
- package/core/com/eventer/com.json +4 -0
- package/core/com/middleware/com.js +128 -0
- package/core/com/middleware/com.json +4 -0
- package/core/com/middleware/config.tpl.json +8 -0
- package/core/com/middleware/script.js +9 -0
- package/core/com/mqtt/com.json +4 -0
- package/core/com/mqtt/config.tpl.json +12 -0
- package/core/com/mqtt/drive.js +139 -0
- package/core/com/mqtt/index.js +138 -0
- package/core/com/mqtt/script.js +33 -0
- package/core/com/msg/com.js +296 -0
- package/core/com/msg/com.json +4 -0
- package/{bin → core}/com/nav/drive.js +42 -17
- package/{bin → core}/com/nav/index.js +4 -4
- package/core/com/nav/tpl/admin_pc/page_channel.vue +299 -0
- package/core/com/nav/tpl/admin_pc/page_config.vue +279 -0
- package/core/com/nav/tpl/admin_pc/page_config_form.vue +194 -0
- package/core/com/nav/tpl/admin_pc/page_default.vue +287 -0
- package/core/com/nav/tpl/admin_pc/page_form.vue +180 -0
- package/core/com/nav/tpl/admin_pc/page_lang.vue +265 -0
- package/core/com/nav/tpl/admin_pc/page_nav.vue +313 -0
- package/core/com/nav/tpl/admin_pc/page_table.vue +285 -0
- package/core/com/nav/tpl/admin_pc/page_type.vue +313 -0
- package/core/com/nav/tpl/dev_pc/page_channel.vue +253 -0
- package/core/com/nav/tpl/dev_pc/page_config.vue +253 -0
- package/core/com/nav/tpl/dev_pc/page_default.vue +247 -0
- package/core/com/nav/tpl/dev_pc/page_form.vue +162 -0
- package/core/com/nav/tpl/dev_pc/page_nav.vue +253 -0
- package/core/com/nav/tpl/dev_pc/page_table.vue +247 -0
- package/core/com/nav/tpl/dev_pc/page_type.vue +253 -0
- package/{bin/com/nav/tpl/home_phone → core/com/nav/tpl/home_pc}/page_channel.vue +231 -231
- package/{bin/com/nav/tpl/home_phone → core/com/nav/tpl/home_pc}/page_default.vue +231 -231
- package/{bin → core}/com/nav/tpl/home_pc/page_form.vue +9 -9
- package/{bin → core}/com/nav/tpl/home_pc/page_list.vue +231 -231
- package/{bin → core}/com/nav/tpl/home_pc/page_nav.vue +221 -221
- package/{bin/com/nav/tpl/home_phone → core/com/nav/tpl/home_pc}/page_type.vue +231 -231
- package/{bin → core}/com/nav/tpl/home_pc/page_view.vue +8 -8
- package/{bin/com/nav/tpl/home_pc → core/com/nav/tpl/home_phone}/page_channel.vue +231 -231
- package/{bin/com/nav/tpl/home_pc → core/com/nav/tpl/home_phone}/page_default.vue +231 -231
- package/{bin → core}/com/nav/tpl/home_phone/page_form.vue +9 -9
- package/{bin → core}/com/nav/tpl/home_phone/page_list.vue +231 -231
- package/{bin/com/nav/tpl/admin_pc → core/com/nav/tpl/home_phone}/page_nav.vue +236 -220
- package/{bin/com/nav/tpl/home_pc → core/com/nav/tpl/home_phone}/page_type.vue +231 -231
- package/{bin → core}/com/nav/tpl/home_phone/page_view.vue +8 -8
- package/core/com/nav/viewmodel.js +296 -0
- package/{bin → core}/com/param/config.tpl.json +24 -0
- package/{bin → core}/com/param/drive.js +47 -15
- package/core/com/plugin/com.json +4 -0
- package/core/com/plugin/config.tpl.json +20 -0
- package/{bin → core}/com/plugin/drive.js +5 -8
- package/{bin → core}/com/plugin/index.js +11 -56
- package/core/com/socket/README.md +47 -0
- package/core/com/socket/com.json +4 -0
- package/core/com/socket/config.tpl.json +14 -0
- package/{bin → core}/com/socket/drive.js +74 -51
- package/{bin → core}/com/socket/index.js +4 -2
- package/{bin → core}/com/socket/script.js +8 -6
- package/core/com/sql/config.tpl.json +70 -0
- package/{bin → core}/com/sql/drive.js +281 -58
- package/core/com/static/com.json +4 -0
- package/core/com/static/config.tpl.json +20 -0
- package/{bin → core}/com/static/drive.js +6 -4
- package/{bin → core}/com/static/index.js +5 -1
- package/core/com/task/com.json +4 -0
- package/core/com/task/config.tpl.json +24 -0
- package/core/com/task/drive.js +374 -0
- package/{bin → core}/com/task/index.js +14 -20
- package/core/com/task/script.js +37 -0
- package/core/com/timer/com.js +217 -0
- package/core/com/timer/com.json +4 -0
- package/core/com/tpl/com.js +19 -0
- package/core/com/tpl/com.json +4 -0
- package/index.js +161 -740
- package/lib/actions.js +50 -0
- package/lib/app.js +73 -0
- package/lib/base.js +355 -0
- package/lib/com.js +31 -0
- package/lib/game.js +31 -0
- package/lib/ref.js +121 -0
- package/middleware/cors/index.js +57 -0
- package/middleware/cors/middleware.json +7 -0
- package/middleware/mqtt_base/index.js +10 -0
- package/middleware/mqtt_base/middleware.json +8 -0
- package/{waf.js → middleware/waf/index.js} +12 -2
- package/middleware/waf/middleware.json +9 -0
- package/middleware/web_base/index.js +67 -0
- package/middleware/web_base/middleware.json +9 -0
- package/middleware/web_event/index.js +411 -0
- package/middleware/web_event/middleware.json +10 -0
- package/middleware/web_proxy/index.js +24 -0
- package/middleware/web_proxy/middleware.json +9 -0
- package/middleware/web_router/index.js +33 -0
- package/middleware/web_router/middleware.json +10 -0
- package/middleware/web_socket/index.js +21 -0
- package/middleware/web_socket/middleware.json +9 -0
- package/middleware/web_static/index.js +26 -0
- package/middleware/web_static/middleware.json +9 -0
- package/nodemon.json +12 -2
- package/package.json +56 -66
- package/.gitattributes +0 -5
- package/bin/com/README.md +0 -2
- package/bin/com/api/script.js +0 -14
- package/bin/com/cmd/README.md +0 -3
- package/bin/com/cmd/config.tpl.json +0 -41
- package/bin/com/cmd/drive.js +0 -512
- package/bin/com/cmd/index.js +0 -213
- package/bin/com/cmd/old/5w2h.js +0 -54
- package/bin/com/cmd/old/drive.js +0 -423
- package/bin/com/cmd/script.js +0 -11
- package/bin/com/event/drive.js +0 -69
- package/bin/com/event/script.js +0 -12
- package/bin/com/nav/tpl/admin_pc/page_channel.vue +0 -234
- package/bin/com/nav/tpl/admin_pc/page_default.vue +0 -236
- package/bin/com/nav/tpl/admin_pc/page_form.vue +0 -152
- package/bin/com/nav/tpl/admin_pc/page_table.vue +0 -236
- package/bin/com/nav/tpl/admin_pc/page_type.vue +0 -234
- package/bin/com/nav/tpl/home_phone/page_nav.vue +0 -221
- package/bin/com/nav/viewmodel.js +0 -161
- package/bin/com/plugin/config.tpl.json +0 -11
- package/bin/com/socket/config.tpl.json +0 -8
- package/bin/com/sql/config.tpl.json +0 -34
- package/bin/com/static/config.tpl.json +0 -11
- package/bin/com/task/config.tpl.json +0 -13
- package/bin/com/task/drive.js +0 -288
- package/bin/com/task/script.js +0 -38
- package/bin/com.js +0 -74
- package/bin/mm.conf +0 -48
- package/bin/static/404.html +0 -52
- package/bin/static/README.md +0 -1
- package/bin/static/css/font-awesome.min.css +0 -7
- package/bin/static/css/mm_base.css +0 -220
- package/bin/static/css/mm_common.css +0 -518
- package/bin/static/css/mm_component.css +0 -307
- package/bin/static/css/mm_expand.css +0 -634
- package/bin/static/css/mm_theme.css +0 -291
- package/bin/static/css/new_file.css +0 -79
- package/bin/static/css/swiper.min.css +0 -12
- package/bin/static/favicon.ico +0 -0
- package/bin/static/font/FontAwesome.otf +0 -0
- package/bin/static/font/HelveticaNeue.eot +0 -0
- package/bin/static/font/HelveticaNeue.otf +0 -0
- package/bin/static/font/HelveticaNeue.svg +0 -1273
- package/bin/static/font/HelveticaNeue.woff +0 -0
- package/bin/static/font/HelveticaNeue.woff2 +0 -0
- package/bin/static/font/fontawesome-webfont.eot +0 -0
- package/bin/static/font/fontawesome-webfont.svg +0 -2671
- package/bin/static/font/fontawesome-webfont.ttf +0 -0
- package/bin/static/font/fontawesome-webfont.woff +0 -0
- package/bin/static/font/fontawesome-webfont.woff2 +0 -0
- package/bin/static/h5.html +0 -325
- package/bin/static/highlight/highlight.pack.js +0 -2
- package/bin/static/highlight/styles/a11y-dark.css +0 -99
- package/bin/static/highlight/styles/a11y-light.css +0 -99
- package/bin/static/highlight/styles/agate.css +0 -108
- package/bin/static/highlight/styles/an-old-hope.css +0 -89
- package/bin/static/highlight/styles/androidstudio.css +0 -66
- package/bin/static/highlight/styles/arduino-light.css +0 -88
- package/bin/static/highlight/styles/arta.css +0 -73
- package/bin/static/highlight/styles/ascetic.css +0 -45
- package/bin/static/highlight/styles/atelier-cave-dark.css +0 -83
- package/bin/static/highlight/styles/atelier-cave-light.css +0 -85
- package/bin/static/highlight/styles/atelier-dune-dark.css +0 -69
- package/bin/static/highlight/styles/atelier-dune-light.css +0 -69
- package/bin/static/highlight/styles/atelier-estuary-dark.css +0 -84
- package/bin/static/highlight/styles/atelier-estuary-light.css +0 -84
- package/bin/static/highlight/styles/atelier-forest-dark.css +0 -69
- package/bin/static/highlight/styles/atelier-forest-light.css +0 -69
- package/bin/static/highlight/styles/atelier-heath-dark.css +0 -69
- package/bin/static/highlight/styles/atelier-heath-light.css +0 -69
- package/bin/static/highlight/styles/atelier-lakeside-dark.css +0 -69
- package/bin/static/highlight/styles/atelier-lakeside-light.css +0 -69
- package/bin/static/highlight/styles/atelier-plateau-dark.css +0 -84
- package/bin/static/highlight/styles/atelier-plateau-light.css +0 -84
- package/bin/static/highlight/styles/atelier-savanna-dark.css +0 -84
- package/bin/static/highlight/styles/atelier-savanna-light.css +0 -84
- package/bin/static/highlight/styles/atelier-seaside-dark.css +0 -69
- package/bin/static/highlight/styles/atelier-seaside-light.css +0 -69
- package/bin/static/highlight/styles/atelier-sulphurpool-dark.css +0 -69
- package/bin/static/highlight/styles/atelier-sulphurpool-light.css +0 -69
- package/bin/static/highlight/styles/atom-one-dark-reasonable.css +0 -77
- package/bin/static/highlight/styles/atom-one-dark.css +0 -96
- package/bin/static/highlight/styles/atom-one-light.css +0 -96
- package/bin/static/highlight/styles/brown-paper.css +0 -64
- package/bin/static/highlight/styles/brown-papersq.png +0 -0
- package/bin/static/highlight/styles/codepen-embed.css +0 -60
- package/bin/static/highlight/styles/color-brewer.css +0 -71
- package/bin/static/highlight/styles/darcula.css +0 -77
- package/bin/static/highlight/styles/dark.css +0 -63
- package/bin/static/highlight/styles/darkula.css +0 -6
- package/bin/static/highlight/styles/default.css +0 -99
- package/bin/static/highlight/styles/docco.css +0 -97
- package/bin/static/highlight/styles/dracula.css +0 -76
- package/bin/static/highlight/styles/far.css +0 -71
- package/bin/static/highlight/styles/foundation.css +0 -88
- package/bin/static/highlight/styles/github-gist.css +0 -79
- package/bin/static/highlight/styles/github.css +0 -99
- package/bin/static/highlight/styles/gml.css +0 -78
- package/bin/static/highlight/styles/googlecode.css +0 -89
- package/bin/static/highlight/styles/grayscale.css +0 -101
- package/bin/static/highlight/styles/gruvbox-dark.css +0 -108
- package/bin/static/highlight/styles/gruvbox-light.css +0 -108
- package/bin/static/highlight/styles/hopscotch.css +0 -83
- package/bin/static/highlight/styles/hybrid.css +0 -102
- package/bin/static/highlight/styles/idea.css +0 -97
- package/bin/static/highlight/styles/ir-black.css +0 -73
- package/bin/static/highlight/styles/isbl-editor-dark.css +0 -112
- package/bin/static/highlight/styles/isbl-editor-light.css +0 -112
- package/bin/static/highlight/styles/kimbie.dark.css +0 -74
- package/bin/static/highlight/styles/kimbie.light.css +0 -74
- package/bin/static/highlight/styles/lightfair.css +0 -87
- package/bin/static/highlight/styles/magula.css +0 -70
- package/bin/static/highlight/styles/mono-blue.css +0 -59
- package/bin/static/highlight/styles/monokai-sublime.css +0 -83
- package/bin/static/highlight/styles/monokai.css +0 -70
- package/bin/static/highlight/styles/nord.css +0 -309
- package/bin/static/highlight/styles/obsidian.css +0 -88
- package/bin/static/highlight/styles/ocean.css +0 -74
- package/bin/static/highlight/styles/paraiso-dark.css +0 -72
- package/bin/static/highlight/styles/paraiso-light.css +0 -72
- package/bin/static/highlight/styles/pojoaque.css +0 -83
- package/bin/static/highlight/styles/pojoaque.jpg +0 -0
- package/bin/static/highlight/styles/purebasic.css +0 -96
- package/bin/static/highlight/styles/qtcreator_dark.css +0 -83
- package/bin/static/highlight/styles/qtcreator_light.css +0 -83
- package/bin/static/highlight/styles/railscasts.css +0 -106
- package/bin/static/highlight/styles/rainbow.css +0 -85
- package/bin/static/highlight/styles/routeros.css +0 -108
- package/bin/static/highlight/styles/school-book.css +0 -69
- package/bin/static/highlight/styles/school-book.png +0 -0
- package/bin/static/highlight/styles/shades-of-purple.css +0 -97
- package/bin/static/highlight/styles/solarized-dark.css +0 -84
- package/bin/static/highlight/styles/solarized-light.css +0 -84
- package/bin/static/highlight/styles/sunburst.css +0 -102
- package/bin/static/highlight/styles/tomorrow-night-blue.css +0 -75
- package/bin/static/highlight/styles/tomorrow-night-bright.css +0 -74
- package/bin/static/highlight/styles/tomorrow-night-eighties.css +0 -74
- package/bin/static/highlight/styles/tomorrow-night.css +0 -75
- package/bin/static/highlight/styles/tomorrow.css +0 -72
- package/bin/static/highlight/styles/vs.css +0 -68
- package/bin/static/highlight/styles/vs2015.css +0 -115
- package/bin/static/highlight/styles/xcode.css +0 -104
- package/bin/static/highlight/styles/xt256.css +0 -92
- package/bin/static/highlight/styles/zenburn.css +0 -80
- package/bin/static/highlight/vue-highlight.js +0 -29
- package/bin/static/ifame.html +0 -24
- package/bin/static/img/add.png +0 -0
- package/bin/static/img/avatar.png +0 -0
- package/bin/static/img/banner_2.png +0 -0
- package/bin/static/img/default.png +0 -0
- package/bin/static/img/loading.svg +0 -1
- package/bin/static/img/logo.png +0 -0
- package/bin/static/img/logo1.png +0 -0
- package/bin/static/img/logo_gray.png +0 -0
- package/bin/static/img/logo_round.png +0 -0
- package/bin/static/img/mm.ico +0 -0
- package/bin/static/img/mm.jpg +0 -0
- package/bin/static/img/select.png +0 -0
- package/bin/static/img/web.png +0 -0
- package/bin/static/index.html +0 -12
- package/bin/static/js/clipboard.min.js +0 -257
- package/bin/static/js/css.min.js +0 -1
- package/bin/static/js/echarts.js +0 -22
- package/bin/static/js/html5.min.js +0 -1
- package/bin/static/js/jquery.lazyload.min.js +0 -2
- package/bin/static/js/jquery.min.js +0 -4189
- package/bin/static/js/jquery.scrollstop.min.js +0 -2
- package/bin/static/js/mm-requirejs-vue.js +0 -283
- package/bin/static/js/mm_check.js +0 -490
- package/bin/static/js/mm_flexble.js +0 -112
- package/bin/static/js/mm_picker.js +0 -1417
- package/bin/static/js/mm_pinyinlite.js +0 -873
- package/bin/static/js/mm_sdk.js +0 -2841
- package/bin/static/js/mm_ui_expand.js +0 -468
- package/bin/static/js/mm_vue.js +0 -376
- package/bin/static/js/mm_vue_ui.js +0 -2375
- package/bin/static/js/mm_websocket.js +0 -145
- package/bin/static/js/require.js +0 -5
- package/bin/static/js/sortable.min.js +0 -3
- package/bin/static/js/swiper.min.js +0 -13
- package/bin/static/js/text.min.js +0 -1
- package/bin/static/js/vue-router.min.js +0 -6
- package/bin/static/js/vue.js +0 -12338
- package/bin/static/js/vuedraggable.min.js +0 -2
- package/bin/static/js/vuex.min.js +0 -6
- package/bin/static/src/components/bar/mm_action.vue +0 -19
- package/bin/static/src/components/bar/mm_buy.vue +0 -19
- package/bin/static/src/components/bar/mm_chat.vue +0 -18
- package/bin/static/src/components/bar/mm_count.vue +0 -18
- package/bin/static/src/components/bar/mm_filter.vue +0 -18
- package/bin/static/src/components/bar/mm_search.vue +0 -18
- package/bin/static/src/components/bar/mm_sort.vue +0 -18
- package/bin/static/src/components/bar/mm_tag.vue +0 -18
- package/bin/static/src/components/bar/mm_title.vue +0 -19
- package/bin/static/src/components/content/mm_pre.vue +0 -70
- package/bin/static/src/components/expand/mm_drag.vue +0 -39
- package/bin/static/src/components/item/mm_article.vue +0 -115
- package/bin/static/src/components/item/mm_base.vue +0 -26
- package/bin/static/src/components/item/mm_contact.vue +0 -25
- package/bin/static/src/components/item/mm_goods.vue +0 -23
- package/bin/static/src/components/item/mm_img.vue +0 -21
- package/bin/static/src/components/item/mm_media.vue +0 -18
- package/bin/static/src/components/item/mm_message.vue +0 -18
- package/bin/static/src/components/item/mm_music.vue +0 -95
- package/bin/static/src/components/item/mm_news.vue +0 -22
- package/bin/static/src/components/item/mm_number.vue +0 -26
- package/bin/static/src/components/item/mm_question.vue +0 -35
- package/bin/static/src/components/item/mm_user.vue +0 -22
- package/bin/static/src/components/item/mm_video.vue +0 -95
- package/bin/static/src/components/slide/mm_slide_card.vue +0 -64
- package/bin/static/src/components/slide/mm_slide_img.vue +0 -47
- package/bin/static/src/components/slide/mm_slide_page.vue +0 -8
- package/bin/static/src/components/slide/mm_slide_text.vue +0 -54
- package/bin/static/src/main.js +0 -84
- package/bin/static/src/mixins/form.js +0 -223
- package/bin/static/src/mixins/item.js +0 -242
- package/bin/static/src/mixins/list.js +0 -244
- package/bin/static/src/mixins/page.js +0 -1011
- package/bin/static/src/mm_component.js +0 -74
- package/bin/static/src/router.js +0 -72
- package/bin/static/src/store/user.js +0 -75
- package/bin/static/src/store/web.js +0 -50
- package/bin/static/user/1/number_info.xlsx +0 -0
- package/bin/static/w3c.html +0 -94
- package/init.js +0 -55
- package/update.md +0 -1
- /package/{bin → core}/com/api/README.md +0 -0
- /package/{bin → core}/com/api/rpc.js +0 -0
- /package/{bin → core}/com/db/README.md +0 -0
- /package/{bin → core}/com/event/README.md +0 -0
- /package/{bin/com/socket → core/com/mqtt}/README.md +0 -0
- /package/{bin → core}/com/nav/README.md +0 -0
- /package/{bin → core}/com/nav/config.tpl.json +0 -0
- /package/{bin → core}/com/param/README.md +0 -0
- /package/{bin → core}/com/param/index.js +0 -0
- /package/{bin → core}/com/param/script.js +0 -0
- /package/{bin → core}/com/param/test.js +0 -0
- /package/{bin → core}/com/plugin/README.md +0 -0
- /package/{bin → core}/com/plugin/script.js +0 -0
- /package/{bin → core}/com/sql/README.md +0 -0
- /package/{bin → core}/com/sql/index.js +0 -0
- /package/{bin → core}/com/sql/script.js +0 -0
- /package/{bin → core}/com/static/README.md +0 -0
- /package/{bin → core}/com/static/script.js +0 -0
- /package/{bin → core}/com/task/README.md +0 -0
- /package/{bin/rps.bat → rps.bat} +0 -0
- /package/{bin/tps.bat → tps.bat} +0 -0
package/bin/static/js/mm_sdk.js
DELETED
|
@@ -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();
|