From 73fc37e47205ff1805d24179e1ddcb6e22f27fb2 Mon Sep 17 00:00:00 2001 From: Saturneric Date: Tue, 1 Sep 2020 00:55:41 +0800 Subject: [PATCH] Add. --- .eslintignore | 2 + .eslintrc.js | 99 + .gitignore | 11 + LICENSE | 21 + README.md | 28 + cloudfunctions/getServerDataDemo/index.js | 13 + cloudfunctions/getServerDataDemo/package.json | 14 + cloudfunctions/getTempFileURL/index.js | 14 + cloudfunctions/getTempFileURL/package.json | 14 + cloudfunctions/openapi/config.json | 13 + cloudfunctions/openapi/index.js | 65 + cloudfunctions/openapi/package.json | 14 + cloudfunctions/wxContext/index.js | 15 + cloudfunctions/wxContext/package.json | 14 + git.codesdream.com.txt | 0 miniprogram/app.js | 87 + miniprogram/app.json | 59 + miniprogram/app.wxss | 33 + miniprogram/config.js | 16 + miniprogram/dist/action-sheet/index.js | 47 + miniprogram/dist/action-sheet/index.json | 8 + miniprogram/dist/action-sheet/index.wxml | 23 + miniprogram/dist/action-sheet/index.wxss | 1 + miniprogram/dist/alert/index.js | 37 + miniprogram/dist/alert/index.json | 7 + miniprogram/dist/alert/index.wxml | 15 + miniprogram/dist/alert/index.wxss | 1 + miniprogram/dist/avatar/index.js | 20 + miniprogram/dist/avatar/index.json | 3 + miniprogram/dist/avatar/index.wxml | 4 + miniprogram/dist/avatar/index.wxss | 1 + miniprogram/dist/badge/index.js | 29 + miniprogram/dist/badge/index.json | 3 + miniprogram/dist/badge/index.wxml | 5 + miniprogram/dist/badge/index.wxss | 1 + miniprogram/dist/base/index.js | 37 + miniprogram/dist/button/index.js | 80 + miniprogram/dist/button/index.json | 3 + miniprogram/dist/button/index.wxml | 20 + miniprogram/dist/button/index.wxss | 1 + miniprogram/dist/card/index.js | 26 + miniprogram/dist/card/index.json | 3 + miniprogram/dist/card/index.wxml | 11 + miniprogram/dist/card/index.wxss | 1 + miniprogram/dist/cell-group/index.js | 33 + miniprogram/dist/cell-group/index.json | 3 + miniprogram/dist/cell-group/index.wxml | 3 + miniprogram/dist/cell/index.js | 86 + miniprogram/dist/cell/index.json | 3 + miniprogram/dist/cell/index.wxml | 16 + miniprogram/dist/cell/index.wxss | 1 + miniprogram/dist/checkbox-group/index.js | 38 + miniprogram/dist/checkbox-group/index.json | 7 + miniprogram/dist/checkbox-group/index.wxml | 3 + miniprogram/dist/checkbox-group/index.wxss | 0 miniprogram/dist/checkbox/index.js | 56 + miniprogram/dist/checkbox/index.json | 7 + miniprogram/dist/checkbox/index.wxml | 8 + miniprogram/dist/checkbox/index.wxss | 1 + miniprogram/dist/circle-progress/index.js | 47 + miniprogram/dist/circle-progress/index.json | 4 + miniprogram/dist/circle-progress/index.wxml | 11 + miniprogram/dist/circle-progress/index.wxss | 32 + miniprogram/dist/col/index.js | 20 + miniprogram/dist/col/index.json | 3 + miniprogram/dist/col/index.wxml | 1 + miniprogram/dist/col/index.wxss | 1 + miniprogram/dist/collapse-item/index.js | 46 + miniprogram/dist/collapse-item/index.json | 7 + miniprogram/dist/collapse-item/index.wxml | 9 + miniprogram/dist/collapse-item/index.wxss | 1 + miniprogram/dist/collapse/index.js | 31 + miniprogram/dist/collapse/index.json | 3 + miniprogram/dist/collapse/index.wxml | 4 + miniprogram/dist/collapse/index.wxss | 0 miniprogram/dist/count-down/index.js | 90 + miniprogram/dist/count-down/index.json | 4 + miniprogram/dist/count-down/index.wxml | 4 + miniprogram/dist/count-down/index.wxss | 0 miniprogram/dist/divider/index.js | 25 + miniprogram/dist/divider/index.json | 3 + miniprogram/dist/divider/index.wxml | 19 + miniprogram/dist/divider/index.wxss | 1 + miniprogram/dist/drawer/index.js | 33 + miniprogram/dist/drawer/index.json | 3 + miniprogram/dist/drawer/index.wxml | 6 + miniprogram/dist/drawer/index.wxss | 1 + miniprogram/dist/grid-icon/index.js | 10 + miniprogram/dist/grid-icon/index.json | 3 + miniprogram/dist/grid-icon/index.wxml | 1 + miniprogram/dist/grid-icon/index.wxss | 1 + miniprogram/dist/grid-item/index.js | 16 + miniprogram/dist/grid-item/index.json | 3 + miniprogram/dist/grid-item/index.wxml | 1 + miniprogram/dist/grid-item/index.wxss | 1 + miniprogram/dist/grid-label/index.js | 10 + miniprogram/dist/grid-label/index.json | 3 + miniprogram/dist/grid-label/index.wxml | 1 + miniprogram/dist/grid-label/index.wxss | 1 + miniprogram/dist/grid/index.js | 50 + miniprogram/dist/grid/index.json | 3 + miniprogram/dist/grid/index.wxml | 1 + miniprogram/dist/grid/index.wxss | 1 + miniprogram/dist/icon/index.js | 22 + miniprogram/dist/icon/index.json | 3 + miniprogram/dist/icon/index.wxml | 1 + miniprogram/dist/icon/index.wxss | 1 + miniprogram/dist/index-item/index.js | 32 + miniprogram/dist/index-item/index.json | 3 + miniprogram/dist/index-item/index.wxml | 11 + miniprogram/dist/index-item/index.wxss | 1 + miniprogram/dist/index/index.js | 158 + miniprogram/dist/index/index.json | 3 + miniprogram/dist/index/index.wxml | 38 + miniprogram/dist/index/index.wxss | 1 + miniprogram/dist/input-number/index.js | 101 + miniprogram/dist/input-number/index.json | 3 + miniprogram/dist/input-number/index.wxml | 5 + miniprogram/dist/input-number/index.wxss | 1 + miniprogram/dist/input/index.js | 61 + miniprogram/dist/input/index.json | 3 + miniprogram/dist/input/index.wxml | 31 + miniprogram/dist/input/index.wxss | 1 + miniprogram/dist/load-more/index.js | 14 + miniprogram/dist/load-more/index.json | 3 + miniprogram/dist/load-more/index.wxml | 8 + miniprogram/dist/load-more/index.wxss | 1 + miniprogram/dist/message/index.js | 45 + miniprogram/dist/message/index.json | 3 + miniprogram/dist/message/index.wxml | 3 + miniprogram/dist/message/index.wxss | 1 + miniprogram/dist/modal/index.js | 54 + miniprogram/dist/modal/index.json | 9 + miniprogram/dist/modal/index.wxml | 40 + miniprogram/dist/modal/index.wxss | 1 + miniprogram/dist/notice-bar/index.js | 112 + miniprogram/dist/notice-bar/index.json | 7 + miniprogram/dist/notice-bar/index.wxml | 9 + miniprogram/dist/notice-bar/index.wxss | 1 + miniprogram/dist/page/index.js | 42 + miniprogram/dist/page/index.json | 7 + miniprogram/dist/page/index.wxml | 14 + miniprogram/dist/page/index.wxss | 1 + miniprogram/dist/panel/index.js | 19 + miniprogram/dist/panel/index.json | 3 + miniprogram/dist/panel/index.wxml | 4 + miniprogram/dist/panel/index.wxss | 1 + miniprogram/dist/progress/index.js | 23 + miniprogram/dist/progress/index.json | 3 + miniprogram/dist/progress/index.wxml | 10 + miniprogram/dist/progress/index.wxss | 1 + miniprogram/dist/radio-group/index.js | 38 + miniprogram/dist/radio-group/index.json | 7 + miniprogram/dist/radio-group/index.wxml | 3 + miniprogram/dist/radio-group/index.wxss | 0 miniprogram/dist/radio/index.js | 56 + miniprogram/dist/radio/index.json | 7 + miniprogram/dist/radio/index.wxml | 8 + miniprogram/dist/radio/index.wxss | 1 + miniprogram/dist/rate/index.js | 69 + miniprogram/dist/rate/index.json | 6 + miniprogram/dist/rate/index.wxml | 23 + miniprogram/dist/rate/index.wxss | 1 + miniprogram/dist/row/index.js | 9 + miniprogram/dist/row/index.json | 3 + miniprogram/dist/row/index.wxml | 1 + miniprogram/dist/row/index.wxss | 1 + miniprogram/dist/slide/index.js | 15 + miniprogram/dist/slide/index.json | 8 + miniprogram/dist/slide/index.wxml | 4 + miniprogram/dist/slide/index.wxss | 0 miniprogram/dist/spin/index.js | 23 + miniprogram/dist/spin/index.json | 3 + miniprogram/dist/spin/index.wxml | 6 + miniprogram/dist/spin/index.wxss | 1 + miniprogram/dist/step/index.js | 52 + miniprogram/dist/step/index.json | 7 + miniprogram/dist/step/index.wxml | 70 + miniprogram/dist/step/index.wxss | 1 + miniprogram/dist/steps/index.js | 50 + miniprogram/dist/steps/index.json | 3 + miniprogram/dist/steps/index.wxml | 3 + miniprogram/dist/steps/index.wxss | 1 + miniprogram/dist/sticky-item/index.js | 40 + miniprogram/dist/sticky-item/index.json | 3 + miniprogram/dist/sticky-item/index.wxml | 10 + miniprogram/dist/sticky-item/index.wxss | 1 + miniprogram/dist/sticky/index.js | 63 + miniprogram/dist/sticky/index.json | 3 + miniprogram/dist/sticky/index.wxml | 3 + miniprogram/dist/sticky/index.wxss | 0 miniprogram/dist/swipeout/index.js | 161 + miniprogram/dist/swipeout/index.json | 7 + miniprogram/dist/swipeout/index.wxml | 38 + miniprogram/dist/swipeout/index.wxss | 1 + miniprogram/dist/switch/index.js | 38 + miniprogram/dist/switch/index.json | 3 + miniprogram/dist/switch/index.wxml | 26 + miniprogram/dist/switch/index.wxss | 1 + miniprogram/dist/tab-bar-item/index.js | 62 + miniprogram/dist/tab-bar-item/index.json | 8 + miniprogram/dist/tab-bar-item/index.wxml | 10 + miniprogram/dist/tab-bar-item/index.wxss | 1 + miniprogram/dist/tab-bar/index.js | 66 + miniprogram/dist/tab-bar/index.json | 3 + miniprogram/dist/tab-bar/index.wxml | 6 + miniprogram/dist/tab-bar/index.wxss | 1 + miniprogram/dist/tab/index.js | 50 + miniprogram/dist/tab/index.json | 7 + miniprogram/dist/tab/index.wxml | 9 + miniprogram/dist/tab/index.wxss | 1 + miniprogram/dist/tabs/index.js | 56 + miniprogram/dist/tabs/index.json | 3 + miniprogram/dist/tabs/index.wxml | 2 + miniprogram/dist/tabs/index.wxss | 1 + miniprogram/dist/tag/index.js | 42 + miniprogram/dist/tag/index.json | 3 + miniprogram/dist/tag/index.wxml | 27 + miniprogram/dist/tag/index.wxss | 1 + miniprogram/dist/toast/index.js | 48 + miniprogram/dist/toast/index.json | 7 + miniprogram/dist/toast/index.wxml | 16 + miniprogram/dist/toast/index.wxss | 1 + miniprogram/images/001-2.png | Bin 0 -> 4311 bytes miniprogram/images/001.png | Bin 0 -> 4225 bytes miniprogram/images/002-2.png | Bin 0 -> 2610 bytes miniprogram/images/002.png | Bin 0 -> 2579 bytes miniprogram/images/003-2.png | Bin 0 -> 6439 bytes miniprogram/images/003.png | Bin 0 -> 6273 bytes miniprogram/images/004-1.png | Bin 0 -> 1024 bytes miniprogram/images/004-2.png | Bin 0 -> 1035 bytes miniprogram/images/bt.png | Bin 0 -> 30405 bytes miniprogram/images/bt0-1.png | Bin 0 -> 28223 bytes miniprogram/images/bt0.png | Bin 0 -> 25691 bytes miniprogram/images/bt2.png | Bin 0 -> 30212 bytes miniprogram/images/team-bak.png | Bin 0 -> 5287 bytes miniprogram/images/user-unlogin.png | Bin 0 -> 4631 bytes miniprogram/pages/alloc/alloc.js | 239 + miniprogram/pages/alloc/alloc.json | 19 + miniprogram/pages/alloc/alloc.wxml | 76 + miniprogram/pages/alloc/alloc.wxss | 155 + .../pages/databaseTest/databaseTest.js | 191 + .../pages/databaseTest/databaseTest.json | 11 + .../pages/databaseTest/databaseTest.wxml | 19 + .../pages/databaseTest/databaseTest.wxss | 101 + miniprogram/pages/index/index.js | 605 ++ miniprogram/pages/index/index.json | 22 + miniprogram/pages/index/index.wxml | 356 ++ miniprogram/pages/index/index.wxss | 244 + miniprogram/pages/information/about/about.js | 72 + .../pages/information/about/about.json | 11 + .../pages/information/about/about.wxml | 29 + .../pages/information/about/about.wxss | 54 + miniprogram/pages/information/graph/graph.js | 245 + .../pages/information/graph/graph.json | 7 + .../pages/information/graph/graph.wxml | 18 + .../pages/information/graph/graph.wxss | 32 + miniprogram/pages/information/help/help.js | 66 + miniprogram/pages/information/help/help.json | 7 + miniprogram/pages/information/help/help.wxml | 9 + miniprogram/pages/information/help/help.wxss | 1 + miniprogram/pages/information/information.js | 87 + .../pages/information/information.json | 25 + .../pages/information/information.wxml | 48 + .../pages/information/information.wxss | 93 + .../pages/information/setting/setting.js | 136 + .../pages/information/setting/setting.json | 20 + .../pages/information/setting/setting.wxml | 82 + .../pages/information/setting/setting.wxss | 91 + .../pages/information/submit/submit.js | 155 + .../pages/information/submit/submit.json | 12 + .../pages/information/submit/submit.wxml | 15 + .../pages/information/submit/submit.wxss | 12 + miniprogram/pages/init/down.png | Bin 0 -> 3850 bytes miniprogram/pages/init/init.js | 94 + miniprogram/pages/init/init.json | 18 + miniprogram/pages/init/init.wxml | 22 + miniprogram/pages/init/init.wxss | 27 + .../pages/list/createPlan/createPlan.js | 310 + .../pages/list/createPlan/createPlan.json | 16 + .../pages/list/createPlan/createPlan.wxml | 31 + .../pages/list/createPlan/createPlan.wxss | 114 + .../pages/list/createTask/createTask.js | 340 + .../pages/list/createTask/createTask.json | 15 + .../pages/list/createTask/createTask.wxml | 36 + .../pages/list/createTask/createTask.wxss | 117 + miniprogram/pages/list/list.js | 355 ++ miniprogram/pages/list/list.json | 21 + miniprogram/pages/list/list.wxml | 88 + miniprogram/pages/list/list.wxss | 140 + miniprogram/pages/list/plan/plan.js | 344 + miniprogram/pages/list/plan/plan.json | 20 + miniprogram/pages/list/plan/plan.wxml | 82 + miniprogram/pages/list/plan/plan.wxss | 188 + miniprogram/pages/list/task/task.js | 362 ++ miniprogram/pages/list/task/task.json | 20 + miniprogram/pages/list/task/task.wxml | 85 + miniprogram/pages/list/task/task.wxss | 188 + miniprogram/sitemap.json | 7 + miniprogram/utils/auth.js | 22 + miniprogram/utils/authCOMP.js | 23 + miniprogram/utils/authDELETE.js | 23 + miniprogram/utils/authGET.js | 63 + miniprogram/utils/authPATCH.js | 23 + miniprogram/utils/authPOST.js | 23 + miniprogram/utils/authRESULT.js | 64 + miniprogram/utils/authTIME.js | 45 + miniprogram/utils/sha1.js | 371 ++ miniprogram/utils/sha256.js | 250 + miniprogram/utils/ucharts/u-charts.js | 5658 +++++++++++++++++ miniprogram/utils/util.js | 42 + miniprogram/vendor/wafer2-client-sdk/LICENSE | 24 + .../vendor/wafer2-client-sdk/README.md | 247 + miniprogram/vendor/wafer2-client-sdk/index.js | 26 + .../vendor/wafer2-client-sdk/lib/constants.js | 20 + .../vendor/wafer2-client-sdk/lib/login.js | 167 + .../vendor/wafer2-client-sdk/lib/request.js | 119 + .../vendor/wafer2-client-sdk/lib/session.js | 18 + .../vendor/wafer2-client-sdk/lib/tunnel.js | 528 ++ .../vendor/wafer2-client-sdk/lib/utils.js | 18 + .../vendor/wafer2-client-sdk/lib/wxTunnel.js | 32 + .../vendor/wafer2-client-sdk/package.json | 47 + package.json | 26 + project.config.json | 35 + 324 files changed, 18246 insertions(+) create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 cloudfunctions/getServerDataDemo/index.js create mode 100644 cloudfunctions/getServerDataDemo/package.json create mode 100644 cloudfunctions/getTempFileURL/index.js create mode 100644 cloudfunctions/getTempFileURL/package.json create mode 100644 cloudfunctions/openapi/config.json create mode 100644 cloudfunctions/openapi/index.js create mode 100644 cloudfunctions/openapi/package.json create mode 100644 cloudfunctions/wxContext/index.js create mode 100644 cloudfunctions/wxContext/package.json create mode 100644 git.codesdream.com.txt create mode 100644 miniprogram/app.js create mode 100644 miniprogram/app.json create mode 100644 miniprogram/app.wxss create mode 100644 miniprogram/config.js create mode 100644 miniprogram/dist/action-sheet/index.js create mode 100644 miniprogram/dist/action-sheet/index.json create mode 100644 miniprogram/dist/action-sheet/index.wxml create mode 100644 miniprogram/dist/action-sheet/index.wxss create mode 100644 miniprogram/dist/alert/index.js create mode 100644 miniprogram/dist/alert/index.json create mode 100644 miniprogram/dist/alert/index.wxml create mode 100644 miniprogram/dist/alert/index.wxss create mode 100644 miniprogram/dist/avatar/index.js create mode 100644 miniprogram/dist/avatar/index.json create mode 100644 miniprogram/dist/avatar/index.wxml create mode 100644 miniprogram/dist/avatar/index.wxss create mode 100644 miniprogram/dist/badge/index.js create mode 100644 miniprogram/dist/badge/index.json create mode 100644 miniprogram/dist/badge/index.wxml create mode 100644 miniprogram/dist/badge/index.wxss create mode 100644 miniprogram/dist/base/index.js create mode 100644 miniprogram/dist/button/index.js create mode 100644 miniprogram/dist/button/index.json create mode 100644 miniprogram/dist/button/index.wxml create mode 100644 miniprogram/dist/button/index.wxss create mode 100644 miniprogram/dist/card/index.js create mode 100644 miniprogram/dist/card/index.json create mode 100644 miniprogram/dist/card/index.wxml create mode 100644 miniprogram/dist/card/index.wxss create mode 100644 miniprogram/dist/cell-group/index.js create mode 100644 miniprogram/dist/cell-group/index.json create mode 100644 miniprogram/dist/cell-group/index.wxml create mode 100644 miniprogram/dist/cell/index.js create mode 100644 miniprogram/dist/cell/index.json create mode 100644 miniprogram/dist/cell/index.wxml create mode 100644 miniprogram/dist/cell/index.wxss create mode 100644 miniprogram/dist/checkbox-group/index.js create mode 100644 miniprogram/dist/checkbox-group/index.json create mode 100644 miniprogram/dist/checkbox-group/index.wxml create mode 100644 miniprogram/dist/checkbox-group/index.wxss create mode 100644 miniprogram/dist/checkbox/index.js create mode 100644 miniprogram/dist/checkbox/index.json create mode 100644 miniprogram/dist/checkbox/index.wxml create mode 100644 miniprogram/dist/checkbox/index.wxss create mode 100644 miniprogram/dist/circle-progress/index.js create mode 100644 miniprogram/dist/circle-progress/index.json create mode 100644 miniprogram/dist/circle-progress/index.wxml create mode 100644 miniprogram/dist/circle-progress/index.wxss create mode 100644 miniprogram/dist/col/index.js create mode 100644 miniprogram/dist/col/index.json create mode 100644 miniprogram/dist/col/index.wxml create mode 100644 miniprogram/dist/col/index.wxss create mode 100644 miniprogram/dist/collapse-item/index.js create mode 100644 miniprogram/dist/collapse-item/index.json create mode 100644 miniprogram/dist/collapse-item/index.wxml create mode 100644 miniprogram/dist/collapse-item/index.wxss create mode 100644 miniprogram/dist/collapse/index.js create mode 100644 miniprogram/dist/collapse/index.json create mode 100644 miniprogram/dist/collapse/index.wxml create mode 100644 miniprogram/dist/collapse/index.wxss create mode 100644 miniprogram/dist/count-down/index.js create mode 100644 miniprogram/dist/count-down/index.json create mode 100644 miniprogram/dist/count-down/index.wxml create mode 100644 miniprogram/dist/count-down/index.wxss create mode 100644 miniprogram/dist/divider/index.js create mode 100644 miniprogram/dist/divider/index.json create mode 100644 miniprogram/dist/divider/index.wxml create mode 100644 miniprogram/dist/divider/index.wxss create mode 100644 miniprogram/dist/drawer/index.js create mode 100644 miniprogram/dist/drawer/index.json create mode 100644 miniprogram/dist/drawer/index.wxml create mode 100644 miniprogram/dist/drawer/index.wxss create mode 100644 miniprogram/dist/grid-icon/index.js create mode 100644 miniprogram/dist/grid-icon/index.json create mode 100644 miniprogram/dist/grid-icon/index.wxml create mode 100644 miniprogram/dist/grid-icon/index.wxss create mode 100644 miniprogram/dist/grid-item/index.js create mode 100644 miniprogram/dist/grid-item/index.json create mode 100644 miniprogram/dist/grid-item/index.wxml create mode 100644 miniprogram/dist/grid-item/index.wxss create mode 100644 miniprogram/dist/grid-label/index.js create mode 100644 miniprogram/dist/grid-label/index.json create mode 100644 miniprogram/dist/grid-label/index.wxml create mode 100644 miniprogram/dist/grid-label/index.wxss create mode 100644 miniprogram/dist/grid/index.js create mode 100644 miniprogram/dist/grid/index.json create mode 100644 miniprogram/dist/grid/index.wxml create mode 100644 miniprogram/dist/grid/index.wxss create mode 100644 miniprogram/dist/icon/index.js create mode 100644 miniprogram/dist/icon/index.json create mode 100644 miniprogram/dist/icon/index.wxml create mode 100644 miniprogram/dist/icon/index.wxss create mode 100644 miniprogram/dist/index-item/index.js create mode 100644 miniprogram/dist/index-item/index.json create mode 100644 miniprogram/dist/index-item/index.wxml create mode 100644 miniprogram/dist/index-item/index.wxss create mode 100644 miniprogram/dist/index/index.js create mode 100644 miniprogram/dist/index/index.json create mode 100644 miniprogram/dist/index/index.wxml create mode 100644 miniprogram/dist/index/index.wxss create mode 100644 miniprogram/dist/input-number/index.js create mode 100644 miniprogram/dist/input-number/index.json create mode 100644 miniprogram/dist/input-number/index.wxml create mode 100644 miniprogram/dist/input-number/index.wxss create mode 100644 miniprogram/dist/input/index.js create mode 100644 miniprogram/dist/input/index.json create mode 100644 miniprogram/dist/input/index.wxml create mode 100644 miniprogram/dist/input/index.wxss create mode 100644 miniprogram/dist/load-more/index.js create mode 100644 miniprogram/dist/load-more/index.json create mode 100644 miniprogram/dist/load-more/index.wxml create mode 100644 miniprogram/dist/load-more/index.wxss create mode 100644 miniprogram/dist/message/index.js create mode 100644 miniprogram/dist/message/index.json create mode 100644 miniprogram/dist/message/index.wxml create mode 100644 miniprogram/dist/message/index.wxss create mode 100644 miniprogram/dist/modal/index.js create mode 100644 miniprogram/dist/modal/index.json create mode 100644 miniprogram/dist/modal/index.wxml create mode 100644 miniprogram/dist/modal/index.wxss create mode 100644 miniprogram/dist/notice-bar/index.js create mode 100644 miniprogram/dist/notice-bar/index.json create mode 100644 miniprogram/dist/notice-bar/index.wxml create mode 100644 miniprogram/dist/notice-bar/index.wxss create mode 100644 miniprogram/dist/page/index.js create mode 100644 miniprogram/dist/page/index.json create mode 100644 miniprogram/dist/page/index.wxml create mode 100644 miniprogram/dist/page/index.wxss create mode 100644 miniprogram/dist/panel/index.js create mode 100644 miniprogram/dist/panel/index.json create mode 100644 miniprogram/dist/panel/index.wxml create mode 100644 miniprogram/dist/panel/index.wxss create mode 100644 miniprogram/dist/progress/index.js create mode 100644 miniprogram/dist/progress/index.json create mode 100644 miniprogram/dist/progress/index.wxml create mode 100644 miniprogram/dist/progress/index.wxss create mode 100644 miniprogram/dist/radio-group/index.js create mode 100644 miniprogram/dist/radio-group/index.json create mode 100644 miniprogram/dist/radio-group/index.wxml create mode 100644 miniprogram/dist/radio-group/index.wxss create mode 100644 miniprogram/dist/radio/index.js create mode 100644 miniprogram/dist/radio/index.json create mode 100644 miniprogram/dist/radio/index.wxml create mode 100644 miniprogram/dist/radio/index.wxss create mode 100644 miniprogram/dist/rate/index.js create mode 100644 miniprogram/dist/rate/index.json create mode 100644 miniprogram/dist/rate/index.wxml create mode 100644 miniprogram/dist/rate/index.wxss create mode 100644 miniprogram/dist/row/index.js create mode 100644 miniprogram/dist/row/index.json create mode 100644 miniprogram/dist/row/index.wxml create mode 100644 miniprogram/dist/row/index.wxss create mode 100644 miniprogram/dist/slide/index.js create mode 100644 miniprogram/dist/slide/index.json create mode 100644 miniprogram/dist/slide/index.wxml create mode 100644 miniprogram/dist/slide/index.wxss create mode 100644 miniprogram/dist/spin/index.js create mode 100644 miniprogram/dist/spin/index.json create mode 100644 miniprogram/dist/spin/index.wxml create mode 100644 miniprogram/dist/spin/index.wxss create mode 100644 miniprogram/dist/step/index.js create mode 100644 miniprogram/dist/step/index.json create mode 100644 miniprogram/dist/step/index.wxml create mode 100644 miniprogram/dist/step/index.wxss create mode 100644 miniprogram/dist/steps/index.js create mode 100644 miniprogram/dist/steps/index.json create mode 100644 miniprogram/dist/steps/index.wxml create mode 100644 miniprogram/dist/steps/index.wxss create mode 100644 miniprogram/dist/sticky-item/index.js create mode 100644 miniprogram/dist/sticky-item/index.json create mode 100644 miniprogram/dist/sticky-item/index.wxml create mode 100644 miniprogram/dist/sticky-item/index.wxss create mode 100644 miniprogram/dist/sticky/index.js create mode 100644 miniprogram/dist/sticky/index.json create mode 100644 miniprogram/dist/sticky/index.wxml create mode 100644 miniprogram/dist/sticky/index.wxss create mode 100644 miniprogram/dist/swipeout/index.js create mode 100644 miniprogram/dist/swipeout/index.json create mode 100644 miniprogram/dist/swipeout/index.wxml create mode 100644 miniprogram/dist/swipeout/index.wxss create mode 100644 miniprogram/dist/switch/index.js create mode 100644 miniprogram/dist/switch/index.json create mode 100644 miniprogram/dist/switch/index.wxml create mode 100644 miniprogram/dist/switch/index.wxss create mode 100644 miniprogram/dist/tab-bar-item/index.js create mode 100644 miniprogram/dist/tab-bar-item/index.json create mode 100644 miniprogram/dist/tab-bar-item/index.wxml create mode 100644 miniprogram/dist/tab-bar-item/index.wxss create mode 100644 miniprogram/dist/tab-bar/index.js create mode 100644 miniprogram/dist/tab-bar/index.json create mode 100644 miniprogram/dist/tab-bar/index.wxml create mode 100644 miniprogram/dist/tab-bar/index.wxss create mode 100644 miniprogram/dist/tab/index.js create mode 100644 miniprogram/dist/tab/index.json create mode 100644 miniprogram/dist/tab/index.wxml create mode 100644 miniprogram/dist/tab/index.wxss create mode 100644 miniprogram/dist/tabs/index.js create mode 100644 miniprogram/dist/tabs/index.json create mode 100644 miniprogram/dist/tabs/index.wxml create mode 100644 miniprogram/dist/tabs/index.wxss create mode 100644 miniprogram/dist/tag/index.js create mode 100644 miniprogram/dist/tag/index.json create mode 100644 miniprogram/dist/tag/index.wxml create mode 100644 miniprogram/dist/tag/index.wxss create mode 100644 miniprogram/dist/toast/index.js create mode 100644 miniprogram/dist/toast/index.json create mode 100644 miniprogram/dist/toast/index.wxml create mode 100644 miniprogram/dist/toast/index.wxss create mode 100644 miniprogram/images/001-2.png create mode 100644 miniprogram/images/001.png create mode 100644 miniprogram/images/002-2.png create mode 100644 miniprogram/images/002.png create mode 100644 miniprogram/images/003-2.png create mode 100644 miniprogram/images/003.png create mode 100644 miniprogram/images/004-1.png create mode 100644 miniprogram/images/004-2.png create mode 100644 miniprogram/images/bt.png create mode 100644 miniprogram/images/bt0-1.png create mode 100644 miniprogram/images/bt0.png create mode 100644 miniprogram/images/bt2.png create mode 100644 miniprogram/images/team-bak.png create mode 100644 miniprogram/images/user-unlogin.png create mode 100644 miniprogram/pages/alloc/alloc.js create mode 100644 miniprogram/pages/alloc/alloc.json create mode 100644 miniprogram/pages/alloc/alloc.wxml create mode 100644 miniprogram/pages/alloc/alloc.wxss create mode 100644 miniprogram/pages/databaseTest/databaseTest.js create mode 100644 miniprogram/pages/databaseTest/databaseTest.json create mode 100644 miniprogram/pages/databaseTest/databaseTest.wxml create mode 100644 miniprogram/pages/databaseTest/databaseTest.wxss create mode 100644 miniprogram/pages/index/index.js create mode 100644 miniprogram/pages/index/index.json create mode 100644 miniprogram/pages/index/index.wxml create mode 100644 miniprogram/pages/index/index.wxss create mode 100644 miniprogram/pages/information/about/about.js create mode 100644 miniprogram/pages/information/about/about.json create mode 100644 miniprogram/pages/information/about/about.wxml create mode 100644 miniprogram/pages/information/about/about.wxss create mode 100644 miniprogram/pages/information/graph/graph.js create mode 100644 miniprogram/pages/information/graph/graph.json create mode 100644 miniprogram/pages/information/graph/graph.wxml create mode 100644 miniprogram/pages/information/graph/graph.wxss create mode 100644 miniprogram/pages/information/help/help.js create mode 100644 miniprogram/pages/information/help/help.json create mode 100644 miniprogram/pages/information/help/help.wxml create mode 100644 miniprogram/pages/information/help/help.wxss create mode 100644 miniprogram/pages/information/information.js create mode 100644 miniprogram/pages/information/information.json create mode 100644 miniprogram/pages/information/information.wxml create mode 100644 miniprogram/pages/information/information.wxss create mode 100644 miniprogram/pages/information/setting/setting.js create mode 100644 miniprogram/pages/information/setting/setting.json create mode 100644 miniprogram/pages/information/setting/setting.wxml create mode 100644 miniprogram/pages/information/setting/setting.wxss create mode 100644 miniprogram/pages/information/submit/submit.js create mode 100644 miniprogram/pages/information/submit/submit.json create mode 100644 miniprogram/pages/information/submit/submit.wxml create mode 100644 miniprogram/pages/information/submit/submit.wxss create mode 100644 miniprogram/pages/init/down.png create mode 100644 miniprogram/pages/init/init.js create mode 100644 miniprogram/pages/init/init.json create mode 100644 miniprogram/pages/init/init.wxml create mode 100644 miniprogram/pages/init/init.wxss create mode 100644 miniprogram/pages/list/createPlan/createPlan.js create mode 100644 miniprogram/pages/list/createPlan/createPlan.json create mode 100644 miniprogram/pages/list/createPlan/createPlan.wxml create mode 100644 miniprogram/pages/list/createPlan/createPlan.wxss create mode 100644 miniprogram/pages/list/createTask/createTask.js create mode 100644 miniprogram/pages/list/createTask/createTask.json create mode 100644 miniprogram/pages/list/createTask/createTask.wxml create mode 100644 miniprogram/pages/list/createTask/createTask.wxss create mode 100644 miniprogram/pages/list/list.js create mode 100644 miniprogram/pages/list/list.json create mode 100644 miniprogram/pages/list/list.wxml create mode 100644 miniprogram/pages/list/list.wxss create mode 100644 miniprogram/pages/list/plan/plan.js create mode 100644 miniprogram/pages/list/plan/plan.json create mode 100644 miniprogram/pages/list/plan/plan.wxml create mode 100644 miniprogram/pages/list/plan/plan.wxss create mode 100644 miniprogram/pages/list/task/task.js create mode 100644 miniprogram/pages/list/task/task.json create mode 100644 miniprogram/pages/list/task/task.wxml create mode 100644 miniprogram/pages/list/task/task.wxss create mode 100644 miniprogram/sitemap.json create mode 100644 miniprogram/utils/auth.js create mode 100644 miniprogram/utils/authCOMP.js create mode 100644 miniprogram/utils/authDELETE.js create mode 100644 miniprogram/utils/authGET.js create mode 100644 miniprogram/utils/authPATCH.js create mode 100644 miniprogram/utils/authPOST.js create mode 100644 miniprogram/utils/authRESULT.js create mode 100644 miniprogram/utils/authTIME.js create mode 100644 miniprogram/utils/sha1.js create mode 100644 miniprogram/utils/sha256.js create mode 100644 miniprogram/utils/ucharts/u-charts.js create mode 100644 miniprogram/utils/util.js create mode 100644 miniprogram/vendor/wafer2-client-sdk/LICENSE create mode 100644 miniprogram/vendor/wafer2-client-sdk/README.md create mode 100644 miniprogram/vendor/wafer2-client-sdk/index.js create mode 100644 miniprogram/vendor/wafer2-client-sdk/lib/constants.js create mode 100644 miniprogram/vendor/wafer2-client-sdk/lib/login.js create mode 100644 miniprogram/vendor/wafer2-client-sdk/lib/request.js create mode 100644 miniprogram/vendor/wafer2-client-sdk/lib/session.js create mode 100644 miniprogram/vendor/wafer2-client-sdk/lib/tunnel.js create mode 100644 miniprogram/vendor/wafer2-client-sdk/lib/utils.js create mode 100644 miniprogram/vendor/wafer2-client-sdk/lib/wxTunnel.js create mode 100644 miniprogram/vendor/wafer2-client-sdk/package.json create mode 100644 package.json create mode 100644 project.config.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..26d6131 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +/vendor +/node_modules diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..141fa11 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,99 @@ +module.exports = { + 'extends': [ + 'airbnb-base', + 'plugin:promise/recommended' + ], + 'parserOptions': { + 'ecmaVersion': 9, + 'ecmaFeatures': { + 'jsx': false + }, + 'sourceType': 'module' + }, + 'env': { + 'es6': true, + 'node': true, + 'jest': true + }, + 'plugins': [ + 'import', + 'node', + 'promise' + ], + 'rules': { + 'arrow-parens': 'off', + 'comma-dangle': [ + 'error', + 'only-multiline' + ], + 'complexity': ['error', 10], + 'func-names': 'off', + 'global-require': 'off', + 'handle-callback-err': [ + 'error', + '^(err|error)$' + ], + 'import/no-unresolved': [ + 'error', + { + 'caseSensitive': true, + 'commonjs': true, + 'ignore': ['^[^.]'] + } + ], + 'import/prefer-default-export': 'off', + 'linebreak-style': 'off', + 'no-catch-shadow': 'error', + 'no-continue': 'off', + 'no-div-regex': 'warn', + 'no-else-return': 'off', + 'no-param-reassign': 'off', + 'no-plusplus': 'off', + 'no-shadow': 'off', + // enable console for this project + 'no-console': 'off', + 'no-multi-assign': 'off', + 'no-underscore-dangle': 'off', + 'node/no-deprecated-api': 'error', + 'node/process-exit-as-throw': 'error', + 'object-curly-spacing': [ + 'error', + 'never' + ], + 'operator-linebreak': [ + 'error', + 'after', + { + 'overrides': { + ':': 'before', + '?': 'before' + } + } + ], + 'prefer-arrow-callback': 'off', + 'prefer-destructuring': 'off', + 'prefer-template': 'off', + 'quote-props': [ + 1, + 'as-needed', + { + 'unnecessary': true + } + ], + 'semi': [ + 'error', + 'never' + ] + }, + 'globals': { + 'window': true, + 'document': true, + 'App': true, + 'Page': true, + 'Component': true, + 'Behavior': true, + 'wx': true, + 'worker': true, + 'getApp': true + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b52f9a9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*swp +.idea +.DS_Store +package-lock.json + +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +node_modules diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e78bcd8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 wechat-miniprogram + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..468a3bf --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# 微信小程序示例 +微信小程序示例源码,欢迎扫描以下小程序码体验。 + +> 提示:请使用微信开发者工具或微信客户端 6.7.2 及以上版本运行。 + + + +## 使用 + +使用[微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)打开该示例代码,云开发环境搭建请参考[云开发示例说明](https://github.com/wechat-miniprogram/miniprogram-demo/blob/master/miniprogram/page/cloud/README.md)。 + +## 贡献 + +如果你有 bug 反馈或其他任何建议,欢迎提 issue 给我们。 + +如果你愿意一起来完善小程序示例,欢迎通过 PR 的方式贡献代码。为了保证代码风格的统一,在编写代码之前,请在项目根目录运行以下命令安装依赖: + +``` +npm install +``` +同时,确保你的代码可以通过 Lint 检查: +``` +npm run lint +``` + +## 截图 + +![截图](https://developers.weixin.qq.com/miniprogram/dev/image/demo.png) diff --git a/cloudfunctions/getServerDataDemo/index.js b/cloudfunctions/getServerDataDemo/index.js new file mode 100644 index 0000000..065c9cd --- /dev/null +++ b/cloudfunctions/getServerDataDemo/index.js @@ -0,0 +1,13 @@ +// 云函数入口文件 +const cloud = require('wx-server-sdk') + +// 云函数入口函数 +exports.main = async () => { + cloud.init({ + env: process.env.TCB_ENV, + }) + const db = cloud.database() + return db.collection('perm4').where({ + _openid: 'server' + }).limit(1).get() +} diff --git a/cloudfunctions/getServerDataDemo/package.json b/cloudfunctions/getServerDataDemo/package.json new file mode 100644 index 0000000..d282a69 --- /dev/null +++ b/cloudfunctions/getServerDataDemo/package.json @@ -0,0 +1,14 @@ +{ + "name": "getServerDataDemo", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "wx-server-sdk": "latest" + } +} \ No newline at end of file diff --git a/cloudfunctions/getTempFileURL/index.js b/cloudfunctions/getTempFileURL/index.js new file mode 100644 index 0000000..ba007f8 --- /dev/null +++ b/cloudfunctions/getTempFileURL/index.js @@ -0,0 +1,14 @@ +// 云函数入口文件 +const cloud = require('wx-server-sdk') + +// 云函数入口函数 +exports.main = async (event) => { + cloud.init({ + env: process.env.TCB_ENV, + }) + const fileList = event.fileIdList + const result = await cloud.getTempFileURL({ + fileList, + }) + return result.fileList +} diff --git a/cloudfunctions/getTempFileURL/package.json b/cloudfunctions/getTempFileURL/package.json new file mode 100644 index 0000000..873cd0a --- /dev/null +++ b/cloudfunctions/getTempFileURL/package.json @@ -0,0 +1,14 @@ +{ + "name": "getTempFileURL", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "wx-server-sdk": "latest" + } +} \ No newline at end of file diff --git a/cloudfunctions/openapi/config.json b/cloudfunctions/openapi/config.json new file mode 100644 index 0000000..da17794 --- /dev/null +++ b/cloudfunctions/openapi/config.json @@ -0,0 +1,13 @@ +{ + "permissions": { + "openapi": [ + "wxacode.getUnlimited", + "templateMessage.send", + "templateMessage.addTemplate", + "templateMessage.deleteTemplate", + "templateMessage.getTemplateList", + "templateMessage.getTemplateLibraryById", + "templateMessage.getTemplateLibraryList" + ] + } +} \ No newline at end of file diff --git a/cloudfunctions/openapi/index.js b/cloudfunctions/openapi/index.js new file mode 100644 index 0000000..136dda9 --- /dev/null +++ b/cloudfunctions/openapi/index.js @@ -0,0 +1,65 @@ +// 云函数入口文件 +const cloud = require('wx-server-sdk') + +cloud.init({env : "asr-v3kua"}) + +async function sendTemplateMessage(event) { + const {OPENID} = cloud.getWXContext() + + // 接下来将新增模板、发送模板消息、然后删除模板 + // 注意:新增模板然后再删除并不是建议的做法,此处只是为了演示,模板 ID 应在添加后保存起来后续使用 + const addResult = await cloud.openapi.templateMessage.addTemplate({ + id: 'AT0002', + keywordIdList: [3, 4, 5] + }) + + const templateId = addResult.result.templateId + + const sendResult = await cloud.openapi.templateMessage.send({ + touser: OPENID, + templateId, + formId: event.formId, + page: 'page/cloud/pages/scf-openapi/scf-openapi', + data: { + keyword1: { + value: '未名咖啡屋', + }, + keyword2: { + value: '2019 年 1 月 1 日', + }, + keyword3: { + value: '拿铁', + }, + } + }) + + await cloud.openapi.templateMessage.deleteTemplate({ + templateId, + }) + + return sendResult +} + +async function getWXACode() { + const {result} = await cloud.openapi.wxacode.getUnlimited({ + scene: 'x=1', + }) + + // 此处返回 Base64 图片仅作为演示用,在实际开发中, + // 应上传图片至云文件存储,然后在小程序中通过云文件 ID 使用 + return `data:${result.contentType};base64,${result.buffer.toString('base64')}` +} + +// 云函数入口函数 +// eslint-disable-next-line +exports.main = async (event) => { + switch (event.action) { + case 'sendTemplateMessage': { + return sendTemplateMessage(event) + } + case 'getWXACode': { + return getWXACode(event) + } + default: break + } +} diff --git a/cloudfunctions/openapi/package.json b/cloudfunctions/openapi/package.json new file mode 100644 index 0000000..0a39461 --- /dev/null +++ b/cloudfunctions/openapi/package.json @@ -0,0 +1,14 @@ +{ + "name": "openapi", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "wx-server-sdk": "latest" + } +} diff --git a/cloudfunctions/wxContext/index.js b/cloudfunctions/wxContext/index.js new file mode 100644 index 0000000..7d7a863 --- /dev/null +++ b/cloudfunctions/wxContext/index.js @@ -0,0 +1,15 @@ +// 云函数入口文件 +const cloud = require('wx-server-sdk') + +cloud.init({env: "asr-v3kua"}) + +// 云函数入口函数 +exports.main = async () => { + const wxContext = cloud.getWXContext() + + return { + openid: wxContext.OPENID, + appid: wxContext.APPID, + unionid: wxContext.UNIONID, + } +} diff --git a/cloudfunctions/wxContext/package.json b/cloudfunctions/wxContext/package.json new file mode 100644 index 0000000..dc469ea --- /dev/null +++ b/cloudfunctions/wxContext/package.json @@ -0,0 +1,14 @@ +{ + "name": "wxContext", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "wx-server-sdk": "latest" + } +} \ No newline at end of file diff --git a/git.codesdream.com.txt b/git.codesdream.com.txt new file mode 100644 index 0000000..e69de29 diff --git a/miniprogram/app.js b/miniprogram/app.js new file mode 100644 index 0000000..c9ceea4 --- /dev/null +++ b/miniprogram/app.js @@ -0,0 +1,87 @@ +//app.js +var config = require('./config') +var auth = require('./utils/auth') + +App({ + globalData:{ + token : null, + openid : null, + clientCode : '965cda1983f569b03abfb80dc9af8dd8', + hh:"\n", + loading: true, + registerListens: [], + }, + onLaunch: function () { + this.login(); + }, + + // 认证访问 + authRequest: function(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + url: object.url, + header:{ + 'openid': that.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(that.globalData.openid, that.globalData.token) + }, + + data: object.data, + + success: object.success, + + fail:object.fail, + }); + }, + + listenLoading:function(method){ + if(this.globalData.loading == false) method(); + else this.globalData.registerListens.push(method) + }, + + login: function(){ + let that = this; + // 尝试登录 + wx.login({ + complete: (res) => { + console.log(res); + wx.request({ + url: config.loginUrl, + method: "GET", + data: { + code : res.code + }, + success: function(res){ + // 设置SessionKey + that.globalData.token = res.data.token; + that.globalData.openid = res.data.openid; + console.log("success",that.globalData); + console.log("sdaa",res) + that.globalData.loading = false; + for (const f of that.globalData.registerListens){ + f(); + } + that.globalData.registerListens = [] + + /* + that.authRequest({ + url : "https://compute.bktus.com", + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + });*/ + }, + fail: function(res){ + console.log(res) + } + }) + } + }); + } +}) \ No newline at end of file diff --git a/miniprogram/app.json b/miniprogram/app.json new file mode 100644 index 0000000..477434c --- /dev/null +++ b/miniprogram/app.json @@ -0,0 +1,59 @@ +{ + "pages": [ + "pages/index/index", + "pages/init/init", + "pages/databaseTest/databaseTest", + "pages/information/information", + "pages/information/about/about", + "pages/information/submit/submit", + "pages/list/list", + "pages/information/setting/setting", + "pages/information/graph/graph", + "pages/alloc/alloc", + "pages/information/help/help" + ], + "useExtendedLib": { + "kbone": true, + "weui": true + }, + "window": { + "backgroundColor": "#F6F6F6", + "backgroundTextStyle": "light", + "navigationBarBackgroundColor": "#F6F6F6", + "navigationBarTitleText": "\"措置有方\"", + "navigationBarTextStyle": "black" + }, + "sitemapLocation": "sitemap.json", + "tabBar": { + "color": "#8a8a8a", + "selectedColor": "#7644df", + "borderStyle": "black", + "backgroundColor": "white", + "list": [ + { + "pagePath": "pages/index/index", + "text": "近24小时", + "iconPath": "images/001.png", + "selectedIconPath": "images/001-2.png" + }, + { + "pagePath": "pages/list/list", + "text": "要做的事情", + "iconPath": "images/002.png", + "selectedIconPath": "images/002-2.png" + }, + { + "pagePath": "pages/alloc/alloc", + "text": "最优规划表", + "iconPath": "images/004-1.png", + "selectedIconPath": "images/004-2.png" + }, + { + "pagePath": "pages/information/information", + "text": "关于我自己", + "iconPath": "images/003.png", + "selectedIconPath": "images/003-2.png" + } + ] + } +} \ No newline at end of file diff --git a/miniprogram/app.wxss b/miniprogram/app.wxss new file mode 100644 index 0000000..4aba359 --- /dev/null +++ b/miniprogram/app.wxss @@ -0,0 +1,33 @@ +/**app.wxss**/ +.container { + display: flex; + flex-direction: column; + align-items: center; + box-sizing: border-box; +} +.btn,.sx,.ks{ + color: #8538ff; + top: 30px; + width: 90px; + margin-left:auto; + margin-right:auto; + margin-bottom: 40px; + } +.ipt,.picker1,.ipt-2{ + border-style: solid; + border-width: 4rpx; + margin-left: 20px; + height: 40px; + width: 80%; + margin-top:10px ; + border-radius: 15rpx; + margin-bottom: 15rpx; + border-color: #8538ff; + font-size: 40rpx; + text-align: center; + background-color: #ffffff; + text-align: left; + +} + + diff --git a/miniprogram/config.js b/miniprogram/config.js new file mode 100644 index 0000000..a1a238f --- /dev/null +++ b/miniprogram/config.js @@ -0,0 +1,16 @@ +/** + * 小程序配置文件 + */ + +var host = "https://asr.codesdream.com"; + +// var host = "http://localhost:8087"; + +var appID = "wx8d9d87cf93f3e918"; + +var config = { + loginUrl: host+'/wx/user/'+appID+'/login', + hostUrl: host +}; + +module.exports = config; diff --git a/miniprogram/dist/action-sheet/index.js b/miniprogram/dist/action-sheet/index.js new file mode 100644 index 0000000..2db31aa --- /dev/null +++ b/miniprogram/dist/action-sheet/index.js @@ -0,0 +1,47 @@ +Component({ + externalClasses: ['i-class', 'i-class-mask', 'i-class-header'], + + options: { + multipleSlots: true + }, + + properties: { + visible: { + type: Boolean, + value: false + }, + maskClosable: { + type: Boolean, + value: true + }, + showCancel: { + type: Boolean, + value: false + }, + cancelText: { + type: String, + value: '取消' + }, + actions: { + type: Array, + value: [] + } + }, + + methods: { + handleClickMask () { + if (!this.data.maskClosable) return; + this.handleClickCancel(); + }, + + handleClickItem ({ currentTarget = {} }) { + const dataset = currentTarget.dataset || {}; + const { index } = dataset; + this.triggerEvent('click', { index }); + }, + + handleClickCancel () { + this.triggerEvent('cancel'); + } + } +}); diff --git a/miniprogram/dist/action-sheet/index.json b/miniprogram/dist/action-sheet/index.json new file mode 100644 index 0000000..6b1e67d --- /dev/null +++ b/miniprogram/dist/action-sheet/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": + { + "i-button": "../button/index", + "i-icon": "../icon/index" + } +} diff --git a/miniprogram/dist/action-sheet/index.wxml b/miniprogram/dist/action-sheet/index.wxml new file mode 100644 index 0000000..332f393 --- /dev/null +++ b/miniprogram/dist/action-sheet/index.wxml @@ -0,0 +1,23 @@ + + + + + + + + + {{ item.name }} + + + + + {{ cancelText }} + + diff --git a/miniprogram/dist/action-sheet/index.wxss b/miniprogram/dist/action-sheet/index.wxss new file mode 100644 index 0000000..05c6f04 --- /dev/null +++ b/miniprogram/dist/action-sheet/index.wxss @@ -0,0 +1 @@ +.i-as{position:fixed;width:100%;box-sizing:border-box;left:0;right:0;bottom:0;background:#f7f7f7;transform:translate3d(0,100%,0);transform-origin:center;transition:all .2s ease-in-out;z-index:900;visibility:hidden}.i-as-show{transform:translate3d(0,0,0);visibility:visible}.i-as-mask{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7);z-index:900;transition:all .2s ease-in-out;opacity:0;visibility:hidden}.i-as-mask-show{opacity:1;visibility:visible}.i-as-action-item{position:relative}.i-as-action-item::after{content:'';position:absolute;top:0;left:0;width:200%;height:200%;transform:scale(.5);transform-origin:0 0;pointer-events:none;box-sizing:border-box;border:0 solid #e9eaec;border-bottom-width:1px}.i-as-header{background:#fff;text-align:center;position:relative;font-size:12px;color:#80848f}.i-as-header::after{content:'';position:absolute;top:0;left:0;width:200%;height:200%;transform:scale(.5);transform-origin:0 0;pointer-events:none;box-sizing:border-box;border:0 solid #e9eaec;border-bottom-width:1px}.i-as-cancel{margin-top:6px}.i-as-btn-loading{display:inline-block;vertical-align:middle;margin-right:10px;width:12px;height:12px;background:0 0;border-radius:50%;border:2px solid #e5e5e5;border-color:#666 #e5e5e5 #e5e5e5 #e5e5e5;animation:btn-spin .6s linear;animation-iteration-count:infinite}.i-as-btn-text{display:inline-block;vertical-align:middle}.i-as-btn-icon{font-size:14px!important;margin-right:4px}@keyframes btn-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/miniprogram/dist/alert/index.js b/miniprogram/dist/alert/index.js new file mode 100644 index 0000000..461b67d --- /dev/null +++ b/miniprogram/dist/alert/index.js @@ -0,0 +1,37 @@ +Component({ + externalClasses: ['i-class'], + options: { + multipleSlots: true + }, + properties: { + //info, success, warning, error + type: { + type: String, + value: 'info' + }, + closable: { + type: Boolean, + value: false + }, + showIcon: { + type: Boolean, + default: false + }, + desc: { + type: Boolean, + default: false + }, + }, + data: { + closed: false + }, + methods: { + handleTap() { + this.setData({ + closed: !this.data.closed, + }); + this.triggerEvent('close'); + }, + + } +}); diff --git a/miniprogram/dist/alert/index.json b/miniprogram/dist/alert/index.json new file mode 100644 index 0000000..db3afc0 --- /dev/null +++ b/miniprogram/dist/alert/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": + { + "i-icon": "../icon/index" + } +} diff --git a/miniprogram/dist/alert/index.wxml b/miniprogram/dist/alert/index.wxml new file mode 100644 index 0000000..eebabde --- /dev/null +++ b/miniprogram/dist/alert/index.wxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/miniprogram/dist/alert/index.wxss b/miniprogram/dist/alert/index.wxss new file mode 100644 index 0000000..0e61fce --- /dev/null +++ b/miniprogram/dist/alert/index.wxss @@ -0,0 +1 @@ +.i-alert{position:relative;margin:10px;padding:8px 48px 8px 16px;font-size:14px;border-radius:2px;color:#fff;background:#f7f7f7;color:#495060}.i-alert.i-alert-with-icon{padding:8px 48px 8px 38px}.i-alert-info{color:#fff;background:#2db7f5}.i-alert-success{color:#fff;background:#19be6b}.i-alert-warning{color:#fff;background:#f90}.i-alert-error{color:#fff;background:#ed3f14}.i-alert-icon{position:absolute;top:9px;left:16px;font-size:14px}.i-alert-desc{font-size:12px}.i-alert-with-desc{padding:16px;position:relative}.i-alert-with-desc.i-alert-with-icon{padding:16px 16px 16px 69px}.i-alert-with-desc .i-alert-icon{top:50%;left:24px;margin-top:-21px;font-size:28px}.i-alert-close{font-size:12px;position:absolute;right:16px;top:8px;overflow:hidden;cursor:pointer} \ No newline at end of file diff --git a/miniprogram/dist/avatar/index.js b/miniprogram/dist/avatar/index.js new file mode 100644 index 0000000..fae9476 --- /dev/null +++ b/miniprogram/dist/avatar/index.js @@ -0,0 +1,20 @@ +Component({ + externalClasses: ['i-class'], + + properties: { + // circle || square + shape: { + type: String, + value: 'circle' + }, + // small || large || default + size: { + type: String, + value: 'default' + }, + src: { + type: String, + value: '' + } + } +}); diff --git a/miniprogram/dist/avatar/index.json b/miniprogram/dist/avatar/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/avatar/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/avatar/index.wxml b/miniprogram/dist/avatar/index.wxml new file mode 100644 index 0000000..11730c6 --- /dev/null +++ b/miniprogram/dist/avatar/index.wxml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/miniprogram/dist/avatar/index.wxss b/miniprogram/dist/avatar/index.wxss new file mode 100644 index 0000000..8f6e636 --- /dev/null +++ b/miniprogram/dist/avatar/index.wxss @@ -0,0 +1 @@ +.i-avatar{display:inline-block;text-align:center;background:#ccc;color:#fff;white-space:nowrap;position:relative;overflow:hidden;vertical-align:middle;width:32px;height:32px;line-height:32px;border-radius:16px;font-size:18px}.i-avatar .ivu-avatar-string{line-height:32px}.i-avatar-large{width:40px;height:40px;line-height:40px;border-radius:20px;font-size:24px}.i-avatar-large .ivu-avatar-string{line-height:40px}.i-avatar-small{width:24px;height:24px;line-height:24px;border-radius:12px;font-size:14px}.i-avatar-small .ivu-avatar-string{line-height:24px}.i-avatar-image{background:0 0}.i-avatar-square{border-radius:4px}.i-avatar>image{width:100%;height:100%} \ No newline at end of file diff --git a/miniprogram/dist/badge/index.js b/miniprogram/dist/badge/index.js new file mode 100644 index 0000000..2b9fb30 --- /dev/null +++ b/miniprogram/dist/badge/index.js @@ -0,0 +1,29 @@ +Component({ + externalClasses: ['i-class', 'i-class-alone'], + + properties: { + count: { + type: Number, + value: 0, + observer: 'finalCount' + }, + overflowCount: { + type: Number, + value: 99 + }, + dot: { + type: Boolean, + value: false + }, + }, + data: { + finalCount: 0 + }, + methods: { + finalCount() { + this.setData({ + finalCount: parseInt(this.data.count) >= parseInt(this.data.overflowCount) ? `${this.data.overflowCount}+` : this.data.count + }); + }, + } +}); diff --git a/miniprogram/dist/badge/index.json b/miniprogram/dist/badge/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/badge/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/badge/index.wxml b/miniprogram/dist/badge/index.wxml new file mode 100644 index 0000000..372fd7f --- /dev/null +++ b/miniprogram/dist/badge/index.wxml @@ -0,0 +1,5 @@ + + + + {{ finalCount }} + diff --git a/miniprogram/dist/badge/index.wxss b/miniprogram/dist/badge/index.wxss new file mode 100644 index 0000000..281658f --- /dev/null +++ b/miniprogram/dist/badge/index.wxss @@ -0,0 +1 @@ +.i-badge{position:relative;display:inline-block;line-height:1;vertical-align:middle}.i-badge-count{position:absolute;transform:translateX(50%);top:-6px;right:0;height:18px;border-radius:9px;min-width:18px;background:#ed3f14;border:1px solid transparent;color:#fff;line-height:18px;text-align:center;padding:0 5px;font-size:12px;white-space:nowrap;transform-origin:-10% center;z-index:10;box-shadow:0 0 0 1px #fff;box-sizing:border-box;text-rendering:optimizeLegibility}.i-badge-count-alone{top:auto;display:block;position:relative;transform:translateX(0)}.i-badge-dot{position:absolute;transform:translateX(-50%);transform-origin:0 center;top:-4px;right:-8px;height:8px;width:8px;border-radius:100%;background:#ed3f14;z-index:10;box-shadow:0 0 0 1px #fff} \ No newline at end of file diff --git a/miniprogram/dist/base/index.js b/miniprogram/dist/base/index.js new file mode 100644 index 0000000..6cb977f --- /dev/null +++ b/miniprogram/dist/base/index.js @@ -0,0 +1,37 @@ +function getCtx (selector) { + const pages = getCurrentPages(); + const ctx = pages[pages.length - 1]; + + const componentCtx = ctx.selectComponent(selector); + + if (!componentCtx) { + console.error('无法找到对应的组件,请按文档说明使用组件'); + return null; + } + return componentCtx; +} + +function Toast(options) { + const { selector = '#toast' } = options; + const ctx = getCtx(selector); + + ctx.handleShow(options); +} + +Toast.hide = function (selector = '#toast') { + const ctx = getCtx(selector); + + ctx.handleHide(); +}; + +function Message(options) { + const { selector = '#message' } = options; + const ctx = getCtx(selector); + + ctx.handleShow(options); +} + +module.exports = { + $Toast: Toast, + $Message: Message +}; \ No newline at end of file diff --git a/miniprogram/dist/button/index.js b/miniprogram/dist/button/index.js new file mode 100644 index 0000000..f0e9b3e --- /dev/null +++ b/miniprogram/dist/button/index.js @@ -0,0 +1,80 @@ +Component({ + externalClasses: ['i-class'], + + properties: { + // default, primary, ghost, info, success, warning, error + type: { + type: String, + value: '', + }, + inline: { + type: Boolean, + value: false + }, + // default, large, small + size: { + type: String, + value: '', + }, + // circle, square + shape: { + type: String, + value: 'square' + }, + disabled: { + type: Boolean, + value: false, + }, + loading: { + type: Boolean, + value: false, + }, + long: { + type: Boolean, + value: false + }, + openType: String, + appParameter: String, + hoverStopPropagation: Boolean, + hoverStartTime: { + type: Number, + value: 20 + }, + hoverStayTime: { + type: Number, + value: 70 + }, + lang: { + type: String, + value: 'en' + }, + sessionFrom: { + type: String, + value: '' + }, + sendMessageTitle: String, + sendMessagePath: String, + sendMessageImg: String, + showMessageCard: Boolean + }, + + methods: { + handleTap () { + if (this.data.disabled) return false; + + this.triggerEvent('click'); + }, + bindgetuserinfo({ detail = {} } = {}) { + this.triggerEvent('getuserinfo', detail); + }, + bindcontact({ detail = {} } = {}) { + this.triggerEvent('contact', detail); + }, + bindgetphonenumber({ detail = {} } = {}) { + this.triggerEvent('getphonenumber', detail); + }, + binderror({ detail = {} } = {}) { + this.triggerEvent('error', detail); + } + } +}); diff --git a/miniprogram/dist/button/index.json b/miniprogram/dist/button/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/button/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/button/index.wxml b/miniprogram/dist/button/index.wxml new file mode 100644 index 0000000..e154eee --- /dev/null +++ b/miniprogram/dist/button/index.wxml @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/miniprogram/dist/button/index.wxss b/miniprogram/dist/button/index.wxss new file mode 100644 index 0000000..550bc81 --- /dev/null +++ b/miniprogram/dist/button/index.wxss @@ -0,0 +1 @@ +.i-btn{text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;white-space:nowrap;user-select:none;font-size:14px;border-radius:2px;border:0!important;position:relative;text-decoration:none;height:44px;line-height:44px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);color:#fff!important;background:#f7f7f7!important;color:#495060!important;margin:10px}.i-btn-hover{opacity:.9}.i-btn-long{border-radius:0;margin:0;box-shadow:none}.i-btn-large{height:48px;line-height:48px}.i-btn-small{height:40px;line-height:40px}.i-btn-primary{color:#fff!important;background:#2d8cf0!important}.i-btn-ghost{color:#fff!important;background:#fff!important;color:#495060!important}.i-btn-success{color:#fff!important;background:#19be6b!important}.i-btn-warning{color:#fff!important;background:#f90!important}.i-btn-error{color:#fff!important;background:#ed3f14!important}.i-btn-info{color:#fff!important;background:#2db7f5!important}.i-btn-circle{border-radius:44px}.i-btn-large.i-btn-circle{border-radius:48px}.i-btn-small.i-btn-circle{border-radius:40px}.i-btn-loading{opacity:.6}.i-btn-loading-inner{display:inline-block;margin-right:12px;vertical-align:middle;width:14px;height:14px;background:0 0;border-radius:50%;border:2px solid #fff;border-color:#fff #fff #fff transparent;animation:btn-spin .6s linear;animation-iteration-count:infinite}.i-btn-disabled{color:#bbbec4!important;background:#f7f7f7!important}.i-btn-inline{display:inline-block}@keyframes btn-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/miniprogram/dist/card/index.js b/miniprogram/dist/card/index.js new file mode 100644 index 0000000..20ad106 --- /dev/null +++ b/miniprogram/dist/card/index.js @@ -0,0 +1,26 @@ +Component({ + externalClasses: ['i-class'], + + options: { + multipleSlots: true + }, + + properties: { + full: { + type: Boolean, + value: false + }, + thumb: { + type: String, + value: '' + }, + title: { + type: String, + value: '' + }, + extra: { + type: String, + value: '' + } + } +}); diff --git a/miniprogram/dist/card/index.json b/miniprogram/dist/card/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/card/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/card/index.wxml b/miniprogram/dist/card/index.wxml new file mode 100644 index 0000000..4792293 --- /dev/null +++ b/miniprogram/dist/card/index.wxml @@ -0,0 +1,11 @@ + + + + + {{ title }} + + {{ extra }} + + + + diff --git a/miniprogram/dist/card/index.wxss b/miniprogram/dist/card/index.wxss new file mode 100644 index 0000000..fd8fad4 --- /dev/null +++ b/miniprogram/dist/card/index.wxss @@ -0,0 +1 @@ +.i-card{margin:0 16px;font-size:14px;overflow:hidden;position:relative;background:#fff;border:1rpx solid #dddee1;border-radius:5px}.i-card-full{margin:0;border-left:none;border-right:none;border-radius:0}.i-card-header{display:flex;padding:6px 16px;align-items:center}.i-card-header-content{flex:1;text-align:left}.i-card-header-thumb{display:inline-block;width:64px;height:64px;position:relative;margin-left:auto;margin-right:auto;overflow:hidden;background-size:cover;vertical-align:middle}.i-card-header-title{display:inline-block;vertical-align:middle;font-size:14px;color:#1c2438}.i-card-header-extra{flex:1;text-align:right;font-size:14px;color:#80848f}.i-card-body{position:relative;padding:6px 16px;color:#495060;font-size:14px}.i-card-body::before{content:'';position:absolute;top:0;left:0;width:200%;height:200%;transform:scale(.5);transform-origin:0 0;pointer-events:none;box-sizing:border-box;border:0 solid #e9eaec;border-top-width:1px}.i-card-footer{position:relative;padding:6px 16px;color:#80848f;font-size:12px} \ No newline at end of file diff --git a/miniprogram/dist/cell-group/index.js b/miniprogram/dist/cell-group/index.js new file mode 100644 index 0000000..ad36baa --- /dev/null +++ b/miniprogram/dist/cell-group/index.js @@ -0,0 +1,33 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../cell/index': { + type: 'child', + linked () { + this._updateIsLastCell(); + }, + linkChanged () { + this._updateIsLastCell(); + }, + unlinked () { + this._updateIsLastCell(); + } + } + }, + + methods: { + _updateIsLastCell() { + let cells = this.getRelationNodes('../cell/index'); + const len = cells.length; + + if (len > 0) { + let lastIndex = len - 1; + + cells.forEach((cell, index) => { + cell.updateIsLastCell(index === lastIndex); + }); + } + } + } +}); diff --git a/miniprogram/dist/cell-group/index.json b/miniprogram/dist/cell-group/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/cell-group/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/cell-group/index.wxml b/miniprogram/dist/cell-group/index.wxml new file mode 100644 index 0000000..1897919 --- /dev/null +++ b/miniprogram/dist/cell-group/index.wxml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/miniprogram/dist/cell/index.js b/miniprogram/dist/cell/index.js new file mode 100644 index 0000000..50e635c --- /dev/null +++ b/miniprogram/dist/cell/index.js @@ -0,0 +1,86 @@ +const warn = (msg, getValue) => { + console.warn(msg); + console.log('接受到的值为:', getValue); +}; + +Component({ + externalClasses: ['i-class'], + + options: { + multipleSlots: true + }, + + relations: { + '../cell-group/index': { + type: 'parent' + } + }, + + properties: { + // 左侧标题 + title: { + type: String + }, + // 标题下方的描述信息 + label: { + type: String + }, + // 右侧内容 + value: { + type: String + }, + // 只有点击 footer 区域才触发 tab 事件 + onlyTapFooter: { + type: Boolean + }, + // 是否展示右侧箭头并开启尝试以 url 跳转 + isLink: { + type: null, + value: '' + }, + // 链接类型,可选值为 navigateTo,redirectTo,switchTab,reLaunch + linkType: { + type: String, + value: 'navigateTo' + }, + url: { + type: String, + value: '' + } + }, + + data: { + isLastCell: true + }, + + methods: { + navigateTo () { + const { url } = this.data; + const type = typeof this.data.isLink; + + this.triggerEvent('click', {}); + + if (!this.data.isLink || !url || url === 'true' || url === 'false') return; + + if (type !== 'boolean' && type !== 'string') { + warn('isLink 属性值必须是一个字符串或布尔值', this.data.isLink); + return; + } + + if (['navigateTo', 'redirectTo', 'switchTab', 'reLaunch'].indexOf(this.data.linkType) === -1) { + warn('linkType 属性可选值为 navigateTo,redirectTo,switchTab,reLaunch', this.data.linkType); + return; + } + wx[this.data.linkType].call(wx, {url}); + }, + handleTap () { + if (!this.data.onlyTapFooter) { + this.navigateTo(); + } + }, + + updateIsLastCell (isLastCell) { + this.setData({ isLastCell }); + } + } +}); diff --git a/miniprogram/dist/cell/index.json b/miniprogram/dist/cell/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/cell/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/cell/index.wxml b/miniprogram/dist/cell/index.wxml new file mode 100644 index 0000000..c3683e3 --- /dev/null +++ b/miniprogram/dist/cell/index.wxml @@ -0,0 +1,16 @@ + + + + + + {{ title }} + {{ label }} + + + + {{ value }} + + + + + \ No newline at end of file diff --git a/miniprogram/dist/cell/index.wxss b/miniprogram/dist/cell/index.wxss new file mode 100644 index 0000000..e45ad75 --- /dev/null +++ b/miniprogram/dist/cell/index.wxss @@ -0,0 +1 @@ +.i-cell{position:relative;padding:12px 15px;display:flex;background:#fff;align-items:center;line-height:1.4;font-size:14px;overflow:hidden}.i-cell::after{content:'';position:absolute;top:0;left:0;width:200%;height:200%;transform:scale(.5);transform-origin:0 0;pointer-events:none;box-sizing:border-box;border:0 solid #e9eaec;border-bottom-width:1px;left:15px;right:0}.i-cell-last::after{display:none}.i-cell-icon{margin-right:5px}.i-cell-icon:empty{display:none}.i-cell-bd{flex:1}.i-cell-text{line-height:24px;font-size:14px}.i-cell-desc{line-height:1.2;font-size:12px;color:#80848f}.i-cell-ft{position:relative;text-align:right;color:#495060}.i-cell-access .i-cell-ft{padding-right:13px}.i-cell-access .i-cell-ft::after{content:" ";display:inline-block;width:6px;height:6px;position:absolute;top:50%;right:2px;border-width:2px 2px 0 0;border-color:#dddee1;border-style:solid;transform:translateY(-50%) matrix(.71,.71,-.71,.71,0,0)} \ No newline at end of file diff --git a/miniprogram/dist/checkbox-group/index.js b/miniprogram/dist/checkbox-group/index.js new file mode 100644 index 0000000..6465450 --- /dev/null +++ b/miniprogram/dist/checkbox-group/index.js @@ -0,0 +1,38 @@ +Component({ + externalClasses: ['i-class'], + relations: { + '../checkbox/index': { + type: 'child', + linked() { + this.changeCurrent(); + }, + linkChanged() { + this.changeCurrent(); + }, + unlinked() { + this.changeCurrent(); + } + } + }, + properties: { + current: { + type: Array, + value: [], + observer: 'changeCurrent' + }, + }, + methods: { + changeCurrent(val = this.data.current) { + let items = this.getRelationNodes('../checkbox/index'); + const len = items.length; + if (len > 0) { + items.forEach(item => { + item.changeCurrent(val.indexOf(item.data.value) !== -1); + }); + } + }, + emitEvent(current) { + this.triggerEvent('change', current); + } + } +}); diff --git a/miniprogram/dist/checkbox-group/index.json b/miniprogram/dist/checkbox-group/index.json new file mode 100644 index 0000000..edf138d --- /dev/null +++ b/miniprogram/dist/checkbox-group/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": + { + "i-cell-group": "../cell-group/index" + } +} diff --git a/miniprogram/dist/checkbox-group/index.wxml b/miniprogram/dist/checkbox-group/index.wxml new file mode 100644 index 0000000..6940180 --- /dev/null +++ b/miniprogram/dist/checkbox-group/index.wxml @@ -0,0 +1,3 @@ + + + diff --git a/miniprogram/dist/checkbox-group/index.wxss b/miniprogram/dist/checkbox-group/index.wxss new file mode 100644 index 0000000..e69de29 diff --git a/miniprogram/dist/checkbox/index.js b/miniprogram/dist/checkbox/index.js new file mode 100644 index 0000000..b383952 --- /dev/null +++ b/miniprogram/dist/checkbox/index.js @@ -0,0 +1,56 @@ +const prefixCls = 'i-checkbox'; + +Component({ + externalClasses: ['i-class'], + relations: { + '../checkbox-group/index': { + type: 'parent' + } + }, + properties: { + value: { + type: String, + value: '' + }, + checked: { + type: Boolean, + value: false + }, + disabled: { + type: Boolean, + value: false + }, + color: { + type: String, + value: '#2d8cf0' + }, + position: { + type: String, + value: 'left', //left right + observer: 'setPosition' + } + }, + data: { + checked: true, + positionCls: `${prefixCls}-checkbox-left`, + }, + attached() { + this.setPosition(); + }, + methods: { + changeCurrent(current) { + this.setData({ checked: current }); + }, + checkboxChange() { + if (this.data.disabled) return; + const item = { current: !this.data.checked, value: this.data.value }; + const parent = this.getRelationNodes('../checkbox-group/index')[0]; + parent ? parent.emitEvent(item) : this.triggerEvent('change', item); + }, + setPosition() { + this.setData({ + positionCls: this.data.position.indexOf('left') !== -1 ? `${prefixCls}-checkbox-left` : `${prefixCls}-checkbox-right`, + }); + } + } +}); diff --git a/miniprogram/dist/checkbox/index.json b/miniprogram/dist/checkbox/index.json new file mode 100644 index 0000000..e2ab49a --- /dev/null +++ b/miniprogram/dist/checkbox/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": + { + "i-cell": "../cell/index" + } +} diff --git a/miniprogram/dist/checkbox/index.wxml b/miniprogram/dist/checkbox/index.wxml new file mode 100644 index 0000000..214493f --- /dev/null +++ b/miniprogram/dist/checkbox/index.wxml @@ -0,0 +1,8 @@ + + + + + diff --git a/miniprogram/dist/checkbox/index.wxss b/miniprogram/dist/checkbox/index.wxss new file mode 100644 index 0000000..a07699f --- /dev/null +++ b/miniprogram/dist/checkbox/index.wxss @@ -0,0 +1 @@ +.i-checkbox-cell::after{display:block}.i-checkbox-checkbox-left{float:left}.i-checkbox-checkbox-right{float:right}.i-checkbox-radio{vertical-align:middle}.i-checkbox-title{display:inline-block;vertical-align:middle} \ No newline at end of file diff --git a/miniprogram/dist/circle-progress/index.js b/miniprogram/dist/circle-progress/index.js new file mode 100644 index 0000000..1b2aaa2 --- /dev/null +++ b/miniprogram/dist/circle-progress/index.js @@ -0,0 +1,47 @@ +Component({ + properties: { + currentProgress:{ + type: Number, + value: 0, + observer: '_progressDidChange', + }, + size:{ + type: Number, + value: 200 + }, + borderSize:{ + type: Number, + value: 20 + }, + borderColor:{ + type: String, + value: "green" + }, + normalColor:{ + type: String, + value: "gray" + } + }, + data: { + rightCircleRadius: 135, + leftCircleRadius: 135, + }, + methods: { + _progressDidChange: function(newVal,oldVal){ + var that = this; + var newLeftRadius = that.data.leftCircleRadius; + var newRightRadius = that.data.rightCircleRadius; + var radius = 360 * newVal; + if(newVal < 0.5 && newVal >= 0){ + //只需要旋转右边的值 + newLeftRadius = 135; + newRightRadius = 135 + radius; + }else if(newVal <= 1 && newVal >=0.5){ + //两边都需要旋转 + newLeftRadius = radius - 45; + newRightRadius = -45; + } + that.setData({rightCircleRadius:newRightRadius,leftCircleRadius:newLeftRadius}); + } + } +}) \ No newline at end of file diff --git a/miniprogram/dist/circle-progress/index.json b/miniprogram/dist/circle-progress/index.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/miniprogram/dist/circle-progress/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/miniprogram/dist/circle-progress/index.wxml b/miniprogram/dist/circle-progress/index.wxml new file mode 100644 index 0000000..00706e6 --- /dev/null +++ b/miniprogram/dist/circle-progress/index.wxml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/miniprogram/dist/circle-progress/index.wxss b/miniprogram/dist/circle-progress/index.wxss new file mode 100644 index 0000000..556aad6 --- /dev/null +++ b/miniprogram/dist/circle-progress/index.wxss @@ -0,0 +1,32 @@ +/* miniprogram/dist/circle-progress/circle-progress.wxss */ +.circle-progress-outter-circle{ + border-radius: 50%; + box-sizing: border-box; +} +.circle-progress-half-rect{ + position: absolute; + overflow: hidden; +} +.right-rect{ + top: 0; + right: 0; +} +.left-rect{ + top: 0; + left: 0; +} +.circle-progress-half-circle{ + border-radius: 50%; + box-sizing: border-box; + position: absolute; +} +.right-circle{ + top:0; + right: 0; + transform: rotate(-45deg); +} +.left-circle{ + top:0; + left: 0; + transform: rotate(-45deg); +} \ No newline at end of file diff --git a/miniprogram/dist/col/index.js b/miniprogram/dist/col/index.js new file mode 100644 index 0000000..9b2d65d --- /dev/null +++ b/miniprogram/dist/col/index.js @@ -0,0 +1,20 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../row/index': { + type: 'parent' + } + }, + + properties: { + span: { + value: 0, + type: Number + }, + offset: { + value: 0, + type: Number + } + } +}); diff --git a/miniprogram/dist/col/index.json b/miniprogram/dist/col/index.json new file mode 100644 index 0000000..32640e0 --- /dev/null +++ b/miniprogram/dist/col/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} \ No newline at end of file diff --git a/miniprogram/dist/col/index.wxml b/miniprogram/dist/col/index.wxml new file mode 100644 index 0000000..838a22b --- /dev/null +++ b/miniprogram/dist/col/index.wxml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/miniprogram/dist/col/index.wxss b/miniprogram/dist/col/index.wxss new file mode 100644 index 0000000..bdce125 --- /dev/null +++ b/miniprogram/dist/col/index.wxss @@ -0,0 +1 @@ +.i-col{float:left;box-sizing:border-box;width:0}.i-col-span-1{display:block;width:4.16666667%}.i-col-offset-1{margin-left:4.16666667%}.i-col-span-2{display:block;width:8.33333333%}.i-col-offset-2{margin-left:8.33333333%}.i-col-span-3{display:block;width:12.5%}.i-col-offset-3{margin-left:12.5%}.i-col-span-4{display:block;width:16.66666667%}.i-col-offset-4{margin-left:16.66666667%}.i-col-span-5{display:block;width:20.83333333%}.i-col-offset-5{margin-left:20.83333333%}.i-col-span-6{display:block;width:25%}.i-col-offset-6{margin-left:25%}.i-col-span-7{display:block;width:29.16666667%}.i-col-offset-7{margin-left:29.16666667%}.i-col-span-8{display:block;width:33.33333333%}.i-col-offset-8{margin-left:33.33333333%}.i-col-span-9{display:block;width:37.5%}.i-col-offset-9{margin-left:37.5%}.i-col-span-10{display:block;width:41.66666667%}.i-col-offset-10{margin-left:41.66666667%}.i-col-span-11{display:block;width:45.83333333%}.i-col-offset-11{margin-left:45.83333333%}.i-col-span-12{display:block;width:50%}.i-col-offset-12{margin-left:50%}.i-col-span-13{display:block;width:54.16666667%}.i-col-offset-13{margin-left:54.16666667%}.i-col-span-14{display:block;width:58.33333333%}.i-col-offset-14{margin-left:58.33333333%}.i-col-span-15{display:block;width:62.5%}.i-col-offset-15{margin-left:62.5%}.i-col-span-16{display:block;width:66.66666667%}.i-col-offset-16{margin-left:66.66666667%}.i-col-span-17{display:block;width:70.83333333%}.i-col-offset-17{margin-left:70.83333333%}.i-col-span-18{display:block;width:75%}.i-col-offset-18{margin-left:75%}.i-col-span-19{display:block;width:79.16666667%}.i-col-offset-19{margin-left:79.16666667%}.i-col-span-20{display:block;width:83.33333333%}.i-col-offset-20{margin-left:83.33333333%}.i-col-span-21{display:block;width:87.5%}.i-col-offset-21{margin-left:87.5%}.i-col-span-22{display:block;width:91.66666667%}.i-col-offset-22{margin-left:91.66666667%}.i-col-span-23{display:block;width:95.83333333%}.i-col-offset-23{margin-left:95.83333333%}.i-col-span-24{display:block;width:100%}.i-col-offset-24{margin-left:100%} \ No newline at end of file diff --git a/miniprogram/dist/collapse-item/index.js b/miniprogram/dist/collapse-item/index.js new file mode 100644 index 0000000..bc415c1 --- /dev/null +++ b/miniprogram/dist/collapse-item/index.js @@ -0,0 +1,46 @@ +Component({ + externalClasses: ['i-class-content', 'i-class-title', 'i-class'], + + relations: { + '../collapse/index': { + type: 'parent', + linked: function (target) { + const options = { + accordion: target.data.accordion + } + if (target.data.name === this.data.name) { + options.showContent = 'i-collapse-item-show-content'; + } + this.setData(options); + } + } + }, + + properties: { + title: String, + name: String + }, + + data: { + showContent: '', + accordion: false + }, + + options: { + multipleSlots: true + }, + + methods: { + trigger(e) { + const data = this.data; + if (data.accordion) { + this.triggerEvent('collapse', {name: data.name}, {composed: true, bubbles: true}); + } else { + this.setData({ + showContent: data.showContent ? '' : 'i-collapse-item-show-content' + }); + } + }, + } +}); + diff --git a/miniprogram/dist/collapse-item/index.json b/miniprogram/dist/collapse-item/index.json new file mode 100644 index 0000000..54575da --- /dev/null +++ b/miniprogram/dist/collapse-item/index.json @@ -0,0 +1,7 @@ + +{ + "component": true, + "usingComponents": { + "i-icon": "../icon/index" + } +} diff --git a/miniprogram/dist/collapse-item/index.wxml b/miniprogram/dist/collapse-item/index.wxml new file mode 100644 index 0000000..ba22b0a --- /dev/null +++ b/miniprogram/dist/collapse-item/index.wxml @@ -0,0 +1,9 @@ + + + + {{title}} + + + + + \ No newline at end of file diff --git a/miniprogram/dist/collapse-item/index.wxss b/miniprogram/dist/collapse-item/index.wxss new file mode 100644 index 0000000..d44c032 --- /dev/null +++ b/miniprogram/dist/collapse-item/index.wxss @@ -0,0 +1 @@ +.i-collapse-item{padding:2px 8px;border-top:1px solid #dddee1}.i-collapse-item-title{vertical-align:middle}.i-collapse-item-title-wrap{padding:2px 0 0}.i-collapse-item-content{padding:6px;display:none}.i-collapse-item-show-content{display:block}.i-collapse-item-arrow{transition:transform .2s ease-in-out}.i-collapse-item-arrow-show{transition:transform .2s ease-in-out;transform:rotate(90deg)} \ No newline at end of file diff --git a/miniprogram/dist/collapse/index.js b/miniprogram/dist/collapse/index.js new file mode 100644 index 0000000..acc1455 --- /dev/null +++ b/miniprogram/dist/collapse/index.js @@ -0,0 +1,31 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../collapse-item/index': { + type: 'child' + } + }, + properties: { + name: String, + accordion: Boolean + }, + methods: { + clickfn(e) { + const params = e.detail; + const allList = this.getRelationNodes('../collapse-item/index'); + allList.forEach((item) => { + if (params.name === item.data.name) { + item.setData({ + showContent: 'i-collapse-item-show-content' + }); + } else { + item.setData({ + showContent: '' + }); + } + }); + }, + } +}); + diff --git a/miniprogram/dist/collapse/index.json b/miniprogram/dist/collapse/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/collapse/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/collapse/index.wxml b/miniprogram/dist/collapse/index.wxml new file mode 100644 index 0000000..0f379f7 --- /dev/null +++ b/miniprogram/dist/collapse/index.wxml @@ -0,0 +1,4 @@ + + + + diff --git a/miniprogram/dist/collapse/index.wxss b/miniprogram/dist/collapse/index.wxss new file mode 100644 index 0000000..e69de29 diff --git a/miniprogram/dist/count-down/index.js b/miniprogram/dist/count-down/index.js new file mode 100644 index 0000000..f1da533 --- /dev/null +++ b/miniprogram/dist/count-down/index.js @@ -0,0 +1,90 @@ +Component({ + properties: { + target: Number, + showDay: Boolean, + callback: String, + format: Array, + clearTimer: Boolean + }, + externalClasses: ['countdown-class'], + data: { + time: '', + resultFormat: [], + changeFormat: false + }, + ready() { + this.getFormat(); + + }, + methods: { + getFormat() { + const data = this.data; + const len = data.format.length; + + if (!data.showDay) data.resultFormat.push(''); + + if (len >= 3) { + for (let i = 0; i < len; i++) { + if (data.resultFormat.length >= 4) break; + if (data.format[i]) { + data.resultFormat.push(data.format[i].toString()); + } + } + + if (data.resultFormat.length >= 4) data.changeFormat = true; + } + + this.getLastTime(); + }, + init() { + const self = this; + setTimeout(function () { + self.getLastTime.call(self); + }, 1000); + }, + getLastTime() { + const data = this.data; + const gapTime = Math.ceil((data.target - new Date().getTime()) / 1000); + let result = ''; + let time = '00:00:00'; + let day = '00'; + const format = data.resultFormat; + + if (gapTime > 0) { + day = this.formatNum(parseInt(gapTime / 86400)); + let lastTime = gapTime % 86400; + const hour = this.formatNum(parseInt(lastTime / 3600)); + lastTime = lastTime % 3600; + const minute = this.formatNum(parseInt(lastTime / 60)); + const second = this.formatNum(lastTime % 60); + + if (data.changeFormat) time = `${hour}${format[1]}${minute}${format[2]}${second}${format[3]}`; + else time = `${hour}:${minute}:${second}`; + + if (!data.clearTimer) this.init.call(this); + } else { + this.endfn(); + } + + if (data.showDay) { + if (data.changeFormat) { + result = `${day}${format[0]} ${time}`; + } else { + result = `${day}d ${time}`; + } + } else { + result = time; + } + this.setData({ + time: result + }); + + }, + formatNum(num) { + return num > 9 ? num : `0${num}`; + }, + endfn() { + this.triggerEvent('callback', {}); + } + } +}); diff --git a/miniprogram/dist/count-down/index.json b/miniprogram/dist/count-down/index.json new file mode 100644 index 0000000..74f1315 --- /dev/null +++ b/miniprogram/dist/count-down/index.json @@ -0,0 +1,4 @@ + +{ + "component": true +} diff --git a/miniprogram/dist/count-down/index.wxml b/miniprogram/dist/count-down/index.wxml new file mode 100644 index 0000000..e4bec57 --- /dev/null +++ b/miniprogram/dist/count-down/index.wxml @@ -0,0 +1,4 @@ + + {{time}} + + diff --git a/miniprogram/dist/count-down/index.wxss b/miniprogram/dist/count-down/index.wxss new file mode 100644 index 0000000..e69de29 diff --git a/miniprogram/dist/divider/index.js b/miniprogram/dist/divider/index.js new file mode 100644 index 0000000..6b0e448 --- /dev/null +++ b/miniprogram/dist/divider/index.js @@ -0,0 +1,25 @@ +Component({ + externalClasses: ['i-class'], + properties: { + content: { + type: String, + value: '' + }, + height : { + type: Number, + value: 48 + }, + color : { + type : String, + value : '#80848f' + }, + lineColor : { + type : String, + value : '#e9eaec' + }, + size : { + type: String, + value: 12 + } + } +}); diff --git a/miniprogram/dist/divider/index.json b/miniprogram/dist/divider/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/divider/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/divider/index.wxml b/miniprogram/dist/divider/index.wxml new file mode 100644 index 0000000..b7111d3 --- /dev/null +++ b/miniprogram/dist/divider/index.wxml @@ -0,0 +1,19 @@ + + + {{content}} + + + + + + + + module.exports = { + getStyle : function(color,size,height){ + var color = 'color:' + color +';'; + var size = 'font-size:' + size + 'px;'; + var height = 'height:' + height+'px;' + return color + size + height; + } + } + diff --git a/miniprogram/dist/divider/index.wxss b/miniprogram/dist/divider/index.wxss new file mode 100644 index 0000000..98827ab --- /dev/null +++ b/miniprogram/dist/divider/index.wxss @@ -0,0 +1 @@ +.i-divider{width:100%;text-align:center;font-size:12px;position:relative;display:flex;align-items:center;justify-content:center}.i-divider-line{position:absolute;left:0;width:100%;height:1rpx;background-color:#f7f7f7;top:50%}.i-divider-content{background:#fff;position:relative;z-index:1;display:inline-block;padding:0 10px} \ No newline at end of file diff --git a/miniprogram/dist/drawer/index.js b/miniprogram/dist/drawer/index.js new file mode 100644 index 0000000..adb248a --- /dev/null +++ b/miniprogram/dist/drawer/index.js @@ -0,0 +1,33 @@ +Component({ + externalClasses: ['i-class'], + properties: { + visible: { + type: Boolean, + value: false + }, + + mask: { + type: Boolean, + value: true + }, + + maskClosable: { + type: Boolean, + value: true + }, + + mode: { + type: String, + value: 'left' // left right + } + }, + data: {}, + methods: { + handleMaskClick() { + if (!this.data.maskClosable) { + return; + } + this.triggerEvent('close', {}); + } + } +}); diff --git a/miniprogram/dist/drawer/index.json b/miniprogram/dist/drawer/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/drawer/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/drawer/index.wxml b/miniprogram/dist/drawer/index.wxml new file mode 100644 index 0000000..67380d9 --- /dev/null +++ b/miniprogram/dist/drawer/index.wxml @@ -0,0 +1,6 @@ + + + + + + diff --git a/miniprogram/dist/drawer/index.wxss b/miniprogram/dist/drawer/index.wxss new file mode 100644 index 0000000..2824713 --- /dev/null +++ b/miniprogram/dist/drawer/index.wxss @@ -0,0 +1 @@ +.i-drawer{visibility:hidden}.i-drawer-show{visibility:visible}.i-drawer-show .i-drawer-mask{display:block;opacity:1}.i-drawer-show .i-drawer-container{opacity:1}.i-drawer-show.i-drawer-left .i-drawer-container,.i-drawer-show.i-drawer-right .i-drawer-container{transform:translate3d(0,-50%,0)}.i-drawer-mask{opacity:0;position:fixed;top:0;left:0;right:0;bottom:0;z-index:6;background:rgba(0,0,0,.6);transition:all .3s ease-in-out}.i-drawer-container{position:fixed;left:50%;top:50%;transform:translate3d(-50%,-50%,0);transform-origin:center;transition:all .3s ease-in-out;z-index:7;opacity:0}.i-drawer-left .i-drawer-container{left:0;top:50%;transform:translate3d(-100%,-50%,0)}.i-drawer-right .i-drawer-container{right:0;top:50%;left:auto;transform:translate3d(100%,-50%,0)} \ No newline at end of file diff --git a/miniprogram/dist/grid-icon/index.js b/miniprogram/dist/grid-icon/index.js new file mode 100644 index 0000000..5315185 --- /dev/null +++ b/miniprogram/dist/grid-icon/index.js @@ -0,0 +1,10 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../grid-item/index': { + type: 'parent' + } + }, + +}); diff --git a/miniprogram/dist/grid-icon/index.json b/miniprogram/dist/grid-icon/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/grid-icon/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/grid-icon/index.wxml b/miniprogram/dist/grid-icon/index.wxml new file mode 100644 index 0000000..b9f9025 --- /dev/null +++ b/miniprogram/dist/grid-icon/index.wxml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/miniprogram/dist/grid-icon/index.wxss b/miniprogram/dist/grid-icon/index.wxss new file mode 100644 index 0000000..88c58a7 --- /dev/null +++ b/miniprogram/dist/grid-icon/index.wxss @@ -0,0 +1 @@ +.i-grid-icon{display:block;width:28px;height:28px;margin:0 auto}.i-grid-icon image{width:100%;height:100%} \ No newline at end of file diff --git a/miniprogram/dist/grid-item/index.js b/miniprogram/dist/grid-item/index.js new file mode 100644 index 0000000..e492542 --- /dev/null +++ b/miniprogram/dist/grid-item/index.js @@ -0,0 +1,16 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../grid/index': { + type: 'parent' + }, + '../grid-icon/index': { + type: 'child' + } + }, + + data: { + width: '33.33%' + } +}); diff --git a/miniprogram/dist/grid-item/index.json b/miniprogram/dist/grid-item/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/grid-item/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/grid-item/index.wxml b/miniprogram/dist/grid-item/index.wxml new file mode 100644 index 0000000..8e133cd --- /dev/null +++ b/miniprogram/dist/grid-item/index.wxml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/miniprogram/dist/grid-item/index.wxss b/miniprogram/dist/grid-item/index.wxss new file mode 100644 index 0000000..ed0f395 --- /dev/null +++ b/miniprogram/dist/grid-item/index.wxss @@ -0,0 +1 @@ +.i-grid-item{position:relative;float:left;padding:20px 10px;width:33.33333333%;box-sizing:border-box;border-right:1rpx solid #e9eaec;border-bottom:1rpx solid #e9eaec} \ No newline at end of file diff --git a/miniprogram/dist/grid-label/index.js b/miniprogram/dist/grid-label/index.js new file mode 100644 index 0000000..5315185 --- /dev/null +++ b/miniprogram/dist/grid-label/index.js @@ -0,0 +1,10 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../grid-item/index': { + type: 'parent' + } + }, + +}); diff --git a/miniprogram/dist/grid-label/index.json b/miniprogram/dist/grid-label/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/grid-label/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/grid-label/index.wxml b/miniprogram/dist/grid-label/index.wxml new file mode 100644 index 0000000..7ab5a8a --- /dev/null +++ b/miniprogram/dist/grid-label/index.wxml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/miniprogram/dist/grid-label/index.wxss b/miniprogram/dist/grid-label/index.wxss new file mode 100644 index 0000000..d45a990 --- /dev/null +++ b/miniprogram/dist/grid-label/index.wxss @@ -0,0 +1 @@ +.i-grid-label{margin-top:5px;display:block;text-align:center;color:#1c2438;font-size:14px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden} \ No newline at end of file diff --git a/miniprogram/dist/grid/index.js b/miniprogram/dist/grid/index.js new file mode 100644 index 0000000..f9c9c40 --- /dev/null +++ b/miniprogram/dist/grid/index.js @@ -0,0 +1,50 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../grid-item/index': { + type: 'child', + linked () { + this.setGridItemWidth(); + }, + linkChanged () { + this.setGridItemWidth(); + }, + unlinked () { + this.setGridItemWidth(); + } + } + }, + + methods: { + setGridItemWidth () { + const nodes = this.getRelationNodes('../grid-item/index'); + + // const len = nodes.length; + // if (len < 3) { + // nodes.forEach(item => { + // item.setData({ + // 'width': '33.33%' + // }); + // }); + // } else { + // const width = 100 / nodes.length; + // nodes.forEach(item => { + // item.setData({ + // 'width': width + '%' + // }); + // }); + // } + const width = 100 / nodes.length; + nodes.forEach(item => { + item.setData({ + 'width': width + '%' + }); + }); + } + }, + + ready () { + this.setGridItemWidth(); + } +}); diff --git a/miniprogram/dist/grid/index.json b/miniprogram/dist/grid/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/grid/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/grid/index.wxml b/miniprogram/dist/grid/index.wxml new file mode 100644 index 0000000..4c9143c --- /dev/null +++ b/miniprogram/dist/grid/index.wxml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/miniprogram/dist/grid/index.wxss b/miniprogram/dist/grid/index.wxss new file mode 100644 index 0000000..842fc98 --- /dev/null +++ b/miniprogram/dist/grid/index.wxss @@ -0,0 +1 @@ +.i-grid{border-top:1rpx solid #e9eaec;border-left:1rpx solid #e9eaec;overflow:hidden} \ No newline at end of file diff --git a/miniprogram/dist/icon/index.js b/miniprogram/dist/icon/index.js new file mode 100644 index 0000000..eb43ab9 --- /dev/null +++ b/miniprogram/dist/icon/index.js @@ -0,0 +1,22 @@ +Component({ + externalClasses: ['i-class'], + + properties: { + type: { + type: String, + value: '' + }, + custom: { + type: String, + value: '' + }, + size: { + type: Number, + value: 14 + }, + color: { + type: String, + value: '' + } + } +}); diff --git a/miniprogram/dist/icon/index.json b/miniprogram/dist/icon/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/icon/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/icon/index.wxml b/miniprogram/dist/icon/index.wxml new file mode 100644 index 0000000..d689bc5 --- /dev/null +++ b/miniprogram/dist/icon/index.wxml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/miniprogram/dist/icon/index.wxss b/miniprogram/dist/icon/index.wxss new file mode 100644 index 0000000..b18dcbb --- /dev/null +++ b/miniprogram/dist/icon/index.wxss @@ -0,0 +1 @@ +@font-face{font-family:iconfont;src:url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff')}.i-icon{display:inline-block;font-family:iconfont;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle}.i-icon-accessory:before{content:"\e6dd"}.i-icon-activity:before{content:"\e6de"}.i-icon-activity_fill:before{content:"\e6df"}.i-icon-add:before{content:"\e6e0"}.i-icon-addressbook_fill:before{content:"\e6e2"}.i-icon-addressbook:before{content:"\e6e3"}.i-icon-barrage_fill:before{content:"\e6e4"}.i-icon-barrage:before{content:"\e6e5"}.i-icon-browse_fill:before{content:"\e6e6"}.i-icon-browse:before{content:"\e6e7"}.i-icon-brush:before{content:"\e6e8"}.i-icon-brush_fill:before{content:"\e6e9"}.i-icon-businesscard_fill:before{content:"\e6ea"}.i-icon-businesscard:before{content:"\e6eb"}.i-icon-camera_fill:before{content:"\e6ec"}.i-icon-camera:before{content:"\e6ed"}.i-icon-clock_fill:before{content:"\e6ee"}.i-icon-clock:before{content:"\e6ef"}.i-icon-close:before{content:"\e6f0"}.i-icon-collection_fill:before{content:"\e6f1"}.i-icon-collection:before{content:"\e6f2"}.i-icon-computer_fill:before{content:"\e6f3"}.i-icon-computer:before{content:"\e6f4"}.i-icon-coordinates_fill:before{content:"\e6f5"}.i-icon-coordinates:before{content:"\e6f6"}.i-icon-coupons_fill:before{content:"\e6f7"}.i-icon-coupons:before{content:"\e6f8"}.i-icon-createtask_fill:before{content:"\e6f9"}.i-icon-createtask:before{content:"\e6fa"}.i-icon-customerservice_fill:before{content:"\e6fb"}.i-icon-customerservice:before{content:"\e6fc"}.i-icon-delete_fill:before{content:"\e6fd"}.i-icon-delete:before{content:"\e6fe"}.i-icon-document:before{content:"\e6ff"}.i-icon-document_fill:before{content:"\e700"}.i-icon-dynamic_fill:before{content:"\e701"}.i-icon-dynamic:before{content:"\e702"}.i-icon-editor:before{content:"\e703"}.i-icon-eit:before{content:"\e704"}.i-icon-emoji_fill:before{content:"\e705"}.i-icon-emoji:before{content:"\e706"}.i-icon-enter:before{content:"\e707"}.i-icon-enterinto:before{content:"\e708"}.i-icon-enterinto_fill:before{content:"\e709"}.i-icon-feedback_fill:before{content:"\e70a"}.i-icon-feedback:before{content:"\e70b"}.i-icon-flag_fill:before{content:"\e70c"}.i-icon-flag:before{content:"\e70d"}.i-icon-flashlight:before{content:"\e70e"}.i-icon-flashlight_fill:before{content:"\e70f"}.i-icon-fullscreen:before{content:"\e710"}.i-icon-group:before{content:"\e711"}.i-icon-group_fill:before{content:"\e712"}.i-icon-homepage_fill:before{content:"\e713"}.i-icon-homepage:before{content:"\e714"}.i-icon-integral_fill:before{content:"\e715"}.i-icon-integral:before{content:"\e716"}.i-icon-interactive_fill:before{content:"\e717"}.i-icon-interactive:before{content:"\e718"}.i-icon-keyboard:before{content:"\e719"}.i-icon-label:before{content:"\e71a"}.i-icon-label_fill:before{content:"\e71b"}.i-icon-like_fill:before{content:"\e71c"}.i-icon-like:before{content:"\e71d"}.i-icon-live_fill:before{content:"\e71e"}.i-icon-live:before{content:"\e71f"}.i-icon-lock_fill:before{content:"\e720"}.i-icon-lock:before{content:"\e721"}.i-icon-mail:before{content:"\e722"}.i-icon-mail_fill:before{content:"\e723"}.i-icon-message:before{content:"\e724"}.i-icon-message_fill:before{content:"\e725"}.i-icon-mine:before{content:"\e726"}.i-icon-mine_fill:before{content:"\e727"}.i-icon-mobilephone_fill:before{content:"\e728"}.i-icon-mobilephone:before{content:"\e729"}.i-icon-more:before{content:"\e72a"}.i-icon-narrow:before{content:"\e72b"}.i-icon-offline_fill:before{content:"\e72c"}.i-icon-offline:before{content:"\e72d"}.i-icon-other:before{content:"\e72e"}.i-icon-picture_fill:before{content:"\e72f"}.i-icon-picture:before{content:"\e730"}.i-icon-play:before{content:"\e731"}.i-icon-play_fill:before{content:"\e732"}.i-icon-playon_fill:before{content:"\e733"}.i-icon-playon:before{content:"\e734"}.i-icon-praise_fill:before{content:"\e735"}.i-icon-praise:before{content:"\e736"}.i-icon-prompt_fill:before{content:"\e737"}.i-icon-prompt:before{content:"\e738"}.i-icon-redpacket_fill:before{content:"\e739"}.i-icon-redpacket:before{content:"\e73a"}.i-icon-refresh:before{content:"\e73b"}.i-icon-remind_fill:before{content:"\e73c"}.i-icon-remind:before{content:"\e73d"}.i-icon-return:before{content:"\e73e"}.i-icon-right:before{content:"\e73f"}.i-icon-scan:before{content:"\e740"}.i-icon-send:before{content:"\e741"}.i-icon-service_fill:before{content:"\e742"}.i-icon-service:before{content:"\e743"}.i-icon-setup_fill:before{content:"\e744"}.i-icon-setup:before{content:"\e745"}.i-icon-share_fill:before{content:"\e746"}.i-icon-share:before{content:"\e747"}.i-icon-success_fill:before{content:"\e748"}.i-icon-success:before{content:"\e749"}.i-icon-suspend:before{content:"\e74a"}.i-icon-switch:before{content:"\e74b"}.i-icon-systemprompt_fill:before{content:"\e74c"}.i-icon-systemprompt:before{content:"\e74d"}.i-icon-tailor:before{content:"\e74e"}.i-icon-task:before{content:"\e74f"}.i-icon-task_fill:before{content:"\e750"}.i-icon-tasklist_fill:before{content:"\e751"}.i-icon-tasklist:before{content:"\e752"}.i-icon-time_fill:before{content:"\e753"}.i-icon-time:before{content:"\e754"}.i-icon-translation_fill:before{content:"\e755"}.i-icon-translation:before{content:"\e756"}.i-icon-trash:before{content:"\e757"}.i-icon-trash_fill:before{content:"\e758"}.i-icon-undo:before{content:"\e759"}.i-icon-video:before{content:"\e75a"}.i-icon-video_fill:before{content:"\e75b"}.i-icon-warning_fill:before{content:"\e75c"}.i-icon-warning:before{content:"\e75d"}.i-icon-search:before{content:"\e75e"}.i-icon-searchfill:before{content:"\e75f"}.i-icon-publishgoods_fill:before{content:"\e760"}.i-icon-shop_fill:before{content:"\e761"}.i-icon-transaction_fill:before{content:"\e762"}.i-icon-packup:before{content:"\e763"}.i-icon-unfold:before{content:"\e764"}.i-icon-financial_fill:before{content:"\e765"}.i-icon-commodity:before{content:"\e766"} \ No newline at end of file diff --git a/miniprogram/dist/index-item/index.js b/miniprogram/dist/index-item/index.js new file mode 100644 index 0000000..ed818df --- /dev/null +++ b/miniprogram/dist/index-item/index.js @@ -0,0 +1,32 @@ +Component({ + externalClasses: ['i-class'], + properties : { + name : { + type : String, + value : '' + } + }, + relations : { + '../index/index' : { + type : 'parent' + } + }, + data : { + top : 0, + height : 0, + currentName : '' + }, + methods: { + updateDataChange() { + const className = '.i-index-item'; + const query = wx.createSelectorQuery().in(this); + query.select( className ).boundingClientRect((res)=>{ + this.setData({ + top : res.top, + height : res.height, + currentName : this.data.name + }) + }).exec() + } + } +}) \ No newline at end of file diff --git a/miniprogram/dist/index-item/index.json b/miniprogram/dist/index-item/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/index-item/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/index-item/index.wxml b/miniprogram/dist/index-item/index.wxml new file mode 100644 index 0000000..8986c8d --- /dev/null +++ b/miniprogram/dist/index-item/index.wxml @@ -0,0 +1,11 @@ + + {{name}} + + + + + + module.exports = { + + } + diff --git a/miniprogram/dist/index-item/index.wxss b/miniprogram/dist/index-item/index.wxss new file mode 100644 index 0000000..aeecf8d --- /dev/null +++ b/miniprogram/dist/index-item/index.wxss @@ -0,0 +1 @@ +.i-index-item-header{height:30px;line-height:30px;background:#eee;font-size:14px;padding-left:10px;width:100%;box-sizing:border-box}.i-index-item-content{font-size:14px} \ No newline at end of file diff --git a/miniprogram/dist/index/index.js b/miniprogram/dist/index/index.js new file mode 100644 index 0000000..c556f19 --- /dev/null +++ b/miniprogram/dist/index/index.js @@ -0,0 +1,158 @@ +Component({ + externalClasses: ['i-class'], + properties : { + height : { + type : String, + value : '300' + }, + itemHeight : { + type : Number, + value : 18 + } + }, + relations : { + '../index-item/index' : { + type : 'child', + linked(){ + this._updateDataChange(); + }, + linkChanged () { + this._updateDataChange(); + }, + unlinked () { + this._updateDataChange(); + } + } + }, + data : { + scrollTop : 0, + fixedData : [], + current : 0, + timer : null, + startTop : 0, + itemLength : 0, + currentName : '', + isTouches : false + }, + methods : { + loop(){}, + _updateDataChange( ){ + const indexItems = this.getRelationNodes('../index-item/index'); + const len = indexItems.length; + const fixedData = this.data.fixedData; + /* + * 使用函数节流限制重复去设置数组内容进而限制多次重复渲染 + * 暂时没有研究微信在渲染的时候是否会进行函数节流 + */ + if (len > 0) { + + if( this.data.timer ){ + clearTimeout( this.data.timer ) + this.setData({ + timer : null + }) + } + + this.data.timer = setTimeout(()=>{ + const data = []; + indexItems.forEach((item) => { + if( item.data.name && fixedData.indexOf( item.data.name ) === -1 ){ + data.push(item.data.name); + item.updateDataChange(); + } + }) + this.setData({ + fixedData : data, + itemLength : indexItems.length + }) + //组件加载完成之后重新设置顶部高度 + this.setTouchStartVal(); + },0); + this.setData({ + timer : this.data.timer + }) + + } + }, + handlerScroll(event){ + const detail = event.detail; + const scrollTop = detail.scrollTop; + const indexItems = this.getRelationNodes('../index-item/index'); + indexItems.forEach((item,index)=>{ + let data = item.data; + let offset = data.top + data.height; + if( scrollTop < offset && scrollTop >= data.top ){ + this.setData({ + current : index, + currentName : data.currentName + }) + } + }) + }, + getCurrentItem(index){ + const indexItems = this.getRelationNodes('../index-item/index'); + let result = {}; + result = indexItems[index].data; + result.total = indexItems.length; + return result; + }, + triggerCallback(options){ + this.triggerEvent('change',options) + }, + handlerFixedTap(event){ + const eindex = event.currentTarget.dataset.index; + const item = this.getCurrentItem(eindex); + this.setData({ + scrollTop : item.top, + currentName : item.currentName, + isTouches : true + }) + this.triggerCallback({ + index : eindex, + current : item.currentName + }) + }, + handlerTouchMove(event){ + const data = this.data; + const touches = event.touches[0] || {}; + const pageY = touches.pageY; + const rest = pageY - data.startTop; + let index = Math.ceil( rest/data.itemHeight ); + index = index >= data.itemLength ? data.itemLength -1 : index; + const movePosition = this.getCurrentItem(index); + + /* + * 当touch选中的元素和当前currentName不相等的时候才震动一下 + * 微信震动事件 + */ + if( movePosition.name !== this.data.currentName ){ + wx.vibrateShort(); + } + + this.setData({ + scrollTop : movePosition.top, + currentName : movePosition.name, + isTouches : true + }) + + this.triggerCallback({ + index : index, + current : movePosition.name + }) + }, + handlerTouchEnd(){ + this.setData({ + isTouches : false + }) + }, + setTouchStartVal(){ + const className = '.i-index-fixed'; + const query = wx.createSelectorQuery().in(this); + query.select( className ).boundingClientRect((res)=>{ + this.setData({ + startTop : res.top + }) + }).exec() + } + } +}) \ No newline at end of file diff --git a/miniprogram/dist/index/index.json b/miniprogram/dist/index/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/index/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/index/index.wxml b/miniprogram/dist/index/index.wxml new file mode 100644 index 0000000..f83d847 --- /dev/null +++ b/miniprogram/dist/index/index.wxml @@ -0,0 +1,38 @@ + + + + + + {{item}} + + + {{currentName}} + + + + module.exports = { + setScrollStyle : function(height){ + var units = ['%','px','rem','rpx','em','rem']; + var hasUnits = false; + for( var i = 0; i < units.length;i++ ){ + var u = units[i]; + if( height.indexOf( u ) > -1 ){ + hasUnits = true; + break; + } + } + return 'height:'+ ( hasUnits ? height : height+'px' ); + } + } + diff --git a/miniprogram/dist/index/index.wxss b/miniprogram/dist/index/index.wxss new file mode 100644 index 0000000..c0887c1 --- /dev/null +++ b/miniprogram/dist/index/index.wxss @@ -0,0 +1 @@ +.i-index{width:100%;height:100%}.i-index-line{position:absolute;left:0;width:100%;height:1rpx;background-color:#f7f7f7;top:50%}.i-index-content{background:#fff;position:relative;z-index:1;display:inline-block;padding:0 10px}.i-index-fixed{position:fixed;right:0;top:50%;z-index:10;padding-left:10px;transform:translateY(-50%)}.i-index-fixed-item{display:block;height:18px;line-height:18px;padding:0 5px;text-align:center;color:#2d8cf0;font-size:12px;border-radius:50%}.i-index-fixed-item-current{background:#2d8cf0;color:#fff}.i-index-tooltip{position:fixed;left:50%;top:50%;transform:translate3d(-50%,-50%,0);background:rgba(0,0,0,.7);color:#fff;font-size:24px;border-radius:50%;width:80px;height:80px;line-height:80px;text-align:center} \ No newline at end of file diff --git a/miniprogram/dist/input-number/index.js b/miniprogram/dist/input-number/index.js new file mode 100644 index 0000000..7a7d3f5 --- /dev/null +++ b/miniprogram/dist/input-number/index.js @@ -0,0 +1,101 @@ +function addNum (num1, num2) { + let sq1, sq2, m; + try { + sq1 = num1.toString().split('.')[1].length; + } + catch (e) { + sq1 = 0; + } + try { + sq2 = num2.toString().split('.')[1].length; + } + catch (e) { + sq2 = 0; + } + m = Math.pow(10, Math.max(sq1, sq2)); + return (Math.round(num1 * m) + Math.round(num2 * m)) / m; +} + +Component({ + externalClasses: ['i-class'], + + properties: { + // small || default || large + size: String, + value: { + type: Number, + value: 1 + }, + min: { + type: Number, + value: -Infinity + }, + max: { + type: Number, + value: Infinity + }, + step: { + type: Number, + value: 1 + } + }, + + + methods: { + handleChangeStep(e, type) { + const { dataset = {} } = e.currentTarget; + const { disabled } = dataset; + const { step } = this.data; + let { value } = this.data; + + if (disabled) return null; + + if (type === 'minus') { + value = addNum(value, -step); + } else if (type === 'plus') { + value = addNum(value, step); + } + + if (value < this.data.min || value > this.data.max) return null; + + this.handleEmit(value, type); + }, + + handleMinus(e) { + this.handleChangeStep(e, 'minus'); + }, + + handlePlus(e) { + this.handleChangeStep(e, 'plus'); + }, + + handleBlur(e) { + let { value } = e.detail; + const { min, max } = this.data; + + if (!value) { + setTimeout(() => { + this.handleEmit(value); + }, 16); + return; + } + + value = +value; + if (value > max) { + value = max; + } else if (value < min) { + value = min; + } + + this.handleEmit(value); + }, + handleEmit (value, type) { + const data = { + value: value + }; + if (type) data.type = type; + + this.triggerEvent('change', data); + } + } +}); diff --git a/miniprogram/dist/input-number/index.json b/miniprogram/dist/input-number/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/input-number/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/input-number/index.wxml b/miniprogram/dist/input-number/index.wxml new file mode 100644 index 0000000..b3503f4 --- /dev/null +++ b/miniprogram/dist/input-number/index.wxml @@ -0,0 +1,5 @@ + + - + + + + diff --git a/miniprogram/dist/input-number/index.wxss b/miniprogram/dist/input-number/index.wxss new file mode 100644 index 0000000..f696bb4 --- /dev/null +++ b/miniprogram/dist/input-number/index.wxss @@ -0,0 +1 @@ +.i-input-number{color:#495060}.i-input-number view{display:inline-block;line-height:20px;padding:5px 0;text-align:center;min-width:40px;box-sizing:border-box;vertical-align:middle;font-size:12px;border:1rpx solid #dddee1}.i-input-number-minus{border-right:none;border-radius:2px 0 0 2px}.i-input-number-plus{border-left:none;border-radius:0 2px 2px 0}.i-input-number-text{border:1rpx solid #dddee1;display:inline-block;text-align:center;vertical-align:middle;height:30px;width:40px;min-height:auto;font-size:12px;line-height:30px}.i-input-number-disabled{border-color:#dddee1;color:#bbbec4;background:#f7f7f7} \ No newline at end of file diff --git a/miniprogram/dist/input/index.js b/miniprogram/dist/input/index.js new file mode 100644 index 0000000..c9d4c41 --- /dev/null +++ b/miniprogram/dist/input/index.js @@ -0,0 +1,61 @@ +Component({ + behaviors: ['wx://form-field'], + + externalClasses: ['i-class'], + + properties: { + title: { + type: String + }, + // text || textarea || password || number + type: { + type: String, + value: 'text' + }, + disabled: { + type: Boolean, + value: false + }, + placeholder: { + type: String, + value: '' + }, + autofocus: { + type: Boolean, + value: false + }, + mode: { + type: String, + value: 'normal' + }, + right: { + type: Boolean, + value: false + }, + error: { + type: Boolean, + value: false + }, + maxlength: { + type: Number + } + }, + + methods: { + handleInputChange(event) { + const { detail = {} } = event; + const { value = '' } = detail; + this.setData({ value }); + + this.triggerEvent('change', event); + }, + + handleInputFocus(event) { + this.triggerEvent('focus', event); + }, + + handleInputBlur(event) { + this.triggerEvent('blur', event); + } + } +}); diff --git a/miniprogram/dist/input/index.json b/miniprogram/dist/input/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/input/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/input/index.wxml b/miniprogram/dist/input/index.wxml new file mode 100644 index 0000000..52b0ee3 --- /dev/null +++ b/miniprogram/dist/input/index.wxml @@ -0,0 +1,31 @@ + + {{ title }} + + + diff --git a/miniprogram/dist/input/index.wxss b/miniprogram/dist/input/index.wxss new file mode 100644 index 0000000..9e7e9c1 --- /dev/null +++ b/miniprogram/dist/input/index.wxss @@ -0,0 +1 @@ +.i-cell{position:relative;padding:12px 15px;display:flex;background:#fff;align-items:center;line-height:1.4;font-size:14px;overflow:hidden}.i-cell::after{content:'';position:absolute;top:0;left:0;width:200%;height:200%;transform:scale(.5);transform-origin:0 0;pointer-events:none;box-sizing:border-box;border:0 solid #e9eaec;border-bottom-width:1px;left:15px;right:0}.i-cell-last::after{display:none}.i-cell-icon{margin-right:5px}.i-cell-icon:empty{display:none}.i-cell-bd{flex:1}.i-cell-text{line-height:24px;font-size:14px}.i-cell-desc{line-height:1.2;font-size:12px;color:#80848f}.i-cell-ft{position:relative;text-align:right;color:#495060}.i-cell-access .i-cell-ft{padding-right:13px}.i-cell-access .i-cell-ft::after{content:" ";display:inline-block;width:6px;height:6px;position:absolute;top:50%;right:2px;border-width:2px 2px 0 0;border-color:#dddee1;border-style:solid;transform:translateY(-50%) matrix(.71,.71,-.71,.71,0,0)}.i-input{padding:7px 15px;color:#495060}.i-input-wrapped{margin:10px 15px;background-color:#fff}.i-input-wrapped::after{left:0;border-width:1px;border-radius:4px}.i-input-error{color:#ed3f14}.i-input-title{color:#495060;min-width:65px;padding-right:10px}.i-input-input{flex:1;line-height:1.6;padding:4px 0;min-height:22px;height:auto;font-size:14px}.i-input-placeholder{font-size:14px}.i-input-input-right{text-align:right}.i-input.i-input-wrapped::after{display:block}.i-input-wrapped.i-input-error::after{border-color:#ed3f14} \ No newline at end of file diff --git a/miniprogram/dist/load-more/index.js b/miniprogram/dist/load-more/index.js new file mode 100644 index 0000000..d0cd46c --- /dev/null +++ b/miniprogram/dist/load-more/index.js @@ -0,0 +1,14 @@ +Component({ + externalClasses: ['i-class'], + + properties: { + loading: { + type: Boolean, + value: true + }, + tip: { + type: String, + value: '' + } + }, +}); diff --git a/miniprogram/dist/load-more/index.json b/miniprogram/dist/load-more/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/load-more/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/load-more/index.wxml b/miniprogram/dist/load-more/index.wxml new file mode 100644 index 0000000..66571af --- /dev/null +++ b/miniprogram/dist/load-more/index.wxml @@ -0,0 +1,8 @@ + + + + {{ tip }} + 正在加载 + + + \ No newline at end of file diff --git a/miniprogram/dist/load-more/index.wxss b/miniprogram/dist/load-more/index.wxss new file mode 100644 index 0000000..ffe4026 --- /dev/null +++ b/miniprogram/dist/load-more/index.wxss @@ -0,0 +1 @@ +.i-load-more{width:65%;margin:1.5em auto;line-height:1.6em;font-size:14px;text-align:center}.i-load-more-loading{display:inline-block;margin-right:12px;vertical-align:middle;width:14px;height:14px;background:0 0;border-radius:50%;border:2px solid #e9eaec;border-color:#e9eaec #e9eaec #e9eaec #2d8cf0;animation:btn-spin .6s linear;animation-iteration-count:infinite}.i-load-more-tip{display:inline-block;vertical-align:middle;color:#495060}.i-load-more-line{border-top:1px solid #dddee1;display:flex;border-top:0}.i-load-more-line::before{position:relative;top:-1px;-webkit-box-flex:1;-webkit-flex:1;flex:1;content:'';border-top:1px solid #dddee1}.i-load-more-line::after{position:relative;top:-1px;-webkit-box-flex:1;-webkit-flex:1;flex:1;content:'';border-top:1px solid #dddee1}.i-load-more-line .i-load-more-tip{position:relative;top:-.9em;padding:0 .55em}.i-load-more-empty{width:4px;height:4px;border-radius:50%;background-color:#e5e5e5;display:inline-block;position:relative;vertical-align:0;top:-.16em}@keyframes btn-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/miniprogram/dist/message/index.js b/miniprogram/dist/message/index.js new file mode 100644 index 0000000..21a6d68 --- /dev/null +++ b/miniprogram/dist/message/index.js @@ -0,0 +1,45 @@ +const default_data = { + visible: false, + content: '', + duration: 2, + type: 'default', // default || success || warning || error +}; + +let timmer = null; + +Component({ + externalClasses: ['i-class'], + + data: { + ...default_data + }, + + methods: { + handleShow (options) { + const { type = 'default', duration = 2 } = options; + + this.setData({ + ...options, + type, + duration, + visible: true + }); + + const d = this.data.duration * 1000; + + if (timmer) clearTimeout(timmer); + if (d !== 0) { + timmer = setTimeout(() => { + this.handleHide(); + timmer = null; + }, d); + } + }, + + handleHide () { + this.setData({ + ...default_data + }); + } + } +}); \ No newline at end of file diff --git a/miniprogram/dist/message/index.json b/miniprogram/dist/message/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/message/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/message/index.wxml b/miniprogram/dist/message/index.wxml new file mode 100644 index 0000000..aecaad9 --- /dev/null +++ b/miniprogram/dist/message/index.wxml @@ -0,0 +1,3 @@ + + {{ content }} + \ No newline at end of file diff --git a/miniprogram/dist/message/index.wxss b/miniprogram/dist/message/index.wxss new file mode 100644 index 0000000..e6a79a6 --- /dev/null +++ b/miniprogram/dist/message/index.wxss @@ -0,0 +1 @@ +.i-message{display:block;width:100%;min-height:32px;line-height:2.3;position:fixed;top:0;left:0;right:0;background:#2d8cf0;color:#fff;text-align:center;font-size:14px;z-index:1010;opacity:0;-webkit-transform:translateZ(0) translateY(-100%);transition:all .4s ease-in-out}.i-message-show{-webkit-transform:translateZ(0) translateY(0);opacity:1}.i-message-default{background:#2d8cf0}.i-message-success{background:#19be6b}.i-message-warning{background:#f90}.i-message-error{background:#ed3f14} \ No newline at end of file diff --git a/miniprogram/dist/modal/index.js b/miniprogram/dist/modal/index.js new file mode 100644 index 0000000..ae178e5 --- /dev/null +++ b/miniprogram/dist/modal/index.js @@ -0,0 +1,54 @@ +Component({ + externalClasses: ['i-class', 'i-class-mask'], + + properties: { + visible: { + type: Boolean, + value: false + }, + title: { + type: String, + value: '' + }, + showOk: { + type: Boolean, + value: true + }, + showCancel: { + type: Boolean, + value: true + }, + okText: { + type: String, + value: '确定' + }, + cancelText: { + type: String, + value: '取消' + }, + // 按钮组,有此值时,不显示 ok 和 cancel 按钮 + actions: { + type: Array, + value: [] + }, + // horizontal || vertical + actionMode: { + type: String, + value: 'horizontal' + } + }, + + methods: { + handleClickItem ({ currentTarget = {} }) { + const dataset = currentTarget.dataset || {}; + const { index } = dataset; + this.triggerEvent('click', { index }); + }, + handleClickOk () { + this.triggerEvent('ok'); + }, + handleClickCancel () { + this.triggerEvent('cancel'); + } + } +}); diff --git a/miniprogram/dist/modal/index.json b/miniprogram/dist/modal/index.json new file mode 100644 index 0000000..50d034a --- /dev/null +++ b/miniprogram/dist/modal/index.json @@ -0,0 +1,9 @@ +{ + "component": true, + "usingComponents": { + "i-grid": "../grid/index", + "i-grid-item": "../grid-item/index", + "i-button": "../button/index", + "i-icon": "../icon/index" + } +} diff --git a/miniprogram/dist/modal/index.wxml b/miniprogram/dist/modal/index.wxml new file mode 100644 index 0000000..11bcbd4 --- /dev/null +++ b/miniprogram/dist/modal/index.wxml @@ -0,0 +1,40 @@ + + + + + {{ title }} + + + + + + + + + + + + + + + + + + + {{ cancelText }} + + + {{ okText }} + + + + + + + \ No newline at end of file diff --git a/miniprogram/dist/modal/index.wxss b/miniprogram/dist/modal/index.wxss new file mode 100644 index 0000000..d1c42fc --- /dev/null +++ b/miniprogram/dist/modal/index.wxss @@ -0,0 +1 @@ +.i-modal{position:fixed;overflow:auto;top:0;right:0;bottom:0;left:0;height:100%;z-index:1000;display:flex;outline:0;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;transform:translateZ(1px);opacity:0;visibility:hidden}.i-modal-show{visibility:visible;opacity:1}.i-modal-mask{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7);z-index:1000;transition:all .2s ease-in-out;opacity:0;visibility:hidden}.i-modal-mask-show{opacity:1;visibility:visible}.i-modal-main{width:270px;position:relative}.i-modal-content{border-radius:7px;padding-top:15px;position:relative;background-color:#fff;border:0;background-clip:padding-box;text-align:center;height:100%;overflow:hidden}.i-modal-body{max-height:100px;margin-bottom:15px;font-size:14px;color:#80848f;height:100%;line-height:1.5;overflow:auto}.i-modal-title{padding:6px 15px 15px;margin:0;font-size:18px;line-height:1;color:#1c2438;text-align:center}.i-modal-actions{margin:0 1px}.i-modal-action-vertical{position:relative}.i-modal-action-vertical:after{content:'';position:absolute;top:0;left:0;width:200%;height:200%;transform:scale(.5);transform-origin:0 0;pointer-events:none;box-sizing:border-box;border:0 solid #e9eaec;border-top-width:1px}.i-modal-grid{border-radius:0 0 7px 7px;border-left:none}.i-modal-grid-item,.i-modal-grid-item-last{padding:0;border-bottom:none}.i-modal-grid-item-last{border-right:none}.i-modal-btn-ok{color:#2d8cf0!important}.i-modal-btn-loading{display:inline-block;vertical-align:middle;margin-right:10px;width:12px;height:12px;background:0 0;border-radius:50%;border:2px solid #e5e5e5;border-color:#666 #e5e5e5 #e5e5e5 #e5e5e5;animation:btn-spin .6s linear;animation-iteration-count:infinite}.i-modal-btn-text{display:inline-block;vertical-align:middle}.i-modal-btn-icon{font-size:14px!important;margin-right:4px}@keyframes btn-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/miniprogram/dist/notice-bar/index.js b/miniprogram/dist/notice-bar/index.js new file mode 100644 index 0000000..7043dbd --- /dev/null +++ b/miniprogram/dist/notice-bar/index.js @@ -0,0 +1,112 @@ +const VALID_MODE = ['closeable']; +const FONT_COLOR = '#f60'; +const BG_COLOR = '#fff7cc'; + +Component({ + externalClasses: ['i-class'], + + properties: { + closable: { + type: Boolean, + value: false + }, + icon: { + type: String, + value: '' + }, + loop: { + type: Boolean, + value: false + }, + // 背景颜色 + backgroundcolor: { + type: String, + value: '#fefcec' + }, + // 字体及图标颜色 + color: { + type: String, + value: '#f76a24' + }, + // 滚动速度 + speed: { + type: Number, + value: 1000 + } + }, + + data: { + show: true, + wrapWidth: 0, + width: 0, + duration: 0, + animation: null, + timer: null, + }, + detached() { + this.destroyTimer(); + }, + ready() { + if (this.data.loop) { + this.initAnimation(); + } + }, + + methods: { + initAnimation() { + wx.createSelectorQuery().in(this).select('.i-noticebar-content-wrap').boundingClientRect((wrapRect) => { + wx.createSelectorQuery().in(this).select('.i-noticebar-content').boundingClientRect((rect) => { + const duration = rect.width / 40 * this.data.speed; + const animation = wx.createAnimation({ + duration: duration, + timingFunction: "linear", + }); + this.setData({ + wrapWidth: wrapRect.width, + width: rect.width, + duration: duration, + animation: animation + }, () => { + this.startAnimation(); + }); + }).exec(); + + }).exec(); + }, + startAnimation() { + //reset + if (this.data.animation.option.transition.duration !== 0) { + this.data.animation.option.transition.duration = 0; + const resetAnimation = this.data.animation.translateX(this.data.wrapWidth).step(); + this.setData({ + animationData: resetAnimation.export() + }); + } + this.data.animation.option.transition.duration = this.data.duration; + const animationData = this.data.animation.translateX(-this.data.width).step(); + setTimeout(() => { + this.setData({ + animationData: animationData.export() + }); + }, 100); + const timer = setTimeout(() => { + this.startAnimation(); + }, this.data.duration); + this.setData({ + timer, + }); + }, + destroyTimer() { + if (this.data.timer) { + clearTimeout(this.data.timer); + } + }, + handleClose() { + this.destroyTimer(); + this.setData({ + show: false, + timer: null + }); + } + } +}); diff --git a/miniprogram/dist/notice-bar/index.json b/miniprogram/dist/notice-bar/index.json new file mode 100644 index 0000000..db3afc0 --- /dev/null +++ b/miniprogram/dist/notice-bar/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": + { + "i-icon": "../icon/index" + } +} diff --git a/miniprogram/dist/notice-bar/index.wxml b/miniprogram/dist/notice-bar/index.wxml new file mode 100644 index 0000000..5de1e11 --- /dev/null +++ b/miniprogram/dist/notice-bar/index.wxml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/miniprogram/dist/notice-bar/index.wxss b/miniprogram/dist/notice-bar/index.wxss new file mode 100644 index 0000000..9ea2aa7 --- /dev/null +++ b/miniprogram/dist/notice-bar/index.wxss @@ -0,0 +1 @@ +.i-noticebar{display:flex;height:72rpx;line-height:72rpx;font-size:14px;color:#f76a24;background-color:#fefcec;overflow:hidden}.i-noticebar-icon{display:flex;margin-left:30rpx;align-items:center}.i-noticebar-icon+view{margin-left:10rpx}.i-noticebar-operation{display:flex;margin-right:16rpx;align-items:center}.i-noticebar-content-wrap{position:relative;flex:1;margin:0 30rpx;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.i-noticebar-content-wrap .i-noticebar-content{position:absolute;transition-duration:20s} \ No newline at end of file diff --git a/miniprogram/dist/page/index.js b/miniprogram/dist/page/index.js new file mode 100644 index 0000000..e0f44c5 --- /dev/null +++ b/miniprogram/dist/page/index.js @@ -0,0 +1,42 @@ +Component({ + externalClasses: ['i-class'], + + options: { + multipleSlots: true + }, + + properties: { + // button || number || pointer + mode: { + type: String, + value: 'button' + }, + current: { + type: Number, + value: 1 + }, + total: { + type: Number, + value: 0 + }, + // 是否隐藏数值 + simple: { + type: Boolean, + value: false + } + }, + + methods: { + handleChange (type) { + this.triggerEvent('change', { + type: type + }); + }, + handlePrev () { + this.handleChange('prev'); + }, + handleNext () { + this.handleChange('next'); + } + } +}); diff --git a/miniprogram/dist/page/index.json b/miniprogram/dist/page/index.json new file mode 100644 index 0000000..7b1a128 --- /dev/null +++ b/miniprogram/dist/page/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": + { + "i-button": "../button/index" + } +} diff --git a/miniprogram/dist/page/index.wxml b/miniprogram/dist/page/index.wxml new file mode 100644 index 0000000..a84d47b --- /dev/null +++ b/miniprogram/dist/page/index.wxml @@ -0,0 +1,14 @@ + + + + + + {{ current }}/{{total}} + + + + + + + + diff --git a/miniprogram/dist/page/index.wxss b/miniprogram/dist/page/index.wxss new file mode 100644 index 0000000..06c5c3b --- /dev/null +++ b/miniprogram/dist/page/index.wxss @@ -0,0 +1 @@ +.i-page{display:block;width:100%;height:44px;overflow:hidden;box-sizing:border-box;position:relative}.i-page-prev{position:absolute;left:10px;top:0}.i-page-next{position:absolute;right:10px;top:0}.i-page-number{width:100%;height:44px;line-height:44px;margin:0 auto;text-align:center}.i-page-number-current{display:inline;color:#2d8cf0}.i-page-pointer{width:100%;height:44px;line-height:44px;margin:0 auto;text-align:center}.i-page-pointer-dot{display:inline-block;width:8px;height:8px;margin:0 2px;border-radius:50%;background:#bbbec4}.i-page-pointer-dot.current{background:#80848f}.i-page-button{display:inline-block;margin:0} \ No newline at end of file diff --git a/miniprogram/dist/panel/index.js b/miniprogram/dist/panel/index.js new file mode 100644 index 0000000..b572da5 --- /dev/null +++ b/miniprogram/dist/panel/index.js @@ -0,0 +1,19 @@ +Component({ + externalClasses: ['i-class'], + + properties: { + title: { + type: String, + value: '' + }, + // 标题顶部距离 + hideTop: { + type: Boolean, + value: false + }, + hideBorder: { + type: Boolean, + value: false + } + } +}); diff --git a/miniprogram/dist/panel/index.json b/miniprogram/dist/panel/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/panel/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/panel/index.wxml b/miniprogram/dist/panel/index.wxml new file mode 100644 index 0000000..aa91c20 --- /dev/null +++ b/miniprogram/dist/panel/index.wxml @@ -0,0 +1,4 @@ + + {{ title }} + + diff --git a/miniprogram/dist/panel/index.wxss b/miniprogram/dist/panel/index.wxss new file mode 100644 index 0000000..edee3b8 --- /dev/null +++ b/miniprogram/dist/panel/index.wxss @@ -0,0 +1 @@ +.i-panel{position:relative;overflow:hidden}.i-panel-title{font-size:14px;line-height:1;color:#1c2438;padding:20px 16px 10px}.i-panel-title-hide-top{padding-top:0}.i-panel-content{position:relative;background:#fff;overflow:hidden}.i-panel-content::after{content:'';position:absolute;top:0;left:0;width:200%;height:200%;transform:scale(.5);transform-origin:0 0;pointer-events:none;box-sizing:border-box;border:0 solid #e9eaec;border-top-width:1px;border-bottom-width:1px}.i-panel-without-border::after{border:0 none} \ No newline at end of file diff --git a/miniprogram/dist/progress/index.js b/miniprogram/dist/progress/index.js new file mode 100644 index 0000000..b87b962 --- /dev/null +++ b/miniprogram/dist/progress/index.js @@ -0,0 +1,23 @@ +Component({ + externalClasses: ['i-class'], + + properties: { + percent: { + type: Number, + value: 0 + }, + // normal || active || wrong || success + status: { + type: String, + value: 'normal' + }, + strokeWidth: { + type: Number, + value: 10 + }, + hideInfo: { + type: Boolean, + value: false + } + } +}); diff --git a/miniprogram/dist/progress/index.json b/miniprogram/dist/progress/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/progress/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/progress/index.wxml b/miniprogram/dist/progress/index.wxml new file mode 100644 index 0000000..09b5abc --- /dev/null +++ b/miniprogram/dist/progress/index.wxml @@ -0,0 +1,10 @@ + + + + + + + + {{ percent }}% + + \ No newline at end of file diff --git a/miniprogram/dist/progress/index.wxss b/miniprogram/dist/progress/index.wxss new file mode 100644 index 0000000..21b9d9c --- /dev/null +++ b/miniprogram/dist/progress/index.wxss @@ -0,0 +1 @@ +.i-progress{display:inline-block;width:100%;font-size:12px;position:relative}.i-progress-outer{display:inline-block;width:100%;margin-right:0;padding-right:0;box-sizing:border-box}.i-progress-show-info .i-progress-outer{padding-right:55px;margin-right:-55px}.i-progress-inner{display:inline-block;width:100%;background-color:#f3f3f3;border-radius:100px;vertical-align:middle}.i-progress-bg{border-radius:100px;background-color:#2db7f5;transition:all .2s linear;position:relative}.i-progress-text{display:inline-block;margin-left:5px;text-align:left;font-size:1em;vertical-align:middle}.i-progress-active .i-progress-bg:before{content:'';opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;border-radius:10px;animation:i-progress-active 2s ease-in-out infinite}.i-progress-wrong .i-progress-bg{background-color:#ed3f14}.i-progress-wrong .i-progress-text{color:#ed3f14}.i-progress-success .i-progress-bg{background-color:#19be6b}.i-progress-success .i-progress-text{color:#19be6b}@keyframes i-progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}} \ No newline at end of file diff --git a/miniprogram/dist/radio-group/index.js b/miniprogram/dist/radio-group/index.js new file mode 100644 index 0000000..db76e41 --- /dev/null +++ b/miniprogram/dist/radio-group/index.js @@ -0,0 +1,38 @@ +Component({ + externalClasses: ['i-class'], + relations: { + '../radio/index': { + type: 'child', + linked() { + this.changeCurrent(); + }, + linkChanged() { + this.changeCurrent(); + }, + unlinked() { + this.changeCurrent(); + } + } + }, + properties: { + current: { + type: String, + value: '', + observer: 'changeCurrent' + }, + }, + methods: { + changeCurrent(val = this.data.current) { + let items = this.getRelationNodes('../radio/index'); + const len = items.length; + if (len > 0) { + items.forEach(item => { + item.changeCurrent(val === item.data.value); + }); + } + }, + emitEvent(current) { + this.triggerEvent('change', current); + } + } +}); diff --git a/miniprogram/dist/radio-group/index.json b/miniprogram/dist/radio-group/index.json new file mode 100644 index 0000000..edf138d --- /dev/null +++ b/miniprogram/dist/radio-group/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": + { + "i-cell-group": "../cell-group/index" + } +} diff --git a/miniprogram/dist/radio-group/index.wxml b/miniprogram/dist/radio-group/index.wxml new file mode 100644 index 0000000..6940180 --- /dev/null +++ b/miniprogram/dist/radio-group/index.wxml @@ -0,0 +1,3 @@ + + + diff --git a/miniprogram/dist/radio-group/index.wxss b/miniprogram/dist/radio-group/index.wxss new file mode 100644 index 0000000..e69de29 diff --git a/miniprogram/dist/radio/index.js b/miniprogram/dist/radio/index.js new file mode 100644 index 0000000..cb73db5 --- /dev/null +++ b/miniprogram/dist/radio/index.js @@ -0,0 +1,56 @@ +const prefixCls = 'i-radio'; + +Component({ + externalClasses: ['i-class'], + relations: { + '../radio-group/index': { + type: 'parent' + } + }, + properties: { + value: { + type: String, + value: '' + }, + checked: { + type: Boolean, + value: false + }, + disabled: { + type: Boolean, + value: false + }, + color: { + type: String, + value: '#2d8cf0' + }, + position: { + type: String, + value: 'left', //left right + observer: 'setPosition' + } + }, + data: { + checked: true, + positionCls: `${prefixCls}-radio-left`, + }, + attached() { + this.setPosition(); + }, + methods: { + changeCurrent(current) { + this.setData({ checked: current }); + }, + radioChange() { + if (this.data.disabled) return; + const item = { current: !this.data.checked, value: this.data.value }; + const parent = this.getRelationNodes('../radio-group/index')[0]; + parent ? parent.emitEvent(item) : this.triggerEvent('change', item); + }, + setPosition() { + this.setData({ + positionCls: this.data.position.indexOf('left') !== -1 ? `${prefixCls}-radio-left` : `${prefixCls}-radio-right`, + }); + } + } +}); diff --git a/miniprogram/dist/radio/index.json b/miniprogram/dist/radio/index.json new file mode 100644 index 0000000..e2ab49a --- /dev/null +++ b/miniprogram/dist/radio/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": + { + "i-cell": "../cell/index" + } +} diff --git a/miniprogram/dist/radio/index.wxml b/miniprogram/dist/radio/index.wxml new file mode 100644 index 0000000..1e20b79 --- /dev/null +++ b/miniprogram/dist/radio/index.wxml @@ -0,0 +1,8 @@ + + + + + diff --git a/miniprogram/dist/radio/index.wxss b/miniprogram/dist/radio/index.wxss new file mode 100644 index 0000000..c52b211 --- /dev/null +++ b/miniprogram/dist/radio/index.wxss @@ -0,0 +1 @@ +.i-radio-cell::after{display:block}.i-radio-radio-left{float:left}.i-radio-radio-right{float:right}.i-radio-radio{vertical-align:middle}.i-radio-title{display:inline-block;vertical-align:middle} \ No newline at end of file diff --git a/miniprogram/dist/rate/index.js b/miniprogram/dist/rate/index.js new file mode 100644 index 0000000..a7e374a --- /dev/null +++ b/miniprogram/dist/rate/index.js @@ -0,0 +1,69 @@ +Component({ + externalClasses: ['i-class'], + properties : { + count : { + type : Number, + value : 5 + }, + value : { + type : Number, + value : 0 + }, + disabled : { + type : Boolean, + value : false + }, + size : { + type : Number, + value : 20 + }, + name : { + type : String, + value : '' + } + }, + data : { + touchesStart : { + pageX : 0 + } + }, + methods : { + handleClick(e){ + const data = this.data; + if( data.disabled ){ + return; + } + const index = e.currentTarget.dataset.index; + this.triggerEvent('change',{ + index : index + 1 + }) + }, + handleTouchMove(e){ + const data = this.data; + if( data.disabled ){ + return; + } + if( !e.changedTouches[0] ){ + return; + } + const movePageX = e.changedTouches[0].pageX; + const space = movePageX - data.touchesStart.pageX; + + if( space <= 0 ){ + return; + } + let setIndex = Math.ceil( space/data.size ); + setIndex = setIndex > data.count ? data.count : setIndex ; + this.triggerEvent('change',{ + index : setIndex + }) + } + }, + ready(){ + const className = '.i-rate'; + var query = wx.createSelectorQuery().in(this) + query.select( className ).boundingClientRect((res)=>{ + this.data.touchesStart.pageX = res.left || 0; + }).exec() + } +}); diff --git a/miniprogram/dist/rate/index.json b/miniprogram/dist/rate/index.json new file mode 100644 index 0000000..687543c --- /dev/null +++ b/miniprogram/dist/rate/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents":{ + "i-icon": "../icon/index" + } +} diff --git a/miniprogram/dist/rate/index.wxml b/miniprogram/dist/rate/index.wxml new file mode 100644 index 0000000..d600660 --- /dev/null +++ b/miniprogram/dist/rate/index.wxml @@ -0,0 +1,23 @@ + + + + + + + + +var prefixCls = 'i-rate'; +module.exports = { + getCurrent : function( value,index ){ + if( index < value ){ + return prefixCls + '-current' + } + } +} + diff --git a/miniprogram/dist/rate/index.wxss b/miniprogram/dist/rate/index.wxss new file mode 100644 index 0000000..e889107 --- /dev/null +++ b/miniprogram/dist/rate/index.wxss @@ -0,0 +1 @@ +.i-rate{margin:0;padding:0;font-size:20px;display:inline-block;vertical-align:middle;font-weight:400;font-style:normal}.i-rate-hide-input{display:none}.i-rate-star{display:inline-block;color:#e9e9e9}.i-rate-current{color:#f5a623}.i-rate-text{display:inline-block;vertical-align:middle;margin-left:6px;font-size:14px} \ No newline at end of file diff --git a/miniprogram/dist/row/index.js b/miniprogram/dist/row/index.js new file mode 100644 index 0000000..3428387 --- /dev/null +++ b/miniprogram/dist/row/index.js @@ -0,0 +1,9 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../col/index': { + type: 'child' + } + } +}); diff --git a/miniprogram/dist/row/index.json b/miniprogram/dist/row/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/row/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/row/index.wxml b/miniprogram/dist/row/index.wxml new file mode 100644 index 0000000..fe8159e --- /dev/null +++ b/miniprogram/dist/row/index.wxml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/miniprogram/dist/row/index.wxss b/miniprogram/dist/row/index.wxss new file mode 100644 index 0000000..3b8b432 --- /dev/null +++ b/miniprogram/dist/row/index.wxss @@ -0,0 +1 @@ +.i-row:after{content:"";display:table;clear:both} \ No newline at end of file diff --git a/miniprogram/dist/slide/index.js b/miniprogram/dist/slide/index.js new file mode 100644 index 0000000..a397f4f --- /dev/null +++ b/miniprogram/dist/slide/index.js @@ -0,0 +1,15 @@ +Component({ + externalClasses: ['i-class'], + options: { + // 在组件定义时的选项中启用多slot支持 + multipleSlots: true + }, + methods : { + handleTap2(){ + console.log(event,1111111) + }, + handleTap3(){ + + } + } +}); diff --git a/miniprogram/dist/slide/index.json b/miniprogram/dist/slide/index.json new file mode 100644 index 0000000..6b1e67d --- /dev/null +++ b/miniprogram/dist/slide/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": + { + "i-button": "../button/index", + "i-icon": "../icon/index" + } +} diff --git a/miniprogram/dist/slide/index.wxml b/miniprogram/dist/slide/index.wxml new file mode 100644 index 0000000..a13c673 --- /dev/null +++ b/miniprogram/dist/slide/index.wxml @@ -0,0 +1,4 @@ + + 1111 + + \ No newline at end of file diff --git a/miniprogram/dist/slide/index.wxss b/miniprogram/dist/slide/index.wxss new file mode 100644 index 0000000..e69de29 diff --git a/miniprogram/dist/spin/index.js b/miniprogram/dist/spin/index.js new file mode 100644 index 0000000..3297f81 --- /dev/null +++ b/miniprogram/dist/spin/index.js @@ -0,0 +1,23 @@ +Component({ + externalClasses: ['i-class'], + + properties: { + // small || default || large + size: { + type: String, + value: 'default' + }, + fix: { + type: Boolean, + value: false + }, + fullscreen: { + type: Boolean, + value: false + }, + custom: { + type: Boolean, + value: false + } + } +}); diff --git a/miniprogram/dist/spin/index.json b/miniprogram/dist/spin/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/spin/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/spin/index.wxml b/miniprogram/dist/spin/index.wxml new file mode 100644 index 0000000..8c25439 --- /dev/null +++ b/miniprogram/dist/spin/index.wxml @@ -0,0 +1,6 @@ + +
+ +
+
+
diff --git a/miniprogram/dist/spin/index.wxss b/miniprogram/dist/spin/index.wxss new file mode 100644 index 0000000..8ed714a --- /dev/null +++ b/miniprogram/dist/spin/index.wxss @@ -0,0 +1 @@ +.i-spin{color:#2d8cf0;vertical-align:middle;text-align:center}.i-spin-dot{position:relative;display:block;border-radius:50%;background-color:#2d8cf0;width:20px;height:20px;animation:ani-spin-bounce 1s 0s ease-in-out infinite}.i-spin-large .i-spin-dot{width:32px;height:32px}.i-spin-small .i-spin-dot{width:12px;height:12px}.i-spin-fix{position:absolute;top:0;left:0;z-index:8;width:100%;height:100%;background-color:rgba(255,255,255,.9)}.i-spin-fullscreen{z-index:2010}.i-spin-fullscreen-wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.i-spin-fix .i-spin-main{position:absolute;top:50%;left:50%;-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.i-spin-fix .i-spin-dot{display:inline-block}.i-spin-show-text .i-spin-dot,.i-spin-text{display:none}.i-spin-show-text .i-spin-text{display:block;font-size:14px}@keyframes ani-spin-bounce{0%{transform:scale(0)}100%{transform:scale(1);opacity:0}} \ No newline at end of file diff --git a/miniprogram/dist/step/index.js b/miniprogram/dist/step/index.js new file mode 100644 index 0000000..06a81a2 --- /dev/null +++ b/miniprogram/dist/step/index.js @@ -0,0 +1,52 @@ +Component({ + externalClasses: ['i-class'], + properties : { + status : { + type : String, + //wait、process、finish、error + value : '' + }, + title : { + type : String, + value : '' + }, + content : { + type : String, + value : '' + }, + icon : { + type : String, + value : '' + } + }, + options: { + // 在组件定义时的选项中启用多slot支持 + multipleSlots: true + }, + relations : { + '../steps/index' : { + type : 'parent' + } + }, + data : { + //step length + len : 1, + //current in step index + index : 0, + //parent component select current index + current : 0, + //css direction + direction : 'horizontal' + }, + methods : { + updateDataChange( options ){ + this.setData({ + len : options.len, + index : options.index, + current : options.current, + direction : options.direction + }) + } + } + +}) \ No newline at end of file diff --git a/miniprogram/dist/step/index.json b/miniprogram/dist/step/index.json new file mode 100644 index 0000000..ffb5dee --- /dev/null +++ b/miniprogram/dist/step/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": + { + "i-icon": "../icon/index" + } +} diff --git a/miniprogram/dist/step/index.wxml b/miniprogram/dist/step/index.wxml new file mode 100644 index 0000000..63549dc --- /dev/null +++ b/miniprogram/dist/step/index.wxml @@ -0,0 +1,70 @@ + + + {{ index+1 }} + + + + + + + + {{title}} + + + + + + {{content}} + + + + + + + +var allStatus = ['wait','process','finish','error']; +module.exports = { + noIco : function( status,current,index,icon ){ + var aindex = allStatus.indexOf(status); + var noIcon = true; + if( index < current || icon !== '' ){ + noIcon = false; + } + return noIcon; + }, + getIcoClass : function( status,ico ){ + var class = ''; + if( status === 'error' ){ + class = 'close'; + }else{ + class = 'right'; + } + if( ico !== '' ){ + class = ico; + } + return class; + }, + getItemStyle : function(len,direction){ + if( direction === 'horizontal' ){ + return 'width :'+100/len + '%'; + }else{ + return 'width : 100%;'; + } + }, + getClass : function( status,current,index ) { + //wait、process、finish、error + var startClass = 'i-step-' + var classes = ''; + var cindex = allStatus.indexOf( status ); + if( cindex !== -1 ){ + classes = startClass + allStatus[cindex]; + } + if( index < current ){ + classes = startClass + 'finish'; + }else if( index === current ){ + classes = startClass + 'process'; + } + return classes; + } +} + \ No newline at end of file diff --git a/miniprogram/dist/step/index.wxss b/miniprogram/dist/step/index.wxss new file mode 100644 index 0000000..284b42a --- /dev/null +++ b/miniprogram/dist/step/index.wxss @@ -0,0 +1 @@ +.i-step-ico{width:24px;height:100%;border-radius:100%;background:#fff;position:relative;z-index:2;margin:0 auto;border:#dddee1 solid 1px}.i-step-ico-in{vertical-align:baseline}.i-step-line{position:absolute;left:50%;top:12px;width:100%;height:1px;background:#dddee1}.i-step-horizontal .i-step-ico::after{position:absolute;top:11px;left:23px;z-index:1;content:'';height:1px;background:#fff;width:10px}.i-step-horizontal .i-step-item-main{text-align:center}.i-step-horizontal .i-step-ico::before{position:absolute;top:11px;left:-11px;z-index:1;content:'';height:1px;background:#fff;width:10px}.i-step-ico{box-sizing:border-box;font-size:12px}.i-step-process .i-step-ico{border:#2d8cf0 solid 1px;color:#fff;background:#2d8cf0}.i-step-wait .i-step-ico{border:#e9eaec solid 1px;color:#e9eaec}.i-step-wait .i-step-line{background:#2d8cf0}.i-step-finish .i-step-ico{border:#2d8cf0 solid 1px;color:#2d8cf0}.i-step-finish .i-step-line{background:#2d8cf0}.i-step-error .i-step-ico{border:#ed3f14 solid 1px;color:#ed3f14}.i-step-error .i-step-line{background:#ed3f14}.i-step-item{font-size:12px;position:relative;display:inline-block;box-sizing:border-box;padding-left:10px;vertical-align:top}.i-step-item-ico{width:100%;height:24px;line-height:24px;text-align:center}.i-step-item-main{margin-top:10px;clear:both}.i-step-item-title{font-size:14px;font-weight:700;color:#1c2438}.i-step-item-content{font-size:12px;font-weight:700;margin-top:2px;color:#80848f}.i-step-vertical{padding-bottom:30px}.i-step-vertical .i-step-item-ico{width:24px;float:left}.i-step-vertical .i-step-item-main{margin-left:40px;margin-top:0;clear:inherit}.i-step-vertical .i-step-line{position:absolute;height:100%;top:0;left:10px;margin:0 0 0 12px;width:1px} \ No newline at end of file diff --git a/miniprogram/dist/steps/index.js b/miniprogram/dist/steps/index.js new file mode 100644 index 0000000..06bed88 --- /dev/null +++ b/miniprogram/dist/steps/index.js @@ -0,0 +1,50 @@ +Component({ + externalClasses: ['i-class'], + properties : { + current : { + type : Number, + value : -1, + observer : '_updateDataChange' + }, + status : { + type : String, + //wait、process、finish、error + value : '' + }, + direction : { + type : String, + //value has horizontal or vertical + value : 'horizontal' + } + }, + relations : { + '../step/index' : { + type : 'child', + linked(){ + this._updateDataChange(); + }, + linkChanged () { + this._updateDataChange(); + }, + unlinked () { + this._updateDataChange(); + } + } + }, + methods: { + _updateDataChange() { + let steps = this.getRelationNodes('../step/index'); + const len = steps.length; + if (len > 0) { + steps.forEach((step, index) => { + step.updateDataChange({ + len : len, + index : index, + current : this.data.current, + direction : this.data.direction + }); + }); + } + } + } +}) \ No newline at end of file diff --git a/miniprogram/dist/steps/index.json b/miniprogram/dist/steps/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/steps/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/steps/index.wxml b/miniprogram/dist/steps/index.wxml new file mode 100644 index 0000000..d9c7942 --- /dev/null +++ b/miniprogram/dist/steps/index.wxml @@ -0,0 +1,3 @@ + + + diff --git a/miniprogram/dist/steps/index.wxss b/miniprogram/dist/steps/index.wxss new file mode 100644 index 0000000..616ed04 --- /dev/null +++ b/miniprogram/dist/steps/index.wxss @@ -0,0 +1 @@ +.i-steps{width:100%} \ No newline at end of file diff --git a/miniprogram/dist/sticky-item/index.js b/miniprogram/dist/sticky-item/index.js new file mode 100644 index 0000000..4fc3dbe --- /dev/null +++ b/miniprogram/dist/sticky-item/index.js @@ -0,0 +1,40 @@ +Component({ + externalClasses: ['i-class'], + options: { + multipleSlots: true + }, + relations : { + '../sticky/index' : { + type : 'parent' + } + }, + data : { + top : 0, + height : 0, + isFixed : false, + index : -1, + }, + methods: { + updateScrollTopChange(scrollTop){ + const data = this.data; + const top = data.top; + const height = data.height; + this.setData({ + isFixed : ( scrollTop >= top && scrollTop < top + height ) ? true : false + }) + }, + updateDataChange(index) { + const className = '.i-sticky-item'; + const query = wx.createSelectorQuery().in(this); + query.select( className ).boundingClientRect((res)=>{ + if( res ){ + this.setData({ + top : res.top, + height : res.height, + index : index + }) + } + }).exec() + } + } +}) \ No newline at end of file diff --git a/miniprogram/dist/sticky-item/index.json b/miniprogram/dist/sticky-item/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/sticky-item/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/sticky-item/index.wxml b/miniprogram/dist/sticky-item/index.wxml new file mode 100644 index 0000000..613a5c0 --- /dev/null +++ b/miniprogram/dist/sticky-item/index.wxml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/miniprogram/dist/sticky-item/index.wxss b/miniprogram/dist/sticky-item/index.wxss new file mode 100644 index 0000000..7328f0f --- /dev/null +++ b/miniprogram/dist/sticky-item/index.wxss @@ -0,0 +1 @@ +.i-sticky-item-header{background:#eee;font-size:14px;width:100%;height:32px;line-height:32px}.i-sticky-item-content{font-size:14px}.i-sticky-title{width:100%;padding:0 15px;box-sizing:border-box;background:#eee}.i-sticky-fixed .i-sticky-title{position:fixed;top:0} \ No newline at end of file diff --git a/miniprogram/dist/sticky/index.js b/miniprogram/dist/sticky/index.js new file mode 100644 index 0000000..546aa4c --- /dev/null +++ b/miniprogram/dist/sticky/index.js @@ -0,0 +1,63 @@ +Component({ + externalClasses: ['i-class'], + properties : { + scrollTop : { + type : Number, + observer(val){ + this._updateScrollTopChange(); + } + } + }, + relations : { + '../sticky-item/index' : { + type : 'child', + linked(){ + this._updateDataChange(); + }, + linkChanged () { + this._updateDataChange(); + }, + unlinked () { + this._updateDataChange(); + } + } + }, + data : { + timer : null, + itemLength : 0, + }, + methods : { + _updateScrollTopChange(){ + const stickies = this.getRelationNodes('../sticky-item/index'); + if( stickies.length > 0 ){ + stickies.forEach((item) => { + if( item ){ + item.updateScrollTopChange( this.data.scrollTop ); + } + }) + } + }, + _updateDataChange( ){ + const stickies = this.getRelationNodes('../sticky-item/index'); + if( stickies.length > 0 ){ + if( this.data.timer ){ + clearTimeout( this.data.timer ) + this.setData({ + timer : null + }) + } + this.data.timer = setTimeout(()=>{ + stickies.forEach((item,index) => { + if( item ){ + item.updateDataChange(index); + } + }) + },0) + this.setData({ + timer : this.data.timer + }) + } + } + } + +}) \ No newline at end of file diff --git a/miniprogram/dist/sticky/index.json b/miniprogram/dist/sticky/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/sticky/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/sticky/index.wxml b/miniprogram/dist/sticky/index.wxml new file mode 100644 index 0000000..aee0c63 --- /dev/null +++ b/miniprogram/dist/sticky/index.wxml @@ -0,0 +1,3 @@ + + + diff --git a/miniprogram/dist/sticky/index.wxss b/miniprogram/dist/sticky/index.wxss new file mode 100644 index 0000000..e69de29 diff --git a/miniprogram/dist/swipeout/index.js b/miniprogram/dist/swipeout/index.js new file mode 100644 index 0000000..b23748c --- /dev/null +++ b/miniprogram/dist/swipeout/index.js @@ -0,0 +1,161 @@ + /* +* touch事件判断方式 +* https://github.com/madrobby/zepto/blob/master/src/touch.js#files +*/ +function swipeDirection(x1, x2, y1, y2) { + return Math.abs(x1 - x2) >= + Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down') +} + +Component({ + externalClasses: ['i-class'], + properties: { + actions: { + value: [], + type: Array, + observer : '_updateButtonSize' + }, + unclosable : { + value : false, + type : Boolean + }, + toggle : { + value : false, + type : Boolean, + observer : 'closeButtonGroup' + }, + operateWidth : { + type : Number, + value : 160 + } + }, + options: { + // 在组件定义时的选项中启用多slot支持 + multipleSlots: true + }, + data : { + //touch start position + tStart : { + pageX : 0, + pageY : 0 + }, + //限制滑动距离 + limitMove : 0, + //element move position + position : { + pageX : 0, + pageY : 0 + } + }, + methods : { + //阻止事件冒泡 + loop(){}, + _updateButtonSize(){ + const actions = this.data.actions; + if( actions.length > 0 ){ + const query = wx.createSelectorQuery().in(this); + let limitMovePosition = 0; + actions.forEach(item => { + limitMovePosition += item.width || 0; + }); + this.data.limitMove = limitMovePosition; + /* + * 动态获取每个传进值的按钮尺寸不能正确获取,在安卓上少了6px + * 暂时实现需要在actions里面传递宽度 + * 需要后期调研 + */ + //query.selectAll('.i-swipeout-button-right-item').boundingClientRect((rects)=>{ + // if( rects ){ + // console.log(rects,1111111) + // rects.forEach(item => { + // limitMovePosition += item.width; + // }); + // this.data.limitMove = limitMovePosition; + // console.log(limitMovePosition,111111111) + // } + // }).exec() + }else{ + this.data.limitMove = this.data.operateWidth; + + } + }, + handlerTouchstart(event){ + const touches = event.touches ? event.touches[0] : {}; + const tStart = this.data.tStart; + if( touches ){ + for( let i in tStart ){ + if( touches[i] ){ + tStart[i] = touches[i]; + } + } + } + }, + swipper(touches){ + const data = this.data; + const start = data.tStart; + const spacing = { + pageX : touches.pageX - start.pageX, + pageY : touches.pageY - start.pageY + } + if( data.limitMove < Math.abs( spacing.pageX ) ){ + spacing.pageX = -data.limitMove; + + } + this.setData({ + 'position' : spacing + }) + }, + handlerTouchmove(event){ + const start = this.data.tStart; + const touches = event.touches ? event.touches[0] : {}; + if( touches ){ + const direction = swipeDirection( start.pageX,touches.pageX,start.pageY,touches.pageY ); + if( direction === 'Left' ){ + this.swipper( touches ); + } + } + }, + handlerTouchend(event){ + const start = this.data.tStart; + const touches = event.changedTouches ? event.changedTouches[0] : {}; + if( touches ){ + const direction = swipeDirection( start.pageX,touches.pageX,start.pageY,touches.pageY ); + const spacing = { + pageX : touches.pageX - start.pageX, + pageY : touches.pageY - start.pageY + } + if( Math.abs( spacing.pageX ) >= 40 && direction === "Left" ){ + spacing.pageX = spacing.pageX < 0 ? - this.data.limitMove : this.data.limitMove; + }else{ + spacing.pageX = 0; + } + this.setData({ + 'position' : spacing + }) + } + }, + handlerButton(event){ + if( !this.data.unclosable ){ + this.closeButtonGroup(); + } + const dataset = event.currentTarget.dataset; + this.triggerEvent('change',{ + index : dataset.index + }) + }, + closeButtonGroup(){ + this.setData({ + 'position' : {pageX : 0,pageY : 0} + }) + }, + //控制自定义组件 + handlerParentButton(event){ + if( !this.data.unclosable ){ + this.closeButtonGroup(); + } + } + }, + ready(){ + this._updateButtonSize(); + } +}); diff --git a/miniprogram/dist/swipeout/index.json b/miniprogram/dist/swipeout/index.json new file mode 100644 index 0000000..c63f9a6 --- /dev/null +++ b/miniprogram/dist/swipeout/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "i-cell": "../cell/index", + "i-icon": "../icon/index" + } +} \ No newline at end of file diff --git a/miniprogram/dist/swipeout/index.wxml b/miniprogram/dist/swipeout/index.wxml new file mode 100644 index 0000000..96edef8 --- /dev/null +++ b/miniprogram/dist/swipeout/index.wxml @@ -0,0 +1,38 @@ + + + + + + + + + + {{item.name}} + + + + + + + + + module.exports = { + setStyle : function( item ){ + var defaults = '#f7f7f7'; + return 'background:' + ( item.background ? item.background : defaults ) +';' + 'color:'+ item.color; + }, + setPosition : function( position ){ + return 'transform:translate(' + position.pageX + 'px,0);'; + } + } + \ No newline at end of file diff --git a/miniprogram/dist/swipeout/index.wxss b/miniprogram/dist/swipeout/index.wxss new file mode 100644 index 0000000..597cffc --- /dev/null +++ b/miniprogram/dist/swipeout/index.wxss @@ -0,0 +1 @@ +.i-swipeout-wrap{border-bottom:#dddee1 solid 1px;background:#fff;position:relative;overflow:hidden}.i-swipeout-item{width:100%;padding:15px 20px;box-sizing:border-box;transition:transform .2s ease;font-size:14px}.i-swipeout-content{white-space:nowrap;overflow:hidden}.i-swipeout-button-right-group{position:absolute;right:-100%;top:0;height:100%;z-index:1;width:100%}.i-swipeout-button-right-item{height:100%;float:left;white-space:nowrap;box-sizing:border-box;display:flex;align-items:center;justify-content:center} \ No newline at end of file diff --git a/miniprogram/dist/switch/index.js b/miniprogram/dist/switch/index.js new file mode 100644 index 0000000..5ebccfa --- /dev/null +++ b/miniprogram/dist/switch/index.js @@ -0,0 +1,38 @@ +Component({ + externalClasses: ['i-class'], + properties : { + value : { + type : Boolean, + value : false + }, + //large small default + size : { + type : String, + value : 'default' + }, + // is or not disable + disabled : { + type : Boolean, + value : false + }, + // hidden inut name + name : { + type : String, + value : '' + } + }, + options: { + // 在组件定义时的选项中启用多slot支持 + multipleSlots: true + }, + methods : { + toggle(){ + if( this.data.disabled ) return; + const data = this.data; + const value = data.value ? false : true; + this.triggerEvent('change',{ + value : value + }) + } + } +}); diff --git a/miniprogram/dist/switch/index.json b/miniprogram/dist/switch/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/switch/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/switch/index.wxml b/miniprogram/dist/switch/index.wxml new file mode 100644 index 0000000..a180254 --- /dev/null +++ b/miniprogram/dist/switch/index.wxml @@ -0,0 +1,26 @@ + + + + + + + + + + +var sizes = ['large', 'default']; +var prefixCls = 'i-switch'; +module.exports = { + setSize : function( size ){ + var index = sizes.indexOf( size ); + return prefixCls + ( index > -1 ? ( '-'+size ) : 'default' ) + }, + setCurrent : function( value,disabled ){ + var className = value && !disabled ? prefixCls + '-checked' : ''; + if( disabled ){ + className += ' ' + prefixCls + '-disabled'; + } + return className; + } +} + \ No newline at end of file diff --git a/miniprogram/dist/switch/index.wxss b/miniprogram/dist/switch/index.wxss new file mode 100644 index 0000000..128fea6 --- /dev/null +++ b/miniprogram/dist/switch/index.wxss @@ -0,0 +1 @@ +.i-switch{display:inline-block;width:48px;height:24px;line-height:24px;border-radius:24px;vertical-align:middle;border:1px solid #ccc;background-color:#ccc;position:relative;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:all .2s ease-in-out}.i-switch-hide-input{display:none;opacity:0}.i-switch-inner{color:#fff;font-size:12px;position:absolute;left:25px;vertical-align:middle}.i-switch-inner .i-icon{width:12px;height:12px;text-align:center;vertical-align:middle}.i-switch:after{content:'';width:22px;height:22px;border-radius:22px;background-color:#fff;position:absolute;left:1px;top:1px;cursor:pointer;transition:left .2s ease-in-out,width .2s ease-in-out}.i-switch-checked:after{left:8px}.i-switch-large{width:60px}.i-switch-large.i-switch-checked:after{left:37px}.i-switch-checked:after{left:25px}.i-switch-checked{border-color:#2d8cf0;background-color:#2d8cf0}.i-switch-checked .i-switch-inner{left:8px}.i-switch-checked:after{left:25px}.i-switch-disabled{background:#f3f3f3;border-color:#f3f3f3}.i-switch-disabled:after{background:#ccc;cursor:not-allowed}.i-switch-disabled .i-switch-inner{color:#ccc} \ No newline at end of file diff --git a/miniprogram/dist/tab-bar-item/index.js b/miniprogram/dist/tab-bar-item/index.js new file mode 100644 index 0000000..0c24c1a --- /dev/null +++ b/miniprogram/dist/tab-bar-item/index.js @@ -0,0 +1,62 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../tab-bar/index': { + type: 'parent' + } + }, + + properties: { + icon: { + type: String, + value: '' + }, + currentIcon: { + type: String, + value: '' + }, + img: { + type: String, + value: '' + }, + currentImg: { + type: String, + value: '' + }, + key: { + type: String, + value: '' + }, + title: { + type: String, + value: '' + }, + dot: { + type: Boolean, + value: false + }, + count: { + type: Number, + value: 0 + } + }, + + data: { + current: false, + currentColor: '' + }, + + methods: { + changeCurrent (current) { + this.setData({ current }); + }, + changeCurrentColor (currentColor) { + this.setData({ currentColor }); + }, + handleClickItem () { + const parent = this.getRelationNodes('../tab-bar/index')[0]; + parent.emitEvent(this.data.key); + } + } +}); diff --git a/miniprogram/dist/tab-bar-item/index.json b/miniprogram/dist/tab-bar-item/index.json new file mode 100644 index 0000000..918aaf8 --- /dev/null +++ b/miniprogram/dist/tab-bar-item/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": + { + "i-badge": "../badge/index", + "i-icon": "../icon/index" + } +} diff --git a/miniprogram/dist/tab-bar-item/index.wxml b/miniprogram/dist/tab-bar-item/index.wxml new file mode 100644 index 0000000..7153909 --- /dev/null +++ b/miniprogram/dist/tab-bar-item/index.wxml @@ -0,0 +1,10 @@ + + + + + + {{ title }} + {{ title }} + + + \ No newline at end of file diff --git a/miniprogram/dist/tab-bar-item/index.wxss b/miniprogram/dist/tab-bar-item/index.wxss new file mode 100644 index 0000000..0f8a9c8 --- /dev/null +++ b/miniprogram/dist/tab-bar-item/index.wxss @@ -0,0 +1 @@ +.i-tab-bar-item{flex:1;display:flex;width:100%;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;text-align:center}.i-tab-bar-item-icon{display:flex;-webkit-box-pack:center;justify-content:center;box-sizing:border-box;color:#80848f}.i-tab-bar-item-icon-current{color:#2d8cf0}.i-tab-bar-item-img{display:flex;-webkit-box-pack:center;justify-content:center;box-sizing:border-box;width:22px;height:22px}.i-tab-bar-item-title{font-size:10px;margin:3px 0 0;line-height:1;text-align:center;box-sizing:border-box;color:#80848f}.i-tab-bar-item-title-current{color:#2d8cf0}.i-tab-bar-item-img{display:flex;-webkit-box-pack:center;justify-content:center;box-sizing:border-box;color:#80848f} \ No newline at end of file diff --git a/miniprogram/dist/tab-bar/index.js b/miniprogram/dist/tab-bar/index.js new file mode 100644 index 0000000..ca02fe4 --- /dev/null +++ b/miniprogram/dist/tab-bar/index.js @@ -0,0 +1,66 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../tab-bar-item/index': { + type: 'child', + linked () { + this.changeCurrent(); + }, + linkChanged () { + this.changeCurrent(); + }, + unlinked () { + this.changeCurrent(); + } + } + }, + + properties: { + current: { + type: String, + value: '', + observer: 'changeCurrent' + }, + color: { + type: String, + value: '' + }, + fixed: { + type: Boolean, + value: false + } + }, + + data: { + list: [] + }, + + methods: { + changeCurrent (val = this.data.current) { + let items = this.getRelationNodes('../tab-bar-item/index'); + const len = items.length; + + if (len > 0) { + const list = []; + items.forEach(item => { + item.changeCurrent(item.data.key === val); + item.changeCurrentColor(this.data.color); + list.push({ + key: item.data.key + }); + }); + this.setData({ + list: list + }); + } + }, + emitEvent (key) { + this.triggerEvent('change', { key }); + }, + handleClickItem (e) { + const key = e.currentTarget.dataset.key; + this.emitEvent(key); + } + } +}); diff --git a/miniprogram/dist/tab-bar/index.json b/miniprogram/dist/tab-bar/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/tab-bar/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/tab-bar/index.wxml b/miniprogram/dist/tab-bar/index.wxml new file mode 100644 index 0000000..9dbfbea --- /dev/null +++ b/miniprogram/dist/tab-bar/index.wxml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/miniprogram/dist/tab-bar/index.wxss b/miniprogram/dist/tab-bar/index.wxss new file mode 100644 index 0000000..5c6fd9c --- /dev/null +++ b/miniprogram/dist/tab-bar/index.wxss @@ -0,0 +1 @@ +.i-tab-bar{display:flex;width:100%;height:50px;box-sizing:border-box;position:relative;justify-content:space-around;align-items:center;-webkit-box-align:center;background:#fff}.i-tab-bar::after{content:'';position:absolute;top:0;left:0;width:200%;height:200%;transform:scale(.5);transform-origin:0 0;pointer-events:none;box-sizing:border-box;border:0 solid #e9eaec;border-top-width:1px}.i-tab-bar-fixed{position:fixed;bottom:0;z-index:2}.i-tab-bar-list{position:absolute;top:0;bottom:0;left:0;right:0}.i-tab-bar-layer{display:block;float:left;height:100%} \ No newline at end of file diff --git a/miniprogram/dist/tab/index.js b/miniprogram/dist/tab/index.js new file mode 100644 index 0000000..c8d3079 --- /dev/null +++ b/miniprogram/dist/tab/index.js @@ -0,0 +1,50 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../tabs/index': { + type: 'parent' + } + }, + + properties: { + key: { + type: String, + value: '' + }, + title: { + type: String, + value: '' + }, + dot: { + type: Boolean, + value: false + }, + count: { + type: Number, + value: 0 + } + }, + + data: { + current: false, + currentColor: '', + scroll: false + }, + + methods: { + changeCurrent (current) { + this.setData({ current }); + }, + changeCurrentColor (currentColor) { + this.setData({ currentColor }); + }, + changeScroll (scroll) { + this.setData({ scroll }); + }, + handleClickItem () { + const parent = this.getRelationNodes('../tabs/index')[0]; + parent.emitEvent(this.data.key); + } + } +}); diff --git a/miniprogram/dist/tab/index.json b/miniprogram/dist/tab/index.json new file mode 100644 index 0000000..eb6877d --- /dev/null +++ b/miniprogram/dist/tab/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": + { + "i-badge": "../badge/index" + } +} diff --git a/miniprogram/dist/tab/index.wxml b/miniprogram/dist/tab/index.wxml new file mode 100644 index 0000000..29d3955 --- /dev/null +++ b/miniprogram/dist/tab/index.wxml @@ -0,0 +1,9 @@ + + + + {{ title }} + {{ title }} + + + + \ No newline at end of file diff --git a/miniprogram/dist/tab/index.wxss b/miniprogram/dist/tab/index.wxss new file mode 100644 index 0000000..135637b --- /dev/null +++ b/miniprogram/dist/tab/index.wxss @@ -0,0 +1 @@ +.i-tabs-tab{flex:1;display:flex;width:100%;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;text-align:center;position:relative}.i-tabs-tab-bar{display:block;width:100%;height:2px;background:0 0;position:absolute;bottom:0;left:0;background:#2d8cf0}.i-tabs-tab-title{font-size:14px;text-align:center;box-sizing:border-box;color:#80848f}.i-tabs-tab-title-current{color:#2d8cf0}.i-tabs-tab-scroll{display:inline-block;width:60px} \ No newline at end of file diff --git a/miniprogram/dist/tabs/index.js b/miniprogram/dist/tabs/index.js new file mode 100644 index 0000000..b9d0326 --- /dev/null +++ b/miniprogram/dist/tabs/index.js @@ -0,0 +1,56 @@ +Component({ + externalClasses: ['i-class'], + + relations: { + '../tab/index': { + type: 'child', + linked () { + this.changeCurrent(); + }, + linkChanged () { + this.changeCurrent(); + }, + unlinked () { + this.changeCurrent(); + } + } + }, + + properties: { + current: { + type: String, + value: '', + observer: 'changeCurrent' + }, + color: { + type: String, + value: '' + }, + scroll: { + type: Boolean, + value: false + }, + fixed: { + type: Boolean, + value: false + } + }, + + methods: { + changeCurrent (val = this.data.current) { + let items = this.getRelationNodes('../tab/index'); + const len = items.length; + + if (len > 0) { + items.forEach(item => { + item.changeScroll(this.data.scroll); + item.changeCurrent(item.data.key === val); + item.changeCurrentColor(this.data.color); + }); + } + }, + emitEvent (key) { + this.triggerEvent('change', { key }); + } + } +}); diff --git a/miniprogram/dist/tabs/index.json b/miniprogram/dist/tabs/index.json new file mode 100644 index 0000000..467ce29 --- /dev/null +++ b/miniprogram/dist/tabs/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} diff --git a/miniprogram/dist/tabs/index.wxml b/miniprogram/dist/tabs/index.wxml new file mode 100644 index 0000000..b61d51b --- /dev/null +++ b/miniprogram/dist/tabs/index.wxml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/miniprogram/dist/tabs/index.wxss b/miniprogram/dist/tabs/index.wxss new file mode 100644 index 0000000..985fb18 --- /dev/null +++ b/miniprogram/dist/tabs/index.wxss @@ -0,0 +1 @@ +.i-tabs{display:flex;width:100%;height:42px;line-height:42px;box-sizing:border-box;position:relative;justify-content:space-around;align-items:center;-webkit-box-align:center;background:#fff}.i-tabs::after{content:'';position:absolute;top:0;left:0;width:200%;height:200%;transform:scale(.5);transform-origin:0 0;pointer-events:none;box-sizing:border-box;border:0 solid #e9eaec;border-bottom-width:1px}.i-tabs-scroll{display:block;overflow-x:auto;white-space:nowrap}.i-tabs-fixed{position:fixed;top:0;z-index:2} \ No newline at end of file diff --git a/miniprogram/dist/tag/index.js b/miniprogram/dist/tag/index.js new file mode 100644 index 0000000..338440a --- /dev/null +++ b/miniprogram/dist/tag/index.js @@ -0,0 +1,42 @@ +Component({ + externalClasses: ['i-class'], + properties : { + //slot name + name : { + type : String, + value : '' + }, + //can click or not click + checkable : { + type : Boolean, + value : false + }, + //is current choose + checked : { + type : Boolean, + value : true + }, + //background and color setting + color : { + type : String, + value : 'default' + }, + //control fill or not + type : { + type : String, + value : 'dot' + } + }, + methods : { + tapTag(){ + const data = this.data; + if( data.checkable ){ + const checked = data.checked ? false : true; + this.triggerEvent('change',{ + name : data.name || '', + checked : checked + }); + } + } + } +}) \ No newline at end of file diff --git a/miniprogram/dist/tag/index.json b/miniprogram/dist/tag/index.json new file mode 100644 index 0000000..1dd6c7f --- /dev/null +++ b/miniprogram/dist/tag/index.json @@ -0,0 +1,3 @@ +{ + "component" : true +} \ No newline at end of file diff --git a/miniprogram/dist/tag/index.wxml b/miniprogram/dist/tag/index.wxml new file mode 100644 index 0000000..ed2c675 --- /dev/null +++ b/miniprogram/dist/tag/index.wxml @@ -0,0 +1,27 @@ + + + + +module.exports = { + getClass : function(color,type,checked,checkable) { + var initColorList = ['blue', 'green', 'red', 'yellow', 'default']; + var theme = ''; + var className = 'i-tag-'; + if( initColorList.indexOf( color ) > -1 ){ + theme = className + color; + } + if( type === 'border' ){ + theme = className+color+'-border'; + } + if( checkable && checked ){ + theme = className+color+'-checked'; + }else if( checkable && !checked ){ + theme = ( type === 'border' ? className + color +'-border' : className+'none' ); + } + + return theme; + } +} + \ No newline at end of file diff --git a/miniprogram/dist/tag/index.wxss b/miniprogram/dist/tag/index.wxss new file mode 100644 index 0000000..e19f976 --- /dev/null +++ b/miniprogram/dist/tag/index.wxss @@ -0,0 +1 @@ +.i-tag{display:inline-block;height:18px;line-height:18px;padding:0 4px;border-radius:2px;background:#fff;font-size:11px;vertical-align:middle;border:1rpx solid #dddee1}.i-tag-none{border-color:#fff}.i-tag-default{border-color:#dddee1;background:#e9eaec}.i-tag-red{background:#ed3f14;color:#fff}.i-tag-red-border{color:#ed3f14;background:#fff;border-color:#ed3f14}.i-tag-red-checked{background:#ed3f14;color:#fff;border-color:#ed3f14}.i-tag-green{background:#19be6b;color:#fff;border-color:#19be6b}.i-tag-green-border{color:#19be6b;background:#fff;border-color:#19be6b}.i-tag-green-checked{background:#19be6b;color:#fff;border-color:#19be6b}.i-tag-blue{background:#2d8cf0;color:#fff;border-color:#2d8cf0}.i-tag-blue-border{color:#2d8cf0;background:#fff;border-color:#2d8cf0}.i-tag-blue-checked{background:#2d8cf0;color:#fff;border-color:#2d8cf0}.i-tag-yellow{background:#f90;color:#fff;border-color:#f90}.i-tag-yellow-border{color:#f90;background:#fff;border-color:#f90}.i-tag-yellow-checked{background:#f90;color:#fff;border-color:#f90}.i-tag-default-checked{background:#e9eaec;color:#495060;border-color:#e9eaec} \ No newline at end of file diff --git a/miniprogram/dist/toast/index.js b/miniprogram/dist/toast/index.js new file mode 100644 index 0000000..6493111 --- /dev/null +++ b/miniprogram/dist/toast/index.js @@ -0,0 +1,48 @@ +const default_data = { + visible: false, + content: '', + icon: '', + image: '', + duration: 2, + mask: true, + type: 'default', // default || success || warning || error || loading +}; + +let timmer = null; + +Component({ + externalClasses: ['i-class'], + + data: { + ...default_data + }, + + methods: { + handleShow (options) { + const { type = 'default', duration = 2 } = options; + + this.setData({ + ...options, + type, + duration, + visible: true + }); + + const d = this.data.duration * 1000; + + if (timmer) clearTimeout(timmer); + if (d !== 0) { + timmer = setTimeout(() => { + this.handleHide(); + timmer = null; + }, d); + } + }, + + handleHide () { + this.setData({ + ...default_data + }); + } + } +}); diff --git a/miniprogram/dist/toast/index.json b/miniprogram/dist/toast/index.json new file mode 100644 index 0000000..31309b1 --- /dev/null +++ b/miniprogram/dist/toast/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": + { + "i-icon": "../icon/index" + } +} diff --git a/miniprogram/dist/toast/index.wxml b/miniprogram/dist/toast/index.wxml new file mode 100644 index 0000000..ca5f732 --- /dev/null +++ b/miniprogram/dist/toast/index.wxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + {{ content }} + \ No newline at end of file diff --git a/miniprogram/dist/toast/index.wxss b/miniprogram/dist/toast/index.wxss new file mode 100644 index 0000000..5b3bd7f --- /dev/null +++ b/miniprogram/dist/toast/index.wxss @@ -0,0 +1 @@ +.i-toast{position:fixed;top:35%;left:50%;transform:translate3d(-50%,-50%,0);background:rgba(0,0,0,.7);color:#fff;font-size:14px;line-height:1.5em;margin:0 auto;box-sizing:border-box;padding:10px 18px;text-align:center;border-radius:4px;z-index:1010}.i-toast-mask{position:fixed;top:0;bottom:0;left:0;right:0;z-index:1010}.i-toast-icon{font-size:38px!important;margin-bottom:6px}.i-toast-image{max-width:100px;max-height:100px}.i-toast-loading{display:inline-block;vertical-align:middle;width:28px;height:28px;background:0 0;border-radius:50%;border:2px solid #fff;border-color:#fff #fff #fff #2d8cf0;animation:btn-spin .8s linear;animation-iteration-count:infinite}@keyframes btn-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/miniprogram/images/001-2.png b/miniprogram/images/001-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6158e496a8d8394b25bf388957a74eaff2b33e85 GIT binary patch literal 4311 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 H3)KGrEE|Hq literal 0 HcmV?d00001 diff --git a/miniprogram/images/002-2.png b/miniprogram/images/002-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f1bcea28cd28f311aa30cb7eeb9e2ad21b9c3173 GIT binary patch literal 2610 zcmd5;c~Db#7Y*>h2ZFpz*b=Nf5DmyGs~gLM1c)d|1c|7KEQ$k_24xf3LbPFtpi)#I zK>;@e1wn%W!WvW%V-S&A5Ls-BMv+Ap0r_5S|7<%Q=lf>9Ki<7F=Xd7K+;h&IxoJB* zTve0^N*D}Ah2ln{qW$6TAEN8T-gk@=cL@zJSBg_Imdf?*OMAKx9ae?kIM{dsE^tFA1=d;OHLLh z;|RbR^nNjVYbURv?B>l{L8)0k#pA60LNW$ep`RTfCj+kBhCwc@09QI;5G_>@1}!lu z7P5VCNFVLFq6{!vBF@?EfBv>uqqS7$e{=M5CN#S9M&~M>J!M9-auB%nA|IC zHl*NXt%`Wp?1Hrr@9iW={gyiD0{P&uq?2Lt3@qt63Gf>9O9=qHtg+uhQ);@lYVOOl zk?rE=GPjp%XFeA;j?{6f{5?C{1rO=l7rcXBknF_;CXxkqN%v5YuweSx(AzKUh{F0G zBw2ZuJ?Z5REIAMR0e-c~*=PkO|CH4D;JMc!C(Q@^4u+jBeOI-xmg4c=_@JcpgC%@F zzJ5JUsJ`V6|Bp9k8HHZu0%HZL(OA>f# zojd{s&jx3yrNJ%8L@VLR*4RM90Jd7YN)aEK5bf?dR9qq1Q`V&QU_rx(lDI>^-{#m+ zzzeikYb^NnyG=z&ZR~05+tV?o52W`?hZ<6y?JC=tC*e{$f;xSMVV7is{AqSc0DxBv zUbF(Kh2u#vj*#kGa=e}!)@E1_ST7sSTZz1^6bNvP*d1msaY%XvUQ?Ha4XAwscAd7i zWi1OE=7NC$t-3(F1k8V+2aI1j4X^6Xm?mZGg}0H>r`{tQ8P!2{?ER@98~Rp^&0bjQ zD3^Gqw-^al{rsLsTT?*`A|}I1r^Eq*&~XOKCjY$ekNw-;8>PSW0ho$ zWNcbtaLK@%y?klvy3z}`Cayz1%qmR-i<+&e=8R0>P9g!gA)0O246~MfDzd|(TGO!% zEtz|JPQ&kM`v(+}E!Q>Qr=g3TnE|ze75$OG;Rkuzt*LkEo~Vn)eos`W%+4Sz>Z0pk z8O&|Fjm&Dei|GO(wUMyCdr|>ksZ2ElN$=u#I!5b`Z~cu0KqMKadX92w;KT%hBxyU18asiz=qWaZMLEnK?#3P>o12-Wcbia zS5P{2)YjFw{vNlda$hB}1#wbm45HTehvBxY|6Pz`m6{)ju~*J63aJ;#19=?9mW3+5I;|@PD+% zq4H;p3&)6YuLPF(I`1T26!DVM&`tnY)Vl&cCFJg{$0F3 zF-m>JPdr)fzCW!bz8+ICc1$t&(SE6^&4-ySmuq3OBZ&zE;_7IG^x-4W^a{5+d-A+* z)t2b!h+%Efx%{Es(PqmJdewFsu~m<)OgVkl$} K(k-U|#(x0$>2e1E literal 0 HcmV?d00001 diff --git a/miniprogram/images/002.png b/miniprogram/images/002.png new file mode 100644 index 0000000000000000000000000000000000000000..5faec677873346298529e3f5651242f087f26f8d GIT binary patch literal 2579 zcmc&$do+~m8Xwa~AE9qT2G#kZVm2l-?xmg2b=XmRYz*T%5w@^HeCZb!(ZP|rI@0`REJU+`nS;xtWGqN+OLM#inX>Ga z?XrDEs8p4beLI=(HN6~ihX|!)=ycKygX{~?^UcDUvdF>gnRwG`)U75|&?yuOv+X~+ zIZiY+HH|bhG}JlTTqVABVg=+7Tk!`&pI2Ay*njKYf>HYA{@Uq72Ij16Jx13*?br$YPT!<=c|9Bn#G>)8BB?tZH9hUw0T98k$Rhy3RxW3sRjuDakw=sbms&Pf~v1 zaog$WvB9^$XDS%BgtOH&t#A2*gDZ9sR=>=jlzy4CF~2CluKDgW=5J1fvjW1NCBdq09@GZU6@ek8cr_Y`-bU@17 z>x8opE^LlXBL%ydwU4MEp*H#{tK&Td*0MZzG!FTE)2?TCG<894Ec;0_&S!nf z!B(;D#M+PR`#)C|RKcDP@%)N!JZkr%l%&3gw==o;hYQy}9`aRUi`NLIHO)b)fscL( z)s~+=9>LvX{lwJ)$?6ciftpM7#o1xnDEpG|VDyMm!WjEeSHH6szzJ9#zTdeDC;%KK zxs@^#+Y^cDFK;Xoqk6H6u5Y}*_|5O-Wi zbh4cm;Ky}W=o>33wFZSoiZD@Z#a^$fApW+TAsO6kaK{V4ZQY zQ^OS!?5ljhn+d`XEg%E%xTlSR=c=TvSx&o7F2RXJ{x5^L7O?&&I)K9lDx|}ul$i+x za_5>LsULoQz7=uJke?WnR0WR7r^8k+z6z~e+ZKO6G?)J_D^}3I7{`cd{cIJrnnCYX z9I(YyPMpAks#m~}JHRbmEy}FUTLQc@MF|AB*U+>j(@Nto>!Xq>D=J}>9P!%NSt~?t zVyzxj^}lXNL!W|zWXFRWKq{}BE)jBIGFcGRd^KMY0c74ue0N0oh8t(b4};7oMRmL= zopj^W+g({&Qcb*mZq!TCRxMN0X-d(&D7?p^M+pUpyq>Q$#%Y>Ju8+_;c!^&u*dpcJlaTeXCU#fVl zP!b~n73STjmL84jQs@|pH$J!*1(p3J18dy4+s%wV^6p=f9L6V%wLS7yx26f#UiGdU z-W*Z~V+(X*-9Gdctgv&eTx0Z*fA?Wg2KZF|wksL<-aPsY10Z4d4sS)`8(q(s=N`{~O+3#$*y;>DC`F{2)Y802L0u_pNNxUWP`*oyY;zs$X3-Kc3v@2<>QJW? zY@w*_5)n7TWoyi8j-`QcBBt;Q>+VP+ofnDfJPzE=gt5ba(5X)OOXyq*E~lxyt6)?r zN)GH)K|u|A^Ycu8O5dVmIPyB#Tszt$bSgL>2B~D?av)^U*u7<|h}%A$XBCsXedhtf z4TA!GH%@r&Ik@&rU!__ikpc7wO7gZN;W*L7b9olLnSw{cSBm|tA@>&WW{2~E{pggc zmB`aGgE$LC5<0c$$V-Q76YCV>PjkXI20EVNey{Q3txVQ+Ju_!$zJE#d{GmHCVgT-^ z_g`#gg8Yp(^CEzIHT&O}?~3!~eb+VgMj^#>)!{$XzSfu-tShoadDJPO$1?S=WZ@F= z|Hi_fZnmi}a@8>Uco_7V?z^leI;WIz6jTp}rNXk?_p_axN;Nl(rzn!b!5Uvk3ycDf&kQBD}M?2yaZ z6uLaqrzk5c8~hM|n2vhQMdB!g^?I6C*WB#vaHUCh4Q$;yH#e8>sGz>yv`=%Q-Y3NZ!eurFQ=J%$EsinxAdeRY|kC}96R75 zNmkdnDvq@Vpm<|uBS{n%m>5)N1EitWDEGfiD;PBVssCdwH74vkOzV>r1EvdmGF_}N de`-vM#qLY&B+K0Gl@|?r7#mA_i!w7W^j`weh8+L^ literal 0 HcmV?d00001 diff --git a/miniprogram/images/003-2.png b/miniprogram/images/003-2.png new file mode 100644 index 0000000000000000000000000000000000000000..4b27a05b46ecabeed29716da4b0896f878714b31 GIT binary patch literal 6439 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 L23U&vef<9bb$x+o literal 0 HcmV?d00001 diff --git a/miniprogram/images/004-1.png b/miniprogram/images/004-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1108c58beee1d188c39156c82d9f913f6cb37a83 GIT binary patch literal 1024 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7CvHNU_S2Y;uumf=k49VyjuYR4uLVL zf{EQXnd2j!Zz!E!@QGc>vp4zr`&-8O?sRe(NRpT)(5Bjw$e9@7goXJr>`$sJlTABMnEZqCBpiw$T5V;uzwC%t@Y7M`@#Z)z zbZA410VXr)$FE~T+gOqk=63vAd11$-?mc%NeDTsb zY&ES>bxLOAl^sGSw|#o|#Y^e6qU>WXz0Vt+mWL!6xe9pC}okVB3-!z?jN+ zdI8gEiD{0i6Et<2y;Phd*ro)Hu&MOZ4i>&!0Ee8NadE>Qrx$DS4$?*t_FZV&x8wAlo&zQ+l?4 zvb%Qpv-JI<`K!N}n5=n!$HeT>vH+wM(Xnbim+chh)neD~rJGE#b=`Ss*@qLCQ%=oY z6s)?2BR^;5jysj&i<}}Rs=3Zw`Sb`VC9Mz$Thjk4b(*YAuG|0IcUf77FD=mxckZ{3 zR$XJe{>02`zK2_P?D-dx^Zf4#^KEw&=Vr}5H2?W_e*1m-wYT-`?CsV6&$#_|+x6fd z?oXe#B|iFnZTr-xR?w8cQFYDl?)72)!C$r4eEzxT$I6`!tBxM?pXvSBXid|+#|x&Z z@T}f3U--rL3-jL3pB?vZ&+FNS)0WQOZMZ31QEHl6F7FxNg=uSV%2(g9|JNhz-K{$} zDLKJUXYIC>F3XKuPOjEWi;$gNb@=+4dFwxNy!rSekIUM<)#Uixaznr6m*a!H{an^LB{Ts5R^Hk% literal 0 HcmV?d00001 diff --git a/miniprogram/images/004-2.png b/miniprogram/images/004-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d9f6a5f8e6efbfa94c3a6fa22b778ce6e250e793 GIT binary patch literal 1035 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7CvHNV7}z(;uumf=k48#xwjnz7y>m5 z1cfFjUGnHUvHn&8|0@;SCBoAmHpsK2v@bgOq3zDzx$F`gIT3+R4o%G1 z*Zb|?$Nq7)`ndKNw?bPYXJUkt#5936)fOyF{iE^MiW{C!IQWYDkDrbrk2l9*p+g&5 z3^19CmS?xdedj*XiPapK>3e>7C+-$_XSGrow@DE5x82$Big!_uo*ApfMr`&0RV}Cw zeX=<;CH$?mdz)!_=A)0vhD*F7+b*Dk4Iy>{3&gPD89^1HljVjlgs z(|B|mI1=YBl;t~Cy1+xYyX*7;K7qFZ9)9}Fw*#*f>+tuVbhWQkXDY6Gt8jX^la_(w zCSCI#_I8~;uOoDqPY>pvRM|Mi>R>qY&G373EgUbJuL--#!cabI8A^-hn-ErYqDR(XI z5UWl3iR?m)H8Np8GfhPU{GUfyT}bv=yU40^pZsg>=d#PgUYM)vHcMGieKw4cw27BN_@L_@xnJ^Prcd? zDQ`bH<@Tar)ioUUH-ZW)Kk2!&Zcy^=G73HoPEUb~YdrG5p4PG6k?Zz9_g!Ar;Y&+& z%boe}N2{)}eSczRHQ&RnJNEtydGqA&3Hh9z-d0!nTIYY?KHvWD&acnQKK}Y;_4E3k zy?ft&75Nufx$~jT$LH7PYo9KKrs5>;i1+?>QMP_p`!}q+{`%4KXG|-_r0=Eb^`73q zRn^lRHOXMjBRl^E>z%6q{JQhy)00?vo{c)TcX%h-a$nqFl9`<#$7Py*_UDZsUmsS_ ziHOR1DI(2OoRqm$HTX>DQr~&LhKFC>xWZp^_SH|RjiE=7(zftj4a)78&qol`;+01sEtTmS$7 literal 0 HcmV?d00001 diff --git a/miniprogram/images/bt.png b/miniprogram/images/bt.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c03587bdfe167802aba460c82fe5c98884b100 GIT binary patch literal 30405 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 A#{d8T literal 0 HcmV?d00001 diff --git a/miniprogram/images/bt0-1.png b/miniprogram/images/bt0-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d1661c3719e2f1e8c6706ef2df1a42a99cb54bc0 GIT binary patch literal 28223 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 N002ovPDHLkV1k`Nf0_UQ literal 0 HcmV?d00001 diff --git a/miniprogram/images/bt2.png b/miniprogram/images/bt2.png new file mode 100644 index 0000000000000000000000000000000000000000..2e5594b921b81037d1bc90a32a6ad38600098a7d GIT binary patch literal 30212 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 P00000NkvXXu0mjf(J literal 0 HcmV?d00001 diff --git a/miniprogram/images/team-bak.png b/miniprogram/images/team-bak.png new file mode 100644 index 0000000000000000000000000000000000000000..89da8989780ae07efc48580480b9f36bc930ef97 GIT binary patch literal 5287 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 literal 0 HcmV?d00001 diff --git a/miniprogram/images/user-unlogin.png b/miniprogram/images/user-unlogin.png new file mode 100644 index 0000000000000000000000000000000000000000..95b27e441317a0a5cc5145c1117bb1ce55cc99bd GIT binary patch literal 4631 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 N002ovPDHLkV1gVKtLFd! literal 0 HcmV?d00001 diff --git a/miniprogram/pages/alloc/alloc.js b/miniprogram/pages/alloc/alloc.js new file mode 100644 index 0000000..3f8a44b --- /dev/null +++ b/miniprogram/pages/alloc/alloc.js @@ -0,0 +1,239 @@ +// pages/list/list.js +var authGET = require('../../utils/authGET') +var authRESULT = require('../../utils/authRESULT') +const { $Message } = require('../../dist/base/index'); + +const app = getApp() +function formatNumber(n) { + n = n.toString() + return n[1] ? n : '0' + n +} +Page({ + data: { + taskid:new Array,taskidstring:'', + taskddllist:new Array, taskbeginlist:new Array, + planid:new Array,planidstring:'', + planddllist:new Array, planbeginlist:new Array, + taskNULL:false, + current: 'tab1',current_scroll: 'tab1', + visible2: false,toggle : false,toggle2 : false, + actions : [ + { + name : '删除', + width : 100, + color : '#fff', + fontsize : '20', + icon : 'trash', + background : '#ed3f14' + }, + + ], + press : false, + loading: true + }, + + listenPress: function (res) { + this.setData({ + press: true, + }) + let that = this; + setTimeout(function(){ + that.setData({ + press: false, + }) + },15) + }, + + + onLoad: function (e) { + + }, + onReady: function () { + + }, + onShow:function(){ + let that = this; + app.listenLoading(function (res) { + that.Query() + }) + }, + onPullDownRefresh: function () { + let that = this; + app.listenLoading(function (res) { + that.Query() + }) + + }, + stopPullDownRefresh(){ + wx.stopPullDownRefresh() + $Message({ + content: '拉取数据成功', + type: 'success' + }); + }, + + Query:function(){ + this.onRESULTS() + }, + onRESULTS: function () { + var that = this + authRESULT.authRESULTS({ + url : "task", + success: function (res) { + console.log("results",res) + if(res.data!=""){ + var _taskid=[] + var _taskddlist = [] + var _taskbeginlist = [] + for(var i = 0;i + + + + + + + + + + + + + + + + + + + + + + + + + + 开始时间:{{taskbeginlist[index]}} + + + 截止时间:{{taskddlist[index]}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 开始时间:{{planbeginlist[index]}} + + + 截止时间:{{planddlist[index]}} + + + + + + + + + \ No newline at end of file diff --git a/miniprogram/pages/alloc/alloc.wxss b/miniprogram/pages/alloc/alloc.wxss new file mode 100644 index 0000000..bd438c2 --- /dev/null +++ b/miniprogram/pages/alloc/alloc.wxss @@ -0,0 +1,155 @@ +/* pages/list/list.wxss */ +.row,.row2{ + margin-top: 2px; + height :50px; + width: 95%; + margin-left:auto; + margin-right:auto; + background-color:white +} +page { + background: #F6F6F6; + display: flex; + flex-direction: column; + justify-content: flex-start; + background: url("http://static.codesdream.com/bk.png") no-repeat; + width: 100%; + background-size: 100% 100%; + background-attachment:fixed; +} + +.itm{ + margin-left: 20px; + color: rgb(99, 98, 101); + font-style: initial; + +} +.row2{ + background-color:rgb(221, 206, 255); +} + +.blk0,.blk1{ + border: 1px solid rgb(178, 139, 255); + width: 72px; + height:30px; + margin-left: 5px; + border-radius: 10px; + color: rgb(178, 139, 255); + text-align: center; +} +.blk1{ + border: 1px solid rgb(178, 139, 255); + background-color: rgb(178, 139, 255); + color: white; + border-radius: 10px; + +} +.row3{ + display: flex; + flex-direction: row; + margin-top: 5px; +} +.i-cell-padding{ + height: 28px; +} + +.i-row-class{ + margin-bottom:5px; +} + +.circle-button{ + font-size: 60rpx; + color: white; + text-align: center; + border-radius: 100%; +} + +/* .circle-view1{ + height: 120rpx; + width: 120rpx; + background-color: #19be6b; + border-radius: 100%; + position: fixed; + bottom: 100rpx; + right: 40rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 9; + border: 0 solid #ffffff; + box-shadow: 4px 1px 1px #cccccc; +} */ + +.circle-view1{ + position: fixed; + bottom: 100rpx; + right: 40rpx; + /* display: flex; + align-items: center; + justify-content: center; */ +} + +.button-img{ + height: 60px; + width: 60px; +} + +.circle-view2{ + height: 120rpx; + width: 120rpx; + background-color: #1ea4ed; + border-radius: 100%; + position: fixed; + bottom: 100rpx; + right: 40rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 9; + border: 0 solid #ffffff; + box-shadow: 4px 1px 1px #cccccc; +} + +.progress-cell{ + height: 18px; +} + +.i-cell-padding{ + height: 20px; +} + +.item-row{ + height: 45px; +} + +.empty-img{ + height: 240px; + width: 150px; + +} + +.empty-view{ + display:flex; + justify-content: center; + margin-top: 80px; + margin-left: 15px; +} + +.desc-row{ + font-size: smaller; + color: #80848f; +} + +.last-desc-row{ + margin-bottom: 5px; +} +.panel-row{ + margin-bottom: 0px; + border-bottom: solid 1px; + border-color: #dddee1; + +} + +.i-row-class-top{ + margin-top: 20px; +} \ No newline at end of file diff --git a/miniprogram/pages/databaseTest/databaseTest.js b/miniprogram/pages/databaseTest/databaseTest.js new file mode 100644 index 0000000..1baad37 --- /dev/null +++ b/miniprogram/pages/databaseTest/databaseTest.js @@ -0,0 +1,191 @@ +const app = getApp() +var authPOST = require('../../utils/authPOST') +var authGET = require('../../utils/authGET') +var authPATCH = require('../../utils/authPATCH') +var authDELETE = require('../../utils/authDELETE') +var authRESULT = require('../../utils/authRESULT') +var util = require('../../utils/util.js') + +var USERPREF = { + availableTime:Array(), + forbiddenTime:Array(), + preferTime:0,//上午下午晚上 + remindAdvance:5,//提前几分钟提醒 +}; +var USERPLAN = { + planlist:Array(), + AssignedPlanlist:Array(), + UnassignedPlanlist:Array(), +} +var USERTASK = { + tasklist:Array(), + AssignedTasklist:Array(), + UnassignedTasklist:Array(), +} +function PLAN(){ + this.description=Array(); + this.toDoDays=-1; + this.doneDays=-1; + this.eachTimeConsume=-1; + this.totalTimeConsume=-1; + this.completeProgress=-1;//完成进度 + this.bookingTime=Array(); +} +function TASK(){ + this.description=Array(); + this.deadLine=-1; + this.expectTimeConsume=-1;//剩余需分配时间 + this.iscompleted=0;//完成进度 + this.importantDegree=-1;//重要程度 + this.bookingTime=Array(); + this.preference=0;//偏好 +} + +Page({ + data: { + queryResult:[],//数据库记录查询存储 + userpref:USERPREF, + userplan:USERPLAN, + usertask:USERTASK, + }, + + onLoad: function () {//当加载页面时执行的程序,执行用户信息获取,数据库查找 + this.onQuery();//数据库查找是否已经有过创建记录 + }, + onReady:function(){ + var timestamp = Date.parse(new Date()); + timestamp = timestamp / 1000; + //获取当前时间 + var n = timestamp * 1000; + var date = new Date(n); + //年 + var Y = date.getFullYear(); + //月 + var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1); + //日 + var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); + //时 + var h = date.getHours(); + //分 + var m = date.getMinutes(); + //秒 + var s = date.getSeconds(); + console.log(Y+M+D+h+m+s) + }, + onQuery: function () { + console.log(new Date('2018-09-04 15:46:13'.replace(/-/g,"/")).getTime()) + }, + onPOST: function () { + let that = this; + authPOST.authPOST({ + url : "plan", + data: { + "description":["模电作业"], + "deadline":1536047173000, + "importantDegree":1.0, + "preference":0, + "singleMin":0, + "singleMax":2, + "duration":1, + "mutexPeriod":1, + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + }) + }, + onGET: function () { + authGET.authGET({ + url : "plan", + data: { + "id":88, + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + }) + }, + onGETALL: function () { + authGET.authGETALL({ + url : "plan", + data: { + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + }) + }, + onPATCH: function () { + authPATCH.authPATCH({ + url:"plan", + data:{ + 'id':88, + 'patch':[ + {"op": "replace", "path": "/importantDegree", "value": 55 }, + {"op": "replace", "path": "/singleMax", "value": 7 }, + ], + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + + }) + }, + onDELETE: function () { + authDELETE.authDELETE({ + url:"plan", + data:{ + "id":[89], + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + + }) + }, + onTODAY: function () { + authRESULT.authTODAY({ + url : "task", + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + }) + }, + buttonPOST:function(){ + this.onPOST() + }, + buttonGET:function(){ + this.onGET() + }, + buttonGETALL:function(){ + this.onGETALL() + }, + buttonPATCH:function(){ + this.onPATCH() + }, + buttonDELETE:function(){ + this.onDELETE() + }, + buttonTODAY:function(){ + this.onTODAY() + }, + +}) \ No newline at end of file diff --git a/miniprogram/pages/databaseTest/databaseTest.json b/miniprogram/pages/databaseTest/databaseTest.json new file mode 100644 index 0000000..fc342d0 --- /dev/null +++ b/miniprogram/pages/databaseTest/databaseTest.json @@ -0,0 +1,11 @@ +{ + "component": true, + "usingComponents": { + "i-tabs": "../../dist/tabs/index", + "i-tab": "../../dist/tab/index", + "i-swipeout": "../../dist/swipeout/index", + "i-cell": "../../dist/cell/index", + "i-divider": "../../dist/divider/index", + "i-icon": "../../dist/icon/index" + } +} \ No newline at end of file diff --git a/miniprogram/pages/databaseTest/databaseTest.wxml b/miniprogram/pages/databaseTest/databaseTest.wxml new file mode 100644 index 0000000..b19d649 --- /dev/null +++ b/miniprogram/pages/databaseTest/databaseTest.wxml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/miniprogram/pages/databaseTest/databaseTest.wxss b/miniprogram/pages/databaseTest/databaseTest.wxss new file mode 100644 index 0000000..ec9776b --- /dev/null +++ b/miniprogram/pages/databaseTest/databaseTest.wxss @@ -0,0 +1,101 @@ +.button{ + width: 40%; + margin-top: 35rpx; + color: red; + border-radius: 60rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} +/* pages/list/list.wxss */ +.row,.row2{ + margin-top: 2px; + height :50px; + width: 95%; + margin-left:auto; + margin-right:auto; + background-color:white +} +page { + background: #F6F6F6; + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.itm{ + margin-left: 20px; + color: rgb(99, 98, 101); + font-style: initial; + +} +.row2{ + background-color:rgb(221, 206, 255); +} + +.blk0,.blk1{ + border: 1px solid rgb(178, 139, 255); + width: 72px; + height:30px; + margin-left: 5px; + border-radius: 10px; + color: rgb(178, 139, 255); + text-align: center; +} +.blk1{ + border: 1px solid rgb(178, 139, 255); + background-color: rgb(178, 139, 255); + color: white; + border-radius: 10px; + +} +.row3{ + display: flex; + flex-direction: row; + margin-top: 5px; +} +.i-cell-padding{ + height: 28px; +} + +.i-row-class{ + margin-bottom:20px; +} + +.circle-button{ + font-size: 60rpx; + color: white; + text-align: center; + border-radius: 100%; +} + +.circle-view1{ + height: 120rpx; + width: 120rpx; + background-color: #19be6b; + border-radius: 100%; + position: fixed; + bottom: 100rpx; + right: 40rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 9; + border: 0 solid #ffffff; + box-shadow: 4px 1px 1px #cccccc; +} +.circle-view2{ + height: 120rpx; + width: 120rpx; + background-color: #1ea4ed; + border-radius: 100%; + position: fixed; + bottom: 100rpx; + right: 40rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 9; + border: 0 solid #ffffff; + box-shadow: 4px 1px 1px #cccccc; +} \ No newline at end of file diff --git a/miniprogram/pages/index/index.js b/miniprogram/pages/index/index.js new file mode 100644 index 0000000..3ca2b17 --- /dev/null +++ b/miniprogram/pages/index/index.js @@ -0,0 +1,605 @@ +//index.js +var config = require('../../config') +var util = require('../../utils/util.js') +var authRESULT = require('../../utils/authRESULT') +var authGET = require('../../utils/authGET') +var authTIME = require('../../utils/authTIME') +const { $Message } = require('../../dist/base/index'); + +var app = getApp(); +function formatNumber(n) { + n = n.toString() + return n[1] ? n : '0' + n +} +Page({ + data: { + userInfo: {}, + logged: false,taskNULL:false,todayNULL:false,todayPNULL:false, + takeSession: false, + requestResult: '',button:"success", + loading: true,clearTimer: false,taskidstring:'', + nowTimestamp:0,deadline:[],beginline:[],deadline_P:[],beginline_P:[], + taskToday:{ + id:[], + beginTimestamp:[], + endTimestamp:[], + Detail:new Array, + }, + planToday:{ + id:0, + beginTimestamp:0, + endTimestamp:0, + Detail:new Array, + }, + importance: ['重要','一般','次要'], + }, + + onLoad: function(){ + wx.getSetting({ + success: function(res) { + console.log(res) + if(res.authSetting["scope.userInfo"] != true) + wx.reLaunch({ + url: '../init/init', + }) + } + }) + let that = this + app.listenLoading(function (res) { + console.log("cadsfaa",app.globalData.token) + that.setData({ + loading: false, + }) + if(app.globalData.token == null){ + $Message({ + content: '服务器维护中', + type: 'error' + }); + } + + }) + }, + onReady:function(){ + this.setData({ + nowTimestamp:new Date().getTime() + }); + console.log("now",this.data.nowTimestamp) + }, + onPullDownRefresh: function () { + let that = this; + app.listenLoading(function (res) { + that.onTODAY() + }) + + }, + stopPullDownRefresh(){ + wx.stopPullDownRefresh() + }, + onShow:function(){ + var that = this + app.listenLoading(function (res) { + that.onTODAY() + //that.onRESULTS() + that.onPOST() + }) + }, + onPOST:function(){ + var that = this + authTIME.authGET({ + url : "", + data: { + "dow":1, + }, + success: function (res) { + //console.log("get",res) + if(res.data.periods.length<=0){ + for(var i =1;i<8;i++){ + authTIME.authPOST({ + data: { + "dayOfWeek": i, + "periods": [{startScale: 2, endScale: 10}] + }, + success: function (res) { + console.log("post",res) + }, + fail: function (res) { + console.log(res) + } + }) + } + } + }, + fail: function (res) { + console.log(res) + } + }) + + }, + onTODAY: function () { + var that = this + authRESULT.authTODAY({ + url : "task", + success: function (res) { + var _taskid=[],_beginline=[],_endline=[],_begin_wxml=[],_dead_wxml=[] + if(res.statusCode <300 && res.data.length>0){ + for(var i =0;i < res.data.length;i++){ + var datee = res.data[i].end; + datee = new Date(datee.replace(/-/g, '/')) + var y = datee.getFullYear(); + var m = datee.getMonth()+1; + var d = datee.getDate(); + var h = datee.getHours(); + var mn= datee.getMinutes(); + var dateb = res.data[i].begin; + dateb = new Date(dateb.replace(/-/g, '/')) + var yy = dateb.getFullYear(); + var mm = dateb.getMonth()+1; + var dd = dateb.getDate(); + var hh = dateb.getHours(); + var mmnn= dateb.getMinutes(); + if(dd == new Date(that.data.nowTimestamp).getDate()){ + var ddl1 = '今天'+formatNumber(hh)+':'+formatNumber(mmnn) + } + else{ + var ddl1 = '明天'+formatNumber(hh)+':'+formatNumber(mmnn) + } + if(d == new Date(that.data.nowTimestamp).getDate()){ + var ddl = '今天 '+formatNumber(h)+':'+formatNumber(mn) + } + else{ + var ddl = '明天 '+formatNumber(h)+':'+formatNumber(mn) + } + _beginline.push(new Date(res.data[i].begin.replace(/-/g, '/')).getTime()) + _endline.push(new Date(res.data[i].end.replace(/-/g, '/')).getTime()) + _taskid.push(res.data[i].taskId) + _begin_wxml.push(ddl1) + _dead_wxml.push(ddl) + } + that.setData({ + 'taskToday.id':_taskid, + taskidstring:_taskid.join(','), + 'taskToday.beginTimestamp': _beginline, + 'taskToday.endTimestamp':_endline, + deadline:_dead_wxml, + beginline:_begin_wxml, + }) + //console.log("beginT",that.data.taskToday.beginTimestamp) + //console.log("end",that.data.taskToday.endTimestamp) + console.log('todayTask',that.data.taskToday) + that.onGETDETAIL() + } + else{ + that.setData({ + todayNULL:true, + 'taskToday.id':'', + 'taskToday.beginTimestamp': [], + 'taskToday.endTimestamp':[], + deadline:0, + beginline:0, + }) + console.log("NULL") + } + }, + fail: function (res) { + console.log(res) + } + }) + authRESULT.authTODAY({ + url : "plan", + success: function (res) { + var _planid=[],_beginline=[],_endline=[],_begin_wxml=[],_dead_wxml=[] + if(res.statusCode <300 && res.data.length>0){ + for(var i =0;i < res.data.length;i++){ + var datee =res.data[i].end; + datee = new Date(datee.replace(/-/g, '/')) + var y = datee.getFullYear(); + var m = datee.getMonth()+1; + var d = datee.getDate(); + var h = datee.getHours(); + var mn= datee.getMinutes(); + var dateb = res.data[i].begin; + dateb = new Date(dateb.replace(/-/g, '/')) + var yy = dateb.getFullYear(); + var mm = dateb.getMonth()+1; + var dd = dateb.getDate(); + var hh = dateb.getHours(); + var mmnn= dateb.getMinutes(); + if(dd == new Date(that.data.nowTimestamp).getDate()){ + var ddl1 = '今天'+formatNumber(hh)+':'+formatNumber(mmnn) + } + else{ + var ddl1 = '明天'+formatNumber(hh)+':'+formatNumber(mmnn) + } + if(d == new Date(that.data.nowTimestamp).getDate()){ + var ddl = '今天 '+formatNumber(h)+':'+formatNumber(mn) + } + else{ + var ddl = '明天 '+formatNumber(h)+':'+formatNumber(mn) + } + _beginline.push(new Date(res.data[i].begin.replace(/-/g, '/')).getTime()) + _endline.push(new Date(res.data[i].end.replace(/-/g, '/')).getTime()) + _planid.push(res.data[i].taskId) + _begin_wxml.push(ddl1) + _dead_wxml.push(ddl) + } + that.setData({ + 'planToday.id':_planid, + planidstring:_planid.join(','), + 'planToday.beginTimestamp':_beginline, + 'planToday.endTimestamp':_endline, + deadline_P:_dead_wxml, + beginline_P:_begin_wxml, + }) + //console.log("beginP",that.data.planToday.beginTimestamp) + //console.log("end",that.data.planToday.endTimestamp) + //console.log("开始",new Date(res.data[0].begin).getHours(), new Date(res.data[0].begin).getMinutes()) + console.log('todayPlan',that.data.planToday) + that.onGETDETAILP() + } + else{ + that.setData({ + todayPNULL:true, + 'planToday.id':'', + 'planToday.beginTimestamp': 0, + 'planToday.endTimestamp':0, + deadline_P:[], + beginline_P:[], + }) + console.log("PNULL") + } + }, + fail: function (res) { + console.log(res) + } + }) + }, + /* + onRESULTS: function () { + var that = this + authRESULT.authRESULTS({ + url : "task", + success: function (res) { + console.log("results",res) + var _taskid=[],_beginline_R=[] + if(res.data != "" ){ + for(var i = 0;i { + util.showSuccess('信道已连接') + console.log('WebSocket 信道已连接') + this.setData({ tunnelStatus: 'connected' }) + }) + + tunnel.on('close', () => { + util.showSuccess('信道已断开') + console.log('WebSocket 信道已断开') + this.setData({ tunnelStatus: 'closed' }) + }) + + tunnel.on('reconnecting', () => { + console.log('WebSocket 信道正在重连...') + util.showBusy('正在重连') + }) + + tunnel.on('reconnect', () => { + console.log('WebSocket 信道重连成功') + util.showSuccess('重连成功') + }) + + tunnel.on('error', error => { + util.showModel('信道发生错误', error) + console.error('信道发生错误:', error) + }) + + // 监听自定义消息(服务器进行推送) + tunnel.on('speak', speak => { + util.showModel('信道消息', speak) + console.log('收到说话消息:', speak) + }) + + // 打开信道 + tunnel.open() + + this.setData({ tunnelStatus: 'connecting' }) + }, + + + //点击「发送消息」按钮,测试使用信道发送消息 + + sendMessage() { + if (!this.data.tunnelStatus || !this.data.tunnelStatus === 'connected') return + // 使用 tunnel.isActive() 来检测当前信道是否处于可用状态 + if (this.tunnel && this.tunnel.isActive()) { + // 使用信道给服务器推送「speak」消息 + this.tunnel.emit('speak', { + 'word': 'I say something at ' + new Date(), + }); + } + }, + + + //点击「关闭信道」按钮,关闭已经打开的信道 + + closeTunnel() { + if (this.tunnel) { + this.tunnel.close(); + } + util.showBusy('信道连接中...') + this.setData({ tunnelStatus: 'closed' }) + }*/ diff --git a/miniprogram/pages/index/index.json b/miniprogram/pages/index/index.json new file mode 100644 index 0000000..e4f67b5 --- /dev/null +++ b/miniprogram/pages/index/index.json @@ -0,0 +1,22 @@ +{ + "component": true, + "enablePullDownRefresh": true, + "backgroundTextStyle": "dark", + "usingComponents": { + "i-row": "../../dist/row/index", + "i-col": "../../dist/col/index", + "i-card": "../../dist/card/index", + "i-progress": "../../dist/progress/index", + "i-grid": "../../dist/grid/index", + "i-grid-item": "../../dist/grid-item/index", + "i-grid-icon": "../../dist/grid-icon/index", + "i-grid-label": "../../dist/grid-label/index", + "i-count-down": "../../dist/count-down/index", + "i-button": "../../dist/button/index", + "i-icon": "../../dist/icon/index", + "i-message": "../../dist/message/index", + "i-load-more": "../../dist/load-more/index", + "i-divider": "../../dist/divider/index", + "i-spin": "../../dist/spin/index" + } +} \ No newline at end of file diff --git a/miniprogram/pages/index/index.wxml b/miniprogram/pages/index/index.wxml new file mode 100644 index 0000000..8fa5be0 --- /dev/null +++ b/miniprogram/pages/index/index.wxml @@ -0,0 +1,356 @@ + + + + + + + + + 时间块进度 + + + + + + + 类型 + + + + 任务 + + + + + 重要性 + + + + + + + + + + + + {{importance[taskToday.Detail[0].importantDegree-1]}} + + + + + + 任务标题 + + + {{taskToday.Detail[[0]].description}} + + + + + + + + 截止时间 + {{deadline[0]}} + + + + + + + + + + 当前 + + + + + + 时间块进度 + + + + + + + 类型 + + + + 计划 + + + + + 重要性 + + + + + + + + + + + + {{importance[planToday.Detail[0].importantDegree-1]}} + + + + + + 计划标题 + + + {{planToday.Detail.description}} + + + + + + + + 截止时间 + {{deadline_P}} + + + + + + + + + + 当前 + + + + + + + + + + + + 当前时间块无任务安排 + + + + + + + + + + + + + + + + + + + + + + 类型 + + + + 任务 + + + + + 重要性 + + + + + + + + + + + + {{importance[taskToday.Detail[index].importantDegree-1]}} + + + + + + 任务标题 + + + {{taskToday.Detail[index].description}} + + + + + 开始时间 {{beginline[index]}} + + + + + + + + + + + + + + + 类型 + + + + 计划 + + + + + 重要性 + + + + + + + + + + + + {{importance[planToday.Detail[index].importantDegree-1]}} + + + + + + 计划标题 + + + {{planToday.Detail[index].description}} + + + + + 开始时间 {{beginline_P[index]}} + + + + + + + + + + + + \ No newline at end of file diff --git a/miniprogram/pages/index/index.wxss b/miniprogram/pages/index/index.wxss new file mode 100644 index 0000000..e5a0515 --- /dev/null +++ b/miniprogram/pages/index/index.wxss @@ -0,0 +1,244 @@ +/**index.wxss**/ +page { + display: flex; + flex-direction: column; + justify-content: flex-start; + background: #F6F6F6; + background: url("http://static.codesdream.com/bk.png") no-repeat; + width: 100%; + background-size: 100% 100%; + background-attachment:fixed; +} + +.userinfo, .uploader, .tunnel,.row ,.row-small{ + margin-top: 40rpx; + height: 140rpx; + width: 100%; + background: #FFF; + border: 1px solid rgba(0, 0, 0, .1); + border-left: none; + border-right: none; + display: flex; + flex-direction: row; + align-items: center; + transition: all 300ms ease; +} + +.userinfo-avatar { + width: 100rpx; + height: 100rpx; + margin: 20rpx; + border-radius: 50%; +} + +.userinfo-nickname { + font-size: 32rpx; + color: #007AFF; + background-color: white; +} + +.userinfo-nickname::after { + border: none; +} + +.uploader, .tunnel { + height: auto; + padding: 0 0 0 40rpx; + flex-direction: column; + align-items: flex-start; + box-sizing: border-box; +} + +.uploader-text, .tunnel-text { + width: 100%; + line-height: 52px; + font-size: 34rpx; + color: #007AFF; +} + +.uploader-container { + width: 100%; + height: 400rpx; + padding: 20rpx 20rpx 20rpx 0; + display: flex; + align-content: center; + justify-content: center; + box-sizing: border-box; + border-top: 1px solid rgba(0, 0, 0, .1); +} + +.uploader-image { + width: 100%; + height: 360rpx; +} + +.tunnel { + padding: 0 0 0 40rpx; +} + +.tunnel-text { + position: relative; + color: #222; + display: flex; + flex-direction: row; + align-content: center; + justify-content: space-between; + box-sizing: border-box; + border-top: 1px solid rgba(0, 0, 0, .1); +} + +.tunnel-text:first-child { + border-top: none; +} + +.tunnel-switch { + position: absolute; + right: 20rpx; + top: -2rpx; +} + +.disable { + color: #888; +} + +.service { + position: fixed; + right: 40rpx; + bottom: 40rpx; + width: 140rpx; + height: 140rpx; + border-radius: 50%; + background: linear-gradient(#007AFF, #0063ce); + box-shadow: 0 5px 10px rgba(0, 0, 0, .3); + display: flex; + align-content: center; + justify-content: center; + transition: all 300ms ease; +} + +.service-button { + position: absolute; + top: 40rpx; +} + +.service:active { + box-shadow: none; +} + +.request-text { + padding: 20rpx 0; + font-size: 24rpx; + line-height: 36rpx; + word-break: break-all; +} + +.area3{ + margin-top: 15rpx; + display:flex; + /*row 横向 column 列表 */ + flex-direction: row; + background-color: #f9f7f7; + border-radius: 15rpx; + margin-left:15rpx; + margin-right:15rpx; + + } + .start{ + top: 20px; + position: relative; + } + .t1{ + position:relative; + margin-left: auto; + margin-right: auto; + } + .t2{ + position:relative; + margin-left: auto; + margin-right: auto; +} +.t3{ + margin-left: auto; + margin-right: auto; +} +.row,.row-small{ + width: auto; + margin-top: 0px; + left: 10px; + right: 10px; + width: 90%; + border: 0px; + +} +.btn,.sx,.sx2,.ks,.ks2{ + margin-left: auto; + margin-right: auto; + height: 40px; + background-color: lightslategrey; + color: white; + text-align: center; + +} +.sx2{ + background-color:rgb(65, 65, 65) ; +} +.progress-box{ + height: 30px; + width: 250px; + margin-left: 20px; +} +.pro{ + color: rgb(140, 141, 147); +} +.ks{ + background-color: #9553ff; +} +.ks2{ + background-color: #574279; +} +.btn{ + margin-left:20px ; +} + +.row-class{ + margin-bottom:20px; +} + +.row-class-near{ + margin-bottom:5px; +} + +.count-down{ + font-size: 20px; + height: 20px; + line-height: 1; +} + +.tp-title{ + text-align: center; + font-size: 18px; + color: #495060; +} + +.divLine{ + background: #E0E3DA; + width: 100%; + height: 3rpx; +} + +.row-card{ + margin-top: 10px; + margin-bottom: 10px; +} + +.no-alloc-desc{ + margin-top: 15px; +} + +.load-more{ + color: #ff9900; +} + +.no-alloc-row{ + height: 250px; +} \ No newline at end of file diff --git a/miniprogram/pages/information/about/about.js b/miniprogram/pages/information/about/about.js new file mode 100644 index 0000000..990b39f --- /dev/null +++ b/miniprogram/pages/information/about/about.js @@ -0,0 +1,72 @@ +// miniprogram/pages/information/about/about.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + loading : true + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + + }, + + imgLoad(res) { + this.setData({ + loading:false, + }) + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/miniprogram/pages/information/about/about.json b/miniprogram/pages/information/about/about.json new file mode 100644 index 0000000..d802632 --- /dev/null +++ b/miniprogram/pages/information/about/about.json @@ -0,0 +1,11 @@ +{ + "usingComponents": { + "i-row": "../../../dist/row/index", + "i-col": "../../../dist/col/index", + "i-input": "../../../dist/input/index", + "i-panel": "../../../dist/panel/index", + "i-radio-group": "../../../dist/radio-group/index", + "i-radio": "../../../dist/radio/index", + "i-spin": "../../../dist/spin/index" + } +} \ No newline at end of file diff --git a/miniprogram/pages/information/about/about.wxml b/miniprogram/pages/information/about/about.wxml new file mode 100644 index 0000000..503e84f --- /dev/null +++ b/miniprogram/pages/information/about/about.wxml @@ -0,0 +1,29 @@ + + + + + + + + + + 码梦工坊 + + + + + 自动日程规划 + + + + + Version + 1.2.1 + + + + + + Copyright © 2020 码梦工坊. All rights reserved. + + \ No newline at end of file diff --git a/miniprogram/pages/information/about/about.wxss b/miniprogram/pages/information/about/about.wxss new file mode 100644 index 0000000..76873aa --- /dev/null +++ b/miniprogram/pages/information/about/about.wxss @@ -0,0 +1,54 @@ +/* miniprogram/pages/information/about/about.wxss */ + +page { + background: #F6F6F6; + display: flex; + flex-direction: column; + justify-content: flex-start; + background: url("http://static.codesdream.com/bk.png") no-repeat; + width: 100%; + background-size: 100% 100%; + background-attachment:fixed; +} + +.icon-row{ + margin-top: 40%; +} + +.title-row{ + margin-top: 5px; + font-size: 26px; + font-weight: bold; + text-align: center; +} + +.text-row{ + margin-top: 8px; + font-size: 17px; + text-decoration: underline; +} +.version-row{ + margin-top: 8px; + font-size: 17px; + font-weight: bold; +} + +.copyright-row{ + position: fixed; + width: 100%; + height: 50rpx; + bottom:0px; + z-index: -1; +} + +.copyright-text{ + color: #80848f; + font-size: smaller; +} + +.center-view{ + margin-top: 0px; + text-align: center; + display: flex; + justify-content: center; +} \ No newline at end of file diff --git a/miniprogram/pages/information/graph/graph.js b/miniprogram/pages/information/graph/graph.js new file mode 100644 index 0000000..9f06e9d --- /dev/null +++ b/miniprogram/pages/information/graph/graph.js @@ -0,0 +1,245 @@ +// miniprogram/pages/information/graph/graph.js +var uCharts = require('../../../utils/ucharts/u-charts'); +var authCOMP = require('../../../utils/authCOMP') +Page({ + + /** + * 页面的初始数据 + */ + data: { + allFinishRate: 0.00, + taskFinishRate: 0.00, + planFinishRate: 0.00 + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + let that = this + this.showFinishedRate("canvasAllFinishedRate", + { + series: [{ + name: '总完成度', + data: this.data.allFinishRate, + color: '#19be6b' + }] + }); + + this.showFinishedRate("canvasTaskFinishedRate", + { + series: [{ + name: '任务完成度', + data: this.data.taskFinishRate, + color: '#2d8cf0' + }] + }); + + this.showFinishedRate("canvasPlanFinishedRate", + { + series: [{ + name: '计划完成度', + data: this.data.planFinishRate, + color: '#ff9900' + }] + }); + + this.showFunnel("funnelFinished", + { + "series": [{ + "name": "90%-100%", + "data": 0 + }, { + "name": "80%-90%", + "data": 0 + }, { + "name": "70%-80%", + "data": 0 + }, { + "name": "60%-70%", + "data": 0 + }, { + "name": "<60%", + "data": 0 + }] + }); + this.showColumn("columnNumbered", + { + "categories": ["周一", "周二", "周三", "周四", "周五", "周六", "周日"], + "series": [{ + "name": "已完成", + "data": [0, {"value": 0,"color": "#f04864"}, 0, 0, 0, 0] + }, { + "name": "未完成", + "data": [0, {"value": 0,"color": "#facc14"}, 0, 0, 0, 0] + }] + }) + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + this.onQuery() + }, + onQuery:function(){ + authCOMP.authCOMP({ + url : "total", + data: { + + }, + success: function (res) { + console.log("get",res) + + }, + fail: function (res) { + console.log(res) + } + }) + }, + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + }, + + showFunnel: function(canvasId, chartData){ + canvaFunnel=new uCharts({ + $this:this, + canvasId: canvasId, + type: 'funnel', + fontSize:11, + padding:[15,15,0,15], + legend:{ + show:true, + padding:5, + lineHeight:11, + margin:0, + }, + background:'#FFFFFF', + pixelRatio:this.pixelRatio, + series: chartData.series, + animation: true, + width: 300, + height: 200, + dataLabel: true, + extra: { + funnel: { + border:true, + borderWidth:2, + borderColor:'#FFFFFF' + } + }, + }) + }, + + showFinishedRate: function(canvasId, chartData){ + canvasFinishedRate = new uCharts({ + $this:this, + canvasId: canvasId, + type: 'arcbar', + fontSize:11, + legend:{show:false}, + background:'#FFFFFF', + pixelRatio:1, + series: chartData.series, + animation: true, + width: 120, + height: 120, + dataLabel: true, + title: { + name: Math.round(chartData.series[0].data*100)+'%', + color: chartData.series[0].color, + fontSize: 25 + }, + subtitle: { + name: chartData.series[0].name, + color: '#666666', + fontSize: 15 + }, + extra: { + arcbar:{ + type:'default', + width:10 + } + } + }); + }, + + showColumn : function(canvasId, chartData) { + canvaColumn=new uCharts({ + $this:this, + canvasId: canvasId, + type: 'column', + legend:{show:true}, + fontSize:11, + background:'#FFFFFF', + pixelRatio:1, + animation: true, + categories: chartData.categories, + series: chartData.series, + xAxis: { + disableGrid:true, + }, + yAxis: { + //disabled:true + }, + dataLabel: true, + width: 300, + height: 210, + extra: { + column: { + type:'group', + width: 20 + } + } + }); + }, + touchColumn(e) { + canvaColumn.showToolTip(e, { + format: function (item, category) { + if (typeof item.data === 'object') { + return category + ' ' + item.name + ':' + item.data.value + } else { + return category + ' ' + item.name + ':' + item.data + } + } + }); + }, +}) \ No newline at end of file diff --git a/miniprogram/pages/information/graph/graph.json b/miniprogram/pages/information/graph/graph.json new file mode 100644 index 0000000..617d8fb --- /dev/null +++ b/miniprogram/pages/information/graph/graph.json @@ -0,0 +1,7 @@ +{ + "usingComponents": { + "i-row": "../../../dist/row/index", + "i-col": "../../../dist/col/index", + "i-panel": "../../../dist/panel/index" + } +} \ No newline at end of file diff --git a/miniprogram/pages/information/graph/graph.wxml b/miniprogram/pages/information/graph/graph.wxml new file mode 100644 index 0000000..d5523b9 --- /dev/null +++ b/miniprogram/pages/information/graph/graph.wxml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/miniprogram/pages/information/graph/graph.wxss b/miniprogram/pages/information/graph/graph.wxss new file mode 100644 index 0000000..0c1f73a --- /dev/null +++ b/miniprogram/pages/information/graph/graph.wxss @@ -0,0 +1,32 @@ +/* miniprogram/pages/information/graph/graph.wxss */ + +page{ + background-color: #F6F6F6; + background: url("http://static.codesdream.com/bk.png") no-repeat; + width: 100%; + background-size: 100% 100%; + background-attachment:fixed; +} + +.center-view{ + text-align: center; + justify-content: center; + +} + +.finished-row{ + height: 160px; +} + +.numbered-row{ + height: 300px; +} + +.row-view{ + +} + +.charts{ + height: 200px; + width: 100%; +} \ No newline at end of file diff --git a/miniprogram/pages/information/help/help.js b/miniprogram/pages/information/help/help.js new file mode 100644 index 0000000..54e9f7d --- /dev/null +++ b/miniprogram/pages/information/help/help.js @@ -0,0 +1,66 @@ +// miniprogram/pages/information/help/help.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/miniprogram/pages/information/help/help.json b/miniprogram/pages/information/help/help.json new file mode 100644 index 0000000..42caa53 --- /dev/null +++ b/miniprogram/pages/information/help/help.json @@ -0,0 +1,7 @@ +{ + "usingComponents": { + "i-panel": "../../../dist/panel/index", + "i-cell-group": "../../../dist/cell-group/index", + "i-cell": "../../../dist/cell/index" + } +} \ No newline at end of file diff --git a/miniprogram/pages/information/help/help.wxml b/miniprogram/pages/information/help/help.wxml new file mode 100644 index 0000000..af4107f --- /dev/null +++ b/miniprogram/pages/information/help/help.wxml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/miniprogram/pages/information/help/help.wxss b/miniprogram/pages/information/help/help.wxss new file mode 100644 index 0000000..628dbff --- /dev/null +++ b/miniprogram/pages/information/help/help.wxss @@ -0,0 +1 @@ +/* miniprogram/pages/information/help/help.wxss */ \ No newline at end of file diff --git a/miniprogram/pages/information/information.js b/miniprogram/pages/information/information.js new file mode 100644 index 0000000..271ee50 --- /dev/null +++ b/miniprogram/pages/information/information.js @@ -0,0 +1,87 @@ +// pages/information/information.js +var authGET = require('../../utils/authGET') +const app = getApp() +Page({ + + data: { + avatarUrl: '../../images/user-unlogin.png', + userInfo: {}, + loading: true, + }, + onLoad:function(){ + var that = this; + wx.getSetting({ + success: res => { + if (res.authSetting['scope.userInfo']) { + // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 + wx.getUserInfo({ + success: res => { + that.setData({ + avatarUrl: res.userInfo.avatarUrl, + userInfo: res.userInfo, + loading: false, + + }) + app.globalData.userInfo=this.data.userInfo + console.log(app.globalData.userInfo); + let that1 = that; + authGET.authGET({ + url : "user/star", + data: { + }, + success: function (res) { + console.log(res) + that1.setData({ + star : res.data.starNum, + starDescription : res.data.description, + loading: false + }) + }, + fail: function (res) { + console.log(res) + that1.setData({ + star : 0, + starDescription : "暂无执行力评价", + loading: false + }) + } + }) + } + }) + } + else{ + wx.showToast({ + title: '未登录', + icon:'none', + duration:2000, + }) + } + } + }); + }, + goSetting :function(){ + wx.navigateTo({ + url: 'setting/setting', + }) + }, + goHelp :function(){ + wx.navigateTo({ + url: 'help/help', + }) +}, + goGraph :function(){ + wx.navigateTo({ + url: 'graph/graph', + }) +}, + goSubmit :function(){ + wx.navigateTo({ + url: 'submit/submit', + }) + }, + goAbout :function(){ + wx.navigateTo({ + url: 'about/about', + }) + } +}) diff --git a/miniprogram/pages/information/information.json b/miniprogram/pages/information/information.json new file mode 100644 index 0000000..7322aed --- /dev/null +++ b/miniprogram/pages/information/information.json @@ -0,0 +1,25 @@ +{ + "component": true, + "usingComponents": { + "i-row": "../../dist/row/index", + "i-col": "../../dist/col/index", + "i-card": "../../dist/card/index", + "i-progress": "../../dist/progress/index", + "i-grid": "../../dist/grid/index", + "i-grid-item": "../../dist/grid-item/index", + "i-grid-icon": "../../dist/grid-icon/index", + "i-grid-label": "../../dist/grid-label/index", + "i-count-down": "../../dist/count-down/index", + "i-icon": "../../dist/icon/index", + "i-avatar": "../../dist/avatar/index", + "i-button": "../../dist/button/index", + "i-cell-group": "../../dist/cell-group/index", + "i-cell": "../../dist/cell/index", + "i-rate": "../../dist/rate/index", + "i-spin": "../../dist/spin/index", + "mp-cells": "weui-miniprogram/cells/cells", + "mp-cell": "weui-miniprogram/cell/cell", + "mp-slideview": "weui-miniprogram/slideview/slideview", + "mp-icon": "weui-miniprogram/icon/icon" +} +} \ No newline at end of file diff --git a/miniprogram/pages/information/information.wxml b/miniprogram/pages/information/information.wxml new file mode 100644 index 0000000..75a8baf --- /dev/null +++ b/miniprogram/pages/information/information.wxml @@ -0,0 +1,48 @@ + + + + + + + + + {{userInfo.nickName}} + + + + + + {{starDescription}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/miniprogram/pages/information/information.wxss b/miniprogram/pages/information/information.wxss new file mode 100644 index 0000000..e81157a --- /dev/null +++ b/miniprogram/pages/information/information.wxss @@ -0,0 +1,93 @@ +/* pages/information/information.wxss */ + +page { + background: #F6F6F6; + display: flex; + flex-direction: column; + justify-content: flex-start; + background: url("http://static.codesdream.com/bk.png") no-repeat; + width: 100%; + background-size: 100% 100%; + background-attachment:fixed; +} +.row,.row0,.row2{ + margin-top: 2px; + height :50px; + width: 95%; + margin-left:auto; + margin-right:auto; + background-color:white +} +.row0{ + height: 100px; + display: flex; + flex-direction: row; +} +.row2{ +margin-top: 0; +} +.tou{ + width: 70px; + height: 70px; + margin-top: 36px; + margin-left: 30px; + border: 1px solid #80848f; + border-radius: 100%; + background-color: #f6f9ff; +} +.shu{ + left: 20px; + top: 10px; + position: relative; +} + +.set,.set2{ + width: 110px; + height: 30px; + font-size: 13px; + color: rgb(133, 112, 182); + background-color: rgb(255, 255, 255); + margin-top:10px ; + margin-left: 0; + border: 1px solid rgb(133, 112, 182); +} + +.set2{ + background-color: rgb(184, 160, 255); +} + +.info-name{ + font-size: 18px; + font-weight: bold; +} +.info-title{ + font-size: 13px; + font-weight: bold; +} + +.row-class{ + margin-bottom: 10px; +} + +.divLine{ + background: #E0E3DA; + width: 100%; + height: 3rpx; + margin-top: 5px; +} + +.name-row{ + margin-top: 15px; +} + +.rate-class{ + margin-left: 10px; +} + +.info-row-class{ + background-color: white; +} + +.menu{ + font-size: smaller; +} diff --git a/miniprogram/pages/information/setting/setting.js b/miniprogram/pages/information/setting/setting.js new file mode 100644 index 0000000..0ea30ef --- /dev/null +++ b/miniprogram/pages/information/setting/setting.js @@ -0,0 +1,136 @@ +// pages/information/setting/setting.js +var app = getApp(); +var authTIME = require('../../../utils/authTIME') +function formatNumber(n) { + n = n.toString() + return n[1] ? n : '0' + n +} +Page({ + data: { + hiddenmodalput: true, + current: 'tab1', + hour:['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23'],beginhour_index:0,endhour_index:0, + minute:["00","30"],beginmin_index:0,endmin_index:0, + week:["","周一","周二","周三","周四","周五","周六","周日"], + week_index:1, + FBTimeList:[[{startScale: 0, endScale: 12}],[{startScale: 0, endScale: 12}],[{startScale: 0, endScale: 12}],[{startScale: 0, endScale: 12}],[{startScale: 0, endScale: 12}],[{startScale: 0, endScale: 12}],[{startScale: 0, endScale: 12}],[{startScale: 0, endScale: 12}]], + actions : [{ + name : '删除', + width : 100, + color : '#fff', + fontsize : '20', + icon : 'trash', + background : '#ed3f14' + }] + }, + onLoad:function(){ + this.onGET() + }, + onGET:function(){ + var that = this + authTIME.authGET({ + url : "", + data: { + "dow":this.data.week_index, + }, + success: function (res) { + console.log("get",res) + var FBTL =that.data.FBTimeList + FBTL.splice(res.data.dayOfWeek,1,res.data.periods) + that.setData({ + FBTimeList:FBTL + }) + console.log("FB",that.data.FBTimeList) + }, + fail: function (res) { + console.log(res) + } + }) + }, + onPOST:function(){ + var that = this + authTIME.authPOST({ + data: { + "dayOfWeek": this.data.week_index, + "periods": this.data.FBTimeList[this.data.week_index] + }, + success: function (res) { + console.log("post",res) + that.onGET() + }, + fail: function (res) { + console.log(res) + } + }) + }, + handleChange ({ detail }) { + this.setData({ + current: detail.key, + week_index:detail.key.substr(-1), + }); + this.onGET() + }, + modalinput:function(){ + this.setData({ + hiddenmodalput: !this.data.hiddenmodalput + }) + }, + cancel: function(){ + this.setData({ + hiddenmodalput: true, + }); + }, + confirm: function(){ //确认 + this.setData({ + hiddenmodalput: true, + }) + this.goCreateFBtime() + }, + bindBeginhourChange:function(e){ + this.setData({ + beginhour_index:e.detail.value + }) + console.log('beginhour值为', this.data.beginhour_index) + }, + bindEndhourChange:function(e){ + this.setData({ + endhour_index:e.detail.value + }) + console.log('endhour值为', this.data.endhour_index) + }, + bindBeginminChange:function(e){ + this.setData({ + beginmin_index:e.detail.value + }) + console.log('beginmin值为', this.data.beginmin_index) + }, + bindEndminChange:function(e){ + this.setData({ + endmin_index:e.detail.value + }) + console.log('endmin值为', this.data.endmin_index) + }, + goCreateFBtime(e){ + var dayFBTime=this.data.FBTimeList + var a={ + "startScale":this.data.beginhour_index*2+this.data.beginmin_index*1, + "endScale":this.data.endhour_index*2+this.data.endmin_index*1, + } + dayFBTime[this.data.week_index].push(a) + this.setData({ + FBTimeList:dayFBTime, + }) + console.log("FBTimeList",this.data.FBTimeList) + this.onPOST() + }, + deleteTime:function(e){ + console.log(e.currentTarget.dataset.value) + var dayFBTime=this.data.FBTimeList + dayFBTime[this.data.week_index].splice(e.currentTarget.dataset.value,1) + this.setData({ + FBTimeList:dayFBTime + }) + this.onPOST() + } + +}) diff --git a/miniprogram/pages/information/setting/setting.json b/miniprogram/pages/information/setting/setting.json new file mode 100644 index 0000000..4f6b9f7 --- /dev/null +++ b/miniprogram/pages/information/setting/setting.json @@ -0,0 +1,20 @@ +{ + "component": true, + "usingComponents": { + "i-row": "../../../dist/row/index", + "i-col": "../../../dist/col/index", + "i-card": "../../../dist/card/index", + "i-progress": "../../../dist/progress/index", + "i-grid": "../../../dist/grid/index", + "i-grid-item": "../../../dist/grid-item/index", + "i-grid-icon": "../../../dist/grid-icon/index", + "i-grid-label": "../../../dist/grid-label/index", + "i-count-down": "../../../dist/count-down/index", + "i-button": "../../../dist/button/index", + "i-icon": "../../../dist/icon/index", + "i-avatar": "../../../dist/avatar/index", + "i-tabs": "../../../dist/tabs/index", + "i-tab": "../../../dist/tab/index", + "i-swipeout": "../../../dist/swipeout/index" + } +} \ No newline at end of file diff --git a/miniprogram/pages/information/setting/setting.wxml b/miniprogram/pages/information/setting/setting.wxml new file mode 100644 index 0000000..812f539 --- /dev/null +++ b/miniprogram/pages/information/setting/setting.wxml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 开始:{{(FBTimeList[week_index][index].startScale/2)|Int}}时{{(FBTimeList[week_index][index].startScale%2)*30}}分 + + + + 结束:{{(FBTimeList[week_index][index].endScale/2)|Int}}时{{(FBTimeList[week_index][index].endScale%2*30)}}分 + + + + + + + \ No newline at end of file diff --git a/miniprogram/pages/information/setting/setting.wxss b/miniprogram/pages/information/setting/setting.wxss new file mode 100644 index 0000000..b1a0510 --- /dev/null +++ b/miniprogram/pages/information/setting/setting.wxss @@ -0,0 +1,91 @@ +/* pages/information/setting/setting.wxss */ +.btn{ + width:200px; +} +.btn-area{ + display: flex; + flex-direction: row; +} +.box{ + display: flex; + flex-direction: row; + width:100%; + height: auto; +} +.t2{ + font-size: 10px; +} +.page-section{ + margin-top:10px; +} +.page-section3{ + margin-top:40px; +} +.c1{ + + background-color: rgb(80, 80, 80); +} + +.blk0,.blk1{ + border: 1px solid rgb(127, 63, 255); + width: 72px; + height:40px; + margin-left: 5px; + border-radius: 10px; + color: rgb(127, 63, 255); + text-align: center; +} +.blk1{ + border: 1px solid rgb(127, 63, 255); + background-color: rgb(127, 63, 255); + color: white; + border-radius: 10px; + +} +.row3{ + display: flex; + flex-direction: row; + margin-top: 5px; +} +page{ + background-color: #F6F6F6; + background: url("http://static.codesdream.com/bk.png") no-repeat; + width: 100%; + background-size: 100% 100%; + background-attachment:fixed; +} + +input[type=checkbox] { + zoom: 50%; +} + +.circle-view1{ + height: 120rpx; + width: 120rpx; + background-color: #19be6b; + border-radius: 100%; + position: fixed; + bottom: 100rpx; + right: 40rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 9; + border: 0 solid #ffffff; + box-shadow: 4px 1px 1px #cccccc; +} + +.item-row{ + height: 12px; +} + +.item{ + height: 56px; +} + +.center-view{ + margin-top: 0px; + text-align: center; + display: flex; + justify-content: center; +} \ No newline at end of file diff --git a/miniprogram/pages/information/submit/submit.js b/miniprogram/pages/information/submit/submit.js new file mode 100644 index 0000000..6a1cbc1 --- /dev/null +++ b/miniprogram/pages/information/submit/submit.js @@ -0,0 +1,155 @@ +// miniprogram/pages/information/submit/submit.js +var authPOST = require('../../../utils/authPOST') +let app = getApp(); + +Page({ + + /** + * 页面的初始数据 + */ + data: { + userInfo: {}, + complain: [{id: 1,name: '漏洞反馈',}, {id: 2,name: '功能建议'}], + current: '漏洞反馈', + type: 0, + nickname:'', + emali:'', + text:'', + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + wx.getSetting({ + success: res => { + if (res.authSetting['scope.userInfo']) { + // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 + wx.getUserInfo({ + success: res => { + this.setData({ + avatarUrl: res.userInfo.avatarUrl, + userInfo: res.userInfo, + }) + app.globalData.userInfo=this.data.userInfo + console.log(app.globalData.userInfo); + + } + }) + } + else{ + wx.showToast({ + title: '未登录', + icon:'none', + duration:2000, + }) + } + } + }); + }, + + handleComplainChange: function({ detail = {} }) { + var index=0 + if(detail.value == "漏洞反馈") index=0 + else if (detail.value == "功能建议") index=1 + this.setData({ + type: index, + current:detail.value, + }); + console.log('chang_type', this.data.type) + }, + + bindNickNameBlur(e) { + console.log('nickname发生改变,携带值为', e.detail.detail.value) + this.setData({ + nickname: e.detail.detail.value + }) + console.log('nickname值为', this.data.nickname) + }, + bindEmailBlur(e) { + console.log('email发生改变,携带值为', e.detail.detail.value) + this.setData({ + emali: e.detail.detail.value + }) + console.log('email值为', this.data.emali) + }, + bindTextBlur(e) { + console.log('text发生改变,携带值为', e.detail.detail.value) + this.setData({ + text: e.detail.detail.value + }) + console.log('text值为', this.data.text) + }, + handleSubmit() { + authPOST.authPOST({ + url : "user/submit", + data: { + "type":this.data.type, + "text":this.data.text + }, + success: function (res) { + console.log(res) + wx.reLaunch({ + url: '../information', + }) + wx.showToast({ + title: '创建成功', + icon:"success", + duration: 2000 + }) + }, + fail: function (res) { + console.log(res) + } + }) + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/miniprogram/pages/information/submit/submit.json b/miniprogram/pages/information/submit/submit.json new file mode 100644 index 0000000..499b04a --- /dev/null +++ b/miniprogram/pages/information/submit/submit.json @@ -0,0 +1,12 @@ +{ + "usingComponents": { + "i-row": "../../../dist/row/index", + "i-col": "../../../dist/col/index", + "i-input": "../../../dist/input/index", + "i-panel": "../../../dist/panel/index", + "i-radio-group": "../../../dist/radio-group/index", + "i-radio": "../../../dist/radio/index", + "i-button": "../../../dist/button/index", + "i-toast": "../../../dist/toast/index" + } +} \ No newline at end of file diff --git a/miniprogram/pages/information/submit/submit.wxml b/miniprogram/pages/information/submit/submit.wxml new file mode 100644 index 0000000..a2796ec --- /dev/null +++ b/miniprogram/pages/information/submit/submit.wxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + +提交反馈 \ No newline at end of file diff --git a/miniprogram/pages/information/submit/submit.wxss b/miniprogram/pages/information/submit/submit.wxss new file mode 100644 index 0000000..669e9dc --- /dev/null +++ b/miniprogram/pages/information/submit/submit.wxss @@ -0,0 +1,12 @@ +/* miniprogram/pages/information/submit/submit.wxss */ + +page { + background: #F6F6F6; + display: flex; + flex-direction: column; + justify-content: flex-start; +} + +.button-row{ + margin-top: 40px; +} \ No newline at end of file diff --git a/miniprogram/pages/init/down.png b/miniprogram/pages/init/down.png new file mode 100644 index 0000000000000000000000000000000000000000..a19ab4054ba8ca4e4238bc7aa6a6227bb9dbdad4 GIT binary patch literal 3850 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 Ky23i>!v6syx$c_) literal 0 HcmV?d00001 diff --git a/miniprogram/pages/init/init.js b/miniprogram/pages/init/init.js new file mode 100644 index 0000000..2df4a15 --- /dev/null +++ b/miniprogram/pages/init/init.js @@ -0,0 +1,94 @@ +// miniprogram/pages/init/init.js +let app = getApp() +Page({ + + /** + * 页面的初始数据 + */ + data: { + loading: true, + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + + }, + + imgLoad1(res) { + this.setData({ + loading:false, + }) + }, + + /*微信授权登陆 */ + getuserinfo:function(e){ + if(e.detail.userInfo){ + console.log('授权通过') + app.globalData.userInfo = e.detail.userInfo + console.log( app.globalData.userInfo) + wx.reLaunch({ + url: '../index/index', + }) + }else{ + console.log('拒绝授权') + wx.showModal({ + title: '真香警告!' + }) + } + }, + + noneLoading(res){ + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/miniprogram/pages/init/init.json b/miniprogram/pages/init/init.json new file mode 100644 index 0000000..d219d00 --- /dev/null +++ b/miniprogram/pages/init/init.json @@ -0,0 +1,18 @@ +{ + "usingComponents": { + "i-row": "../../dist/row/index", + "i-col": "../../dist/col/index", + "i-card": "../../dist/card/index", + "i-progress": "../../dist/progress/index", + "i-grid": "../../dist/grid/index", + "i-grid-item": "../../dist/grid-item/index", + "i-grid-icon": "../../dist/grid-icon/index", + "i-grid-label": "../../dist/grid-label/index", + "i-count-down": "../../dist/count-down/index", + "i-button": "../../dist/button/index", + "i-icon": "../../dist/icon/index", + "i-load-more": "../../dist/load-more/index", + "i-divider": "../../dist/divider/index", + "i-spin": "../../dist/spin/index" + } +} \ No newline at end of file diff --git a/miniprogram/pages/init/init.wxml b/miniprogram/pages/init/init.wxml new file mode 100644 index 0000000..548f9d9 --- /dev/null +++ b/miniprogram/pages/init/init.wxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/miniprogram/pages/init/init.wxss b/miniprogram/pages/init/init.wxss new file mode 100644 index 0000000..0519abf --- /dev/null +++ b/miniprogram/pages/init/init.wxss @@ -0,0 +1,27 @@ +/* miniprogram/pages/init/init.wxss */ +.btn{ + position: absolute; + top: 500px; + right :20px; + width: 50px; + height: 30px; + background-color: white; +} + +.down-img{ + width: 20px; + height: 30px; +} + +.down-row{ + position: fixed; + bottom: 20px; + width: 100%; +} + +.auth-button{ + width: 70%; + margin-top: 20px; + margin-bottom: 50px; + background-color: #19be6b; +} \ No newline at end of file diff --git a/miniprogram/pages/list/createPlan/createPlan.js b/miniprogram/pages/list/createPlan/createPlan.js new file mode 100644 index 0000000..a845795 --- /dev/null +++ b/miniprogram/pages/list/createPlan/createPlan.js @@ -0,0 +1,310 @@ +// pages/create/create.js +const app = getApp() +var authPOST = require('../../../utils/authPOST') +var authGET = require('../../../utils/authGET') +var authPATCH = require('../../../utils/authPATCH') +var util = require('../../../utils/util.js') +const date = new Date(); +const years = []; +const months = []; +const days = []; +const hours = []; +const minitue = ['00分','30分']; +//获取年 +for (let i = date.getFullYear(); i <= date.getFullYear() + 1; i++) { + years.push("" + i+'年'); + } +for (let i = 1; i <= 12; i++) { + if (i < 10) { + i = "0" + i; + } + months.push("" + i+'月'); +} +for (let i = 1; i <= 31; i++) { + if (i < 10) { + i = "0" + i; + } + days.push("" + i+'日'); +} +for (let i = 0; i < 24; i++) { + if (i < 10) { + i = "0" + i; + } + hours.push("" + i+'时'); +} +function formatNumber(n) { + n = n.toString() + return n[1] ? n : '0' + n +} +Page({ + data: { + multiArray: [years, months,days, hours, minitue], + multiIndex: [0, 9, 16, 10, 17], + choose_year: '', + hh:"\n", + description:new Array, + dscp:'', + + ddl_time:'', + deadline:0, + importance: [{id: 1,name: '重要',}, {id: 2,name: '一般'}, {id: 3,name: '次要'}], + current: '一般',importantDegree:1, + prefer_time: [{id: 0,name: '任意'},{id: 1,name: '早上',}, {id: 2,name: '中午'}, {id: 3,name: '晚上'}], + pt_current: '任意',pref_index:-1, + + singleMin:0, + dd:0,duration:0,//所需时间块 + mutexPeriod:0, + + position: 'left', + checked: false, + disabled: false, + error: '', + + }, + onLoad: function(options) { + //设置默认的年份 + this.setData({ + choose_year: this.data.multiArray[0][0] + }) + }, + onReady:function(){ + var timestamp = Date.parse(new Date()); + timestamp = timestamp / 1000; + var n = timestamp * 1000; + var date = new Date(n); + this.setData({ + multiIndex:[date.getFullYear(),date.getMonth(),date.getDate(),date.getHours()+1, 0], + ddl_time:[date.getFullYear(),date.getMonth()+1,date.getDate()].map(formatNumber).join('-')+' '+[date.getHours()+1, 00].map(formatNumber).join(':'), + }) + console.log(this.data.ddl_time) + }, + bindDescriptionBlur(e) { + console.log('description发送改变,携带值为', e.detail.detail.value) + let dscptn = new Array + dscptn.push(e.detail.detail.value) + this.setData({ + description: dscptn + }) + console.log('description值为', this.data.description) + }, + bindMultiPickerChange: function(e) { + console.log('picker发送选择改变,携带值为', e.detail.value) + this.setData({ + multiIndex: e.detail.value + }) + const index = this.data.multiIndex; + const year = this.data.multiArray[0][index[0]].slice(0,4); + const month = this.data.multiArray[1][index[1]].slice(0,2); + const day = this.data.multiArray[2][index[2]].slice(0,2); + const hour = this.data.multiArray[3][index[3]].slice(0,2); + const minute = this.data.multiArray[4][index[4]].slice(0,2); + //console.log(`${year}-${month}-${day} ${hour}:${minute}`); + this.setData({ + ddl_time: year + '-' + month + '-' + day + ' ' + hour + ':' + minute + }) + console.log(this.data.ddl_time); + }, + + bindMultiPickerColumnChange: function(e) { + //获取年份 + if (e.detail.column == 0) { + let choose_year = this.data.multiArray[e.detail.column][e.detail.value]; + console.log(choose_year); + this.setData({ + choose_year + }) + } + console.log('修改的列为', e.detail.column, ',值为', e.detail.value); + if (e.detail.column == 1) { + let num = parseInt(this.data.multiArray[e.detail.column][e.detail.value]); + let temp = []; + if (num == 1 || num == 3 || num == 5 || num == 7 || num == 8 || num == 10 || num == 12) { //判断31天的月份 + for (let i = 1; i <= 31; i++) { + if (i < 10) { + i = "0" + i; + } + temp.push("" + i+'日'); + } + this.setData({ + ['multiArray[2]']: temp + }); + } else if (num == 4 || num == 6 || num == 9 || num == 11) { //判断30天的月份 + for (let i = 1; i <= 30; i++) { + if (i < 10) { + i = "0" + i; + } + temp.push("" + i+'日'); + } + this.setData({ + ['multiArray[2]']: temp + }); + } else if (num == 2) { //判断2月份天数 + let year = parseInt(this.data.choose_year); + console.log(year); + if (((year % 400 == 0) || (year % 100 != 0)) && (year % 4 == 0)) { + for (let i = 1; i <= 29; i++) { + if (i < 10) { + i = "0" + i; + } + temp.push("" + i+'日'); + } + this.setData({ + ['multiArray[2]']: temp + }); + } else { + for (let i = 1; i <= 28; i++) { + if (i < 10) { + i = "0" + i; + } + temp.push("" + i+'日'); + } + this.setData({ + ['multiArray[2]']: temp + }); + } + } + //console.log(this.data.multiArray[2]); + } + var data = { + multiArray: this.data.multiArray, + multiIndex: this.data.multiIndex + }; + data.multiIndex[e.detail.column] = e.detail.value; + this.setData(data); + }, + + handleImportantChange({ detail = {} }) { + var imptdg=0 + if(detail.value == "重要") imptdg=0 + else if (detail.value == "一般") imptdg=1 + else imptdg=2 + this.setData({ + current: detail.value, + importantDegree:imptdg, + }); + console.log('importantDegree', this.data.importantDegree) + }, + + handlePrefChange({ detail = {} }) { + var pref=-1 + if(detail.value == "任意") pref=-1 + else if (detail.value == "早上") pref=0 + else if (detail.value == "中午") pref=1 + else pref=2 + this.setData({ + pt_current: detail.value, + pref_index:pref, + }); + console.log('pref_index', this.data.pref_index) + }, + + bindDurationBlur(e){ + console.log('pref发送改变,携带值为', e.detail.detail.value) + if(Number.isInteger(e.detail.detail.value*1)){ + this.setData({ + dd: e.detail.detail.value + }) + console.log('dd值为', this.data.dd) + } + else{ + this.setData({ + error: '输入必须为整数', + }) + } + }, + bindSingleMinBlur(e){ + console.log('singleMin发送改变,携带值为', e.detail.detail.value) + if(Number.isInteger(e.detail.detail.value*2)){ + if (e.detail.detail.value>0){ + this.setData({ + singleMin: e.detail.detail.value*2 + }) + console.log('singleMin值为', this.data.singleMin) + } + } + else{ + this.setData({ + error: '输入必须为0.5的倍数', + }) + } + + }, + bindMutexPeriodBlur(e){ + console.log('mutexPeriod发送改变,携带值为', e.detail.detail.value) + if(Number.isInteger(e.detail.detail.value*48)){ + if (e.detail.detail.value>0){ + this.setData({ + mutexPeriod: e.detail.detail.value*48 + }) + console.log('mutexPeriod值为', this.data.mutexPeriod) + } + } + else{ + this.setData({ + error: '输入必须为0.5的倍数', + }) + } + }, + onPOST: function () { + let that = this + authPOST.authPOST({ + url : "plan", + data: { + "description":this.data.description, + "deadline":this.data.deadline, + "importantDegree":this.data.importantDegree+1, + "preference":this.data.pref_index, + "singleMin":this.data.singleMin, + "duration":this.data.duration, + "mutexPeriod":this.data.mutexPeriod, + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + }) + }, + surebutton :function (options) { + var timestamp = Date.parse(new Date()); + this.setData({ + duration:this.data.dd*this.data.singleMin, + deadline:new Date(this.data.ddl_time.replace(/-/g,"/")).getTime(), + }) + if(this.data.duration<=0 || this.data.mutexPeriod <= 0){ + this.setData({ + error: '请完善计划信息!', + }) + } + else if((this.data.deadline-timestamp)<31536000000){ + var that = this + wx.showModal({//弹窗提示二次确认 + title: '提示', + content: '确定创建吗', + success: function (res) { + if (res.confirm) { + that.onPOST() + wx.reLaunch({ + url: '../list', + }) + wx.showToast({ + title: '创建成功', + icon:"success", + duration: 2000 + }) + } + else { + console.log('弹框后点取消') + } + } + }) + } + else{ + this.setData({ + error: '时间跨度需小于一年', + }) + } + } +}) diff --git a/miniprogram/pages/list/createPlan/createPlan.json b/miniprogram/pages/list/createPlan/createPlan.json new file mode 100644 index 0000000..dcad566 --- /dev/null +++ b/miniprogram/pages/list/createPlan/createPlan.json @@ -0,0 +1,16 @@ +{ + "component": true, + "usingComponents": { + "i-input": "../../../dist/input/index", + "i-panel": "../../../dist/panel/index", + "i-radio-group": "../../../dist/radio-group/index", + "i-radio": "../../../dist/radio/index", + "i-row": "../../../dist/row/index", + "i-col": "../../../dist/col/index", + "i-cell-group": "../../../dist/cell-group/index", + "i-cell": "../../../dist/cell/index", + "i-button": "../../../dist/button/index", + "mp-toptips": "weui-miniprogram/toptips/toptips" + + } +} \ No newline at end of file diff --git a/miniprogram/pages/list/createPlan/createPlan.wxml b/miniprogram/pages/list/createPlan/createPlan.wxml new file mode 100644 index 0000000..9624073 --- /dev/null +++ b/miniprogram/pages/list/createPlan/createPlan.wxml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +创建并自动安排 diff --git a/miniprogram/pages/list/createPlan/createPlan.wxss b/miniprogram/pages/list/createPlan/createPlan.wxss new file mode 100644 index 0000000..ddbfbd2 --- /dev/null +++ b/miniprogram/pages/list/createPlan/createPlan.wxss @@ -0,0 +1,114 @@ +/* pages/create/create.wxss */ +page { + background: #F6F6F6; + display: flex; + flex-direction: column; + justify-content: flex-start; +} +.head{ + width: 100px; + height: 100px; + left: 50px; + top:20px; +} +.row,.row-2{ + margin-top: 0px; + width: 95%; + margin-left:auto; + margin-right:auto; + background-color:white; +} +.row-2{ + left: 0; + margin-left: 0; + display: flex; +} +.ipt,.picker1,.ipt-2{ + border-style: solid; + border-width: 1px; + margin-left: 20px; + height: 40px; + width: 80%; + margin-top:10px ; + border-radius: 15rpx; + margin-bottom: 15rpx; + border-color: #d7cee6; + font-size: 35rpx; + text-align: center; + background-color: #ffffff; + text-align: left; + + +} +.picker2{ + border-style: solid; + border-width: 1px; + margin-left: 10px; + height: 30px; + width: 100rpx; + margin-top:10px ; + border-radius: 15rpx; + margin-bottom: 15rpx; + border-color: #d7cee6; + font-size: 35rpx; + text-align: center; + background-color: #ffffff; + text-align: center; +} +.ipt-2{ + height: 150px; + +} +.t1{ + margin-left: 20px; + margin-top:10px ; +} +.text2{ + margin-left: 10px; + margin-top:10px ; + margin-right:0px; + font-size: 10px; + color: rgb(164, 166, 169); +} +.t3{ + margin-left: 10px; + left:20px; + bottom: 10px; + position: relative; +} +.btn{ +color: #8538ff; +top: 30px; +width: 90px; +margin-left:auto; +margin-right:auto; +margin-bottom: 100px; +} +.t1{ + font-size: 15px; + color: rgb(76, 74, 77); + +} +.t2{ + top: auto; + margin-top: auto; + margin-left: 30px; + font-size: 13px; + color: rgb(71, 69, 72); +} +.pla{ + +margin-left:10px; +color: rgb(199, 199, 199); + +} +.sld{ + border-block-color: #8234ff; +} +.t4{ + font-size: 10px; + margin-left: 10px; + margin-top: 20px; + color: #c1c1c1; + +} diff --git a/miniprogram/pages/list/createTask/createTask.js b/miniprogram/pages/list/createTask/createTask.js new file mode 100644 index 0000000..b41b8e5 --- /dev/null +++ b/miniprogram/pages/list/createTask/createTask.js @@ -0,0 +1,340 @@ +// pages/create/create.js +const app = getApp() +var authPOST = require('../../../utils/authPOST') +const date = new Date(); +const years = []; +const months = []; +const days = []; +const hours = []; +const minitue = ['00分','30分']; +//获取年 +for (let i = date.getFullYear(); i <= date.getFullYear() + 1; i++) { + years.push("" + i+'年'); + } +for (let i = 1; i <= 12; i++) { + if (i < 10) { + i = "0" + i; + } + months.push("" + i+'月'); +} +for (let i = 1; i <= 31; i++) { + if (i < 10) { + i = "0" + i; + } + days.push("" + i+'日'); +} +for (let i = 0; i < 24; i++) { + if (i < 10) { + i = "0" + i; + } + hours.push("" + i+'时'); +} +function formatNumber(n) { + n = n.toString() + return n[1] ? n : '0' + n +} +Page({ + data: { + multiArray: [years, months,days, hours, minitue], + multiIndex: new Array, + choose_year: '', + hh:"\n", + description:new Array, + + ddl_time:'', + deadline:0, + importance: [{id: 1,name: '重要',}, {id: 2,name: '一般'}, {id: 3,name: '次要'}], + current: '一般',importantDegree:1, + prefer_time: [{id: 0,name: '任意'},{id: 1,name: '早上',}, {id: 2,name: '中午'}, {id: 3,name: '晚上'}], + pt_current: '任意',pref_index:0, + + singleMin:0,singleMax:0, + duration:0,//所需时间块 + + position: 'left', + checked: false, + disabled: false, + error: '', + + }, + onLoad: function(options) { + //设置默认的年份 + this.setData({ + choose_year: this.data.multiArray[0][0] + }) + }, + onReady:function(){ + var timestamp = Date.parse(new Date()); + timestamp = timestamp / 1000; + var n = timestamp * 1000; + var date = new Date(n); + this.setData({ + multiIndex:[date.getFullYear(),date.getMonth(),date.getDate()-1,date.getHours()+1, 0], + ddl_time:[date.getFullYear(),date.getMonth()+1,date.getDate()].map(formatNumber).join('-')+' '+[date.getHours()+1, 00].map(formatNumber).join(':'), + }) + console.log('multiIndex',this.data.multiIndex) + }, + + + bindDescriptionBlur(e) { + console.log('description发送改变,携带值为', e.detail.detail.value) + let dscptn = new Array + dscptn.push(e.detail.detail.value) + this.setData({ + description: dscptn + }) + console.log('description值为', this.data.description) + }, + + bindMultiPickerChange: function(e) { + console.log('picker发送选择改变,携带值为', e.detail.value) + this.setData({ + multiIndex: e.detail.value + }) + const index = this.data.multiIndex; + const year = this.data.multiArray[0][index[0]].slice(0,4); + const month = this.data.multiArray[1][index[1]].slice(0,2); + const day = this.data.multiArray[2][index[2]].slice(0,2); + const hour = this.data.multiArray[3][index[3]].slice(0,2); + const minute = this.data.multiArray[4][index[4]].slice(0,2); + //console.log(`${year}-${month}-${day} ${hour}:${minute}`); + this.setData({ + ddl_time: year + '-' + month + '-' + day + ' ' + hour + ':' + minute + }) + console.log(this.data.ddl_time); + }, + + bindMultiPickerColumnChange: function(e) { + //获取年份 + if (e.detail.column == 0) { + let choose_year = this.data.multiArray[e.detail.column][e.detail.value]; + console.log(choose_year); + this.setData({ + choose_year + }) + } + console.log('修改的列为', e.detail.column, ',值为', e.detail.value); + if (e.detail.column == 1) { + let num = parseInt(this.data.multiArray[e.detail.column][e.detail.value]); + let temp = []; + if (num == 1 || num == 3 || num == 5 || num == 7 || num == 8 || num == 10 || num == 12) { //判断31天的月份 + for (let i = 1; i <= 31; i++) { + if (i < 10) { + i = "0" + i; + } + temp.push("" + i+'日'); + } + this.setData({ + ['multiArray[2]']: temp + }); + } else if (num == 4 || num == 6 || num == 9 || num == 11) { //判断30天的月份 + for (let i = 1; i <= 30; i++) { + if (i < 10) { + i = "0" + i; + } + temp.push("" + i+'日'); + } + this.setData({ + ['multiArray[2]']: temp + }); + } else if (num == 2) { //判断2月份天数 + let year = parseInt(this.data.choose_year); + console.log(year); + if (((year % 400 == 0) || (year % 100 != 0)) && (year % 4 == 0)) { + for (let i = 1; i <= 29; i++) { + if (i < 10) { + i = "0" + i; + } + temp.push("" + i+'日'); + } + this.setData({ + ['multiArray[2]']: temp + }); + } else { + for (let i = 1; i <= 28; i++) { + if (i < 10) { + i = "0" + i; + } + temp.push("" + i+'日'); + } + this.setData({ + ['multiArray[2]']: temp + }); + } + } + //console.log(this.data.multiArray[2]); + } + var data = { + multiArray: this.data.multiArray, + multiIndex: this.data.multiIndex + }; + data.multiIndex[e.detail.column] = e.detail.value; + this.setData(data); + }, + handleImportantChange({ detail = {} }) { + var imptdg=0 + if(detail.value == "重要") imptdg=0 + else if (detail.value == "一般") imptdg=1 + else imptdg=2 + this.setData({ + current: detail.value, + importantDegree:imptdg, + }); + console.log('importantDegree', this.data.importantDegree) + }, + handlePrefChange({ detail = {} }) { + var pref=-1 + if(detail.value == "任意") pref=-1 + else if (detail.value == "早上") pref=0 + else if (detail.value == "中午") pref=1 + else pref=2 + this.setData({ + pt_current: detail.value, + pref_index:pref, + }); + console.log('pref_index', this.data.pref_index) + }, + bindDurationBlur(e){ + console.log('pref发送改变,携带值为', e.detail.detail.value) + if(Number.isInteger(e.detail.detail.value*2)){ + this.setData({ + duration: e.detail.detail.value*2 + }) + console.log('duration值为', this.data.duration) + } + else{ + this.setData({ + error: '输入必须为0.5的倍数' + }) + } + }, + bindSingleMinBlur(e){ + console.log('singleMin发送改变,携带值为', e.detail.detail.value) + if(Number.isInteger(e.detail.detail.value*2)){ + if (e.detail.detail.value>0){ + this.setData({ + singleMin: e.detail.detail.value*2 + }) + console.log('singleMin值为', this.data.singleMin) + } + else{ + this.setData({ + error: '请输入大于0的数' + }) + } + } + else{ + this.setData({ + error: '输入必须为0.5的倍数' + }) + } + + }, + bindSingleMaxBlur(e){ + console.log('singleMax发送改变,携带值为', e.detail.detail.value) + if(Number.isInteger(e.detail.detail.value*2)){ + if (e.detail.detail.value>0){ + this.setData({ + singleMax: e.detail.detail.value*2 + }) + console.log('singleMax值为', this.data.singleMax) + } + else{ + this.setData({ + error: '请输入大于0的数' + }) + } + } + else{ + this.setData({ + error: '输入必须为0.5的倍数' + }) + } + }, + onPOST: function () { + authPOST.authPOST({ + url : "task", + data: { + "description":this.data.description, + "deadline":this.data.deadline, + "importantDegree":this.data.importantDegree+1, + "preference":this.data.pref_index, + "singleMin":this.data.singleMin, + "singleMax":this.data.singleMax, + "duration":this.data.duration, + "urgencyPreference":8.0, + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + }) + }, + surebutton :function (options) { + var timestamp = Date.parse(new Date()); + this.setData({ + deadline:new Date((this.data.ddl_time).replace(/-/g,"/")).getTime()-1800000, + }) + if(this.data.duration<=0){ + this.setData({ + error: '时长不能小于等于0' + }) + } + else if(this.data.singleMin>this.data.singleMax){ + this.setData({ + error: '最小时长不能大于最大时长' + }) + } + else if (this.data.duration>64){ + this.setData({ + error: '计划时长不能大于32小时' + }) + } + else if(this.data.singleMin <0.1||this.data.singleMax <0.1){ + this.setData({ + error: '请输入正确的单次最短/最长时间' + }) + } + else if(this.data.singleMin > this.data.duration){ + this.setData({ + error: '单次最短不能大于总花费时间' + }) + } + else if((this.data.deadline-timestamp)<(this.data.duration+1)*30*60*1000){ + this.setData({ + error: '那么紧急的事情请马上去做吧' + }) + } + else if((this.data.deadline-timestamp)<31536000000){ + console.log(this.data.deadline); + var that = this + wx.showModal({//弹窗提示二次确认 + title: '提示', + content: '确定创建吗', + success: function (res) { + if (res.confirm) { + that.onPOST() + wx.reLaunch({ + url: '../list', + }) + wx.showToast({ + title: '创建成功', + icon:"success", + duration: 2000 + }) + } + else { + console.log('弹框后点取消') + } + } + }) + } + else{ + this.setData({ + error: '时间跨度需小于一年' + }) + } + } +}) diff --git a/miniprogram/pages/list/createTask/createTask.json b/miniprogram/pages/list/createTask/createTask.json new file mode 100644 index 0000000..6417d36 --- /dev/null +++ b/miniprogram/pages/list/createTask/createTask.json @@ -0,0 +1,15 @@ +{ + "component": true, + "usingComponents": { + "i-input": "../../../dist/input/index", + "i-panel": "../../../dist/panel/index", + "i-radio-group": "../../../dist/radio-group/index", + "i-radio": "../../../dist/radio/index", + "i-row": "../../../dist/row/index", + "i-col": "../../../dist/col/index", + "i-cell-group": "../../../dist/cell-group/index", + "i-cell": "../../../dist/cell/index", + "i-button": "../../../dist/button/index", + "mp-toptips": "weui-miniprogram/toptips/toptips" + } +} \ No newline at end of file diff --git a/miniprogram/pages/list/createTask/createTask.wxml b/miniprogram/pages/list/createTask/createTask.wxml new file mode 100644 index 0000000..3a49f05 --- /dev/null +++ b/miniprogram/pages/list/createTask/createTask.wxml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +创建并自动安排 + + + + + diff --git a/miniprogram/pages/list/createTask/createTask.wxss b/miniprogram/pages/list/createTask/createTask.wxss new file mode 100644 index 0000000..ecaec20 --- /dev/null +++ b/miniprogram/pages/list/createTask/createTask.wxss @@ -0,0 +1,117 @@ +/* pages/create/create.wxss */ +page { + background: #F6F6F6; + display: flex; + flex-direction: column; + justify-content: flex-start; + +} +.head{ + width: 100px; + height: 100px; + left: 50px; + top:20px; +} +.row,.row-2{ + margin-top: 0px; + width: 95%; + margin-left:auto; + margin-right:auto; + background-color:white; +} +.row-2{ + left: 0; + margin-left: 0; + display: flex; +} +.ipt,.picker1,.ipt-2{ + border-style: solid; + border-width: 1px; + margin-left: 20px; + height: 40px; + width: 80%; + margin-top:10px ; + border-radius: 15rpx; + margin-bottom: 15rpx; + border-color: #d7cee6; + font-size: 35rpx; + text-align: center; + background-color: #ffffff; + text-align: left; + + +} +.picker2{ + border-style: solid; + border-width: 1px; + margin-left: 10px; + height: 30px; + width: 100rpx; + margin-top:10px ; + border-radius: 15rpx; + margin-bottom: 15rpx; + border-color: #d7cee6; + font-size: 35rpx; + text-align: center; + background-color: #ffffff; + text-align: center; +} +.ipt-2{ + height: 150px; + +} +.t1{ + margin-left: 20px; + margin-top:10px ; +} +.text2{ + margin-left: 10px; + margin-top:10px ; + margin-right:0px; + font-size: 10px; + color: rgb(164, 166, 169); +} +.t3{ + margin-left: 10px; + left:20px; + bottom: 10px; + position: relative; +} +.btn{ +color: #8538ff; +top: 30px; +width: 90px; +margin-left:auto; +margin-right:auto; +margin-bottom: 100px; +} +.t1{ + font-size: 15px; + color: rgb(76, 74, 77); + +} +.t2{ + top: auto; + margin-top: auto; + margin-left: 30px; + font-size: 13px; + color: rgb(71, 69, 72); +} +.pla{ + +margin-left:10px; +color: rgb(199, 199, 199); + +} +.sld{ + border-block-color: #8234ff; +} + +.picker{ + background-color: #ffffff; + height: 48px; + font-size: 15px; + display: flex; + justify-content: left; + align-items: center; +} diff --git a/miniprogram/pages/list/list.js b/miniprogram/pages/list/list.js new file mode 100644 index 0000000..1a3de1a --- /dev/null +++ b/miniprogram/pages/list/list.js @@ -0,0 +1,355 @@ +// pages/list/list.js +var authGET = require('../../utils/authGET') +var authDELETE = require('../../utils/authDELETE') +var authRESULT = require('../../utils/authRESULT') +const { $Message } = require('../../dist/base/index'); +const app = getApp() +function formatNumber(n) { + n = n.toString() + return n[1] ? n : '0' + n +} +Page({ + data: { + taskid:new Array,taskidstring:'', + taskDetail:new Array,taskddlist:new Array, + planid:new Array,planidstring:'', + planDetail:new Array,planddllist:new Array, + failids:[],failplanids:[],allocstatus:[],Pallocstatus:[], + current: 'tab1',current_scroll: 'tab1', + visible2: false,toggle : false,toggle2 : false, + actions : [ + { + name : '删除', + width : 100, + color : '#fff', + fontsize : '20', + icon : 'trash', + background : '#ed3f14' + }, + ], + press : false, + loading: true, + }, + + listenPress: function (res) { + this.setData({ + press: true, + }) + let that = this; + setTimeout(function(){ + that.setData({ + press: false, + }) + },15) + }, + + + onLoad: function (e) { + + }, + onReady: function () { + let that = this; + + }, + onShow:function(){ + let that = this; + + app.listenLoading(function (res) { + that.Query() + }) + }, + onPullDownRefresh: function () { + let that = this; + app.listenLoading(function (res) { + that.Query() + }) + + }, + stopPullDownRefresh(){ + wx.stopPullDownRefresh() + $Message({ + content: '拉取数据成功', + type: 'success' + }); + }, + + Query:function(){ + this.onRESULTS() + this.onGETALL() + + }, + onRESULTS: function () { + var that = this + authRESULT.authRESULTS({ + url : "task", + success: function (res) { + that.setData({ + failids:res.data.failedIds, + }) + console.log("failid",that.data.failids) + }, + fail: function (res) { + console.log(res) + } + }) + authRESULT.authRESULTS({ + url : "plan", + success: function (res) { + that.setData({ + failplanids:res.data.failedIds, + }) + console.log("failplanid",that.data.failplanids) + }, + fail: function (res) { + console.log(res) + } + }) +}, + onGETALL:function () { + var that = this + authGET.authGETALL({ + url : "task", + data: { + }, + success: function (res) { + console.log("返回t",res.data) + if(res.data.length>0){ + that.setData({ + loading: false, + taskid:res.data, + taskidstring:res.data.join(',') + }) + that.onGETDETAIL(); + } + else{ + that.setData({ + loading: false, + taskid:res.data, + taskidstring:"" + }) + } + }, + fail: function (res) { + console.log(res) + } + }), + authGET.authGETALL({ + url : "plan", + data: { + }, + success: function (res) { + console.log("返回p",res.data) + if(res.data.length>0){ + that.setData({ + loading:false, + planid:res.data, + planidstring:res.data.join(',') + }) + that.onGETDETAIL(); + } + else{ + that.setData({ + loading:false, + planid:res.data, + planidstring:"" + }) + } + }, + fail: function (res) { + console.log(res) + } + }) + }, + onGETDETAIL:function(){ + var that = this + authGET.authGETDETAIL({ + url : "task", + data:{ + "ids":this.data.taskidstring, + }, + success: function (res) { + console.log("taskDetail",res.data) + var ddllist = new Array + var _alloc =[] + for(var i = 0;i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 时间已规划 + + + + + + 规划中 + + + + + + + + + + + + + + + + + + + + + + + + + 时间已规划 + + + + + + 规划中 + + + + + + + + + \ No newline at end of file diff --git a/miniprogram/pages/list/list.wxss b/miniprogram/pages/list/list.wxss new file mode 100644 index 0000000..e42739c --- /dev/null +++ b/miniprogram/pages/list/list.wxss @@ -0,0 +1,140 @@ +/* pages/list/list.wxss */ +.row,.row2{ + margin-top: 2px; + height :50px; + width: 95%; + margin-left:auto; + margin-right:auto; + background-color:white +} +page { + background: #F6F6F6; + display: flex; + flex-direction: column; + justify-content: flex-start; + background: url("http://static.codesdream.com/bk.png") no-repeat; + width: 100%; + background-size: 100% 100%; + background-attachment:fixed; +} + +.itm{ + margin-left: 20px; + color: rgb(99, 98, 101); + font-style: initial; + +} +.row2{ + background-color:rgb(221, 206, 255); +} + +.blk0,.blk1{ + border: 1px solid rgb(178, 139, 255); + width: 72px; + height:30px; + margin-left: 5px; + border-radius: 10px; + color: rgb(178, 139, 255); + text-align: center; +} +.blk1{ + border: 1px solid rgb(178, 139, 255); + background-color: rgb(178, 139, 255); + color: white; + border-radius: 10px; + +} +.row3{ + display: flex; + flex-direction: row; + margin-top: 5px; +} +.i-cell-padding{ + height: 28px; +} + +.i-row-class{ + margin-bottom:5px; +} + +.circle-button{ + font-size: 60rpx; + color: white; + text-align: center; + border-radius: 100%; +} + +/* .circle-view1{ + height: 120rpx; + width: 120rpx; + background-color: #19be6b; + border-radius: 100%; + position: fixed; + bottom: 100rpx; + right: 40rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 9; + border: 0 solid #ffffff; + box-shadow: 4px 1px 1px #cccccc; +} */ + +.circle-view1{ + position: fixed; + bottom: 100rpx; + right: 40rpx; + /* display: flex; + align-items: center; + justify-content: center; */ +} + +.button-img{ + height: 60px; + width: 60px; +} + +.circle-view2{ + height: 120rpx; + width: 120rpx; + background-color: #1ea4ed; + border-radius: 100%; + position: fixed; + bottom: 100rpx; + right: 40rpx; + display: flex; + align-items: center; + justify-content: center; + z-index: 9; + border: 0 solid #ffffff; + box-shadow: 4px 1px 1px #cccccc; +} + +.progress-cell{ + height: 18px; +} + +.i-cell-padding{ + height: 20px; +} + +.item-row{ + height: 45px; +} + +.empty-img{ + height: 240px; + width: 150px; + +} + +.empty-view{ + display:flex; + justify-content: center; + margin-top: 80px; + margin-left: 15px; +} + +.i-row-class-top{ + margin-top: 20px; +} \ No newline at end of file diff --git a/miniprogram/pages/list/plan/plan.js b/miniprogram/pages/list/plan/plan.js new file mode 100644 index 0000000..ea6f81a --- /dev/null +++ b/miniprogram/pages/list/plan/plan.js @@ -0,0 +1,344 @@ +// pages/plan/plan.js +var authGET = require('../../../utils/authGET') +var authPATCH = require('../../../utils/authPATCH') +var authDELETE = require('../../../utils/authDELETE') +const app = getApp() +Page({ + data: { + changed:false, + hiddenmodalput1:true, + hiddenmodalput2:true, + hiddenmodalput3:true, + hiddenmodalput4:true, + hiddenmodalput5: true, + planid:0, + description:new Array, + year:[2020,2021], + month:['01','02','03','04','05','06','07','08','09','10','11','12'], + day:['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31'], + hour:['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23'], + mniute:['00','30'], + y:0,m:0,d:0,h:0,mn:0, + deadline:'', + importance: ['重要','一般','次要'], + importantDegree:1, + preference:['任意','早上','下午','晚上'], + pref_index:0, + singleMin:0, + dd:0,duration:0,//所需时间块 + mutexPeriod:0, + nowTimestamp:0, + error: '' + }, + onLoad: function (e) { + console.log(e); + this.setData({ + planid:e.planid + }) + }, + onReady: function () { + this.setData({ + nowTimestamp:new Date().getTime() + }); + + this.onGET() + }, + onGET: function () { + var that = this; + authGET.authGET({ + url : "plan", + data: { + "id":this.data.planid, + }, + success: function (res) { + console.log(res.data) + that.setData({ + description:res.data.description, + y:new Date(res.data.deadline.replace(/-/g, '/')).getFullYear()-2020, + m:new Date(res.data.deadline.replace(/-/g, '/')).getMonth(), + d:new Date(res.data.deadline.replace(/-/g, '/')).getDate()-1, + h:(new Date(res.data.deadline.replace(/-/g, '/')).getHours()+new Date(res.data.deadline.replace(/-/g, '/')).getMinutes()/30)%24, + mn:(new Date(res.data.deadline.replace(/-/g, '/')).getMinutes()/30+1)%2, + importantDegree:res.data.importantDegree-1, + pref_index:res.data.preference+1, + singleMin:res.data.singleMin/2, + duration:res.data.duration/2, + mutexPeriod:res.data.mutexPeriod/48, + dd:res.data.duration/res.data.singleMin + }) + }, + fail: function (res) { + console.log(res) + } + }) + }, + onPATCH: function () { + authPATCH.authPATCH({ + url:"plan", + data:{ + 'id':parseInt(this.data.planid), + 'patch':[ + {"op": "replace", "path": "/description", "value": this.data.description }, + {"op": "replace", "path": "/deadline", "value":this.data.deadline }, + {"op": "replace", "path": "/importantDegree", "value": 1+1*this.data.importantDegree }, + {"op": "replace", "path": "/preference", "value": this.data.pref_index-1 }, + {"op": "replace", "path": "/mutexPeriod", "value": this.data.mutexPeriod*48 }, + {"op": "replace", "path": "/singleMin", "value": this.data.singleMin*2 }, + {"op": "replace", "path": "/duration", "value": this.data.duration*2 }, + ], + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + + }) + }, + onDELETE: function () { + authDELETE.authDELETE({ + url:"plan", + data:{ + "id":[parseInt(this.data.planid)], + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + + }) + }, + modalinput1:function(){ + this.setData({ + hiddenmodalput1: !this.data.hiddenmodalput1 + }) + }, + modalinput2:function(){ + this.setData({ + hiddenmodalput2: !this.data.hiddenmodalput2 + }) + }, + modalinput3:function(){ + this.setData({ + hiddenmodalput3: !this.data.hiddenmodalput3 + }) + }, + modalinput4:function(){ + this.setData({ + hiddenmodalput4: !this.data.hiddenmodalput4 + }) + }, + modalinput5:function(){ + this.setData({ + hiddenmodalput5: !this.data.hiddenmodalput5 + }) + }, + cancel: function(){ + this.setData({ + hiddenmodalput1: true, + hiddenmodalput2: true, + hiddenmodalput3: true, + hiddenmodalput4: true, + hiddenmodalput5: true, + }); +}, +confirm: function(){ //确认 + this.setData({ + hiddenmodalput1: true, + hiddenmodalput2: true, + hiddenmodalput3: true, + hiddenmodalput4: true, + hiddenmodalput5: true, + }) +}, +bindDescriptionBlur(e) { + console.log('description发送改变,携带值为', e.detail.detail.value) + if(e.detail.value != ''){ + let dscptn = new Array + dscptn.push(e.detail.detail.value) + this.setData({ + changed:true, + description: dscptn, + }) + console.log('description值为', this.data.description) + } +}, +bindYearBlur(e){ + console.log('y发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + y: e.detail.value + }) + console.log('year值为', this.data.year[this.data.y]) +}, +bindMonthBlur(e){ + console.log('m发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + m: e.detail.value + }) + console.log('month值为', this.data.month[this.data.m]) +}, +bindDayBlur(e){ + console.log('d发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + d: e.detail.value + }) + console.log('day值为', this.data.day[this.data.d]) +}, +bindHourBlur(e){ + console.log('h发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + h: e.detail.value + }) + console.log('hour值为', this.data.hour[this.data.h]) +}, +bindMniuteBlur(e){ + console.log('mn发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + mn: e.detail.value + }) + console.log('hour值为', this.data.mniute[this.data.mn]) +}, +bindImptChange(e){ + console.log('impt发送选择改变,携带值为', e.detail.value) + this.setData({ + changed:true, + importantDegree: e.detail.value + }) + console.log('importantDegree', this.data.importantDegree) +}, +bindPrefChange(e){ + console.log('pref发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + pref_index: e.detail.value + }) + console.log('preference值为', this.data.pref_index) +}, +bindDurationBlur(e){ + if(e.detail.detail.value != ''){ + if(Number.isInteger(e.detail.detail.value*2)){ + this.setData({ + changed:true, + duration: e.detail.detail.value + }) + console.log('duration值为', this.data.duration) + } + else{ + this.setData({ + error: '输入必须为0.5的倍数', + + }) + } + } +}, +bindSingleMinBlur(e){ + console.log('singleMin发送改变,携带值为', e.detail.value) + if(e.detail.detail.value != ''){ + if(Number.isInteger(e.detail.detail.value*2)){ + if(e.detail.detail.value>0){ + this.setData({ + changed:true, + singleMin: e.detail.detail.value + }) + console.log('singleMin值为', this.data.singleMin) + } + else{ + this.setData({ + changed:true, + singleMin:0.5 + }) + console.log('singleMin值为', this.data.singleMin) + } + } + else{ + this.setData({ + error: '输入必须为0.5的倍数', + }) + } + } +}, +bindMutexPeriodBlur(e){ + console.log('mutexPeriod发送改变,携带值为', e.detail.detail.value) + if(Number.isInteger(e.detail.detail.value*2)){ + if (e.detail.detail.value>0){ + this.setData({ + changed:true, + mutexPeriod: e.detail.detail.value + }) + console.log('mutexPeriod值为', this.data.mutexPeriod) + } + } + else{ + this.setData({ + error: '输入必须为0.5的倍数', + }) + } +}, + +deletebutton :function (options) { + var that = this + wx.showModal({//弹窗提示二次确认 + title: '提示', + content: '确定删除吗', + success: function (res) { + if (res.confirm) { + that.onDELETE() + wx.reLaunch({ + url: '../list', + }) + wx.showToast({ + title: '删除成功', + icon:"success", + duration: 2000 + }) + } + else { + console.log('弹框后点取消') + } + } + }) +}, +surebutton :function (options) { + var ddl =this.data.year[this.data.y]+'-'+this.data.month[this.data.m]+'-'+this.data.day[this.data.d]+' '+this.data.hour[this.data.h-(parseInt(this.data.mn)+1)%2]+':'+this.data.mniute[(parseInt(this.data.mn)+1)%2] + this.setData({ + "deadline":new Date(ddl.replace(/-/g,"/")).getTime(), + }) + if((this.data.deadline-this.data.nowTimestamp)<31536000000){ + var that = this + wx.showModal({//弹窗提示二次确认 + title: '提示', + content: '确定修改吗', + success: function (res) { + if (res.confirm) { + that.onPATCH() + wx.reLaunch({ + url: '../list', + }) + wx.showToast({ + title: '修改成功', + icon:"success", + duration: 2000 + }) + } + else { + console.log('弹框后点取消') + } + } + }) + } + else{ + this.setData({ + error: '时间跨度需小于一年', + }) + } +} + +}) diff --git a/miniprogram/pages/list/plan/plan.json b/miniprogram/pages/list/plan/plan.json new file mode 100644 index 0000000..1d0ee16 --- /dev/null +++ b/miniprogram/pages/list/plan/plan.json @@ -0,0 +1,20 @@ +{ + "component": true, + "usingComponents": { + "i-cell-group": "../../../dist/cell-group/index", + "i-cell": "../../../dist/cell/index", + "i-row": "../../../dist/row/index", + "i-col": "../../../dist/col/index", + "i-card": "../../../dist/card/index", + "i-panel": "../../../dist/panel/index", + "i-grid": "../../../dist/grid/index", + "i-grid-item": "../../../dist/grid-item/index", + "i-grid-icon": "../../../dist/grid-icon/index", + "i-grid-label": "../../../dist/grid-label/index", + "i-icon": "../../../dist/icon/index", + "i-button": "../../../dist/button/index", + "i-input": "../../../dist/input/index", + "mp-toptips": "weui-miniprogram/toptips/toptips" + + } +} \ No newline at end of file diff --git a/miniprogram/pages/list/plan/plan.wxml b/miniprogram/pages/list/plan/plan.wxml new file mode 100644 index 0000000..e08e269 --- /dev/null +++ b/miniprogram/pages/list/plan/plan.wxml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{importance[importantDegree]}} + + + + + + {{preference[pref_index]}} + + + + + + + 确认修改 + +删除 + diff --git a/miniprogram/pages/list/plan/plan.wxss b/miniprogram/pages/list/plan/plan.wxss new file mode 100644 index 0000000..a507648 --- /dev/null +++ b/miniprogram/pages/list/plan/plan.wxss @@ -0,0 +1,188 @@ +/**index.wxss**/ +page { + background: #F6F6F6; + display: flex; + flex-direction: column; + justify-content: flex-start; +} + +.userinfo, .uploader, .tunnel,.row{ + margin-top: 40rpx; + height: 140rpx; + width: 100%; + background: #FFF; + border: 1px solid rgba(0, 0, 0, .1); + border-left: none; + border-right: none; + display: flex; + flex-direction: row; + align-items: center; + transition: all 300ms ease; +} + +.userinfo-avatar { + width: 100rpx; + height: 100rpx; + margin: 20rpx; + border-radius: 50%; +} + +.userinfo-nickname { + font-size: 32rpx; + color: #007AFF; + background-color: white; +} + +.userinfo-nickname::after { +border: none; +} + +.uploader, .tunnel { + height: auto; + padding: 0 0 0 40rpx; + flex-direction: column; + align-items: flex-start; + box-sizing: border-box; +} + +.uploader-text, .tunnel-text { + width: 100%; + line-height: 52px; + font-size: 34rpx; + color: #007AFF; +} + +.uploader-container { + width: 100%; + height: 400rpx; + padding: 20rpx 20rpx 20rpx 0; + display: flex; + align-content: center; + justify-content: center; + box-sizing: border-box; + border-top: 1px solid rgba(0, 0, 0, .1); +} + +.uploader-image { + width: 100%; + height: 360rpx; +} + +.tunnel { + padding: 0 0 0 40rpx; +} + +.tunnel-text { + position: relative; + color: #222; + display: flex; + flex-direction: row; + align-content: center; + justify-content: space-between; + box-sizing: border-box; + border-top: 1px solid rgba(0, 0, 0, .1); +} + +.tunnel-text:first-child { + border-top: none; +} + +.tunnel-switch { + position: absolute; + right: 20rpx; + top: -2rpx; +} + +.disable { + color: #888; +} + +.service { + position: fixed; + right: 40rpx; + bottom: 40rpx; + width: 140rpx; + height: 140rpx; + border-radius: 50%; + background: linear-gradient(#007AFF, #0063ce); + box-shadow: 0 5px 10px rgba(0, 0, 0, .3); + display: flex; + align-content: center; + justify-content: center; + transition: all 300ms ease; +} + +.service-button { + position: absolute; + top: 40rpx; +} + +.service:active { + box-shadow: none; +} + +.request-text { + padding: 20rpx 0; + font-size: 24rpx; + line-height: 36rpx; + word-break: break-all; +} +.btn{ + margin-left: 30px; + margin-right: 0; + left: 0; + right: 0; +} +.area3{ + margin-top: 15rpx; + display:flex; + /*row 横向 column 列表 */ + flex-direction: row; + background-color: #f9f7f7; + border-radius: 15rpx; + margin-left:15rpx; + margin-right:15rpx; +} +.start{ + top: 20px; + position: relative; +} +.t1{ + position:relative; + margin-left: auto; + margin-right: auto; +} +.t2{ + position:relative; + margin-left: auto; +margin-right: auto; +} +.t3{ + margin-left: auto; + margin-right: auto; +} +.userinfo,.row{ + margin-top: 1px; + left: 10px; + right: 10px; + width: 90%; + +} +.row{ + background-color: white; + margin-top: 0px; + height: 100px; +} +.l4{ + display: flex; + flex-direction: column; + margin-left: 10px; + font-size: 15px; +} + +.center-view{ + margin-top: 0px; + text-align: center; + display: flex; + justify-content: center; +} \ No newline at end of file diff --git a/miniprogram/pages/list/task/task.js b/miniprogram/pages/list/task/task.js new file mode 100644 index 0000000..725c85f --- /dev/null +++ b/miniprogram/pages/list/task/task.js @@ -0,0 +1,362 @@ +// pages/plan/plan.js +const app = getApp() +var authGET = require('../../../utils/authGET') +var authPATCH = require('../../../utils/authPATCH') +var authDELETE = require('../../../utils/authDELETE') + +Page({ + data: { + changed:false, + hiddenmodalput1:true, + hiddenmodalput2:true, + hiddenmodalput3:true, + hiddenmodalput4:true, + hiddenmodalput5:true, + taskid:0, + hh:"\n", + description:new Array, + ddl_time:'', + year:[2020,2021], + month:['01','02','03','04','05','06','07','08','09','10','11','12'], + day:['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31'], + hour:['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23'], + mniute:['00','30'], + y:0,m:0,d:0,h:0,mn:0, + deadline:0, + importance: ['重要','一般','次要'], + importantDegree:1, + preference:['任意','早上','下午','晚上'], + pref_index:0, + singleMin:0,singleMax:0x7fffffff, + duration:0,//所需时间块 + error: '' + + }, + onLoad: function (e) { + console.log(e); + this.setData({ + taskid:e.taskid + }) + }, + onReady: function () { + this.setData({ + nowTimestamp:new Date().getTime() + }); + this.onGET() + }, + onGET: function () { + var that = this; + authGET.authGET({ + url : "task", + data: { + "id":this.data.taskid, + }, + success: function (res) { + console.log(res) + that.setData({ + description:res.data.description, + + y:new Date(res.data.deadline.replace(/-/g, '/')).getFullYear()-2020, + m:new Date(res.data.deadline.replace(/-/g, '/')).getMonth(), + d:new Date(res.data.deadline.replace(/-/g, '/')).getDate()-1, + h:(new Date(res.data.deadline.replace(/-/g, '/')).getHours()+new Date(res.data.deadline.replace(/-/g, '/')).getMinutes()/30)%24, + mn:(new Date(res.data.deadline.replace(/-/g, '/')).getMinutes()/30+1)%2, + importantDegree:res.data.importantDegree-1, + pref_index:res.data.preference+1, + singleMin:res.data.singleMin/2, + singleMax:res.data.singleMax/2, + duration:res.data.duration/2, + }) + console.log("h",that.data.h,"mn",that.data.mn); + }, + fail: function (res) { + console.log(res) + } + }) + }, + onPATCH: function () { + authPATCH.authPATCH({ + url:"task", + data:{ + 'id':parseInt(this.data.taskid), + 'patch':[ + {"op": "replace", "path": "/description", "value": this.data.description }, + {"op": "replace", "path": "/deadline", "value":this.data.deadline }, + {"op": "replace", "path": "/importantDegree", "value": 1*this.data.importantDegree+1 }, + {"op": "replace", "path": "/preference", "value": this.data.pref_index-1 }, + {"op": "replace", "path": "/singleMax", "value": this.data.singleMax*2 }, + {"op": "replace", "path": "/singleMin", "value": this.data.singleMin*2 }, + {"op": "replace", "path": "/duration", "value": this.data.duration*2 }, + ], + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + + }) + }, + onDELETE: function () { + authDELETE.authDELETE({ + url:"task", + data:{ + "id":[parseInt(this.data.taskid)], + }, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res) + } + + }) + }, + modalinput1:function(){ + this.setData({ + hiddenmodalput1: !this.data.hiddenmodalput1 + }) + }, + modalinput2:function(){ + this.setData({ + hiddenmodalput2: !this.data.hiddenmodalput2 + }) + }, + modalinput3:function(){ + this.setData({ + hiddenmodalput3: !this.data.hiddenmodalput3 + }) + }, + modalinput4:function(){ + this.setData({ + hiddenmodalput4: !this.data.hiddenmodalput4 + }) + }, + modalinput5:function(){ + this.setData({ + hiddenmodalput5: !this.data.hiddenmodalput5 + }) + }, + + cancel: function(){ + this.setData({ + hiddenmodalput1: true, + hiddenmodalput2: true, + hiddenmodalput3: true, + hiddenmodalput4: true, + hiddenmodalput5: true, + }); + }, + confirm: function(){ //确认 + this.setData({ + hiddenmodalput1: true, + hiddenmodalput2: true, + hiddenmodalput3: true, + hiddenmodalput4: true, + hiddenmodalput5: true, + + }) + }, + bindDescriptionBlur(e) { + console.log('description发送改变,携带值为', e.detail.detail.value) + if(e.detail.detail.value != ''){ + let dscptn = new Array + dscptn.push(e.detail.detail.value) + this.setData({ + changed:true, + description: dscptn, + }) + console.log('description值为', this.data.description) + } + }, + + bindYearBlur(e){ + console.log('y发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + y: e.detail.value + }) + console.log('year值为', this.data.year[this.data.y]) + }, + bindMonthBlur(e){ + console.log('m发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + m: e.detail.value + }) + console.log('month值为', this.data.month[this.data.m]) + }, + bindDayBlur(e){ + console.log('d发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + d: e.detail.value + }) + console.log('day值为', this.data.day[this.data.d]) + }, + bindHourBlur(e){ + console.log('h发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + h: e.detail.value + }) + console.log('hour值为', this.data.hour[this.data.h]) + }, + bindMniuteBlur(e){ + console.log('mn发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + mn: e.detail.value + }) + console.log('hour值为', this.data.mniute[this.data.mn]) + }, + + + +bindImptChange(e){ + console.log('impt发送选择改变,携带值为', e.detail.value) + this.setData({ + changed:true, + importantDegree: e.detail.value + }) + console.log('importantDegree', this.data.importantDegree) + }, +bindPrefChange(e){ + console.log('pref发送改变,携带值为', e.detail.value) + this.setData({ + changed:true, + pref_index: e.detail.value + }) + console.log('preference值为', this.data.pref_index) +}, +bindDurationBlur(e){ + if(e.detail.detail.value != ''){ + if(Number.isInteger(e.detail.detail.value*2)){ + this.setData({ + changed:true, + duration: e.detail.detail.value + }) + console.log('duration值为', this.data.duration) + } + else{ + this.setData({ + error: '输入必须为0.5的倍数', + }) + } + } +}, +bindSingleMinBlur(e){ + console.log('singleMin发送改变,携带值为', e.detail.detail.value) + if(e.detail.detail.value != ''){ + if(Number.isInteger(e.detail.detail.value*2)){ + + if(e.detail.detail.value>0){ + this.setData({ + changed:true, + singleMin: e.detail.detail.value + }) + console.log('singleMin值为', this.data.singleMin) + } + else{ + this.setData({ + changed:true, + singleMin:0 + }) + console.log('singleMin值为', this.data.singleMin) + } + } + else{ + this.setData({ + error: '输入必须为0.5的倍数', + }) + } + } +}, +bindSingleMaxBlur(e){ + console.log('singleMax发送改变,携带值为', e.detail.detail.value) + if(e.detail.detail.value != ''){ + if(Number.isInteger(e.detail.detail.value*2)){ + if (e.detail.detail.value>0){ + this.setData({ + changed:true, + singleMax: e.detail.detail.value + }) + console.log('singleMax值为', this.data.singleMax) + } + else if(e.detail.detail.value == 0 || e.detail.detail.value >9999) { + this.setData({ + changed:true, + singleMax: 0x7fffffff + }) + console.log('singleMax值为', this.data.singleMax) + } + } + else{ + this.setData({ + error: '输入必须为0.5的倍数', + }) + } + } +}, + +deletebutton :function (options) { + var that = this + wx.showModal({//弹窗提示二次确认 + title: '提示', + content: '确定删除吗', + success: function (res) { + if (res.confirm) { + that.onDELETE() + wx.reLaunch({ + url: '../list', + }) + wx.showToast({ + title: '删除成功', + icon:"success", + duration: 2000 + }) + } + else { + console.log('弹框后点取消') + } + } + }) +}, +surebutton :function (options) { + var timestamp = new Date().getTime(); + var ddl =this.data.year[this.data.y]+'-'+this.data.month[this.data.m]+'-'+this.data.day[this.data.d]+' '+this.data.hour[this.data.h-(parseInt(this.data.mn)+1)%2]+':'+this.data.mniute[(parseInt(this.data.mn)+1)%2] + this.setData({ + "deadline":new Date(ddl.replace(/-/g,"/")).getTime(), + }) + if((this.data.deadline-this.data.nowTimestamp)<31536000000){ + var that = this + wx.showModal({//弹窗提示二次确认 + title: '提示', + content: '确定修改吗', + success: function (res) { + if (res.confirm) { + that.onPATCH() + wx.reLaunch({ + url: '../list', + }) + wx.showToast({ + title: '修改成功', + icon:"success", + duration: 2000 + }) + } + else { + console.log('弹框后点取消') + } + } + }) + } + else{ + this.setData({ + error: '时间跨度需小于一年', + }) + } +} + +}) diff --git a/miniprogram/pages/list/task/task.json b/miniprogram/pages/list/task/task.json new file mode 100644 index 0000000..1d0ee16 --- /dev/null +++ b/miniprogram/pages/list/task/task.json @@ -0,0 +1,20 @@ +{ + "component": true, + "usingComponents": { + "i-cell-group": "../../../dist/cell-group/index", + "i-cell": "../../../dist/cell/index", + "i-row": "../../../dist/row/index", + "i-col": "../../../dist/col/index", + "i-card": "../../../dist/card/index", + "i-panel": "../../../dist/panel/index", + "i-grid": "../../../dist/grid/index", + "i-grid-item": "../../../dist/grid-item/index", + "i-grid-icon": "../../../dist/grid-icon/index", + "i-grid-label": "../../../dist/grid-label/index", + "i-icon": "../../../dist/icon/index", + "i-button": "../../../dist/button/index", + "i-input": "../../../dist/input/index", + "mp-toptips": "weui-miniprogram/toptips/toptips" + + } +} \ No newline at end of file diff --git a/miniprogram/pages/list/task/task.wxml b/miniprogram/pages/list/task/task.wxml new file mode 100644 index 0000000..4b5b681 --- /dev/null +++ b/miniprogram/pages/list/task/task.wxml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{importance[importantDegree]}} + + + + + + {{preference[pref_index]}} + + + + + + +确认修改 + +删除 + + diff --git a/miniprogram/pages/list/task/task.wxss b/miniprogram/pages/list/task/task.wxss new file mode 100644 index 0000000..82fafab --- /dev/null +++ b/miniprogram/pages/list/task/task.wxss @@ -0,0 +1,188 @@ +/**index.wxss**/ +page { + background: #F6F6F6; + display: flex; + flex-direction: column; + justify-content: flex-start; +} + +.userinfo, .uploader, .tunnel,.row{ + margin-top: 40rpx; + height: 140rpx; + width: 100%; + background: #FFF; + border: 1px solid rgba(0, 0, 0, .1); + border-left: none; + border-right: none; + display: flex; + flex-direction: row; + align-items: center; + transition: all 300ms ease; +} + +.userinfo-avatar { + width: 100rpx; + height: 100rpx; + margin: 20rpx; + border-radius: 50%; +} + +.userinfo-nickname { + font-size: 32rpx; + color: #007AFF; + background-color: white; +} + +.userinfo-nickname::after { +border: none; +} + +.uploader, .tunnel { + height: auto; + padding: 0 0 0 40rpx; + flex-direction: column; + align-items: flex-start; + box-sizing: border-box; +} + +.uploader-text, .tunnel-text { + width: 100%; + line-height: 52px; + font-size: 34rpx; + color: #007AFF; +} + +.uploader-container { + width: 100%; + height: 400rpx; + padding: 20rpx 20rpx 20rpx 0; + display: flex; + align-content: center; + justify-content: center; + box-sizing: border-box; + border-top: 1px solid rgba(0, 0, 0, .1); +} + +.uploader-image { + width: 100%; + height: 360rpx; +} + +.tunnel { + padding: 0 0 0 40rpx; +} + +.tunnel-text { + position: relative; + color: #222; + display: flex; + flex-direction: row; + align-content: center; + justify-content: space-between; + box-sizing: border-box; + border-top: 1px solid rgba(0, 0, 0, .1); +} + +.tunnel-text:first-child { + border-top: none; +} + +.tunnel-switch { + position: absolute; + right: 20rpx; + top: -2rpx; +} + +.disable { + color: #888; +} + +.service { + position: fixed; + right: 40rpx; + bottom: 40rpx; + width: 140rpx; + height: 140rpx; + border-radius: 50%; + background: linear-gradient(#007AFF, #0063ce); + box-shadow: 0 5px 10px rgba(0, 0, 0, .3); + display: flex; + align-content: center; + justify-content: center; + transition: all 300ms ease; +} + +.service-button { + position: absolute; + top: 40rpx; +} + +.service:active { + box-shadow: none; +} + +.request-text { + padding: 20rpx 0; + font-size: 24rpx; + line-height: 36rpx; + word-break: break-all; +} +.btn{ + margin-left: 30px; + margin-right: 0; + left: 0; + right: 0; +} +.area3{ + margin-top: 15rpx; + display:flex; + /*row 横向 column 列表 */ + flex-direction: row; + background-color: #f9f7f7; + border-radius: 15rpx; + margin-left:15rpx; + margin-right:15rpx; +} +.start{ + top: 20px; + position: relative; +} +.t1{ + position:relative; + margin-left: auto; + margin-right: auto; +} +.t2{ + position:relative; + margin-left: auto; +margin-right: auto; +} +.t3{ + margin-left: auto; + margin-right: auto; +} +.userinfo,.row{ + margin-top: 1px; + left: 10px; + right: 10px; + width: 90%; + +} +.row{ + background-color: white; + margin-top: 0px; + height: 100px; +} +.l4{ + display: flex; + flex-direction: column; + margin-left: 10px; + font-size: 15px; +} + +.center-view{ + margin-top: 0px; + text-align: center; + display: flex; + justify-content: center; +} diff --git a/miniprogram/sitemap.json b/miniprogram/sitemap.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/miniprogram/sitemap.json @@ -0,0 +1,7 @@ +{ + "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/miniprogram/utils/auth.js b/miniprogram/utils/auth.js new file mode 100644 index 0000000..4e48504 --- /dev/null +++ b/miniprogram/utils/auth.js @@ -0,0 +1,22 @@ +var sha1 = require('./sha1') + +var authCodeGenerator = { + clientCode: '965cda1983f569b03abfb80dc9af8dd8', + timestamp: Date.parse(new Date()), + updateTimestamp: function () { + this.timestamp = Date.parse(new Date()); + return this.timestamp; + }, + + randomCode: function (openid) { + this.timestamp = Date.parse(new Date()); + console.log(sha1("RandomCode ["+openid+"]["+this.timestamp+"]["+this.clientCode+"]")) + return sha1("RandomCode ["+openid+"]["+this.timestamp+"]["+this.clientCode+"]"); + }, + + signed: function (openid, token) { + return sha1("SIGN ["+openid+"]["+this.randomCode(openid)+"]["+token+"]") + } +} + +module.exports = {authCodeGenerator} \ No newline at end of file diff --git a/miniprogram/utils/authCOMP.js b/miniprogram/utils/authCOMP.js new file mode 100644 index 0000000..ef7128b --- /dev/null +++ b/miniprogram/utils/authCOMP.js @@ -0,0 +1,23 @@ +const app = getApp() +var auth = require('./auth') +var config = require('../config') + +async function authCOMP(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "GET", + url: config.hostUrl+"/completion/"+object.url, + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +module.exports = {authCOMP} \ No newline at end of file diff --git a/miniprogram/utils/authDELETE.js b/miniprogram/utils/authDELETE.js new file mode 100644 index 0000000..597b62d --- /dev/null +++ b/miniprogram/utils/authDELETE.js @@ -0,0 +1,23 @@ +const app = getApp() +var auth = require('./auth') +var config = require('../config') + +async function authDELETE(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "POST", + url: config.hostUrl+"/"+object.url+"/delete", + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +module.exports = {authDELETE} \ No newline at end of file diff --git a/miniprogram/utils/authGET.js b/miniprogram/utils/authGET.js new file mode 100644 index 0000000..dbddaa1 --- /dev/null +++ b/miniprogram/utils/authGET.js @@ -0,0 +1,63 @@ +const app = getApp() +var auth = require('./auth') +var config = require('../config') + +function authGET(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "GET", + url: config.hostUrl+"/"+object.url, + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +async function authGETALL(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "GET", + url: config.hostUrl+"/"+object.url+'/ids', + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +async function authGETDETAIL(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "GET", + url: config.hostUrl+"/"+object.url+'/details', + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +module.exports = { + authGET, + authGETALL, + authGETDETAIL, +} \ No newline at end of file diff --git a/miniprogram/utils/authPATCH.js b/miniprogram/utils/authPATCH.js new file mode 100644 index 0000000..8711df2 --- /dev/null +++ b/miniprogram/utils/authPATCH.js @@ -0,0 +1,23 @@ +const app = getApp() +var auth = require('./auth') +var config = require('../config') + +async function authPATCH(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "POST", + url: config.hostUrl+"/"+object.url+"/update", + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +module.exports = {authPATCH} \ No newline at end of file diff --git a/miniprogram/utils/authPOST.js b/miniprogram/utils/authPOST.js new file mode 100644 index 0000000..a2c0cda --- /dev/null +++ b/miniprogram/utils/authPOST.js @@ -0,0 +1,23 @@ +const app = getApp() +var auth = require('./auth') +var config = require('../config') + +async function authPOST(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "POST", + url: config.hostUrl+"/"+object.url, + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +module.exports = {authPOST} \ No newline at end of file diff --git a/miniprogram/utils/authRESULT.js b/miniprogram/utils/authRESULT.js new file mode 100644 index 0000000..04349c5 --- /dev/null +++ b/miniprogram/utils/authRESULT.js @@ -0,0 +1,64 @@ +const app = getApp() +var auth = require('./auth') +var config = require('../config') + +function authTODAY(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "GET", + url: config.hostUrl+'/'+object.url+"/today", + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +async function authRESULTS(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "GET", + url: config.hostUrl+'/'+object.url+"/results", + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +async function authMARK(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "POST", + url: config.hostUrl+'/'+object.url+"/mark", + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +module.exports = { + authTODAY, + authRESULTS, + authMARK, + +} \ No newline at end of file diff --git a/miniprogram/utils/authTIME.js b/miniprogram/utils/authTIME.js new file mode 100644 index 0000000..ae1cb29 --- /dev/null +++ b/miniprogram/utils/authTIME.js @@ -0,0 +1,45 @@ +const app = getApp() +var auth = require('./auth') +var config = require('../config') + +function authGET(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "GET", + url: config.hostUrl+"/time/disabled/list", + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} +async function authPOST(object){ + var that = this; + var authObj = auth.authCodeGenerator; + authObj.updateTimestamp(); + wx.request({ + method: "POST", + url: config.hostUrl+"/time/disabled/set", + data: object.data, + header:{ + 'openid': app.globalData.openid, + 'X-Requested-With': '', + 'timestamp': authObj.timestamp, + 'signed': authObj.signed(app.globalData.openid, app.globalData.token) + }, + success: object.success, + fail:object.fail, + }); +} + +module.exports = { + authGET, + authPOST, +} \ No newline at end of file diff --git a/miniprogram/utils/sha1.js b/miniprogram/utils/sha1.js new file mode 100644 index 0000000..c6b4eae --- /dev/null +++ b/miniprogram/utils/sha1.js @@ -0,0 +1,371 @@ +/* + * [js-sha1]{@link https://github.com/emn178/js-sha1} + * + * @version 0.6.0 + * @author Chen, Yi-Cyuan [emn178@gmail.com] + * @copyright Chen, Yi-Cyuan 2014-2017 + * @license MIT + */ +/*jslint bitwise: true */ +(function() { + 'use strict'; + + var root = typeof window === 'object' ? window : {}; + var NODE_JS = !root.JS_SHA1_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node; + if (NODE_JS) { + root = global; + } + var COMMON_JS = !root.JS_SHA1_NO_COMMON_JS && typeof module === 'object' && module.exports; + var AMD = typeof define === 'function' && define.amd; + var HEX_CHARS = '0123456789abcdef'.split(''); + var EXTRA = [-2147483648, 8388608, 32768, 128]; + var SHIFT = [24, 16, 8, 0]; + var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer']; + + var blocks = []; + + var createOutputMethod = function (outputType) { + return function (message) { + return new Sha1(true).update(message)[outputType](); + }; + }; + + var createMethod = function () { + var method = createOutputMethod('hex'); + if (NODE_JS) { + method = nodeWrap(method); + } + method.create = function () { + return new Sha1(); + }; + method.update = function (message) { + return method.create().update(message); + }; + for (var i = 0; i < OUTPUT_TYPES.length; ++i) { + var type = OUTPUT_TYPES[i]; + method[type] = createOutputMethod(type); + } + return method; + }; + + var nodeWrap = function (method) { + var crypto = eval("require('crypto')"); + var Buffer = eval("require('buffer').Buffer"); + var nodeMethod = function (message) { + if (typeof message === 'string') { + return crypto.createHash('sha1').update(message, 'utf8').digest('hex'); + } else if (message.constructor === ArrayBuffer) { + message = new Uint8Array(message); + } else if (message.length === undefined) { + return method(message); + } + return crypto.createHash('sha1').update(new Buffer(message)).digest('hex'); + }; + return nodeMethod; + }; + + function Sha1(sharedMemory) { + if (sharedMemory) { + blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] = + blocks[4] = blocks[5] = blocks[6] = blocks[7] = + blocks[8] = blocks[9] = blocks[10] = blocks[11] = + blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; + this.blocks = blocks; + } else { + this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + } + + this.h0 = 0x67452301; + this.h1 = 0xEFCDAB89; + this.h2 = 0x98BADCFE; + this.h3 = 0x10325476; + this.h4 = 0xC3D2E1F0; + + this.block = this.start = this.bytes = this.hBytes = 0; + this.finalized = this.hashed = false; + this.first = true; + } + + Sha1.prototype.update = function (message) { + if (this.finalized) { + return; + } + var notString = typeof(message) !== 'string'; + if (notString && message.constructor === root.ArrayBuffer) { + message = new Uint8Array(message); + } + var code, index = 0, i, length = message.length || 0, blocks = this.blocks; + + while (index < length) { + if (this.hashed) { + this.hashed = false; + blocks[0] = this.block; + blocks[16] = blocks[1] = blocks[2] = blocks[3] = + blocks[4] = blocks[5] = blocks[6] = blocks[7] = + blocks[8] = blocks[9] = blocks[10] = blocks[11] = + blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; + } + + if(notString) { + for (i = this.start; index < length && i < 64; ++index) { + blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; + } + } else { + for (i = this.start; index < length && i < 64; ++index) { + code = message.charCodeAt(index); + if (code < 0x80) { + blocks[i >> 2] |= code << SHIFT[i++ & 3]; + } else if (code < 0x800) { + blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } else if (code < 0xd800 || code >= 0xe000) { + blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } else { + code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); + blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } + } + } + + this.lastByteIndex = i; + this.bytes += i - this.start; + if (i >= 64) { + this.block = blocks[16]; + this.start = i - 64; + this.hash(); + this.hashed = true; + } else { + this.start = i; + } + } + if (this.bytes > 4294967295) { + this.hBytes += this.bytes / 4294967296 << 0; + this.bytes = this.bytes % 4294967296; + } + return this; + }; + + Sha1.prototype.finalize = function () { + if (this.finalized) { + return; + } + this.finalized = true; + var blocks = this.blocks, i = this.lastByteIndex; + blocks[16] = this.block; + blocks[i >> 2] |= EXTRA[i & 3]; + this.block = blocks[16]; + if (i >= 56) { + if (!this.hashed) { + this.hash(); + } + blocks[0] = this.block; + blocks[16] = blocks[1] = blocks[2] = blocks[3] = + blocks[4] = blocks[5] = blocks[6] = blocks[7] = + blocks[8] = blocks[9] = blocks[10] = blocks[11] = + blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; + } + blocks[14] = this.hBytes << 3 | this.bytes >>> 29; + blocks[15] = this.bytes << 3; + this.hash(); + }; + + Sha1.prototype.hash = function () { + var a = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4; + var f, j, t, blocks = this.blocks; + + for(j = 16; j < 80; ++j) { + t = blocks[j - 3] ^ blocks[j - 8] ^ blocks[j - 14] ^ blocks[j - 16]; + blocks[j] = (t << 1) | (t >>> 31); + } + + for(j = 0; j < 20; j += 5) { + f = (b & c) | ((~b) & d); + t = (a << 5) | (a >>> 27); + e = t + f + e + 1518500249 + blocks[j] << 0; + b = (b << 30) | (b >>> 2); + + f = (a & b) | ((~a) & c); + t = (e << 5) | (e >>> 27); + d = t + f + d + 1518500249 + blocks[j + 1] << 0; + a = (a << 30) | (a >>> 2); + + f = (e & a) | ((~e) & b); + t = (d << 5) | (d >>> 27); + c = t + f + c + 1518500249 + blocks[j + 2] << 0; + e = (e << 30) | (e >>> 2); + + f = (d & e) | ((~d) & a); + t = (c << 5) | (c >>> 27); + b = t + f + b + 1518500249 + blocks[j + 3] << 0; + d = (d << 30) | (d >>> 2); + + f = (c & d) | ((~c) & e); + t = (b << 5) | (b >>> 27); + a = t + f + a + 1518500249 + blocks[j + 4] << 0; + c = (c << 30) | (c >>> 2); + } + + for(; j < 40; j += 5) { + f = b ^ c ^ d; + t = (a << 5) | (a >>> 27); + e = t + f + e + 1859775393 + blocks[j] << 0; + b = (b << 30) | (b >>> 2); + + f = a ^ b ^ c; + t = (e << 5) | (e >>> 27); + d = t + f + d + 1859775393 + blocks[j + 1] << 0; + a = (a << 30) | (a >>> 2); + + f = e ^ a ^ b; + t = (d << 5) | (d >>> 27); + c = t + f + c + 1859775393 + blocks[j + 2] << 0; + e = (e << 30) | (e >>> 2); + + f = d ^ e ^ a; + t = (c << 5) | (c >>> 27); + b = t + f + b + 1859775393 + blocks[j + 3] << 0; + d = (d << 30) | (d >>> 2); + + f = c ^ d ^ e; + t = (b << 5) | (b >>> 27); + a = t + f + a + 1859775393 + blocks[j + 4] << 0; + c = (c << 30) | (c >>> 2); + } + + for(; j < 60; j += 5) { + f = (b & c) | (b & d) | (c & d); + t = (a << 5) | (a >>> 27); + e = t + f + e - 1894007588 + blocks[j] << 0; + b = (b << 30) | (b >>> 2); + + f = (a & b) | (a & c) | (b & c); + t = (e << 5) | (e >>> 27); + d = t + f + d - 1894007588 + blocks[j + 1] << 0; + a = (a << 30) | (a >>> 2); + + f = (e & a) | (e & b) | (a & b); + t = (d << 5) | (d >>> 27); + c = t + f + c - 1894007588 + blocks[j + 2] << 0; + e = (e << 30) | (e >>> 2); + + f = (d & e) | (d & a) | (e & a); + t = (c << 5) | (c >>> 27); + b = t + f + b - 1894007588 + blocks[j + 3] << 0; + d = (d << 30) | (d >>> 2); + + f = (c & d) | (c & e) | (d & e); + t = (b << 5) | (b >>> 27); + a = t + f + a - 1894007588 + blocks[j + 4] << 0; + c = (c << 30) | (c >>> 2); + } + + for(; j < 80; j += 5) { + f = b ^ c ^ d; + t = (a << 5) | (a >>> 27); + e = t + f + e - 899497514 + blocks[j] << 0; + b = (b << 30) | (b >>> 2); + + f = a ^ b ^ c; + t = (e << 5) | (e >>> 27); + d = t + f + d - 899497514 + blocks[j + 1] << 0; + a = (a << 30) | (a >>> 2); + + f = e ^ a ^ b; + t = (d << 5) | (d >>> 27); + c = t + f + c - 899497514 + blocks[j + 2] << 0; + e = (e << 30) | (e >>> 2); + + f = d ^ e ^ a; + t = (c << 5) | (c >>> 27); + b = t + f + b - 899497514 + blocks[j + 3] << 0; + d = (d << 30) | (d >>> 2); + + f = c ^ d ^ e; + t = (b << 5) | (b >>> 27); + a = t + f + a - 899497514 + blocks[j + 4] << 0; + c = (c << 30) | (c >>> 2); + } + + this.h0 = this.h0 + a << 0; + this.h1 = this.h1 + b << 0; + this.h2 = this.h2 + c << 0; + this.h3 = this.h3 + d << 0; + this.h4 = this.h4 + e << 0; + }; + + Sha1.prototype.hex = function () { + this.finalize(); + + var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4; + + return HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] + + HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] + + HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] + + HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] + + HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] + + HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] + + HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] + + HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] + + HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] + + HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] + + HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] + + HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] + + HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F] + + HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] + + HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] + + HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] + + HEX_CHARS[(h4 >> 28) & 0x0F] + HEX_CHARS[(h4 >> 24) & 0x0F] + + HEX_CHARS[(h4 >> 20) & 0x0F] + HEX_CHARS[(h4 >> 16) & 0x0F] + + HEX_CHARS[(h4 >> 12) & 0x0F] + HEX_CHARS[(h4 >> 8) & 0x0F] + + HEX_CHARS[(h4 >> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F]; + }; + + Sha1.prototype.toString = Sha1.prototype.hex; + + Sha1.prototype.digest = function () { + this.finalize(); + + var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4; + + return [ + (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, h0 & 0xFF, + (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, h1 & 0xFF, + (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, h2 & 0xFF, + (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, h3 & 0xFF, + (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, h4 & 0xFF + ]; + }; + + Sha1.prototype.array = Sha1.prototype.digest; + + Sha1.prototype.arrayBuffer = function () { + this.finalize(); + + var buffer = new ArrayBuffer(20); + var dataView = new DataView(buffer); + dataView.setUint32(0, this.h0); + dataView.setUint32(4, this.h1); + dataView.setUint32(8, this.h2); + dataView.setUint32(12, this.h3); + dataView.setUint32(16, this.h4); + return buffer; + }; + + var exports = createMethod(); + + if (COMMON_JS) { + module.exports = exports; + } else { + root.sha1 = exports; + if (AMD) { + define(function () { + return exports; + }); + } + } +})(); \ No newline at end of file diff --git a/miniprogram/utils/sha256.js b/miniprogram/utils/sha256.js new file mode 100644 index 0000000..b621650 --- /dev/null +++ b/miniprogram/utils/sha256.js @@ -0,0 +1,250 @@ +/* +* A JavaScript implementation of the SHA256 hash function. +* +* FILE: sha256.js +* VERSION: 0.8 +* AUTHOR: Christoph Bichlmeier +* +* NOTE: This version is not tested thoroughly! +* +* Copyright (c) 2003, Christoph Bichlmeier +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. Neither the name of the copyright holder nor the names of contributors +* may be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* ====================================================================== +* +* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS +* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* SHA256 logical functions */ +function rotateRight(n,x) { + return ((x >>> n) | (x << (32 - n))); +} +function choice(x,y,z) { + return ((x & y) ^ (~x & z)); +} +function majority(x,y,z) { + return ((x & y) ^ (x & z) ^ (y & z)); +} +function sha256_Sigma0(x) { + return (rotateRight(2, x) ^ rotateRight(13, x) ^ rotateRight(22, x)); +} +function sha256_Sigma1(x) { + return (rotateRight(6, x) ^ rotateRight(11, x) ^ rotateRight(25, x)); +} +function sha256_sigma0(x) { + return (rotateRight(7, x) ^ rotateRight(18, x) ^ (x >>> 3)); +} +function sha256_sigma1(x) { + return (rotateRight(17, x) ^ rotateRight(19, x) ^ (x >>> 10)); +} +function sha256_expand(W, j) { + return (W[j&0x0f] += sha256_sigma1(W[(j+14)&0x0f]) + W[(j+9)&0x0f] + +sha256_sigma0(W[(j+1)&0x0f])); +} + +/* Hash constant words K: */ +var K256 = new Array( + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +); + +/* global arrays */ +var ihash, count, buffer; +var sha256_hex_digits = "0123456789abcdef"; + +/* Add 32-bit integers with 16-bit operations (bug in some JS-interpreters: +overflow) */ +function safe_add(x, y) +{ + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xffff); +} + +/* Initialise the SHA256 computation */ +function sha256_init() { + ihash = new Array(8); + count = new Array(2); + buffer = new Array(64); + count[0] = count[1] = 0; + ihash[0] = 0x6a09e667; + ihash[1] = 0xbb67ae85; + ihash[2] = 0x3c6ef372; + ihash[3] = 0xa54ff53a; + ihash[4] = 0x510e527f; + ihash[5] = 0x9b05688c; + ihash[6] = 0x1f83d9ab; + ihash[7] = 0x5be0cd19; +} + +/* Transform a 512-bit message block */ +function sha256_transform() { + var a, b, c, d, e, f, g, h, T1, T2; + var W = new Array(16); + + /* Initialize registers with the previous intermediate value */ + a = ihash[0]; + b = ihash[1]; + c = ihash[2]; + d = ihash[3]; + e = ihash[4]; + f = ihash[5]; + g = ihash[6]; + h = ihash[7]; + + /* make 32-bit words */ + for(var i=0; i<16; i++) + W[i] = ((buffer[(i<<2)+3]) | (buffer[(i<<2)+2] << 8) | (buffer[(i<<2)+1] +<< 16) | (buffer[i<<2] << 24)); + + for(var j=0; j<64; j++) { + T1 = h + sha256_Sigma1(e) + choice(e, f, g) + K256[j]; + if(j < 16) T1 += W[j]; + else T1 += sha256_expand(W, j); + T2 = sha256_Sigma0(a) + majority(a, b, c); + h = g; + g = f; + f = e; + e = safe_add(d, T1); + d = c; + c = b; + b = a; + a = safe_add(T1, T2); + } + + /* Compute the current intermediate hash value */ + ihash[0] += a; + ihash[1] += b; + ihash[2] += c; + ihash[3] += d; + ihash[4] += e; + ihash[5] += f; + ihash[6] += g; + ihash[7] += h; +} + +/* Read the next chunk of data and update the SHA256 computation */ +function sha256_update(data, inputLen) { + var i, index, curpos = 0; + /* Compute number of bytes mod 64 */ + index = ((count[0] >> 3) & 0x3f); + var remainder = (inputLen & 0x3f); + + /* Update number of bits */ + if ((count[0] += (inputLen << 3)) < (inputLen << 3)) count[1]++; + count[1] += (inputLen >> 29); + + /* Transform as many times as possible */ + for(i=0; i+63> 3) & 0x3f); + buffer[index++] = 0x80; + if(index <= 56) { + for(var i=index; i<56; i++) + buffer[i] = 0; + } else { + for(var i=index; i<64; i++) + buffer[i] = 0; + sha256_transform(); + for(var i=0; i<56; i++) + buffer[i] = 0; + } + buffer[56] = (count[1] >>> 24) & 0xff; + buffer[57] = (count[1] >>> 16) & 0xff; + buffer[58] = (count[1] >>> 8) & 0xff; + buffer[59] = count[1] & 0xff; + buffer[60] = (count[0] >>> 24) & 0xff; + buffer[61] = (count[0] >>> 16) & 0xff; + buffer[62] = (count[0] >>> 8) & 0xff; + buffer[63] = count[0] & 0xff; + sha256_transform(); +} + +/* Split the internal hash values into an array of bytes */ +function sha256_encode_bytes() { + var j=0; + var output = new Array(32); + for(var i=0; i<8; i++) { + output[j++] = ((ihash[i] >>> 24) & 0xff); + output[j++] = ((ihash[i] >>> 16) & 0xff); + output[j++] = ((ihash[i] >>> 8) & 0xff); + output[j++] = (ihash[i] & 0xff); + } + return output; +} + +/* Get the internal hash as a hex string */ +function sha256_encode_hex() { + var output = new String(); + for(var i=0; i<8; i++) { + for(var j=28; j>=0; j-=4) + output += sha256_hex_digits.charAt((ihash[i] >>> j) & 0x0f); + } + return output; +} + +/* Main function: returns a hex string representing the SHA256 value of the +given data */ +function sha256_digest(data) { + sha256_init(); + sha256_update(data, data.length); + sha256_final(); + return sha256_encode_hex(); +} + +/* test if the JS-interpreter is working properly */ +function sha256_self_test() +{ + return sha256_digest("message digest") == +"f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650"; +} + +module.exports = {sha256_digest} \ No newline at end of file diff --git a/miniprogram/utils/ucharts/u-charts.js b/miniprogram/utils/ucharts/u-charts.js new file mode 100644 index 0000000..602dd99 --- /dev/null +++ b/miniprogram/utils/ucharts/u-charts.js @@ -0,0 +1,5658 @@ +/* + * uCharts v1.9.4.20200331 + * uni-app平台高性能跨全端图表,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360) + * Copyright (c) 2019 QIUN秋云 https://www.ucharts.cn All rights reserved. + * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) + * + * uCharts官方网站 + * https://www.uCharts.cn + * + * 开源地址: + * https://gitee.com/uCharts/uCharts + * + * uni-app插件市场地址: + * http://ext.dcloud.net.cn/plugin?id=271 + * + */ + +'use strict'; + +var config = { + yAxisWidth: 15, + yAxisSplit: 5, + xAxisHeight: 15, + xAxisLineHeight: 15, + legendHeight: 15, + yAxisTitleWidth: 15, + padding: [10, 10, 10, 10], + pixelRatio: 1, + rotate: false, + columePadding: 3, + fontSize: 13, + //dataPointShape: ['diamond', 'circle', 'triangle', 'rect'], + dataPointShape: ['circle', 'circle', 'circle', 'circle'], + colors: ['#1890ff', '#2fc25b', '#facc14', '#f04864', '#8543e0', '#90ed7d'], + pieChartLinePadding: 15, + pieChartTextPadding: 5, + xAxisTextPadding: 3, + titleColor: '#333333', + titleFontSize: 20, + subtitleColor: '#999999', + subtitleFontSize: 15, + toolTipPadding: 3, + toolTipBackground: '#000000', + toolTipOpacity: 0.7, + toolTipLineHeight: 20, + radarLabelTextMargin: 15, + gaugeLabelTextMargin: 15 +}; + +let assign = function (target, ...varArgs) { + if (target == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + if (!varArgs || varArgs.length <= 0) { + return target; + } + // 深度合并对象 + function deepAssign(obj1, obj2) { + for (let key in obj2) { + obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" ? + deepAssign(obj1[key], obj2[key]) : obj1[key] = obj2[key]; + } + return obj1; + } + + varArgs.forEach(val => { + target = deepAssign(target, val); + }); + return target; +}; + +var util = { + toFixed: function toFixed(num, limit) { + limit = limit || 2; + if (this.isFloat(num)) { + num = num.toFixed(limit); + } + return num; + }, + isFloat: function isFloat(num) { + return num % 1 !== 0; + }, + approximatelyEqual: function approximatelyEqual(num1, num2) { + return Math.abs(num1 - num2) < 1e-10; + }, + isSameSign: function isSameSign(num1, num2) { + return Math.abs(num1) === num1 && Math.abs(num2) === num2 || Math.abs(num1) !== num1 && Math.abs(num2) !== num2; + }, + isSameXCoordinateArea: function isSameXCoordinateArea(p1, p2) { + return this.isSameSign(p1.x, p2.x); + }, + isCollision: function isCollision(obj1, obj2) { + obj1.end = {}; + obj1.end.x = obj1.start.x + obj1.width; + obj1.end.y = obj1.start.y - obj1.height; + obj2.end = {}; + obj2.end.x = obj2.start.x + obj2.width; + obj2.end.y = obj2.start.y - obj2.height; + var flag = obj2.start.x > obj1.end.x || obj2.end.x < obj1.start.x || obj2.end.y > obj1.start.y || obj2.start.y < obj1.end.y; + return !flag; + } +}; + +//兼容H5点击事件 +function getH5Offset(e) { + e.mp = { + changedTouches: [] + }; + e.mp.changedTouches.push({ + x: e.offsetX, + y: e.offsetY + }); + return e; +} + +// hex 转 rgba +function hexToRgb(hexValue, opc) { + var rgx = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + var hex = hexValue.replace(rgx, function(m, r, g, b) { + return r + r + g + g + b + b; + }); + var rgb = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + var r = parseInt(rgb[1], 16); + var g = parseInt(rgb[2], 16); + var b = parseInt(rgb[3], 16); + return 'rgba(' + r + ',' + g + ',' + b + ',' + opc + ')'; +} + +function findRange(num, type, limit) { + if (isNaN(num)) { + throw new Error('[uCharts] unvalid series data!'); + } + limit = limit || 10; + type = type ? type : 'upper'; + var multiple = 1; + while (limit < 1) { + limit *= 10; + multiple *= 10; + } + if (type === 'upper') { + num = Math.ceil(num * multiple); + } else { + num = Math.floor(num * multiple); + } + while (num % limit !== 0) { + if (type === 'upper') { + num++; + } else { + num--; + } + } + return num / multiple; +} + +function calCandleMA(dayArr, nameArr, colorArr, kdata) { + let seriesTemp = []; + for (let k = 0; k < dayArr.length; k++) { + let seriesItem = { + data: [], + name: nameArr[k], + color: colorArr[k] + }; + for (let i = 0, len = kdata.length; i < len; i++) { + if (i < dayArr[k]) { + seriesItem.data.push(null); + continue; + } + let sum = 0; + for (let j = 0; j < dayArr[k]; j++) { + sum += kdata[i - j][1]; + } + seriesItem.data.push(+(sum / dayArr[k]).toFixed(3)); + } + seriesTemp.push(seriesItem); + } + return seriesTemp; +} + +function calValidDistance(self,distance, chartData, config, opts) { + var dataChartAreaWidth = opts.width - opts.area[1] - opts.area[3]; + var dataChartWidth = chartData.eachSpacing * (opts.chartData.xAxisData.xAxisPoints.length-1); + var validDistance = distance; + if (distance >= 0) { + validDistance = 0; + self.event.trigger('scrollLeft'); + } else if (Math.abs(distance) >= dataChartWidth - dataChartAreaWidth) { + validDistance = dataChartAreaWidth - dataChartWidth; + self.event.trigger('scrollRight'); + } + return validDistance; +} + +function isInAngleRange(angle, startAngle, endAngle) { + function adjust(angle) { + while (angle < 0) { + angle += 2 * Math.PI; + } + while (angle > 2 * Math.PI) { + angle -= 2 * Math.PI; + } + return angle; + } + angle = adjust(angle); + startAngle = adjust(startAngle); + endAngle = adjust(endAngle); + if (startAngle > endAngle) { + endAngle += 2 * Math.PI; + if (angle < startAngle) { + angle += 2 * Math.PI; + } + } + return angle >= startAngle && angle <= endAngle; +} + +function calRotateTranslate(x, y, h) { + var xv = x; + var yv = h - y; + var transX = xv + (h - yv - xv) / Math.sqrt(2); + transX *= -1; + var transY = (h - yv) * (Math.sqrt(2) - 1) - (h - yv - xv) / Math.sqrt(2); + return { + transX: transX, + transY: transY + }; +} + +function createCurveControlPoints(points, i) { + + function isNotMiddlePoint(points, i) { + if (points[i - 1] && points[i + 1]) { + return points[i].y >= Math.max(points[i - 1].y, points[i + 1].y) || points[i].y <= Math.min(points[i - 1].y,points[i + 1].y); + } else { + return false; + } + } + function isNotMiddlePointX(points, i) { + if (points[i - 1] && points[i + 1]) { + return points[i].x >= Math.max(points[i - 1].x, points[i + 1].x) || points[i].x <= Math.min(points[i - 1].x,points[i + 1].x); + } else { + return false; + } + } + var a = 0.2; + var b = 0.2; + var pAx = null; + var pAy = null; + var pBx = null; + var pBy = null; + if (i < 1) { + pAx = points[0].x + (points[1].x - points[0].x) * a; + pAy = points[0].y + (points[1].y - points[0].y) * a; + } else { + pAx = points[i].x + (points[i + 1].x - points[i - 1].x) * a; + pAy = points[i].y + (points[i + 1].y - points[i - 1].y) * a; + } + + if (i > points.length - 3) { + var last = points.length - 1; + pBx = points[last].x - (points[last].x - points[last - 1].x) * b; + pBy = points[last].y - (points[last].y - points[last - 1].y) * b; + } else { + pBx = points[i + 1].x - (points[i + 2].x - points[i].x) * b; + pBy = points[i + 1].y - (points[i + 2].y - points[i].y) * b; + } + if (isNotMiddlePoint(points, i + 1)) { + pBy = points[i + 1].y; + } + if (isNotMiddlePoint(points, i)) { + pAy = points[i].y; + } + if (isNotMiddlePointX(points, i + 1)) { + pBx = points[i + 1].x; + } + if (isNotMiddlePointX(points, i)) { + pAx = points[i].x; + } + if (pAy >= Math.max(points[i].y, points[i + 1].y) || pAy <= Math.min(points[i].y, points[i + 1].y)) { + pAy = points[i].y; + } + if (pBy >= Math.max(points[i].y, points[i + 1].y) || pBy <= Math.min(points[i].y, points[i + 1].y)) { + pBy = points[i + 1].y; + } + if (pAx >= Math.max(points[i].x, points[i + 1].x) || pAx <= Math.min(points[i].x, points[i + 1].x)) { + pAx = points[i].x; + } + if (pBx >= Math.max(points[i].x, points[i + 1].x) || pBx <= Math.min(points[i].x, points[i + 1].x)) { + pBx = points[i + 1].x; + } + return { + ctrA: { + x: pAx, + y: pAy + }, + ctrB: { + x: pBx, + y: pBy + } + }; +} + +function convertCoordinateOrigin(x, y, center) { + return { + x: center.x + x, + y: center.y - y + }; +} + +function avoidCollision(obj, target) { + if (target) { + // is collision test + while (util.isCollision(obj, target)) { + if (obj.start.x > 0) { + obj.start.y--; + } else if (obj.start.x < 0) { + obj.start.y++; + } else { + if (obj.start.y > 0) { + obj.start.y++; + } else { + obj.start.y--; + } + } + } + } + return obj; +} + +function fillSeries(series, opts, config) { + var index = 0; + return series.map(function(item) { + if (!item.color) { + item.color = config.colors[index]; + index = (index + 1) % config.colors.length; + } + if (!item.index) { + item.index = 0; + } + if (!item.type) { + item.type = opts.type; + } + if (typeof item.show == "undefined") { + item.show = true; + } + if (!item.type) { + item.type = opts.type; + } + if (!item.pointShape) { + item.pointShape = "circle"; + } + if (!item.legendShape) { + switch (item.type) { + case 'line': + item.legendShape = "line"; + break; + case 'column': + item.legendShape = "rect"; + break; + case 'area': + item.legendShape = "triangle"; + break; + default: + item.legendShape = "circle"; + } + } + return item; + }); +} + +function getDataRange(minData, maxData) { + var limit = 0; + var range = maxData - minData; + if (range >= 10000) { + limit = 1000; + } else if (range >= 1000) { + limit = 100; + } else if (range >= 100) { + limit = 10; + } else if (range >= 10) { + limit = 5; + } else if (range >= 1) { + limit = 1; + } else if (range >= 0.1) { + limit = 0.1; + } else if (range >= 0.01) { + limit = 0.01; + } else if (range >= 0.001) { + limit = 0.001; + } else if (range >= 0.0001) { + limit = 0.0001; + } else if (range >= 0.00001) { + limit = 0.00001; + } else { + limit = 0.000001; + } + return { + minRange: findRange(minData, 'lower', limit), + maxRange: findRange(maxData, 'upper', limit) + }; +} + +function measureText(text) { + var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : config.fontSize; + text = String(text); + var text = text.split(''); + var width = 0; + for (let i = 0; i < text.length; i++) { + let item = text[i]; + if (/[a-zA-Z]/.test(item)) { + width += 7; + } else if (/[0-9]/.test(item)) { + width += 5.5; + } else if (/\./.test(item)) { + width += 2.7; + } else if (/-/.test(item)) { + width += 3.25; + } else if (/[\u4e00-\u9fa5]/.test(item)) { + width += 10; + } else if (/\(|\)/.test(item)) { + width += 3.73; + } else if (/\s/.test(item)) { + width += 2.5; + } else if (/%/.test(item)) { + width += 8; + } else { + width += 10; + } + } + return width * fontSize / 10; +} + +function dataCombine(series) { + return series.reduce(function(a, b) { + return (a.data ? a.data : a).concat(b.data); + }, []); +} + +function dataCombineStack(series, len) { + var sum = new Array(len); + for (var j = 0; j < sum.length; j++) { + sum[j] = 0; + } + for (var i = 0; i < series.length; i++) { + for (var j = 0; j < sum.length; j++) { + sum[j] += series[i].data[j]; + } + } + return series.reduce(function(a, b) { + return (a.data ? a.data : a).concat(b.data).concat(sum); + }, []); +} + +function getTouches(touches, opts, e) { + let x, y; + if (touches.clientX) { + if (opts.rotate) { + y = opts.height - touches.clientX * opts.pixelRatio; + x = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pixelRatio / 2) * (opts.pixelRatio - 1)) * + opts.pixelRatio; + } else { + x = touches.clientX * opts.pixelRatio; + y = (touches.pageY - e.currentTarget.offsetTop - (opts.height / opts.pixelRatio / 2) * (opts.pixelRatio - 1)) * + opts.pixelRatio; + } + } else { + if (opts.rotate) { + y = opts.height - touches.x * opts.pixelRatio; + x = touches.y * opts.pixelRatio; + } else { + x = touches.x * opts.pixelRatio; + y = touches.y * opts.pixelRatio; + } + } + return { + x: x, + y: y + } +} + +function getSeriesDataItem(series, index) { + var data = []; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + if (item.data[index] !== null && typeof item.data[index] !== 'undefined' && item.show) { + let seriesItem = {}; + seriesItem.color = item.color; + seriesItem.type = item.type; + seriesItem.style = item.style; + seriesItem.pointShape = item.pointShape; + seriesItem.disableLegend = item.disableLegend; + seriesItem.name = item.name; + seriesItem.show = item.show; + seriesItem.data = item.format ? item.format(item.data[index]) : item.data[index]; + data.push(seriesItem); + } + } + return data; +} + +function getMaxTextListLength(list) { + var lengthList = list.map(function(item) { + return measureText(item); + }); + return Math.max.apply(null, lengthList); +} + +function getRadarCoordinateSeries(length) { + var eachAngle = 2 * Math.PI / length; + var CoordinateSeries = []; + for (var i = 0; i < length; i++) { + CoordinateSeries.push(eachAngle * i); + } + + return CoordinateSeries.map(function(item) { + return -1 * item + Math.PI / 2; + }); +} + +function getToolTipData(seriesData, calPoints, index, categories) { + var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + + var textList = seriesData.map(function(item) { + let titleText=[]; + if(categories){ + titleText=categories; + }else{ + titleText=item.data; + } + return { + text: option.format ? option.format(item, titleText[index]) : item.name + ': ' + item.data, + color: item.color + }; + }); + var validCalPoints = []; + var offset = { + x: 0, + y: 0 + }; + for (let i = 0; i < calPoints.length; i++) { + let points = calPoints[i]; + if (typeof points[index] !== 'undefined' && points[index] !== null) { + validCalPoints.push(points[index]); + } + } + for (let i = 0; i < validCalPoints.length; i++) { + let item = validCalPoints[i]; + offset.x = Math.round(item.x); + offset.y += item.y; + } + offset.y /= validCalPoints.length; + return { + textList: textList, + offset: offset + }; +} + +function getMixToolTipData(seriesData, calPoints, index, categories) { + var option = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + var textList = seriesData.map(function(item) { + return { + text: option.format ? option.format(item, categories[index]) : item.name + ': ' + item.data, + color: item.color, + disableLegend: item.disableLegend ? true : false + }; + }); + textList = textList.filter(function(item) { + if (item.disableLegend !== true) { + return item; + } + }); + var validCalPoints = []; + var offset = { + x: 0, + y: 0 + }; + for (let i = 0; i < calPoints.length; i++) { + let points = calPoints[i]; + if (typeof points[index] !== 'undefined' && points[index] !== null) { + validCalPoints.push(points[index]); + } + } + for (let i = 0; i < validCalPoints.length; i++) { + let item = validCalPoints[i]; + offset.x = Math.round(item.x); + offset.y += item.y; + } + offset.y /= validCalPoints.length; + return { + textList: textList, + offset: offset + }; +} + +function getCandleToolTipData(series, seriesData, calPoints, index, categories, extra) { + var option = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {}; + let upColor = extra.color.upFill; + let downColor = extra.color.downFill; + //颜色顺序为开盘,收盘,最低,最高 + let color = [upColor, upColor, downColor, upColor]; + var textList = []; + let text0 = { + text: categories[index], + color: null + }; + textList.push(text0); + seriesData.map(function(item) { + if (index == 0 && item.data[1] - item.data[0] < 0) { + color[1] = downColor; + } else { + if (item.data[0] < series[index - 1][1]) { + color[0] = downColor; + } + if (item.data[1] < item.data[0]) { + color[1] = downColor; + } + if (item.data[2] > series[index - 1][1]) { + color[2] = upColor; + } + if (item.data[3] < series[index - 1][1]) { + color[3] = downColor; + } + } + let text1 = { + text: '开盘:' + item.data[0], + color: color[0] + }; + let text2 = { + text: '收盘:' + item.data[1], + color: color[1] + }; + let text3 = { + text: '最低:' + item.data[2], + color: color[2] + }; + let text4 = { + text: '最高:' + item.data[3], + color: color[3] + }; + textList.push(text1, text2, text3, text4); + }); + var validCalPoints = []; + var offset = { + x: 0, + y: 0 + }; + for (let i = 0; i < calPoints.length; i++) { + let points = calPoints[i]; + if (typeof points[index] !== 'undefined' && points[index] !== null) { + validCalPoints.push(points[index]); + } + } + offset.x = Math.round(validCalPoints[0][0].x); + return { + textList: textList, + offset: offset + }; +} + +function filterSeries(series) { + let tempSeries = []; + for (let i = 0; i < series.length; i++) { + if (series[i].show == true) { + tempSeries.push(series[i]) + } + } + return tempSeries; +} + +function findCurrentIndex(currentPoints, calPoints, opts, config) { + var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + var currentIndex = -1; + var spacing = opts.chartData.eachSpacing/2; + let xAxisPoints=[]; + if(calPoints.length>0){ + if(opts.type=='candle'){ + for(let i=0;i item) { + currentIndex = index; + } + }); + } + } + return currentIndex; +} + +function findLegendIndex(currentPoints, legendData, opts) { + let currentIndex = -1; + if (isInExactLegendArea(currentPoints, legendData.area)) { + let points = legendData.points; + let index = -1; + for (let i = 0, len = points.length; i < len; i++) { + let item = points[i]; + for (let j = 0; j < item.length; j++) { + index += 1; + let area = item[j]['area']; + if (currentPoints.x > area[0] && currentPoints.x < area[2] && currentPoints.y > area[1] && currentPoints.y < area[3]) { + currentIndex = index; + break; + } + } + } + return currentIndex; + } + return currentIndex; +} + +function isInExactLegendArea(currentPoints, area) { + return currentPoints.x > area.start.x && currentPoints.x < area.end.x && currentPoints.y > area.start.y && + currentPoints.y < area.end.y; +} + +function isInExactChartArea(currentPoints, opts, config) { + return currentPoints.x <= opts.width - opts.area[1] + 10 && currentPoints.x >= opts.area[3] -10 && currentPoints.y >= opts.area[0] && currentPoints.y <= opts.height - opts.area[2]; +} + +function findRadarChartCurrentIndex(currentPoints, radarData, count) { + var eachAngleArea = 2 * Math.PI / count; + var currentIndex = -1; + if (isInExactPieChartArea(currentPoints, radarData.center, radarData.radius)) { + var fixAngle = function fixAngle(angle) { + if (angle < 0) { + angle += 2 * Math.PI; + } + if (angle > 2 * Math.PI) { + angle -= 2 * Math.PI; + } + return angle; + }; + + var angle = Math.atan2(radarData.center.y - currentPoints.y, currentPoints.x - radarData.center.x); + angle = -1 * angle; + if (angle < 0) { + angle += 2 * Math.PI; + } + + var angleList = radarData.angleList.map(function(item) { + item = fixAngle(-1 * item); + + return item; + }); + + angleList.forEach(function(item, index) { + var rangeStart = fixAngle(item - eachAngleArea / 2); + var rangeEnd = fixAngle(item + eachAngleArea / 2); + if (rangeEnd < rangeStart) { + rangeEnd += 2 * Math.PI; + } + if (angle >= rangeStart && angle <= rangeEnd || angle + 2 * Math.PI >= rangeStart && angle + 2 * Math.PI <= + rangeEnd) { + currentIndex = index; + } + }); + } + + return currentIndex; +} + +function findFunnelChartCurrentIndex(currentPoints, funnelData) { + var currentIndex = -1; + for (var i = 0, len = funnelData.series.length; i < len; i++) { + var item = funnelData.series[i]; + if (currentPoints.x > item.funnelArea[0] && currentPoints.x < item.funnelArea[2] && currentPoints.y > item.funnelArea[1] && currentPoints.y < item.funnelArea[3]) { + currentIndex = i; + break; + } + } + return currentIndex; +} + +function findWordChartCurrentIndex(currentPoints, wordData) { + var currentIndex = -1; + for (var i = 0, len = wordData.length; i < len; i++) { + var item = wordData[i]; + if (currentPoints.x > item.area[0] && currentPoints.x < item.area[2] && currentPoints.y > item.area[1] && currentPoints.y < item.area[3]) { + currentIndex = i; + break; + } + } + return currentIndex; +} + +function findMapChartCurrentIndex(currentPoints, opts) { + var currentIndex = -1; + var cData=opts.chartData.mapData; + var data=opts.series; + var tmp=pointToCoordinate(currentPoints.y, currentPoints.x,cData.bounds,cData.scale,cData.xoffset,cData.yoffset); + var poi=[tmp.x, tmp.y]; + for (var i = 0, len = data.length; i < len; i++) { + var item = data[i].geometry.coordinates; + if(isPoiWithinPoly(poi,item)){ + currentIndex = i; + break; + } + } + return currentIndex; +} + +function findPieChartCurrentIndex(currentPoints, pieData) { + var currentIndex = -1; + if (isInExactPieChartArea(currentPoints, pieData.center, pieData.radius)) { + var angle = Math.atan2(pieData.center.y - currentPoints.y, currentPoints.x - pieData.center.x); + angle = -angle; + for (var i = 0, len = pieData.series.length; i < len; i++) { + var item = pieData.series[i]; + if (isInAngleRange(angle, item._start_, item._start_ + item._proportion_ * 2 * Math.PI)) { + currentIndex = i; + break; + } + } + } + + return currentIndex; +} + +function isInExactPieChartArea(currentPoints, center, radius) { + return Math.pow(currentPoints.x - center.x, 2) + Math.pow(currentPoints.y - center.y, 2) <= Math.pow(radius, 2); +} + +function splitPoints(points) { + var newPoints = []; + var items = []; + points.forEach(function(item, index) { + if (item !== null) { + items.push(item); + } else { + if (items.length) { + newPoints.push(items); + } + items = []; + } + }); + if (items.length) { + newPoints.push(items); + } + + return newPoints; +} + +function calLegendData(series, opts, config, chartData) { + let legendData = { + area: { + start: { + x: 0, + y: 0 + }, + end: { + x: 0, + y: 0 + }, + width: 0, + height: 0, + wholeWidth: 0, + wholeHeight: 0 + }, + points: [], + widthArr: [], + heightArr: [] + }; + if (opts.legend.show === false) { + chartData.legendData = legendData; + return legendData; + } + + let padding = opts.legend.padding; + let margin = opts.legend.margin; + let fontSize = opts.legend.fontSize; + let shapeWidth = 15 * opts.pixelRatio; + let shapeRight = 5 * opts.pixelRatio; + let lineHeight = Math.max(opts.legend.lineHeight * opts.pixelRatio, fontSize); + if (opts.legend.position == 'top' || opts.legend.position == 'bottom') { + let legendList = []; + let widthCount = 0; + let widthCountArr = []; + let currentRow = []; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + let itemWidth = shapeWidth + shapeRight + measureText(item.name || 'undefined', fontSize) + opts.legend.itemGap; + if (widthCount + itemWidth > opts.width - opts.padding[1] - opts.padding[3]) { + legendList.push(currentRow); + widthCountArr.push(widthCount - opts.legend.itemGap); + widthCount = itemWidth; + currentRow = [item]; + } else { + widthCount += itemWidth; + currentRow.push(item); + } + } + if (currentRow.length) { + legendList.push(currentRow); + widthCountArr.push(widthCount - opts.legend.itemGap); + legendData.widthArr = widthCountArr; + let legendWidth = Math.max.apply(null, widthCountArr); + switch (opts.legend.float) { + case 'left': + legendData.area.start.x = opts.padding[3]; + legendData.area.end.x = opts.padding[3] + 2 * padding; + break; + case 'right': + legendData.area.start.x = opts.width - opts.padding[1] - legendWidth - 2 * padding; + legendData.area.end.x = opts.width - opts.padding[1]; + break; + default: + legendData.area.start.x = (opts.width - legendWidth) / 2 - padding; + legendData.area.end.x = (opts.width + legendWidth) / 2 + padding; + } + legendData.area.width = legendWidth + 2 * padding; + legendData.area.wholeWidth = legendWidth + 2 * padding; + legendData.area.height = legendList.length * lineHeight + 2 * padding; + legendData.area.wholeHeight = legendList.length * lineHeight + 2 * padding + 2 * margin; + legendData.points = legendList; + } + } else { + let len = series.length; + let maxHeight = opts.height - opts.padding[0] - opts.padding[2] - 2 * margin - 2 * padding; + let maxLength = Math.min(Math.floor(maxHeight / lineHeight), len); + legendData.area.height = maxLength * lineHeight + padding * 2; + legendData.area.wholeHeight = maxLength * lineHeight + padding * 2; + switch (opts.legend.float) { + case 'top': + legendData.area.start.y = opts.padding[0] + margin; + legendData.area.end.y = opts.padding[0] + margin + legendData.area.height; + break; + case 'bottom': + legendData.area.start.y = opts.height - opts.padding[2] - margin - legendData.area.height; + legendData.area.end.y = opts.height - opts.padding[2] - margin; + break; + default: + legendData.area.start.y = (opts.height - legendData.area.height) / 2; + legendData.area.end.y = (opts.height + legendData.area.height) / 2; + } + let lineNum = len % maxLength === 0 ? len / maxLength : Math.floor((len / maxLength) + 1); + let currentRow = []; + for (let i = 0; i < lineNum; i++) { + let temp = series.slice(i * maxLength, i * maxLength + maxLength); + currentRow.push(temp); + } + + legendData.points = currentRow; + + if (currentRow.length) { + for (let i = 0; i < currentRow.length; i++) { + let item = currentRow[i]; + let maxWidth = 0; + for (let j = 0; j < item.length; j++) { + let itemWidth = shapeWidth + shapeRight + measureText(item[j].name || 'undefined', fontSize) + opts.legend.itemGap; + if (itemWidth > maxWidth) { + maxWidth = itemWidth; + } + } + legendData.widthArr.push(maxWidth); + legendData.heightArr.push(item.length * lineHeight + padding * 2); + } + let legendWidth = 0 + for (let i = 0; i < legendData.widthArr.length; i++) { + legendWidth += legendData.widthArr[i]; + } + legendData.area.width = legendWidth - opts.legend.itemGap + 2 * padding; + legendData.area.wholeWidth = legendData.area.width + padding; + } + } + + switch (opts.legend.position) { + case 'top': + legendData.area.start.y = opts.padding[0] + margin; + legendData.area.end.y = opts.padding[0] + margin + legendData.area.height; + break; + case 'bottom': + legendData.area.start.y = opts.height - opts.padding[2] - legendData.area.height - margin; + legendData.area.end.y = opts.height - opts.padding[2] - margin; + break; + case 'left': + legendData.area.start.x = opts.padding[3]; + legendData.area.end.x = opts.padding[3] + legendData.area.width; + break; + case 'right': + legendData.area.start.x = opts.width - opts.padding[1] - legendData.area.width; + legendData.area.end.x = opts.width - opts.padding[1]; + break; + } + chartData.legendData = legendData; + return legendData; +} + +function calCategoriesData(categories, opts, config, eachSpacing) { + var result = { + angle: 0, + xAxisHeight: config.xAxisHeight + }; + var categoriesTextLenth = categories.map(function(item) { + return measureText(item,opts.xAxis.fontSize||config.fontSize); + }); + var maxTextLength = Math.max.apply(this, categoriesTextLenth); + + if (opts.xAxis.rotateLabel == true && maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) { + result.angle = 45 * Math.PI / 180; + result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle); + } + return result; +} + +function getXAxisTextList(series, opts, config) { + var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + var data = dataCombine(series); + var sorted = []; + // remove null from data + data = data.filter(function(item) { + //return item !== null; + if (typeof item === 'object' && item !== null) { + if (item.constructor == Array) { + return item !== null; + } else { + return item.value !== null; + } + } else { + return item !== null; + } + }); + data.map(function(item) { + if (typeof item === 'object') { + if (item.constructor == Array) { + if(opts.type=='candle'){ + item.map(function(subitem) { + sorted.push(subitem); + }) + }else{ + sorted.push(item[0]); + } + } else { + sorted.push(item.value); + } + } else { + sorted.push(item); + } + }) + + var minData = 0; + var maxData = 0; + if (sorted.length > 0) { + minData = Math.min.apply(this, sorted); + maxData = Math.max.apply(this, sorted); + } + //为了兼容v1.9.0之前的项目 + if(index>-1){ + if (typeof opts.xAxis.data[index].min === 'number') { + minData = Math.min(opts.xAxis.data[index].min, minData); + } + if (typeof opts.xAxis.data[index].max === 'number') { + maxData = Math.max(opts.xAxis.data[index].max, maxData); + } + }else{ + if (typeof opts.xAxis.min === 'number') { + minData = Math.min(opts.xAxis.min, minData); + } + if (typeof opts.xAxis.max === 'number') { + maxData = Math.max(opts.xAxis.max, maxData); + } + } + + + if (minData === maxData) { + var rangeSpan = maxData || 10; + maxData += rangeSpan; + } + + //var dataRange = getDataRange(minData, maxData); + var minRange = minData; + var maxRange = maxData; + + var range = []; + var eachRange = (maxRange - minRange) / opts.xAxis.splitNumber; + + for (var i = 0; i <= opts.xAxis.splitNumber; i++) { + range.push(minRange + eachRange * i); + } + return range; +} + +function calXAxisData(series, opts, config){ + var result = { + angle: 0, + xAxisHeight: config.xAxisHeight + }; + + result.ranges = getXAxisTextList(series, opts, config); + result.rangesFormat = result.ranges.map(function(item){ + item = opts.xAxis.format? opts.xAxis.format(item):util.toFixed(item, 2); + return item; + }); + + var xAxisScaleValues = result.ranges.map(function (item) { + // 如果刻度值是浮点数,则保留两位小数 + item = util.toFixed(item, 2); + // 若有自定义格式则调用自定义的格式化函数 + item = opts.xAxis.format ? opts.xAxis.format(Number(item)) : item; + return item; + }); + + result = Object.assign(result,getXAxisPoints(xAxisScaleValues, opts, config)); + // 计算X轴刻度的属性譬如每个刻度的间隔,刻度的起始点\结束点以及总长 + var eachSpacing = result.eachSpacing; + + var textLength = xAxisScaleValues.map(function (item) { + return measureText(item); + }); + + // get max length of categories text + var maxTextLength = Math.max.apply(this, textLength); + + // 如果刻度值文本内容过长,则将其逆时针旋转45° + if (maxTextLength + 2 * config.xAxisTextPadding > eachSpacing) { + result.angle = 45 * Math.PI / 180; + result.xAxisHeight = 2 * config.xAxisTextPadding + maxTextLength * Math.sin(result.angle); + } + + if (opts.xAxis.disabled === true) { + result.xAxisHeight = 0; + } + + return result; +} + +function getRadarDataPoints(angleList, center, radius, series, opts) { + var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1; + + var radarOption = opts.extra.radar || {}; + radarOption.max = radarOption.max || 0; + var maxData = Math.max(radarOption.max, Math.max.apply(null, dataCombine(series))); + + var data = []; + for (let i = 0; i < series.length; i++) { + let each = series[i]; + let listItem = {}; + listItem.color = each.color; + listItem.legendShape = each.legendShape; + listItem.pointShape = each.pointShape; + listItem.data = []; + each.data.forEach(function(item, index) { + let tmp = {}; + tmp.angle = angleList[index]; + + tmp.proportion = item / maxData; + tmp.position = convertCoordinateOrigin(radius * tmp.proportion * process * Math.cos(tmp.angle), radius * tmp.proportion * + process * Math.sin(tmp.angle), center); + listItem.data.push(tmp); + }); + + data.push(listItem); + } + + return data; +} + +function getPieDataPoints(series, radius) { + var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + + var count = 0; + var _start_ = 0; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + count += item.data; + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + if (count === 0) { + item._proportion_ = 1 / series.length * process; + } else { + item._proportion_ = item.data / count * process; + } + item._radius_ = radius; + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item._start_ = _start_; + _start_ += 2 * item._proportion_ * Math.PI; + } + + return series; +} + +function getFunnelDataPoints(series, radius) { + var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + series = series.sort(function(a,b){return parseInt(b.data)-parseInt(a.data);}); + for (let i = 0; i < series.length; i++) { + series[i].radius = series[i].data/series[0].data*radius*process; + series[i]._proportion_ = series[i].data/series[0].data; + } + return series.reverse(); +} + +function getRoseDataPoints(series, type, minRadius, radius) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var count = 0; + var _start_ = 0; + + var dataArr = []; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + count += item.data; + dataArr.push(item.data); + } + + var minData = Math.min.apply(null, dataArr); + var maxData = Math.max.apply(null, dataArr); + var radiusLength = radius - minRadius; + + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + if (count === 0 || type == 'area') { + item._proportion_ = item.data / count * process; + item._rose_proportion_ = 1 / series.length * process; + } else { + item._proportion_ = item.data / count * process; + item._rose_proportion_ = item.data / count * process; + } + item._radius_ = minRadius + radiusLength * ((item.data - minData) / (maxData - minData)); + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item._start_ = _start_; + _start_ += 2 * item._rose_proportion_ * Math.PI; + } + + return series; +} + +function getArcbarDataPoints(series, arcbarOption) { + var process = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + if (process == 1) { + process = 0.999999; + } + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + let totalAngle; + if (arcbarOption.type == 'circle') { + totalAngle = 2; + } else { + if (arcbarOption.endAngle < arcbarOption.startAngle) { + totalAngle = 2 + arcbarOption.endAngle - arcbarOption.startAngle; + } else{ + totalAngle = arcbarOption.startAngle - arcbarOption.endAngle; + } + } + item._proportion_ = totalAngle * item.data * process + arcbarOption.startAngle; + if (item._proportion_ >= 2) { + item._proportion_ = item._proportion_ % 2; + } + } + return series; +} + +function getGaugeAxisPoints(categories, startAngle, endAngle) { + let totalAngle = startAngle - endAngle + 1; + let tempStartAngle = startAngle; + for (let i = 0; i < categories.length; i++) { + categories[i].value = categories[i].value === null ? 0 : categories[i].value; + categories[i]._startAngle_ = tempStartAngle; + categories[i]._endAngle_ = totalAngle * categories[i].value + startAngle; + if (categories[i]._endAngle_ >= 2) { + categories[i]._endAngle_ = categories[i]._endAngle_ % 2; + } + tempStartAngle = categories[i]._endAngle_; + } + return categories; +} + +function getGaugeDataPoints(series, categories, gaugeOption) { + let process = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + item.data = item.data === null ? 0 : item.data; + if (gaugeOption.pointer.color == 'auto') { + for (let i = 0; i < categories.length; i++) { + if (item.data <= categories[i].value) { + item.color = categories[i].color; + break; + } + } + } else { + item.color = gaugeOption.pointer.color; + } + let totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1; + item._endAngle_ = totalAngle * item.data + gaugeOption.startAngle; + item._oldAngle_ = gaugeOption.oldAngle; + if (gaugeOption.oldAngle < gaugeOption.endAngle) { + item._oldAngle_ += 2; + } + if (item.data >= gaugeOption.oldData) { + item._proportion_ = (item._endAngle_ - item._oldAngle_) * process + gaugeOption.oldAngle; + } else { + item._proportion_ = item._oldAngle_ - (item._oldAngle_ - item._endAngle_) * process; + } + if (item._proportion_ >= 2) { + item._proportion_ = item._proportion_ % 2; + } + } + return series; +} + +function getPieTextMaxLength(series) { + series = getPieDataPoints(series); + let maxLength = 0; + for (let i = 0; i < series.length; i++) { + let item = series[i]; + let text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_ * 100) + '%'; + maxLength = Math.max(maxLength, measureText(text)); + } + + return maxLength; +} + +function fixColumeData(points, eachSpacing, columnLen, index, config, opts) { + return points.map(function(item) { + if (item === null) { + return null; + } + item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / columnLen); + + if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) { + item.width = Math.min(item.width, +opts.extra.column.width); + } + if (item.width <= 0) { + item.width = 1; + } + item.x += (index + 0.5 - columnLen / 2) * item.width; + return item; + }); +} + +function fixColumeMeterData(points, eachSpacing, columnLen, index, config, opts, border) { + return points.map(function(item) { + if (item === null) { + return null; + } + item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / 2); + + if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) { + item.width = Math.min(item.width, +opts.extra.column.width); + } + + if (index > 0) { + item.width -= 2 * border; + } + return item; + }); +} + +function fixColumeStackData(points, eachSpacing, columnLen, index, config, opts, series) { + + return points.map(function(item, indexn) { + + if (item === null) { + return null; + } + item.width = Math.ceil((eachSpacing - 2 * config.columePadding) / 2); + + if (opts.extra.column && opts.extra.column.width && +opts.extra.column.width > 0) { + item.width = Math.min(item.width, +opts.extra.column.width); + } + return item; + }); +} + +function getXAxisPoints(categories, opts, config) { + var spacingValid = opts.width - opts.area[1] - opts.area[3]; + var dataCount = opts.enableScroll ? Math.min(opts.xAxis.itemCount, categories.length) : categories.length; + if((opts.type=='line' || opts.type=='area') && dataCount>1 && opts.xAxis.boundaryGap=='justify'){ + dataCount -=1; + } + var eachSpacing = spacingValid / dataCount; + + var xAxisPoints = []; + var startX = opts.area[3]; + var endX = opts.width - opts.area[1]; + categories.forEach(function(item, index) { + xAxisPoints.push(startX + index * eachSpacing); + }); + if(opts.xAxis.boundaryGap !=='justify'){ + if (opts.enableScroll === true) { + xAxisPoints.push(startX + categories.length * eachSpacing); + } else { + xAxisPoints.push(endX); + } + } + return { + xAxisPoints: xAxisPoints, + startX: startX, + endX: endX, + eachSpacing: eachSpacing + }; +} + +function getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) { + var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1; + var points = []; + var validHeight = opts.height - opts.area[0] - opts.area[2]; + data.forEach(function(item, index) { + if (item === null) { + points.push(null); + } else { + var cPoints = []; + item.forEach(function(items, indexs) { + var point = {}; + point.x = xAxisPoints[index] + Math.round(eachSpacing / 2); + var value = items.value || items; + var height = validHeight * (value - minRange) / (maxRange - minRange); + height *= process; + point.y = opts.height - Math.round(height) - opts.area[2]; + cPoints.push(point); + }); + points.push(cPoints); + } + }); + + return points; +} + +function getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config) { + var process = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1; + var boundaryGap='center'; + if (opts.type == 'line'||opts.type == 'area'){ + boundaryGap=opts.xAxis.boundaryGap; + } + var points = []; + var validHeight = opts.height - opts.area[0] - opts.area[2]; + var validWidth = opts.width - opts.area[1] - opts.area[3]; + data.forEach(function(item, index) { + if (item === null) { + points.push(null); + } else { + var point = {}; + point.color = item.color; + point.x = xAxisPoints[index]; + var value = item; + if (typeof item === 'object' && item !== null) { + if (item.constructor == Array) { + let xranges,xminRange,xmaxRange; + xranges = [].concat(opts.chartData.xAxisData.ranges); + xminRange = xranges.shift(); + xmaxRange = xranges.pop(); + value = item[1]; + point.x = opts.area[3]+ validWidth * (item[0] - xminRange) / (xmaxRange - xminRange); + } else { + value = item.value; + } + } + if(boundaryGap=='center'){ + point.x += Math.round(eachSpacing / 2); + } + var height = validHeight * (value - minRange) / (maxRange - minRange); + height *= process; + point.y = opts.height - Math.round(height) - opts.area[2]; + points.push(point); + } + }); + + return points; +} + +function getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, stackSeries) { + var process = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : 1; + var points = []; + var validHeight = opts.height - opts.area[0] - opts.area[2]; + + data.forEach(function(item, index) { + if (item === null) { + points.push(null); + } else { + var point = {}; + point.color = item.color; + point.x = xAxisPoints[index] + Math.round(eachSpacing / 2); + + if (seriesIndex > 0) { + var value = 0; + for (let i = 0; i <= seriesIndex; i++) { + value += stackSeries[i].data[index]; + } + var value0 = value - item; + var height = validHeight * (value - minRange) / (maxRange - minRange); + var height0 = validHeight * (value0 - minRange) / (maxRange - minRange); + } else { + var value = item; + var height = validHeight * (value - minRange) / (maxRange - minRange); + var height0 = 0; + } + var heightc = height0; + height *= process; + heightc *= process; + point.y = opts.height - Math.round(height) - opts.area[2]; + point.y0 = opts.height - Math.round(heightc) - opts.area[2]; + points.push(point); + } + }); + + return points; +} + +function getYAxisTextList(series, opts, config, stack) { + var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + var data; + if (stack == 'stack') { + data = dataCombineStack(series, opts.categories.length); + } else { + data = dataCombine(series); + } + var sorted = []; + // remove null from data + data = data.filter(function(item) { + //return item !== null; + if (typeof item === 'object' && item !== null) { + if (item.constructor == Array) { + return item !== null; + } else { + return item.value !== null; + } + } else { + return item !== null; + } + }); + data.map(function(item) { + if (typeof item === 'object') { + if (item.constructor == Array) { + if(opts.type=='candle'){ + item.map(function(subitem) { + sorted.push(subitem); + }) + }else{ + sorted.push(item[1]); + } + } else { + sorted.push(item.value); + } + } else { + sorted.push(item); + } + }) + + var minData = 0; + var maxData = 0; + if (sorted.length > 0) { + minData = Math.min.apply(this, sorted); + maxData = Math.max.apply(this, sorted); + } + //为了兼容v1.9.0之前的项目 + if(index>-1){ + if (typeof opts.yAxis.data[index].min === 'number') { + minData = Math.min(opts.yAxis.data[index].min, minData); + } + if (typeof opts.yAxis.data[index].max === 'number') { + maxData = Math.max(opts.yAxis.data[index].max, maxData); + } + }else{ + if (typeof opts.yAxis.min === 'number') { + minData = Math.min(opts.yAxis.min, minData); + } + if (typeof opts.yAxis.max === 'number') { + maxData = Math.max(opts.yAxis.max, maxData); + } + } + + + if (minData === maxData) { + var rangeSpan = maxData || 10; + maxData += rangeSpan; + } + + var dataRange = getDataRange(minData, maxData); + var minRange = dataRange.minRange; + var maxRange = dataRange.maxRange; + + var range = []; + var eachRange = (maxRange - minRange) / opts.yAxis.splitNumber; + + for (var i = 0; i <= opts.yAxis.splitNumber; i++) { + range.push(minRange + eachRange * i); + } + return range.reverse(); +} + +function calYAxisData(series, opts, config) { + //堆叠图重算Y轴 + var columnstyle = assign({}, { + type: "" + }, opts.extra.column); + //如果是多Y轴,重新计算 + var YLength = opts.yAxis.data.length; + var newSeries=new Array(YLength); + if(YLength>0){ + for(let i=0;i= 2) { + nowAngle = nowAngle % 2; + } + nowNumber += splitNumber; + } + +} + +function drawRadarLabel(angleList, radius, centerPosition, opts, config, context) { + var radarOption = opts.extra.radar || {}; + radius += config.radarLabelTextMargin; + + angleList.forEach(function(angle, index) { + var pos = { + x: radius * Math.cos(angle), + y: radius * Math.sin(angle) + }; + var posRelativeCanvas = convertCoordinateOrigin(pos.x, pos.y, centerPosition); + var startX = posRelativeCanvas.x; + var startY = posRelativeCanvas.y; + if (util.approximatelyEqual(pos.x, 0)) { + startX -= measureText(opts.categories[index] || '') / 2; + } else if (pos.x < 0) { + startX -= measureText(opts.categories[index] || ''); + } + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(radarOption.labelColor || '#666666'); + context.fillText(opts.categories[index] || '', startX, startY + config.fontSize / 2); + context.closePath(); + context.stroke(); + }); + +} + +function drawPieText(series, opts, config, context, radius, center) { + var lineRadius = config.pieChartLinePadding; + var textObjectCollection = []; + var lastTextObject = null; + + var seriesConvert = series.map(function(item) { + var text = item.format ? item.format(+item._proportion_.toFixed(2)) : util.toFixed(item._proportion_.toFixed(4) * 100) +'%'; + if(item._rose_proportion_) item._proportion_=item._rose_proportion_; + var arc = 2 * Math.PI - (item._start_ + 2 * Math.PI * item._proportion_ / 2); + var color = item.color; + var radius = item._radius_; + return { + arc: arc, + text: text, + color: color, + radius: radius, + textColor: item.textColor, + textSize: item.textSize, + }; + }); + for (let i = 0; i < seriesConvert.length; i++) { + let item = seriesConvert[i]; + // line end + let orginX1 = Math.cos(item.arc) * (item.radius + lineRadius); + let orginY1 = Math.sin(item.arc) * (item.radius + lineRadius); + + // line start + let orginX2 = Math.cos(item.arc) * item.radius; + let orginY2 = Math.sin(item.arc) * item.radius; + + // text start + let orginX3 = orginX1 >= 0 ? orginX1 + config.pieChartTextPadding : orginX1 - config.pieChartTextPadding; + let orginY3 = orginY1; + let textWidth = measureText(item.text,item.textSize||config.fontSize); + let startY = orginY3; + + if (lastTextObject && util.isSameXCoordinateArea(lastTextObject.start, { + x: orginX3 + })) { + if (orginX3 > 0) { + startY = Math.min(orginY3, lastTextObject.start.y); + } else if (orginX1 < 0) { + startY = Math.max(orginY3, lastTextObject.start.y); + } else { + if (orginY3 > 0) { + startY = Math.max(orginY3, lastTextObject.start.y); + } else { + startY = Math.min(orginY3, lastTextObject.start.y); + } + } + } + if (orginX3 < 0) { + orginX3 -= textWidth; + } + + let textObject = { + lineStart: { + x: orginX2, + y: orginY2 + }, + lineEnd: { + x: orginX1, + y: orginY1 + }, + start: { + x: orginX3, + y: startY + }, + width: textWidth, + height: config.fontSize, + text: item.text, + color: item.color, + textColor: item.textColor, + textSize: item.textSize + }; + lastTextObject = avoidCollision(textObject, lastTextObject); + textObjectCollection.push(lastTextObject); + } + + for (let i = 0; i < textObjectCollection.length; i++) { + let item = textObjectCollection[i]; + let lineStartPoistion = convertCoordinateOrigin(item.lineStart.x, item.lineStart.y, center); + let lineEndPoistion = convertCoordinateOrigin(item.lineEnd.x, item.lineEnd.y, center); + let textPosition = convertCoordinateOrigin(item.start.x, item.start.y, center); + context.setLineWidth(1 * opts.pixelRatio); + context.setFontSize(config.fontSize); + context.beginPath(); + context.setStrokeStyle(item.color); + context.setFillStyle(item.color); + context.moveTo(lineStartPoistion.x, lineStartPoistion.y); + let curveStartX = item.start.x < 0 ? textPosition.x + item.width : textPosition.x; + let textStartX = item.start.x < 0 ? textPosition.x - 5 : textPosition.x + 5; + context.quadraticCurveTo(lineEndPoistion.x, lineEndPoistion.y, curveStartX, textPosition.y); + context.moveTo(lineStartPoistion.x, lineStartPoistion.y); + context.stroke(); + context.closePath(); + context.beginPath(); + context.moveTo(textPosition.x + item.width, textPosition.y); + context.arc(curveStartX, textPosition.y, 2, 0, 2 * Math.PI); + context.closePath(); + context.fill(); + context.beginPath(); + context.setFontSize(item.textSize || config.fontSize); + context.setFillStyle(item.textColor || '#666666'); + context.fillText(item.text, textStartX, textPosition.y + 3); + context.closePath(); + context.stroke(); + context.closePath(); + } +} + +function drawToolTipSplitLine(offsetX, opts, config, context) { + var toolTipOption = opts.extra.tooltip || {}; + toolTipOption.gridType = toolTipOption.gridType == undefined ? 'solid' : toolTipOption.gridType; + toolTipOption.dashLength = toolTipOption.dashLength == undefined ? 4 : toolTipOption.dashLength; + var startY = opts.area[0]; + var endY = opts.height - opts.area[2]; + + if (toolTipOption.gridType == 'dash') { + context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength]); + } + context.setStrokeStyle(toolTipOption.gridColor || '#cccccc'); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.moveTo(offsetX, startY); + context.lineTo(offsetX, endY); + context.stroke(); + context.setLineDash([]); + + if (toolTipOption.xAxisLabel) { + let labelText = opts.categories[opts.tooltip.index]; + context.setFontSize(config.fontSize); + let textWidth = measureText(labelText, config.fontSize); + + let textX = offsetX - 0.5 * textWidth; + let textY = endY; + context.beginPath(); + context.setFillStyle(hexToRgb(toolTipOption.labelBgColor || config.toolTipBackground, toolTipOption.labelBgOpacity || config.toolTipOpacity)); + context.setStrokeStyle(toolTipOption.labelBgColor || config.toolTipBackground); + context.setLineWidth(1 * opts.pixelRatio); + context.rect(textX - config.toolTipPadding, textY, textWidth + 2 * config.toolTipPadding, config.fontSize + 2 * config.toolTipPadding); + context.closePath(); + context.stroke(); + context.fill(); + + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(toolTipOption.labelFontColor || config.fontColor); + context.fillText(String(labelText), textX, textY + config.toolTipPadding + config.fontSize); + context.closePath(); + context.stroke(); + } +} + +function drawMarkLine(opts, config, context) { + let markLineOption = assign({}, { + type: 'solid', + dashLength: 4, + data: [] + }, opts.extra.markLine); + let startX = opts.area[3]; + let endX = opts.width - opts.area[1]; + let points = calMarkLineData(markLineOption.data, opts); + + for (let i = 0; i < points.length; i++) { + let item = assign({}, { + lineColor: '#DE4A42', + showLabel: false, + labelFontColor: '#666666', + labelBgColor: '#DFE8FF', + labelBgOpacity: 0.8, + yAxisIndex: 0 + }, points[i]); + + if (markLineOption.type == 'dash') { + context.setLineDash([markLineOption.dashLength, markLineOption.dashLength]); + } + context.setStrokeStyle(item.lineColor); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.moveTo(startX, item.y); + context.lineTo(endX, item.y); + context.stroke(); + context.setLineDash([]); + if (item.showLabel) { + let labelText = opts.yAxis.format ? opts.yAxis.format(Number(item.value)) : item.value; + context.setFontSize(config.fontSize); + let textWidth = measureText(labelText, config.fontSize); + let bgStartX = opts.padding[3] + config.yAxisTitleWidth - config.toolTipPadding; + let bgEndX = Math.max(opts.area[3], textWidth + config.toolTipPadding * 2); + let bgWidth = bgEndX - bgStartX; + + let textX = bgStartX + (bgWidth - textWidth) / 2; + let textY = item.y; + context.setFillStyle(hexToRgb(item.labelBgColor, item.labelBgOpacity)); + context.setStrokeStyle(item.labelBgColor); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.rect(bgStartX, textY - 0.5 * config.fontSize - config.toolTipPadding, bgWidth, config.fontSize + 2 * config.toolTipPadding); + context.closePath(); + context.stroke(); + context.fill(); + + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(item.labelFontColor); + context.fillText(String(labelText), textX, textY + 0.5 * config.fontSize); + context.stroke(); + } + } +} + +function drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints) { + var toolTipOption = assign({}, { + gridType: 'solid', + dashLength: 4 + }, opts.extra.tooltip); + + var startX = opts.area[3]; + var endX = opts.width - opts.area[1]; + + if (toolTipOption.gridType == 'dash') { + context.setLineDash([toolTipOption.dashLength, toolTipOption.dashLength]); + } + context.setStrokeStyle(toolTipOption.gridColor || '#cccccc'); + context.setLineWidth(1 * opts.pixelRatio); + context.beginPath(); + context.moveTo(startX, opts.tooltip.offset.y); + context.lineTo(endX, opts.tooltip.offset.y); + context.stroke(); + context.setLineDash([]); + + if (toolTipOption.yAxisLabel) { + let labelText = calTooltipYAxisData(opts.tooltip.offset.y, opts.series, opts, config, eachSpacing); + let widthArr = opts.chartData.yAxisData.yAxisWidth; + let tStartLeft=opts.area[3]; + let tStartRight=opts.width-opts.area[1]; + for(let i=0;i opts.width) { + isOverRightBorder = true; + } + if (toolTipHeight + offset.y > opts.height) { + offset.y = opts.height - toolTipHeight; + } + // draw background rect + context.beginPath(); + context.setFillStyle(hexToRgb(toolTipOption.bgColor || config.toolTipBackground, toolTipOption.bgOpacity || config.toolTipOpacity)); + if (isOverRightBorder) { + context.moveTo(offset.x, offset.y + 10 * opts.pixelRatio); + context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pixelRatio - 5 * opts.pixelRatio); + context.lineTo(offset.x - arrowWidth, offset.y); + context.lineTo(offset.x - arrowWidth - Math.round(toolTipWidth), offset.y); + context.lineTo(offset.x - arrowWidth - Math.round(toolTipWidth), offset.y + toolTipHeight); + context.lineTo(offset.x - arrowWidth, offset.y + toolTipHeight); + context.lineTo(offset.x - arrowWidth, offset.y + 10 * opts.pixelRatio + 5 * opts.pixelRatio); + context.lineTo(offset.x, offset.y + 10 * opts.pixelRatio); + } else { + context.moveTo(offset.x, offset.y + 10 * opts.pixelRatio); + context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pixelRatio - 5 * opts.pixelRatio); + context.lineTo(offset.x + arrowWidth, offset.y); + context.lineTo(offset.x + arrowWidth + Math.round(toolTipWidth), offset.y); + context.lineTo(offset.x + arrowWidth + Math.round(toolTipWidth), offset.y + toolTipHeight); + context.lineTo(offset.x + arrowWidth, offset.y + toolTipHeight); + context.lineTo(offset.x + arrowWidth, offset.y + 10 * opts.pixelRatio + 5 * opts.pixelRatio); + context.lineTo(offset.x, offset.y + 10 * opts.pixelRatio); + } + + context.closePath(); + context.fill(); + + // draw legend + textList.forEach(function(item, index) { + if (item.color !== null) { + context.beginPath(); + context.setFillStyle(item.color); + var startX = offset.x + arrowWidth + 2 * config.toolTipPadding; + var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index + + config.toolTipPadding + 1; + if (isOverRightBorder) { + startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding; + } + context.fillRect(startX, startY, legendWidth, config.fontSize); + context.closePath(); + } + }); + + // draw text list + + textList.forEach(function(item, index) { + var startX = offset.x + arrowWidth + 2 * config.toolTipPadding + legendWidth + legendMarginRight; + if (isOverRightBorder) { + startX = offset.x - toolTipWidth - arrowWidth + 2 * config.toolTipPadding + +legendWidth + legendMarginRight; + } + var startY = offset.y + (config.toolTipLineHeight - config.fontSize) / 2 + config.toolTipLineHeight * index + + config.toolTipPadding; + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(toolTipOption.fontColor); + context.fillText(item.text, startX, startY + config.fontSize); + context.closePath(); + context.stroke(); + }); +} + +function drawYAxisTitle(title, opts, config, context) { + var startX = config.xAxisHeight + (opts.height - config.xAxisHeight - measureText(title)) / 2; + context.save(); + context.beginPath(); + context.setFontSize(config.fontSize); + context.setFillStyle(opts.yAxis.titleFontColor || '#333333'); + context.translate(0, opts.height); + context.rotate(-90 * Math.PI / 180); + context.fillText(title, startX, opts.padding[3] + 0.5 * config.fontSize); + context.closePath(); + context.stroke(); + context.restore(); +} + +function drawColumnDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + let columnOption = assign({}, { + type: 'group', + width: eachSpacing / 2, + meter: { + border: 4, + fillColor: '#FFFFFF' + } + }, opts.extra.column); + + let calPoints = []; + context.save(); + + let leftNum=-2; + let rightNum=xAxisPoints.length+2; + + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2; + rightNum=leftNum+opts.xAxis.itemCount+4; + } + if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) { + drawToolTipSplitArea(opts.tooltip.offset.x, opts, config, context, eachSpacing); + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + switch (columnOption.type) { + case 'group': + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + var tooltipPoints = getStackDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, seriesIndex, series, process); + calPoints.push(tooltipPoints); + points = fixColumeData(points, eachSpacing, series.length, seriesIndex, config, opts); + for(let i=0;ileftNum && ileftNum && i 0) { + height -= height0; + } + context.moveTo(startX, item.y); + context.fillRect(startX, item.y, item.width - 2, height); + context.closePath(); + context.fill(); + } + }; + break; + case 'meter': + // 绘制温度计数据图 + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + points = fixColumeMeterData(points, eachSpacing, series.length, seriesIndex, config, opts, columnOption.meter.border); + if (seriesIndex == 0) { + for(let i=0;ileftNum && i 0) { + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(columnOption.meter.border * opts.pixelRatio); + context.moveTo(startX + columnOption.meter.border * 0.5, item.y + height); + context.lineTo(startX + columnOption.meter.border * 0.5, item.y + columnOption.meter.border * 0.5); + context.lineTo(startX + item.width - columnOption.meter.border * 0.5, item.y + columnOption.meter.border * 0.5); + context.lineTo(startX + item.width - columnOption.meter.border * 0.5, item.y + height); + context.stroke(); + } + } + }; + } else { + for(let i=0;ileftNum && i 5 && arguments[5] !== undefined ? arguments[5] : 1; + var candleOption = assign({}, { + color: {}, + average: {} + }, opts.extra.candle); + candleOption.color = assign({}, { + upLine: '#f04864', + upFill: '#f04864', + downLine: '#2fc25b', + downFill: '#2fc25b' + }, candleOption.color); + candleOption.average = assign({}, { + show: false, + name: [], + day: [], + color: config.colors + }, candleOption.average); + opts.extra.candle = candleOption; + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + + let calPoints = []; + + context.save(); + + let leftNum=-2; + let rightNum=xAxisPoints.length+2; + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2; + rightNum=leftNum+opts.xAxis.itemCount+4; + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + //画均线 + if (candleOption.average.show) { + seriesMA.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + var splitPointList = splitPoints(points); + + for(let i=0;i leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + var ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y); + } + } + context.moveTo(points[0].x, points[0].y); + } + context.closePath(); + context.stroke(); + } + }); + } + //画K线 + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getCandleDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + var splitPointList = splitPoints(points); + + for(let i=0;ileftNum && i 0) { + context.setStrokeStyle(candleOption.color.upLine); + context.setFillStyle(candleOption.color.upFill); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(item[3].x, item[3].y); //顶点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.lineTo(item[1].x - eachSpacing / 4, item[1].y); //收盘左侧点 + context.lineTo(item[0].x - eachSpacing / 4, item[0].y); //开盘左侧点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.lineTo(item[2].x, item[2].y); //底点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.lineTo(item[0].x + eachSpacing / 4, item[0].y); //开盘右侧点 + context.lineTo(item[1].x + eachSpacing / 4, item[1].y); //收盘右侧点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.moveTo(item[3].x, item[3].y); //顶点 + } else { + context.setStrokeStyle(candleOption.color.downLine); + context.setFillStyle(candleOption.color.downFill); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(item[3].x, item[3].y); //顶点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.lineTo(item[0].x - eachSpacing / 4, item[0].y); //开盘左侧点 + context.lineTo(item[1].x - eachSpacing / 4, item[1].y); //收盘左侧点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.lineTo(item[2].x, item[2].y); //底点 + context.lineTo(item[1].x, item[1].y); //收盘中间点 + context.lineTo(item[1].x + eachSpacing / 4, item[1].y); //收盘右侧点 + context.lineTo(item[0].x + eachSpacing / 4, item[0].y); //开盘右侧点 + context.lineTo(item[0].x, item[0].y); //开盘中间点 + context.moveTo(item[3].x, item[3].y); //顶点 + } + context.closePath(); + context.fill(); + context.stroke(); + } + } + }); + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing + }; +} + +function drawAreaDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var areaOption = assign({},{ + type: 'straight', + opacity: 0.2, + addLine: false, + width: 2, + gradient:false + },opts.extra.area); + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + + let endY = opts.height - opts.area[2]; + let calPoints = []; + + context.save(); + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + let data = eachSeries.data; + let points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + + let splitPointList = splitPoints(points); + for (let i = 0; i < splitPointList.length; i++) { + let points = splitPointList[i]; + // 绘制区域数 + context.beginPath(); + context.setStrokeStyle(hexToRgb(eachSeries.color, areaOption.opacity)); + if(areaOption.gradient){ + let gradient = context.createLinearGradient(0, opts.area[0], 0, opts.height-opts.area[2]); + gradient.addColorStop('0', hexToRgb(eachSeries.color, areaOption.opacity)); + gradient.addColorStop('1.0',hexToRgb("#FFFFFF", 0.1)); + context.setFillStyle(gradient); + }else{ + context.setFillStyle(hexToRgb(eachSeries.color, areaOption.opacity)); + } + context.setLineWidth(areaOption.width * opts.pixelRatio); + if (points.length > 1) { + let firstPoint = points[0]; + let lastPoint = points[points.length - 1]; + context.moveTo(firstPoint.x, firstPoint.y); + let startPoint=0; + if (areaOption.type === 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + let ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y); + } + }; + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + + context.lineTo(lastPoint.x, endY); + context.lineTo(firstPoint.x, endY); + context.lineTo(firstPoint.x, firstPoint.y); + } else { + let item = points[0]; + context.moveTo(item.x - eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, endY); + context.lineTo(item.x - eachSpacing / 2, endY); + context.moveTo(item.x - eachSpacing / 2, item.y); + } + context.closePath(); + context.fill(); + + //画连线 + if (areaOption.addLine) { + if (eachSeries.lineType == 'dash') { + let dashLength = eachSeries.dashLength?eachSeries.dashLength:8; + dashLength *= opts.pixelRatio; + context.setLineDash([dashLength, dashLength]); + } + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(areaOption.width * opts.pixelRatio); + if (points.length === 1) { + context.moveTo(points[0].x, points[0].y); + context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI); + } else { + context.moveTo(points[0].x, points[0].y); + let startPoint=0; + if (areaOption.type === 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + let ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x,item.y); + } + }; + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + context.moveTo(points[0].x, points[0].y); + } + context.stroke(); + context.setLineDash([]); + } + } + + //画点 + if (opts.dataPointShape !== false) { + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + + }); + + if (opts.dataLabel !== false && process === 1) { + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + drawPointText(points, eachSeries, config, context); + }); + } + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing + }; +} + +function drawLineDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var lineOption = assign({},{ + type: 'straight', + width: 2 + },opts.extra.line); + lineOption.width *=opts.pixelRatio; + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + var calPoints = []; + + context.save(); + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + var splitPointList = splitPoints(points); + + if (eachSeries.lineType == 'dash') { + let dashLength = eachSeries.dashLength?eachSeries.dashLength:8; + dashLength *= opts.pixelRatio; + context.setLineDash([dashLength, dashLength]); + } + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(lineOption.width); + + splitPointList.forEach(function(points, index) { + + if (points.length === 1) { + context.moveTo(points[0].x, points[0].y); + context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI); + } else { + context.moveTo(points[0].x, points[0].y); + let startPoint=0; + if (lineOption.type === 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + var ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x, item.y); + } + }; + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + context.moveTo(points[0].x, points[0].y); + } + + }); + + context.stroke(); + context.setLineDash([]); + + if (opts.dataPointShape !== false) { + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + }); + + if (opts.dataLabel !== false && process === 1) { + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + drawPointText(points, eachSeries, config, context); + }); + } + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing + }; +} + +function drawMixDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + eachSpacing = xAxisData.eachSpacing; + + let endY = opts.height - opts.area[2]; + let calPoints = []; + + var columnIndex = 0; + var columnLength = 0; + series.forEach(function(eachSeries, seriesIndex) { + if (eachSeries.type == 'column') { + columnLength += 1; + } + }); + context.save(); + let leftNum=-2; + let rightNum=xAxisPoints.length+2; + let leftSpace=0; + let rightSpace=opts.width+eachSpacing; + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + leftNum=Math.floor(-opts._scrollDistance_/eachSpacing)-2; + rightNum=leftNum+opts.xAxis.itemCount+4; + leftSpace=-opts._scrollDistance_-eachSpacing+opts.area[3]; + rightSpace=leftSpace+(opts.xAxis.itemCount+4)*eachSpacing; + } + + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + calPoints.push(points); + + // 绘制柱状数据图 + if (eachSeries.type == 'column') { + points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts); + for(let i=0;ileftNum && i 1) { + var firstPoint = points[0]; + let lastPoint = points[points.length - 1]; + context.moveTo(firstPoint.x, firstPoint.y); + let startPoint=0; + if (eachSeries.style === 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + var ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y, item.x, item.y); + } + }; + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + }; + } + context.lineTo(lastPoint.x, endY); + context.lineTo(firstPoint.x, endY); + context.lineTo(firstPoint.x, firstPoint.y); + } else { + let item = points[0]; + context.moveTo(item.x - eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, item.y); + context.lineTo(item.x + eachSpacing / 2, endY); + context.lineTo(item.x - eachSpacing / 2, endY); + context.moveTo(item.x - eachSpacing / 2, item.y); + } + context.closePath(); + context.fill(); + } + } + + // 绘制折线数据图 + if (eachSeries.type == 'line') { + var splitPointList = splitPoints(points); + splitPointList.forEach(function(points, index) { + if (eachSeries.lineType == 'dash') { + let dashLength = eachSeries.dashLength?eachSeries.dashLength:8; + dashLength *= opts.pixelRatio; + context.setLineDash([dashLength, dashLength]); + } + context.beginPath(); + context.setStrokeStyle(eachSeries.color); + context.setLineWidth(2 * opts.pixelRatio); + if (points.length === 1) { + context.moveTo(points[0].x, points[0].y); + context.arc(points[0].x, points[0].y, 1, 0, 2 * Math.PI); + } else { + context.moveTo(points[0].x, points[0].y); + let startPoint=0; + if (eachSeries.style == 'curve') { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + var ctrlPoint = createCurveControlPoints(points, j - 1); + context.bezierCurveTo(ctrlPoint.ctrA.x, ctrlPoint.ctrA.y, ctrlPoint.ctrB.x, ctrlPoint.ctrB.y,item.x,item.y); + } + } + } else { + for(let j=0;j leftSpace){ + context.moveTo(item.x, item.y); + startPoint=1; + } + if (j > 0 && item.x > leftSpace && item.x < rightSpace) { + context.lineTo(item.x, item.y); + } + } + } + context.moveTo(points[0].x, points[0].y); + } + context.stroke(); + context.setLineDash([]); + }); + } + + // 绘制点数据图 + if (eachSeries.type == 'point') { + eachSeries.addPoint = true; + } + + if (eachSeries.addPoint == true && eachSeries.type !== 'column' ) { + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + }); + if (opts.dataLabel !== false && process === 1) { + var columnIndex = 0; + series.forEach(function(eachSeries, seriesIndex) { + let ranges,minRange,maxRange; + + ranges = [].concat(opts.chartData.yAxisData.ranges[eachSeries.index]); + minRange = ranges.pop(); + maxRange = ranges.shift(); + + var data = eachSeries.data; + var points = getDataPoints(data, minRange, maxRange, xAxisPoints, eachSpacing, opts, config, process); + if (eachSeries.type !== 'column') { + drawPointText(points, eachSeries, config, context); + } else { + points = fixColumeData(points, eachSpacing, columnLength, columnIndex, config, opts); + drawPointText(points, eachSeries, config, context); + columnIndex += 1; + } + + }); + } + + context.restore(); + + return { + xAxisPoints: xAxisPoints, + calPoints: calPoints, + eachSpacing: eachSpacing, + } +} + +function drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints) { + var toolTipOption = opts.extra.tooltip || {}; + if (toolTipOption.horizentalLine && opts.tooltip && process === 1 && (opts.type == 'line' || opts.type == 'area' || opts.type == 'column' || opts.type == 'candle' || opts.type == 'mix')) { + drawToolTipHorizentalLine(opts, config, context, eachSpacing, xAxisPoints) + } + context.save(); + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0 && opts.enableScroll === true) { + context.translate(opts._scrollDistance_, 0); + } + if (opts.tooltip && opts.tooltip.textList && opts.tooltip.textList.length && process === 1) { + drawToolTip(opts.tooltip.textList, opts.tooltip.offset, opts, config, context, eachSpacing, xAxisPoints); + } + context.restore(); + +} + +function drawXAxis(categories, opts, config, context) { + + let xAxisData = opts.chartData.xAxisData, + xAxisPoints = xAxisData.xAxisPoints, + startX = xAxisData.startX, + endX = xAxisData.endX, + eachSpacing = xAxisData.eachSpacing; + var boundaryGap='center'; + if (opts.type == 'line'||opts.type == 'area'){ + boundaryGap=opts.xAxis.boundaryGap; + } + var startY = opts.height - opts.area[2]; + var endY = opts.area[0]; + + //绘制滚动条 + if (opts.enableScroll && opts.xAxis.scrollShow) { + var scrollY = opts.height - opts.area[2] + config.xAxisHeight; + var scrollScreenWidth = endX - startX; + var scrollTotalWidth = eachSpacing * (xAxisPoints.length - 1); + var scrollWidth = scrollScreenWidth * scrollScreenWidth / scrollTotalWidth; + var scrollLeft = 0; + if (opts._scrollDistance_) { + scrollLeft = -opts._scrollDistance_ * (scrollScreenWidth) / scrollTotalWidth; + } + context.beginPath(); + context.setLineCap('round'); + context.setLineWidth(6 * opts.pixelRatio); + context.setStrokeStyle(opts.xAxis.scrollBackgroundColor || "#EFEBEF"); + context.moveTo(startX, scrollY); + context.lineTo(endX, scrollY); + context.stroke(); + context.closePath(); + context.beginPath(); + context.setLineCap('round'); + context.setLineWidth(6 * opts.pixelRatio); + context.setStrokeStyle(opts.xAxis.scrollColor || "#A6A6A6"); + context.moveTo(startX + scrollLeft, scrollY); + context.lineTo(startX + scrollLeft + scrollWidth, scrollY); + context.stroke(); + context.closePath(); + context.setLineCap('butt'); + } + + context.save(); + + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) { + context.translate(opts._scrollDistance_, 0); + } + + //绘制X轴刻度线 + if (opts.xAxis.calibration === true) { + context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc"); + context.setLineCap('butt'); + context.setLineWidth(1 * opts.pixelRatio); + xAxisPoints.forEach(function(item, index) { + if (index > 0) { + context.beginPath(); + context.moveTo(item - eachSpacing / 2, startY); + context.lineTo(item - eachSpacing / 2, startY + 3 * opts.pixelRatio); + context.closePath(); + context.stroke(); + } + }); + } + //绘制X轴网格 + if (opts.xAxis.disableGrid !== true) { + context.setStrokeStyle(opts.xAxis.gridColor || "#cccccc"); + context.setLineCap('butt'); + context.setLineWidth(1 * opts.pixelRatio); + if (opts.xAxis.gridType == 'dash') { + context.setLineDash([opts.xAxis.dashLength, opts.xAxis.dashLength]); + } + opts.xAxis.gridEval = opts.xAxis.gridEval || 1; + xAxisPoints.forEach(function(item, index) { + if (index % opts.xAxis.gridEval == 0) { + context.beginPath(); + context.moveTo(item, startY); + context.lineTo(item, endY); + context.stroke(); + } + }); + context.setLineDash([]); + } + + + //绘制X轴文案 + if (opts.xAxis.disabled !== true) { + // 对X轴列表做抽稀处理 + //默认全部显示X轴标签 + let maxXAxisListLength = categories.length; + //如果设置了X轴单屏数量 + if (opts.xAxis.labelCount) { + //如果设置X轴密度 + if (opts.xAxis.itemCount) { + maxXAxisListLength = Math.ceil(categories.length / opts.xAxis.itemCount * opts.xAxis.labelCount); + } else { + maxXAxisListLength = opts.xAxis.labelCount; + } + maxXAxisListLength -= 1; + } + + let ratio = Math.ceil(categories.length / maxXAxisListLength); + + let newCategories = []; + let cgLength = categories.length; + for (let i = 0; i < cgLength; i++) { + if (i % ratio !== 0) { + newCategories.push(""); + } else { + newCategories.push(categories[i]); + } + } + newCategories[cgLength - 1] = categories[cgLength - 1]; + + var xAxisFontSize = opts.xAxis.fontSize || config.fontSize; + if (config._xAxisTextAngle_ === 0) { + newCategories.forEach(function(item, index) { + var offset = - measureText(String(item), xAxisFontSize) / 2; + if(boundaryGap == 'center'){ + offset+=eachSpacing / 2; + } + var scrollHeight=0; + if(opts.xAxis.scrollShow){ + scrollHeight=6*opts.pixelRatio; + } + context.beginPath(); + context.setFontSize(xAxisFontSize); + context.setFillStyle(opts.xAxis.fontColor || '#666666'); + context.fillText(String(item), xAxisPoints[index] + offset, startY + xAxisFontSize + (config.xAxisHeight - scrollHeight - xAxisFontSize) / 2); + context.closePath(); + context.stroke(); + }); + + } else { + newCategories.forEach(function(item, index) { + context.save(); + context.beginPath(); + context.setFontSize(xAxisFontSize); + context.setFillStyle(opts.xAxis.fontColor || '#666666'); + var textWidth = measureText(String(item),xAxisFontSize); + var offset = - textWidth; + if(boundaryGap == 'center'){ + offset+=eachSpacing / 2; + } + var _calRotateTranslate = calRotateTranslate(xAxisPoints[index] + eachSpacing / 2, startY + xAxisFontSize / 2 + 5, opts.height), + transX = _calRotateTranslate.transX, + transY = _calRotateTranslate.transY; + + context.rotate(-1 * config._xAxisTextAngle_); + context.translate(transX, transY); + context.fillText(String(item), xAxisPoints[index] + offset, startY + xAxisFontSize + 5); + context.closePath(); + context.stroke(); + context.restore(); + }); + } + } + context.restore(); + + //绘制X轴轴线 + if(opts.xAxis.axisLine){ + context.beginPath(); + context.setStrokeStyle(opts.xAxis.axisLineColor); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(startX,opts.height-opts.area[2]); + context.lineTo(endX,opts.height-opts.area[2]); + context.stroke(); + } +} + +function drawYAxisGrid(categories, opts, config, context) { + if (opts.yAxis.disableGrid === true) { + return; + } + let spacingValid = opts.height - opts.area[0] - opts.area[2]; + let eachSpacing = spacingValid / opts.yAxis.splitNumber; + let startX = opts.area[3]; + let xAxisPoints = opts.chartData.xAxisData.xAxisPoints, + xAxiseachSpacing = opts.chartData.xAxisData.eachSpacing; + let TotalWidth = xAxiseachSpacing * (xAxisPoints.length - 1); + let endX = startX + TotalWidth; + + let points = []; + for (let i = 0; i < opts.yAxis.splitNumber + 1; i++) { + points.push(opts.height - opts.area[2] - eachSpacing * i); + } + + context.save(); + if (opts._scrollDistance_ && opts._scrollDistance_ !== 0) { + context.translate(opts._scrollDistance_, 0); + } + + if (opts.yAxis.gridType == 'dash') { + context.setLineDash([opts.yAxis.dashLength, opts.yAxis.dashLength]); + } + context.setStrokeStyle(opts.yAxis.gridColor); + context.setLineWidth(1 * opts.pixelRatio); + points.forEach(function(item, index) { + context.beginPath(); + context.moveTo(startX, item); + context.lineTo(endX, item); + context.stroke(); + }); + context.setLineDash([]); + + context.restore(); +} + +function drawYAxis(series, opts, config, context) { + if (opts.yAxis.disabled === true) { + return; + } + var spacingValid = opts.height - opts.area[0] - opts.area[2]; + var eachSpacing = spacingValid / opts.yAxis.splitNumber; + var startX = opts.area[3]; + var endX = opts.width - opts.area[1]; + var endY = opts.height - opts.area[2]; + var fillEndY = endY + config.xAxisHeight; + if (opts.xAxis.scrollShow) { + fillEndY -= 3 * opts.pixelRatio; + } + if (opts.xAxis.rotateLabel){ + fillEndY = opts.height - opts.area[2]+3; + } + // set YAxis background + context.beginPath(); + context.setFillStyle(opts.background || '#ffffff'); + if (opts._scrollDistance_ < 0) { + context.fillRect(0, 0, startX, fillEndY); + } + if(opts.enableScroll == true){ + context.fillRect(endX, 0, opts.width, fillEndY); + } + context.closePath(); + context.stroke(); + + var points = []; + for (let i = 0; i <= opts.yAxis.splitNumber; i++) { + points.push(opts.area[0] + eachSpacing * i); + } + + let tStartLeft=opts.area[3]; + let tStartRight=opts.width-opts.area[1]; + + for (let i = 0; i < opts.yAxis.data.length; i++) { + let yData = opts.yAxis.data[i]; + if(yData.disabled !== true){ + let rangesFormat = opts.chartData.yAxisData.rangesFormat[i]; + let yAxisFontSize = yData.fontSize || config.fontSize; + let yAxisWidth = opts.chartData.yAxisData.yAxisWidth[i]; + //画Y轴刻度及文案 + rangesFormat.forEach(function(item, index) { + var pos = points[index] ? points[index] : endY; + context.beginPath(); + context.setFontSize(yAxisFontSize); + context.setLineWidth(1*opts.pixelRatio); + context.setStrokeStyle(yData.axisLineColor||'#cccccc'); + context.setFillStyle(yData.fontColor|| '#666666'); + if(yAxisWidth.position=='left'){ + context.fillText(String(item), tStartLeft - yAxisWidth.width , pos + yAxisFontSize / 2); + //画刻度线 + if(yData.calibration==true){ + context.moveTo(tStartLeft,pos); + context.lineTo(tStartLeft - 3*opts.pixelRatio,pos); + } + }else{ + context.fillText(String(item), tStartRight + 4*opts.pixelRatio, pos + yAxisFontSize / 2); + //画刻度线 + if(yData.calibration==true){ + context.moveTo(tStartRight,pos); + context.lineTo(tStartRight + 3*opts.pixelRatio,pos); + } + } + context.closePath(); + context.stroke(); + }); + //画Y轴轴线 + if (yData.axisLine!==false) { + context.beginPath(); + context.setStrokeStyle(yData.axisLineColor||'#cccccc'); + context.setLineWidth(1 * opts.pixelRatio); + if(yAxisWidth.position=='left'){ + context.moveTo(tStartLeft,opts.height-opts.area[2]); + context.lineTo(tStartLeft,opts.area[0]); + }else{ + context.moveTo(tStartRight,opts.height-opts.area[2]); + context.lineTo(tStartRight,opts.area[0]); + } + context.stroke(); + } + + //画Y轴标题 + if (opts.yAxis.showTitle) { + + let titleFontSize = yData.titleFontSize || config.fontSize; + let title = yData.title; + context.beginPath(); + context.setFontSize(titleFontSize); + context.setFillStyle(yData.titleFontColor || '#666666'); + if(yAxisWidth.position=='left'){ + context.fillText(title, tStartLeft - measureText(title,titleFontSize)/2, opts.area[0]-10*opts.pixelRatio); + }else{ + context.fillText(title,tStartRight - measureText(title,titleFontSize)/2, opts.area[0]-10*opts.pixelRatio); + } + context.closePath(); + context.stroke(); + } + if(yAxisWidth.position=='left'){ + tStartLeft -=(yAxisWidth.width + opts.yAxis.padding); + }else{ + tStartRight +=yAxisWidth.width+ opts.yAxis.padding; + } + } + } +} + +function drawLegend(series, opts, config, context, chartData) { + if (opts.legend.show === false) { + return; + } + let legendData = chartData.legendData; + let legendList = legendData.points; + let legendArea = legendData.area; + let padding = opts.legend.padding; + let fontSize = opts.legend.fontSize; + let shapeWidth = 15 * opts.pixelRatio; + let shapeRight = 5 * opts.pixelRatio; + let itemGap = opts.legend.itemGap; + let lineHeight = Math.max(opts.legend.lineHeight * opts.pixelRatio, fontSize); + + //画背景及边框 + context.beginPath(); + context.setLineWidth(opts.legend.borderWidth); + context.setStrokeStyle(opts.legend.borderColor); + context.setFillStyle(opts.legend.backgroundColor); + context.moveTo(legendArea.start.x, legendArea.start.y); + context.rect(legendArea.start.x, legendArea.start.y, legendArea.width, legendArea.height); + context.closePath(); + context.fill(); + context.stroke(); + + legendList.forEach(function(itemList, listIndex) { + let width = 0; + let height = 0; + width = legendData.widthArr[listIndex]; + height = legendData.heightArr[listIndex]; + let startX = 0; + let startY = 0; + if (opts.legend.position == 'top' || opts.legend.position == 'bottom') { + startX = legendArea.start.x + (legendArea.width - width) / 2; + startY = legendArea.start.y + padding + listIndex * lineHeight; + } else { + if (listIndex == 0) { + width = 0; + } else { + width = legendData.widthArr[listIndex - 1]; + } + startX = legendArea.start.x + padding + width; + startY = legendArea.start.y + padding + (legendArea.height - height) / 2; + } + + context.setFontSize(config.fontSize); + for (let i = 0; i < itemList.length; i++) { + let item = itemList[i]; + item.area = [0, 0, 0, 0]; + item.area[0] = startX; + item.area[1] = startY; + item.area[3] = startY + lineHeight; + context.beginPath(); + context.setLineWidth(1 * opts.pixelRatio); + context.setStrokeStyle(item.show ? item.color : opts.legend.hiddenColor); + context.setFillStyle(item.show ? item.color : opts.legend.hiddenColor); + switch (item.legendShape) { + case 'line': + context.moveTo(startX, startY + 0.5 * lineHeight - 2 * opts.pixelRatio); + context.fillRect(startX, startY + 0.5 * lineHeight - 2 * opts.pixelRatio, 15 * opts.pixelRatio, 4 * opts.pixelRatio); + break; + case 'triangle': + context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.lineTo(startX + 2.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio); + context.lineTo(startX + 12.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio); + context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + break; + case 'diamond': + context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.lineTo(startX + 2.5 * opts.pixelRatio, startY + 0.5 * lineHeight); + context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight + 5 * opts.pixelRatio); + context.lineTo(startX + 12.5 * opts.pixelRatio, startY + 0.5 * lineHeight); + context.lineTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + break; + case 'circle': + context.moveTo(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight); + context.arc(startX + 7.5 * opts.pixelRatio, startY + 0.5 * lineHeight, 5 * opts.pixelRatio, 0, 2 * Math.PI); + break; + case 'rect': + context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio, 15 * opts.pixelRatio, 10 * opts.pixelRatio); + break; + default: + context.moveTo(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio); + context.fillRect(startX, startY + 0.5 * lineHeight - 5 * opts.pixelRatio, 15 * opts.pixelRatio, 10 * opts.pixelRatio); + } + context.closePath(); + context.fill(); + context.stroke(); + + startX += shapeWidth + shapeRight; + let fontTrans = 0.5 * lineHeight + 0.5 * fontSize - 2; + context.beginPath(); + context.setFontSize(fontSize); + context.setFillStyle(item.show ? opts.legend.fontColor : opts.legend.hiddenColor); + context.fillText(item.name, startX, startY + fontTrans); + context.closePath(); + context.stroke(); + if (opts.legend.position == 'top' || opts.legend.position == 'bottom') { + startX += measureText(item.name, fontSize) + itemGap; + item.area[2] = startX; + } else { + item.area[2] = startX + measureText(item.name, fontSize) + itemGap;; + startX -= shapeWidth + shapeRight; + startY += lineHeight; + } + } + }); +} + +function drawPieDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var pieOption = assign({}, { + activeOpacity: 0.5, + activeRadius: 10 * opts.pixelRatio, + offsetAngle: 0, + labelWidth: 15 * opts.pixelRatio, + ringWidth: 0, + border:false, + borderWidth:2, + borderColor:'#FFFFFF' + }, opts.extra.pie); + var centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2 + }; + if (config.pieChartLinePadding == 0) { + config.pieChartLinePadding = pieOption.activeRadius; + } + + var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding); + + series = getPieDataPoints(series, radius, process); + + var activeRadius = pieOption.activeRadius; + + series = series.map(function(eachSeries) { + eachSeries._start_ += (pieOption.offsetAngle) * Math.PI / 180; + return eachSeries; + }); + series.forEach(function(eachSeries, seriesIndex) { + if (opts.tooltip) { + if (opts.tooltip.index == seriesIndex) { + context.beginPath(); + context.setFillStyle(hexToRgb(eachSeries.color, opts.extra.pie.activeOpacity || 0.5)); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_ + activeRadius, eachSeries._start_, + eachSeries._start_ + 2 * + eachSeries._proportion_ * Math.PI); + context.closePath(); + context.fill(); + } + } + context.beginPath(); + context.setLineWidth(pieOption.borderWidth * opts.pixelRatio); + context.lineJoin = "round"; + context.setStrokeStyle(pieOption.borderColor); + context.setFillStyle(eachSeries.color); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_, eachSeries._start_, eachSeries._start_ + 2 * eachSeries._proportion_ * Math.PI); + context.closePath(); + context.fill(); + if (pieOption.border == true) { + context.stroke(); + } + }); + + if (opts.type === 'ring') { + var innerPieWidth = radius * 0.6; + if (typeof opts.extra.pie.ringWidth === 'number' && opts.extra.pie.ringWidth > 0) { + innerPieWidth = Math.max(0, radius - opts.extra.pie.ringWidth); + } + context.beginPath(); + context.setFillStyle(opts.background || '#ffffff'); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, innerPieWidth, 0, 2 * Math.PI); + context.closePath(); + context.fill(); + } + + if (opts.dataLabel !== false && process === 1) { + var valid = false; + for (var i = 0, len = series.length; i < len; i++) { + if (series[i].data > 0) { + valid = true; + break; + } + } + + if (valid) { + drawPieText(series, opts, config, context, radius, centerPosition); + } + } + + if (process === 1 && opts.type === 'ring') { + drawRingTitle(opts, config, context, centerPosition); + } + + return { + center: centerPosition, + radius: radius, + series: series + }; +} + +function drawRoseDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var roseOption = assign({}, { + type: 'area', + activeOpacity: 0.5, + activeRadius: 10 * opts.pixelRatio, + offsetAngle: 0, + labelWidth: 15 * opts.pixelRatio, + border:false, + borderWidth:2, + borderColor:'#FFFFFF' + }, opts.extra.rose); + if (config.pieChartLinePadding == 0) { + config.pieChartLinePadding = roseOption.activeRadius; + } + var centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2 + }; + var radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding - config._pieTextMaxLength_, (opts.height - opts.area[0] - opts.area[2]) / 2 - config.pieChartLinePadding - config.pieChartTextPadding); + var minRadius = roseOption.minRadius || radius * 0.5; + + series = getRoseDataPoints(series, roseOption.type, minRadius, radius, process); + + var activeRadius = roseOption.activeRadius; + + series = series.map(function(eachSeries) { + eachSeries._start_ += (roseOption.offsetAngle || 0) * Math.PI / 180; + return eachSeries; + }); + + series.forEach(function(eachSeries, seriesIndex) { + if (opts.tooltip) { + if (opts.tooltip.index == seriesIndex) { + context.beginPath(); + context.setFillStyle(hexToRgb(eachSeries.color, roseOption.activeOpacity || 0.5)); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, activeRadius + eachSeries._radius_, eachSeries._start_, + eachSeries._start_ + 2 * eachSeries._rose_proportion_ * Math.PI); + context.closePath(); + context.fill(); + } + } + context.beginPath(); + context.setLineWidth(roseOption.borderWidth * opts.pixelRatio); + context.lineJoin = "round"; + context.setStrokeStyle(roseOption.borderColor); + context.setFillStyle(eachSeries.color); + context.moveTo(centerPosition.x, centerPosition.y); + context.arc(centerPosition.x, centerPosition.y, eachSeries._radius_, eachSeries._start_, eachSeries._start_ + 2 * + eachSeries._rose_proportion_ * Math.PI); + context.closePath(); + context.fill(); + if (roseOption.border == true) { + context.stroke(); + } + }); + + if (opts.dataLabel !== false && process === 1) { + var valid = false; + for (var i = 0, len = series.length; i < len; i++) { + if (series[i].data > 0) { + valid = true; + break; + } + } + + if (valid) { + drawPieText(series, opts, config, context, radius, centerPosition); + } + } + + return { + center: centerPosition, + radius: radius, + series: series + }; +} + +function drawArcbarDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var arcbarOption = assign({}, { + startAngle: 0.75, + endAngle: 0.25, + type: 'default', + width: 12 * opts.pixelRatio, + gap:2 * opts.pixelRatio + }, opts.extra.arcbar); + + series = getArcbarDataPoints(series, arcbarOption, process); + + var centerPosition; + if(arcbarOption.center){ + centerPosition=arcbarOption.center; + }else{ + centerPosition= { + x: opts.width / 2, + y: opts.height / 2 + }; + } + + var radius; + if(arcbarOption.radius){ + radius=arcbarOption.radius; + }else{ + radius = Math.min(centerPosition.x, centerPosition.y); + radius -= 5 * opts.pixelRatio; + radius -= arcbarOption.width / 2; + } + + for (let i = 0; i < series.length; i++) { + let eachSeries = series[i]; + //背景颜色 + context.setLineWidth(arcbarOption.width); + context.setStrokeStyle(arcbarOption.backgroundColor || '#E9E9E9'); + context.setLineCap('round'); + context.beginPath(); + if (arcbarOption.type == 'default') { + context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, arcbarOption.startAngle * Math.PI, arcbarOption.endAngle * Math.PI, false); + } else { + context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, 0, 2 * Math.PI, false); + } + context.stroke(); + //进度条 + context.setLineWidth(arcbarOption.width); + context.setStrokeStyle(eachSeries.color); + context.setLineCap('round'); + context.beginPath(); + context.arc(centerPosition.x, centerPosition.y, radius-(arcbarOption.width+arcbarOption.gap)*i, arcbarOption.startAngle * Math.PI, eachSeries._proportion_ * Math.PI, false); + context.stroke(); + } + + drawRingTitle(opts, config, context, centerPosition); + + return { + center: centerPosition, + radius: radius, + series: series + }; +} + +function drawGaugeDataPoints(categories, series, opts, config, context) { + var process = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1; + var gaugeOption = assign({}, { + type:'default', + startAngle: 0.75, + endAngle: 0.25, + width: 15, + splitLine: { + fixRadius: 0, + splitNumber: 10, + width: 15, + color: '#FFFFFF', + childNumber: 5, + childWidth: 5 + }, + pointer: { + width: 15, + color: 'auto' + } + }, opts.extra.gauge); + + if (gaugeOption.oldAngle == undefined) { + gaugeOption.oldAngle = gaugeOption.startAngle; + } + if (gaugeOption.oldData == undefined) { + gaugeOption.oldData = 0; + } + categories = getGaugeAxisPoints(categories, gaugeOption.startAngle, gaugeOption.endAngle); + + var centerPosition = { + x: opts.width / 2, + y: opts.height / 2 + }; + var radius = Math.min(centerPosition.x, centerPosition.y); + radius -= 5 * opts.pixelRatio; + radius -= gaugeOption.width / 2; + var innerRadius = radius - gaugeOption.width; + var totalAngle=0; + + //判断仪表盘的样式:default百度样式,progress新样式 + if(gaugeOption.type == 'progress'){ + + //## 第一步画中心圆形背景和进度条背景 + //中心圆形背景 + var pieRadius = radius - gaugeOption.width*3; + context.beginPath(); + let gradient = context.createLinearGradient(centerPosition.x, centerPosition.y-pieRadius, centerPosition.x , centerPosition.y+pieRadius); + //配置渐变填充(起点:中心点向上减半径;结束点中心点向下加半径) + gradient.addColorStop('0', hexToRgb(series[0].color, 0.3)); + gradient.addColorStop('1.0',hexToRgb("#FFFFFF", 0.1)); + context.setFillStyle(gradient); + context.arc(centerPosition.x, centerPosition.y, pieRadius, 0, 2*Math.PI, false); + context.fill(); + //画进度条背景 + context.setLineWidth(gaugeOption.width); + context.setStrokeStyle(hexToRgb(series[0].color, 0.3)); + context.setLineCap('round'); + context.beginPath(); + context.arc(centerPosition.x, centerPosition.y, innerRadius , gaugeOption.startAngle * Math.PI, gaugeOption.endAngle *Math.PI, false); + context.stroke(); + + //## 第二步画刻度线 + totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1; + let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber; + let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber; + let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius; + let endX = -radius - gaugeOption.width - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width; + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((gaugeOption.startAngle - 1) * Math.PI); + let len = gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1; + let proc = series[0].data * process; + for (let i = 0; i < len; i++) { + context.beginPath(); + //刻度线随进度变色 + if(proc>(i/len)){ + context.setStrokeStyle(hexToRgb(series[0].color, 1)); + }else{ + context.setStrokeStyle(hexToRgb(series[0].color, 0.3)); + } + context.setLineWidth(3 * opts.pixelRatio); + context.moveTo(startX, 0); + context.lineTo(endX, 0); + context.stroke(); + context.rotate(childAngle * Math.PI); + } + context.restore(); + + //## 第三步画进度条 + series = getArcbarDataPoints(series, gaugeOption, process); + context.setLineWidth(gaugeOption.width); + context.setStrokeStyle(series[0].color); + context.setLineCap('round'); + context.beginPath(); + context.arc(centerPosition.x, centerPosition.y, innerRadius , gaugeOption.startAngle * Math.PI, series[0]._proportion_ *Math.PI, false); + context.stroke(); + + //## 第四步画指针 + let pointerRadius = radius - gaugeOption.width*2.5; + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((series[0]._proportion_ - 1) * Math.PI); + context.beginPath(); + context.setLineWidth(gaugeOption.width/3); + let gradient3 = context.createLinearGradient(0, -pointerRadius*0.6, 0 , pointerRadius*0.6); + gradient3.addColorStop('0', hexToRgb('#FFFFFF', 0)); + gradient3.addColorStop('0.5', hexToRgb(series[0].color, 1)); + gradient3.addColorStop('1.0', hexToRgb('#FFFFFF', 0)); + context.setStrokeStyle(gradient3); + context.arc(0, 0, pointerRadius , 0.85* Math.PI, 1.15 * Math.PI, false); + context.stroke(); + context.beginPath(); + context.setLineWidth(1); + context.setStrokeStyle(series[0].color); + context.setFillStyle(series[0].color); + context.moveTo(-pointerRadius-gaugeOption.width/3/2,-4); + context.lineTo(-pointerRadius-gaugeOption.width/3/2-4,0); + context.lineTo(-pointerRadius-gaugeOption.width/3/2,4); + context.lineTo(-pointerRadius-gaugeOption.width/3/2,-4); + context.stroke(); + context.fill(); + context.restore(); + + //default百度样式 + }else{ + //画背景 + context.setLineWidth(gaugeOption.width); + context.setLineCap('butt'); + for (let i = 0; i < categories.length; i++) { + let eachCategories = categories[i]; + context.beginPath(); + context.setStrokeStyle(eachCategories.color); + context.arc(centerPosition.x, centerPosition.y, radius, eachCategories._startAngle_ * Math.PI, eachCategories._endAngle_ *Math.PI, false); + context.stroke(); + } + context.save(); + + //画刻度线 + totalAngle = gaugeOption.startAngle - gaugeOption.endAngle + 1; + let splitAngle = totalAngle / gaugeOption.splitLine.splitNumber; + let childAngle = totalAngle / gaugeOption.splitLine.splitNumber / gaugeOption.splitLine.childNumber; + let startX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius; + let endX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.width; + let childendX = -radius - gaugeOption.width * 0.5 - gaugeOption.splitLine.fixRadius + gaugeOption.splitLine.childWidth; + + context.translate(centerPosition.x, centerPosition.y); + context.rotate((gaugeOption.startAngle - 1) * Math.PI); + + for (let i = 0; i < gaugeOption.splitLine.splitNumber + 1; i++) { + context.beginPath(); + context.setStrokeStyle(gaugeOption.splitLine.color); + context.setLineWidth(2 * opts.pixelRatio); + context.moveTo(startX, 0); + context.lineTo(endX, 0); + context.stroke(); + context.rotate(splitAngle * Math.PI); + } + context.restore(); + + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((gaugeOption.startAngle - 1) * Math.PI); + + for (let i = 0; i < gaugeOption.splitLine.splitNumber * gaugeOption.splitLine.childNumber + 1; i++) { + context.beginPath(); + context.setStrokeStyle(gaugeOption.splitLine.color); + context.setLineWidth(1 * opts.pixelRatio); + context.moveTo(startX, 0); + context.lineTo(childendX, 0); + context.stroke(); + context.rotate(childAngle * Math.PI); + } + context.restore(); + + //画指针 + series = getGaugeDataPoints(series, categories, gaugeOption, process); + + for (let i = 0; i < series.length; i++) { + let eachSeries = series[i]; + context.save(); + context.translate(centerPosition.x, centerPosition.y); + context.rotate((eachSeries._proportion_ - 1) * Math.PI); + context.beginPath(); + context.setFillStyle(eachSeries.color); + context.moveTo(gaugeOption.pointer.width, 0); + context.lineTo(0, -gaugeOption.pointer.width / 2); + context.lineTo(-innerRadius, 0); + context.lineTo(0, gaugeOption.pointer.width / 2); + context.lineTo(gaugeOption.pointer.width, 0); + context.closePath(); + context.fill(); + context.beginPath(); + context.setFillStyle('#FFFFFF'); + context.arc(0, 0, gaugeOption.pointer.width / 6, 0, 2 * Math.PI, false); + context.fill(); + context.restore(); + } + + if (opts.dataLabel !== false) { + drawGaugeLabel(gaugeOption, radius, centerPosition, opts, config, context); + } + } + + //画仪表盘标题,副标题 + drawRingTitle(opts, config, context, centerPosition); + + if (process === 1 && opts.type === 'gauge') { + opts.extra.gauge.oldAngle = series[0]._proportion_; + opts.extra.gauge.oldData = series[0].data; + } + return { + center: centerPosition, + radius: radius, + innerRadius: innerRadius, + categories: categories, + totalAngle: totalAngle + }; +} + +function drawRadarDataPoints(series, opts, config, context) { + var process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var radarOption = assign({},{ + gridColor: '#cccccc', + labelColor: '#666666', + opacity: 0.2, + gridCount:3 + },opts.extra.radar); + + var coordinateAngle = getRadarCoordinateSeries(opts.categories.length); + + var centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.area[0] + (opts.height - opts.area[0] - opts.area[2]) / 2 + }; + + var radius = Math.min(centerPosition.x - (getMaxTextListLength(opts.categories) + config.radarLabelTextMargin), + centerPosition.y - config.radarLabelTextMargin); + //TODO逻辑不对 + radius -= opts.padding[1]; + + // draw grid + context.beginPath(); + context.setLineWidth(1 * opts.pixelRatio); + context.setStrokeStyle(radarOption.gridColor); + coordinateAngle.forEach(function(angle) { + var pos = convertCoordinateOrigin(radius * Math.cos(angle), radius * Math.sin(angle), centerPosition); + context.moveTo(centerPosition.x, centerPosition.y); + context.lineTo(pos.x, pos.y); + }); + context.stroke(); + context.closePath(); + // draw split line grid + + var _loop = function _loop(i) { + var startPos = {}; + context.beginPath(); + context.setLineWidth(1 * opts.pixelRatio); + context.setStrokeStyle(radarOption.gridColor); + coordinateAngle.forEach(function(angle, index) { + var pos = convertCoordinateOrigin(radius / radarOption.gridCount * i * Math.cos(angle), radius / radarOption.gridCount * i * Math.sin(angle), centerPosition); + if (index === 0) { + startPos = pos; + context.moveTo(pos.x, pos.y); + } else { + context.lineTo(pos.x, pos.y); + } + }); + context.lineTo(startPos.x, startPos.y); + context.stroke(); + context.closePath(); + }; + + for (var i = 1; i <= radarOption.gridCount; i++) { + _loop(i); + } + + var radarDataPoints = getRadarDataPoints(coordinateAngle, centerPosition, radius, series, opts, process); + + radarDataPoints.forEach(function(eachSeries, seriesIndex) { + // 绘制区域数据 + context.beginPath(); + context.setFillStyle(hexToRgb(eachSeries.color, radarOption.opacity)); + eachSeries.data.forEach(function(item, index) { + if (index === 0) { + context.moveTo(item.position.x, item.position.y); + } else { + context.lineTo(item.position.x, item.position.y); + } + }); + context.closePath(); + context.fill(); + + if (opts.dataPointShape !== false) { + var points = eachSeries.data.map(function(item) { + return item.position; + }); + drawPointShape(points, eachSeries.color, eachSeries.pointShape, context, opts); + } + }); + // draw label text + drawRadarLabel(coordinateAngle, radius, centerPosition, opts, config, context); + + return { + center: centerPosition, + radius: radius, + angleList: coordinateAngle + }; +} + +function normalInt(min, max, iter) { + iter = iter==0?1:iter; + var arr = []; + for (var i = 0; i < iter; i++) { + arr[i] = Math.random(); + }; + return Math.floor(arr.reduce(function(i,j){return i+j})/iter*(max-min))+min; +}; + +function collisionNew(area,points,width,height){ + var isIn=false; + for(let i=0;ipoints[i].area[2]||area[1]>points[i].area[3]||area[2]width || area[3]>height){ + isIn=true; + break; + }else{ + isIn=false; + } + }else{ + isIn=true; + break; + } + } + } + return isIn; +}; + +function getBoundingBox(data) { + var bounds = {}, coords; + bounds.xMin = 180; + bounds.xMax = 0; + bounds.yMin = 90; + bounds.yMax = 0 + for (var i = 0; i < data.length; i++) { + var coorda = data[i].geometry.coordinates + for (var k = 0; k < coorda.length; k++) { + coords = coorda[k]; + if (coords.length == 1) { + coords = coords[0] + } + for (var j = 0; j < coords.length; j++) { + var longitude = coords[j][0]; + var latitude = coords[j][1]; + var point = { + x: longitude, + y: latitude + } + bounds.xMin = bounds.xMin < point.x ? bounds.xMin : point.x; + bounds.xMax = bounds.xMax > point.x ? bounds.xMax : point.x; + bounds.yMin = bounds.yMin < point.y ? bounds.yMin : point.y; + bounds.yMax = bounds.yMax > point.y ? bounds.yMax : point.y; + } + } + } + return bounds; +} + +function coordinateToPoint(latitude, longitude,bounds,scale,xoffset,yoffset) { + return { + x: (longitude - bounds.xMin) * scale+xoffset, + y: (bounds.yMax - latitude) * scale+yoffset + }; +} + +function pointToCoordinate(pointY, pointX,bounds,scale,xoffset,yoffset) { + return { + x: (pointX-xoffset)/scale+bounds.xMin, + y: bounds.yMax - (pointY-yoffset)/scale + }; +} + +function isRayIntersectsSegment(poi,s_poi,e_poi){ + if (s_poi[1]==e_poi[1]){return false;} + if (s_poi[1]>poi[1] && e_poi[1]>poi[1]){return false;} + if (s_poi[1]poi[1]){return false;} + if (e_poi[1]==poi[1] && s_poi[1]>poi[1]){return false;} + if (s_poi[0]0.7) { + return true; + }else {return false}; + }; + for (let i = 0; i < points.length; i++) { + let text = points[i].name; + let tHeight = points[i].textSize; + let tWidth = measureText(text,tHeight); + let isSpin = Spin(); + let x,y,area,areav; + let breaknum=0; + while(true) { + breaknum++; + let isCollision; + if (isSpin) { + x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2; + y = normalInt(-opts.height/2, opts.height/2,5)+tHeight/2; + area=[y-5-tWidth+opts.width/2,(-x-5+opts.height/2),y+5+opts.width/2,(-x+tHeight+5+opts.height/2)]; + areav=[opts.width-(opts.width/2-opts.height/2)-(-x+tHeight+5+opts.height/2)-5,(opts.height/2-opts.width/2)+(y-5-tWidth+opts.width/2)-5,opts.width-(opts.width/2-opts.height/2)-(-x+tHeight+5+opts.height/2)+tHeight,(opts.height/2-opts.width/2)+(y-5-tWidth+opts.width/2)+tWidth+5]; + isCollision = collisionNew(areav,points,opts.height,opts.width); + }else{ + x = normalInt(-opts.width/2, opts.width/2,5) - tWidth/2; + y = normalInt(-opts.height/2, opts.height/2,5)+tHeight/2; + area=[x-5+opts.width/2,y-5-tHeight+opts.height/2,x+tWidth+5+opts.width/2,y+5+opts.height/2]; + isCollision = collisionNew(area,points,opts.width,opts.height); + } + if (!isCollision) break; + if (breaknum==1000){ + area=[-1000,-1000,-1000,-1000]; + break; + } + }; + if (isSpin) { + points[i].area=areav; + points[i].areav=area; + }else{ + points[i].area=area; + } + points[i].rotate=isSpin; + }; + break; + } + return points; +} + + +function drawWordCloudDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + let wordOption = assign({},{ + type: 'normal', + autoColors: true + },opts.extra.word); + + context.beginPath(); + context.setFillStyle(opts.background||'#FFFFFF'); + context.rect(0,0,opts.width,opts.height); + context.fill(); + context.save(); + let points = opts.chartData.wordCloudData; + context.translate(opts.width/2,opts.height/2); + + for(let i=0;i0){ + if (opts.tooltip) { + if (opts.tooltip.index == i) { + context.strokeText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process); + }else{ + context.fillText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process); + } + }else{ + context.fillText(text,(points[i].areav[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].areav[1]+5+tHeight-opts.height/2)*process); + } + } + }else{ + if(points[i].area[0]>0){ + if (opts.tooltip) { + if (opts.tooltip.index == i) { + context.strokeText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process); + }else{ + context.fillText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process); + } + }else{ + context.fillText(text,(points[i].area[0]+5-opts.width/2)*process-tWidth*(1-process)/2,(points[i].area[1]+5+tHeight-opts.height/2)*process); + } + + } + } + + context.stroke(); + context.restore(); + } + context.restore(); +} + +function drawFunnelDataPoints(series, opts, config, context) { + let process = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + let funnelOption = assign({},{ + activeWidth:10, + activeOpacity:0.3, + border:false, + borderWidth:2, + borderColor:'#FFFFFF', + fillOpacity:1, + labelAlign:'right' + },opts.extra.funnel); + let eachSpacing = (opts.height - opts.area[0] - opts.area[2])/series.length; + let centerPosition = { + x: opts.area[3] + (opts.width - opts.area[1] - opts.area[3]) / 2, + y: opts.height-opts.area[2] + }; + let activeWidth = funnelOption.activeWidth; + let radius = Math.min((opts.width - opts.area[1] - opts.area[3]) / 2 - activeWidth, (opts.height - opts.area[0] - opts.area[2]) / 2 - activeWidth); + series = getFunnelDataPoints(series, radius, process); + context.save(); + context.translate(centerPosition.x,centerPosition.y); + for(let i=0;i0){ + opts.area[3] += yAxisWidth[i].width + opts.yAxis.padding; + }else{ + opts.area[3] += yAxisWidth[i].width; + } + leftIndex +=1; + }else{ + if(rightIndex>0){ + opts.area[1] += yAxisWidth[i].width + opts.yAxis.padding; + }else{ + opts.area[1] += yAxisWidth[i].width; + } + rightIndex +=1; + } + } + }else{ + config.yAxisWidth = yAxisWidth; + } + opts.chartData.yAxisData = _calYAxisData; + + if (opts.categories && opts.categories.length) { + opts.chartData.xAxisData = getXAxisPoints(opts.categories, opts, config); + let _calCategoriesData = calCategoriesData(opts.categories, opts, config, opts.chartData.xAxisData.eachSpacing), + xAxisHeight = _calCategoriesData.xAxisHeight, + angle = _calCategoriesData.angle; + config.xAxisHeight = xAxisHeight; + config._xAxisTextAngle_ = angle; + opts.area[2] += xAxisHeight; + opts.chartData.categoriesData = _calCategoriesData; + }else{ + if (opts.type === 'line' || opts.type === 'area' || opts.type === 'points') { + opts.chartData.xAxisData = calXAxisData(series, opts, config); + categories=opts.chartData.xAxisData.rangesFormat; + let _calCategoriesData = calCategoriesData(categories, opts, config, opts.chartData.xAxisData.eachSpacing), + xAxisHeight = _calCategoriesData.xAxisHeight, + angle = _calCategoriesData.angle; + config.xAxisHeight = xAxisHeight; + config._xAxisTextAngle_ = angle; + opts.area[2] += xAxisHeight; + opts.chartData.categoriesData = _calCategoriesData; + }else{ + opts.chartData.xAxisData={ + xAxisPoints: [] + }; + } + } + //计算右对齐偏移距离 + if (opts.enableScroll && opts.xAxis.scrollAlign == 'right' && opts._scrollDistance_ === undefined) { + let offsetLeft = 0, + xAxisPoints = opts.chartData.xAxisData.xAxisPoints, + startX = opts.chartData.xAxisData.startX, + endX = opts.chartData.xAxisData.endX, + eachSpacing = opts.chartData.xAxisData.eachSpacing; + let totalWidth = eachSpacing * (xAxisPoints.length - 1); + let screenWidth = endX - startX; + offsetLeft = screenWidth - totalWidth; + _this.scrollOption = { + currentOffset: offsetLeft, + startTouchX: offsetLeft, + distance: 0, + lastMoveTime: 0 + }; + opts._scrollDistance_ = offsetLeft; + } + + if (type === 'pie' || type === 'ring' || type === 'rose') { + config._pieTextMaxLength_ = opts.dataLabel === false ? 0 : getPieTextMaxLength(seriesMA); + } + + switch (type) { + case 'word': + let wordOption = assign({},{ + type: 'normal', + autoColors: true + },opts.extra.word); + if(opts.updateData==true || opts.updateData==undefined){ + opts.chartData.wordCloudData=getWordCloudPoint(opts,wordOption.type); + } + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawWordCloudDataPoints(series, opts, config, context,process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'map': + context.clearRect(0, 0, opts.width, opts.height); + drawMapDataPoints(series, opts, config, context); + break; + case 'funnel': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.funnelData = drawFunnelDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'line': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawLineDataPoints = drawLineDataPoints(series, opts, config, context, process), + xAxisPoints = _drawLineDataPoints.xAxisPoints, + calPoints = _drawLineDataPoints.calPoints, + eachSpacing = _drawLineDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'mix': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawMixDataPoints = drawMixDataPoints(series, opts, config, context, process), + xAxisPoints = _drawMixDataPoints.xAxisPoints, + calPoints = _drawMixDataPoints.calPoints, + eachSpacing = _drawMixDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'column': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawColumnDataPoints = drawColumnDataPoints(series, opts, config, context, process), + xAxisPoints = _drawColumnDataPoints.xAxisPoints, + calPoints = _drawColumnDataPoints.calPoints, + eachSpacing = _drawColumnDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'area': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawAreaDataPoints = drawAreaDataPoints(series, opts, config, context, process), + xAxisPoints = _drawAreaDataPoints.xAxisPoints, + calPoints = _drawAreaDataPoints.calPoints, + eachSpacing = _drawAreaDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'ring': + case 'pie': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.pieData = drawPieDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'rose': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.pieData = drawRoseDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'radar': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.radarData = drawRadarDataPoints(series, opts, config, context, process); + drawLegend(opts.series, opts, config, context, opts.chartData); + drawToolTipBridge(opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'arcbar': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.arcbarData = drawArcbarDataPoints(series, opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'gauge': + this.animationInstance = new Animation({ + timing: 'easeInOut', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + opts.chartData.gaugeData = drawGaugeDataPoints(categories, series, opts, config, context, process); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + case 'candle': + this.animationInstance = new Animation({ + timing: 'easeIn', + duration: duration, + onProcess: function onProcess(process) { + context.clearRect(0, 0, opts.width, opts.height); + if (opts.rotate) { + contextRotate(context, opts); + } + drawYAxisGrid(categories, opts, config, context); + drawXAxis(categories, opts, config, context); + var _drawCandleDataPoints = drawCandleDataPoints(series, seriesMA, opts, config, context, process), + xAxisPoints = _drawCandleDataPoints.xAxisPoints, + calPoints = _drawCandleDataPoints.calPoints, + eachSpacing = _drawCandleDataPoints.eachSpacing; + opts.chartData.xAxisPoints = xAxisPoints; + opts.chartData.calPoints = calPoints; + opts.chartData.eachSpacing = eachSpacing; + drawYAxis(series, opts, config, context); + if (opts.enableMarkLine !== false && process === 1) { + drawMarkLine(opts, config, context); + } + if (seriesMA) { + drawLegend(seriesMA, opts, config, context, opts.chartData); + } else { + drawLegend(opts.series, opts, config, context, opts.chartData); + } + drawToolTipBridge(opts, config, context, process, eachSpacing, xAxisPoints); + drawCanvas(opts, context); + }, + onAnimationFinish: function onAnimationFinish() { + _this.event.trigger('renderComplete'); + } + }); + break; + } +} + +// simple event implement + +function Event() { + this.events = {}; +} + +Event.prototype.addEventListener = function(type, listener) { + this.events[type] = this.events[type] || []; + this.events[type].push(listener); +}; + +Event.prototype.trigger = function() { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var type = args[0]; + var params = args.slice(1); + if (!!this.events[type]) { + this.events[type].forEach(function(listener) { + try { + listener.apply(null, params); + } catch (e) { + console.error(e); + } + }); + } +}; + +var Charts = function Charts(opts) { + opts.pixelRatio = opts.pixelRatio ? opts.pixelRatio : 1; + opts.fontSize = opts.fontSize ? opts.fontSize * opts.pixelRatio : 13 * opts.pixelRatio; + opts.title = assign({}, opts.title); + opts.subtitle = assign({}, opts.subtitle); + opts.duration = opts.duration ? opts.duration : 1000; + opts.yAxis = assign({}, { + data:[], + showTitle:false, + disabled:false, + disableGrid:false, + splitNumber:5, + gridType: 'solid', + dashLength: 4 * opts.pixelRatio, + gridColor:'#cccccc', + padding:10, + fontColor:'#666666' + }, opts.yAxis); + opts.yAxis.dashLength *= opts.pixelRatio; + opts.yAxis.padding *= opts.pixelRatio; + opts.xAxis = assign({}, { + rotateLabel: false, + type: 'calibration', + gridType: 'solid', + dashLength: 4, + scrollAlign: 'left', + boundaryGap:'center', + axisLine:true, + axisLineColor:'#cccccc' + }, opts.xAxis); + opts.xAxis.dashLength *= opts.pixelRatio; + opts.legend = assign({}, { + show: true, + position: 'bottom', + float: 'center', + backgroundColor: 'rgba(0,0,0,0)', + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + padding: 5, + margin: 5, + itemGap: 10, + fontSize: opts.fontSize, + lineHeight: opts.fontSize, + fontColor: '#333333', + format: {}, + hiddenColor: '#CECECE' + }, opts.legend); + opts.legend.borderWidth = opts.legend.borderWidth * opts.pixelRatio; + opts.legend.itemGap = opts.legend.itemGap * opts.pixelRatio; + opts.legend.padding = opts.legend.padding * opts.pixelRatio; + opts.legend.margin = opts.legend.margin * opts.pixelRatio; + opts.extra = assign({}, opts.extra); + opts.rotate = opts.rotate ? true : false; + opts.animation = opts.animation ? true : false; + opts.rotate = opts.rotate ? true : false; + + let config$$1 = JSON.parse(JSON.stringify(config)); + config$$1.colors = opts.colors ? opts.colors : config$$1.colors; + config$$1.yAxisTitleWidth = opts.yAxis.disabled !== true && opts.yAxis.title ? config$$1.yAxisTitleWidth : 0; + if (opts.type == 'pie' || opts.type == 'ring') { + config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.pie.labelWidth * opts.pixelRatio || config$$1.pieChartLinePadding * opts.pixelRatio; + } + if (opts.type == 'rose') { + config$$1.pieChartLinePadding = opts.dataLabel === false ? 0 : opts.extra.rose.labelWidth * opts.pixelRatio || config$$1.pieChartLinePadding * opts.pixelRatio; + } + config$$1.pieChartTextPadding = opts.dataLabel === false ? 0 : config$$1.pieChartTextPadding * opts.pixelRatio; + config$$1.yAxisSplit = opts.yAxis.splitNumber ? opts.yAxis.splitNumber : config.yAxisSplit; + + //屏幕旋转 + config$$1.rotate = opts.rotate; + if (opts.rotate) { + let tempWidth = opts.width; + let tempHeight = opts.height; + opts.width = tempHeight; + opts.height = tempWidth; + } + + //适配高分屏 + opts.padding = opts.padding ? opts.padding : config$$1.padding; + for (let i = 0; i < 4; i++) { + opts.padding[i] *= opts.pixelRatio; + } + config$$1.yAxisWidth = config.yAxisWidth * opts.pixelRatio; + config$$1.xAxisHeight = config.xAxisHeight * opts.pixelRatio; + if (opts.enableScroll && opts.xAxis.scrollShow) { + config$$1.xAxisHeight += 6 * opts.pixelRatio; + } + config$$1.xAxisLineHeight = config.xAxisLineHeight * opts.pixelRatio; + config$$1.fontSize = opts.fontSize; + config$$1.titleFontSize = config.titleFontSize * opts.pixelRatio; + config$$1.subtitleFontSize = config.subtitleFontSize * opts.pixelRatio; + config$$1.toolTipPadding = config.toolTipPadding * opts.pixelRatio; + config$$1.toolTipLineHeight = config.toolTipLineHeight * opts.pixelRatio; + config$$1.columePadding = config.columePadding * opts.pixelRatio; + opts.$this = opts.$this ? opts.$this : this; + + this.context = wx.createCanvasContext(opts.canvasId, opts.$this); + /* 兼容原生H5 + this.context = document.getElementById(opts.canvasId).getContext("2d"); + this.context.setStrokeStyle = function(e){ return this.strokeStyle=e; } + this.context.setLineWidth = function(e){ return this.lineWidth=e; } + this.context.setLineCap = function(e){ return this.lineCap=e; } + this.context.setFontSize = function(e){ return this.font=e+"px sans-serif"; } + this.context.setFillStyle = function(e){ return this.fillStyle=e; } + this.context.draw = function(){ } + */ + + opts.chartData = {}; + this.event = new Event(); + this.scrollOption = { + currentOffset: 0, + startTouchX: 0, + distance: 0, + lastMoveTime: 0 + }; + + this.opts = opts; + this.config = config$$1; + + drawCharts.call(this, opts.type, opts, config$$1, this.context); +}; + +Charts.prototype.updateData = function() { + let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.opts = assign({}, this.opts, data); + this.opts.updateData = true; + let scrollPosition = data.scrollPosition || 'current'; + switch (scrollPosition) { + case 'current': + this.opts._scrollDistance_ = this.scrollOption.currentOffset; + break; + case 'left': + this.opts._scrollDistance_ = 0; + this.scrollOption = { + currentOffset: 0, + startTouchX: 0, + distance: 0, + lastMoveTime: 0 + }; + break; + case 'right': + let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config), + yAxisWidth = _calYAxisData.yAxisWidth; + this.config.yAxisWidth = yAxisWidth; + let offsetLeft = 0; + let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config), + xAxisPoints = _getXAxisPoints0.xAxisPoints, + startX = _getXAxisPoints0.startX, + endX = _getXAxisPoints0.endX, + eachSpacing = _getXAxisPoints0.eachSpacing; + let totalWidth = eachSpacing * (xAxisPoints.length - 1); + let screenWidth = endX - startX; + offsetLeft = screenWidth - totalWidth; + this.scrollOption = { + currentOffset: offsetLeft, + startTouchX: offsetLeft, + distance: 0, + lastMoveTime: 0 + }; + this.opts._scrollDistance_ = offsetLeft; + break; + } + drawCharts.call(this, this.opts.type, this.opts, this.config, this.context); +}; + +Charts.prototype.zoom = function() { + var val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.opts.xAxis.itemCount; + if (this.opts.enableScroll !== true) { + console.log('请启用滚动条后使用!') + return; + } + //当前屏幕中间点 + let centerPoint = Math.round(Math.abs(this.scrollOption.currentOffset) / this.opts.chartData.eachSpacing) + Math.round( + this.opts.xAxis.itemCount / 2); + this.opts.animation = false; + this.opts.xAxis.itemCount = val.itemCount; + //重新计算x轴偏移距离 + let _calYAxisData = calYAxisData(this.opts.series, this.opts, this.config), + yAxisWidth = _calYAxisData.yAxisWidth; + this.config.yAxisWidth = yAxisWidth; + let offsetLeft = 0; + let _getXAxisPoints0 = getXAxisPoints(this.opts.categories, this.opts, this.config), + xAxisPoints = _getXAxisPoints0.xAxisPoints, + startX = _getXAxisPoints0.startX, + endX = _getXAxisPoints0.endX, + eachSpacing = _getXAxisPoints0.eachSpacing; + let centerLeft = eachSpacing * centerPoint; + let screenWidth = endX - startX; + let MaxLeft = screenWidth - eachSpacing * (xAxisPoints.length - 1); + offsetLeft = screenWidth / 2 - centerLeft; + if (offsetLeft > 0) { + offsetLeft = 0; + } + if (offsetLeft < MaxLeft) { + offsetLeft = MaxLeft; + } + this.scrollOption = { + currentOffset: offsetLeft, + startTouchX: offsetLeft, + distance: 0, + lastMoveTime: 0 + }; + this.opts._scrollDistance_ = offsetLeft; + drawCharts.call(this, this.opts.type, this.opts, this.config, this.context); +}; + +Charts.prototype.stopAnimation = function() { + this.animationInstance && this.animationInstance.stop(); +}; + +Charts.prototype.addEventListener = function(type, listener) { + this.event.addEventListener(type, listener); +}; + +Charts.prototype.getCurrentDataIndex = function(e) { + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches) { + let _touches$ = getTouches(touches, this.opts, e); + if (this.opts.type === 'pie' || this.opts.type === 'ring' || this.opts.type === 'rose') { + return findPieChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.pieData); + } else if (this.opts.type === 'radar') { + return findRadarChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.radarData, this.opts.categories.length); + } else if (this.opts.type === 'funnel') { + return findFunnelChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.funnelData); + } else if (this.opts.type === 'map') { + return findMapChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts); + }else if (this.opts.type === 'word') { + return findWordChartCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.wordCloudData); + } else { + return findCurrentIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.calPoints, this.opts, this.config, Math.abs(this.scrollOption.currentOffset)); + } + } + return -1; +}; + +Charts.prototype.getLegendDataIndex = function(e) { + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches) { + let _touches$ = getTouches(touches, this.opts, e); + return findLegendIndex({ + x: _touches$.x, + y: _touches$.y + }, this.opts.chartData.legendData); + } + return -1; +}; + +Charts.prototype.touchLegend = function(e) { + var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches) { + var _touches$ = getTouches(touches, this.opts, e); + var index = this.getLegendDataIndex(e); + if (index >= 0) { + this.opts.series[index].show = !this.opts.series[index].show; + this.opts.animation = option.animation ? true : false; + this.opts._scrollDistance_= this.scrollOption.currentOffset; + drawCharts.call(this, this.opts.type, this.opts, this.config, this.context); + } + } + +}; + +Charts.prototype.showToolTip = function(e) { + var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (!touches) { + console.log("touchError"); + } + var _touches$ = getTouches(touches, this.opts, e); + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + if (this.opts.type === 'line' || this.opts.type === 'area' || this.opts.type === 'column') { + var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ; + if (index > -1) { + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var _getToolTipData = getToolTipData(seriesData, this.opts.chartData.calPoints, index, this.opts.categories,option), + textList = _getToolTipData.textList, + offset = _getToolTipData.offset; + offset.y = _touches$.y; + opts.tooltip = { + textList: option.textList?option.textList:textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'mix') { + var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ; + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var _getMixToolTipData = getMixToolTipData(seriesData, this.opts.chartData.calPoints, index, this.opts.categories,option), + textList = _getMixToolTipData.textList, + offset = _getMixToolTipData.offset; + offset.y = _touches$.y; + opts.tooltip = { + textList: option.textList?option.textList:textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'candle') { + var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ; + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var _getToolTipData = getCandleToolTipData(this.opts.series[0].data, seriesData, this.opts.chartData.calPoints, + index, this.opts.categories, this.opts.extra.candle, option), + textList = _getToolTipData.textList, + offset = _getToolTipData.offset; + offset.y = _touches$.y; + opts.tooltip = { + textList: option.textList?option.textList:textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'pie' || this.opts.type === 'ring' || this.opts.type === 'rose'||this.opts.type === 'funnel' ) { + var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ; + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = this.opts._series_[index]; + var textList = [{ + text: option.format ? option.format(seriesData) : seriesData.name + ': ' + seriesData.data, + color: seriesData.color + }]; + var offset = { + x: _touches$.x, + y: _touches$.y + }; + opts.tooltip = { + textList: option.textList?option.textList:textList, + offset: offset, + option: option, + index: index + }; + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'map'||this.opts.type === 'word') { + var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ; + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = this.opts._series_[index]; + var textList = [{ + text: option.format ? option.format(seriesData) : seriesData.properties.name , + color: seriesData.color + }]; + var offset = { + x: _touches$.x, + y: _touches$.y + }; + opts.tooltip = { + textList: option.textList?option.textList:textList, + offset: offset, + option: option, + index: index + }; + } + opts.updateData = false; + drawCharts.call(this, opts.type, opts, this.config, this.context); + } + if (this.opts.type === 'radar') { + var index = option.index==undefined? this.getCurrentDataIndex(e):option.index ; + if (index > -1) { + var currentOffset = this.scrollOption.currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset, + animation: false + }); + var seriesData = getSeriesDataItem(this.opts.series, index); + if (seriesData.length !== 0) { + var textList = seriesData.map(function(item) { + return { + text: option.format ? option.format(item) : item.name + ': ' + item.data, + color: item.color + }; + }); + var offset = { + x: _touches$.x, + y: _touches$.y + }; + opts.tooltip = { + textList: option.textList?option.textList:textList, + offset: offset, + option: option, + index: index + }; + } + } + drawCharts.call(this, opts.type, opts, this.config, this.context); + } +}; + +Charts.prototype.translate = function(distance) { + this.scrollOption = { + currentOffset: distance, + startTouchX: distance, + distance: 0, + lastMoveTime: 0 + }; + let opts = assign({}, this.opts, { + _scrollDistance_: distance, + animation: false + }); + drawCharts.call(this, this.opts.type, opts, this.config, this.context); +}; + +Charts.prototype.scrollStart = function(e) { + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + var _touches$ = getTouches(touches, this.opts, e); + if (touches && this.opts.enableScroll === true) { + this.scrollOption.startTouchX = _touches$.x; + } +}; + +Charts.prototype.scroll = function(e) { + if (this.scrollOption.lastMoveTime === 0) { + this.scrollOption.lastMoveTime = Date.now(); + } + let Limit = this.opts.extra.touchMoveLimit || 20; + let currMoveTime = Date.now(); + let duration = currMoveTime - this.scrollOption.lastMoveTime; + if (duration < Math.floor(1000 / Limit)) return; + this.scrollOption.lastMoveTime = currMoveTime; + var touches = null; + if (e.changedTouches) { + touches = e.changedTouches[0]; + } else { + touches = e.mp.changedTouches[0]; + } + if (touches && this.opts.enableScroll === true) { + var _touches$ = getTouches(touches, this.opts, e); + var _distance; + _distance = _touches$.x - this.scrollOption.startTouchX; + var currentOffset = this.scrollOption.currentOffset; + var validDistance = calValidDistance(this,currentOffset + _distance, this.opts.chartData, this.config, this.opts); + this.scrollOption.distance = _distance = validDistance - currentOffset; + var opts = assign({}, this.opts, { + _scrollDistance_: currentOffset + _distance, + animation: false + }); + drawCharts.call(this, opts.type, opts, this.config, this.context); + return currentOffset + _distance; + } +}; + +Charts.prototype.scrollEnd = function(e) { + if (this.opts.enableScroll === true) { + var _scrollOption = this.scrollOption, + currentOffset = _scrollOption.currentOffset, + distance = _scrollOption.distance; + this.scrollOption.currentOffset = currentOffset + distance; + this.scrollOption.distance = 0; + } +}; +if (typeof module === "object" && typeof module.exports === "object") { + module.exports = Charts; + //export default Charts;//建议使用nodejs的module导出方式,如报错请使用export方式导出 +} diff --git a/miniprogram/utils/util.js b/miniprogram/utils/util.js new file mode 100644 index 0000000..66caaa2 --- /dev/null +++ b/miniprogram/utils/util.js @@ -0,0 +1,42 @@ +const formatTime = date => { + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + const hour = date.getHours() + const minute = date.getMinutes() + const second = date.getSeconds() + + return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') +} + +const formatNumber = n => { + n = n.toString() + return n[1] ? n : '0' + n +} + + +// 显示繁忙提示 +var showBusy = text => wx.showToast({ + title: text, + icon: 'loading', + duration: 10000 +}) + +// 显示成功提示 +var showSuccess = text => wx.showToast({ + title: text, + icon: 'success' +}) + +// 显示失败提示 +var showModel = (title, content) => { + wx.hideToast(); + + wx.showModal({ + title, + content: JSON.stringify(content), + showCancel: false + }) +} + +module.exports = { formatTime, showBusy, showSuccess, showModel } diff --git a/miniprogram/vendor/wafer2-client-sdk/LICENSE b/miniprogram/vendor/wafer2-client-sdk/LICENSE new file mode 100644 index 0000000..7bb43b8 --- /dev/null +++ b/miniprogram/vendor/wafer2-client-sdk/LICENSE @@ -0,0 +1,24 @@ +LICENSE - "MIT License" + +Copyright (c) 2016 by Tencent Cloud + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/miniprogram/vendor/wafer2-client-sdk/README.md b/miniprogram/vendor/wafer2-client-sdk/README.md new file mode 100644 index 0000000..ac48138 --- /dev/null +++ b/miniprogram/vendor/wafer2-client-sdk/README.md @@ -0,0 +1,247 @@ +# 微信小程序客户端腾讯云增强 SDK + +[![Build Status](https://travis-ci.org/tencentyun/wafer-client-sdk.svg?branch=master)](https://travis-ci.org/tencentyun/wafer-client-sdk) +[![Coverage Status](https://coveralls.io/repos/github/tencentyun/wafer-client-sdk/badge.svg?branch=master)](https://coveralls.io/github/tencentyun/wafer-client-sdk?branch=master) +[![License](https://img.shields.io/github/license/tencentyun/wafer-client-sdk.svg)](LICENSE) + +本 项目是 [Wafer](https://github.com/tencentyun/wafer-solution) 的组成部分,为小程序客户端开发提供 SDK 支持会话服务和信道服务。 + +## SDK 获取与安装 + +解决方案[客户端 Demo](https://github.com/tencentyun/wafer-client-demo) 已经集成并使用最新版的 SDK,需要快速了解的可以从 Demo 开始。 + +如果需要单独开始,本 SDK 已经发布为 bower 模块,可以直接安装到小程序目录中。 + +```sh +npm install -g bower +bower install qcloud-weapp-client-sdk +``` + +安装之后,就可以使用 `require` 引用 SDK 模块: + +```js +var qcloud = require('./bower_components/qcloud-weapp-client-sdk/index.js'); +``` + +## 会话服务 + +[会话服务](https://github.com/tencentyun/wafer-solution/wiki/%E4%BC%9A%E8%AF%9D%E6%9C%8D%E5%8A%A1)让小程序拥有会话管理能力。 + +### 登录 + +登录可以在小程序和服务器之间建立会话,服务器由此可以获取到用户的标识和信息。 + +```js +var qcloud = require('./bower_components/qcloud-weapp-client-sdk/index.js'); + +// 设置登录地址 +qcloud.setLoginUrl('https://199447.qcloud.la/login'); +qcloud.login({ + success: function (userInfo) { + console.log('登录成功', userInfo); + }, + fail: function (err) { + console.log('登录失败', err); + } +}); +``` +本 SDK 需要配合云端 SDK 才能提供完整会话服务。通过 [setLoginUrl](#setLoginUrl) 设置登录地址,云服务器在该地址上使用云端 SDK 处理登录请求。 + +> `setLoginUrl` 方法设置登录地址之后会一直有效,因此你可以在微信小程序启动时设置。 + +登录成功后,可以获取到当前微信用户的基本信息。 + +### 请求 + +如果希望小程序的网络请求包含会话,登录之后使用 [request](#request) 方法进行网络请求即可。 + +```js +qcloud.request({ + url: 'http://199447.qcloud.la/user', + success: function (response) { + console.log(response); + }, + fail: function (err) { + console.log(err); + } +}); +``` + +如果调用 `request` 之前还没有登录,则请求不会带有会话。`request` 方法也支持 `login` 参数支持在请求之前自动登录。 + +```js +// 使用 login 参数之前,需要设置登录地址 +qcloud.setLoginUrl('https://199447.qcloud.la/login'); +qcloud.request({ + login: true, + url: 'http://199447.qcloud.la/user', + success: function (response) { + console.log(response); + }, + fail: function (err) { + console.log(err); + } +}); +``` + +关于会话服务详细技术说明,请参考 [Wiki](https://github.com/tencentyun/wafer-solution/wiki/%E4%BC%9A%E8%AF%9D%E6%9C%8D%E5%8A%A1)。 + +## 信道服务 + +[信道服务](https://github.com/tencentyun/wafer-solution/wiki/%E4%BF%A1%E9%81%93%E6%9C%8D%E5%8A%A1)小程序支持利用腾讯云的信道资源使用 WebSocket 服务。 + +```js +// 创建信道,需要给定后台服务地址 +var tunnel = this.tunnel = new qcloud.Tunnel('https://199447.qcloud.la/tunnel'); + +// 监听信道内置消息,包括 connect/close/reconnecting/reconnect/error +tunnel.on('connect', () => console.log('WebSocket 信道已连接')); +tunnel.on('close', () => console.log('WebSocket 信道已断开')); +tunnel.on('reconnecting', () => console.log('WebSocket 信道正在重连...')); +tunnel.on('reconnect', () => console.log('WebSocket 信道重连成功')); +tunnel.on('error', error => console.error('信道发生错误:', error)); + +// 监听自定义消息(服务器进行推送) +tunnel.on('speak', speak => console.log('收到 speak 消息:', speak)); + +// 打开信道 +tunnel.open(); +// 发送消息 +tunnel.emit('speak', { word: "hello", who: { nickName: "techird" }}); +// 关闭信道 +tunnel.close(); +``` + +信道服务同样需要业务服务器配合云端 SDK 支持,构造信道实例的时候需要提供业务服务器提供的信道服务地址。通过监听信道消息以及自定义消息来通过信道实现业务。 + +关于信道使用的更完整实例,建议参考客户端 Demo 中的[三木聊天室应用源码](https://github.com/tencentyun/wafer-client-demo/blob/master/pages/chat/chat.js)。 + +关于信道服务详细技术说明,请参考 [Wiki](https://github.com/tencentyun/wafer-solution/wiki/%E4%BF%A1%E9%81%93%E6%9C%8D%E5%8A%A1)。 + +## API + + +### setLoginUrl +设置会话服务登录地址。 + +#### 语法 +```js +qcloud.setLoginUrl(loginUrl); +``` + +#### 参数 +|参数         |类型 |说明 +|-------------|---------------|-------------- +|loginUrl |string |会话服务登录地址 + +### login +登录,建立微信小程序会话。 + +#### 语法 +```js +qcloud.login(options); +``` + +#### 参数 +|参数         |类型 |说明 +|-------------|---------------|-------------- +|options     |PlainObject   |会话服务登录地址 +|options.success | () => void | 登录成功的回调 +|options.error | (error) => void | 登录失败的回调 + + +### request +进行带会话的请求。 + +#### 语法 +```js +qcloud.request(options); +``` + +#### 参数 +|参数         |类型 |说明 +|-------------|---------------|-------------- +|options     |PlainObject   | 会话服务登录地址 +|options.login | bool         | 是否自动登录以获取会话,默认为 false +|options.url   | string       | 必填,要请求的地址 +|options.header | PlainObject | 请求头设置,不允许设置 Referer +|options.method | string     | 请求的方法,默认为 GET +|options.success | (response) => void | 登录成功的回调。

  • `response.statusCode`:请求返回的状态码
  • `response.data`:请求返回的数据
+|options.error | (error) => void | 登录失败的回调 +|options.complete | () => void | 登录完成后回调,无论成功还是失败 + +### Tunnel + +表示一个信道。由于小程序的限制,同一时间只能有一个打开的信道。 + +#### constructor + +##### 语法 +```js +var tunnel = new Tunnel(tunnelUrl); +``` + +#### 参数 +|参数         |类型 |说明 +|-------------|---------------|-------------- +|tunnelUrl   |String   | 会话服务登录地址 + + +#### on +监听信道上的事件。信道上事件包括系统事件和服务器推送消息。 + +##### 语法 +```js +tunnel.on(type, listener); +``` + +##### 参数 +|参数         |类型 |说明 +|-------------|---------------|-------------- +|type       |string     | 监听的事件类型 +|listener     |(message?: any) => void | 监听器,具体类型的事件发生时调用监听器。如果是消息,则会有消息内容。 + +##### 事件 +|事件 |说明 +|-------------|------------------------------- +|connect |信道连接成功后回调 +|close |信道关闭后回调 +|reconnecting |信道发生重连时回调 +|reconnected |信道重连成功后回调 +|error |信道发生错误后回调 +|[message]   |信道服务器推送过来的消息类型,如果消息类型和上面内置的时间类型冲突,需要在监听的时候在消息类型前加 `@` +|\*           |监听所有事件和消息,监听器第一个参数接收到时间或消息类型  + +#### open +打开信道,建立连接。由于小程序的限制,同一时间只能有一个打开的信道。 + +##### 语法 +```js +tunnel.open(); +``` + +#### emit +向信道推送消息。 + +##### 语法 +```js +tunnel.emit(type, content); +``` + +##### 参数 +|参数         |类型 |说明 +|-------------|---------------|-------------- +|type       |string       | 要推送的消息的类型 +|content |any | 要推送的消息的内容 + +#### close +关闭信道 + +##### 语法 +```js +tunnel.close(); +``` + +## LICENSE + +[MIT](LICENSE) diff --git a/miniprogram/vendor/wafer2-client-sdk/index.js b/miniprogram/vendor/wafer2-client-sdk/index.js new file mode 100644 index 0000000..d2831a0 --- /dev/null +++ b/miniprogram/vendor/wafer2-client-sdk/index.js @@ -0,0 +1,26 @@ +var constants = require('./lib/constants'); +var login = require('./lib/login'); +var Session = require('./lib/session'); +var request = require('./lib/request'); +var Tunnel = require('./lib/tunnel'); + +var exports = module.exports = { + login: login.login, + loginWithCode: login.loginWithCode, + setLoginUrl: login.setLoginUrl, + + Session, + clearSession: Session.clear, + + request: request.request, + RequestError: request.RequestError, + + Tunnel: Tunnel, +}; + +// 导出错误类型码 +Object.keys(constants).forEach(function (key) { + if (key.indexOf('ERR_') === 0) { + exports[key] = constants[key]; + } +}); \ No newline at end of file diff --git a/miniprogram/vendor/wafer2-client-sdk/lib/constants.js b/miniprogram/vendor/wafer2-client-sdk/lib/constants.js new file mode 100644 index 0000000..b307772 --- /dev/null +++ b/miniprogram/vendor/wafer2-client-sdk/lib/constants.js @@ -0,0 +1,20 @@ +module.exports = { + WX_HEADER_CODE: 'X-WX-Code', + WX_HEADER_ENCRYPTED_DATA: 'X-WX-Encrypted-Data', + WX_HEADER_IV: 'X-WX-IV', + WX_HEADER_ID: 'X-WX-Id', + WX_HEADER_SKEY: 'X-WX-Skey', + + WX_SESSION_MAGIC_ID: 'F2C224D4-2BCE-4C64-AF9F-A6D872000D1A', + + ERR_INVALID_PARAMS: 'ERR_INVALID_PARAMS', + + ERR_WX_LOGIN_FAILED: 'ERR_WX_LOGIN_FAILED', + ERR_WX_GET_USER_INFO: 'ERR_WX_GET_USER_INFO', + ERR_LOGIN_TIMEOUT: 'ERR_LOGIN_TIMEOUT', + ERR_LOGIN_FAILED: 'ERR_LOGIN_FAILED', + ERR_LOGIN_SESSION_NOT_RECEIVED: 'ERR_LOGIN_MISSING_SESSION', + + ERR_SESSION_INVALID: 'ERR_SESSION_INVALID', + ERR_CHECK_LOGIN_FAILED: 'ERR_CHECK_LOGIN_FAILED', +}; \ No newline at end of file diff --git a/miniprogram/vendor/wafer2-client-sdk/lib/login.js b/miniprogram/vendor/wafer2-client-sdk/lib/login.js new file mode 100644 index 0000000..613964a --- /dev/null +++ b/miniprogram/vendor/wafer2-client-sdk/lib/login.js @@ -0,0 +1,167 @@ +/** + * README!!! + * 为了兼容微信修改的登录逻辑 + * 这里对登录的 SDK 进行重构 + * 微信公告:https://developers.weixin.qq.com/blogdetail?action=get_post_info&lang=zh_CN&token=&docid=0000a26e1aca6012e896a517556c01 + */ +var constants = require('./constants'); +var Session = require('./session'); + +/** + * 微信登录,获取 code 和 encryptData + */ +function getWxLoginResult (cb) { + wx.login({ + success (loginResult) { + wx.getUserInfo({ + success (userResult) { + cb(null, { + code: loginResult.code, + encryptedData: userResult.encryptedData, + iv: userResult.iv, + userInfo: userResult.userInfo + }) + }, + fail (userError) { + cb(new Error('获取微信用户信息失败,请检查网络状态'), null) + } + }); + }, + fail (loginError) { + cb(new Error('微信登录失败,请检查网络状态'), null) + } + }) +} + +const noop = function noop() {} +const defaultOptions = { + method: 'GET', + success: noop, + fail: noop, + loginUrl: null, +} + +/** + * @method + * 进行服务器登录,以获得登录会话 + * 受限于微信的限制,本函数需要在 的回调函数中调用 + * 需要先使用