From f2893943d4f4c151cdb0fcaecb5c4cd9d1e75fcd Mon Sep 17 00:00:00 2001 From: zhangdaihao <zhangdaiscott@163.com> Date: Mon, 4 Mar 2019 12:48:25 +0800 Subject: [PATCH] jeecg-boot 1.0版本发布 | 企业级快速开发平台 --- README.md | 242 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- ant-design-jeecg-vue/.editorconfig | 39 +++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/.gitattributes | 1 + ant-design-jeecg-vue/.gitignore | 21 +++++++++++++++++++++ ant-design-jeecg-vue/.prettierrc | 5 +++++ ant-design-jeecg-vue/LICENSE | 21 +++++++++++++++++++++ ant-design-jeecg-vue/README.md | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/babel.config.js | 5 +++++ ant-design-jeecg-vue/idea.config.js | 24 ++++++++++++++++++++++++ ant-design-jeecg-vue/package.json | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/public/avatar2.jpg | Bin 0 -> 80189 bytes ant-design-jeecg-vue/public/color.less | 7684 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/public/index.html | 238 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/public/logo.png | Bin 0 -> 20228 bytes ant-design-jeecg-vue/public/v2.js | 1 + ant-design-jeecg-vue/src/App.vue | 44 ++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/api/api.js | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/api/index.js | 10 ++++++++++ ant-design-jeecg-vue/src/api/login.js | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/api/manage.js | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/assets/background.svg | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/assets/less/index.less | 21 +++++++++++++++++++++ ant-design-jeecg-vue/src/assets/logo.png | Bin 0 -> 20228 bytes ant-design-jeecg-vue/src/assets/logo.svg | 43 +++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/AvatarList/Item.vue | 46 ++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/AvatarList/List.vue | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/AvatarList/index.js | 4 ++++ ant-design-jeecg-vue/src/components/AvatarList/index.less | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/ChartCard.vue | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/CountDown/CountDown.vue | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/CountDown/index.js | 3 +++ ant-design-jeecg-vue/src/components/Ellipsis/Ellipsis.vue | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/Ellipsis/index.js | 3 +++ ant-design-jeecg-vue/src/components/NumberInfo/NumberInfo.vue | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/NumberInfo/index.js | 3 +++ ant-design-jeecg-vue/src/components/NumberInfo/index.less | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/Trend/Trend.vue | 41 +++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/Trend/index.js | 3 +++ ant-design-jeecg-vue/src/components/Trend/index.less | 42 ++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/_util/StringUtil.js | 25 +++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/_util/util.js | 12 ++++++++++++ ant-design-jeecg-vue/src/components/chart/Bar.vue | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/Liquid.vue | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/MiniArea.vue | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/MiniBar.vue | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/MiniProgress.vue | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/Radar.vue | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/RankList.vue | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/TransferBar.vue | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/Trend.vue | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/chart.scss | 13 +++++++++++++ ant-design-jeecg-vue/src/components/dict/DictSelectTag.vue | 47 +++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/dict/DictSelectUtil.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/dict/README.md | 36 ++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/dict/UserInfoTag.vue | 22 ++++++++++++++++++++++ ant-design-jeecg-vue/src/components/dict/index.js | 7 +++++++ ant-design-jeecg-vue/src/components/index.less | 4 ++++ ant-design-jeecg-vue/src/components/jeecg/JDate.vue | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecg/README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/layouts/BasicLayout.vue | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/layouts/BlankLayout.vue | 16 ++++++++++++++++ ant-design-jeecg-vue/src/components/layouts/IframePageView.vue | 47 +++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/layouts/PageView.vue | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/layouts/RouteView.vue | 17 +++++++++++++++++ ant-design-jeecg-vue/src/components/layouts/TabLayout.vue | 213 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/layouts/UserLayout.vue | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/layouts/index.js | 8 ++++++++ ant-design-jeecg-vue/src/components/menu/Contextmenu.vue | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/menu/SideMenu.vue | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/menu/index.js | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/page/GlobalFooter.vue | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/page/GlobalHeader.vue | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/page/GlobalLayout.vue | 596 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/page/PageHeader.vue | 238 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/page/PageLayout.vue | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/page/SHeaderNotice.vue | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/setting/SettingDrawer.vue | 314 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/setting/SettingItem.vue | 38 ++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/table/README.md | 292 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/table/StandardTable.vue | 252 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/table/index.js | 265 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/tools/Breadcrumb.vue | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/tools/DetailList.vue | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/tools/FooterToolBar.vue | 32 ++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/tools/HeadInfo.vue | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/tools/HeaderNotice.vue | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/tools/Logo.vue | 33 +++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/tools/TwoStepCaptcha.vue | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/tools/UserMenu.vue | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/tools/setting.js | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/config/router.config.js | 394 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/defaultSettings.js | 31 +++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/main.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/permission.js | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/router/README.md | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/router/index.js | 12 ++++++++++++ ant-design-jeecg-vue/src/store/getters.js | 17 +++++++++++++++++ ant-design-jeecg-vue/src/store/index.js | 27 +++++++++++++++++++++++++++ ant-design-jeecg-vue/src/store/modules/app.js | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/store/modules/permission.js | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/store/modules/user.js | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/store/mutation-types.js | 17 +++++++++++++++++ ant-design-jeecg-vue/src/utils/auth.js | 19 +++++++++++++++++++ ant-design-jeecg-vue/src/utils/axios.js | 37 +++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/utils/device.js | 23 +++++++++++++++++++++++ ant-design-jeecg-vue/src/utils/filter.js | 18 ++++++++++++++++++ ant-design-jeecg-vue/src/utils/hasPermission.js | 26 ++++++++++++++++++++++++++ ant-design-jeecg-vue/src/utils/mixin.js | 39 +++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/utils/permissions.js | 8 ++++++++ ant-design-jeecg-vue/src/utils/request.js | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/utils/storage.js | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/utils/util.js | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/404.vue | 15 +++++++++++++++ ant-design-jeecg-vue/src/views/Home.vue | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/center/Index.vue | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/center/page/App.vue | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/center/page/Article.vue | 24 ++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/center/page/Project.vue | 17 +++++++++++++++++ ant-design-jeecg-vue/src/views/account/center/page/index.js | 5 +++++ ant-design-jeecg-vue/src/views/account/settings/AvatarModal.vue | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/settings/BaseSetting.vue | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/settings/Binding.vue | 25 +++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/settings/Custom.vue | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/settings/Index.vue | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/settings/Notification.vue | 25 +++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/settings/Security.vue | 41 +++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/dashboard/Analysis.vue | 267 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/dashboard/Monitor.vue | 15 +++++++++++++++ ant-design-jeecg-vue/src/views/dashboard/Workplace.vue | 361 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/exception/403.vue | 17 +++++++++++++++++ ant-design-jeecg-vue/src/views/exception/404.vue | 17 +++++++++++++++++ ant-design-jeecg-vue/src/views/exception/500.vue | 17 +++++++++++++++++ ant-design-jeecg-vue/src/views/exception/ExceptionPage.vue | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/exception/type.js | 19 +++++++++++++++++++ ant-design-jeecg-vue/src/views/form/BasicForm.vue | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/form/advancedForm/AdvancedForm.vue | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/form/advancedForm/RepositoryForm.vue | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/form/advancedForm/TaskForm.vue | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/form/stepForm/Step1.vue | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/form/stepForm/Step2.vue | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/form/stepForm/Step3.vue | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/form/stepForm/StepForm.vue | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/FlowTest.vue | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/JeecgDemoList.vue | 404 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainList.vue | 316 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/PrintDemoList.vue | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/helloworld.vue | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/helloworld2.vue | 31 +++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/modules/JeecgDemoModal.vue | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/modules/JeecgDemoTabsModal.vue | 285 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderMainModal.vue | 304 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/modules/SuperQueryModal.vue | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderCustomerList.vue | 293 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderDMainList.vue | 347 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderTicketList.vue | 273 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue | 383 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderDMainModal.vue | 304 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderTicketModal.vue | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/list/CardList.vue | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/list/PermissionList.vue | 272 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/list/RoleList.vue | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/list/StandardList.vue | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/list/TableInnerEditList.vue | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/list/TableList.vue | 337 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/list/UserList.vue | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/list/modules/RoleModal.vue | 203 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/list/search/SearchLayout.vue | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/profile/advanced/Advanced.vue | 342 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/profile/basic/Index.vue | 255 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/result/Error.vue | 45 +++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/result/Result.vue | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/result/Success.vue | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/DepartList.vue | 417 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/DepartList2.vue | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/DictList.vue | 460 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/LogList.vue | 260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/PermissionList.vue | 256 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/QuartzJobList.vue | 365 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/RoleList.vue | 327 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/SysAnnouncementList.vue | 406 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/UserList.vue | 502 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/DepartModal.vue | 194 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/DepartWindow.vue | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/DictItemModal.vue | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/DictModal.vue | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/PasswordModal.vue | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/PermissionModal.vue | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/QuartzJobModal.vue | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/RoleModal.vue | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/SysAnnouncementModal.vue | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/UserModal.vue | 378 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/UserRoleModal.vue | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/icon/Icon.less | 35 +++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/icon/Icons.vue | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/user/Login.vue | 317 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/user/Register.vue | 316 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/user/RegisterResult.vue | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/vue.config.js | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/yarn.lock | 9448 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/docs/- 项目说明 | 11 +++++++++++ jeecg-boot/docs/db/sys-init-20190225.sql | 1342 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/pom.xml | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/JeecgApplication.java | 16 ++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/JeecgCodeGenerator.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/api/vo/Result.java | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/AutoLog.java | 36 ++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/constant/CommonConstant.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/constant/CommonSendStatus.java | 15 +++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/exception/JeecgBootException.java | 19 +++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java | 12 ++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/system/controller/CommonController.java | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/DateUtils.java | 620 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/IPUtils.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/MD5Util.java | 41 +++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/MyClassLoader.java | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/PasswordUtil.java | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/RedisUtil.java | 571 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/SpringContextUtils.java | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/oConvertUtils.java | 535 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/ObjectParseUtil.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/QueryRuleEnum.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/QueryRuleVo.java | 11 +++++++++++ jeecg-boot/src/main/java/org/jeecg/config/MybatisPlusConfig.java | 35 +++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/config/RedisConfig.java | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/config/ShiroConfig.java | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/config/Swagger2Config.java | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/config/WebMvcConfiguration.java | 33 +++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/MockController.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/permission.json | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/permission_no_page.json | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/role.json | 608 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/service.json | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/user.json | 2388 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_activity.json | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_projects.json | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_radar.json | 43 +++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_teams.json | 32 ++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/AutoController.java | 42 ++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java | 296 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderDMainController.java | 404 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderMain.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderTicket.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java | 18 ++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java | 29 +++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderMainMapper.java | 17 +++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderTicketMapper.java | 29 +++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml | 9 +++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderCustomerMapper.xml | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderMainMapper.xml | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderTicketMapper.xml | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDemoService.java | 17 +++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderCustomerService.java | 18 ++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderMainService.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderTicketService.java | 18 ++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderCustomerServiceImpl.java | 30 ++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderMainServiceImpl.java | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderTicketServiceImpl.java | 29 +++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java | 16 ++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java | 297 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/quartz/entity/QuartzJob.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java | 23 +++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/quartz/job/SampleParamJob.java | 32 ++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/quartz/mapper/QuartzJobMapper.java | 20 ++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/quartz/mapper/xml/QuartzJobMapper.xml | 9 +++++++++ jeecg-boot/src/main/java/org/jeecg/modules/quartz/service/IQuartzJobService.java | 19 +++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/quartz/service/impl/QuartzJobServiceImpl.java | 29 +++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/JwtToken.java | 28 ++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/MyRealm.java | 185 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/aop/JwtFilter.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/aop/ResourceCheckFilter.java | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/util/JwtUtil.java | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/DefContants.java | 7 +++++++ jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/ResponseBean.java | 42 ++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/UserBean.java | 13 +++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/shiro/web/TestWebController.java | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/FindsDepartsChildrenUtil.java | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/LoginController.java | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java | 190 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictController.java | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysLogController.java | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java | 408 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java | 233 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysUserController.java | 283 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysAnnouncement.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDepart.java | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDict.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDictItem.java | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysLog.java | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermission.java | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRole.java | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRolePermission.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUser.java | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementMapper.java | 17 +++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java | 20 ++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java | 16 ++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java | 24 ++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysLogMapper.java | 42 ++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java | 28 ++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java | 17 +++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysRolePermissionMapper.java | 16 ++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java | 21 +++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java | 21 +++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementMapper.xml | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml | 4 ++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictItemMapper.xml | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml | 19 +++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysLogMapper.xml | 25 +++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml | 10 ++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java | 344 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDictTree.java | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysLoginModel.java | 37 +++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java | 304 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeModel.java | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeSelectModel.java | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java | 14 ++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java | 16 ++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictService.java | 20 ++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysLogService.java | 43 +++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionService.java | 34 ++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysRolePermissionService.java | 23 +++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysRoleService.java | 22 ++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java | 16 ++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserService.java | 40 ++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java | 19 +++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysBaseAPI.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictItemServiceImpl.java | 20 ++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java | 37 +++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java | 42 ++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysRoleServiceImpl.java | 27 +++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java | 20 ++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/application.yml | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/banner.txt | 7 +++++++ jeecg-boot/src/main/resources/db/data-mysql.sql | 8 ++++++++ jeecg-boot/src/main/resources/db/schema-mysql.sql | 11 +++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai | 39 +++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai | 17 +++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml | 5 +++++ jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai | 14 ++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai | 19 +++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/entity/${entityPackage}/${entityName}.javai | 39 +++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/${entityName}Mapper.javai | 17 +++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/xml/${entityName}Mapper.xml | 5 +++++ jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/I${entityName}Service.javai | 14 ++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/impl/${entityName}ServiceImpl.javai | 19 +++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/${entityName}List.vuei | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal.vuei | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai | 39 +++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai | 27 +++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml | 5 +++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai | 41 +++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/jeecg_config.properties | 30 ++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/jeecg_database.properties | 27 +++++++++++++++++++++++++++ jeecg-boot/src/main/resources/logback-spring.xml | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/static/demo1.html | 1 + jeecg-boot/src/main/resources/static/view/userlist.html | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/templates/demo3.ftl | 17 +++++++++++++++++ jeecg-boot/src/test/java/org/jeecg/SampleTest.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 383 files changed, 60642 insertions(+), 27 deletions(-) create mode 100644 ant-design-jeecg-vue/.editorconfig create mode 100644 ant-design-jeecg-vue/.gitattributes create mode 100644 ant-design-jeecg-vue/.gitignore create mode 100644 ant-design-jeecg-vue/.prettierrc create mode 100644 ant-design-jeecg-vue/LICENSE create mode 100644 ant-design-jeecg-vue/README.md create mode 100644 ant-design-jeecg-vue/babel.config.js create mode 100644 ant-design-jeecg-vue/idea.config.js create mode 100644 ant-design-jeecg-vue/package.json create mode 100644 ant-design-jeecg-vue/public/avatar2.jpg create mode 100644 ant-design-jeecg-vue/public/color.less create mode 100644 ant-design-jeecg-vue/public/index.html create mode 100644 ant-design-jeecg-vue/public/logo.png create mode 100644 ant-design-jeecg-vue/public/v2.js create mode 100644 ant-design-jeecg-vue/src/App.vue create mode 100644 ant-design-jeecg-vue/src/api/api.js create mode 100644 ant-design-jeecg-vue/src/api/index.js create mode 100644 ant-design-jeecg-vue/src/api/login.js create mode 100644 ant-design-jeecg-vue/src/api/manage.js create mode 100644 ant-design-jeecg-vue/src/assets/background.svg create mode 100644 ant-design-jeecg-vue/src/assets/less/index.less create mode 100644 ant-design-jeecg-vue/src/assets/logo.png create mode 100644 ant-design-jeecg-vue/src/assets/logo.svg create mode 100644 ant-design-jeecg-vue/src/components/AvatarList/Item.vue create mode 100644 ant-design-jeecg-vue/src/components/AvatarList/List.vue create mode 100644 ant-design-jeecg-vue/src/components/AvatarList/index.js create mode 100644 ant-design-jeecg-vue/src/components/AvatarList/index.less create mode 100644 ant-design-jeecg-vue/src/components/ChartCard.vue create mode 100644 ant-design-jeecg-vue/src/components/CountDown/CountDown.vue create mode 100644 ant-design-jeecg-vue/src/components/CountDown/index.js create mode 100644 ant-design-jeecg-vue/src/components/Ellipsis/Ellipsis.vue create mode 100644 ant-design-jeecg-vue/src/components/Ellipsis/index.js create mode 100644 ant-design-jeecg-vue/src/components/NumberInfo/NumberInfo.vue create mode 100644 ant-design-jeecg-vue/src/components/NumberInfo/index.js create mode 100644 ant-design-jeecg-vue/src/components/NumberInfo/index.less create mode 100644 ant-design-jeecg-vue/src/components/Trend/Trend.vue create mode 100644 ant-design-jeecg-vue/src/components/Trend/index.js create mode 100644 ant-design-jeecg-vue/src/components/Trend/index.less create mode 100644 ant-design-jeecg-vue/src/components/_util/StringUtil.js create mode 100644 ant-design-jeecg-vue/src/components/_util/util.js create mode 100644 ant-design-jeecg-vue/src/components/chart/Bar.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/Liquid.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/MiniArea.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/MiniBar.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/MiniProgress.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/Radar.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/RankList.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/TransferBar.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/Trend.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/chart.scss create mode 100644 ant-design-jeecg-vue/src/components/dict/DictSelectTag.vue create mode 100644 ant-design-jeecg-vue/src/components/dict/DictSelectUtil.js create mode 100644 ant-design-jeecg-vue/src/components/dict/README.md create mode 100644 ant-design-jeecg-vue/src/components/dict/UserInfoTag.vue create mode 100644 ant-design-jeecg-vue/src/components/dict/index.js create mode 100644 ant-design-jeecg-vue/src/components/index.less create mode 100644 ant-design-jeecg-vue/src/components/jeecg/JDate.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecg/README.md create mode 100644 ant-design-jeecg-vue/src/components/layouts/BasicLayout.vue create mode 100644 ant-design-jeecg-vue/src/components/layouts/BlankLayout.vue create mode 100644 ant-design-jeecg-vue/src/components/layouts/IframePageView.vue create mode 100644 ant-design-jeecg-vue/src/components/layouts/PageView.vue create mode 100644 ant-design-jeecg-vue/src/components/layouts/RouteView.vue create mode 100644 ant-design-jeecg-vue/src/components/layouts/TabLayout.vue create mode 100644 ant-design-jeecg-vue/src/components/layouts/UserLayout.vue create mode 100644 ant-design-jeecg-vue/src/components/layouts/index.js create mode 100644 ant-design-jeecg-vue/src/components/menu/Contextmenu.vue create mode 100644 ant-design-jeecg-vue/src/components/menu/SideMenu.vue create mode 100644 ant-design-jeecg-vue/src/components/menu/index.js create mode 100644 ant-design-jeecg-vue/src/components/page/GlobalFooter.vue create mode 100644 ant-design-jeecg-vue/src/components/page/GlobalHeader.vue create mode 100644 ant-design-jeecg-vue/src/components/page/GlobalLayout.vue create mode 100644 ant-design-jeecg-vue/src/components/page/PageHeader.vue create mode 100644 ant-design-jeecg-vue/src/components/page/PageLayout.vue create mode 100644 ant-design-jeecg-vue/src/components/page/SHeaderNotice.vue create mode 100644 ant-design-jeecg-vue/src/components/setting/SettingDrawer.vue create mode 100644 ant-design-jeecg-vue/src/components/setting/SettingItem.vue create mode 100644 ant-design-jeecg-vue/src/components/table/README.md create mode 100644 ant-design-jeecg-vue/src/components/table/StandardTable.vue create mode 100644 ant-design-jeecg-vue/src/components/table/index.js create mode 100644 ant-design-jeecg-vue/src/components/tools/Breadcrumb.vue create mode 100644 ant-design-jeecg-vue/src/components/tools/DetailList.vue create mode 100644 ant-design-jeecg-vue/src/components/tools/FooterToolBar.vue create mode 100644 ant-design-jeecg-vue/src/components/tools/HeadInfo.vue create mode 100644 ant-design-jeecg-vue/src/components/tools/HeaderNotice.vue create mode 100644 ant-design-jeecg-vue/src/components/tools/Logo.vue create mode 100644 ant-design-jeecg-vue/src/components/tools/TwoStepCaptcha.vue create mode 100644 ant-design-jeecg-vue/src/components/tools/UserMenu.vue create mode 100644 ant-design-jeecg-vue/src/components/tools/setting.js create mode 100644 ant-design-jeecg-vue/src/config/router.config.js create mode 100644 ant-design-jeecg-vue/src/defaultSettings.js create mode 100644 ant-design-jeecg-vue/src/main.js create mode 100644 ant-design-jeecg-vue/src/permission.js create mode 100644 ant-design-jeecg-vue/src/router/README.md create mode 100644 ant-design-jeecg-vue/src/router/index.js create mode 100644 ant-design-jeecg-vue/src/store/getters.js create mode 100644 ant-design-jeecg-vue/src/store/index.js create mode 100644 ant-design-jeecg-vue/src/store/modules/app.js create mode 100644 ant-design-jeecg-vue/src/store/modules/permission.js create mode 100644 ant-design-jeecg-vue/src/store/modules/user.js create mode 100644 ant-design-jeecg-vue/src/store/mutation-types.js create mode 100644 ant-design-jeecg-vue/src/utils/auth.js create mode 100644 ant-design-jeecg-vue/src/utils/axios.js create mode 100644 ant-design-jeecg-vue/src/utils/device.js create mode 100644 ant-design-jeecg-vue/src/utils/filter.js create mode 100644 ant-design-jeecg-vue/src/utils/hasPermission.js create mode 100644 ant-design-jeecg-vue/src/utils/mixin.js create mode 100644 ant-design-jeecg-vue/src/utils/permissions.js create mode 100644 ant-design-jeecg-vue/src/utils/request.js create mode 100644 ant-design-jeecg-vue/src/utils/storage.js create mode 100644 ant-design-jeecg-vue/src/utils/util.js create mode 100644 ant-design-jeecg-vue/src/views/404.vue create mode 100644 ant-design-jeecg-vue/src/views/Home.vue create mode 100644 ant-design-jeecg-vue/src/views/account/center/Index.vue create mode 100644 ant-design-jeecg-vue/src/views/account/center/page/App.vue create mode 100644 ant-design-jeecg-vue/src/views/account/center/page/Article.vue create mode 100644 ant-design-jeecg-vue/src/views/account/center/page/Project.vue create mode 100644 ant-design-jeecg-vue/src/views/account/center/page/index.js create mode 100644 ant-design-jeecg-vue/src/views/account/settings/AvatarModal.vue create mode 100644 ant-design-jeecg-vue/src/views/account/settings/BaseSetting.vue create mode 100644 ant-design-jeecg-vue/src/views/account/settings/Binding.vue create mode 100644 ant-design-jeecg-vue/src/views/account/settings/Custom.vue create mode 100644 ant-design-jeecg-vue/src/views/account/settings/Index.vue create mode 100644 ant-design-jeecg-vue/src/views/account/settings/Notification.vue create mode 100644 ant-design-jeecg-vue/src/views/account/settings/Security.vue create mode 100644 ant-design-jeecg-vue/src/views/dashboard/Analysis.vue create mode 100644 ant-design-jeecg-vue/src/views/dashboard/Monitor.vue create mode 100644 ant-design-jeecg-vue/src/views/dashboard/Workplace.vue create mode 100644 ant-design-jeecg-vue/src/views/exception/403.vue create mode 100644 ant-design-jeecg-vue/src/views/exception/404.vue create mode 100644 ant-design-jeecg-vue/src/views/exception/500.vue create mode 100644 ant-design-jeecg-vue/src/views/exception/ExceptionPage.vue create mode 100644 ant-design-jeecg-vue/src/views/exception/type.js create mode 100644 ant-design-jeecg-vue/src/views/form/BasicForm.vue create mode 100644 ant-design-jeecg-vue/src/views/form/advancedForm/AdvancedForm.vue create mode 100644 ant-design-jeecg-vue/src/views/form/advancedForm/RepositoryForm.vue create mode 100644 ant-design-jeecg-vue/src/views/form/advancedForm/TaskForm.vue create mode 100644 ant-design-jeecg-vue/src/views/form/stepForm/Step1.vue create mode 100644 ant-design-jeecg-vue/src/views/form/stepForm/Step2.vue create mode 100644 ant-design-jeecg-vue/src/views/form/stepForm/Step3.vue create mode 100644 ant-design-jeecg-vue/src/views/form/stepForm/StepForm.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/FlowTest.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/JeecgDemoList.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainList.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/PrintDemoList.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/helloworld.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/helloworld2.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/modules/JeecgDemoModal.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/modules/JeecgDemoTabsModal.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderMainModal.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/modules/SuperQueryModal.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderCustomerList.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderDMainList.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderTicketList.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderDMainModal.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderTicketModal.vue create mode 100644 ant-design-jeecg-vue/src/views/list/CardList.vue create mode 100644 ant-design-jeecg-vue/src/views/list/PermissionList.vue create mode 100644 ant-design-jeecg-vue/src/views/list/RoleList.vue create mode 100644 ant-design-jeecg-vue/src/views/list/StandardList.vue create mode 100644 ant-design-jeecg-vue/src/views/list/TableInnerEditList.vue create mode 100644 ant-design-jeecg-vue/src/views/list/TableList.vue create mode 100644 ant-design-jeecg-vue/src/views/list/UserList.vue create mode 100644 ant-design-jeecg-vue/src/views/list/modules/RoleModal.vue create mode 100644 ant-design-jeecg-vue/src/views/list/search/SearchLayout.vue create mode 100644 ant-design-jeecg-vue/src/views/profile/advanced/Advanced.vue create mode 100644 ant-design-jeecg-vue/src/views/profile/basic/Index.vue create mode 100644 ant-design-jeecg-vue/src/views/result/Error.vue create mode 100644 ant-design-jeecg-vue/src/views/result/Result.vue create mode 100644 ant-design-jeecg-vue/src/views/result/Success.vue create mode 100644 ant-design-jeecg-vue/src/views/system/DepartList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/DepartList2.vue create mode 100644 ant-design-jeecg-vue/src/views/system/DictList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/LogList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/PermissionList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/QuartzJobList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/RoleList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/SysAnnouncementList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/UserList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/DepartModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/DepartWindow.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/DictItemModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/DictModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/PasswordModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/PermissionModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/QuartzJobModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/RoleModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/SysAnnouncementModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/UserModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/UserRoleModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/icon/Icon.less create mode 100644 ant-design-jeecg-vue/src/views/system/modules/icon/Icons.vue create mode 100644 ant-design-jeecg-vue/src/views/user/Login.vue create mode 100644 ant-design-jeecg-vue/src/views/user/Register.vue create mode 100644 ant-design-jeecg-vue/src/views/user/RegisterResult.vue create mode 100644 ant-design-jeecg-vue/vue.config.js create mode 100644 ant-design-jeecg-vue/yarn.lock create mode 100644 jeecg-boot/docs/- 项目说明 create mode 100644 jeecg-boot/docs/db/sys-init-20190225.sql create mode 100644 jeecg-boot/pom.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/JeecgApplication.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/JeecgCodeGenerator.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/api/vo/Result.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/AutoLog.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/constant/CommonConstant.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/constant/CommonSendStatus.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/exception/JeecgBootException.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/system/controller/CommonController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/DateUtils.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/IPUtils.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/MD5Util.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/MyClassLoader.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/PasswordUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/RedisUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/SpringContextUtils.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/oConvertUtils.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/ObjectParseUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/QueryRuleEnum.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/QueryRuleVo.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/config/MybatisPlusConfig.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/config/RedisConfig.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/config/ShiroConfig.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/config/Swagger2Config.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/config/WebMvcConfiguration.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/MockController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/permission.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/permission_no_page.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/role.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/service.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/user.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_activity.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_projects.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_radar.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_teams.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/AutoController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderDMainController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderMain.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderTicket.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderMainMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderTicketMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderCustomerMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderMainMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderTicketMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDemoService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderCustomerService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderMainService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderTicketService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderCustomerServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderMainServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderTicketServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/quartz/entity/QuartzJob.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/quartz/job/SampleParamJob.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/quartz/mapper/QuartzJobMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/quartz/mapper/xml/QuartzJobMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/quartz/service/IQuartzJobService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/quartz/service/impl/QuartzJobServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/JwtToken.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/MyRealm.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/aop/JwtFilter.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/aop/ResourceCheckFilter.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/util/JwtUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/DefContants.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/ResponseBean.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/UserBean.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/shiro/web/TestWebController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/FindsDepartsChildrenUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/LoginController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysLogController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysUserController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysAnnouncement.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDepart.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDict.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDictItem.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysLog.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermission.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRole.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRolePermission.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUser.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysLogMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysRolePermissionMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictItemMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysLogMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDictTree.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysLoginModel.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeModel.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeSelectModel.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysLogService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysRolePermissionService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysRoleService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysBaseAPI.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictItemServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysRoleServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java create mode 100644 jeecg-boot/src/main/resources/application.yml create mode 100644 jeecg-boot/src/main/resources/banner.txt create mode 100644 jeecg-boot/src/main/resources/db/data-mysql.sql create mode 100644 jeecg-boot/src/main/resources/db/schema-mysql.sql create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/entity/${entityPackage}/${entityName}.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/${entityName}Mapper.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/I${entityName}Service.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/${entityName}List.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/jeecg_config.properties create mode 100644 jeecg-boot/src/main/resources/jeecg/jeecg_database.properties create mode 100644 jeecg-boot/src/main/resources/logback-spring.xml create mode 100644 jeecg-boot/src/main/resources/static/demo1.html create mode 100644 jeecg-boot/src/main/resources/static/view/userlist.html create mode 100644 jeecg-boot/src/main/resources/templates/demo3.ftl create mode 100644 jeecg-boot/src/test/java/org/jeecg/SampleTest.java diff --git a/README.md b/README.md index 0120da5..1794318 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,227 @@ -# jeecg-boot +Jeecg-Boot 快速开发平台(前后端分离版本) +=============== -#### 项目介绍 -{**以下是码云平台说明,您可以替换为您的项目简介** -码云是开源中国推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用码云实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} +当前最新版本: 1.0(发布日期:20190304) -#### 软件架构 -软件架构说明 +项目介绍: +----------------------------------- +Jeecg-boot 是一款企业级快速开发平台!采用前后端分离技术:SpringBoot,Mybatis-plus,Shiro,JWT,Vue & Ant Design。提供强大的代码生成器, +前端页面代码和后端代码一键生成,不需要写任何代码,保持jeecg一贯的强大,绝对是全栈开发者福音!! +JeecgBoot的宗旨是降低前后端分离的开发成本,提高UI能力的同时,提高开发效率,追求更高的能力,No代码概念,一系列智能化在线开发。 -#### 安装教程 +技术架构: +----------------------------------- -1. xxxx -2. xxxx -3. xxxx +#### 后端 +- 基础框架:Spring Boot 2.0.3.RELEASE -#### 使用说明 +- 持久层框架:Mybatis-plus_3.0.6 -1. xxxx -2. xxxx -3. xxxx +- 安全框架:Apache Shiro 1.4.0-RC2,Jwt_3.4.1 -#### 参与贡献 +- 数据库连接池:阿里巴巴Druid 1.1.10 -1. Fork 本项目 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request +- 缓存框架:redis +- 日志打印:logback -#### 码云特技 +- 其他:fastjson,poi,Swagger-ui,quartz, lombok(简化代码)等。 -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 -5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) \ No newline at end of file + +#### 前端 + +- [Vue 2.5.22](https://cn.vuejs.org/),[Vuex](https://vuex.vuejs.org/zh/),[Vue Router](https://router.vuejs.org/zh/) +- [Axios](https://github.com/axios/axios) +- [ant-design-vue](https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/) +- [webpack](https://www.webpackjs.com/),[yarn](https://yarnpkg.com/zh-Hans/) +- [vue-cropper](https://github.com/xyxiao001/vue-cropper) - 头像裁剪组件 +- [@antv/g2](https://antv.alipay.com/zh-cn/index.html) - Alipay AntV 数据可视化图表 +- [Viser-vue](https://viserjs.github.io/docs.html#/viser/guide/installation) - antv/g2 封装实现 +- eslint,[@vue/cli 3.2.1](https://cli.vuejs.org/zh/guide) + + +#### 开发环境 + +- 语言:Java 8 + +- IDE: Eclipse安装lombok插件 或者 IDEA + +- 依赖管理:Maven + +- 数据库:MySQL5.0 & Oracle 11g + +- 缓存:Redis + + + +#### 技术文档 + +- 在线演示 : [http://boot.jeecg.org](http://boot.jeecg.org) + +- 官方文档 : [http://jeecg-boot.mydoc.io](http://jeecg-boot.mydoc.io) + +- 常见问题 : [http://www.jeecg.org/forum.php?mod=viewthread&tid=7816&page=1&extra=#pid21237](http://www.jeecg.org/forum.php?mod=viewthread&tid=7816&page=1&extra=#pid21237) + +- QQ交流群 : 284271917 + +- 视频教程 : https://pan.baidu.com/s/1Il0TS50I70vH1AG1y40wtw 提取码:hok5 + +- 开发工具 : https://pan.baidu.com/s/1kFIJcn5GSlSJWAQKeCowrg 提取码:ilmc + + + +### 功能模块 +``` +├─系统管理 +│ ├─用户管理 +│ ├─角色管理 +│ ├─菜单管理(权限设置) +│ ├─部门管理 +│ └─字典管理 +├─智能化功能 +│ ├─代码生成器功能(一键生成,包括前端页面也可以生成,绝对是后端开发福音) +├─系统监控 +│ ├─定时任务 +│ ├─系统日志 +│ ├─系统通知 +│ ├─SQL监控 +│ ├─swagger-ui(在线接口文档) +│─常用示例 +│ ├─单表模型例子 +│ └─一对多模型例子 +│ └─打印例子 +│ └─一对多TAB例子 +│─更多页面模板 +│ ├─各种高级表单 +│ ├─各种列表效果 +│ └─结果页面 +│ └─异常页面 +│ └─个人页面 +└─其他模块 + └─其他 + +``` + + + +系统效果 +---- + + + + + + + + + + + + + + + + + +后台开发环境和依赖 +---- +- java +- maven +- jdk8 +- mysql +- redis +- 数据库脚步:jeecg-boot\docs\dbsys-init-20190225.sql +- 默认登录账号: admin/123456 + + +前端开发环境和依赖 +---- +- node +- yarn +- webpack +- eslint +- @vue/cli 3.2.1 +- [ant-design-vue](https://github.com/vueComponent/ant-design-vue) - Ant Design Of Vue 实现 +- [vue-cropper](https://github.com/xyxiao001/vue-cropper) - 头像裁剪组件 +- [@antv/g2](https://antv.alipay.com/zh-cn/index.html) - Alipay AntV 数据可视化图表 +- [Viser-vue](https://viserjs.github.io/docs.html#/viser/guide/installation) - antv/g2 封装实现 + + + +项目下载和运行 +---- + +- 拉取项目代码 +```bash +git clone https://github.com/zhangdaiscott/jeecg-boot.git +cd jeecg-boot/ant-design-jeecg-vue +``` + +1. 安装node.js +2. 切换到ant-design-jeecg-vue文件夹下 +``` +# 安装yarn +npm install -g yarn + +# 下载依赖 +yarn install + +# 启动 +yarn run serve + +# 编译项目 +yarn run build + +# Lints and fixes files +yarn run lint +``` + + + +其他说明 +---- + +- 项目使用的 [vue-cli3](https://cli.vuejs.org/guide/), 请更新您的 cli + +- 关闭 Eslint (不推荐) 移除 `package.json` 中 `eslintConfig` 整个节点代码 + +- 修改 Ant Design 配色,在文件 `vue.config.js` 中,其他 less 变量覆盖参考 [ant design](https://ant.design/docs/react/customize-theme-cn) 官方说明 +```ecmascript 6 + css: { + loaderOptions: { + less: { + modifyVars: { + /* less 变量覆盖,用于自定义 ant design 主题 */ + + 'primary-color': '#F5222D', + 'link-color': '#F5222D', + 'border-radius-base': '4px', + }, + javascriptEnabled: true, + } + } + } +``` + + + +附属文档 +---- +- [Ant Design Vue](https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn) + +- [报表 viser-vue](https://viserjs.github.io/demo.html#/viser/bar/basic-bar) + +- [Vue](https://cn.vuejs.org/v2/guide) + +- [路由/菜单说明](https://github.com/zhangdaiscott/jeecg-boot/tree/master/ant-design-jeecg-vue/src/router/README.md) + +- [ANTD 默认配置项](https://github.com/zhangdaiscott/jeecg-boot/tree/master/ant-design-jeecg-vue/src/defaultSettings.js) + +- 其他待补充... + + +备注 +---- + +> @vue/cli 升级后,eslint 规则更新了。由于影响到全部 .vue 文件,需要逐个验证。既暂时关闭部分原本不验证的规则,后期维护时,在逐步修正这些 rules \ No newline at end of file diff --git a/ant-design-jeecg-vue/.editorconfig b/ant-design-jeecg-vue/.editorconfig new file mode 100644 index 0000000..3e26fbb --- /dev/null +++ b/ant-design-jeecg-vue/.editorconfig @@ -0,0 +1,39 @@ +[*] +charset=utf-8 +end_of_line=crlf +insert_final_newline=false +indent_style=space +indent_size=2 + +[{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}] +indent_style=space +indent_size=2 + +[{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}] +indent_style=space +indent_size=2 + +[{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}] +indent_style=space +indent_size=2 + +[*.svg] +indent_style=space +indent_size=2 + +[*.js.map] +indent_style=space +indent_size=2 + +[*.less] +indent_style=space +indent_size=2 + +[*.vue] +indent_style=space +indent_size=2 + +[{.analysis_options,*.yml,*.yaml}] +indent_style=space +indent_size=2 + diff --git a/ant-design-jeecg-vue/.gitattributes b/ant-design-jeecg-vue/.gitattributes new file mode 100644 index 0000000..e507319 --- /dev/null +++ b/ant-design-jeecg-vue/.gitattributes @@ -0,0 +1 @@ +public/* linguist-vendored \ No newline at end of file diff --git a/ant-design-jeecg-vue/.gitignore b/ant-design-jeecg-vue/.gitignore new file mode 100644 index 0000000..185e663 --- /dev/null +++ b/ant-design-jeecg-vue/.gitignore @@ -0,0 +1,21 @@ +.DS_Store +node_modules +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw* diff --git a/ant-design-jeecg-vue/.prettierrc b/ant-design-jeecg-vue/.prettierrc new file mode 100644 index 0000000..cbe842a --- /dev/null +++ b/ant-design-jeecg-vue/.prettierrc @@ -0,0 +1,5 @@ +{ + "printWidth": 120, + "semi": false, + "singleQuote": true +} diff --git a/ant-design-jeecg-vue/LICENSE b/ant-design-jeecg-vue/LICENSE new file mode 100644 index 0000000..66eef0b --- /dev/null +++ b/ant-design-jeecg-vue/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Anan Yang + +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/ant-design-jeecg-vue/README.md b/ant-design-jeecg-vue/README.md new file mode 100644 index 0000000..e8835f0 --- /dev/null +++ b/ant-design-jeecg-vue/README.md @@ -0,0 +1,104 @@ +Jeecg-Boot 快速开发平台(前后端分离版本) +=============== + +当前最新版本: 1.0(发布日期:20190225) + +项目介绍: +----------------------------------- +Jeecg-boot 一个全新的版本,采用前后端分离方案,提供强大代码生成器的快速开发平台。 +前端页面代码和后端功能代码一键生成,不需要写任何代码,保持jeecg一贯的强大!! + + + +#### 前端技术 + +- 基础框架:[ant-design-vue](https://github.com/vueComponent/ant-design-vue) - Ant Design Of Vue 实现 +- JavaScript框架:Vue +- Webpack +- node +- yarn +- eslint +- @vue/cli 3.2.1 +- [vue-cropper](https://github.com/xyxiao001/vue-cropper) - 头像裁剪组件 +- [@antv/g2](https://antv.alipay.com/zh-cn/index.html) - Alipay AntV 数据可视化图表 +- [Viser-vue](https://viserjs.github.io/docs.html#/viser/guide/installation) - antv/g2 封装实现 + + + +项目下载和运行 +---- + +- 拉取项目代码 +```bash +git clone https://github.com/zhangdaiscott/jeecg-boot.git +cd jeecg-boot/ant-design-jeecg-vue +``` + +- 安装依赖 +``` +yarn install +``` + +- 开发模式运行 +``` +yarn run serve +``` + +- 编译项目 +``` +yarn run build +``` + +- Lints and fixes files +``` +yarn run lint +``` + + + +其他说明 +---- + +- 项目使用的 [vue-cli3](https://cli.vuejs.org/guide/), 请更新您的 cli + +- 关闭 Eslint (不推荐) 移除 `package.json` 中 `eslintConfig` 整个节点代码 + +- 修改 Ant Design 配色,在文件 `vue.config.js` 中,其他 less 变量覆盖参考 [ant design](https://ant.design/docs/react/customize-theme-cn) 官方说明 +```ecmascript 6 + css: { + loaderOptions: { + less: { + modifyVars: { + /* less 变量覆盖,用于自定义 ant design 主题 */ + + 'primary-color': '#F5222D', + 'link-color': '#F5222D', + 'border-radius-base': '4px', + }, + javascriptEnabled: true, + } + } + } +``` + + + +附属文档 +---- +- [Ant Design Vue](https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn) + +- [报表 viser-vue](https://viserjs.github.io/demo.html#/viser/bar/basic-bar) + +- [Vue](https://cn.vuejs.org/v2/guide) + +- [路由/菜单说明](https://github.com/zhangdaiscott/jeecg-boot/tree/master/ant-design-jeecg-vue/src/router/README.md) + +- [ANTD 默认配置项](https://github.com/zhangdaiscott/jeecg-boot/tree/master/ant-design-jeecg-vue/src/defaultSettings.js) + +- 其他待补充... + + +备注 +---- + +> @vue/cli 升级后,eslint 规则更新了。由于影响到全部 .vue 文件,需要逐个验证。既暂时关闭部分原本不验证的规则,后期维护时,在逐步修正这些 rules \ No newline at end of file diff --git a/ant-design-jeecg-vue/babel.config.js b/ant-design-jeecg-vue/babel.config.js new file mode 100644 index 0000000..ba17966 --- /dev/null +++ b/ant-design-jeecg-vue/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/app' + ] +} diff --git a/ant-design-jeecg-vue/idea.config.js b/ant-design-jeecg-vue/idea.config.js new file mode 100644 index 0000000..4d86bd9 --- /dev/null +++ b/ant-design-jeecg-vue/idea.config.js @@ -0,0 +1,24 @@ +'use strict' +const path = require('path') + +function resolve (dir) { + return path.join(__dirname, '.', dir) +} + +module.exports = { + context: path.resolve(__dirname, './'), + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + 'config': resolve('config'), + '@': resolve('src'), + '@views': resolve('src/views'), + '@comp': resolve('src/components'), + '@core': resolve('src/core'), + '@utils': resolve('src/utils'), + '@entry': resolve('src/entry'), + '@router': resolve('src/router'), + '@store': resolve('src/store') + } + }, +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/package.json b/ant-design-jeecg-vue/package.json new file mode 100644 index 0000000..6d6baff --- /dev/null +++ b/ant-design-jeecg-vue/package.json @@ -0,0 +1,98 @@ +{ + "name": "vue-antd-pro", + "version": "1.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve --open", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint", + "test:unit": "vue-cli-service test:unit", + "test:e2e": "vue-cli-service test:e2e" + }, + "dependencies": { + "@antv/data-set": "^0.10.1", + "ant-design-vue": "^1.3.1", + "axios": "^0.18.0", + "dayjs": "^1.8.0", + "enquire.js": "^2.1.6", + "js-cookie": "^2.2.0", + "lodash.get": "^4.4.2", + "lodash.pick": "^4.4.0", + "md5": "^2.2.1", + "nprogress": "^0.2.0", + "viser-vue": "^2.4.4", + "vue": "^2.5.22", + "vue-class-component": "^6.0.0", + "vue-cropper": "^0.4.8", + "vue-i18n": "^8.7.0", + "vue-ls": "^3.2.0", + "vue-print-nb": "^1.0.3", + "vue-property-decorator": "^7.3.0", + "vue-router": "^3.0.1", + "vuex": "^3.0.1", + "vuex-class": "^0.3.1" + }, + "devDependencies": { + "@babel/polyfill": "^7.2.5", + "@vue/cli-plugin-babel": "^3.3.0", + "@vue/cli-plugin-eslint": "^3.3.0", + "@vue/cli-service": "^3.3.0", + "@vue/eslint-config-standard": "^4.0.0", + "babel-eslint": "^10.0.1", + "eslint": "^5.12.0", + "eslint-plugin-vue": "^5.1.0", + "less": "^3.8.1", + "less-loader": "^4.1.0", + "node-sass": "^4.11.0", + "sass-loader": "^7.0.1", + "vue-template-compiler": "^2.5.22" + }, + "eslintConfig": { + "root": true, + "env": { + "node": true + }, + "extends": [ + "plugin:vue/strongly-recommended", + "eslint:recommended" + ], + "parserOptions": { + "parser": "babel-eslint" + }, + "rules": { + "generator-star-spacing": "off", + "no-mixed-operators": 0, + "vue/max-attributes-per-line": [ + 2, + { + "singleline": 5, + "multiline": { + "max": 1, + "allowFirstLine": false + } + } + ], + "vue/attribute-hyphenation": 0, + "vue/html-self-closing": 0, + "vue/component-name-in-template-casing": 0, + "vue/html-closing-bracket-spacing": 0, + "vue/singleline-html-element-content-newline": 0, + "vue/no-unused-components": 0, + "vue/multiline-html-element-content-newline": 0, + "vue/no-use-v-if-with-v-for": 0, + "vue/html-closing-bracket-newline": 0, + "vue/no-parsing-error": 0, + "no-console": 0 + } + }, + "postcss": { + "plugins": { + "autoprefixer": {} + } + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ] +} diff --git a/ant-design-jeecg-vue/public/avatar2.jpg b/ant-design-jeecg-vue/public/avatar2.jpg new file mode 100644 index 0000000..9adb2d1 Binary files /dev/null and b/ant-design-jeecg-vue/public/avatar2.jpg differ diff --git a/ant-design-jeecg-vue/public/color.less b/ant-design-jeecg-vue/public/color.less new file mode 100644 index 0000000..c7e6b1b --- /dev/null +++ b/ant-design-jeecg-vue/public/color.less @@ -0,0 +1,7684 @@ +@primary-color: #1890ff; +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable */ +.bezierEasingMixin() { + @functions: ~`(function() { + var NEWTON_ITERATIONS = 4; + var NEWTON_MIN_SLOPE = 0.001; + var SUBDIVISION_PRECISION = 0.0000001; + var SUBDIVISION_MAX_ITERATIONS = 10; + + var kSplineTableSize = 11; + var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0); + + var float32ArraySupported = typeof Float32Array === 'function'; + + function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; } + function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; } + function C (aA1) { return 3.0 * aA1; } + + // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. + function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; } + + // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. + function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); } + + function binarySubdivide (aX, aA, aB, mX1, mX2) { + var currentX, currentT, i = 0; + do { + currentT = aA + (aB - aA) / 2.0; + currentX = calcBezier(currentT, mX1, mX2) - aX; + if (currentX > 0.0) { + aB = currentT; + } else { + aA = currentT; + } + } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); + return currentT; + } + + function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) { + for (var i = 0; i < NEWTON_ITERATIONS; ++i) { + var currentSlope = getSlope(aGuessT, mX1, mX2); + if (currentSlope === 0.0) { + return aGuessT; + } + var currentX = calcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + return aGuessT; + } + + var BezierEasing = function (mX1, mY1, mX2, mY2) { + if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) { + throw new Error('bezier x values must be in [0, 1] range'); + } + + // Precompute samples table + var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize); + if (mX1 !== mY1 || mX2 !== mY2) { + for (var i = 0; i < kSplineTableSize; ++i) { + sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2); + } + } + + function getTForX (aX) { + var intervalStart = 0.0; + var currentSample = 1; + var lastSample = kSplineTableSize - 1; + + for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) { + intervalStart += kSampleStepSize; + } + --currentSample; + + // Interpolate to provide an initial guess for t + var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]); + var guessForT = intervalStart + dist * kSampleStepSize; + + var initialSlope = getSlope(guessForT, mX1, mX2); + if (initialSlope >= NEWTON_MIN_SLOPE) { + return newtonRaphsonIterate(aX, guessForT, mX1, mX2); + } else if (initialSlope === 0.0) { + return guessForT; + } else { + return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2); + } + } + + return function BezierEasing (x) { + if (mX1 === mY1 && mX2 === mY2) { + return x; // linear + } + // Because JavaScript number are imprecise, we should guarantee the extremes are right. + if (x === 0) { + return 0; + } + if (x === 1) { + return 1; + } + return calcBezier(getTForX(x), mY1, mY2); + }; + }; + + this.colorEasing = BezierEasing(0.26, 0.09, 0.37, 0.18); + // less 3 requires a return + return ''; +})()`; +} +// It is hacky way to make this function will be compiled preferentially by less +// resolve error: `ReferenceError: colorPalette is not defined` +// https://github.com/ant-design/ant-motion/issues/44 +.bezierEasingMixin(); + +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.tinyColorMixin() { + @functions: ~`(function() { +// TinyColor v1.4.1 +// https://github.com/bgrins/TinyColor +// 2016-07-07, Brian Grinstead, MIT License +var trimLeft = /^\s+/, + trimRight = /\s+$/, + tinyCounter = 0, + mathRound = Math.round, + mathMin = Math.min, + mathMax = Math.max, + mathRandom = Math.random; + +function tinycolor (color, opts) { + + color = (color) ? color : ''; + opts = opts || { }; + + // If input is already a tinycolor, return itself + if (color instanceof tinycolor) { + return color; + } + // If we are called as a function, call using new instead + if (!(this instanceof tinycolor)) { + return new tinycolor(color, opts); + } + + var rgb = inputToRGB(color); + this._originalInput = color, + this._r = rgb.r, + this._g = rgb.g, + this._b = rgb.b, + this._a = rgb.a, + this._roundA = mathRound(100*this._a) / 100, + this._format = opts.format || rgb.format; + this._gradientType = opts.gradientType; + + // Don't let the range of [0,255] come back in [0,1]. + // Potentially lose a little bit of precision here, but will fix issues where + // .5 gets interpreted as half of the total, instead of half of 1 + // If it was supposed to be 128, this was already taken care of by inputToRgb + if (this._r < 1) { this._r = mathRound(this._r); } + if (this._g < 1) { this._g = mathRound(this._g); } + if (this._b < 1) { this._b = mathRound(this._b); } + + this._ok = rgb.ok; + this._tc_id = tinyCounter++; +} + +tinycolor.prototype = { + isDark: function() { + return this.getBrightness() < 128; + }, + isLight: function() { + return !this.isDark(); + }, + isValid: function() { + return this._ok; + }, + getOriginalInput: function() { + return this._originalInput; + }, + getFormat: function() { + return this._format; + }, + getAlpha: function() { + return this._a; + }, + getBrightness: function() { + //http://www.w3.org/TR/AERT#color-contrast + var rgb = this.toRgb(); + return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000; + }, + getLuminance: function() { + //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef + var rgb = this.toRgb(); + var RsRGB, GsRGB, BsRGB, R, G, B; + RsRGB = rgb.r/255; + GsRGB = rgb.g/255; + BsRGB = rgb.b/255; + + if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);} + if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);} + if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);} + return (0.2126 * R) + (0.7152 * G) + (0.0722 * B); + }, + setAlpha: function(value) { + this._a = boundAlpha(value); + this._roundA = mathRound(100*this._a) / 100; + return this; + }, + toHsv: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a }; + }, + toHsvString: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); + return (this._a == 1) ? + "hsv(" + h + ", " + s + "%, " + v + "%)" : + "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")"; + }, + toHsl: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a }; + }, + toHslString: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); + return (this._a == 1) ? + "hsl(" + h + ", " + s + "%, " + l + "%)" : + "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")"; + }, + toHex: function(allow3Char) { + return rgbToHex(this._r, this._g, this._b, allow3Char); + }, + toHexString: function(allow3Char) { + return '#' + this.toHex(allow3Char); + }, + toHex8: function(allow4Char) { + return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char); + }, + toHex8String: function(allow4Char) { + return '#' + this.toHex8(allow4Char); + }, + toRgb: function() { + return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a }; + }, + toRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : + "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")"; + }, + toPercentageRgb: function() { + return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a }; + }, + toPercentageRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : + "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")"; + }, + toName: function() { + if (this._a === 0) { + return "transparent"; + } + + if (this._a < 1) { + return false; + } + + return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false; + }, + toFilter: function(secondColor) { + var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a); + var secondHex8String = hex8String; + var gradientType = this._gradientType ? "GradientType = 1, " : ""; + + if (secondColor) { + var s = tinycolor(secondColor); + secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a); + } + + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; + }, + toString: function(format) { + var formatSet = !!format; + format = format || this._format; + + var formattedString = false; + var hasAlpha = this._a < 1 && this._a >= 0; + var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name"); + + if (needsAlphaFormat) { + // Special case for "transparent", all other non-alpha formats + // will return rgba when there is transparency. + if (format === "name" && this._a === 0) { + return this.toName(); + } + return this.toRgbString(); + } + if (format === "rgb") { + formattedString = this.toRgbString(); + } + if (format === "prgb") { + formattedString = this.toPercentageRgbString(); + } + if (format === "hex" || format === "hex6") { + formattedString = this.toHexString(); + } + if (format === "hex3") { + formattedString = this.toHexString(true); + } + if (format === "hex4") { + formattedString = this.toHex8String(true); + } + if (format === "hex8") { + formattedString = this.toHex8String(); + } + if (format === "name") { + formattedString = this.toName(); + } + if (format === "hsl") { + formattedString = this.toHslString(); + } + if (format === "hsv") { + formattedString = this.toHsvString(); + } + + return formattedString || this.toHexString(); + }, + clone: function() { + return tinycolor(this.toString()); + }, + + _applyModification: function(fn, args) { + var color = fn.apply(null, [this].concat([].slice.call(args))); + this._r = color._r; + this._g = color._g; + this._b = color._b; + this.setAlpha(color._a); + return this; + }, + lighten: function() { + return this._applyModification(lighten, arguments); + }, + brighten: function() { + return this._applyModification(brighten, arguments); + }, + darken: function() { + return this._applyModification(darken, arguments); + }, + desaturate: function() { + return this._applyModification(desaturate, arguments); + }, + saturate: function() { + return this._applyModification(saturate, arguments); + }, + greyscale: function() { + return this._applyModification(greyscale, arguments); + }, + spin: function() { + return this._applyModification(spin, arguments); + }, + + _applyCombination: function(fn, args) { + return fn.apply(null, [this].concat([].slice.call(args))); + }, + analogous: function() { + return this._applyCombination(analogous, arguments); + }, + complement: function() { + return this._applyCombination(complement, arguments); + }, + monochromatic: function() { + return this._applyCombination(monochromatic, arguments); + }, + splitcomplement: function() { + return this._applyCombination(splitcomplement, arguments); + }, + triad: function() { + return this._applyCombination(triad, arguments); + }, + tetrad: function() { + return this._applyCombination(tetrad, arguments); + } +}; + +// If input is an object, force 1 into "1.0" to handle ratios properly +// String input requires "1.0" as input, so 1 will be treated as 1 +tinycolor.fromRatio = function(color, opts) { + if (typeof color == "object") { + var newColor = {}; + for (var i in color) { + if (color.hasOwnProperty(i)) { + if (i === "a") { + newColor[i] = color[i]; + } + else { + newColor[i] = convertToPercentage(color[i]); + } + } + } + color = newColor; + } + + return tinycolor(color, opts); +}; + +// Given a string or object, convert that input to RGB +// Possible string inputs: +// +// "red" +// "#f00" or "f00" +// "#ff0000" or "ff0000" +// "#ff000000" or "ff000000" +// "rgb 255 0 0" or "rgb (255, 0, 0)" +// "rgb 1.0 0 0" or "rgb (1, 0, 0)" +// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" +// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" +// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" +// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" +// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" +// +function inputToRGB(color) { + + var rgb = { r: 0, g: 0, b: 0 }; + var a = 1; + var s = null; + var v = null; + var l = null; + var ok = false; + var format = false; + + if (typeof color == "string") { + color = stringInputToObject(color); + } + + if (typeof color == "object") { + if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) { + rgb = rgbToRgb(color.r, color.g, color.b); + ok = true; + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; + } + else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) { + s = convertToPercentage(color.s); + v = convertToPercentage(color.v); + rgb = hsvToRgb(color.h, s, v); + ok = true; + format = "hsv"; + } + else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) { + s = convertToPercentage(color.s); + l = convertToPercentage(color.l); + rgb = hslToRgb(color.h, s, l); + ok = true; + format = "hsl"; + } + + if (color.hasOwnProperty("a")) { + a = color.a; + } + } + + a = boundAlpha(a); + + return { + ok: ok, + format: color.format || format, + r: mathMin(255, mathMax(rgb.r, 0)), + g: mathMin(255, mathMax(rgb.g, 0)), + b: mathMin(255, mathMax(rgb.b, 0)), + a: a + }; +} + +// Conversion Functions +// -------------------- + +// rgbToHsl, rgbToHsv, hslToRgb, hsvToRgb modified from: +// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript> + +// rgbToRgb +// Handle bounds / percentage checking to conform to CSS color spec +// <http://www.w3.org/TR/css3-color/> +// *Assumes:* r, g, b in [0, 255] or [0, 1] +// *Returns:* { r, g, b } in [0, 255] +function rgbToRgb(r, g, b){ + return { + r: bound01(r, 255) * 255, + g: bound01(g, 255) * 255, + b: bound01(b, 255) * 255 + }; +} + +// rgbToHsl +// Converts an RGB color value to HSL. +// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] +// *Returns:* { h, s, l } in [0,1] +function rgbToHsl(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, l = (max + min) / 2; + + if(max == min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + h /= 6; + } + + return { h: h, s: s, l: l }; +} + +// hslToRgb +// Converts an HSL color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] +function hslToRgb(h, s, l) { + var r, g, b; + + h = bound01(h, 360); + s = bound01(s, 100); + l = bound01(l, 100); + + function hue2rgb(p, q, t) { + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s === 0) { + r = g = b = l; // achromatic + } + else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// rgbToHsv +// Converts an RGB color value to HSV +// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] +// *Returns:* { h, s, v } in [0,1] +function rgbToHsv(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, v = max; + + var d = max - min; + s = max === 0 ? 0 : d / max; + + if(max == min) { + h = 0; // achromatic + } + else { + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h, s: s, v: v }; +} + +// hsvToRgb +// Converts an HSV color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] + function hsvToRgb(h, s, v) { + + h = bound01(h, 360) * 6; + s = bound01(s, 100); + v = bound01(v, 100); + + var i = Math.floor(h), + f = h - i, + p = v * (1 - s), + q = v * (1 - f * s), + t = v * (1 - (1 - f) * s), + mod = i % 6, + r = [v, q, p, p, t, v][mod], + g = [t, v, v, q, p, p][mod], + b = [p, p, t, v, v, q][mod]; + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// rgbToHex +// Converts an RGB color to hex +// Assumes r, g, and b are contained in the set [0, 255] +// Returns a 3 or 6 character hex +function rgbToHex(r, g, b, allow3Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + // Return a 3 character hex if possible + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); + } + + return hex.join(""); +} + +// rgbaToHex +// Converts an RGBA color plus alpha transparency to hex +// Assumes r, g, b are contained in the set [0, 255] and +// a in [0, 1]. Returns a 4 or 8 character rgba hex +function rgbaToHex(r, g, b, a, allow4Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)), + pad2(convertDecimalToHex(a)) + ]; + + // Return a 4 character hex if possible + if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0); + } + + return hex.join(""); +} + +// rgbaToArgbHex +// Converts an RGBA color to an ARGB Hex8 string +// Rarely used, but required for "toFilter()" +function rgbaToArgbHex(r, g, b, a) { + + var hex = [ + pad2(convertDecimalToHex(a)), + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + return hex.join(""); +} + +// equals +// Can be called with any tinycolor input +tinycolor.equals = function (color1, color2) { + if (!color1 || !color2) { return false; } + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); +}; + +tinycolor.random = function() { + return tinycolor.fromRatio({ + r: mathRandom(), + g: mathRandom(), + b: mathRandom() + }); +}; + +// Modification Functions +// ---------------------- +// Thanks to less.js for some of the basics here +// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js> + +function desaturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s -= amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +} + +function saturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s += amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +} + +function greyscale(color) { + return tinycolor(color).desaturate(100); +} + +function lighten (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l += amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +} + +function brighten(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var rgb = tinycolor(color).toRgb(); + rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100)))); + rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100)))); + rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100)))); + return tinycolor(rgb); +} + +function darken (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l -= amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +} + +// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue. +// Values outside of this range will be wrapped into this range. +function spin(color, amount) { + var hsl = tinycolor(color).toHsl(); + var hue = (hsl.h + amount) % 360; + hsl.h = hue < 0 ? 360 + hue : hue; + return tinycolor(hsl); +} + +// Combination Functions +// --------------------- +// Thanks to jQuery xColor for some of the ideas behind these +// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js> + +function complement(color) { + var hsl = tinycolor(color).toHsl(); + hsl.h = (hsl.h + 180) % 360; + return tinycolor(hsl); +} + +function triad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) + ]; +} + +function tetrad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) + ]; +} + +function splitcomplement(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) + ]; +} + +function analogous(color, results, slices) { + results = results || 6; + slices = slices || 30; + + var hsl = tinycolor(color).toHsl(); + var part = 360 / slices; + var ret = [tinycolor(color)]; + + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { + hsl.h = (hsl.h + part) % 360; + ret.push(tinycolor(hsl)); + } + return ret; +} + +function monochromatic(color, results) { + results = results || 6; + var hsv = tinycolor(color).toHsv(); + var h = hsv.h, s = hsv.s, v = hsv.v; + var ret = []; + var modification = 1 / results; + + while (results--) { + ret.push(tinycolor({ h: h, s: s, v: v})); + v = (v + modification) % 1; + } + + return ret; +} + +// Utility Functions +// --------------------- + +tinycolor.mix = function(color1, color2, amount) { + amount = (amount === 0) ? 0 : (amount || 50); + + var rgb1 = tinycolor(color1).toRgb(); + var rgb2 = tinycolor(color2).toRgb(); + + var p = amount / 100; + + var rgba = { + r: ((rgb2.r - rgb1.r) * p) + rgb1.r, + g: ((rgb2.g - rgb1.g) * p) + rgb1.g, + b: ((rgb2.b - rgb1.b) * p) + rgb1.b, + a: ((rgb2.a - rgb1.a) * p) + rgb1.a + }; + + return tinycolor(rgba); +}; + +// Readability Functions +// --------------------- +// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2) + +// contrast +// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2) +tinycolor.readability = function(color1, color2) { + var c1 = tinycolor(color1); + var c2 = tinycolor(color2); + return (Math.max(c1.getLuminance(),c2.getLuminance())+0.05) / (Math.min(c1.getLuminance(),c2.getLuminance())+0.05); +}; + +// isReadable +// Ensure that foreground and background color combinations meet WCAG2 guidelines. +// The third argument is an optional Object. +// the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA'; +// the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'. +// If the entire object is absent, isReadable defaults to {level:"AA",size:"small"}. + +// *Example* +// tinycolor.isReadable("#000", "#111") => false +// tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false +tinycolor.isReadable = function(color1, color2, wcag2) { + var readability = tinycolor.readability(color1, color2); + var wcag2Parms, out; + + out = false; + + wcag2Parms = validateWCAG2Parms(wcag2); + switch (wcag2Parms.level + wcag2Parms.size) { + case "AAsmall": + case "AAAlarge": + out = readability >= 4.5; + break; + case "AAlarge": + out = readability >= 3; + break; + case "AAAsmall": + out = readability >= 7; + break; + } + return out; + +}; + +// mostReadable +// Given a base color and a list of possible foreground or background +// colors for that base, returns the most readable color. +// Optionally returns Black or White if the most readable color is unreadable. +// *Example* +// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255" +// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff" +// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3" +// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff" +tinycolor.mostReadable = function(baseColor, colorList, args) { + var bestColor = null; + var bestScore = 0; + var readability; + var includeFallbackColors, level, size ; + args = args || {}; + includeFallbackColors = args.includeFallbackColors ; + level = args.level; + size = args.size; + + for (var i= 0; i < colorList.length ; i++) { + readability = tinycolor.readability(baseColor, colorList[i]); + if (readability > bestScore) { + bestScore = readability; + bestColor = tinycolor(colorList[i]); + } + } + + if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) { + return bestColor; + } + else { + args.includeFallbackColors=false; + return tinycolor.mostReadable(baseColor,["#fff", "#000"],args); + } +}; + +// Big List of Colors +// ------------------ +// <http://www.w3.org/TR/css3-color/#svg-color> +var names = tinycolor.names = { + aliceblue: "f0f8ff", + antiquewhite: "faebd7", + aqua: "0ff", + aquamarine: "7fffd4", + azure: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "000", + blanchedalmond: "ffebcd", + blue: "00f", + blueviolet: "8a2be2", + brown: "a52a2a", + burlywood: "deb887", + burntsienna: "ea7e5d", + cadetblue: "5f9ea0", + chartreuse: "7fff00", + chocolate: "d2691e", + coral: "ff7f50", + cornflowerblue: "6495ed", + cornsilk: "fff8dc", + crimson: "dc143c", + cyan: "0ff", + darkblue: "00008b", + darkcyan: "008b8b", + darkgoldenrod: "b8860b", + darkgray: "a9a9a9", + darkgreen: "006400", + darkgrey: "a9a9a9", + darkkhaki: "bdb76b", + darkmagenta: "8b008b", + darkolivegreen: "556b2f", + darkorange: "ff8c00", + darkorchid: "9932cc", + darkred: "8b0000", + darksalmon: "e9967a", + darkseagreen: "8fbc8f", + darkslateblue: "483d8b", + darkslategray: "2f4f4f", + darkslategrey: "2f4f4f", + darkturquoise: "00ced1", + darkviolet: "9400d3", + deeppink: "ff1493", + deepskyblue: "00bfff", + dimgray: "696969", + dimgrey: "696969", + dodgerblue: "1e90ff", + firebrick: "b22222", + floralwhite: "fffaf0", + forestgreen: "228b22", + fuchsia: "f0f", + gainsboro: "dcdcdc", + ghostwhite: "f8f8ff", + gold: "ffd700", + goldenrod: "daa520", + gray: "808080", + green: "008000", + greenyellow: "adff2f", + grey: "808080", + honeydew: "f0fff0", + hotpink: "ff69b4", + indianred: "cd5c5c", + indigo: "4b0082", + ivory: "fffff0", + khaki: "f0e68c", + lavender: "e6e6fa", + lavenderblush: "fff0f5", + lawngreen: "7cfc00", + lemonchiffon: "fffacd", + lightblue: "add8e6", + lightcoral: "f08080", + lightcyan: "e0ffff", + lightgoldenrodyellow: "fafad2", + lightgray: "d3d3d3", + lightgreen: "90ee90", + lightgrey: "d3d3d3", + lightpink: "ffb6c1", + lightsalmon: "ffa07a", + lightseagreen: "20b2aa", + lightskyblue: "87cefa", + lightslategray: "789", + lightslategrey: "789", + lightsteelblue: "b0c4de", + lightyellow: "ffffe0", + lime: "0f0", + limegreen: "32cd32", + linen: "faf0e6", + magenta: "f0f", + maroon: "800000", + mediumaquamarine: "66cdaa", + mediumblue: "0000cd", + mediumorchid: "ba55d3", + mediumpurple: "9370db", + mediumseagreen: "3cb371", + mediumslateblue: "7b68ee", + mediumspringgreen: "00fa9a", + mediumturquoise: "48d1cc", + mediumvioletred: "c71585", + midnightblue: "191970", + mintcream: "f5fffa", + mistyrose: "ffe4e1", + moccasin: "ffe4b5", + navajowhite: "ffdead", + navy: "000080", + oldlace: "fdf5e6", + olive: "808000", + olivedrab: "6b8e23", + orange: "ffa500", + orangered: "ff4500", + orchid: "da70d6", + palegoldenrod: "eee8aa", + palegreen: "98fb98", + paleturquoise: "afeeee", + palevioletred: "db7093", + papayawhip: "ffefd5", + peachpuff: "ffdab9", + peru: "cd853f", + pink: "ffc0cb", + plum: "dda0dd", + powderblue: "b0e0e6", + purple: "800080", + rebeccapurple: "663399", + red: "f00", + rosybrown: "bc8f8f", + royalblue: "4169e1", + saddlebrown: "8b4513", + salmon: "fa8072", + sandybrown: "f4a460", + seagreen: "2e8b57", + seashell: "fff5ee", + sienna: "a0522d", + silver: "c0c0c0", + skyblue: "87ceeb", + slateblue: "6a5acd", + slategray: "708090", + slategrey: "708090", + snow: "fffafa", + springgreen: "00ff7f", + steelblue: "4682b4", + tan: "d2b48c", + teal: "008080", + thistle: "d8bfd8", + tomato: "ff6347", + turquoise: "40e0d0", + violet: "ee82ee", + wheat: "f5deb3", + white: "fff", + whitesmoke: "f5f5f5", + yellow: "ff0", + yellowgreen: "9acd32" +}; + +// Make it easy to access colors via hexNames[hex] +var hexNames = tinycolor.hexNames = flip(names); + +// Utilities +// --------- + +// { 'name1': 'val1' } becomes { 'val1': 'name1' } +function flip(o) { + var flipped = { }; + for (var i in o) { + if (o.hasOwnProperty(i)) { + flipped[o[i]] = i; + } + } + return flipped; +} + +// Return a valid alpha value [0,1] with all invalid values being set to 1 +function boundAlpha(a) { + a = parseFloat(a); + + if (isNaN(a) || a < 0 || a > 1) { + a = 1; + } + + return a; +} + +// Take input from [0, n] and return it as [0, 1] +function bound01(n, max) { + if (isOnePointZero(n)) { n = "100%"; } + + var processPercent = isPercentage(n); + n = mathMin(max, mathMax(0, parseFloat(n))); + + // Automatically convert percentage into number + if (processPercent) { + n = parseInt(n * max, 10) / 100; + } + + // Handle floating point rounding errors + if ((Math.abs(n - max) < 0.000001)) { + return 1; + } + + // Convert into [0, 1] range if it isn't already + return (n % max) / parseFloat(max); +} + +// Force a number between 0 and 1 +function clamp01(val) { + return mathMin(1, mathMax(0, val)); +} + +// Parse a base-16 hex value into a base-10 integer +function parseIntFromHex(val) { + return parseInt(val, 16); +} + +// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 +// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0> +function isOnePointZero(n) { + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; +} + +// Check to see if string passed in is a percentage +function isPercentage(n) { + return typeof n === "string" && n.indexOf('%') != -1; +} + +// Force a hex value to have 2 characters +function pad2(c) { + return c.length == 1 ? '0' + c : '' + c; +} + +// Replace a decimal with it's percentage value +function convertToPercentage(n) { + if (n <= 1) { + n = (n * 100) + "%"; + } + + return n; +} + +// Converts a decimal to a hex value +function convertDecimalToHex(d) { + return Math.round(parseFloat(d) * 255).toString(16); +} +// Converts a hex value to a decimal +function convertHexToDecimal(h) { + return (parseIntFromHex(h) / 255); +} + +var matchers = (function() { + + // <http://www.w3.org/TR/css3-values/#integers> + var CSS_INTEGER = "[-\\+]?\\d+%?"; + + // <http://www.w3.org/TR/css3-values/#number-value> + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; + + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; + + // Actual matching. + // Parentheses and commas are optional, but not required. + // Whitespace can take the place of commas or opening paren + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + + return { + CSS_UNIT: new RegExp(CSS_UNIT), + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), + hsva: new RegExp("hsva" + PERMISSIVE_MATCH4), + hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, + hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ + }; +})(); + +// isValidCSSUnit +// Take in a single string / number and check to see if it looks like a CSS unit +// (see matchers above for definition). +function isValidCSSUnit(color) { + return !!matchers.CSS_UNIT.exec(color); +} + +// stringInputToObject +// Permissive string parsing. Take in a number of formats, and output an object +// based on detected format. Returns { r, g, b } or { h, s, l } or { h, s, v} +function stringInputToObject(color) { + + color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase(); + var named = false; + if (names[color]) { + color = names[color]; + named = true; + } + else if (color == 'transparent') { + return { r: 0, g: 0, b: 0, a: 0, format: "name" }; + } + + // Try to match string input using regular expressions. + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] + // Just return an object and let the conversion functions handle that. + // This way the result will be the same whether the tinycolor is initialized with string or object. + var match; + if ((match = matchers.rgb.exec(color))) { + return { r: match[1], g: match[2], b: match[3] }; + } + if ((match = matchers.rgba.exec(color))) { + return { r: match[1], g: match[2], b: match[3], a: match[4] }; + } + if ((match = matchers.hsl.exec(color))) { + return { h: match[1], s: match[2], l: match[3] }; + } + if ((match = matchers.hsla.exec(color))) { + return { h: match[1], s: match[2], l: match[3], a: match[4] }; + } + if ((match = matchers.hsv.exec(color))) { + return { h: match[1], s: match[2], v: match[3] }; + } + if ((match = matchers.hsva.exec(color))) { + return { h: match[1], s: match[2], v: match[3], a: match[4] }; + } + if ((match = matchers.hex8.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + a: convertHexToDecimal(match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex6.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + format: named ? "name" : "hex" + }; + } + if ((match = matchers.hex4.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + a: convertHexToDecimal(match[4] + '' + match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex3.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + format: named ? "name" : "hex" + }; + } + + return false; +} + +function validateWCAG2Parms(parms) { + // return valid WCAG2 parms for isReadable. + // If input parms are invalid, return {"level":"AA", "size":"small"} + var level, size; + parms = parms || {"level":"AA", "size":"small"}; + level = (parms.level || "AA").toUpperCase(); + size = (parms.size || "small").toLowerCase(); + if (level !== "AA" && level !== "AAA") { + level = "AA"; + } + if (size !== "small" && size !== "large") { + size = "small"; + } + return {"level":level, "size":size}; +} + +this.tinycolor = tinycolor; + +})()`; +} +// It is hacky way to make this function will be compiled preferentially by less +// resolve error: `ReferenceError: colorPalette is not defined` +// https://github.com/ant-design/ant-motion/issues/44 +.tinyColorMixin(); + +// We create a very complex algorithm which take the place of original tint/shade color system +// to make sure no one can understand it 👻 +// and create an entire color palette magicly by inputing just a single primary color. +// We are using bezier-curve easing function and some color manipulations like tint/shade/darken/spin +.colorPaletteMixin() { + @functions: ~`(function() { + var hueStep = 2; + var saturationStep = 16; + var saturationStep2 = 5; + var brightnessStep1 = 5; + var brightnessStep2 = 15; + var lightColorCount = 5; + var darkColorCount = 4; + + var getHue = function(hsv, i, isLight) { + var hue; + if (hsv.h >= 60 && hsv.h <= 240) { + hue = isLight ? hsv.h - hueStep * i : hsv.h + hueStep * i; + } else { + hue = isLight ? hsv.h + hueStep * i : hsv.h - hueStep * i; + } + if (hue < 0) { + hue += 360; + } else if (hue >= 360) { + hue -= 360; + } + return Math.round(hue); + }; + var getSaturation = function(hsv, i, isLight) { + var saturation; + if (isLight) { + saturation = Math.round(hsv.s * 100) - saturationStep * i; + } else if (i == darkColorCount) { + saturation = Math.round(hsv.s * 100) + saturationStep; + } else { + saturation = Math.round(hsv.s * 100) + saturationStep2 * i; + } + if (saturation > 100) { + saturation = 100; + } + if (isLight && i === lightColorCount && saturation > 10) { + saturation = 10; + } + if (saturation < 6) { + saturation = 6; + } + return Math.round(saturation); + }; + var getValue = function(hsv, i, isLight) { + if (isLight) { + return Math.round(hsv.v * 100) + brightnessStep1 * i; + } + return Math.round(hsv.v * 100) - brightnessStep2 * i; + }; + + this.colorPalette = function(color, index) { + var isLight = index <= 6; + var hsv = tinycolor(color).toHsv(); + var i = isLight ? lightColorCount + 1 - index : index - lightColorCount - 1; + return tinycolor({ + h: getHue(hsv, i, isLight), + s: getSaturation(hsv, i, isLight), + v: getValue(hsv, i, isLight), + }).toHexString(); + }; +})()`; +} +// It is hacky way to make this function will be compiled preferentially by less +// resolve error: `ReferenceError: colorPalette is not defined` +// https://github.com/ant-design/ant-motion/issues/44 +.colorPaletteMixin(); + +// color palettes +@blue-1: color(~`colorPalette("@{blue-6}", 1)`); +@blue-2: color(~`colorPalette("@{blue-6}", 2)`); +@blue-3: color(~`colorPalette("@{blue-6}", 3)`); +@blue-4: color(~`colorPalette("@{blue-6}", 4)`); +@blue-5: color(~`colorPalette("@{blue-6}", 5)`); +@blue-6: #1890ff; +@blue-7: color(~`colorPalette("@{blue-6}", 7)`); +@blue-8: color(~`colorPalette("@{blue-6}", 8)`); +@blue-9: color(~`colorPalette("@{blue-6}", 9)`); +@blue-10: color(~`colorPalette("@{blue-6}", 10)`); + +@purple-1: color(~`colorPalette("@{purple-6}", 1)`); +@purple-2: color(~`colorPalette("@{purple-6}", 2)`); +@purple-3: color(~`colorPalette("@{purple-6}", 3)`); +@purple-4: color(~`colorPalette("@{purple-6}", 4)`); +@purple-5: color(~`colorPalette("@{purple-6}", 5)`); +@purple-6: #722ed1; +@purple-7: color(~`colorPalette("@{purple-6}", 7)`); +@purple-8: color(~`colorPalette("@{purple-6}", 8)`); +@purple-9: color(~`colorPalette("@{purple-6}", 9)`); +@purple-10: color(~`colorPalette("@{purple-6}", 10)`); + +@cyan-1: color(~`colorPalette("@{cyan-6}", 1)`); +@cyan-2: color(~`colorPalette("@{cyan-6}", 2)`); +@cyan-3: color(~`colorPalette("@{cyan-6}", 3)`); +@cyan-4: color(~`colorPalette("@{cyan-6}", 4)`); +@cyan-5: color(~`colorPalette("@{cyan-6}", 5)`); +@cyan-6: #13c2c2; +@cyan-7: color(~`colorPalette("@{cyan-6}", 7)`); +@cyan-8: color(~`colorPalette("@{cyan-6}", 8)`); +@cyan-9: color(~`colorPalette("@{cyan-6}", 9)`); +@cyan-10: color(~`colorPalette("@{cyan-6}", 10)`); + +@green-1: color(~`colorPalette("@{green-6}", 1)`); +@green-2: color(~`colorPalette("@{green-6}", 2)`); +@green-3: color(~`colorPalette("@{green-6}", 3)`); +@green-4: color(~`colorPalette("@{green-6}", 4)`); +@green-5: color(~`colorPalette("@{green-6}", 5)`); +@green-6: #52c41a; +@green-7: color(~`colorPalette("@{green-6}", 7)`); +@green-8: color(~`colorPalette("@{green-6}", 8)`); +@green-9: color(~`colorPalette("@{green-6}", 9)`); +@green-10: color(~`colorPalette("@{green-6}", 10)`); + +@magenta-1: color(~`colorPalette("@{magenta-6}", 1)`); +@magenta-2: color(~`colorPalette("@{magenta-6}", 2)`); +@magenta-3: color(~`colorPalette("@{magenta-6}", 3)`); +@magenta-4: color(~`colorPalette("@{magenta-6}", 4)`); +@magenta-5: color(~`colorPalette("@{magenta-6}", 5)`); +@magenta-6: #eb2f96; +@magenta-7: color(~`colorPalette("@{magenta-6}", 7)`); +@magenta-8: color(~`colorPalette("@{magenta-6}", 8)`); +@magenta-9: color(~`colorPalette("@{magenta-6}", 9)`); +@magenta-10: color(~`colorPalette("@{magenta-6}", 10)`); + +// alias of magenta +@pink-1: color(~`colorPalette("@{pink-6}", 1)`); +@pink-2: color(~`colorPalette("@{pink-6}", 2)`); +@pink-3: color(~`colorPalette("@{pink-6}", 3)`); +@pink-4: color(~`colorPalette("@{pink-6}", 4)`); +@pink-5: color(~`colorPalette("@{pink-6}", 5)`); +@pink-6: #eb2f96; +@pink-7: color(~`colorPalette("@{pink-6}", 7)`); +@pink-8: color(~`colorPalette("@{pink-6}", 8)`); +@pink-9: color(~`colorPalette("@{pink-6}", 9)`); +@pink-10: color(~`colorPalette("@{pink-6}", 10)`); + +@red-1: color(~`colorPalette("@{red-6}", 1)`); +@red-2: color(~`colorPalette("@{red-6}", 2)`); +@red-3: color(~`colorPalette("@{red-6}", 3)`); +@red-4: color(~`colorPalette("@{red-6}", 4)`); +@red-5: color(~`colorPalette("@{red-6}", 5)`); +@red-6: #f5222d; +@red-7: color(~`colorPalette("@{red-6}", 7)`); +@red-8: color(~`colorPalette("@{red-6}", 8)`); +@red-9: color(~`colorPalette("@{red-6}", 9)`); +@red-10: color(~`colorPalette("@{red-6}", 10)`); + +@orange-1: color(~`colorPalette("@{orange-6}", 1)`); +@orange-2: color(~`colorPalette("@{orange-6}", 2)`); +@orange-3: color(~`colorPalette("@{orange-6}", 3)`); +@orange-4: color(~`colorPalette("@{orange-6}", 4)`); +@orange-5: color(~`colorPalette("@{orange-6}", 5)`); +@orange-6: #fa8c16; +@orange-7: color(~`colorPalette("@{orange-6}", 7)`); +@orange-8: color(~`colorPalette("@{orange-6}", 8)`); +@orange-9: color(~`colorPalette("@{orange-6}", 9)`); +@orange-10: color(~`colorPalette("@{orange-6}", 10)`); + +@yellow-1: color(~`colorPalette("@{yellow-6}", 1)`); +@yellow-2: color(~`colorPalette("@{yellow-6}", 2)`); +@yellow-3: color(~`colorPalette("@{yellow-6}", 3)`); +@yellow-4: color(~`colorPalette("@{yellow-6}", 4)`); +@yellow-5: color(~`colorPalette("@{yellow-6}", 5)`); +@yellow-6: #fadb14; +@yellow-7: color(~`colorPalette("@{yellow-6}", 7)`); +@yellow-8: color(~`colorPalette("@{yellow-6}", 8)`); +@yellow-9: color(~`colorPalette("@{yellow-6}", 9)`); +@yellow-10: color(~`colorPalette("@{yellow-6}", 10)`); + +@volcano-1: color(~`colorPalette("@{volcano-6}", 1)`); +@volcano-2: color(~`colorPalette("@{volcano-6}", 2)`); +@volcano-3: color(~`colorPalette("@{volcano-6}", 3)`); +@volcano-4: color(~`colorPalette("@{volcano-6}", 4)`); +@volcano-5: color(~`colorPalette("@{volcano-6}", 5)`); +@volcano-6: #fa541c; +@volcano-7: color(~`colorPalette("@{volcano-6}", 7)`); +@volcano-8: color(~`colorPalette("@{volcano-6}", 8)`); +@volcano-9: color(~`colorPalette("@{volcano-6}", 9)`); +@volcano-10: color(~`colorPalette("@{volcano-6}", 10)`); + +@geekblue-1: color(~`colorPalette("@{geekblue-6}", 1)`); +@geekblue-2: color(~`colorPalette("@{geekblue-6}", 2)`); +@geekblue-3: color(~`colorPalette("@{geekblue-6}", 3)`); +@geekblue-4: color(~`colorPalette("@{geekblue-6}", 4)`); +@geekblue-5: color(~`colorPalette("@{geekblue-6}", 5)`); +@geekblue-6: #2f54eb; +@geekblue-7: color(~`colorPalette("@{geekblue-6}", 7)`); +@geekblue-8: color(~`colorPalette("@{geekblue-6}", 8)`); +@geekblue-9: color(~`colorPalette("@{geekblue-6}", 9)`); +@geekblue-10: color(~`colorPalette("@{geekblue-6}", 10)`); + +@lime-1: color(~`colorPalette("@{lime-6}", 1)`); +@lime-2: color(~`colorPalette("@{lime-6}", 2)`); +@lime-3: color(~`colorPalette("@{lime-6}", 3)`); +@lime-4: color(~`colorPalette("@{lime-6}", 4)`); +@lime-5: color(~`colorPalette("@{lime-6}", 5)`); +@lime-6: #a0d911; +@lime-7: color(~`colorPalette("@{lime-6}", 7)`); +@lime-8: color(~`colorPalette("@{lime-6}", 8)`); +@lime-9: color(~`colorPalette("@{lime-6}", 9)`); +@lime-10: color(~`colorPalette("@{lime-6}", 10)`); + +@gold-1: color(~`colorPalette("@{gold-6}", 1)`); +@gold-2: color(~`colorPalette("@{gold-6}", 2)`); +@gold-3: color(~`colorPalette("@{gold-6}", 3)`); +@gold-4: color(~`colorPalette("@{gold-6}", 4)`); +@gold-5: color(~`colorPalette("@{gold-6}", 5)`); +@gold-6: #faad14; +@gold-7: color(~`colorPalette("@{gold-6}", 7)`); +@gold-8: color(~`colorPalette("@{gold-6}", 8)`); +@gold-9: color(~`colorPalette("@{gold-6}", 9)`); +@gold-10: color(~`colorPalette("@{gold-6}", 10)`); + +// The prefix to use on all css classes from ant. +@ant-prefix : ant; + +// -------- Colors ----------- + +@info-color : @blue-6; +@success-color : @green-6; +@processing-color : @blue-6; +@error-color : @red-6; +@highlight-color : @red-6; +@warning-color : @gold-6; +@normal-color : #d9d9d9; + +// Color used by default to control hover and active backgrounds and for +// alert info backgrounds. +@primary-1: color(~`colorPalette("@{primary-color}", 1)`); // replace tint(@primary-color, 90%) +@primary-2: color(~`colorPalette("@{primary-color}", 2)`); // replace tint(@primary-color, 80%) +@primary-3: color(~`colorPalette("@{primary-color}", 3)`); // unused +@primary-4: color(~`colorPalette("@{primary-color}", 4)`); // unused +@primary-5: color(~`colorPalette("@{primary-color}", 5)`); // color used to control the text color in many active and hover states, replace tint(@primary-color, 20%) +@primary-6: @primary-color; // color used to control the text color of active buttons, don't use, use @primary-color +@primary-7: color(~`colorPalette("@{primary-color}", 7)`); // replace shade(@primary-color, 5%) +@primary-8: color(~`colorPalette("@{primary-color}", 8)`); // unused +@primary-9: color(~`colorPalette("@{primary-color}", 9)`); // unused +@primary-10: color(~`colorPalette("@{primary-color}", 10)`); // unused + +// Base Scaffolding Variables +// --- + +// Background color for `<body>` +@body-background : #fff; +// Base background color for most components +@component-background : #fff; +@font-family : "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, +"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; +@code-family : "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; +@heading-color : fade(#000, 85%); +@text-color : fade(#000, 65%); +@text-color-secondary : fade(#000, 45%); +@heading-color-dark : fade(#fff, 100%); +@text-color-dark : fade(#fff, 85%); +@text-color-secondary-dark: fade(#fff, 65%); +@font-size-base : 14px; +@font-size-lg : @font-size-base + 2px; +@font-size-sm : 12px; +@line-height-base : 1.5; +@border-radius-base : 4px; +@border-radius-sm : 2px; + +// vertical paddings +@padding-lg : 24px; // containers +@padding-md : 16px; // small containers and buttons +@padding-sm : 12px; // Form controls and items +@padding-xs : 8px; // small items + +// vertical padding for all form controls +@control-padding-horizontal: @padding-sm; +@control-padding-horizontal-sm: @padding-xs; + +// The background colors for active and hover states for things like +// list items or table cells. +@item-active-bg : @primary-1; +@item-hover-bg : @primary-1; + +// ICONFONT +@iconfont-css-prefix : anticon; + +// LINK +@link-color : @primary-color; +@link-hover-color : color(~`colorPalette("@{link-color}", 5)`); +@link-active-color : color(~`colorPalette("@{link-color}", 7)`); +@link-decoration : none; +@link-hover-decoration : none; + +// Animation +@ease-base-out : cubic-bezier(0.7, 0.3, 0.1, 1); +@ease-base-in : cubic-bezier(0.9, 0, 0.3, 0.7); +@ease-out : cubic-bezier(0.215, 0.61, 0.355, 1); +@ease-in : cubic-bezier(0.55, 0.055, 0.675, 0.19); +@ease-in-out : cubic-bezier(0.645, 0.045, 0.355, 1); +@ease-out-back : cubic-bezier(0.12, 0.4, 0.29, 1.46); +@ease-in-back : cubic-bezier(0.71, -0.46, 0.88, 0.6); +@ease-in-out-back : cubic-bezier(0.71, -0.46, 0.29, 1.46); +@ease-out-circ : cubic-bezier(0.08, 0.82, 0.17, 1); +@ease-in-circ : cubic-bezier(0.6, 0.04, 0.98, 0.34); +@ease-in-out-circ : cubic-bezier(0.78, 0.14, 0.15, 0.86); +@ease-out-quint : cubic-bezier(0.23, 1, 0.32, 1); +@ease-in-quint : cubic-bezier(0.755, 0.05, 0.855, 0.06); +@ease-in-out-quint : cubic-bezier(0.86, 0, 0.07, 1); + +// Border color +@border-color-base : hsv(0, 0, 85%); // base border outline a component +@border-color-split : hsv(0, 0, 91%); // split border inside a component +@border-width-base : 1px; // width of the border for a component +@border-style-base : solid; // style of a components border + +// Outline +@outline-blur-size : 0; +@outline-width : 2px; +@outline-color : @primary-color; + +@background-color-light : hsv(0, 0, 98%); // background of header and selected item +@background-color-base : hsv(0, 0, 96%); // Default grey background color + +// Disabled states +@disabled-color : fade(#000, 25%); +@disabled-bg : @background-color-base; +@disabled-color-dark : fade(#fff, 35%); + +// Shadow +@shadow-color : rgba(0, 0, 0, .15); +@box-shadow-base : @shadow-1-down; +@shadow-1-up : 0 -2px 8px @shadow-color; +@shadow-1-down : 0 2px 8px @shadow-color; +@shadow-1-left : -2px 0 8px @shadow-color; +@shadow-1-right : 2px 0 8px @shadow-color; +@shadow-2 : 0 4px 12px @shadow-color; + +// Buttons +@btn-font-weight : 400; +@btn-border-radius-base : @border-radius-base; +@btn-border-radius-sm : @border-radius-base; + +@btn-primary-color : #fff; +@btn-primary-bg : @primary-color; + +@btn-default-color : @text-color; +@btn-default-bg : #fff; +@btn-default-border : @border-color-base; + +@btn-danger-color : @error-color; +@btn-danger-bg : @background-color-base; +@btn-danger-border : @border-color-base; + +@btn-disable-color : @disabled-color; +@btn-disable-bg : @disabled-bg; +@btn-disable-border : @border-color-base; + +@btn-padding-base : 0 @padding-md - 1px; +@btn-font-size-lg : @font-size-lg; +@btn-font-size-sm : @font-size-base; +@btn-padding-lg : @btn-padding-base; +@btn-padding-sm : 0 @padding-xs - 1px; + +@btn-height-base : 32px; +@btn-height-lg : 40px; +@btn-height-sm : 24px; + +@btn-circle-size : @btn-height-base; +@btn-circle-size-lg : @btn-height-lg; +@btn-circle-size-sm : @btn-height-sm; + +@btn-group-border : @primary-5; + +// Checkbox +@checkbox-size : 16px; +@checkbox-color : @primary-color; +@checkbox-check-color : #fff; + +// Radio +@radio-size : 16px; +@radio-dot-color : @primary-color; + +// Radio buttons +@radio-button-bg : @btn-default-bg; +@radio-button-color : @btn-default-color; +@radio-button-hover-color : @primary-5; +@radio-button-active-color : @primary-7; + +// Media queries breakpoints +// Extra small screen / phone +@screen-xs : 480px; +@screen-xs-min : @screen-xs; + +// Small screen / tablet +@screen-sm : 576px; +@screen-sm-min : @screen-sm; + +// Medium screen / desktop +@screen-md : 768px; +@screen-md-min : @screen-md; + +// Large screen / wide desktop +@screen-lg : 992px; +@screen-lg-min : @screen-lg; + +// Extra large screen / full hd +@screen-xl : 1200px; +@screen-xl-min : @screen-xl; + +// Extra extra large screen / large descktop +@screen-xxl : 1600px; +@screen-xxl-min : @screen-xxl; + +// provide a maximum +@screen-xs-max : (@screen-sm-min - 1px); +@screen-sm-max : (@screen-md-min - 1px); +@screen-md-max : (@screen-lg-min - 1px); +@screen-lg-max : (@screen-xl-min - 1px); +@screen-xl-max : (@screen-xxl-min - 1px); + +// Grid system +@grid-columns : 24; +@grid-gutter-width : 0; + +// Layout +@layout-body-background : #f0f2f5; +@layout-header-background : #001529; +@layout-footer-background : @layout-body-background; +@layout-header-height : 64px; +@layout-header-padding : 0 50px; +@layout-footer-padding : 24px 50px; +@layout-sider-background : @layout-header-background; +@layout-trigger-height : 48px; +@layout-trigger-background : #002140; +@layout-trigger-color : #fff; +@layout-zero-trigger-width : 36px; +@layout-zero-trigger-height : 42px; +// Layout light theme +@layout-sider-background-light : #fff; +@layout-trigger-background-light: #fff; +@layout-trigger-color-light : @text-color; + +// z-index list +@zindex-affix : 10; +@zindex-back-top : 10; +@zindex-modal-mask : 1000; +@zindex-modal : 1000; +@zindex-notification : 1010; +@zindex-message : 1010; +@zindex-popover : 1030; +@zindex-picker : 1050; +@zindex-dropdown : 1050; +@zindex-tooltip : 1060; + +// Animation +@animation-duration-slow: .3s; // Modal +@animation-duration-base: .2s; +@animation-duration-fast: .1s; // Tooltip + +// Form +// --- +@label-required-color : @highlight-color; +@label-color : @heading-color; +@form-item-margin-bottom : 24px; +@form-item-trailing-colon : true; +@form-vertical-label-padding : 0 0 8px; +@form-vertical-label-margin : 0; + +// Input +// --- +@input-height-base : 32px; +@input-height-lg : 40px; +@input-height-sm : 24px; +@input-padding-horizontal : @control-padding-horizontal - 1px; +@input-padding-horizontal-base: @input-padding-horizontal; +@input-padding-horizontal-sm : @control-padding-horizontal-sm - 1px; +@input-padding-horizontal-lg : @input-padding-horizontal; +@input-padding-vertical-base : 4px; +@input-padding-vertical-sm : 1px; +@input-padding-vertical-lg : 6px; +@input-placeholder-color : hsv(0, 0, 75%); +@input-color : @text-color; +@input-border-color : @border-color-base; +@input-bg : #fff; +@input-addon-bg : @background-color-light; +@input-hover-border-color : @primary-color; +@input-disabled-bg : @disabled-bg; +@input-outline-offset : 0 0; + +// Tooltip +// --- +//* Tooltip max width +@tooltip-max-width: 250px; +//** Tooltip text color +@tooltip-color: #fff; +//** Tooltip background color +@tooltip-bg: rgba(0, 0, 0, .75); +//** Tooltip arrow width +@tooltip-arrow-width: 5px; +//** Tooltip distance with trigger +@tooltip-distance: @tooltip-arrow-width - 1px + 4px; +//** Tooltip arrow color +@tooltip-arrow-color: @tooltip-bg; + +// Popover +// --- +//** Popover body background color +@popover-bg: #fff; +//** Popover text color +@popover-color: @text-color; +//** Popover maximum width +@popover-min-width: 177px; +//** Popover arrow width +@popover-arrow-width: 6px; +//** Popover arrow color +@popover-arrow-color: @popover-bg; +//** Popover outer arrow width +//** Popover outer arrow color +@popover-arrow-outer-color: @popover-bg; +//** Popover distance with trigger +@popover-distance: @popover-arrow-width + 4px; + +// Modal +// -- +@modal-mask-bg: rgba(0, 0, 0, 0.65); + +// Progress +// -- +@progress-default-color: @processing-color; +@progress-remaining-color: @background-color-base; +@progress-text-color: @text-color; + +// Menu +// --- +@menu-inline-toplevel-item-height: 40px; +@menu-item-height: 40px; +@menu-collapsed-width: 80px; +@menu-bg: @component-background; +@menu-item-color: @text-color; +@menu-highlight-color: @primary-color; +@menu-item-active-bg: @item-active-bg; +@menu-item-active-border-width: 3px; +@menu-item-group-title-color: @text-color-secondary; +// dark theme +@menu-dark-color: @text-color-secondary-dark; +@menu-dark-bg: @layout-header-background; +@menu-dark-arrow-color: #fff; +@menu-dark-submenu-bg: #000c17; +@menu-dark-highlight-color: #fff; +@menu-dark-item-active-bg: @primary-color; + +// Spin +// --- +@spin-dot-size-sm: 14px; +@spin-dot-size: 20px; +@spin-dot-size-lg: 32px; + +// Table +// -- +@table-header-bg: @background-color-light; +@table-header-color: @heading-color; +@table-header-sort-bg: @background-color-base; +@table-body-sort-bg: rgba(0, 0, 0, .01); +@table-row-hover-bg: @primary-1; +@table-selected-row-bg: #fafafa; +@table-expanded-row-bg: #fbfbfb; +@table-padding-vertical: 16px; +@table-padding-horizontal: 16px; + +// Tag +// -- +@tag-default-bg: @background-color-light; +@tag-default-color: @text-color; +@tag-font-size: @font-size-sm; + +// TimePicker +// --- +@time-picker-panel-column-width: 56px; +@time-picker-panel-width: @time-picker-panel-column-width * 3; +@time-picker-selected-bg: @background-color-base; + +// Carousel +// --- +@carousel-dot-width: 16px; +@carousel-dot-height: 3px; +@carousel-dot-active-width: 24px; + +// Badge +// --- +@badge-height: 20px; +@badge-dot-size: 6px; +@badge-font-size: @font-size-sm; +@badge-font-weight: normal; +@badge-status-size: 6px; + +// Rate +// --- +@rate-star-color: @yellow-6; +@rate-star-bg: @border-color-split; + +// Card +// --- +@card-head-color: @heading-color; +@card-head-background: transparent; +@card-head-padding: 16px; +@card-inner-head-padding: 12px; +@card-padding-base: 24px; +@card-padding-wider: 32px; +@card-actions-background: @background-color-light; +@card-shadow: 0 2px 8px rgba(0, 0, 0, .09); + +// Tabs +// --- +@tabs-card-head-background: @background-color-light; +@tabs-card-height: 40px; +@tabs-card-active-color: @primary-color; +@tabs-title-font-size: @font-size-base; +@tabs-title-font-size-lg: @font-size-lg; +@tabs-title-font-size-sm: @font-size-base; +@tabs-ink-bar-color: @primary-color; +@tabs-bar-margin: 0 0 16px 0; +@tabs-horizontal-margin: 0 32px 0 0; +@tabs-horizontal-padding: 12px 16px; +@tabs-vertical-padding: 8px 24px; +@tabs-vertical-margin: 0 0 16px 0; +@tabs-scrolling-size: 32px; +@tabs-highlight-color: @primary-color; +@tabs-hover-color: @primary-5; +@tabs-active-color: @primary-7; + +// BackTop +// --- +@back-top-color: #fff; +@back-top-bg: @text-color-secondary; +@back-top-hover-bg: @text-color; + +// Avatar +// --- +@avatar-size-base: 32px; +@avatar-size-lg: 40px; +@avatar-size-sm: 24px; +@avatar-font-size-base: 18px; +@avatar-font-size-lg: 24px; +@avatar-font-size-sm: 14px; +@avatar-bg: #ccc; +@avatar-color: #fff; +@avatar-border-radius: @border-radius-base; + +// Switch +// --- +@switch-height: 22px; +@switch-sm-height: 16px; +@switch-sm-checked-margin-left: -(@switch-sm-height - 3px); +@switch-disabled-opacity: 0.4; +@switch-color: @primary-color; + +// Pagination +// --- +@pagination-item-size: 32px; +@pagination-item-size-sm: 24px; +@pagination-font-family: Arial; +@pagination-font-weight-active: 500; + +// Breadcrumb +// --- +@breadcrumb-base-color: @text-color-secondary; +@breadcrumb-last-item-color: @text-color; +@breadcrumb-font-size: @font-size-base; +@breadcrumb-icon-font-size: @font-size-base; +@breadcrumb-link-color: @text-color-secondary; +@breadcrumb-link-color-hover: @primary-5; +@breadcrumb-separator-color: @text-color-secondary; +@breadcrumb-separator-margin: 0 @padding-xs; + +// Slider +// --- +@slider-margin: 14px 6px 10px; +@slider-rail-background-color: @background-color-base; +@slider-rail-background-color-hover: #e1e1e1; +@slider-track-background-color: @primary-3; +@slider-track-background-color-hover: @primary-4; +@slider-handle-color: @primary-3; +@slider-handle-color-hover: @primary-4; +@slider-handle-color-focus: tint(@primary-color, 20%); +@slider-handle-color-focus-shadow: tint(@primary-color, 50%); +@slider-handle-color-tooltip-open: @primary-color; +@slider-dot-border-color: @border-color-split; +@slider-dot-border-color-active: tint(@primary-color, 50%); +@slider-disabled-color: @disabled-color; +@slider-disabled-background-color: @component-background; + +// Tree +// --- +@tree-title-height: 24px; +@tree-child-padding: 18px; +@tree-directory-selected-color: #fff; +@tree-directory-selected-bg: @primary-color; + +// Collapse +// --- +@collapse-header-padding: 12px 0 12px 40px; +@collapse-header-bg: @background-color-light; +@collapse-content-padding: @padding-md; +@collapse-content-bg: @component-background; + +// Skeleton +// --- +@skeleton-color: #f2f2f2; + +// Transfer +// --- +@transfer-disabled-bg: @disabled-bg; + +// Message +// --- +@message-notice-content-padding: 10px 16px; + +// Motion +// --- +@wave-animation-width: 6px; + +// Alert +// --- +@alert-success-border-color: ~`colorPalette("@{success-color}", 3)`; +@alert-success-bg-color: ~`colorPalette("@{success-color}", 1)`; +@alert-success-icon-color: @success-color; +@alert-info-border-color: ~`colorPalette("@{info-color}", 3)`; +@alert-info-bg-color: ~`colorPalette("@{info-color}", 1)`; +@alert-info-icon-color: @info-color; +@alert-warning-border-color: ~`colorPalette("@{warning-color}", 3)`; +@alert-warning-bg-color: ~`colorPalette("@{warning-color}", 1)`; +@alert-warning-icon-color: @warning-color; +@alert-error-border-color: ~`colorPalette("@{error-color}", 3)`; +@alert-error-bg-color: ~`colorPalette("@{error-color}", 1)`; +@alert-error-icon-color: @error-color; + +// List +// --- +@list-empty-text-padding: @padding-md; +@list-item-padding: @padding-sm 0; +@list-item-content-margin: 0 0 @padding-md 0; +@list-item-meta-margin-bottom: @padding-md; +@list-item-meta-avatar-margin-right: @padding-md; +@list-item-meta-title-margin-bottom: @padding-sm; + +// Menu +@menu-dark-item-selected-bg: @menu-dark-item-active-bg; + +// Tabs +@tab-bar-margin: @tabs-bar-margin; +@tab-horizontal-margin: @tabs-horizontal-margin; +@tab-vertical-margin: @tabs-vertical-margin; +@tab-horizontal-padding: @tabs-horizontal-padding; +@tab-vertical-padding: @tabs-vertical-padding; +@tab-scrolling-size: @tabs-scrolling-size; +@tab-highlight-color: @tabs-highlight-color; +@tab-hover-color: @tabs-hover-color; +@tab-active-color: @tabs-active-color; +@tabs-ink-bar-bg-color: @tabs-ink-bar-color; + +.listContent .extra { + color: rgba(0, 0, 0, 0.45); +} +.listContent .extra > em { + color: rgba(0, 0, 0, 0.25); +} +.avatarItem :global .ant-avatar { + border: 1px solid #fff; +} +.chartCard .avatar img { + border-radius: 100%; +} +.chartCard .meta { + color: rgba(0, 0, 0, 0.45); +} +.chartCard .total { + color: rgba(0, 0, 0, 0.85); +} +.chartCard .footer { + border-top: 1px solid #e8e8e8; +} +.field span:last-child { + color: rgba(0, 0, 0, 0.85); +} +.miniProgress .progressWrap { + background-color: #f5f5f5; +} +.miniProgress .progress { + border-radius: 1px 0 0 1px; + background-color: @primary-color; +} +.miniProgress .target span { + border-radius: 100px; +} +.pie .dot { + border-radius: 8px; +} +.pie .line { + background-color: #e8e8e8; +} +.pie .legendTitle { + color: rgba(0, 0, 0, 0.65); +} +.pie .percent { + color: rgba(0, 0, 0, 0.45); +} +.pie .total > h4 { + color: rgba(0, 0, 0, 0.45); +} +.pie .total > p { + color: rgba(0, 0, 0, 0.85); +} +.radar .legend .legendItem { + color: rgba(0, 0, 0, 0.45); +} +.radar .legend .legendItem h6 { + color: rgba(0, 0, 0, 0.85); +} +.radar .legend .legendItem:after { + background-color: #e8e8e8; +} +.radar .legend .dot { + border-radius: 6px; +} + +.timelineChart { + background: #fff; +} +.waterWave .text span { + color: rgba(0, 0, 0, 0.45); +} +.waterWave .text h4 { + color: rgba(0, 0, 0, 0.85); +} +.descriptionList .title { + color: rgba(0, 0, 0, 0.85); +} +.descriptionList .term { + color: rgba(0, 0, 0, 0.85); +} +.descriptionList .detail { + color: rgba(0, 0, 0, 0.65); +} +.descriptionList.small .title { + color: rgba(0, 0, 0, 0.65); +} +.linkGroup > a { + color: rgba(0, 0, 0, 0.65); +} +.linkGroup > a:hover { + color: @primary-color; +} +.lines .shadow { + color: transparent; +} +.exception .imgEle { + background-repeat: no-repeat; + background-position: 50% 50%; + background-size: contain; +} +.exception .content h1 { + color: #434e59; +} +.exception .content .desc { + color: rgba(0, 0, 0, 0.45); +} +.toolbar { + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.03); + background: #fff; + border-top: 1px solid #e8e8e8; +} +.globalFooter .links a { + color: rgba(0, 0, 0, 0.45); +} +.globalFooter .links a:hover { + color: rgba(0, 0, 0, 0.65); +} +.globalFooter .copyright { + color: rgba(0, 0, 0, 0.45); +} +.header { + background: #fff; + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); +} +i.trigger:hover { + background: rgba(0, 0, 0, 0.025); +} +.right .action > i { + color: rgba(0, 0, 0, 0.65); +} +.right .action:hover { + background: rgba(0, 0, 0, 0.025); +} +:global(.right .action.ant-popover-open) { + background: rgba(0, 0, 0, 0.025); +} +.right .search:hover { + background: transparent; +} +.right .account .avatar { + color: @primary-color; + background: rgba(255, 255, 255, 0.85); +} +.dark .action { + color: rgba(255, 255, 255, 0.85); +} +.dark .action > i { + color: rgba(255, 255, 255, 0.85); +} +.dark .action:hover, +.dark .action:global(.ant-popover-open) { + background: @primary-color; +} +.dark .action :global(.ant-badge) { + color: rgba(255, 255, 255, 0.85); +} +.headerSearch .input { + background: transparent; + border-radius: 0; +} +.headerSearch .input :global(.ant-select-selection) { + background: transparent; +} +.headerSearch .input input { + border: 0; + box-shadow: none !important; +} +.headerSearch .input, +.headerSearch .input:hover, +.headerSearch .input:focus { + border-bottom: 1px solid #d9d9d9; +} +.login :global .ant-tabs .ant-tabs-bar { + border-bottom: 0; +} +.login .icon { + color: rgba(0, 0, 0, 0.2); +} +.login .icon:hover { + color: @primary-color; +} +.login .prefixIcon { + color: rgba(0, 0, 0, 0.25); +} +.list .item .avatar { + background: #fff; +} +.list .item:last-child { + border-bottom: 0; +} +.list .item:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.list .item .extra { + color: rgba(0, 0, 0, 0.45); +} +.notFound { + color: rgba(0, 0, 0, 0.45); +} +.clear { + color: rgba(0, 0, 0, 0.65); + border-radius: 0 0 4px 4px; + border-top: 1px solid #e8e8e8; +} +.clear:hover { + color: rgba(0, 0, 0, 0.85); +} +.numberInfo .suffix { + color: rgba(0, 0, 0, 0.65); +} +.numberInfo .numberInfoTitle { + color: rgba(0, 0, 0, 0.65); +} +.numberInfo .numberInfoSubTitle { + color: rgba(0, 0, 0, 0.45); +} +.numberInfo .numberInfoValue > span { + color: rgba(0, 0, 0, 0.85); +} +.numberInfo .numberInfoValue .subTotal { + color: rgba(0, 0, 0, 0.45); +} +.numberInfo .numberInfoValue .subTotal :global .anticon-caret-up { + color: #f5222d; +} +.numberInfo .numberInfoValue .subTotal :global .anticon-caret-down { + color: #52c41a; +} +.numberInfolight .numberInfoValue > span { + color: rgba(0, 0, 0, 0.65); +} +.pageHeader { + background: #fff; + border-bottom: 1px solid #e8e8e8; +} +.pageHeader .tabs :global .ant-tabs-bar { + border-bottom: 1px solid #e8e8e8; +} +.pageHeader .logo > img { + border-radius: 4px; +} +.pageHeader .title { + color: rgba(0, 0, 0, 0.85); +} +.result .icon > .success { + color: #52c41a; +} +.result .icon > .error { + color: #f5222d; +} +.result .title { + color: rgba(0, 0, 0, 0.85); +} +.result .description { + color: rgba(0, 0, 0, 0.45); +} +.result .extra { + background: #fafafa; + border-radius: 2px; +} +.blockChecbox .item { + border-radius: 4px; +} +.blockChecbox .selectIcon { + color: @primary-color; +} +.color_block { + border-radius: 4px; +} +.title { + color: rgba(0, 0, 0, 0.85); +} +.handle { + background: @primary-color; + border-radius: 4px 0 0 4px; +} +.setting-drawer-index-handle { + /* 暂时不知道放哪解决 */ + background: @primary-color !important; +} +.themeColor .title { + color: rgba(0, 0, 0, 0.65); +} +.themeColor .colorBlock { + border-radius: 2px; + color: #fff; +} +.logo { +} +.logo h1 { + color: white; +} +.sider { + box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); +} +.sider.light { + box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05); + background-color: white; +} +.sider.light .logo { + background: white; + box-shadow: 1px 1px 0 0 #e8e8e8; +} +.sider.light .logo h1 { + color: @primary-color; +} +.sider.light :global(.ant-menu-light) { + border-right-color: transparent; +} +:global .drawer .drawer-content { + background: #001529; +} +.standardFormRow { + border-bottom: 1px dashed #e8e8e8; +} +.standardFormRow :global .ant-form-item-label label { + color: rgba(0, 0, 0, 0.65); +} +.standardFormRow .label { + color: rgba(0, 0, 0, 0.85); +} +.standardFormRowLast { + border: none; +} + +.head { + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); +} +.head.light { + background-color: #fff; +} +.logo h1 { + color: #fff; +} +.light h1 { + color: #002140; +} +.trendItem .up { + color: #f5222d; +} +.trendItem .down { + color: #52c41a; +} +.trendItem.trendItemGrey .up, +.trendItem.trendItemGrey .down { + color: rgba(0, 0, 0, 0.65); +} +.trendItem.reverseColor .up { + color: #52c41a; +} +.trendItem.reverseColor .down { + color: #f5222d; +} +.container { + background: #f0f2f5; +} +.title { + color: rgba(0, 0, 0, 0.85); +} +.desc { + color: rgba(0, 0, 0, 0.45); +} +a.listItemMetaTitle { + color: rgba(0, 0, 0, 0.85); +} +.baseView .right .avatar_title { + color: rgba(0, 0, 0, 0.85); +} +.main { + background-color: #fff; +} +.main .leftmenu { + border-right: 1px solid #e8e8e8; +} +.main .leftmenu :global .ant-menu-inline { + border: none; +} +.main .right .title { + color: rgba(0, 0, 0, 0.85); +} +.main :global .ant-list-split .ant-list-item:last-child { + border-bottom: 1px solid #e8e8e8; +} +:global .ant-list-item-meta .taobao { + color: #ff4000; + border-radius: 4px; +} +:global .ant-list-item-meta .dingding { + background-color: #2eabff; + color: #fff; + border-radius: 4px; +} +:global .ant-list-item-meta .alipay { + color: #2eabff; + border-radius: 4px; +} +:global font.strong { + color: #52c41a; +} +:global font.medium { + color: #faad14; +} +:global font.weak { + color: #f5222d; +} + + + + +.trigger { + background: 'red'; +} +.desc { + color: rgba(0, 0, 0, 0.45); +} +.desc h3 { + color: rgba(0, 0, 0, 0.45); +} +.desc h4 { + color: rgba(0, 0, 0, 0.45); +} +.information .label { + color: rgba(0, 0, 0, 0.85); +} +.errorIcon { + color: #f5222d; +} +.errorListItem { + border-bottom: 1px solid #e8e8e8; +} +.errorListItem:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.errorListItem:last-child { + border: 0; +} +.errorListItem .errorIcon { + color: #f5222d; +} +.errorListItem .errorField { + color: rgba(0, 0, 0, 0.45); +} +.optional { + color: rgba(0, 0, 0, 0.45); +} +a.listItemMetaTitle { + color: rgba(0, 0, 0, 0.85); +} +.noData { + color: rgba(0, 0, 0, 0.25); +} +.heading { + color: rgba(0, 0, 0, 0.85); +} +.textSecondary { + color: rgba(0, 0, 0, 0.45); +} +.title { + color: rgba(0, 0, 0, 0.85); +} +.main .icon { + color: rgba(0, 0, 0, 0.2); +} +.main .icon:hover { + color: @primary-color; +} +.success { + color: #52c41a; +} +.warning { + color: #faad14; +} +.error { + color: #f5222d; +} +.progress-pass > .progress :global .ant-progress-bg { + background-color: #faad14; +} +html { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; +} +h1, +h2, +h3, +h4, +h5, +h6 { + color: rgba(0, 0, 0, 0.85); +} +abbr[title], +abbr[data-original-title] { + border-bottom: 0; +} +a { + color: @primary-color; + background-color: transparent; +} +a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +a:active { + color: color(~`colorPalette("@{primary-color}", 7)`); +} +a[disabled] { + color: rgba(0, 0, 0, 0.25); +} +img { + border-style: none; +} +table { + border-collapse: collapse; +} +caption { + color: rgba(0, 0, 0, 0.45); +} +input, +button, +select, +optgroup, +textarea { + color: inherit; +} +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; +} +fieldset { + border: 0; +} +legend { + color: inherit; +} +mark { + background-color: #feffe6; +} +::selection { + background: @primary-color; + color: #fff; +} +[ant-click-animating-without-extra-node]:after, +.ant-click-animating-node { + border-radius: inherit; + border: 0 solid @primary-color; +} +.ant-alert { + color: rgba(0, 0, 0, 0.65); + border-radius: 4px; +} +.ant-alert-success { + border: 1px solid #b7eb8f; + background-color: #f6ffed; +} +.ant-alert-success .ant-alert-icon { + color: #52c41a; +} +.ant-alert-info { + border: 1px solid color(~`colorPalette("@{primary-color}", 3)`); + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-alert-info .ant-alert-icon { + color: @primary-color; +} +.ant-alert-warning { + border: 1px solid #ffe58f; + background-color: #fffbe6; +} +.ant-alert-warning .ant-alert-icon { + color: #faad14; +} +.ant-alert-error { + border: 1px solid #ffa39e; + background-color: #fff1f0; +} +.ant-alert-error .ant-alert-icon { + color: #f5222d; +} +.ant-alert-close-icon .anticon-close { + color: rgba(0, 0, 0, 0.45); +} +.ant-alert-close-icon .anticon-close:hover { + color: #404040; +} +.ant-alert-with-description { + border-radius: 4px; + color: rgba(0, 0, 0, 0.65); +} +.ant-alert-with-description .ant-alert-message { + color: rgba(0, 0, 0, 0.85); +} +.ant-alert-banner { + border-radius: 0; + border: 0; +} +.ant-anchor { + color: rgba(0, 0, 0, 0.65); +} +.ant-anchor-wrapper { + background-color: #fff; +} +.ant-anchor-ink:before { + background-color: #e8e8e8; +} +.ant-anchor-ink-ball { + border-radius: 8px; + border: 2px solid @primary-color; + background-color: #fff; +} +.ant-anchor-link-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-anchor-link-active > .ant-anchor-link-title { + color: @primary-color; +} +.ant-select-auto-complete { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-auto-complete.ant-select .ant-select-selection { + border: 0; + box-shadow: none; +} +.ant-select-auto-complete.ant-select .ant-input { + background: transparent; + border-width: 1px; +} +.ant-select-auto-complete.ant-select .ant-input:focus, +.ant-select-auto-complete.ant-select .ant-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-avatar { + color: rgba(0, 0, 0, 0.65); + background: #ccc; + color: #fff; + border-radius: 50%; +} +.ant-avatar-image { + background: transparent; +} +.ant-avatar-lg { + border-radius: 50%; +} +.ant-avatar-sm { + border-radius: 50%; +} +.ant-avatar-square { + border-radius: 4px; +} +.ant-back-top { + color: rgba(0, 0, 0, 0.65); +} +.ant-back-top-content { + border-radius: 20px; + background-color: rgba(0, 0, 0, 0.45); + color: #fff; +} +.ant-back-top-content:hover { + background-color: rgba(0, 0, 0, 0.65); +} +.ant-back-top-icon { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAoCAYAAACWwljjAAAABGdBTUEAALGPC/xhBQAAAbtJREFUWAntmMtKw0AUhhMvS5cuxILgQlRUpIggIoKIIoigG1eC+AA+jo+i6FIXBfeuXIgoeKVeitVWJX5HWhhDksnUpp3FDPyZk3Nm5nycmZKkXhAEOXSA3lG7muTeRzmfy6HneUvIhnYkQK+Q9NhAA0Opg0vBEhjBKHiyb8iGMyQMOYuK41BcBSypAL+MYXSKjtFAW7EAGEO3qN4uMQbbAkXiSfRQJ1H6a+yhlkKRcAoVFYiweYNjtCVQJJpBz2GCiPt7fBOZQpFgDpUikse5HgnkM4Fi4QX0Fpc5wf9EbLqpUCy4jMoJSXWhFwbMNgWKhVbRhy5jirhs9fy/oFhgHVVTJEs7RLZ8sSEoJm6iz7SZDMbJ+/OKERQTttCXQRLToRUmrKWCYuA2+jbN0MB4OQobYShfdTCgn/sL1K36M7TLrN3n+758aPy2rrpR6+/od5E8tf/A1uLS9aId5T7J3CNYihkQ4D9PiMdMC7mp4rjB9kjFjZp8BlnVHJBuO1yFXIV0FdDF3RlyFdJVQBdv5AxVdIsq8apiZ2PyYO1EVykesGfZEESsCkweyR8MUW+V8uJ1gkYipmpdP1pm2aJVPEGzAAAAAElFTkSuQmCC) 100%/100% no-repeat; +} +.ant-badge { + color: rgba(0, 0, 0, 0.65); + color: unset; +} +.ant-badge-count { + border-radius: 10px; + background: #f5222d; + color: #fff; + box-shadow: 0 0 0 1px #fff; +} +.ant-badge-count a, +.ant-badge-count a:hover { + color: #fff; +} +.ant-badge-dot { + border-radius: 100%; + background: #f5222d; + box-shadow: 0 0 0 1px #fff; +} +.ant-badge-status-dot { + border-radius: 50%; +} +.ant-badge-status-success { + background-color: #52c41a; +} +.ant-badge-status-processing { + background-color: @primary-color; +} +.ant-badge-status-processing:after { + border-radius: 50%; + border: 1px solid @primary-color; +} +.ant-badge-status-default { + background-color: #d9d9d9; +} +.ant-badge-status-error { + background-color: #f5222d; +} +.ant-badge-status-warning { + background-color: #faad14; +} +.ant-badge-status-text { + color: rgba(0, 0, 0, 0.65); +} +.ant-breadcrumb { + color: rgba(0, 0, 0, 0.65); + color: rgba(0, 0, 0, 0.45); +} +.ant-breadcrumb a { + color: rgba(0, 0, 0, 0.45); +} +.ant-breadcrumb a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-breadcrumb > span:last-child { + color: rgba(0, 0, 0, 0.65); +} +.ant-breadcrumb-separator { + color: rgba(0, 0, 0, 0.45); +} +.ant-btn { + background-image: none; + border: 1px solid transparent; + border-radius: 4px; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-color: #d9d9d9; +} +.ant-btn:not([disabled]):active { + box-shadow: none; +} +.ant-btn-lg { + border-radius: 4px; +} +.ant-btn-sm { + border-radius: 4px; +} +.ant-btn > a:only-child { + color: currentColor; +} +.ant-btn > a:only-child:after { + background: transparent; +} +.ant-btn:hover, +.ant-btn:focus { + color: color(~`colorPalette("@{primary-color}", 5)`); + background-color: #fff; + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn:hover > a:only-child, +.ant-btn:focus > a:only-child { + color: currentColor; +} +.ant-btn:hover > a:only-child:after, +.ant-btn:focus > a:only-child:after { + background: transparent; +} +.ant-btn:active, +.ant-btn.active { + color: color(~`colorPalette("@{primary-color}", 7)`); + background-color: #fff; + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-btn:active > a:only-child, +.ant-btn.active > a:only-child { + color: currentColor; +} +.ant-btn:active > a:only-child:after, +.ant-btn.active > a:only-child:after { + background: transparent; +} +.ant-btn.disabled, +.ant-btn[disabled], +.ant-btn.disabled:hover, +.ant-btn[disabled]:hover, +.ant-btn.disabled:focus, +.ant-btn[disabled]:focus, +.ant-btn.disabled:active, +.ant-btn[disabled]:active, +.ant-btn.disabled.active, +.ant-btn[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn.disabled > a:only-child, +.ant-btn[disabled] > a:only-child, +.ant-btn.disabled:hover > a:only-child, +.ant-btn[disabled]:hover > a:only-child, +.ant-btn.disabled:focus > a:only-child, +.ant-btn[disabled]:focus > a:only-child, +.ant-btn.disabled:active > a:only-child, +.ant-btn[disabled]:active > a:only-child, +.ant-btn.disabled.active > a:only-child, +.ant-btn[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn.disabled > a:only-child:after, +.ant-btn[disabled] > a:only-child:after, +.ant-btn.disabled:hover > a:only-child:after, +.ant-btn[disabled]:hover > a:only-child:after, +.ant-btn.disabled:focus > a:only-child:after, +.ant-btn[disabled]:focus > a:only-child:after, +.ant-btn.disabled:active > a:only-child:after, +.ant-btn[disabled]:active > a:only-child:after, +.ant-btn.disabled.active > a:only-child:after, +.ant-btn[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn:hover, +.ant-btn:focus, +.ant-btn:active, +.ant-btn.active { + background: #fff; +} +.ant-btn-primary { + color: #fff; + background-color: @primary-color; + border-color: @primary-color; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035); +} +.ant-btn-primary > a:only-child { + color: currentColor; +} +.ant-btn-primary > a:only-child:after { + background: transparent; +} +.ant-btn-primary:hover, +.ant-btn-primary:focus { + color: #fff; + background-color: color(~`colorPalette("@{primary-color}", 5)`); + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-primary:hover > a:only-child, +.ant-btn-primary:focus > a:only-child { + color: currentColor; +} +.ant-btn-primary:hover > a:only-child:after, +.ant-btn-primary:focus > a:only-child:after { + background: transparent; +} +.ant-btn-primary:active, +.ant-btn-primary.active { + color: #fff; + background-color: color(~`colorPalette("@{primary-color}", 7)`); + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-btn-primary:active > a:only-child, +.ant-btn-primary.active > a:only-child { + color: currentColor; +} +.ant-btn-primary:active > a:only-child:after, +.ant-btn-primary.active > a:only-child:after { + background: transparent; +} +.ant-btn-primary.disabled, +.ant-btn-primary[disabled], +.ant-btn-primary.disabled:hover, +.ant-btn-primary[disabled]:hover, +.ant-btn-primary.disabled:focus, +.ant-btn-primary[disabled]:focus, +.ant-btn-primary.disabled:active, +.ant-btn-primary[disabled]:active, +.ant-btn-primary.disabled.active, +.ant-btn-primary[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-primary.disabled > a:only-child, +.ant-btn-primary[disabled] > a:only-child, +.ant-btn-primary.disabled:hover > a:only-child, +.ant-btn-primary[disabled]:hover > a:only-child, +.ant-btn-primary.disabled:focus > a:only-child, +.ant-btn-primary[disabled]:focus > a:only-child, +.ant-btn-primary.disabled:active > a:only-child, +.ant-btn-primary[disabled]:active > a:only-child, +.ant-btn-primary.disabled.active > a:only-child, +.ant-btn-primary[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-primary.disabled > a:only-child:after, +.ant-btn-primary[disabled] > a:only-child:after, +.ant-btn-primary.disabled:hover > a:only-child:after, +.ant-btn-primary[disabled]:hover > a:only-child:after, +.ant-btn-primary.disabled:focus > a:only-child:after, +.ant-btn-primary[disabled]:focus > a:only-child:after, +.ant-btn-primary.disabled:active > a:only-child:after, +.ant-btn-primary[disabled]:active > a:only-child:after, +.ant-btn-primary.disabled.active > a:only-child:after, +.ant-btn-primary[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child) { + border-right-color: color(~`colorPalette("@{primary-color}", 5)`); + border-left-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled { + border-color: #d9d9d9; +} +.ant-btn-group .ant-btn-primary:first-child:not(:last-child) { + border-right-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled] { + border-right-color: #d9d9d9; +} +.ant-btn-group .ant-btn-primary:last-child:not(:first-child), +.ant-btn-group .ant-btn-primary + .ant-btn-primary { + border-left-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled], +.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] { + border-left-color: #d9d9d9; +} +.ant-btn-ghost { + color: rgba(0, 0, 0, 0.65); + background-color: transparent; + border-color: #d9d9d9; +} +.ant-btn-ghost > a:only-child { + color: currentColor; +} +.ant-btn-ghost > a:only-child:after { + background: transparent; +} +.ant-btn-ghost:hover, +.ant-btn-ghost:focus { + color: color(~`colorPalette("@{primary-color}", 5)`); + background-color: transparent; + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-ghost:hover > a:only-child, +.ant-btn-ghost:focus > a:only-child { + color: currentColor; +} +.ant-btn-ghost:hover > a:only-child:after, +.ant-btn-ghost:focus > a:only-child:after { + background: transparent; +} +.ant-btn-ghost:active, +.ant-btn-ghost.active { + color: color(~`colorPalette("@{primary-color}", 7)`); + background-color: transparent; + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-btn-ghost:active > a:only-child, +.ant-btn-ghost.active > a:only-child { + color: currentColor; +} +.ant-btn-ghost:active > a:only-child:after, +.ant-btn-ghost.active > a:only-child:after { + background: transparent; +} +.ant-btn-ghost.disabled, +.ant-btn-ghost[disabled], +.ant-btn-ghost.disabled:hover, +.ant-btn-ghost[disabled]:hover, +.ant-btn-ghost.disabled:focus, +.ant-btn-ghost[disabled]:focus, +.ant-btn-ghost.disabled:active, +.ant-btn-ghost[disabled]:active, +.ant-btn-ghost.disabled.active, +.ant-btn-ghost[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-ghost.disabled > a:only-child, +.ant-btn-ghost[disabled] > a:only-child, +.ant-btn-ghost.disabled:hover > a:only-child, +.ant-btn-ghost[disabled]:hover > a:only-child, +.ant-btn-ghost.disabled:focus > a:only-child, +.ant-btn-ghost[disabled]:focus > a:only-child, +.ant-btn-ghost.disabled:active > a:only-child, +.ant-btn-ghost[disabled]:active > a:only-child, +.ant-btn-ghost.disabled.active > a:only-child, +.ant-btn-ghost[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-ghost.disabled > a:only-child:after, +.ant-btn-ghost[disabled] > a:only-child:after, +.ant-btn-ghost.disabled:hover > a:only-child:after, +.ant-btn-ghost[disabled]:hover > a:only-child:after, +.ant-btn-ghost.disabled:focus > a:only-child:after, +.ant-btn-ghost[disabled]:focus > a:only-child:after, +.ant-btn-ghost.disabled:active > a:only-child:after, +.ant-btn-ghost[disabled]:active > a:only-child:after, +.ant-btn-ghost.disabled.active > a:only-child:after, +.ant-btn-ghost[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn-dashed { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-color: #d9d9d9; + border-style: dashed; +} +.ant-btn-dashed > a:only-child { + color: currentColor; +} +.ant-btn-dashed > a:only-child:after { + background: transparent; +} +.ant-btn-dashed:hover, +.ant-btn-dashed:focus { + color: color(~`colorPalette("@{primary-color}", 5)`); + background-color: #fff; + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-dashed:hover > a:only-child, +.ant-btn-dashed:focus > a:only-child { + color: currentColor; +} +.ant-btn-dashed:hover > a:only-child:after, +.ant-btn-dashed:focus > a:only-child:after { + background: transparent; +} +.ant-btn-dashed:active, +.ant-btn-dashed.active { + color: color(~`colorPalette("@{primary-color}", 7)`); + background-color: #fff; + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-btn-dashed:active > a:only-child, +.ant-btn-dashed.active > a:only-child { + color: currentColor; +} +.ant-btn-dashed:active > a:only-child:after, +.ant-btn-dashed.active > a:only-child:after { + background: transparent; +} +.ant-btn-dashed.disabled, +.ant-btn-dashed[disabled], +.ant-btn-dashed.disabled:hover, +.ant-btn-dashed[disabled]:hover, +.ant-btn-dashed.disabled:focus, +.ant-btn-dashed[disabled]:focus, +.ant-btn-dashed.disabled:active, +.ant-btn-dashed[disabled]:active, +.ant-btn-dashed.disabled.active, +.ant-btn-dashed[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-dashed.disabled > a:only-child, +.ant-btn-dashed[disabled] > a:only-child, +.ant-btn-dashed.disabled:hover > a:only-child, +.ant-btn-dashed[disabled]:hover > a:only-child, +.ant-btn-dashed.disabled:focus > a:only-child, +.ant-btn-dashed[disabled]:focus > a:only-child, +.ant-btn-dashed.disabled:active > a:only-child, +.ant-btn-dashed[disabled]:active > a:only-child, +.ant-btn-dashed.disabled.active > a:only-child, +.ant-btn-dashed[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-dashed.disabled > a:only-child:after, +.ant-btn-dashed[disabled] > a:only-child:after, +.ant-btn-dashed.disabled:hover > a:only-child:after, +.ant-btn-dashed[disabled]:hover > a:only-child:after, +.ant-btn-dashed.disabled:focus > a:only-child:after, +.ant-btn-dashed[disabled]:focus > a:only-child:after, +.ant-btn-dashed.disabled:active > a:only-child:after, +.ant-btn-dashed[disabled]:active > a:only-child:after, +.ant-btn-dashed.disabled.active > a:only-child:after, +.ant-btn-dashed[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn-danger { + color: #f5222d; + background-color: #f5f5f5; + border-color: #d9d9d9; +} +.ant-btn-danger > a:only-child { + color: currentColor; +} +.ant-btn-danger > a:only-child:after { + background: transparent; +} +.ant-btn-danger:hover { + color: #fff; + background-color: #ff4d4f; + border-color: #ff4d4f; +} +.ant-btn-danger:hover > a:only-child { + color: currentColor; +} +.ant-btn-danger:hover > a:only-child:after { + background: transparent; +} +.ant-btn-danger:focus { + color: #ff4d4f; + background-color: #fff; + border-color: #ff4d4f; +} +.ant-btn-danger:focus > a:only-child { + color: currentColor; +} +.ant-btn-danger:focus > a:only-child:after { + background: transparent; +} +.ant-btn-danger:active, +.ant-btn-danger.active { + color: #fff; + background-color: #cf1322; + border-color: #cf1322; +} +.ant-btn-danger:active > a:only-child, +.ant-btn-danger.active > a:only-child { + color: currentColor; +} +.ant-btn-danger:active > a:only-child:after, +.ant-btn-danger.active > a:only-child:after { + background: transparent; +} +.ant-btn-danger.disabled, +.ant-btn-danger[disabled], +.ant-btn-danger.disabled:hover, +.ant-btn-danger[disabled]:hover, +.ant-btn-danger.disabled:focus, +.ant-btn-danger[disabled]:focus, +.ant-btn-danger.disabled:active, +.ant-btn-danger[disabled]:active, +.ant-btn-danger.disabled.active, +.ant-btn-danger[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-danger.disabled > a:only-child, +.ant-btn-danger[disabled] > a:only-child, +.ant-btn-danger.disabled:hover > a:only-child, +.ant-btn-danger[disabled]:hover > a:only-child, +.ant-btn-danger.disabled:focus > a:only-child, +.ant-btn-danger[disabled]:focus > a:only-child, +.ant-btn-danger.disabled:active > a:only-child, +.ant-btn-danger[disabled]:active > a:only-child, +.ant-btn-danger.disabled.active > a:only-child, +.ant-btn-danger[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-danger.disabled > a:only-child:after, +.ant-btn-danger[disabled] > a:only-child:after, +.ant-btn-danger.disabled:hover > a:only-child:after, +.ant-btn-danger[disabled]:hover > a:only-child:after, +.ant-btn-danger.disabled:focus > a:only-child:after, +.ant-btn-danger[disabled]:focus > a:only-child:after, +.ant-btn-danger.disabled:active > a:only-child:after, +.ant-btn-danger[disabled]:active > a:only-child:after, +.ant-btn-danger.disabled.active > a:only-child:after, +.ant-btn-danger[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn-circle, +.ant-btn-circle-outline { + border-radius: 50%; +} +.ant-btn-circle.ant-btn-lg, +.ant-btn-circle-outline.ant-btn-lg { + border-radius: 50%; +} +.ant-btn-circle.ant-btn-sm, +.ant-btn-circle-outline.ant-btn-sm { + border-radius: 50%; +} +.ant-btn:before { + background: #fff; + border-radius: inherit; +} +.ant-btn-group-lg > .ant-btn, +.ant-btn-group-lg > span > .ant-btn { + border-radius: 0; +} +.ant-btn-group-sm > .ant-btn, +.ant-btn-group-sm > span > .ant-btn { + border-radius: 0; +} +.ant-btn-group .ant-btn-primary + .ant-btn:not(.ant-btn-primary):not([disabled]) { + border-left-color: transparent; +} +.ant-btn-group .ant-btn { + border-radius: 0; +} +.ant-btn-group > .ant-btn:only-child { + border-radius: 4px; +} +.ant-btn-group > span:only-child > .ant-btn { + border-radius: 4px; +} +.ant-btn-group > .ant-btn:first-child:not(:last-child), +.ant-btn-group > span:first-child:not(:last-child) > .ant-btn { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ant-btn-group > .ant-btn:last-child:not(:first-child), +.ant-btn-group > span:last-child:not(:first-child) > .ant-btn { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.ant-btn-group-sm > .ant-btn:only-child { + border-radius: 4px; +} +.ant-btn-group-sm > span:only-child > .ant-btn { + border-radius: 4px; +} +.ant-btn-group-sm > .ant-btn:first-child:not(:last-child), +.ant-btn-group-sm > span:first-child:not(:last-child) > .ant-btn { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ant-btn-group-sm > .ant-btn:last-child:not(:first-child), +.ant-btn-group-sm > span:last-child:not(:first-child) > .ant-btn { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.ant-btn-group > .ant-btn-group:not(:first-child):not(:last-child) > .ant-btn { + border-radius: 0; +} +.ant-btn-group > .ant-btn-group:first-child:not(:last-child) > .ant-btn:last-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-btn-group > .ant-btn-group:last-child:not(:first-child) > .ant-btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-btn-background-ghost { + background: transparent !important; + border-color: #fff; + color: #fff; +} +.ant-btn-background-ghost.ant-btn-primary { + color: @primary-color; + background-color: transparent; + border-color: @primary-color; +} +.ant-btn-background-ghost.ant-btn-primary > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-primary:hover, +.ant-btn-background-ghost.ant-btn-primary:focus { + color: color(~`colorPalette("@{primary-color}", 5)`); + background-color: transparent; + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-primary:active, +.ant-btn-background-ghost.ant-btn-primary.active { + color: color(~`colorPalette("@{primary-color}", 7)`); + background-color: transparent; + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-btn-background-ghost.ant-btn-primary:active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.active > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-primary.disabled, +.ant-btn-background-ghost.ant-btn-primary[disabled], +.ant-btn-background-ghost.ant-btn-primary.disabled:hover, +.ant-btn-background-ghost.ant-btn-primary[disabled]:hover, +.ant-btn-background-ghost.ant-btn-primary.disabled:focus, +.ant-btn-background-ghost.ant-btn-primary[disabled]:focus, +.ant-btn-background-ghost.ant-btn-primary.disabled:active, +.ant-btn-background-ghost.ant-btn-primary[disabled]:active, +.ant-btn-background-ghost.ant-btn-primary.disabled.active, +.ant-btn-background-ghost.ant-btn-primary[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-background-ghost.ant-btn-primary.disabled > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled:active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled.active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary.disabled > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled.active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled].active > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger { + color: #f5222d; + background-color: transparent; + border-color: #f5222d; +} +.ant-btn-background-ghost.ant-btn-danger > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger:hover, +.ant-btn-background-ghost.ant-btn-danger:focus { + color: #ff4d4f; + background-color: transparent; + border-color: #ff4d4f; +} +.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger:active, +.ant-btn-background-ghost.ant-btn-danger.active { + color: #cf1322; + background-color: transparent; + border-color: #cf1322; +} +.ant-btn-background-ghost.ant-btn-danger:active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.active > a:only-child:after { + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger.disabled, +.ant-btn-background-ghost.ant-btn-danger[disabled], +.ant-btn-background-ghost.ant-btn-danger.disabled:hover, +.ant-btn-background-ghost.ant-btn-danger[disabled]:hover, +.ant-btn-background-ghost.ant-btn-danger.disabled:focus, +.ant-btn-background-ghost.ant-btn-danger[disabled]:focus, +.ant-btn-background-ghost.ant-btn-danger.disabled:active, +.ant-btn-background-ghost.ant-btn-danger[disabled]:active, +.ant-btn-background-ghost.ant-btn-danger.disabled.active, +.ant-btn-background-ghost.ant-btn-danger[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-btn-background-ghost.ant-btn-danger.disabled > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled:active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled.active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger.disabled > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled.active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled].active > a:only-child:after { + background: transparent; +} +.christmas.ant-btn-primary:before { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAXCAYAAABOHMIhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABiZJREFUeNrsWMtPlFcUvzPMwIDysLyRR4uATDHWCiVgSmRlios2DeiiXUFs0nRBd6arxqQhJDapkYXhP4BqDKTQhZaFNQSCaBEVJjwdHsNr5DUMDDPDzPT3u7nTDEgRKrKgc5KT+z3uufec33de99P4fD4RpL2RNgjB3kn35MkTeRERESFiYmLkGBoaKnQ6nWSNRvPPZFxr+vv7k6KioiIdDsfa8vLyQkFBgcP3Bnel3MDAQArWI0eFhISE87nb7bZ7PJ4VvLYuLi5O5+fnu9+kMNfq6+tLjIyMzMY6KeBEbK/XarXReI3lPDZMWcc4v7GxYV1dXR3Jy8ub2E5HPvJ6vRSSDH0ku1wuAfsEZOV1IEFHoeNFdHS0yMrK2knR0Lm5uR+hxLdQMjbwHTZbB41h8RGwCdc9MzMzneHh4bGJiYlf4SN8ijkfwqiIncCAAR7Iz2GPSShudjqdfeCeqampvwBQfFxc3JdYqwTv8gB8/F48A8BgKecE14V+L7ju2tpae05OzkuCCZvkPOj8mizmC6vVKtmPu+bx48cC3qI1mUyFUOyywWD4SHlELBaLJmCHNcwAghuAOujtuF4FqHO4nsX4EsAS3I4TJ04ME1h8PDE9PS09TYZoY2Pj1729vd6lpSVfkDYTPG0UkfNDRUWFgQ5Gb2Mh0N29e9eG/GQfHh4W8/PzwUy/ObQ/gMfVVlZW1iAiZdQxp3nv3LljRoL/5erVq1UIxzSiiVD9X4EDYATynCwAzGO858hCQRoaGmJFZNJz8YIcBc4BF966dau6sLAwBxVSJCUlCSThQwuU3W6XkYUok1Vzm5znQx5bbm9v77p+/frPeNSNRzZ/ISBwrG4ZR48eLamtrf2+uLjYSEG9Xi/wTISFhQlWGXohyzO/CJlVl23KQRLbABoaHx+/Z1lUZ/Hq1SsJFj3JT3hmHx8fnydPTEzMj46OziHPW2w22wxeD4Kfgadh/4YEzU8Az4DhffAn5eXlX1y6dKkEoCTspAQ9Mjs7+0BBo8Fms1lkZGTsOo0QLLRNkvnR+fEJzIMHD0xtbW39CL8JTFtSbAOvBIyLHIGVm9VzE2gKuDAMSSpcT6KXyT137lx2cnLyMXhcGDb3wq3XuWF3d/fCzZs3P0c4v5eSknJQbYLo7Ox0gC2lpaVZ3Be67Th/dnZWoAJKsJC3XA8fPhxoamp6hMb+BaaMgWcUMGtszZjiFDNmvcDI91pzG0iY4ARwkwrxkcHBwUdgNrRMbnrqoRbkVzDcvn3bl5qaWsmcgFH4G8XdEGUWFhak51AuISFBnkoCTyFbyWKxCJwIxlC0fq2rq7tcVFRkRKskjh8/Lr0+kBjCCDV/knfdv3//WX19/R8IRRNemxlu4AXwKqM+EJwdj1HbPYSwh3sCPAJDABm2LLchCjS+5/kirKGhwWk0GrMuXrxYQuX9hm/XXTMXMY+srKwI5ApZrbYmZh7deEJhAUKjLe/pLTzSsCuHrK+1tbUJVe3P6upq87Vr174rKysrYHVj/uW+OH3IfEuw4F3ee/fuPQfAvwOs5yyE4CnlFOu7BWrTCWlreO6FACpBZGwUw4BvkANLobReHb3kGZYGsGzTq/zlO8AT1ru6uoZbWlqeA6gINJAfnz59OlVLoX8Jtebm5raampqfcMvQYgTknz9//sKVK1c+y83NTdIEuCnaKMuNGzd+6+np6cCtSTkAw9D9X8Dyh+dbgaaAC1XAnUlPTy+qqqq6cPbs2UzkmWjNljiDJzpwHFnCkW2yo6NjCKW8H54wjlezKvRT09LSTsJrz5w6dSoN+Yp51ADAPUj8VoDbDq9pxrwuJcNIYQllJTIi/xopBw/VA7DJp0+f9hA78CgL5F5C8J2CpoCj8sfA6WCe/FPRhsRlZmbGIs8Y4FFO5CJgtrSsvrRVGW1V93b1myoGnKAKEcHgnwsWpg1lNI0fphwrmdqbckeU18WrnlOjqp5/j7W3BWvfQVPKa5SBkcrYCNVB65TRTlWZ1lXiXVU5xbtlDb2SPaLWYwrgHIcqPg6Vc7fbX69Yoyqfa7/AeiegbWOEVhmsVcWDwPn224iDJgla8Hd38Hd3ELQgaIeI/hZgAIPEp0vmQJdoAAAAAElFTkSuQmCC) no-repeat 50% 0; + background-size: 64px; +} +.christmas.ant-btn-primary.ant-btn-lg:before { + background-size: 72px; +} +.christmas.ant-btn-primary.ant-btn-sm:before { + background-size: 56px; +} +.ant-fullcalendar { + color: rgba(0, 0, 0, 0.65); + border-top: 1px solid #d9d9d9; +} +.ant-fullcalendar table { + border-collapse: collapse; + background-color: transparent; +} +.ant-fullcalendar table, +.ant-fullcalendar th, +.ant-fullcalendar td { + border: 0; +} +.ant-fullcalendar-calendar-table { + border-spacing: 0; +} +.ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.65); + border-radius: 2px; + background: transparent; +} +.ant-fullcalendar-value:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-fullcalendar-value:active { + background: @primary-color; + color: #fff; +} +.ant-fullcalendar-today .ant-fullcalendar-value, +.ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value { + box-shadow: 0 0 0 1px @primary-color inset; +} +.ant-fullcalendar-selected-day .ant-fullcalendar-value, +.ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value { + background: @primary-color; + color: #fff; +} +.ant-fullcalendar-disabled-cell-first-of-row .ant-fullcalendar-value { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.ant-fullcalendar-disabled-cell-last-of-row .ant-fullcalendar-value { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.ant-fullcalendar-last-month-cell .ant-fullcalendar-value, +.ant-fullcalendar-next-month-btn-day .ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.25); +} +.ant-fullcalendar-month-panel-table { + border-collapse: separate; +} +.ant-fullcalendar-fullscreen { + border-top: 0; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month, +.ant-fullcalendar-fullscreen .ant-fullcalendar-date { + color: rgba(0, 0, 0, 0.65); + border-top: 2px solid #e8e8e8; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month:hover, +.ant-fullcalendar-fullscreen .ant-fullcalendar-date:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month:active, +.ant-fullcalendar-fullscreen .ant-fullcalendar-date:active { + background: color(~`colorPalette("@{primary-color}", 2)`); +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-value { + background: transparent; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.65); +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-month, +.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-date { + border-top-color: @primary-color; + background: transparent; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value, +.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value { + box-shadow: none; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-month, +.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-date { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value, +.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-value { + color: @primary-color; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-last-month-cell .ant-fullcalendar-date, +.ant-fullcalendar-fullscreen .ant-fullcalendar-next-month-btn-day .ant-fullcalendar-date { + color: rgba(0, 0, 0, 0.25); +} +.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date, +.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date:hover { + background: transparent; +} +.ant-fullcalendar-disabled-cell .ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.25); + border-radius: 0; +} +.ant-card { + color: rgba(0, 0, 0, 0.65); + background: #fff; + border-radius: 2px; +} +.ant-card-hoverable:hover { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09); + border-color: rgba(0, 0, 0, 0.09); +} +.ant-card-bordered { + border: 1px solid #e8e8e8; +} +.ant-card-head { + background: transparent; + border-bottom: 1px solid #e8e8e8; + border-radius: 2px 2px 0 0; + color: rgba(0, 0, 0, 0.85); +} +.ant-card-head .ant-tabs { + color: rgba(0, 0, 0, 0.65); +} +.ant-card-head .ant-tabs-bar { + border-bottom: 1px solid #e8e8e8; +} +.ant-card-extra { + color: rgba(0, 0, 0, 0.65); +} +.ant-card-grid { + border-radius: 0; + border: 0; + box-shadow: 1px 0 0 0 #e8e8e8, 0 1px 0 0 #e8e8e8, 1px 1px 0 0 #e8e8e8, 1px 0 0 0 #e8e8e8 inset, 0 1px 0 0 #e8e8e8 inset; +} +.ant-card-grid:hover { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-card-cover img { + border-radius: 2px 2px 0 0; +} +.ant-card-actions { + border-top: 1px solid #e8e8e8; + background: #fafafa; +} +.ant-card-actions > li { + color: rgba(0, 0, 0, 0.45); +} +.ant-card-actions > li > span:hover { + color: @primary-color; +} +.ant-card-actions > li > span a { + color: rgba(0, 0, 0, 0.45); +} +.ant-card-actions > li > span a:hover { + color: @primary-color; +} +.ant-card-actions > li:not(:last-child) { + border-right: 1px solid #e8e8e8; +} +.ant-card-type-inner .ant-card-head { + background: #fafafa; +} +.ant-card-meta-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-card-meta-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-card-loading-block { + border-radius: 2px; + background: linear-gradient(90deg, rgba(207, 216, 220, 0.2), rgba(207, 216, 220, 0.4), rgba(207, 216, 220, 0.2)); + background-size: 600% 600%; +} +.ant-carousel { + color: rgba(0, 0, 0, 0.65); +} +.ant-carousel .slick-slider { + -webkit-tap-highlight-color: transparent; +} +.ant-carousel .slick-vertical .slick-slide { + border: 1px solid transparent; +} +.ant-carousel .slick-prev, +.ant-carousel .slick-next { + background: transparent; + color: transparent; + border: 0; +} +.ant-carousel .slick-prev:hover, +.ant-carousel .slick-next:hover, +.ant-carousel .slick-prev:focus, +.ant-carousel .slick-next:focus { + background: transparent; + color: transparent; +} +.ant-carousel .slick-dots li button { + border: 0; + background: #fff; + border-radius: 1px; + color: transparent; +} +.ant-carousel .slick-dots li.slick-active button { + background: #fff; +} +.ant-cascader { + color: rgba(0, 0, 0, 0.65); +} +.ant-cascader-input.ant-input { + background-color: transparent !important; +} +.ant-cascader-picker { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-radius: 4px; +} +.ant-cascader-picker-with-value .ant-cascader-picker-label { + color: transparent; +} +.ant-cascader-picker-disabled { + background: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-picker:focus .ant-cascader-input { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-cascader-picker-show-search.ant-cascader-picker-focused { + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-picker-clear { + background: #fff; + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-picker-clear:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-cascader-picker-arrow { + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-menus { + background: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-cascader-menu { + border-right: 1px solid #e8e8e8; +} +.ant-cascader-menu:first-child { + border-radius: 4px 0 0 4px; +} +.ant-cascader-menu:last-child { + border-right-color: transparent; + border-radius: 0 4px 4px 0; +} +.ant-cascader-menu:only-child { + border-radius: 4px; +} +.ant-cascader-menu-item:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-cascader-menu-item-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-menu-item-disabled:hover { + background: transparent; +} +.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled), +.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover { + background: #f5f5f5; +} +.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon, +.ant-cascader-menu-item-expand .ant-cascader-menu-item-loading-icon { + color: rgba(0, 0, 0, 0.45); +} +.ant-cascader-menu-item .ant-cascader-menu-item-keyword { + color: #f5222d; +} +.ant-checkbox { + color: rgba(0, 0, 0, 0.65); +} +.ant-checkbox-wrapper:hover .ant-checkbox-inner, +.ant-checkbox:hover .ant-checkbox-inner, +.ant-checkbox-input:focus + .ant-checkbox-inner { + border-color: @primary-color; +} +.ant-checkbox-checked:after { + border-radius: 2px; + border: 1px solid @primary-color; +} +.ant-checkbox-inner { + border: 1px solid #d9d9d9; + border-radius: 2px; + background-color: #fff; +} +.ant-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-checkbox-indeterminate .ant-checkbox-inner:after { + border: 0; + background-color: @primary-color; +} +.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-checkbox-checked .ant-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-checkbox-checked .ant-checkbox-inner { + background-color: @primary-color; + border-color: @primary-color; +} +.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-checkbox-disabled .ant-checkbox-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-checkbox-disabled .ant-checkbox-inner:after { + border-color: #f5f5f5; +} +.ant-checkbox-disabled + span { + color: rgba(0, 0, 0, 0.25); +} +.ant-checkbox-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-checkbox-group { + color: rgba(0, 0, 0, 0.65); +} +.ant-collapse { + color: rgba(0, 0, 0, 0.65); + background-color: #fafafa; + border-radius: 4px; + border: 1px solid #d9d9d9; + border-bottom: 0; +} +.ant-collapse > .ant-collapse-item { + border-bottom: 1px solid #d9d9d9; +} +.ant-collapse > .ant-collapse-item:last-child, +.ant-collapse > .ant-collapse-item:last-child > .ant-collapse-header { + border-radius: 0 0 4px 4px; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header { + color: rgba(0, 0, 0, 0.85); +} +.ant-collapse-content { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-top: 1px solid #d9d9d9; +} +.ant-collapse-item:last-child > .ant-collapse-content { + border-radius: 0 0 4px 4px; +} +.ant-collapse-borderless { + background-color: #fff; + border: 0; +} +.ant-collapse-borderless > .ant-collapse-item { + border-bottom: 1px solid #d9d9d9; +} +.ant-collapse-borderless > .ant-collapse-item:last-child, +.ant-collapse-borderless > .ant-collapse-item:last-child .ant-collapse-header { + border-radius: 0; +} +.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content { + background-color: transparent; + border-top: 0; +} +.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header, +.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header > .arrow { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-picker-container { + color: rgba(0, 0, 0, 0.65); +} +.ant-calendar-picker { + color: rgba(0, 0, 0, 0.65); +} +.ant-calendar-picker:hover .ant-calendar-picker-input:not(.ant-input-disabled) { + border-color: @primary-color; +} +.ant-calendar-picker:focus .ant-calendar-picker-input:not(.ant-input-disabled) { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-calendar-picker-clear { + color: rgba(0, 0, 0, 0.25); + background: #fff; +} +.ant-calendar-picker-clear:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-picker-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar { + border: 1px solid #fff; + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + background-clip: padding-box; +} +.ant-calendar-input-wrap { + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-input { + border: 0; + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +.ant-calendar-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-calendar-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-header a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar-header .ant-calendar-century-select, +.ant-calendar-header .ant-calendar-decade-select, +.ant-calendar-header .ant-calendar-year-select, +.ant-calendar-header .ant-calendar-month-select { + color: rgba(0, 0, 0, 0.85); +} +.ant-calendar-header .ant-calendar-prev-century-btn, +.ant-calendar-header .ant-calendar-next-century-btn, +.ant-calendar-header .ant-calendar-prev-decade-btn, +.ant-calendar-header .ant-calendar-next-decade-btn, +.ant-calendar-header .ant-calendar-prev-month-btn, +.ant-calendar-header .ant-calendar-next-month-btn, +.ant-calendar-header .ant-calendar-prev-year-btn, +.ant-calendar-header .ant-calendar-next-year-btn { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar table { + border-collapse: collapse; + background-color: transparent; +} +.ant-calendar table, +.ant-calendar th, +.ant-calendar td { + border: 0; +} +.ant-calendar-calendar-table { + border-spacing: 0; +} +.ant-calendar-date { + color: rgba(0, 0, 0, 0.65); + border-radius: 2px; + border: 1px solid transparent; + background: transparent; +} +.ant-calendar-date:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-calendar-date:active { + color: #fff; + background: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar-today .ant-calendar-date { + border-color: @primary-color; + color: @primary-color; +} +.ant-calendar-last-month-cell .ant-calendar-date, +.ant-calendar-next-month-btn-day .ant-calendar-date { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-selected-day .ant-calendar-date { + background: #d1e9ff; +} +.ant-calendar-selected-date .ant-calendar-date, +.ant-calendar-selected-start-date .ant-calendar-date, +.ant-calendar-selected-end-date .ant-calendar-date { + background: @primary-color; + color: #fff; + border: 1px solid transparent; +} +.ant-calendar-selected-date .ant-calendar-date:hover, +.ant-calendar-selected-start-date .ant-calendar-date:hover, +.ant-calendar-selected-end-date .ant-calendar-date:hover { + background: @primary-color; +} +.ant-calendar-disabled-cell .ant-calendar-date { + color: #bcbcbc; + background: #f5f5f5; + border-radius: 0; + border: 1px solid transparent; +} +.ant-calendar-disabled-cell .ant-calendar-date:hover { + background: #f5f5f5; +} +.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date:before { + border: 1px solid #bcbcbc; + border-radius: 2px; +} +.ant-calendar-disabled-cell-first-of-row .ant-calendar-date { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.ant-calendar-disabled-cell-last-of-row .ant-calendar-date { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.ant-calendar-footer { + border-top: 1px solid #e8e8e8; +} +.ant-calendar-footer:empty { + border-top: 0; +} +.ant-calendar .ant-calendar-today-btn-disabled, +.ant-calendar .ant-calendar-clear-btn-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar .ant-calendar-clear-btn:after { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar .ant-calendar-clear-btn:hover:after { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar .ant-calendar-ok-btn { + background-image: none; + border: 1px solid transparent; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + color: #fff; + background-color: @primary-color; + border-color: @primary-color; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035); + border-radius: 4px; +} +.ant-calendar .ant-calendar-ok-btn:not([disabled]):active { + box-shadow: none; +} +.ant-calendar .ant-calendar-ok-btn-lg { + border-radius: 4px; +} +.ant-calendar .ant-calendar-ok-btn-sm { + border-radius: 4px; +} +.ant-calendar .ant-calendar-ok-btn > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn > a:only-child:after { + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn:hover, +.ant-calendar .ant-calendar-ok-btn:focus { + color: #fff; + background-color: color(~`colorPalette("@{primary-color}", 5)`); + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar .ant-calendar-ok-btn:hover > a:only-child, +.ant-calendar .ant-calendar-ok-btn:focus > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn:hover > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn:focus > a:only-child:after { + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn:active, +.ant-calendar .ant-calendar-ok-btn.active { + color: #fff; + background-color: color(~`colorPalette("@{primary-color}", 7)`); + border-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-calendar .ant-calendar-ok-btn:active > a:only-child, +.ant-calendar .ant-calendar-ok-btn.active > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn:active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.active > a:only-child:after { + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn.disabled, +.ant-calendar .ant-calendar-ok-btn[disabled], +.ant-calendar .ant-calendar-ok-btn.disabled:hover, +.ant-calendar .ant-calendar-ok-btn[disabled]:hover, +.ant-calendar .ant-calendar-ok-btn.disabled:focus, +.ant-calendar .ant-calendar-ok-btn[disabled]:focus, +.ant-calendar .ant-calendar-ok-btn.disabled:active, +.ant-calendar .ant-calendar-ok-btn[disabled]:active, +.ant-calendar .ant-calendar-ok-btn.disabled.active, +.ant-calendar .ant-calendar-ok-btn[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-calendar .ant-calendar-ok-btn.disabled > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled] > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled:hover > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled]:hover > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled:focus > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled]:focus > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled:active > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled]:active > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled.active > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled].active > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn.disabled > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled] > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled:hover > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled]:hover > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled:focus > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled]:focus > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled:active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled]:active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled.active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled].active > a:only-child:after { + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn-disabled { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; +} +.ant-calendar .ant-calendar-ok-btn-disabled > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn-disabled > a:only-child:after { + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; +} +.ant-calendar .ant-calendar-ok-btn-disabled:hover > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn-disabled:hover > a:only-child:after { + background: transparent; +} +.ant-calendar-range-picker-input { + background-color: transparent; + border: 0; +} +.ant-calendar-range-picker-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-calendar-range-picker-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range-picker-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range-picker-separator { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-range-left .ant-calendar-time-picker-inner { + border-right: 1px solid #e8e8e8; +} +.ant-calendar-range-right .ant-calendar-time-picker-inner { + border-left: 1px solid #e8e8e8; +} +.ant-calendar-range-middle { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-range .ant-calendar-input, +.ant-calendar-range .ant-calendar-time-picker-input { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; + border: 0; + box-shadow: none; +} +.ant-calendar-range .ant-calendar-input::-moz-placeholder, +.ant-calendar-range .ant-calendar-time-picker-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-calendar-range .ant-calendar-input:-ms-input-placeholder, +.ant-calendar-range .ant-calendar-time-picker-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range .ant-calendar-input::-webkit-input-placeholder, +.ant-calendar-range .ant-calendar-time-picker-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range .ant-calendar-input:hover, +.ant-calendar-range .ant-calendar-time-picker-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-calendar-range .ant-calendar-input:focus, +.ant-calendar-range .ant-calendar-time-picker-input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-calendar-range .ant-calendar-input-disabled, +.ant-calendar-range .ant-calendar-time-picker-input-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-range .ant-calendar-input-disabled:hover, +.ant-calendar-range .ant-calendar-time-picker-input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-calendar-range .ant-calendar-input:focus, +.ant-calendar-range .ant-calendar-time-picker-input:focus { + box-shadow: none; +} +.ant-calendar-range .ant-calendar-in-range-cell { + border-radius: 0; +} +.ant-calendar-range .ant-calendar-in-range-cell:before { + background: color(~`colorPalette("@{primary-color}", 1)`); + border-radius: 0; + border: 0; +} +.ant-calendar-range .ant-calendar-header, +.ant-calendar-range .ant-calendar-month-panel-header, +.ant-calendar-range .ant-calendar-year-panel-header { + border-bottom: 0; +} +.ant-calendar-range .ant-calendar-body, +.ant-calendar-range .ant-calendar-month-panel-body, +.ant-calendar-range .ant-calendar-year-panel-body { + border-top: 1px solid #e8e8e8; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-inner { + background: none; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-combobox { + background-color: #fff; + border-top: 1px solid #e8e8e8; +} +.ant-calendar-range.ant-calendar-show-time-picker .ant-calendar-body { + border-top-color: transparent; +} +.ant-calendar-time-picker { + background-color: #fff; +} +.ant-calendar-time-picker-inner { + background-color: #fff; + background-clip: padding-box; +} +.ant-calendar-time-picker-select { + border-right: 1px solid #e8e8e8; +} +.ant-calendar-time-picker-select:first-child { + border-left: 0; +} +.ant-calendar-time-picker-select:last-child { + border-right: 0; +} +.ant-calendar-time-picker-select li:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +li.ant-calendar-time-picker-select-option-selected { + background: #f5f5f5; +} +li.ant-calendar-time-picker-select-option-disabled { + color: rgba(0, 0, 0, 0.25); +} +li.ant-calendar-time-picker-select-option-disabled:hover { + background: transparent; +} +.ant-calendar-time .ant-calendar-day-select { + color: rgba(0, 0, 0, 0.85); +} +.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-month-panel { + border-radius: 4px; + background: #fff; +} +.ant-calendar-month-panel-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-month-panel-header a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select, +.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select, +.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select, +.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select { + color: rgba(0, 0, 0, 0.85); +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-month-panel-table { + border-collapse: separate; +} +.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month { + background: @primary-color; + color: #fff; +} +.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month:hover { + background: @primary-color; + color: #fff; +} +.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month, +.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month:hover { + color: #bcbcbc; + background: #f5f5f5; +} +.ant-calendar-month-panel-month { + color: rgba(0, 0, 0, 0.65); + background: transparent; + border-radius: 2px; +} +.ant-calendar-month-panel-month:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-calendar-year-panel { + border-radius: 4px; + background: #fff; +} +.ant-calendar-year-panel-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-year-panel-header a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select, +.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select, +.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select, +.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select { + color: rgba(0, 0, 0, 0.85); +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-year-panel-table { + border-collapse: separate; +} +.ant-calendar-year-panel-year { + color: rgba(0, 0, 0, 0.65); + background: transparent; + border-radius: 2px; +} +.ant-calendar-year-panel-year:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year { + background: @primary-color; + color: #fff; +} +.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year:hover { + background: @primary-color; + color: #fff; +} +.ant-calendar-year-panel-last-decade-cell .ant-calendar-year-panel-year, +.ant-calendar-year-panel-next-decade-cell .ant-calendar-year-panel-year { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-decade-panel { + background: #fff; + border-radius: 4px; +} +.ant-calendar-decade-panel-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-decade-panel-header a:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select { + color: rgba(0, 0, 0, 0.85); +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-decade-panel-table { + border-collapse: separate; +} +.ant-calendar-decade-panel-decade { + color: rgba(0, 0, 0, 0.65); + background: transparent; + border-radius: 2px; +} +.ant-calendar-decade-panel-decade:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade { + background: @primary-color; + color: #fff; +} +.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade:hover { + background: @primary-color; + color: #fff; +} +.ant-calendar-decade-panel-last-century-cell .ant-calendar-decade-panel-decade, +.ant-calendar-decade-panel-next-century-cell .ant-calendar-decade-panel-decade { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-week-number .ant-calendar-body tr:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-calendar-week-number .ant-calendar-body tr.ant-calendar-active-week { + background: color(~`colorPalette("@{primary-color}", 2)`); +} +.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day .ant-calendar-date, +.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day:hover .ant-calendar-date { + background: transparent; + color: rgba(0, 0, 0, 0.65); +} +.ant-divider { + color: rgba(0, 0, 0, 0.65); + background: #e8e8e8; +} +.ant-divider-horizontal.ant-divider-with-text, +.ant-divider-horizontal.ant-divider-with-text-left, +.ant-divider-horizontal.ant-divider-with-text-right { + background: transparent; + color: rgba(0, 0, 0, 0.85); +} +.ant-divider-horizontal.ant-divider-with-text:before, +.ant-divider-horizontal.ant-divider-with-text-left:before, +.ant-divider-horizontal.ant-divider-with-text-right:before, +.ant-divider-horizontal.ant-divider-with-text:after, +.ant-divider-horizontal.ant-divider-with-text-left:after, +.ant-divider-horizontal.ant-divider-with-text-right:after { + border-top: 1px solid #e8e8e8; +} +.ant-divider-dashed { + background: none; + border-top: 1px dashed #e8e8e8; +} +.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed, +.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed, +.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed { + border-top: 0; +} +.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before, +.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:before, +.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:before, +.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after, +.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:after, +.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:after { + border-style: dashed none none; +} +.ant-drawer-left.ant-drawer-open .ant-drawer-content-wrapper { + box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-right.ant-drawer-open .ant-drawer-content-wrapper { + box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-top.ant-drawer-open .ant-drawer-content-wrapper { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-bottom.ant-drawer-open .ant-drawer-content-wrapper { + box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-drawer-content { + background-color: #fff; + border: 0; + background-clip: padding-box; +} +.ant-drawer-close { + border: 0; + background: transparent; + color: rgba(0, 0, 0, 0.45); +} +.ant-drawer-close:focus, +.ant-drawer-close:hover { + color: #444; +} +.ant-drawer-header { + border-radius: 4px 4px 0 0; + background: #fff; + color: rgba(0, 0, 0, 0.65); + border-bottom: 1px solid #e8e8e8; +} +.ant-drawer-mask { + background-color: rgba(0, 0, 0, 0.65); +} +.ant-drawer-open-content { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} +.ant-dropdown { + color: rgba(0, 0, 0, 0.65); +} +.ant-dropdown-menu { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + background-clip: padding-box; +} +.ant-dropdown-menu-item-group-title { + color: rgba(0, 0, 0, 0.45); +} +.ant-dropdown-menu-item, +.ant-dropdown-menu-submenu-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-dropdown-menu-item > a, +.ant-dropdown-menu-submenu-title > a { + color: rgba(0, 0, 0, 0.65); +} +.ant-dropdown-menu-item-selected, +.ant-dropdown-menu-submenu-title-selected, +.ant-dropdown-menu-item-selected > a, +.ant-dropdown-menu-submenu-title-selected > a { + color: @primary-color; + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-dropdown-menu-item:hover, +.ant-dropdown-menu-submenu-title:hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-dropdown-menu-item-disabled, +.ant-dropdown-menu-submenu-title-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-dropdown-menu-item-disabled:hover, +.ant-dropdown-menu-submenu-title-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #fff; +} +.ant-dropdown-menu-item-divider, +.ant-dropdown-menu-submenu-title-divider { + background-color: #e8e8e8; +} +.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon, +.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon { + color: rgba(0, 0, 0, 0.45); +} +.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title, +.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-dropdown-menu-dark, +.ant-dropdown-menu-dark .ant-dropdown-menu { + background: #001529; +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item, +.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title, +.ant-dropdown-menu-dark .ant-dropdown-menu-item > a { + color: rgba(255, 255, 255, 0.65); +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after, +.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after, +.ant-dropdown-menu-dark .ant-dropdown-menu-item > a .ant-dropdown-menu-submenu-arrow:after { + color: rgba(255, 255, 255, 0.65); +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover, +.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover, +.ant-dropdown-menu-dark .ant-dropdown-menu-item > a:hover { + color: #fff; + background: transparent; +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected, +.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover, +.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected > a { + background: @primary-color; + color: #fff; +} +.ant-form { + color: rgba(0, 0, 0, 0.65); +} +.ant-form legend { + color: rgba(0, 0, 0, 0.45); + border: 0; + border-bottom: 1px solid #d9d9d9; +} +.ant-form output { + color: rgba(0, 0, 0, 0.65); +} +.ant-form-item-required:before { + color: #f5222d; +} +.ant-form-item { + color: rgba(0, 0, 0, 0.65); +} +.ant-form-item-label label { + color: rgba(0, 0, 0, 0.85); +} +.ant-form-explain, +.ant-form-extra { + color: rgba(0, 0, 0, 0.45); +} +form .ant-upload { + background: transparent; +} +.ant-input-group-wrap .ant-select-selection { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group-wrap .ant-select-selection:hover { + border-color: #d9d9d9; +} +.ant-input-group-wrap .ant-select-selection--single { + background-color: #eee; +} +.ant-input-group-wrap .ant-select-open .ant-select-selection { + border-color: #d9d9d9; + box-shadow: none; +} +.has-success.has-feedback .ant-form-item-children-icon { + color: #52c41a; +} +.has-warning .ant-form-explain, +.has-warning .ant-form-split { + color: #faad14; +} +.has-warning .ant-input, +.has-warning .ant-input:hover { + border-color: #faad14; +} +.has-warning .ant-input:focus { + border-color: #ffc53d; + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-input:not([disabled]):hover { + border-color: #faad14; +} +.has-warning .ant-calendar-picker-open .ant-calendar-picker-input { + border-color: #ffc53d; + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-input-prefix { + color: #faad14; +} +.has-warning .ant-input-group-addon { + color: #faad14; + border-color: #faad14; + background-color: #fff; +} +.has-warning .has-feedback { + color: #faad14; +} +.has-warning.has-feedback .ant-form-item-children-icon { + color: #faad14; +} +.has-warning .ant-select-selection { + border-color: #faad14; +} +.has-warning .ant-select-open .ant-select-selection, +.has-warning .ant-select-focused .ant-select-selection { + border-color: #ffc53d; + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-calendar-picker-icon:after, +.has-warning .ant-time-picker-icon:after, +.has-warning .ant-picker-icon:after, +.has-warning .ant-select-arrow, +.has-warning .ant-cascader-picker-arrow { + color: #faad14; +} +.has-warning .ant-input-number, +.has-warning .ant-time-picker-input { + border-color: #faad14; +} +.has-warning .ant-input-number-focused, +.has-warning .ant-time-picker-input-focused, +.has-warning .ant-input-number:focus, +.has-warning .ant-time-picker-input:focus { + border-color: #ffc53d; + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-input-number:not([disabled]):hover, +.has-warning .ant-time-picker-input:not([disabled]):hover { + border-color: #faad14; +} +.has-warning .ant-cascader-picker:focus .ant-cascader-input { + border-color: #ffc53d; + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-form-explain, +.has-error .ant-form-split { + color: #f5222d; +} +.has-error .ant-input, +.has-error .ant-input:hover { + border-color: #f5222d; +} +.has-error .ant-input:focus { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-input:not([disabled]):hover { + border-color: #f5222d; +} +.has-error .ant-calendar-picker-open .ant-calendar-picker-input { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-input-prefix { + color: #f5222d; +} +.has-error .ant-input-group-addon { + color: #f5222d; + border-color: #f5222d; + background-color: #fff; +} +.has-error .has-feedback { + color: #f5222d; +} +.has-error.has-feedback .ant-form-item-children-icon { + color: #f5222d; +} +.has-error .ant-select-selection { + border-color: #f5222d; +} +.has-error .ant-select-open .ant-select-selection, +.has-error .ant-select-focused .ant-select-selection { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-select.ant-select-auto-complete .ant-input:focus { + border-color: #f5222d; +} +.has-error .ant-input-group-addon .ant-select-selection { + border-color: transparent; + box-shadow: none; +} +.has-error .ant-calendar-picker-icon:after, +.has-error .ant-time-picker-icon:after, +.has-error .ant-picker-icon:after, +.has-error .ant-select-arrow, +.has-error .ant-cascader-picker-arrow { + color: #f5222d; +} +.has-error .ant-input-number, +.has-error .ant-time-picker-input { + border-color: #f5222d; +} +.has-error .ant-input-number-focused, +.has-error .ant-time-picker-input-focused, +.has-error .ant-input-number:focus, +.has-error .ant-time-picker-input:focus { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-input-number:not([disabled]):hover, +.has-error .ant-time-picker-input:not([disabled]):hover { + border-color: #f5222d; +} +.has-error .ant-mention-wrapper .ant-mention-editor, +.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):hover { + border-color: #f5222d; +} +.has-error .ant-mention-wrapper.ant-mention-active:not([disabled]) .ant-mention-editor, +.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):focus { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-cascader-picker:focus .ant-cascader-input { + border-color: #ff4d4f; + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.is-validating.has-feedback .ant-form-item-children-icon { + color: @primary-color; +} +.ant-input-number { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-input-number::-moz-placeholder { + color: #bfbfbf; +} +.ant-input-number:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-input-number::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-input-number:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-number:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-number-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-input-number-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-input-number-handler { + color: rgba(0, 0, 0, 0.45); +} +.ant-input-number-handler:active { + background: #f4f4f4; +} +.ant-input-number-handler:hover .ant-input-number-handler-up-inner, +.ant-input-number-handler:hover .ant-input-number-handler-down-inner { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-input-number-handler-up-inner, +.ant-input-number-handler-down-inner { + color: rgba(0, 0, 0, 0.45); +} +.ant-input-number:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-number-focused { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-number-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-input-number-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-input-number-input { + background-color: transparent; + border: 0; + border-radius: 4px; +} +.ant-input-number-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-input-number-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-input-number-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-input-number-handler-wrap { + border-left: 1px solid #d9d9d9; + background: #fff; + border-radius: 0 4px 4px 0; +} +.ant-input-number-handler-down { + border-top: 1px solid #d9d9d9; +} +.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner, +.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner { + color: rgba(0, 0, 0, 0.25); +} +.ant-input { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-input-group { + color: rgba(0, 0, 0, 0.65); + border-collapse: separate; + border-spacing: 0; +} +.ant-input-group-addon:not(:first-child):not(:last-child), +.ant-input-group-wrap:not(:first-child):not(:last-child), +.ant-input-group > .ant-input:not(:first-child):not(:last-child) { + border-radius: 0; +} +.ant-input-group .ant-input:focus { + border-right-width: 1px; +} +.ant-input-group .ant-input:hover { + border-right-width: 1px; +} +.ant-input-group-addon { + color: rgba(0, 0, 0, 0.65); + background-color: #fafafa; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-input-group-addon .ant-select .ant-select-selection { + background-color: inherit; + border: 1px solid transparent; + box-shadow: none; +} +.ant-input-group-addon .ant-select-open .ant-select-selection, +.ant-input-group-addon .ant-select-focused .ant-select-selection { + color: @primary-color; +} +.ant-input-group > .ant-input:first-child, +.ant-input-group-addon:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-input-group > .ant-input:first-child .ant-select .ant-select-selection, +.ant-input-group-addon:first-child .ant-select .ant-select-selection { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-input-group > .ant-input-affix-wrapper:not(:first-child) .ant-input { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group > .ant-input-affix-wrapper:not(:last-child) .ant-input { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-input-group-addon:first-child { + border-right: 0; +} +.ant-input-group-addon:last-child { + border-left: 0; +} +.ant-input-group > .ant-input:last-child, +.ant-input-group-addon:last-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group > .ant-input:last-child .ant-select .ant-select-selection, +.ant-input-group-addon:last-child .ant-select .ant-select-selection { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child), +.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child), +.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child) { + border-right-width: 1px; + border-right-color: transparent; +} +.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover, +.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover, +.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus, +.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus, +.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact > * { + border-radius: 0; + border-right-width: 0; +} +.ant-input-group.ant-input-group-compact > span:not(:last-child) > .ant-input { + border-right-width: 0; +} +.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor, +.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input { + border-radius: 0; + border-right-width: 1px; + border-right-color: transparent; +} +.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection:hover, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor:hover, +.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection:focus, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor:focus, +.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact > *:first-child, +.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selection, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:first-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:first-child .ant-mention-editor, +.ant-input-group.ant-input-group-compact > .ant-time-picker:first-child .ant-time-picker-input { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.ant-input-group.ant-input-group-compact > *:last-child, +.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor, +.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-right-width: 1px; + border-right-color: #d9d9d9; +} +.ant-input-group.ant-input-group-compact > *:last-child:hover, +.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection:hover, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input:hover, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor:hover, +.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact > *:last-child:focus, +.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection:focus, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input:focus, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor:focus, +.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-group.ant-input-group-compact > *:last-child:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor:focus .ant-cascader-input, +.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input:focus .ant-cascader-input { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-affix-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-input-affix-wrapper:hover .ant-input:not(.ant-input-disabled) { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-input-affix-wrapper .ant-input-prefix, +.ant-input-affix-wrapper .ant-input-suffix { + color: rgba(0, 0, 0, 0.65); +} +.ant-input-search-icon { + color: rgba(0, 0, 0, 0.45); +} +.ant-input-search-icon:hover { + color: #333; +} +.ant-input-search > .ant-input-suffix > .ant-input-search-button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.ant-layout { + background: #f0f2f5; +} +.ant-layout-header { + background: #001529; +} +.ant-layout-footer { + background: #f0f2f5; + color: rgba(0, 0, 0, 0.65); +} +.ant-layout-sider { + background: #001529; +} +.ant-layout-sider-trigger { + color: #fff; + background: #002140; +} +.ant-layout-sider-zero-width-trigger { + background: #001529; + color: #fff; + border-radius: 0 4px 4px 0; +} +.ant-layout-sider-zero-width-trigger:hover { + background: #192c3e; +} +.ant-layout-sider-light { + background: #fff; +} +.ant-layout-sider-light .ant-layout-sider-trigger { + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +.ant-layout-sider-light .ant-layout-sider-zero-width-trigger { + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +.ant-list { + color: rgba(0, 0, 0, 0.65); +} +.ant-list-empty-text { + color: rgba(0, 0, 0, 0.45); +} +.ant-list-item-meta-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-list-item-meta-title > a { + color: rgba(0, 0, 0, 0.65); +} +.ant-list-item-meta-title > a:hover { + color: @primary-color; +} +.ant-list-item-meta-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-list-item-action > li { + color: rgba(0, 0, 0, 0.45); +} +.ant-list-item-action-split { + background-color: #e8e8e8; +} +.ant-list-empty { + color: rgba(0, 0, 0, 0.45); +} +.ant-list-split .ant-list-item { + border-bottom: 1px solid #e8e8e8; +} +.ant-list-split .ant-list-item:last-child { + border-bottom: none; +} +.ant-list-split .ant-list-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-list-something-after-last-item .ant-spin-container > .ant-list-item:last-child { + border-bottom: 1px solid #e8e8e8; +} +.ant-list-vertical .ant-list-item-meta-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-list-vertical .ant-list-item-content { + color: rgba(0, 0, 0, 0.65); +} +.ant-list-grid .ant-list-item { + border-bottom: none; +} +.ant-list-bordered { + border-radius: 4px; + border: 1px solid #d9d9d9; +} +.ant-list-bordered .ant-list-item { + border-bottom: 1px solid #e8e8e8; +} +.ant-mention-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-mention-wrapper .ant-mention-editor { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-mention-wrapper .ant-mention-editor::-moz-placeholder { + color: #bfbfbf; +} +.ant-mention-wrapper .ant-mention-editor:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-mention-wrapper .ant-mention-editor::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-mention-wrapper .ant-mention-editor:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-mention-wrapper .ant-mention-editor:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-mention-wrapper .ant-mention-editor-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-wrapper .ant-mention-editor-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-mention-wrapper.ant-mention-active:not(.disabled) .ant-mention-editor { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-mention-wrapper.disabled .ant-mention-editor { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-wrapper.disabled .ant-mention-editor:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-mention-wrapper .public-DraftEditorPlaceholder-root .public-DraftEditorPlaceholder-inner { + color: #bfbfbf; +} +.ant-mention-dropdown { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + border-radius: 4px; +} +.ant-mention-dropdown-notfound.ant-mention-dropdown-item { + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-dropdown-notfound.ant-mention-dropdown-item .anticon-loading { + color: @primary-color; +} +.ant-mention-dropdown-item { + color: rgba(0, 0, 0, 0.65); +} +.ant-mention-dropdown-item:hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-mention-dropdown-item.focus, +.ant-mention-dropdown-item-active { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-mention-dropdown-item-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-dropdown-item-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #fff; +} +.ant-mention-dropdown-item-selected, +.ant-mention-dropdown-item-selected:hover { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.65); +} +.ant-mention-dropdown-item-divider { + background-color: #e8e8e8; +} +.ant-menu { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +.ant-menu-item-group-title { + color: rgba(0, 0, 0, 0.45); +} +.ant-menu-item:active, +.ant-menu-submenu-title:active { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-menu-item > a { + color: rgba(0, 0, 0, 0.65); +} +.ant-menu-item > a:hover { + color: @primary-color; +} +.ant-menu-item > a:before { + background-color: transparent; +} +.ant-menu-item-divider { + background-color: #e8e8e8; +} +.ant-menu-item:hover, +.ant-menu-item-active, +.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open, +.ant-menu-submenu-active, +.ant-menu-submenu-title:hover { + color: @primary-color; +} +.ant-menu-horizontal > .ant-menu-item:hover, +.ant-menu-horizontal > .ant-menu-item-active, +.ant-menu-horizontal > .ant-menu-submenu .ant-menu-submenu-title:hover { + background-color: transparent; +} +.ant-menu-item-selected { + color: @primary-color; +} +.ant-menu-item-selected > a, +.ant-menu-item-selected > a:hover { + color: @primary-color; +} +.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-menu-inline, +.ant-menu-vertical, +.ant-menu-vertical-left { + border-right: 1px solid #e8e8e8; +} +.ant-menu-vertical-right { + border-left: 1px solid #e8e8e8; +} +.ant-menu-vertical.ant-menu-sub, +.ant-menu-vertical-left.ant-menu-sub, +.ant-menu-vertical-right.ant-menu-sub { + border-right: 0; +} +.ant-menu-vertical.ant-menu-sub .ant-menu-item, +.ant-menu-vertical-left.ant-menu-sub .ant-menu-item, +.ant-menu-vertical-right.ant-menu-sub .ant-menu-item { + border-right: 0; +} +.ant-menu-vertical.ant-menu-sub .ant-menu-item:after, +.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after, +.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after { + border-right: 0; +} +.ant-menu > .ant-menu-item-divider { + background-color: #e8e8e8; +} +.ant-menu-submenu-popup { + border-radius: 4px; +} +.ant-menu-submenu > .ant-menu { + background-color: #fff; + border-radius: 4px; +} +.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after { + background: #fff; + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.65), rgba(0, 0, 0, 0.65)); + border-radius: 2px; +} +.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before, +.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before { + background: linear-gradient(to right, @primary-color, @primary-color); +} +.ant-menu-vertical .ant-menu-submenu-selected, +.ant-menu-vertical-left .ant-menu-submenu-selected, +.ant-menu-vertical-right .ant-menu-submenu-selected { + color: @primary-color; +} +.ant-menu-vertical .ant-menu-submenu-selected > a, +.ant-menu-vertical-left .ant-menu-submenu-selected > a, +.ant-menu-vertical-right .ant-menu-submenu-selected > a { + color: @primary-color; +} +.ant-menu-horizontal { + border: 0; + border-bottom: 1px solid #e8e8e8; + box-shadow: none; +} +.ant-menu-horizontal > .ant-menu-item, +.ant-menu-horizontal > .ant-menu-submenu { + border-bottom: 2px solid transparent; +} +.ant-menu-horizontal > .ant-menu-item:hover, +.ant-menu-horizontal > .ant-menu-submenu:hover, +.ant-menu-horizontal > .ant-menu-item-active, +.ant-menu-horizontal > .ant-menu-submenu-active, +.ant-menu-horizontal > .ant-menu-item-open, +.ant-menu-horizontal > .ant-menu-submenu-open, +.ant-menu-horizontal > .ant-menu-item-selected, +.ant-menu-horizontal > .ant-menu-submenu-selected { + border-bottom: 2px solid @primary-color; + color: @primary-color; +} +.ant-menu-horizontal > .ant-menu-item > a { + color: rgba(0, 0, 0, 0.65); +} +.ant-menu-horizontal > .ant-menu-item > a:hover { + color: @primary-color; +} +.ant-menu-horizontal > .ant-menu-item-selected > a { + color: @primary-color; +} +.ant-menu-vertical .ant-menu-item:after, +.ant-menu-vertical-left .ant-menu-item:after, +.ant-menu-vertical-right .ant-menu-item:after, +.ant-menu-inline .ant-menu-item:after { + border-right: 3px solid @primary-color; +} +.ant-menu-inline-collapsed-tooltip a { + color: rgba(255, 255, 255, 0.85); +} +.ant-menu-root.ant-menu-vertical, +.ant-menu-root.ant-menu-vertical-left, +.ant-menu-root.ant-menu-vertical-right, +.ant-menu-root.ant-menu-inline { + box-shadow: none; +} +.ant-menu-sub.ant-menu-inline { + border: 0; + box-shadow: none; + border-radius: 0; +} +.ant-menu-item-disabled, +.ant-menu-submenu-disabled { + color: rgba(0, 0, 0, 0.25) !important; + background: none; + border-color: transparent !important; +} +.ant-menu-item-disabled > a, +.ant-menu-submenu-disabled > a { + color: rgba(0, 0, 0, 0.25) !important; +} +.ant-menu-item-disabled > .ant-menu-submenu-title, +.ant-menu-submenu-disabled > .ant-menu-submenu-title { + color: rgba(0, 0, 0, 0.25) !important; +} +.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after { + background: rgba(0, 0, 0, 0.25) !important; +} +.ant-menu-dark, +.ant-menu-dark .ant-menu-sub { + color: rgba(255, 255, 255, 0.65); + background: #001529; +} +.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before { + background: #fff; +} +.ant-menu-dark.ant-menu-submenu-popup { + background: transparent; +} +.ant-menu-dark .ant-menu-inline.ant-menu-sub { + background: #000c17; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45) inset; +} +.ant-menu-dark.ant-menu-horizontal { + border-bottom: 0; +} +.ant-menu-dark.ant-menu-horizontal > .ant-menu-item, +.ant-menu-dark.ant-menu-horizontal > .ant-menu-submenu { + border-color: #001529; + border-bottom: 0; +} +.ant-menu-dark .ant-menu-item, +.ant-menu-dark .ant-menu-item-group-title, +.ant-menu-dark .ant-menu-item > a { + color: rgba(255, 255, 255, 0.65); +} +.ant-menu-dark.ant-menu-inline, +.ant-menu-dark.ant-menu-vertical, +.ant-menu-dark.ant-menu-vertical-left, +.ant-menu-dark.ant-menu-vertical-right { + border-right: 0; +} +.ant-menu-dark.ant-menu-inline .ant-menu-item, +.ant-menu-dark.ant-menu-vertical .ant-menu-item, +.ant-menu-dark.ant-menu-vertical-left .ant-menu-item, +.ant-menu-dark.ant-menu-vertical-right .ant-menu-item { + border-right: 0; +} +.ant-menu-dark.ant-menu-inline .ant-menu-item:after, +.ant-menu-dark.ant-menu-vertical .ant-menu-item:after, +.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after, +.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after { + border-right: 0; +} +.ant-menu-dark .ant-menu-item:hover, +.ant-menu-dark .ant-menu-item-active, +.ant-menu-dark .ant-menu-submenu-active, +.ant-menu-dark .ant-menu-submenu-open, +.ant-menu-dark .ant-menu-submenu-selected, +.ant-menu-dark .ant-menu-submenu-title:hover { + background-color: transparent; + color: #fff; +} +.ant-menu-dark .ant-menu-item:hover > a, +.ant-menu-dark .ant-menu-item-active > a, +.ant-menu-dark .ant-menu-submenu-active > a, +.ant-menu-dark .ant-menu-submenu-open > a, +.ant-menu-dark .ant-menu-submenu-selected > a, +.ant-menu-dark .ant-menu-submenu-title:hover > a { + color: #fff; +} +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before { + background: #fff; +} +.ant-menu-dark .ant-menu-item-selected { + border-right: 0; + color: #fff; +} +.ant-menu-dark .ant-menu-item-selected:after { + border-right: 0; +} +.ant-menu-dark .ant-menu-item-selected > a, +.ant-menu-dark .ant-menu-item-selected > a:hover { + color: #fff; +} +.ant-menu.ant-menu-dark .ant-menu-item-selected, +.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected { + background-color: @primary-color; +} +.ant-menu-dark .ant-menu-item-disabled, +.ant-menu-dark .ant-menu-submenu-disabled, +.ant-menu-dark .ant-menu-item-disabled > a, +.ant-menu-dark .ant-menu-submenu-disabled > a { + color: rgba(255, 255, 255, 0.35) !important; +} +.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title, +.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title { + color: rgba(255, 255, 255, 0.35) !important; +} +.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after { + background: rgba(255, 255, 255, 0.35) !important; +} +.ant-message { + color: rgba(0, 0, 0, 0.65); +} +.ant-message-notice-content { + border-radius: 4px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + background: #fff; +} +.ant-message-success .anticon { + color: #52c41a; +} +.ant-message-error .anticon { + color: #f5222d; +} +.ant-message-warning .anticon { + color: #faad14; +} +.ant-message-info .anticon, +.ant-message-loading .anticon { + color: @primary-color; +} +.ant-modal { + color: rgba(0, 0, 0, 0.65); +} +.ant-modal-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-modal-content { + background-color: #fff; + border: 0; + border-radius: 4px; + background-clip: padding-box; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} +.ant-modal-close { + border: 0; + background: transparent; + color: rgba(0, 0, 0, 0.45); +} +.ant-modal-close:focus, +.ant-modal-close:hover { + color: #444; +} +.ant-modal-header { + border-radius: 4px 4px 0 0; + background: #fff; + color: rgba(0, 0, 0, 0.65); + border-bottom: 1px solid #e8e8e8; +} +.ant-modal-footer { + border-top: 1px solid #e8e8e8; + border-radius: 0 0 4px 4px; +} +.ant-modal-mask { + background-color: rgba(0, 0, 0, 0.65); +} +.ant-confirm-body .ant-confirm-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-confirm-body .ant-confirm-content { + color: rgba(0, 0, 0, 0.65); +} +.ant-confirm-error .ant-confirm-body > .anticon { + color: #f5222d; +} +.ant-confirm-warning .ant-confirm-body > .anticon, +.ant-confirm-confirm .ant-confirm-body > .anticon { + color: #faad14; +} +.ant-confirm-info .ant-confirm-body > .anticon { + color: @primary-color; +} +.ant-confirm-success .ant-confirm-body > .anticon { + color: #52c41a; +} +.ant-notification { + color: rgba(0, 0, 0, 0.65); +} +.ant-notification-notice { + border-radius: 4px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + background: #fff; +} +.ant-notification-notice-message { + color: rgba(0, 0, 0, 0.85); +} +.ant-notification-notice-message-single-line-auto-margin { + background-color: transparent; +} +.ant-notification-notice-icon-success { + color: #52c41a; +} +.ant-notification-notice-icon-info { + color: @primary-color; +} +.ant-notification-notice-icon-warning { + color: #faad14; +} +.ant-notification-notice-icon-error { + color: #f5222d; +} +.ant-notification-notice-close { + color: rgba(0, 0, 0, 0.45); +} +.ant-notification-notice-close:hover { + color: rgba(0, 0, 0, 0.67); +} +.ant-pagination { + color: rgba(0, 0, 0, 0.65); +} +.ant-pagination-item { + border-radius: 4px; + border: 1px solid #d9d9d9; + background-color: #fff; +} +.ant-pagination-item a { + color: rgba(0, 0, 0, 0.65); +} +.ant-pagination-item:focus, +.ant-pagination-item:hover { + border-color: @primary-color; +} +.ant-pagination-item:focus a, +.ant-pagination-item:hover a { + color: @primary-color; +} +.ant-pagination-item-active { + border-color: @primary-color; +} +.ant-pagination-item-active a { + color: @primary-color; +} +.ant-pagination-item-active:focus, +.ant-pagination-item-active:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-pagination-item-active:focus a, +.ant-pagination-item-active:hover a { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon, +.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon { + color: @primary-color; +} +.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis, +.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis { + color: rgba(0, 0, 0, 0.25); +} +.ant-pagination-prev, +.ant-pagination-next, +.ant-pagination-jump-prev, +.ant-pagination-jump-next { + color: rgba(0, 0, 0, 0.65); + border-radius: 4px; +} +.ant-pagination-prev a, +.ant-pagination-next a { + color: rgba(0, 0, 0, 0.65); +} +.ant-pagination-prev:hover a, +.ant-pagination-next:hover a { + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-pagination-prev .ant-pagination-item-link, +.ant-pagination-next .ant-pagination-item-link { + border: 1px solid #d9d9d9; + background-color: #fff; + border-radius: 4px; +} +.ant-pagination-prev:focus .ant-pagination-item-link, +.ant-pagination-next:focus .ant-pagination-item-link, +.ant-pagination-prev:hover .ant-pagination-item-link, +.ant-pagination-next:hover .ant-pagination-item-link { + border-color: @primary-color; + color: @primary-color; +} +.ant-pagination-disabled a, +.ant-pagination-disabled:hover a, +.ant-pagination-disabled:focus a, +.ant-pagination-disabled .ant-pagination-item-link, +.ant-pagination-disabled:hover .ant-pagination-item-link, +.ant-pagination-disabled:focus .ant-pagination-item-link { + border-color: #d9d9d9; + color: rgba(0, 0, 0, 0.25); +} +.ant-pagination-options-quick-jumper input { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-pagination-options-quick-jumper input::-moz-placeholder { + color: #bfbfbf; +} +.ant-pagination-options-quick-jumper input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-pagination-options-quick-jumper input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-pagination-options-quick-jumper input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-pagination-options-quick-jumper input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-pagination-options-quick-jumper input-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-pagination-options-quick-jumper input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link, +.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link { + border: 0; +} +.ant-pagination-simple .ant-pagination-simple-pager input { + background-color: #fff; + border-radius: 4px; + border: 1px solid #d9d9d9; +} +.ant-pagination-simple .ant-pagination-simple-pager input:hover { + border-color: @primary-color; +} +.ant-pagination.mini .ant-pagination-item:not(.ant-pagination-item-active) { + background: transparent; + border-color: transparent; +} +.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link, +.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link { + border-color: transparent; + background: transparent; +} +.ant-popover { + color: rgba(0, 0, 0, 0.65); +} +.ant-popover:after { + background: rgba(255, 255, 255, 0.01); +} +.ant-popover-inner { + background-color: #fff; + background-clip: padding-box; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-popover-title { + border-bottom: 1px solid #e8e8e8; + color: rgba(0, 0, 0, 0.85); +} +.ant-popover-inner-content { + color: rgba(0, 0, 0, 0.65); +} +.ant-popover-message { + color: rgba(0, 0, 0, 0.65); +} +.ant-popover-message > .anticon { + color: #faad14; +} +.ant-popover-arrow { + background: #fff; + border-color: transparent; + border-style: solid; +} +.ant-popover-placement-top > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-topLeft > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-topRight > .ant-popover-content > .ant-popover-arrow { + box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07); +} +.ant-popover-placement-right > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-rightTop > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-rightBottom > .ant-popover-content > .ant-popover-arrow { + box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07); +} +.ant-popover-placement-bottom > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-bottomLeft > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-bottomRight > .ant-popover-content > .ant-popover-arrow { + box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.06); +} +.ant-popover-placement-left > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-leftTop > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-leftBottom > .ant-popover-content > .ant-popover-arrow { + box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07); +} +.ant-progress { + color: rgba(0, 0, 0, 0.65); +} +.ant-progress-inner { + background-color: #f5f5f5; + border-radius: 100px; +} +.ant-progress-success-bg, +.ant-progress-bg { + background-color: @primary-color; +} +.ant-progress-success-bg { + background-color: #52c41a; +} +.ant-progress-text { + color: rgba(0, 0, 0, 0.45); +} +.ant-progress-status-active .ant-progress-bg:before { + background: #fff; + border-radius: 10px; +} +.ant-progress-status-exception .ant-progress-bg { + background-color: #f5222d; +} +.ant-progress-status-exception .ant-progress-text { + color: #f5222d; +} +.ant-progress-status-success .ant-progress-bg { + background-color: #52c41a; +} +.ant-progress-status-success .ant-progress-text { + color: #52c41a; +} +.ant-progress-circle .ant-progress-inner { + background-color: transparent; +} +.ant-progress-circle .ant-progress-text { + color: rgba(0, 0, 0, 0.65); +} +.ant-progress-circle.ant-progress-status-exception .ant-progress-text { + color: #f5222d; +} +.ant-progress-circle.ant-progress-status-success .ant-progress-text { + color: #52c41a; +} +.ant-radio-group { + color: rgba(0, 0, 0, 0.65); +} +.ant-radio-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-radio { + color: rgba(0, 0, 0, 0.65); +} +.ant-radio-wrapper:hover .ant-radio .ant-radio-inner, +.ant-radio:hover .ant-radio-inner, +.ant-radio-focused .ant-radio-inner { + border-color: @primary-color; +} +.ant-radio-checked:after { + border-radius: 50%; + border: 1px solid @primary-color; +} +.ant-radio-inner { + border-width: 1px; + border-style: solid; + border-radius: 100px; + border-color: #d9d9d9; + background-color: #fff; +} +.ant-radio-inner:after { + border-radius: 8px; + border-top: 0; + border-left: 0; + background-color: @primary-color; +} +.ant-radio-checked .ant-radio-inner { + border-color: @primary-color; +} +.ant-radio-disabled .ant-radio-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-radio-disabled .ant-radio-inner:after { + background-color: #ccc; +} +.ant-radio-disabled + span { + color: rgba(0, 0, 0, 0.25); +} +.ant-radio-button-wrapper { + color: rgba(0, 0, 0, 0.65); + border: 1px solid #d9d9d9; + border-left: 0; + border-top-width: 1.02px; + background: #fff; +} +.ant-radio-button-wrapper a { + color: rgba(0, 0, 0, 0.65); +} +.ant-radio-button-wrapper:not(:first-child)::before { + background-color: #d9d9d9; +} +.ant-radio-button-wrapper:first-child { + border-radius: 4px 0 0 4px; + border-left: 1px solid #d9d9d9; +} +.ant-radio-button-wrapper:last-child { + border-radius: 0 4px 4px 0; +} +.ant-radio-button-wrapper:first-child:last-child { + border-radius: 4px; +} +.ant-radio-button-wrapper:hover, +.ant-radio-button-wrapper-focused { + color: @primary-color; +} +.ant-radio-button-wrapper-checked { + background: #fff; + border-color: @primary-color; + color: @primary-color; + box-shadow: -1px 0 0 0 @primary-color; +} +.ant-radio-button-wrapper-checked::before { + background-color: @primary-color !important; +} +.ant-radio-button-wrapper-checked:first-child { + border-color: @primary-color; + box-shadow: none !important; +} +.ant-radio-button-wrapper-checked:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: -1px 0 0 0 color(~`colorPalette("@{primary-color}", 5)`); + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-radio-button-wrapper-checked:active { + border-color: color(~`colorPalette("@{primary-color}", 7)`); + box-shadow: -1px 0 0 0 color(~`colorPalette("@{primary-color}", 7)`); + color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) { + background: @primary-color; + border-color: @primary-color; + color: #fff; +} +.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + background: color(~`colorPalette("@{primary-color}", 5)`); + color: #fff; +} +.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active { + border-color: color(~`colorPalette("@{primary-color}", 7)`); + background: color(~`colorPalette("@{primary-color}", 7)`); + color: #fff; +} +.ant-radio-button-wrapper-disabled { + border-color: #d9d9d9; + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-radio-button-wrapper-disabled:first-child, +.ant-radio-button-wrapper-disabled:hover { + border-color: #d9d9d9; + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-radio-button-wrapper-disabled:first-child { + border-left-color: #d9d9d9; +} +.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked { + color: #fff; + background-color: #e6e6e6; + border-color: #d9d9d9; + box-shadow: none; +} +.ant-rate { + color: rgba(0, 0, 0, 0.65); + color: #fadb14; +} +.ant-rate-star { + color: inherit; +} +.ant-rate-star-first, +.ant-rate-star-second { + color: #e8e8e8; +} +.ant-rate-star-half .ant-rate-star-first, +.ant-rate-star-full .ant-rate-star-second { + color: inherit; +} +.ant-select { + color: rgba(0, 0, 0, 0.65); +} +.ant-select > ul > li > a { + background-color: #fff; +} +.ant-select-arrow { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-selection { + background-color: #fff; + border-radius: 4px; + border: 1px solid #d9d9d9; + border-top-width: 1.02px; +} +.ant-select-selection:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-select-focused .ant-select-selection, +.ant-select-selection:focus, +.ant-select-selection:active { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-select-selection__clear { + background: #fff; + color: rgba(0, 0, 0, 0.25); +} +.ant-select-selection__clear:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-select-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-disabled .ant-select-selection { + background: #f5f5f5; +} +.ant-select-disabled .ant-select-selection:hover, +.ant-select-disabled .ant-select-selection:focus, +.ant-select-disabled .ant-select-selection:active { + border-color: #d9d9d9; + box-shadow: none; +} +.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice { + background: #f5f5f5; + color: #aaa; +} +.ant-select-disabled .ant-select-selection__choice__remove { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-disabled .ant-select-selection__choice__remove:hover { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-selection__placeholder, +.ant-select-search__field__placeholder { + color: #bfbfbf; +} +.ant-select-search--inline .ant-select-search__field { + border-width: 0; + background: transparent; + border-radius: 4px; +} +.ant-select-selection--multiple .ant-select-selection__choice { + color: rgba(0, 0, 0, 0.65); + background-color: #fafafa; + border: 1px solid #e8e8e8; + border-radius: 2px; +} +.ant-select-selection--multiple .ant-select-selection__choice__remove { + color: rgba(0, 0, 0, 0.45); +} +.ant-select-selection--multiple .ant-select-selection__choice__remove:hover { + color: #404040; +} +.ant-select-open .ant-select-selection { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-select-combobox .ant-select-search__field { + box-shadow: none; +} +.ant-select-dropdown { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + border-radius: 4px; +} +.ant-select-dropdown-menu-item-group-title { + color: rgba(0, 0, 0, 0.45); +} +.ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:first-child:not(:last-child), +.ant-select-dropdown-menu-item-group:not(:last-child) .ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:last-child { + border-radius: 0; +} +.ant-select-dropdown-menu-item { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-dropdown-menu-item:hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-select-dropdown-menu-item:first-child { + border-radius: 4px 4px 0 0; +} +.ant-select-dropdown-menu-item:last-child { + border-radius: 0 0 4px 4px; +} +.ant-select-dropdown-menu-item-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-dropdown-menu-item-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #fff; +} +.ant-select-dropdown-menu-item-selected, +.ant-select-dropdown-menu-item-selected:hover { + background-color: #fafafa; + color: rgba(0, 0, 0, 0.65); +} +.ant-select-dropdown-menu-item-active { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-select-dropdown-menu-item-divider { + background-color: #e8e8e8; +} +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item .ant-select-selected-icon { + color: transparent; +} +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:hover .ant-select-selected-icon { + color: #ddd; +} +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected .ant-select-selected-icon, +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected:hover .ant-select-selected-icon { + color: @primary-color; +} +.ant-skeleton-header .ant-skeleton-avatar { + background: #f2f2f2; +} +.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle { + border-radius: 50%; +} +.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle { + border-radius: 50%; +} +.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle { + border-radius: 50%; +} +.ant-skeleton-content .ant-skeleton-title { + background: #f2f2f2; +} +.ant-skeleton-content .ant-skeleton-paragraph > li { + background: #f2f2f2; +} +.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title, +.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph > li { + background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); + background-size: 400% 100%; +} +.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar { + background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); + background-size: 400% 100%; +} +.ant-slider { + color: rgba(0, 0, 0, 0.65); +} +.ant-slider-rail { + border-radius: 2px; + background-color: #f5f5f5; +} +.ant-slider-track { + border-radius: 4px; + background-color: color(~`colorPalette("@{primary-color}", 3)`); +} +.ant-slider-handle { + border-radius: 50%; + border: solid 2px color(~`colorPalette("@{primary-color}", 3)`); + background-color: #fff; +} +.ant-slider-handle:focus { + border-color: #46a6ff; + box-shadow: 0 0 0 5px #8cc8ff; +} +.ant-slider-handle.ant-tooltip-open { + border-color: @primary-color; +} +.ant-slider:hover .ant-slider-rail { + background-color: #e1e1e1; +} +.ant-slider:hover .ant-slider-track { + background-color: color(~`colorPalette("@{primary-color}", 4)`); +} +.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) { + border-color: color(~`colorPalette("@{primary-color}", 4)`); +} +.ant-slider-mark-text { + color: rgba(0, 0, 0, 0.45); +} +.ant-slider-mark-text-active { + color: rgba(0, 0, 0, 0.65); +} +.ant-slider-step { + background: transparent; +} +.ant-slider-dot { + border: 2px solid #e8e8e8; + background-color: #fff; + border-radius: 50%; +} +.ant-slider-dot-active { + border-color: #8cc8ff; +} +.ant-slider-disabled .ant-slider-track { + background-color: rgba(0, 0, 0, 0.25) !important; +} +.ant-slider-disabled .ant-slider-handle, +.ant-slider-disabled .ant-slider-dot { + border-color: rgba(0, 0, 0, 0.25) !important; + background-color: #fff; + box-shadow: none; +} +.ant-spin { + color: rgba(0, 0, 0, 0.65); + color: @primary-color; +} +.ant-spin-blur:after { + background: #fff; +} +.ant-spin-tip { + color: rgba(0, 0, 0, 0.45); +} +.ant-spin-dot i { + border-radius: 100%; + background-color: @primary-color; +} +.ant-steps { + color: rgba(0, 0, 0, 0.65); +} +.ant-steps-item-icon { + border: 1px solid rgba(0, 0, 0, 0.25); + border-radius: 32px; +} +.ant-steps-item-icon > .ant-steps-icon { + color: @primary-color; +} +.ant-steps-item-tail:after { + background: #e8e8e8; + border-radius: 1px; +} +.ant-steps-item-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-steps-item-title:after { + background: #e8e8e8; +} +.ant-steps-item-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-wait .ant-steps-item-icon { + border-color: rgba(0, 0, 0, 0.25); + background-color: #fff; +} +.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: rgba(0, 0, 0, 0.25); +} +.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-title { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: #e8e8e8; +} +.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-wait > .ant-steps-item-tail:after { + background-color: #e8e8e8; +} +.ant-steps-item-process .ant-steps-item-icon { + border-color: @primary-color; + background-color: #fff; +} +.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { + color: @primary-color; +} +.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: @primary-color; +} +.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: #e8e8e8; +} +.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-description { + color: rgba(0, 0, 0, 0.65); +} +.ant-steps-item-process > .ant-steps-item-tail:after { + background-color: #e8e8e8; +} +.ant-steps-item-process .ant-steps-item-icon { + background: @primary-color; +} +.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { + color: #fff; +} +.ant-steps-item-finish .ant-steps-item-icon { + border-color: @primary-color; + background-color: #fff; +} +.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon { + color: @primary-color; +} +.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: @primary-color; +} +.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: @primary-color; +} +.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-finish > .ant-steps-item-tail:after { + background-color: @primary-color; +} +.ant-steps-item-error .ant-steps-item-icon { + border-color: #f5222d; + background-color: #fff; +} +.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon { + color: #f5222d; +} +.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: #f5222d; +} +.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-title { + color: #f5222d; +} +.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: #e8e8e8; +} +.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-description { + color: #f5222d; +} +.ant-steps-item-error > .ant-steps-item-tail:after { + background-color: #e8e8e8; +} +.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after { + background: #f5222d; +} +.ant-steps-item-custom .ant-steps-item-icon { + background: none; + border: 0; +} +.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { + color: @primary-color; +} +.ant-steps-small .ant-steps-item-icon { + border-radius: 24px; +} +.ant-steps-small .ant-steps-item-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon { + border-radius: 0; + border: 0; + background: none; +} +.ant-steps-dot .ant-steps-item-icon { + border: 0; + background: transparent; +} +.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot { + border-radius: 100px; +} +.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after { + background: rgba(0, 0, 0, 0.001); +} +.ant-switch { + color: rgba(0, 0, 0, 0.65); + border-radius: 100px; + border: 1px solid transparent; + background-color: rgba(0, 0, 0, 0.25); +} +.ant-switch-inner { + color: #fff; +} +.ant-switch-loading-icon, +.ant-switch:after { + border-radius: 18px; + background-color: #fff; +} +.ant-switch:after { + box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2); +} +.ant-switch-loading-icon { + background: transparent; +} +.ant-switch-loading .ant-switch-loading-icon { + color: rgba(0, 0, 0, 0.65); +} +.ant-switch-checked.ant-switch-loading .ant-switch-loading-icon { + color: @primary-color; +} +.ant-switch:focus { + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); +} +.ant-switch:focus:hover { + box-shadow: none; +} +.ant-switch-checked { + background-color: @primary-color; +} +.ant-table { + color: rgba(0, 0, 0, 0.65); +} +.ant-table table { + border-collapse: collapse; + border-radius: 4px 4px 0 0; +} +.ant-table-thead > tr > th { + background: #fafafa; + color: rgba(0, 0, 0, 0.85); + border-bottom: 1px solid #e8e8e8; +} +.ant-table-thead > tr > th .anticon-filter, +.ant-table-thead > tr > th .ant-table-filter-icon { + color: #bfbfbf; +} +.ant-table-thead > tr > th .ant-table-filter-selected.anticon-filter { + color: @primary-color; +} +.ant-table-thead > tr > th .ant-table-column-sorter { + color: #bfbfbf; +} +.ant-table-thead > tr > th .ant-table-column-sorter-up.on, +.ant-table-thead > tr > th .ant-table-column-sorter-down.on { + color: @primary-color; +} +.ant-table-thead > tr > th.ant-table-column-has-actions:hover { + background: #f5f5f5; +} +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .anticon-filter, +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .ant-table-filter-icon { + background: #f5f5f5; +} +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .anticon-filter:hover, +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .ant-table-filter-icon:hover { + color: rgba(0, 0, 0, 0.45); + background: #ebebeb; +} +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .anticon-filter:active, +.ant-table-thead > tr > th.ant-table-column-has-actions:hover .ant-table-filter-icon:active { + color: rgba(0, 0, 0, 0.65); +} +.ant-table-thead > tr > th.ant-table-column-has-actions .anticon-filter.ant-table-filter-open, +.ant-table-thead > tr > th.ant-table-column-has-actions .ant-table-filter-icon.ant-table-filter-open { + color: rgba(0, 0, 0, 0.45); + background: #ebebeb; +} +.ant-table-thead > tr > th.ant-table-column-has-actions:active .ant-table-column-sorter-up:not(.on), +.ant-table-thead > tr > th.ant-table-column-has-actions:active .ant-table-column-sorter-down:not(.on) { + color: rgba(0, 0, 0, 0.45); +} +.ant-table-thead > tr > th .ant-table-column-sorters:before { + background: transparent; +} +.ant-table-thead > tr > th .ant-table-column-sorters:hover:before { + background: rgba(0, 0, 0, 0.04); +} +.ant-table-thead > tr:first-child > th:first-child { + border-top-left-radius: 4px; +} +.ant-table-thead > tr:first-child > th:last-child { + border-top-right-radius: 4px; +} +.ant-table-thead > tr:not(:last-child) > th[colspan] { + border-bottom: 0; +} +.ant-table-tbody > tr > td { + border-bottom: 1px solid #e8e8e8; +} +.ant-table-thead > tr.ant-table-row-hover > td, +.ant-table-tbody > tr.ant-table-row-hover > td, +.ant-table-thead > tr:hover > td, +.ant-table-tbody > tr:hover > td { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-table-thead > tr:hover { + background: none; +} +.ant-table-footer { + background: #fafafa; + border-radius: 0 0 4px 4px; + border-top: 1px solid #e8e8e8; +} +.ant-table-footer:before { + background: #fafafa; +} +.ant-table.ant-table-bordered .ant-table-footer { + border: 1px solid #e8e8e8; +} +.ant-table-title { + border-radius: 4px 4px 0 0; +} +.ant-table.ant-table-bordered .ant-table-title { + border: 1px solid #e8e8e8; +} +.ant-table-title + .ant-table-content { + border-radius: 4px 4px 0 0; +} +.ant-table-bordered .ant-table-title + .ant-table-content, +.ant-table-bordered .ant-table-title + .ant-table-content table, +.ant-table-bordered .ant-table-title + .ant-table-content .ant-table-thead > tr:first-child > th { + border-radius: 0; +} +.ant-table-without-column-header .ant-table-title + .ant-table-content, +.ant-table-without-column-header table { + border-radius: 0; +} +.ant-table-tbody > tr.ant-table-row-selected td { + background: #fafafa; +} +.ant-table-thead > tr > th.ant-table-column-sort { + background: #f5f5f5; +} +.ant-table-tbody > tr > td.ant-table-column-sort { + background: rgba(0, 0, 0, 0.01); +} +.ant-table-header { + background: #fafafa; +} +.ant-table-header table { + border-radius: 4px 4px 0 0; +} +.ant-table-loading .ant-table-body { + background: #fff; +} +.ant-table-bordered .ant-table-header > table, +.ant-table-bordered .ant-table-body > table, +.ant-table-bordered .ant-table-fixed-left table, +.ant-table-bordered .ant-table-fixed-right table { + border: 1px solid #e8e8e8; + border-right: 0; + border-bottom: 0; +} +.ant-table-bordered.ant-table-empty .ant-table-placeholder { + border-left: 1px solid #e8e8e8; + border-right: 1px solid #e8e8e8; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-header > table { + border-bottom: 0; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-body > table { + border-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-body-inner > table { + border-top: 0; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-placeholder { + border: 0; +} +.ant-table-bordered .ant-table-thead > tr:not(:last-child) > th { + border-bottom: 1px solid #e8e8e8; +} +.ant-table-bordered .ant-table-thead > tr > th, +.ant-table-bordered .ant-table-tbody > tr > td { + border-right: 1px solid #e8e8e8; +} +.ant-table-placeholder { + background: #fff; + border-bottom: 1px solid #e8e8e8; + color: rgba(0, 0, 0, 0.45); +} +.ant-table-filter-dropdown { + background: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-table-filter-dropdown .ant-dropdown-menu { + border: 0; + box-shadow: none; + border-radius: 4px 4px 0 0; +} +.ant-table-filter-dropdown .ant-dropdown-menu-sub { + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-table-filter-dropdown .ant-dropdown-menu .ant-dropdown-submenu-contain-selected .ant-dropdown-menu-submenu-title:after { + color: @primary-color; +} +.ant-table-filter-dropdown > .ant-dropdown-menu > .ant-dropdown-menu-item:last-child, +.ant-table-filter-dropdown > .ant-dropdown-menu > .ant-dropdown-menu-submenu:last-child .ant-dropdown-menu-submenu-title { + border-radius: 0; +} +.ant-table-filter-dropdown-btns { + border-top: 1px solid #e8e8e8; +} +.ant-table-filter-dropdown-link { + color: @primary-color; +} +.ant-table-filter-dropdown-link:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-table-filter-dropdown-link:active { + color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-table-selection .anticon-down { + color: #bfbfbf; +} +.ant-table-selection-menu { + background: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-table-selection-menu .ant-action-down { + color: #bfbfbf; +} +.ant-table-selection-down:hover .anticon-down { + color: #666; +} +.ant-table-row-expand-icon { + border: 1px solid #e8e8e8; + background: #fff; +} +tr.ant-table-expanded-row, +tr.ant-table-expanded-row:hover { + background: #fbfbfb; +} +.ant-table-fixed-header > .ant-table-content > .ant-table-scroll > .ant-table-body { + background: #fff; +} +.ant-table-fixed-left, +.ant-table-fixed-right { + border-radius: 0; +} +.ant-table-fixed-left table, +.ant-table-fixed-right table { + background: #fff; +} +.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-outer .ant-table-fixed, +.ant-table-fixed-header .ant-table-fixed-right .ant-table-body-outer .ant-table-fixed { + border-radius: 0; +} +.ant-table-fixed-left { + box-shadow: 6px 0 6px -4px rgba(0, 0, 0, 0.15); +} +.ant-table-fixed-left, +.ant-table-fixed-left table { + border-radius: 4px 0 0 0; +} +.ant-table-fixed-left .ant-table-thead > tr > th:last-child { + border-top-right-radius: 0; +} +.ant-table-fixed-right { + box-shadow: -6px 0 6px -4px rgba(0, 0, 0, 0.15); +} +.ant-table-fixed-right, +.ant-table-fixed-right table { + border-radius: 0 4px 0 0; +} +.ant-table-fixed-right .ant-table-expanded-row { + color: transparent; +} +.ant-table-fixed-right .ant-table-thead > tr > th:first-child { + border-top-left-radius: 0; +} +.ant-table.ant-table-scroll-position-left .ant-table-fixed-left { + box-shadow: none; +} +.ant-table.ant-table-scroll-position-right .ant-table-fixed-right { + box-shadow: none; +} +.ant-table-small { + border: 1px solid #e8e8e8; + border-radius: 4px; +} +.ant-table-small > .ant-table-title { + border-bottom: 1px solid #e8e8e8; +} +.ant-table-small > .ant-table-content > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-body > table, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table { + border: 0; +} +.ant-table-small > .ant-table-content > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th { + background: #fff; + border-bottom: 1px solid #e8e8e8; +} +.ant-table-small > .ant-table-content .ant-table-header { + background: #fff; +} +.ant-table-small > .ant-table-content .ant-table-placeholder, +.ant-table-small > .ant-table-content .ant-table-row:last-child td { + border-bottom: 0; +} +.ant-table-small.ant-table-bordered { + border-right: 0; +} +.ant-table-small.ant-table-bordered .ant-table-title { + border: 0; + border-bottom: 1px solid #e8e8e8; + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-content { + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-footer { + border: 0; + border-top: 1px solid #e8e8e8; + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-placeholder { + border-left: 0; + border-bottom: 0; +} +.ant-table-small.ant-table-bordered .ant-table-thead > tr > th:last-child, +.ant-table-small.ant-table-bordered .ant-table-tbody > tr > td:last-child { + border-right: none; +} +.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-thead > tr > th:last-child, +.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-tbody > tr > td:last-child { + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-fixed-right { + border-right: 1px solid #e8e8e8; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab { + border: 1px solid #e8e8e8; + border-bottom: 0; + border-radius: 4px 4px 0 0; + background: #fafafa; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active { + background: #fff; + border-color: #e8e8e8; + color: @primary-color; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x { + color: rgba(0, 0, 0, 0.45); +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x:hover { + color: rgba(0, 0, 0, 0.85); +} +.ant-tabs-extra-content .ant-tabs-new-tab { + border-radius: 2px; + border: 1px solid #e8e8e8; + color: rgba(0, 0, 0, 0.65); +} +.ant-tabs-extra-content .ant-tabs-new-tab:hover { + color: @primary-color; + border-color: @primary-color; +} +.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab { + border-bottom: 1px solid #e8e8e8; +} +.ant-tabs-vertical.ant-tabs-card.ant-tabs-left > .ant-tabs-bar .ant-tabs-tab { + border-right: 0; + border-radius: 4px 0 0 4px; +} +.ant-tabs-vertical.ant-tabs-card.ant-tabs-right > .ant-tabs-bar .ant-tabs-tab { + border-left: 0; + border-radius: 0 4px 4px 0; +} +.ant-tabs.ant-tabs-card.ant-tabs-bottom > .ant-tabs-bar .ant-tabs-tab { + border-bottom: 1px solid #e8e8e8; + border-top: 0; + border-radius: 0 0 4px 4px; +} +.ant-tabs.ant-tabs-card.ant-tabs-bottom > .ant-tabs-bar .ant-tabs-tab-active { + color: @primary-color; +} +.ant-tabs { + color: rgba(0, 0, 0, 0.65); +} +.ant-tabs-ink-bar { + background-color: @primary-color; +} +.ant-tabs-bar { + border-bottom: 1px solid #e8e8e8; +} +.ant-tabs-bottom .ant-tabs-bar { + border-bottom: none; + border-top: 1px solid #e8e8e8; +} +.ant-tabs-tab-prev, +.ant-tabs-tab-next { + border: 0; + background-color: transparent; + color: rgba(0, 0, 0, 0.45); +} +.ant-tabs-tab-prev:hover, +.ant-tabs-tab-next:hover { + color: rgba(0, 0, 0, 0.65); +} +.ant-tabs-tab-btn-disabled, +.ant-tabs-tab-btn-disabled:hover { + color: rgba(0, 0, 0, 0.25); +} +.ant-tabs-nav .ant-tabs-tab-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-tabs-nav .ant-tabs-tab:hover { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-tabs-nav .ant-tabs-tab:active { + color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-tabs-nav .ant-tabs-tab-active { + color: @primary-color; +} +.ant-tabs-vertical > .ant-tabs-bar { + border-bottom: 0; +} +.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar { + border-right: 1px solid #e8e8e8; +} +.ant-tabs-vertical.ant-tabs-left > .ant-tabs-content { + border-left: 1px solid #e8e8e8; +} +.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar { + border-left: 1px solid #e8e8e8; +} +.ant-tabs-vertical.ant-tabs-right > .ant-tabs-content { + border-right: 1px solid #e8e8e8; +} +.ant-tag { + color: rgba(0, 0, 0, 0.65); + border-radius: 4px; + border: 1px solid #d9d9d9; + background: #fafafa; +} +.ant-tag, +.ant-tag a, +.ant-tag a:hover { + color: rgba(0, 0, 0, 0.65); +} +.ant-tag .anticon-close { + color: rgba(0, 0, 0, 0.45); +} +.ant-tag .anticon-close:hover { + color: rgba(0, 0, 0, 0.85); +} +.ant-tag-has-color { + border-color: transparent; +} +.ant-tag-has-color, +.ant-tag-has-color a, +.ant-tag-has-color a:hover, +.ant-tag-has-color .anticon-close, +.ant-tag-has-color .anticon-close:hover { + color: #fff; +} +.ant-tag-checkable { + background-color: transparent; + border-color: transparent; +} +.ant-tag-checkable:not(.ant-tag-checkable-checked):hover { + color: @primary-color; +} +.ant-tag-checkable:active, +.ant-tag-checkable-checked { + color: #fff; +} +.ant-tag-checkable-checked { + background-color: @primary-color; +} +.ant-tag-checkable:active { + background-color: color(~`colorPalette("@{primary-color}", 7)`); +} +.ant-tag-pink { + color: #eb2f96; + background: #fff0f6; + border-color: #ffadd2; +} +.ant-tag-pink-inverse { + background: #eb2f96; + border-color: #eb2f96; + color: #fff; +} +.ant-tag-magenta { + color: #eb2f96; + background: #fff0f6; + border-color: #ffadd2; +} +.ant-tag-magenta-inverse { + background: #eb2f96; + border-color: #eb2f96; + color: #fff; +} +.ant-tag-red { + color: #f5222d; + background: #fff1f0; + border-color: #ffa39e; +} +.ant-tag-red-inverse { + background: #f5222d; + border-color: #f5222d; + color: #fff; +} +.ant-tag-volcano { + color: #fa541c; + background: #fff2e8; + border-color: #ffbb96; +} +.ant-tag-volcano-inverse { + background: #fa541c; + border-color: #fa541c; + color: #fff; +} +.ant-tag-orange { + color: #fa8c16; + background: #fff7e6; + border-color: #ffd591; +} +.ant-tag-orange-inverse { + background: #fa8c16; + border-color: #fa8c16; + color: #fff; +} +.ant-tag-yellow { + color: #fadb14; + background: #feffe6; + border-color: #fffb8f; +} +.ant-tag-yellow-inverse { + background: #fadb14; + border-color: #fadb14; + color: #fff; +} +.ant-tag-gold { + color: #faad14; + background: #fffbe6; + border-color: #ffe58f; +} +.ant-tag-gold-inverse { + background: #faad14; + border-color: #faad14; + color: #fff; +} +.ant-tag-cyan { + color: #13c2c2; + background: #e6fffb; + border-color: #87e8de; +} +.ant-tag-cyan-inverse { + background: #13c2c2; + border-color: #13c2c2; + color: #fff; +} +.ant-tag-lime { + color: #a0d911; + background: #fcffe6; + border-color: #eaff8f; +} +.ant-tag-lime-inverse { + background: #a0d911; + border-color: #a0d911; + color: #fff; +} +.ant-tag-green { + color: #52c41a; + background: #f6ffed; + border-color: #b7eb8f; +} +.ant-tag-green-inverse { + background: #52c41a; + border-color: #52c41a; + color: #fff; +} +.ant-tag-blue { + color: @primary-color; + background: color(~`colorPalette("@{primary-color}", 1)`); + border-color: color(~`colorPalette("@{primary-color}", 3)`); +} +.ant-tag-blue-inverse { + background: @primary-color; + border-color: @primary-color; + color: #fff; +} +.ant-tag-geekblue { + color: #2f54eb; + background: #f0f5ff; + border-color: #adc6ff; +} +.ant-tag-geekblue-inverse { + background: #2f54eb; + border-color: #2f54eb; + color: #fff; +} +.ant-tag-purple { + color: #722ed1; + background: #f9f0ff; + border-color: #d3adf7; +} +.ant-tag-purple-inverse { + background: #722ed1; + border-color: #722ed1; + color: #fff; +} +.ant-time-picker-panel { + color: rgba(0, 0, 0, 0.65); +} +.ant-time-picker-panel-inner { + background-color: #fff; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + background-clip: padding-box; +} +.ant-time-picker-panel-input { + border: 0; +} +.ant-time-picker-panel-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-time-picker-panel-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-panel-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-panel-input-wrap { + border-bottom: 1px solid #e8e8e8; +} +.ant-time-picker-panel-input-invalid { + border-color: red; +} +.ant-time-picker-panel-clear-btn-icon svg { + color: rgba(0, 0, 0, 0.25); +} +.ant-time-picker-panel-clear-btn-icon svg:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-time-picker-panel-select { + border-left: 1px solid #e8e8e8; +} +.ant-time-picker-panel-select:first-child { + border-left: 0; +} +.ant-time-picker-panel-select:last-child { + border-right: 0; +} +.ant-time-picker-panel-select li:hover { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +li.ant-time-picker-panel-select-option-selected { + background: #f5f5f5; +} +li.ant-time-picker-panel-select-option-selected:hover { + background: #f5f5f5; +} +li.ant-time-picker-panel-select-option-disabled { + color: rgba(0, 0, 0, 0.25); +} +li.ant-time-picker-panel-select-option-disabled:hover { + background: transparent; +} +.ant-time-picker-panel-addon { + border-top: 1px solid #e8e8e8; +} +.ant-time-picker { + color: rgba(0, 0, 0, 0.65); +} +.ant-time-picker-input { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-time-picker-input::-moz-placeholder { + color: #bfbfbf; +} +.ant-time-picker-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-input:hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + border-right-width: 1px !important; +} +.ant-time-picker-input:focus { + border-color: color(~`colorPalette("@{primary-color}", 5)`); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-time-picker-input-disabled { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-time-picker-input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-time-picker-input[disabled] { + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-time-picker-input[disabled]:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-time-picker-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-time-picker-icon .ant-time-picker-clock-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-timeline { + color: rgba(0, 0, 0, 0.65); +} +.ant-timeline-item-tail { + border-left: 2px solid #e8e8e8; +} +.ant-timeline-item-head { + background-color: #fff; + border-radius: 100px; + border: 2px solid transparent; +} +.ant-timeline-item-head-blue { + border-color: @primary-color; + color: @primary-color; +} +.ant-timeline-item-head-red { + border-color: #f5222d; + color: #f5222d; +} +.ant-timeline-item-head-green { + border-color: #52c41a; + color: #52c41a; +} +.ant-timeline-item-head-custom { + border: 0; + border-radius: 0; +} +.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail { + border-left: 2px dotted #e8e8e8; +} +.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail { + border-left: 2px dotted #e8e8e8; +} +.ant-tooltip { + color: rgba(0, 0, 0, 0.65); +} +.ant-tooltip-inner { + color: #fff; + background-color: rgba(0, 0, 0, 0.75); + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-tooltip-arrow { + border-color: transparent; + border-style: solid; +} +.ant-tooltip-placement-top .ant-tooltip-arrow, +.ant-tooltip-placement-topLeft .ant-tooltip-arrow, +.ant-tooltip-placement-topRight .ant-tooltip-arrow { + border-width: 5px 5px 0; + border-top-color: rgba(0, 0, 0, 0.75); +} +.ant-tooltip-placement-right .ant-tooltip-arrow, +.ant-tooltip-placement-rightTop .ant-tooltip-arrow, +.ant-tooltip-placement-rightBottom .ant-tooltip-arrow { + border-width: 5px 5px 5px 0; + border-right-color: rgba(0, 0, 0, 0.75); +} +.ant-tooltip-placement-left .ant-tooltip-arrow, +.ant-tooltip-placement-leftTop .ant-tooltip-arrow, +.ant-tooltip-placement-leftBottom .ant-tooltip-arrow { + border-width: 5px 0 5px 5px; + border-left-color: rgba(0, 0, 0, 0.75); +} +.ant-tooltip-placement-bottom .ant-tooltip-arrow, +.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow, +.ant-tooltip-placement-bottomRight .ant-tooltip-arrow { + border-width: 0 5px 5px; + border-bottom-color: rgba(0, 0, 0, 0.75); +} +.ant-transfer { + color: rgba(0, 0, 0, 0.65); +} +.ant-transfer-disabled .ant-transfer-list { + background: #f5f5f5; +} +.ant-transfer-list { + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-transfer-list-search-action { + color: rgba(0, 0, 0, 0.25); +} +.ant-transfer-list-search-action .anticon { + color: rgba(0, 0, 0, 0.25); +} +.ant-transfer-list-search-action .anticon:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-transfer-list-header { + border-radius: 4px 4px 0 0; + background: #fff; + color: rgba(0, 0, 0, 0.65); + border-bottom: 1px solid #e8e8e8; +} +.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-transfer-list-content-item-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-transfer-list-body-not-found { + color: rgba(0, 0, 0, 0.25); +} +.ant-transfer-list-footer { + border-top: 1px solid #e8e8e8; + border-radius: 0 0 4px 4px; +} +.ant-select-tree-checkbox { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner, +.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner, +.ant-select-tree-checkbox-input:focus + .ant-select-tree-checkbox-inner { + border-color: @primary-color; +} +.ant-select-tree-checkbox-checked:after { + border-radius: 2px; + border: 1px solid @primary-color; +} +.ant-select-tree-checkbox-inner { + border: 1px solid #d9d9d9; + border-radius: 2px; + background-color: #fff; +} +.ant-select-tree-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after { + border: 0; + background-color: @primary-color; +} +.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner { + background-color: @primary-color; + border-color: @primary-color; +} +.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after { + border-color: #f5f5f5; +} +.ant-select-tree-checkbox-disabled + span { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-tree-checkbox-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree-checkbox-group { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree li .ant-select-tree-node-content-wrapper { + border-radius: 2px; + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree li .ant-select-tree-node-content-wrapper:hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-select-tree li .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected { + background-color: color(~`colorPalette("@{primary-color}", 2)`); +} +.ant-select-tree li span.ant-select-tree-switcher, +.ant-select-tree li span.ant-select-tree-iconEle { + border: 0 none; +} +.ant-select-tree li span.ant-select-icon_loading .ant-select-switcher-loading-icon { + color: @primary-color; +} +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-loading-icon, +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-loading-icon { + color: @primary-color; +} +li.ant-select-tree-treenode-disabled > span:not(.ant-select-tree-switcher), +li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper, +li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper span { + color: rgba(0, 0, 0, 0.25); +} +li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper:hover { + background: transparent; +} +.ant-select-tree-dropdown { + color: rgba(0, 0, 0, 0.65); +} +.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field { + border: 1px solid #d9d9d9; + border-radius: 4px; +} +.ant-select-tree-dropdown .ant-select-not-found { + color: rgba(0, 0, 0, 0.25); +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper { + border-radius: 0; +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper:hover, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper:hover { + background: transparent; +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper:hover:before, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper:hover:before { + background: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper.ant-tree-node-selected, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper.ant-tree-node-selected { + color: #fff; + background: transparent; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-switcher, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-switcher { + color: #fff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox .ant-tree-checkbox-inner, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox .ant-tree-checkbox-inner { + border-color: @primary-color; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked:after, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked:after { + border-color: #fff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner { + background: #fff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after { + border-color: @primary-color; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-node-content-wrapper:before, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-node-content-wrapper:before { + background: @primary-color; +} +.ant-tree-checkbox { + color: rgba(0, 0, 0, 0.65); +} +.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner, +.ant-tree-checkbox:hover .ant-tree-checkbox-inner, +.ant-tree-checkbox-input:focus + .ant-tree-checkbox-inner { + border-color: @primary-color; +} +.ant-tree-checkbox-checked:after { + border-radius: 2px; + border: 1px solid @primary-color; +} +.ant-tree-checkbox-inner { + border: 1px solid #d9d9d9; + border-radius: 2px; + background-color: #fff; +} +.ant-tree-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after { + border: 0; + background-color: @primary-color; +} +.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after { + border: 2px solid #fff; + border-top: 0; + border-left: 0; +} +.ant-tree-checkbox-checked .ant-tree-checkbox-inner { + background-color: @primary-color; + border-color: @primary-color; +} +.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-tree-checkbox-disabled .ant-tree-checkbox-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after { + border-color: #f5f5f5; +} +.ant-tree-checkbox-disabled + span { + color: rgba(0, 0, 0, 0.25); +} +.ant-tree-checkbox-wrapper { + color: rgba(0, 0, 0, 0.65); +} +.ant-tree-checkbox-group { + color: rgba(0, 0, 0, 0.65); +} +.ant-tree { + color: rgba(0, 0, 0, 0.65); +} +.ant-tree li span[draggable], +.ant-tree li span[draggable="true"] { + border-top: 2px transparent solid; + border-bottom: 2px transparent solid; +} +.ant-tree li.drag-over > span[draggable] { + background-color: @primary-color; + color: white; +} +.ant-tree li.drag-over-gap-top > span[draggable] { + border-top-color: @primary-color; +} +.ant-tree li.drag-over-gap-bottom > span[draggable] { + border-bottom-color: @primary-color; +} +.ant-tree li.filter-node > span { + color: #f5222d !important; +} +.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-loading-icon, +.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-loading-icon { + color: @primary-color; +} +.ant-tree li .ant-tree-node-content-wrapper { + border-radius: 2px; + color: rgba(0, 0, 0, 0.65); +} +.ant-tree li .ant-tree-node-content-wrapper:hover { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-tree li .ant-tree-node-content-wrapper.ant-tree-node-selected { + background-color: color(~`colorPalette("@{primary-color}", 2)`); +} +.ant-tree li span.ant-tree-switcher, +.ant-tree li span.ant-tree-iconEle { + border: 0 none; +} +li.ant-tree-treenode-disabled > span:not(.ant-tree-switcher), +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper, +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper span { + color: rgba(0, 0, 0, 0.25); +} +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper:hover { + background: transparent; +} +.ant-tree.ant-tree-show-line li span.ant-tree-switcher { + background: #fff; + color: rgba(0, 0, 0, 0.45); +} +.ant-tree.ant-tree-show-line li:not(:last-child):before { + border-left: 1px solid #d9d9d9; +} +.ant-upload { + color: rgba(0, 0, 0, 0.65); +} +.ant-upload.ant-upload-select-picture-card { + border: 1px dashed #d9d9d9; + border-radius: 4px; + background-color: #fafafa; +} +.ant-upload.ant-upload-select-picture-card:hover { + border-color: @primary-color; +} +.ant-upload.ant-upload-drag { + border: 1px dashed #d9d9d9; + border-radius: 4px; + background: #fafafa; +} +.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled) { + border: 2px dashed color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover { + border-color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon { + color: color(~`colorPalette("@{primary-color}", 5)`); +} +.ant-upload.ant-upload-drag p.ant-upload-text { + color: rgba(0, 0, 0, 0.85); +} +.ant-upload.ant-upload-drag p.ant-upload-hint { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload.ant-upload-drag .anticon-plus { + color: rgba(0, 0, 0, 0.25); +} +.ant-upload.ant-upload-drag .anticon-plus:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload.ant-upload-drag:hover .anticon-plus { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list { + color: rgba(0, 0, 0, 0.65); +} +.ant-upload-list-item-info .anticon-loading, +.ant-upload-list-item-info .anticon-paper-clip { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list-item .anticon-close { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list-item .anticon-close:hover { + color: rgba(0, 0, 0, 0.65); +} +.ant-upload-list-item:hover .ant-upload-list-item-info { + background-color: color(~`colorPalette("@{primary-color}", 1)`); +} +.ant-upload-list-item-error, +.ant-upload-list-item-error .anticon-paper-clip, +.ant-upload-list-item-error .ant-upload-list-item-name { + color: #f5222d; +} +.ant-upload-list-item-error .anticon-close { + color: #f5222d !important; +} +.ant-upload-list-picture .ant-upload-list-item, +.ant-upload-list-picture-card .ant-upload-list-item { + border-radius: 4px; + border: 1px solid #d9d9d9; +} +.ant-upload-list-picture .ant-upload-list-item:hover, +.ant-upload-list-picture-card .ant-upload-list-item:hover { + background: transparent; +} +.ant-upload-list-picture .ant-upload-list-item-error, +.ant-upload-list-picture-card .ant-upload-list-item-error { + border-color: #f5222d; +} +.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info, +.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info { + background: transparent; +} +.ant-upload-list-picture .ant-upload-list-item-uploading, +.ant-upload-list-picture-card .ant-upload-list-item-uploading { + border-style: dashed; +} +.ant-upload-list-picture .ant-upload-list-item-icon, +.ant-upload-list-picture-card .ant-upload-list-item-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-upload-list-picture .ant-upload-list-item-thumbnail.anticon:before, +.ant-upload-list-picture-card .ant-upload-list-item-thumbnail.anticon:before { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list-picture-card .ant-upload-list-item-info:before { + background-color: rgba(0, 0, 0, 0.5); +} +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o, +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete { + color: rgba(255, 255, 255, 0.85); +} +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o:hover, +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover { + color: #fff; +} +.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item { + background-color: #fafafa; +} +.ant-upload-list-picture-card .ant-upload-list-item-uploading-text { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list .ant-upload-success-icon { + color: #52c41a; +} + +.drawer .drawer-content { + background: #001529; +} + +.ant-list-item-meta .taobao { + color: #ff4000; + border-radius: 4px; +} +.ant-list-item-meta .dingding { + background-color: #2eabff; + color: #fff; + border-radius: 4px; +} +.ant-list-item-meta .alipay { + color: #2eabff; + border-radius: 4px; +} +font.strong { + color: #52c41a; +} +font.medium { + color: #faad14; +} +font.weak { + color: #f5222d; +} diff --git a/ant-design-jeecg-vue/public/index.html b/ant-design-jeecg-vue/public/index.html new file mode 100644 index 0000000..05d0f5a --- /dev/null +++ b/ant-design-jeecg-vue/public/index.html @@ -0,0 +1,238 @@ +<!DOCTYPE html> +<html lang="zh-cmn-Hans"> + +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width,initial-scale=1.0"> + <title>Jeecg-Boot 快速开发平台(Ant Design Vue)</title> + <link rel="icon" href="<%= BASE_URL %>logo.png"> + <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.2.5/polyfill.js"></script> + <style> + html, + body, + #app { + height: 100%; + margin: 0px; + padding: 0px; + } + .chromeframe { + margin: 0.2em 0; + background: #ccc; + color: #000; + padding: 0.2em 0; + } + #loader-wrapper { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 999999; + } + #loader { + display: block; + position: relative; + left: 50%; + top: 50%; + width: 120px; + height: 120px; + margin: -75px 0 0 -75px; + border-radius: 50%; + border: 3px solid transparent; + /* COLOR 1 */ + border-top-color: #FFF; + -webkit-animation: spin 2s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + -ms-animation: spin 2s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + -moz-animation: spin 2s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + -o-animation: spin 2s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + animation: spin 2s linear infinite; + /* Chrome, Firefox 16+, IE 10+, Opera */ + z-index: 1001; + } + #loader:before { + content: ""; + position: absolute; + top: 5px; + left: 5px; + right: 5px; + bottom: 5px; + border-radius: 50%; + border: 3px solid transparent; + /* COLOR 2 */ + border-top-color: #FFF; + -webkit-animation: spin 3s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + -moz-animation: spin 3s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + -o-animation: spin 3s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + -ms-animation: spin 3s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + animation: spin 3s linear infinite; + /* Chrome, Firefox 16+, IE 10+, Opera */ + } + #loader:after { + content: ""; + position: absolute; + top: 15px; + left: 15px; + right: 15px; + bottom: 15px; + border-radius: 50%; + border: 3px solid transparent; + border-top-color: #FFF; + /* COLOR 3 */ + -moz-animation: spin 1.5s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + -o-animation: spin 1.5s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + -ms-animation: spin 1.5s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + -webkit-animation: spin 1.5s linear infinite; + /* Chrome, Opera 15+, Safari 5+ */ + animation: spin 1.5s linear infinite; + /* Chrome, Firefox 16+, IE 10+, Opera */ + } + @-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(0deg); + /* IE 9 */ + transform: rotate(0deg); + /* Firefox 16+, IE 10+, Opera */ + } + 100% { + -webkit-transform: rotate(360deg); + /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(360deg); + /* IE 9 */ + transform: rotate(360deg); + /* Firefox 16+, IE 10+, Opera */ + } + } + @keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(0deg); + /* IE 9 */ + transform: rotate(0deg); + /* Firefox 16+, IE 10+, Opera */ + } + 100% { + -webkit-transform: rotate(360deg); + /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(360deg); + /* IE 9 */ + transform: rotate(360deg); + /* Firefox 16+, IE 10+, Opera */ + } + } + #loader-wrapper .loader-section { + position: fixed; + top: 0; + width: 51%; + height: 100%; + background: #49a9ee; + /* Old browsers */ + z-index: 1000; + -webkit-transform: translateX(0); + /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: translateX(0); + /* IE 9 */ + transform: translateX(0); + /* Firefox 16+, IE 10+, Opera */ + } + #loader-wrapper .loader-section.section-left { + left: 0; + } + #loader-wrapper .loader-section.section-right { + right: 0; + } + /* Loaded */ + .loaded #loader-wrapper .loader-section.section-left { + -webkit-transform: translateX(-100%); + /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: translateX(-100%); + /* IE 9 */ + transform: translateX(-100%); + /* Firefox 16+, IE 10+, Opera */ + -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); + transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); + } + .loaded #loader-wrapper .loader-section.section-right { + -webkit-transform: translateX(100%); + /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: translateX(100%); + /* IE 9 */ + transform: translateX(100%); + /* Firefox 16+, IE 10+, Opera */ + -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); + transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); + } + .loaded #loader { + opacity: 0; + -webkit-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; + } + .loaded #loader-wrapper { + visibility: hidden; + -webkit-transform: translateY(-100%); + /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: translateY(-100%); + /* IE 9 */ + transform: translateY(-100%); + /* Firefox 16+, IE 10+, Opera */ + -webkit-transition: all 0.3s 1s ease-out; + transition: all 0.3s 1s ease-out; + } + /* JavaScript Turned Off */ + .no-js #loader-wrapper { + display: none; + } + .no-js h1 { + color: #222222; + } + #loader-wrapper .load_title { + font-family: 'Open Sans'; + color: #FFF; + font-size: 14px; + width: 100%; + text-align: center; + z-index: 9999999999999; + position: absolute; + top: 60%; + opacity: 1; + line-height: 30px; + } + #loader-wrapper .load_title span { + font-weight: normal; + font-style: italic; + font-size: 14px; + color: #FFF; + opacity: 0.5; + } + </style> +</head> + +<body> +<!-- built files will be auto injected --> +<div id="app"> + <div id="loader-wrapper"> + <div id="loader"></div> + <div class="loader-section section-left"></div> + <div class="loader-section section-right"></div> + <div class="load_title">正在加载 Jeecg-Boot 快速开发平台(Ant Design Vue),请耐心等待 + + </div> + </div> +</div> +</body> + +</html> \ No newline at end of file diff --git a/ant-design-jeecg-vue/public/logo.png b/ant-design-jeecg-vue/public/logo.png new file mode 100644 index 0000000..e887375 Binary files /dev/null and b/ant-design-jeecg-vue/public/logo.png differ diff --git a/ant-design-jeecg-vue/public/v2.js b/ant-design-jeecg-vue/public/v2.js new file mode 100644 index 0000000..ce04728 --- /dev/null +++ b/ant-design-jeecg-vue/public/v2.js @@ -0,0 +1 @@ +!function(){"use strict";function e(e){return e===undefined||null===e}function t(e){return e!==undefined&&null!==e}function n(e){return null!==e&&"object"===(void 0===e?"undefined":d(e))}function r(e){return"object"===(void 0===e?"undefined":d(e))&&e instanceof HTMLElement}function o(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function i(){return new RegExp("MSIE (\\d+\\.\\d+);").test(navigator.userAgent),parseFloat(RegExp.$1)||Infinity}function a(e,t){for(var n in t)e[n]=t[n];return e}function c(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}function u(e){return p.call(e).slice(8,-1)}function s(e){throw new Error("Vaptcha error: "+e)}function l(e){var t=e.mode,n=e.outage;return!!t&&"downtime"===(t=t.toLowerCase())&&!!n}function Promise(e){var t=this;this.state="pending",this.value=undefined,this.reason=undefined,this.onResolveAsyncCallbacks=[],this.onRejectAsyncCallbacks=[];var n=function(e){"pending"===t.state&&(t.state="fulfilled",t.value=e,t.onResolveAsyncCallbacks.map(function(e){return e()}))},r=function(e){"pending"===t.state&&(t.state="rejected",t.reason=e,t.onRejectAsyncCallbacks.map(function(t){return t(e)}))};try{e(n,r)}catch(o){r(o)}}window.HTMLElement=window.HTMLElement||Element,Array.prototype.map||(Array.prototype.map=function(e,t){var n,r,o;if(null==this)throw new TypeError(" this is null or not defined");var i=Object(this),a=i.length>>>0;if("[object Function]"!=Object.prototype.toString.call(e))throw new TypeError(e+" is not a function");for(t&&(n=t),r=new Array(a),o=0;o<a;){var c,u;o in i&&(c=i[o],u=e.call(n,c,o,i),r[o]=u),o++}return r}),Array.prototype.includes||(Array.prototype.includes=function(e,t){if(null==this)throw new TypeError('"this" is null or not defined');var n=Object(this),r=n.length>>>0;if(0===r)return!1;for(var o=0|t,i=Math.max(o>=0?o:r-Math.abs(o),0);i<r;){if(n[i]===e)return!0;i++}return!1}),Array.prototype.findIndex||(Array.prototype.findIndex=function(e){if(null==this)throw new TypeError('"this" is null or not defined');var t=Object(this),n=t.length>>>0;if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var r=arguments[1],o=0;o<n;){if(e.call(r,t[o],o,t))return o;o++}return-1}),Object.create||(Object.create=function(e){var t=function(){};return t.prototype=e,new t});var f={vid:null,scene:"",container:null,type:"float",style:"dark",lang:"zh-CN",ai:!0,https:!0,guide:!0,aiAnimation:!0,protocol:"https://",css_version:"downtime",cdn_servers:["cdn.vaptcha.com"],api_server:"api.vaptcha.com/v2",canvas_path:"/canvas.min.js"},d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p=Object.prototype.toString,h=(c(function(e){for(var t={},n=e&&-1!==e.indexOf("?")&&e.split("?")[1]||window.location.search.substring(1),r=n.split("&"),o=0;o<r.length;o++){var i=r[o].split("=");t[decodeURIComponent(i[0])]=decodeURIComponent(i[1])}return t}),c(function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),v=function(t){this.data=t,this.valiudateFuns=[],this.ruleFuns={required:function(t,n){return e(t)||0===t.length?n:null}}};v.prototype={constructor:v,addValidateRules:function(e){a(this.ruleFuns,e)},add:function(e,t,n){var r=this,o=t.split(":"),i=o.shift(),a=this.ruleFuns[i];o.unshift(this.data[e]),o.push(n),a&&this.valiudateFuns.push(function(){return a.apply(r,o)})},validate:function(){for(var e,t=0;e=this.valiudateFuns[t++];){var n=e();if(n)return s(n),!1}return!0}};var m={AccessDenied:"0101",RefreshAgain:"0102",Success:"0103",Fail:"0104",RefreshTooFast:"0105",RefreshTanto:"0106",DrawTanto:"0107",Attack:"0108",jsonpTimeOut:"0703",challengeExpire:"1002"};Promise.prototype.then=function(e){var t=this;if("fulfilled"===this.state){var r=e(this.value);if(n(r)&&"Promise"===o(r.constructor))return r}return"pending"===this.state?new Promise(function(r){t.onResolveAsyncCallbacks.push(function(){var i=e(t.value);if(n(i)&&"Promise"===o(i.constructor))return i.then(r);r(i)})}):this},Promise.prototype["catch"]=function(e){return"rejected"===this.state&&e(this.reason),"pending"===this.state&&this.onRejectAsyncCallbacks.push(e),this},Promise.resolve=function(e){return new Promise(function(t){t(e)})},Promise.reject=function(e){return new Promise(function(t,n){n(e)})};var y=function(){var e=f.protocol,t=f.api_server,n=function(e){var t="";for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t+="&"+n+"="+encodeURIComponent(e[n]));return t},r=function(r,o){var i=n(o),a=r.indexOf("http://")>-1||r.indexOf("https://")>-1;return r.indexOf("?")<0&&(i="?"+i.slice(1)),a?""+r+i:""+e+t+r+i},o=function(e){var t=document.getElementsByTagName("head")[0],n=document.createElement("script");return n.charset="UTF-8",n.src=e,t.appendChild(n),{remove:function(){t.removeChild(n)}}},i=function(e,t){return t=t||{},new Promise(function(n){var i="VaptchaJsonp"+(new Date).valueOf();window[i]&&(i+="1"),a(t,{callback:i}),e=r(e,t);var c=o(e),u=setTimeout(function(){clearTimeout(u),window[i]=null,c.remove(),n({code:"0703",msg:"Time out,Refresh Again!"})},1e4);window[i]=function(){clearTimeout(u),n.apply(this,arguments),c.remove(),window[i]=null}})};return i.setConfig=function(n){e=n.protocol||e,t=n.api_server||t},i}(),g={getConfig:function(e){return y("/config",{id:e.vid,type:e.type,scene:e.scene||""})},refresh:function(e){return y("/refresh",e)},click:function(e){return y("/click",e)},get:function(e){return y("/get",e)},verify:function(e){return y("/verify",e)},userbehavior:function(e){return y("/userbehavior",e)}},w={"0201":"id empty","0202":"id error","0208":"scene error","0209":"request used up","0906":"params error","0702":"domain not match"},b=function(){var o=!1,c=function(e){var t=new v(e);return t.add("outage","required","please configure outage"),t.validate(),a(e,{js_path:"vaptcha-sdk-downtime.2.0.2.js",api_server:window.location.host,protocol:window.location.protocol+"//",mode:"DownTime"}),y.setConfig(e),y(e.outage,{action:"get"}).then(function(t){return t.code!==m.Success?(s(w[t.msg]||t.msg),Promise.reject(t.code)):(a(e,t),Promise.resolve())})},f=function(e){return l(e)?c(e):g.getConfig(e).then(function(t){return t.code!==m.Success?(s(w[t.msg]||t.msg),Promise.reject(t.code)):(t.type!==e.type&&(t.mode=t.type,t.type=e.type),a(e,t),l(e)?c(e):Promise.resolve())})},d=function(e,t){return""+e.protocol+e.cdn_servers[0]+"/"+t},p=function(t){var n=document.getElementsByTagName("head")[0],r=document.getElementById("vaptcha_style");return new Promise(function(o){e(r)?(r=document.createElement("link"),a(r,{rel:"stylesheet",type:"text/css",href:t,id:"vaptcha_style",onload:o}),n&&n.appendChild(r)):o()})},b=function C(e){var n=document.getElementsByTagName("head")[0],r=document.querySelector("script[src='"+e+"']");return new Promise(function(o){if(t(r))return void(r.loaded?o():setTimeout(function(){return C(e).then(o)}));r=document.createElement("script");var i=function(){r.readyState&&"loaded"!==r.readyState&&"complete"!==r.readyState||(o(),r.loaded=!0,r.onload=null,r.onreadystatechange=null)};a(r,{async:!0,charset:"utf-8",src:e,onerror:function(){return s("load sdk timeout")},onload:i,onreadystatechange:i}),n.appendChild(r)})},j=function T(e){var t=e.sdkName,n=e.config,r=d(n,n.js_path);return b(r).then(function(){var e=window["_"+h(t)+"Vaptcha"],r=new e(n);return r.vaptcha.resetCaptcha=function(e,t){a(n,t),T({sdkName:e,config:n}).then(function(e){r.destroy(),r.options=e.options,r.vaptcha=e.vaptcha,e.render(),"character"===n.mode&&["click","float","popup"].includes(n.type)&&e.vaptcha.dtClickCb({target:e.vaptcha.btnDiv})})},Promise.resolve(r)})},A=function(e){o=!0,e.https=!0,e.protocol="https://",y.setConfig(e),!["embed","popup","invisible"].includes(e.type)&&(e.type="popup"),i()<9&&b(d(e,e.canvas_path));var t=new v(e);if(t.addValidateRules({elementOrSelector:function(t,o){if("String"===u(e.container)&&(e.container=document.querySelector(e.container)),n(e.container)&&r(e.container[0])&&(e.container=e.container[0]),!r(e.container))return o}}),t.add("vid","required","please configure vid"),"invisible"!==e.type&&t.add("container","elementOrSelector","please configure container with element or selector"),t.validate())return f(e).then(function(){var t="theme_https."+e.css_version+".css",n=d(e,t);return p(n)}).then(function(){var t=e.mode||e.type;return o=!1,j({sdkName:t,config:e})})};return function S(e){return new Promise(function(t){o?setTimeout(function(){S(e).then(t)},1e3):A(e).then(t)})["catch"](function(e){return o=!1,s(e),Promise.reject(e)})}}(),j=function(){var e=function(e){var n=e.getAttribute("data-config"),r={};if(t(n))try{r=JSON.parse(n)}catch(o){s("dom config format error")}return r},n=function(e){var n=e.getAttribute("data-vid");return t(n)?{vid:n}:{}},r=function(e,n){var r=Object.create(f);r.container=e,a(r,n),t(r.vid)&&b(r).then(function(e){e.renderTokenInput(),e.render()})};return function(){for(var t=document.querySelectorAll("[data-vid]"),o=document.querySelectorAll("[data-config]"),i=0;i<o.length;i++){var a=e(o[i]);r(o[i],a)}for(var c=0;c<t.length;c++)if(!Array.prototype.includes.call(o,t[c])){var u=n(t[c]);r(t[c],u)}}}();window.onload=j,window.vaptcha=function(e){var t=Object.create(f);return a(t,e),b(t)}}(); \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/App.vue b/ant-design-jeecg-vue/src/App.vue new file mode 100644 index 0000000..747ca31 --- /dev/null +++ b/ant-design-jeecg-vue/src/App.vue @@ -0,0 +1,44 @@ +<template> + <a-locale-provider :locale="locale"> + <div id="app"> + <router-view/> + </div> + </a-locale-provider> +</template> +<script> + import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN' + import enquireScreen from '@/utils/device' + + export default { + data () { + return { + locale: zhCN, + } + }, + created () { + let that = this + enquireScreen(deviceType => { + // tablet + if (deviceType === 0) { + that.$store.commit('TOGGLE_DEVICE', 'mobile') + that.$store.dispatch('setSidebar', false) + } + // mobile + else if (deviceType === 1) { + that.$store.commit('TOGGLE_DEVICE', 'mobile') + that.$store.dispatch('setSidebar', false) + } + else { + that.$store.commit('TOGGLE_DEVICE', 'desktop') + that.$store.dispatch('setSidebar', true) + } + + }) + } + } +</script> +<style> + #app { + height: 100%; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/api/api.js b/ant-design-jeecg-vue/src/api/api.js new file mode 100644 index 0000000..19a4b00 --- /dev/null +++ b/ant-design-jeecg-vue/src/api/api.js @@ -0,0 +1,129 @@ +import { getAction,deleteAction,putAction,postAction} from '@/api/manage' + +//根路径 +const doMian = "/jeecg-boot/"; +//图片预览请求地址 +const imgView = "http://127.0.0.1:8080/jeecg-boot/sys/common/view/"; + + +//角色管理 +const addRole = (params)=>postAction("/sys/role/add",params); +const editRole = (params)=>putAction("/sys/role/edit",params); +const getRoleList = (params)=>getAction("/sys/role/list",params); +const deleteRole = (params)=>deleteAction("/sys/role/delete",params); +const deleteRoleList = (params)=>deleteAction("/sys/role/deleteBatch",params); +const checkRoleCode = (params)=>getAction("/sys/role/checkRoleCode",params); +const queryall = (params)=>getAction("/sys/role/queryall",params); + +//用户管理 +const addUser = (params)=>postAction("/sys/user/add",params); +const editUser = (params)=>putAction("/sys/user/edit",params); +const queryUserRole = (params)=>getAction("/sys/user/queryUserRole",params); +const getUserList = (params)=>getAction("/sys/user/list",params); +const deleteUser = (params)=>deleteAction("/sys/user/delete",params); +const deleteUserList = (params)=>deleteAction("/sys/user/deleteBatch",params); +const frozenBatch = (params)=>putAction("/sys/user/frozenBatch",params); +//验证用户账号是否唯一 +const checkUsername = (params)=>getAction("/sys/user/checkOnlyUser",params); +//改变密码 +const changPassword = (params)=>putAction("/sys/user/changPassword",params); + +//权限管理 +const addPermission= (params)=>postAction("/sys/permission/add",params); +const editPermission= (params)=>putAction("/sys/permission/edit",params); +const getPermissionList = (params)=>getAction("/sys/permission/list",params); +const deletePermission = (params)=>deleteAction("/sys/permission/delete",params); +const deletePermissionList = (params)=>deleteAction("/sys/permission/deleteBatch",params); +const queryTreeList = (params)=>getAction("/sys/permission/queryTreeList",params); +const queryListAsync = (params)=>getAction("/sys/permission/queryListAsync",params); +const queryRolePermission = (params)=>getAction("/sys/permission/queryRolePermission",params); +const saveRolePermission = (params)=>postAction("/sys/permission/saveRolePermission",params); +const queryPermissionsByUser = (params)=>getAction("/sys/permission/queryByUser",params); +const loadAllRoleIds = (params)=>getAction("/sys/permission/loadAllRoleIds",params); + +// 部门管理 +const queryDepartTreeList = (params)=>getAction("/sysdepart/sysDepart/queryTreeList",params); +const queryIdTree = (params)=>getAction("/sysdepart/sysDepart/queryIdTree",params); +const queryParentName = (params)=>getAction("/sysdepart/sysDepart/queryParentName",params); +const searchByKeywords = (params)=>getAction("/sysdepart/sysDepart/searchBy",params); + +//日志管理 +const getLogList = (params)=>getAction("/sys/log/list",params); +const deleteLog = (params)=>deleteAction("/sys/log/delete",params); +const deleteLogList = (params)=>deleteAction("/sys/log/deleteBatch",params); + +//数据字典 +const addDict = (params)=>postAction("/sys/dict/add",params); +const editDict = (params)=>putAction("/sys/dict/edit",params); +const getDictList = (params)=>getAction("/sys/dict/list",params); +const treeList = (params)=>getAction("/sys/dict/treeList",params); +const delDict = (params)=>deleteAction("/sys/dict/delete",params); +const getDictItemList = (params)=>getAction("/sys/dictItem/list",params); +const addDictItem = (params)=>postAction("/sys/dictItem/add",params); +const editDictItem = (params)=>putAction("/sys/dictItem/edit",params); +const delDictItem = (params)=>deleteAction("/sys/dictItem/delete",params); +const delDictItemList = (params)=>deleteAction("/sys/dictItem/deleteBatch",params); + +//字典标签专用(通过code获取字典数组) +export const ajaxGetDictItems = (code, params)=>getAction(`/sys/dict/getDictItems/${code}`,params); + +//系统通告 +const doReleaseData = (params)=>getAction("/sys/annountCement/doReleaseData",params); +const doReovkeData = (params)=>getAction("/sys/annountCement/doReovkeData",params); +//获取系统访问量 +const getLoginfo = (params)=>getAction("/sys/loginfo",params); + +export { + imgView, + doMian, + addRole, + editRole, + getRoleList, + deleteRole, + deleteRoleList, + checkRoleCode, + addUser, + editUser, + queryUserRole, + queryall, + getUserList, + deleteUser, + deleteUserList, + frozenBatch, + checkUsername, + changPassword, + getPermissionList, + deletePermission, + deletePermissionList, + addPermission, + editPermission, + queryTreeList, + queryListAsync, + queryRolePermission, + saveRolePermission, + queryPermissionsByUser, + loadAllRoleIds, + queryDepartTreeList, + queryIdTree, + queryParentName, + searchByKeywords, + getLogList, + deleteLog, + deleteLogList, + getDictList, + addDict, + editDict, + delDict, + treeList, + getDictItemList, + addDictItem, + editDictItem, + delDictItem, + delDictItemList, + doReleaseData, + doReovkeData, + getLoginfo +} + + + diff --git a/ant-design-jeecg-vue/src/api/index.js b/ant-design-jeecg-vue/src/api/index.js new file mode 100644 index 0000000..53d4985 --- /dev/null +++ b/ant-design-jeecg-vue/src/api/index.js @@ -0,0 +1,10 @@ +const api = { + Login: '/sys/login', + Logout: '/auth/logout', + ForgePassword: '/auth/forge-password', + Register: '/auth/register', + SendSms: '/account/sms', + // get my info + UserInfo: '/user/info' +} +export default api \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/api/login.js b/ant-design-jeecg-vue/src/api/login.js new file mode 100644 index 0000000..9e72c42 --- /dev/null +++ b/ant-design-jeecg-vue/src/api/login.js @@ -0,0 +1,49 @@ +import api from './index' +import { axios } from '@/utils/request' + +/** + * login func + * parameter: { + * username: '', + * password: '', + * remember_me: true, + * captcha: '12345' + * } + * @param parameter + * @returns {*} + */ +export function login(parameter) { + return axios({ + url: '/sys/login', + method: 'post', + data: parameter + }) +} + +export function getSmsCaptcha(parameter) { + return axios({ + url: api.SendSms, + method: 'post', + data: parameter + }) +} + +export function getInfo() { + return axios({ + url: '/api/user/info', + method: 'get', + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + } + }) +} + +export function logout() { + return axios({ + url: '/api/auth/logout', + method: 'post', + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + } + }) +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/api/manage.js b/ant-design-jeecg-vue/src/api/manage.js new file mode 100644 index 0000000..cc50518 --- /dev/null +++ b/ant-design-jeecg-vue/src/api/manage.js @@ -0,0 +1,99 @@ +import { axios } from '@/utils/request' + +const api = { + user: '/api/user', + role: '/api/role', + service: '/api/service', + permission: '/api/permission', + permissionNoPager: '/api/permission/no-pager' +} + +export default api + +//post +export function postAction(url,parameter) { + return axios({ + url: url, + method:'post' , + data: parameter + }) +} + +//post method= {post | put} +export function httpAction(url,parameter,method) { + return axios({ + url: url, + method:method , + data: parameter + }) +} + +//put +export function putAction(url,parameter) { + return axios({ + url: url, + method:'put', + data: parameter + }) +} + +//get +export function getAction(url,parameter) { + return axios({ + url: url, + method: 'get', + params: parameter + }) +} + +//deleteAction +export function deleteAction(url,parameter) { + return axios({ + url: url, + method: 'delete', + params: parameter + }) +} + +export function getUserList(parameter) { + return axios({ + url: api.user, + method: 'get', + params: parameter + }) +} + +export function getRoleList(parameter) { + return axios({ + url: api.role, + method: 'get', + params: parameter + }) +} + +export function getServiceList(parameter) { + return axios({ + url: api.service, + method: 'get', + params: parameter + }) +} + +export function getPermissions(parameter) { + return axios({ + url: api.permissionNoPager, + method: 'get', + params: parameter + }) +} + +// id == 0 add post +// id != 0 update put +export function saveService(parameter) { + return axios({ + url: api.service, + method: parameter.id == 0 ? 'post' : 'put', + data: parameter + }) +} + diff --git a/ant-design-jeecg-vue/src/assets/background.svg b/ant-design-jeecg-vue/src/assets/background.svg new file mode 100644 index 0000000..89c2597 --- /dev/null +++ b/ant-design-jeecg-vue/src/assets/background.svg @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch --> + <title>Group 21</title> + <desc>Created with Sketch.</desc> + <defs></defs> + <g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)"> + <g id="Group-21" transform="translate(77.000000, 73.000000)"> + <g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)"> + <ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"></ellipse> + <ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"></ellipse> + <path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path> + <path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path> + <path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path> + <path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path> + <g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6"> + <ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"></ellipse> + <path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path> + </g> + </g> + <g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)"> + <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"></ellipse> + <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"></ellipse> + <ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"></ellipse> + <ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"></ellipse> + <path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"></path> + <g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6"> + <ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse> + <path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path> + </g> + <ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"></ellipse> + <ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"></ellipse> + <ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"></ellipse> + <path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path> + </g> + <g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)"> + <ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"></ellipse> + <g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9"> + <ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"></ellipse> + <path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"></path> + </g> + <path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"></path> + <ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"></ellipse> + <ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"></ellipse> + <path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"></path> + </g> + <g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)"> + <g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9"> + <circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle> + <path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path> + </g> + <circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle> + <path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"></path> + <path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"></path> + <polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline> + <path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"></path> + <path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"></path> + <path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"></path> + <circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle> + <circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle> + <circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle> + <circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"></circle> + <circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/assets/less/index.less b/ant-design-jeecg-vue/src/assets/less/index.less new file mode 100644 index 0000000..ec5420d --- /dev/null +++ b/ant-design-jeecg-vue/src/assets/less/index.less @@ -0,0 +1,21 @@ +.search{ + margin-bottom: 54px; +} +.fold{ + width: calc(100% - 216px); + display: inline-block +} +.operator{ + margin-bottom: 18px; +} +@media screen and (max-width: 900px) { + .fold { + width: 100%; + } +} +.operator button { + margin-right: 5px; +} +i { + cursor: pointer; +} diff --git a/ant-design-jeecg-vue/src/assets/logo.png b/ant-design-jeecg-vue/src/assets/logo.png new file mode 100644 index 0000000..e887375 Binary files /dev/null and b/ant-design-jeecg-vue/src/assets/logo.png differ diff --git a/ant-design-jeecg-vue/src/assets/logo.svg b/ant-design-jeecg-vue/src/assets/logo.svg new file mode 100644 index 0000000..e9f8c2a --- /dev/null +++ b/ant-design-jeecg-vue/src/assets/logo.svg @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg width="200px" height="200px" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 47.1 (45422) - http://www.bohemiancoding.com/sketch --> + <title>Group 28 Copy 5</title> + <desc>Created with Sketch.</desc> + <defs> + <linearGradient x1="62.1023273%" y1="0%" x2="108.19718%" y2="37.8635764%" id="linearGradient-1"> + <stop stop-color="#4285EB" offset="0%"></stop> + <stop stop-color="#2EC7FF" offset="100%"></stop> + </linearGradient> + <linearGradient x1="69.644116%" y1="0%" x2="54.0428975%" y2="108.456714%" id="linearGradient-2"> + <stop stop-color="#29CDFF" offset="0%"></stop> + <stop stop-color="#148EFF" offset="37.8600687%"></stop> + <stop stop-color="#0A60FF" offset="100%"></stop> + </linearGradient> + <linearGradient x1="69.6908165%" y1="-12.9743587%" x2="16.7228981%" y2="117.391248%" id="linearGradient-3"> + <stop stop-color="#FA816E" offset="0%"></stop> + <stop stop-color="#F74A5C" offset="41.472606%"></stop> + <stop stop-color="#F51D2C" offset="100%"></stop> + </linearGradient> + <linearGradient x1="68.1279872%" y1="-35.6905737%" x2="30.4400914%" y2="114.942679%" id="linearGradient-4"> + <stop stop-color="#FA8E7D" offset="0%"></stop> + <stop stop-color="#F74A5C" offset="51.2635191%"></stop> + <stop stop-color="#F51D2C" offset="100%"></stop> + </linearGradient> + </defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="logo" transform="translate(-20.000000, -20.000000)"> + <g id="Group-28-Copy-5" transform="translate(20.000000, 20.000000)"> + <g id="Group-27-Copy-3"> + <g id="Group-25" fill-rule="nonzero"> + <g id="2"> + <path d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C99.2571609,26.9692191 101.032305,26.9692191 102.20193,28.1378823 L129.985225,55.8983314 C134.193707,60.1033528 141.017005,60.1033528 145.225487,55.8983314 C149.433969,51.69331 149.433969,44.8756232 145.225487,40.6706018 L108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z" id="Shape" fill="url(#linearGradient-1)"></path> + <path d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C100.999864,25.6271836 105.751642,20.541824 112.729652,19.3524487 C117.915585,18.4685261 123.585219,20.4140239 129.738554,25.1889424 C125.624663,21.0784292 118.571995,14.0340304 108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z" id="Shape" fill="url(#linearGradient-2)"></path> + </g> + <path d="M153.685633,135.854579 C157.894115,140.0596 164.717412,140.0596 168.925894,135.854579 L195.959977,108.842726 C200.659183,104.147384 200.659183,96.5636133 195.960527,91.8688194 L168.690777,64.7181159 C164.472332,60.5180858 157.646868,60.5241425 153.435895,64.7316526 C149.227413,68.936674 149.227413,75.7543607 153.435895,79.9593821 L171.854035,98.3623765 C173.02366,99.5310396 173.02366,101.304724 171.854035,102.473387 L153.685633,120.626849 C149.47715,124.83187 149.47715,131.649557 153.685633,135.854579 Z" id="Shape" fill="url(#linearGradient-3)"></path> + </g> + <ellipse id="Combined-Shape" fill="url(#linearGradient-4)" cx="100.519339" cy="100.436681" rx="23.6001926" ry="23.580786"></ellipse> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/AvatarList/Item.vue b/ant-design-jeecg-vue/src/components/AvatarList/Item.vue new file mode 100644 index 0000000..f794295 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/AvatarList/Item.vue @@ -0,0 +1,46 @@ +<template> + <tooltip v-if="tips !== ''"> + <template slot="title">{{ tips }}</template> + <avatar :size="avatarSize" :src="src" /> + </tooltip> + <avatar v-else :size="avatarSize" :src="src" /> +</template> + +<script> + import Avatar from 'ant-design-vue/es/avatar' + import Tooltip from 'ant-design-vue/es/tooltip' + + export default { + name: "AvatarItem", + components: { + Avatar, + Tooltip + }, + props: { + tips: { + type: String, + default: '', + required: false + }, + src: { + type: String, + default: '' + } + }, + data () { + return { + size: this.$parent.size + } + }, + computed: { + avatarSize () { + return this.size !== 'mini' && this.size || 20 + } + }, + watch: { + '$parent.size' (val) { + this.size = val + } + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/AvatarList/List.vue b/ant-design-jeecg-vue/src/components/AvatarList/List.vue new file mode 100644 index 0000000..fb3412c --- /dev/null +++ b/ant-design-jeecg-vue/src/components/AvatarList/List.vue @@ -0,0 +1,100 @@ +<!-- +<template> + <div :class="[prefixCls]"> + <ul> + <slot></slot> + <template v-for="item in filterEmpty($slots.default).slice(0, 3)"></template> + + + <template v-if="maxLength > 0 && filterEmpty($slots.default).length > maxLength"> + <avatar-item :size="size"> + <avatar :size="size !== 'mini' && size || 20" :style="excessItemsStyle">{{ `+${maxLength}` }}</avatar> + </avatar-item> + </template> + </ul> + </div> +</template> +--> + +<script> + import Avatar from 'ant-design-vue/es/avatar' + import AvatarItem from './Item' + import { filterEmpty } from '@/components/_util/util' + + export default { + AvatarItem, + name: "AvatarList", + components: { + Avatar, + AvatarItem + }, + props: { + prefixCls: { + type: String, + default: 'ant-pro-avatar-list' + }, + /** + * 头像大小 类型: large、small 、mini, default + * 默认值: default + */ + size: { + type: [String, Number], + default: 'default' + }, + /** + * 要显示的最大项目 + */ + maxLength: { + type: Number, + default: 0 + }, + /** + * 多余的项目风格 + */ + excessItemsStyle: { + type: Object, + default: () => { + return { + color: '#f56a00', + backgroundColor: '#fde3cf' + } + } + } + }, + data () { + return {} + }, + methods: { + getItems(items) { + const classString = { + [`${this.prefixCls}-item`]: true, + [`${this.size}`]: true + } + + if (this.maxLength > 0) { + items = items.slice(0, this.maxLength) + items.push((<Avatar size={ this.size } style={ this.excessItemsStyle }>{`+${this.maxLength}`}</Avatar>)) + } + const itemList = items.map((item) => ( + <li class={ classString }>{ item }</li> + )) + return itemList + } + }, + render () { + const { prefixCls, size } = this.$props + const classString = { + [`${prefixCls}`]: true, + [`${size}`]: true, + } + const items = filterEmpty(this.$slots.default) + const itemsDom = items && items.length ? <ul class={`${prefixCls}-items`}>{ this.getItems(items) }</ul> : null + + return ( + <div class={ classString }> + { itemsDom } + </div> + ) + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/AvatarList/index.js b/ant-design-jeecg-vue/src/components/AvatarList/index.js new file mode 100644 index 0000000..9621de6 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/AvatarList/index.js @@ -0,0 +1,4 @@ +import AvatarList from './List' +import "./index.less" + +export default AvatarList \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/AvatarList/index.less b/ant-design-jeecg-vue/src/components/AvatarList/index.less new file mode 100644 index 0000000..9ce073f --- /dev/null +++ b/ant-design-jeecg-vue/src/components/AvatarList/index.less @@ -0,0 +1,60 @@ +@import "../index"; + +@avatar-list-prefix-cls: ~"@{ant-pro-prefix}-avatar-list"; +@avatar-list-item-prefix-cls: ~"@{ant-pro-prefix}-avatar-list-item"; + +.@{avatar-list-prefix-cls} { + display: inline-block; + + ul { + list-style: none; + display: inline-block; + padding: 0; + margin: 0 0 0 8px; + font-size: 0; + } +} + +.@{avatar-list-item-prefix-cls} { + display: inline-block; + font-size: @font-size-base; + margin-left: -8px; + width: @avatar-size-base; + height: @avatar-size-base; + + :global { + .ant-avatar { + border: 1px solid #fff; + cursor: pointer; + } + } + + &.large { + width: @avatar-size-lg; + height: @avatar-size-lg; + } + + &.small { + width: @avatar-size-sm; + height: @avatar-size-sm; + } + + &.mini { + width: 20px; + height: 20px; + + :global { + .ant-avatar { + width: 20px; + height: 20px; + line-height: 20px; + + .ant-avatar-string { + font-size: 12px; + line-height: 18px; + } + } + } + } +} + diff --git a/ant-design-jeecg-vue/src/components/ChartCard.vue b/ant-design-jeecg-vue/src/components/ChartCard.vue new file mode 100644 index 0000000..8acb150 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/ChartCard.vue @@ -0,0 +1,111 @@ +<template> + <a-card :loading="loading" :body-style="{ padding: '20px 24px 8px' }" :bordered="false"> + <div class="chart-card-header"> + <div class="meta"> + <span class="chart-card-title">{{ title }}</span> + <span class="chart-card-action"> + <slot name="action"></slot> + </span> + </div> + <div class="total"><span>{{ total }}</span></div> + </div> + <div class="chart-card-content"> + <div class="content-fix"> + <slot></slot> + </div> + </div> + <div class="chart-card-footer"> + <div class="field"> + <slot name="footer"></slot> + </div> + </div> + </a-card> +</template> + +<script> + export default { + name: "ChartCard", + props: { + title: { + type: String, + default: '' + }, + total: { + type: String, + default: '' + }, + loading: { + type: Boolean, + default: false + } + } + } +</script> + +<style lang="scss" scoped> + .chart-card-header { + position: relative; + overflow: hidden; + width: 100%; + + .meta { + position: relative; + overflow: hidden; + width: 100%; + color: rgba(0, 0, 0, .45); + font-size: 14px; + line-height: 22px; + } + } + + .chart-card-action { + cursor: pointer; + position: absolute; + top: 0; + right: 0; + } + + .chart-card-footer { + border-top: 1px solid #e8e8e8; + padding-top: 9px; + margin-top: 8px; + + > * { + position: relative; + } + + .field { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 0; + } + } + + .chart-card-content { + margin-bottom: 12px; + position: relative; + height: 46px; + width: 100%; + + .content-fix { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + } + } + + .total { + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + white-space: nowrap; + color: #000; + margin-top: 4px; + margin-bottom: 0; + font-size: 30px; + line-height: 38px; + height: 38px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/CountDown/CountDown.vue b/ant-design-jeecg-vue/src/components/CountDown/CountDown.vue new file mode 100644 index 0000000..91cf47e --- /dev/null +++ b/ant-design-jeecg-vue/src/components/CountDown/CountDown.vue @@ -0,0 +1,103 @@ +<template> + <span> + {{ lastTime | format }} + </span> +</template> + +<script> + + function fixedZero(val) { + return val * 1 < 10 ? `0${val}` : val; + } + + export default { + name: "CountDown", + props: { + format: { + type: Function, + default: undefined + }, + target: { + type: [Date, Number], + required: true, + }, + onEnd: { + type: Function, + default: () => { + } + } + }, + data() { + return { + dateTime: '0', + originTargetTime: 0, + lastTime: 0, + timer: 0, + interval: 1000 + } + }, + filters: { + format(time) { + const hours = 60 * 60 * 1000; + const minutes = 60 * 1000; + + const h = Math.floor(time / hours); + const m = Math.floor((time - h * hours) / minutes); + const s = Math.floor((time - h * hours - m * minutes) / 1000); + return `${fixedZero(h)}:${fixedZero(m)}:${fixedZero(s)}` + } + }, + created() { + this.initTime() + this.tick() + }, + methods: { + initTime() { + let lastTime = 0; + let targetTime = 0; + this.originTargetTime = this.target + try { + if (Object.prototype.toString.call(this.target) === '[object Date]') { + targetTime = this.target + } else { + targetTime = new Date(this.target).getTime() + } + } catch (e) { + throw new Error('invalid target prop') + } + + lastTime = targetTime - new Date().getTime(); + + this.lastTime = lastTime < 0 ? 0 : lastTime + }, + tick() { + const {onEnd} = this + + this.timer = setTimeout(() => { + if (this.lastTime < this.interval) { + clearTimeout(this.timer) + this.lastTime = 0 + if (typeof onEnd === 'function') { + onEnd(); + } + } else { + this.lastTime -= this.interval + this.tick() + } + }, this.interval) + } + }, + beforeUpdate () { + if (this.originTargetTime !== this.target) { + this.initTime() + } + }, + beforeDestroy() { + clearTimeout(this.timer) + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/CountDown/index.js b/ant-design-jeecg-vue/src/components/CountDown/index.js new file mode 100644 index 0000000..3015cc5 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/CountDown/index.js @@ -0,0 +1,3 @@ +import CountDown from './CountDown' + +export default CountDown \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/Ellipsis/Ellipsis.vue b/ant-design-jeecg-vue/src/components/Ellipsis/Ellipsis.vue new file mode 100644 index 0000000..5fb14c2 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/Ellipsis/Ellipsis.vue @@ -0,0 +1,63 @@ +<script> + import Tooltip from 'ant-design-vue/es/tooltip' + import { cutStrByFullLength, getStrFullLength } from '@/components/_util/StringUtil' +/* + const isSupportLineClamp = document.body.style.webkitLineClamp !== undefined; + + const TooltipOverlayStyle = { + overflowWrap: 'break-word', + wordWrap: 'break-word', + }; +*/ + + export default { + name: 'Ellipsis', + components: { + Tooltip + }, + props: { + prefixCls: { + type: String, + default: 'ant-pro-ellipsis' + }, + tooltip: { + type: Boolean + }, + length: { + type: Number, + required: true + }, + lines: { + type: Number, + default: 1 + }, + fullWidthRecognition: { + type: Boolean, + default: false + } + }, + methods: { + getStrDom (str) { + return ( + <span>{ cutStrByFullLength(str, this.length) + '...' }</span> + ) + }, + getTooltip ( fullStr) { + return ( + <Tooltip> + <template slot="title">{ fullStr }</template> + { this.getStrDom(fullStr) } + </Tooltip> + ) + } + }, + render () { + const { tooltip, length } = this.$props + let str = this.$slots.default.map(vNode => vNode.text).join("") + const strDom = tooltip && getStrFullLength(str) > length ? this.getTooltip(str) : this.getStrDom(str); + return ( + strDom + ) + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/Ellipsis/index.js b/ant-design-jeecg-vue/src/components/Ellipsis/index.js new file mode 100644 index 0000000..d257156 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/Ellipsis/index.js @@ -0,0 +1,3 @@ +import Ellipsis from './Ellipsis' + +export default Ellipsis \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/NumberInfo/NumberInfo.vue b/ant-design-jeecg-vue/src/components/NumberInfo/NumberInfo.vue new file mode 100644 index 0000000..8150878 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/NumberInfo/NumberInfo.vue @@ -0,0 +1,54 @@ +<template> + <div :class="[prefixCls]"> + <slot name="subtitle"> + <div :class="[`${prefixCls}-subtitle`]">{{ typeof subTitle === 'string' ? subTitle : subTitle() }}</div> + </slot> + <div class="number-info-value"> + <span>{{ total }}</span> + <span class="sub-total"> + {{ subTotal }} + <icon :type="`caret-${status}`" /> + </span> + </div> + </div> +</template> + +<script> + import Icon from 'ant-design-vue/es/icon' + + export default { + name: 'NumberInfo', + props: { + prefixCls: { + type: String, + default: 'ant-pro-number-info' + }, + total: { + type: Number, + required: true + }, + subTotal: { + type: Number, + required: true + }, + subTitle: { + type: [String, Function], + default: '' + }, + status: { + type: String, + default: 'up' + } + }, + components: { + Icon + }, + data () { + return {} + } + } +</script> + +<style lang="less" scoped> + @import "index"; +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/NumberInfo/index.js b/ant-design-jeecg-vue/src/components/NumberInfo/index.js new file mode 100644 index 0000000..a471501 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/NumberInfo/index.js @@ -0,0 +1,3 @@ +import NumberInfo from './NumberInfo' + +export default NumberInfo \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/NumberInfo/index.less b/ant-design-jeecg-vue/src/components/NumberInfo/index.less new file mode 100644 index 0000000..719113d --- /dev/null +++ b/ant-design-jeecg-vue/src/components/NumberInfo/index.less @@ -0,0 +1,55 @@ +@import "../index"; + +@numberInfo-prefix-cls: ~"@{ant-pro-prefix}-number-info"; + +.@{numberInfo-prefix-cls} { + + .ant-pro-number-info-subtitle { + color: @text-color-secondary; + font-size: @font-size-base; + height: 22px; + line-height: 22px; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + white-space: nowrap; + } + + .number-info-value { + margin-top: 4px; + font-size: 0; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + white-space: nowrap; + + & > span { + color: @heading-color; + display: inline-block; + line-height: 32px; + height: 32px; + font-size: 24px; + margin-right: 32px; + } + + .sub-total { + color: @text-color-secondary; + font-size: @font-size-lg; + vertical-align: top; + margin-right: 0; + i { + font-size: 12px; + transform: scale(0.82); + margin-left: 4px; + } + :global { + .anticon-caret-up { + color: @red-6; + } + .anticon-caret-down { + color: @green-6; + } + } + } + } +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/Trend/Trend.vue b/ant-design-jeecg-vue/src/components/Trend/Trend.vue new file mode 100644 index 0000000..4cc8853 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/Trend/Trend.vue @@ -0,0 +1,41 @@ +<template> + <div :class="[prefixCls, reverseColor && 'reverse-color' ]"> + <span> + <slot name="term"></slot> + <span class="item-text"> + <slot></slot> + </span> + </span> + <span :class="[flag]"><a-icon :type="`caret-${flag}`"/></span> + </div> +</template> + +<script> + export default { + name: "Trend", + props: { + prefixCls: { + type: String, + default: 'ant-pro-trend' + }, + /** + * 上升下降标识:up|down + */ + flag: { + type: String, + required: true + }, + /** + * 颜色反转 + */ + reverseColor: { + type: Boolean, + default: false + } + } + } +</script> + +<style lang="less" scoped> + @import "index"; +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/Trend/index.js b/ant-design-jeecg-vue/src/components/Trend/index.js new file mode 100644 index 0000000..761366d --- /dev/null +++ b/ant-design-jeecg-vue/src/components/Trend/index.js @@ -0,0 +1,3 @@ +import Trend from './Trend.vue' + +export default Trend \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/Trend/index.less b/ant-design-jeecg-vue/src/components/Trend/index.less new file mode 100644 index 0000000..8a3d24c --- /dev/null +++ b/ant-design-jeecg-vue/src/components/Trend/index.less @@ -0,0 +1,42 @@ +@import "../index"; + +@trend-prefix-cls: ~"@{ant-pro-prefix}-trend"; + +.@{trend-prefix-cls} { + display: inline-block; + font-size: @font-size-base; + line-height: 22px; + + .up, + .down { + margin-left: 4px; + position: relative; + top: 1px; + + i { + font-size: 12px; + transform: scale(0.83); + } + } + + .item-text { + display: inline-block; + margin-left: 8px; + color: rgba(0,0,0,.85); + } + + .up { + color: @red-6; + } + .down { + color: @green-6; + top: -1px; + } + + &.reverse-color .up { + color: @green-6; + } + &.reverse-color .down { + color: @red-6; + } +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/_util/StringUtil.js b/ant-design-jeecg-vue/src/components/_util/StringUtil.js new file mode 100644 index 0000000..29aed19 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/_util/StringUtil.js @@ -0,0 +1,25 @@ + +export const getStrFullLength = (str = '') => + str.split('').reduce((pre, cur) => { + const charCode = cur.charCodeAt(0) + if (charCode >= 0 && charCode <= 128) { + return pre + 1 + } + return pre + 2 + }, 0) + +export const cutStrByFullLength = (str = '', maxLength) => { + let showLength = 0 + return str.split('').reduce((pre, cur) => { + const charCode = cur.charCodeAt(0) + if (charCode >= 0 && charCode <= 128) { + showLength += 1 + } else { + showLength += 2 + } + if (showLength <= maxLength) { + return pre + cur + } + return pre + }, '') +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/_util/util.js b/ant-design-jeecg-vue/src/components/_util/util.js new file mode 100644 index 0000000..98752a9 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/_util/util.js @@ -0,0 +1,12 @@ +/** + * components util + */ + +/** + * 清理空值,对象 + * @param children + * @returns {*[]} + */ +export function filterEmpty (children = []) { + return children.filter(c => c.tag || (c.text && c.text.trim() !== '')) +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/Bar.vue b/ant-design-jeecg-vue/src/components/chart/Bar.vue new file mode 100644 index 0000000..0a103c6 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/Bar.vue @@ -0,0 +1,57 @@ +<template> + <div :style="{ padding: '0 0 32px 32px' }"> + <h4 :style="{ marginBottom: '20px' }">{{ title }}</h4> + <v-chart + height="254" + :data="data" + :forceFit="true" + :padding="['auto', 'auto', '40', '50']"> + <v-tooltip /> + <v-axis /> + <v-bar position="x*y"/> + </v-chart> + </div> +</template> + +<script> + const data = [] + for (let i = 0; i < 12; i += 1) { + data.push({ + x: `${i + 1}月`, + y: Math.floor(Math.random() * 1000) + 200 + }) + } + const tooltip = [ + 'x*y', + (x, y) => ({ + name: x, + value: y + }) + ] + const scale = [{ + dataKey: 'x', + min: 2 + }, { + dataKey: 'y', + title: '时间', + min: 1, + max: 22 + }] + + export default { + name: "Bar", + props: { + title: { + type: String, + default: '' + } + }, + data () { + return { + data, + scale, + tooltip + } + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/Liquid.vue b/ant-design-jeecg-vue/src/components/chart/Liquid.vue new file mode 100644 index 0000000..fdf58ee --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/Liquid.vue @@ -0,0 +1,67 @@ +<template> + <div> + <v-chart + :forceFit="true" + :height="height" + :width="width" + :data="data" + :scale="scale" + :padding="0"> + <v-tooltip /> + <v-interval + :shape="['liquid-fill-gauge']" + position="transfer*value" + color="" + :v-style="{ + lineWidth: 10, + opacity: 0.75 + }" + :tooltip="[ + 'transfer*value', + (transfer, value) => { + return { + name: transfer, + value, + }; + }, + ]" + ></v-interval> + <v-guide + v-for="(row, index) in data" + :key="index" + type="text" + :top="true" + :position="{ + gender: row.transfer, + value: 45 + }" + :content="row.value + '%'" + :v-style="{ + fontSize: 100, + textAlign: 'center', + opacity: 0.75, + }" + /> + </v-chart> + </div> +</template> + +<script> + export default { + name: "Liquid", + props: { + height: { + type: Number, + default: 0 + }, + width: { + type: Number, + default: 0 + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/MiniArea.vue b/ant-design-jeecg-vue/src/components/chart/MiniArea.vue new file mode 100644 index 0000000..0f526ee --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/MiniArea.vue @@ -0,0 +1,67 @@ +<template> + <div class="antv-chart-mini"> + <div class="chart-wrapper" :style="{ height: 46 }"> + <v-chart :force-fit="true" :height="height" :data="datasource" :padding="[36, 0, 18, 0]"> + <v-tooltip /> + <v-smooth-area position="x*y" /> + </v-chart> + </div> + </div> +</template> + +<script> + import moment from 'dayjs' + const data = [] + const beginDay = new Date().getTime() + + for (let i = 0; i < 10; i++) { + data.push({ + x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'), + y: Math.round(Math.random() * 10) + }) + } + + console.log("123321",data) + const tooltip = [ + 'x*y', + (x, y) => ({ + name: x, + value: y + }) + ] + const scale = [{ + dataKey: 'x', + min: 2 + }, { + dataKey: 'y', + title: '时间', + min: 1, + max: 22 + }] + + export default { + name: "MiniArea", + props:{ + datasource:{ + type: Array, + default:()=>[] + } + }, + created(){ + if(this.datasource.length==0){ + this.datasource = data; + } + }, + data () { + return { + tooltip, + scale, + height: 100 + } + } + } +</script> + +<style lang="scss" scoped> + @import "chart"; +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/MiniBar.vue b/ant-design-jeecg-vue/src/components/chart/MiniBar.vue new file mode 100644 index 0000000..6fe8582 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/MiniBar.vue @@ -0,0 +1,68 @@ +<template> + <div class="antv-chart-mini"> + <div class="chart-wrapper" :style="{ height: 46 }"> + <v-chart :force-fit="true" :height="height" :data="datasource" :padding="[36, 5, 18, 5]"> + <v-tooltip /> + <v-bar position="x*y" /> + </v-chart> + </div> + </div> +</template> + +<script> + import moment from 'dayjs' + const data = [] + const beginDay = new Date().getTime() + + for (let i = 0; i < 10; i++) { + data.push({ + x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'), + y: Math.round(Math.random() * 10) + }) + } + + const tooltip = [ + 'x*y', + (x, y) => ({ + name: x, + value: y + }) + ] + + const scale = [{ + dataKey: 'x', + min: 2 + }, { + dataKey: 'y', + title: '时间', + min: 1, + max: 30 + }] + + export default { + name: "MiniBar", + props:{ + datasource:{ + type: Array, + default:()=>[] + } + }, + created(){ + if(this.datasource.length==0){ + this.datasource = data; + } + }, + data () { + return { + data, + tooltip, + scale, + height: 100 + } + } + } +</script> + +<style lang="scss" scoped> + @import "chart"; +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/MiniProgress.vue b/ant-design-jeecg-vue/src/components/chart/MiniProgress.vue new file mode 100644 index 0000000..c761982 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/MiniProgress.vue @@ -0,0 +1,75 @@ +<template> + <div class="chart-mini-progress"> + <div class="target" :style="{ left: target + '%'}"> + <span :style="{ backgroundColor: color }" /> + <span :style="{ backgroundColor: color }"/> + </div> + <div class="progress-wrapper"> + <div class="progress" :style="{ backgroundColor: color, width: percentage + '%', height: height }"></div> + </div> + </div> +</template> + +<script> + export default { + name: "MiniProgress", + props: { + target: { + type: Number, + default: 0 + }, + height: { + type: String, + default: '10px' + }, + color: { + type: String, + default: '#13C2C2' + }, + percentage: { + type: Number, + default: 0 + } + } + } +</script> + +<style lang="scss" scoped> + .chart-mini-progress { + padding: 5px 0; + position: relative; + width: 100%; + + .target { + position: absolute; + top: 0; + bottom: 0; + + span { + border-radius: 100px; + position: absolute; + top: 0; + left: 0; + height: 4px; + width: 2px; + + &:last-child { + top: auto; + bottom: 0; + } + } + } + .progress-wrapper { + background-color: #f5f5f5; + position: relative; + + .progress { + transition: all .4s cubic-bezier(.08,.82,.17,1) 0s; + border-radius: 1px 0 0 1px; + background-color: #1890ff; + width: 0; + height: 100%; + } + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/Radar.vue b/ant-design-jeecg-vue/src/components/chart/Radar.vue new file mode 100644 index 0000000..0875262 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/Radar.vue @@ -0,0 +1,68 @@ +<template> + <v-chart :forceFit="true" height="400" :data="data" :padding="[20, 20, 95, 20]" :scale="scale"> + <v-tooltip></v-tooltip> + <v-axis :dataKey="axis1Opts.dataKey" :line="axis1Opts.line" :tickLine="axis1Opts.tickLine" :grid="axis1Opts.grid" /> + <v-axis :dataKey="axis2Opts.dataKey" :line="axis2Opts.line" :tickLine="axis2Opts.tickLine" :grid="axis2Opts.grid" /> + <v-legend dataKey="user" marker="circle" :offset="30" /> + <v-coord type="polar" radius="0.8" /> + <v-line position="item*score" color="user" :size="2" /> + <v-point position="item*score" color="user" :size="4" shape="circle" /> + </v-chart> +</template> + +<script> + const axis1Opts = { + dataKey: 'item', + line: null, + tickLine: null, + grid: { + lineStyle: { + lineDash: null + }, + hideFirstLine: false + } + } + const axis2Opts = { + dataKey: 'score', + line: null, + tickLine: null, + grid: { + type: 'polygon', + lineStyle: { + lineDash: null + } + } + } + + const scale = [ + { + dataKey: 'score', + min: 0, + max: 80 + }, { + dataKey: 'user', + alias: '类型' + } + ] + + export default { + name: 'Radar', + props: { + data: { + type: Array, + default: null, + } + }, + data () { + return { + axis1Opts, + axis2Opts, + scale + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/RankList.vue b/ant-design-jeecg-vue/src/components/chart/RankList.vue new file mode 100644 index 0000000..d6744ae --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/RankList.vue @@ -0,0 +1,77 @@ +<template> + <div class="rank"> + <h4 class="title">{{ title }}</h4> + <ul class="list"> + <li :key="index" v-for="(item, index) in list"> + <span :class="index < 3 ? 'active' : null">{{ index + 1 }}</span> + <span>{{ item.name }}</span> + <span>{{ item.total }}</span> + </li> + </ul> + </div> +</template> + +<script> + export default { + name: "RankList", + // ['title', 'list'] + props: { + title: { + type: String, + default: '' + }, + list: { + type: Array, + default: null + } + } + } +</script> + +<style lang="scss" scoped> + + .rank { + padding: 0 32px 32px 72px; + + .list { + margin: 25px 0 0; + padding: 0; + list-style: none; + + li { + margin-top: 16px; + + span { + color: rgba(0, 0, 0, .65); + font-size: 14px; + line-height: 22px; + + &:first-child { + background-color: #f5f5f5; + border-radius: 20px; + display: inline-block; + font-size: 12px; + font-weight: 600; + margin-right: 24px; + height: 20px; + line-height: 20px; + width: 20px; + text-align: center; + } + &.active { + background-color: #314659; + color: #fff; + } + &:last-child { + float: right; + } + } + } + } + } + + .mobile .rank { + padding: 0 32px 32px 32px; + } + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/TransferBar.vue b/ant-design-jeecg-vue/src/components/chart/TransferBar.vue new file mode 100644 index 0000000..33e178a --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/TransferBar.vue @@ -0,0 +1,64 @@ +<template> + <div :style="{ padding: '0 0 32px 32px' }"> + <h4 :style="{ marginBottom: '20px' }">{{ title }}</h4> + <v-chart + height="254" + :data="data" + :scale="scale" + :forceFit="true" + :padding="['auto', 'auto', '40', '50']"> + <v-tooltip /> + <v-axis /> + <v-bar position="x*y"/> + </v-chart> + </div> +</template> + +<script> + const tooltip = [ + 'x*y', + (x, y) => ({ + name: x, + value: y + }) + ] + const scale = [{ + dataKey: 'x', + title: '日期(天)', + alias: '日期(天)', + min: 2 + }, { + dataKey: 'y', + title: '流量(Gb)', + alias: '流量(Gb)', + min: 1 + }] + + export default { + name: "Bar", + props: { + title: { + type: String, + default: '' + } + }, + data () { + return { + data: [], + scale, + tooltip + } + }, + created () { + this.getMonthBar() + }, + methods: { + getMonthBar() { + this.$http.get('/analysis/month-bar') + .then(res => { + this.data = res.result + }) + } + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/Trend.vue b/ant-design-jeecg-vue/src/components/chart/Trend.vue new file mode 100644 index 0000000..ca8f591 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/Trend.vue @@ -0,0 +1,82 @@ +<template> + <div class="chart-trend"> + {{ term }} + <span>{{ rate }}%</span> + <span :class="['trend-icon', trend]"><a-icon :type="'caret-' + trend"/></span> + </div> +</template> + +<script> + export default { + name: "Trend", + props: { + term: { + type: String, + default: '', + required: true + }, + percentage: { + type: Number, + default: null + }, + type: { + type: Boolean, + default: null + }, + target: { + type: Number, + default: 0 + }, + value: { + type: Number, + default: 0 + }, + fixed: { + type: Number, + default: 2 + } + }, + data () { + return { + trend: this.type && 'up' || 'down', + rate: this.percentage + } + }, + created () { + let type = this.type === null ? this.value >= this.target : this.type + this.trend = type ? 'up' : 'down'; + this.rate = (this.percentage === null ? Math.abs(this.value - this.target) * 100 / this.target : this.percentage).toFixed(this.fixed) + } + } +</script> + +<style lang="scss" scoped> + .chart-trend { + display: inline-block; + font-size: 14px; + line-height: 22px; + + .trend-icon { + font-size: 12px; + + &.up, &.down { + margin-left: 4px; + position: relative; + top: 1px; + + i { + font-size: 12px; + transform: scale(.83); + } + } + + &.up { + color: #f5222d; + } + &.down { + color: #52c41a; + top: -1px; + } + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/chart.scss b/ant-design-jeecg-vue/src/components/chart/chart.scss new file mode 100644 index 0000000..e04fa09 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/chart.scss @@ -0,0 +1,13 @@ +.antv-chart-mini { + position: relative; + width: 100%; + + .chart-wrapper { + position: absolute; + bottom: -28px; + width: 100%; + +/* margin: 0 -5px; + overflow: hidden;*/ + } +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/dict/DictSelectTag.vue b/ant-design-jeecg-vue/src/components/dict/DictSelectTag.vue new file mode 100644 index 0000000..e501254 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/dict/DictSelectTag.vue @@ -0,0 +1,47 @@ +<template> + <a-select :placeholder="placeholder" :value="value" @change="handleInput"> + <a-select-option value="">请选择</a-select-option> + <a-select-option v-for="(item, key) in dictOptions" :key="key" :value="item.value">{{ item.text }}</a-select-option> + </a-select> +</template> + +<script> + import {ajaxGetDictItems} from '@/api/api' + + export default { + name: "DictSelectTag", + props: { + dictCode: String, + placeholder: String, + value: String,// 1.接收一个 value prop + }, + data() { + return { + dictOptions: [], + } + }, + created() { + console.log(this.dictCode); + //获取字典数据 + this.initDictData(); + }, + methods: { + initDictData() { + //根据字典Code, 初始化字典数组 + ajaxGetDictItems(this.dictCode, null).then((res) => { + if (res.success) { +// console.log(res.result); + this.dictOptions = res.result; + } + }) + }, + handleInput(val) { + console.log(val); + this.$emit('input', val); // 2.触发 input 事件,并传入新值 + } + } + } +</script> + +<style scoped> +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/dict/DictSelectUtil.js b/ant-design-jeecg-vue/src/components/dict/DictSelectUtil.js new file mode 100644 index 0000000..e7d0338 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/dict/DictSelectUtil.js @@ -0,0 +1,61 @@ +/** + * 字典 util + * author: scott + * date: 20190109 + */ + +import {ajaxGetDictItems} from '@/api/api' +import {getAction} from '@/api/manage' + +/** + * 获取字典数组 + * @param dictCode 字典Code + * @return List<Map> + */ +export async function initDictOptions(dictCode) { + if (!dictCode) { + return '字典Code不能为空!'; + } + //获取字典数组 + let res = await ajaxGetDictItems(dictCode); + return res; +} + +/** + * 字典值替换文本通用方法 + * @param dictOptions 字典数组 + * @param text 字典值 + * @return String + */ +export function filterDictText(dictOptions, text) { + let re = ""; + dictOptions.forEach(function (option) { + if (text === option.value) { + re = option.text; + } + }); + return re; +} + +/** + * 翻译字段值对应的文本 + * @param children + * @returns string + */ +export async function ajaxFilterDictText(dictCode, key) { + if (!dictCode) { + return '字典Code不能为空!'; + } + //console.log(`key : ${key}`); + if (!key) { + return ''; + } + //通过请求读取字典文本 + let res = await getAction(`/sys/dict/getDictText/${dictCode}/${key}`); + if (res.success) { + // console.log('restult: '+ res.result); + return res.result; + } else { + return ''; + } +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/dict/README.md b/ant-design-jeecg-vue/src/components/dict/README.md new file mode 100644 index 0000000..fca4d57 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/dict/README.md @@ -0,0 +1,36 @@ +DictSelectTag 组件说明 +=== + +例子 +---- +<DictSelectTag v-model="queryParam.sex" placeholder="请输入用户性别" dictCode="sex"/> + + + +DictSelectUtil.js 列表字典函数用法说明 +=== + +例子 +---- + +第一步: 引入依赖方法 + import {initDictOptions, filterDictText} from '@/components/dict/DictSelectUtil' + +第二步: 在created()初始化方法执行字典配置方法 + //初始化字典配置 + this.initDictConfig(); +第三步: 实现initDictConfig方法,加载列表所需要的字典(列表上有多个字典项,就执行多次initDictOptions方法) + //sexDictOptions 自行定义 + initDictConfig() { + //初始化字典 - 性别 + initDictOptions('sex').then((res) => { + if (res.success) { + this.sexDictOptions = res.result; + } + }); + }, +第四步:实现字段的customRender方法 + customRender: (text, record, index) => { + //字典值替换通用方法 + return filterDictText(this.sexDictOptions, text); + } \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/dict/UserInfoTag.vue b/ant-design-jeecg-vue/src/components/dict/UserInfoTag.vue new file mode 100644 index 0000000..867e559 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/dict/UserInfoTag.vue @@ -0,0 +1,22 @@ +<template> + <span> + <!--// 1、当有数据输入时触发了该组件的input事件--> + <!--<input type="text" :value="value" @input="updateVal($event.target.value)">--> + <a-input :placeholder="placeholder" :value="value" @input="updateVal($event.target.value)"></a-input> + </span> +</template> + +<script> + export default { + props: { + value: String, + placeholder: String + }, + methods: { + updateVal: function(val) { + // 2、手动触发父组件的input事件并将值传给父组件 + this.$emit('input', val); + } + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/dict/index.js b/ant-design-jeecg-vue/src/components/dict/index.js new file mode 100644 index 0000000..8bb2a95 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/dict/index.js @@ -0,0 +1,7 @@ +import T from './DictSelectTag.vue' +const DictSelectTag = { + install: function (Vue) { + Vue.component('DictSelectTag',T); + } +} +export default DictSelectTag; \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/index.less b/ant-design-jeecg-vue/src/components/index.less new file mode 100644 index 0000000..d8c97bb --- /dev/null +++ b/ant-design-jeecg-vue/src/components/index.less @@ -0,0 +1,4 @@ +@import "~ant-design-vue/lib/style/index"; + +// The prefix to use on all css classes from ant-pro. +@ant-pro-prefix : ant-pro; \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/jeecg/JDate.vue b/ant-design-jeecg-vue/src/components/jeecg/JDate.vue new file mode 100644 index 0000000..ed64d16 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecg/JDate.vue @@ -0,0 +1,74 @@ +<template> + <a-date-picker + :disabled="readOnly" + :placeholder="placeholder" + @change="handleDateChange" + :value="momVal" + :showTime="showTime" + :format="dateFormat" + /> +</template> +<script> + import moment from 'moment' + export default { + name: 'JDate', + props: { + placeholder:{ + type: String, + default: '', + required: false + }, + value:{ + type: String, + default: '', + required: false + }, + dateFormat:{ + type: String, + default: 'YYYY-MM-DD', + required: false + }, + triggerChange:{ + type: Boolean, + required: false, + default: false + }, + readOnly:{ + type: Boolean, + required: false, + default: false + }, + showTime:{ + type: Boolean, + required: false, + default: false + } + }, + data () { + let dateStr = this.value; + return { + decorator:"", + momVal:!dateStr?null:moment(dateStr,this.dateFormat) + } + }, + watch: { + value (val) { + if(!val){ + this.momVal = null + }else{ + this.momVal = moment(val,this.dateFormat) + } + } + }, + methods: { + moment, + handleDateChange(mom,dateStr){ + if(this.triggerChange){ + this.$emit('change', dateStr); + }else{ + this.$emit('input', dateStr); + } + } + } + } +</script> diff --git a/ant-design-jeecg-vue/src/components/jeecg/README.md b/ant-design-jeecg-vue/src/components/jeecg/README.md new file mode 100644 index 0000000..0c1e344 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecg/README.md @@ -0,0 +1,43 @@ +日期组件 +说明:antd-vue日期组件需要用moment中转一下,用起来不是很方便,特二次封装,使用时只需要传字符串即可 +==== + +参数说明 +---- +placeholder:placeholder +readOnly:true/false +value:绑定v-model或是v-decorator后不需要设置 +showTime:是否展示时间true/false +dateFormat:日期格式 默认'YYYY-MM-DD' 若showTime设置为true则需要将其设置成对应的时间格式(如:YYYY-MM-DD HH:mm:ss) +triggerChange:触发组件值改变的事件是否是change,当使用v-decorator时且没有设置decorator的option.trigger为input需要设置该值为true + +使用示例 +---- +1.组件带有v-model的使用方法 +<j-date v-model="dateStr"></j-date> + +2.组件带有v-decorator的使用方法 + a).设置trigger-change属性为true + <j-date :trigger-change="true" v-decorator="['dateStr',{}]"></j-date> + b).设置decorator的option.trigger为input + <j-date v-decorator="['dateStr',{trigger:'input'}]"></j-date> + +3.其他使用 +添加style + <j-date v-model="dateStr" style="width:100%"></j-date> +添加placeholder + <j-date v-model="dateStr" placeholder="请输入dateStr"></j-date> +添加readOnly + <j-date v-model="dateStr" :read-only="true"></j-date> + +备注: +script内需引入jdate +<script> + import JDate from '@/components/jeecg/JDate' + export default { + name: "demo", + components: { + JDate + }, +.... +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/layouts/BasicLayout.vue b/ant-design-jeecg-vue/src/components/layouts/BasicLayout.vue new file mode 100644 index 0000000..48b3fc5 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/layouts/BasicLayout.vue @@ -0,0 +1,60 @@ +<template> + <global-layout> + <transition name="page-transition"> + <keep-alive v-if="keepAlive"> + <router-view /> + </keep-alive> + <router-view v-else /> + </transition> + </global-layout> +</template> + +<script> + import GlobalLayout from '@/components/page/GlobalLayout' + + export default { + name: "BasicLayout", + components: { + GlobalLayout + }, + data () { + return { + + } + }, + computed: { + keepAlive () { + return this.$route.meta.keepAlive + } + }, + methods: { + + }, + } +</script> + +<style lang="scss"> + + /* + * The following styles are auto-applied to elements with + * transition="page-transition" when their visibility is toggled + * by Vue.js. + * + * You can easily play with the page transition by editing + * these styles. + */ + + .page-transition-enter { + opacity: 0; + } + + .page-transition-leave-active { + opacity: 0; + } + + .page-transition-enter .page-transition-container, + .page-transition-leave-active .page-transition-container { + -webkit-transform: scale(1.1); + transform: scale(1.1); + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/layouts/BlankLayout.vue b/ant-design-jeecg-vue/src/components/layouts/BlankLayout.vue new file mode 100644 index 0000000..90c0399 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/layouts/BlankLayout.vue @@ -0,0 +1,16 @@ +<template> + <div> + <router-view /> + </div> +</template> + +<script> + + export default { + name: "BlankLayout", + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/layouts/IframePageView.vue b/ant-design-jeecg-vue/src/components/layouts/IframePageView.vue new file mode 100644 index 0000000..89908f6 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/layouts/IframePageView.vue @@ -0,0 +1,47 @@ +<template> + + <iframe :id="id" :src="url" frameborder="0" width="100%" height="800px" scrolling="auto"></iframe> + +</template> + +<script> + import PageLayout from '../page/PageLayout' + import RouteView from './RouteView' + + export default { + name: "IframePageContent", + data () { + return { + url: "", + id:"" + } + }, + created () { + this.goUrl() + }, + updated () { + this.goUrl() + }, + watch: { + $route(to, from) { + this.goUrl(); + } + }, + methods: { + goUrl () { + let url = this.$route.meta.url + let id = this.$route.path + this.id = id + //url = "http://www.baidu.com" + console.log("------url------"+url) + if (url !== null && url !== undefined) { + this.url = url; + //window.open(this.url); + } + } + } + } +</script> + +<style> +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/layouts/PageView.vue b/ant-design-jeecg-vue/src/components/layouts/PageView.vue new file mode 100644 index 0000000..dc3ae08 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/layouts/PageView.vue @@ -0,0 +1,85 @@ +<template> + <page-layout :desc="description" :title="getTitle" :link-list="linkList" :search="search" :tabs="tabs"> + <div slot="extra" class="extra-img"> + <img :src="extraImage"/> + </div> + <!-- keep-alive --> + <route-view ref="content"></route-view> + </page-layout> +</template> + +<script> + import PageLayout from '../page/PageLayout' + import RouteView from './RouteView' + + export default { + name: "PageContent", + components: { + RouteView, + PageLayout + }, + data () { + return { + title: '', + description: '', + linkList: [], + extraImage: '', + search: false, + tabs: {} + } + }, + mounted () { + this.getPageHeaderInfo() + }, + updated () { + this.getPageHeaderInfo() + }, + computed: { + + getTitle () { + return this.$route.meta.title + } + + }, + methods: { + getPageHeaderInfo () { + // eslint-disable-next-line + this.title = this.$route.meta.title + // 因为套用了一层 route-view 所以要取 ref 对象下的子节点的第一个对象 + const content = this.$refs.content && this.$refs.content.$children[0] + + if (content) { + this.description = content.description + this.linkList = content.linkList + this.extraImage = content.extraImage + this.search = content.search == true ? true : false + this.tabs = content.tabs + } + } + } + } +</script> + +<style lang="scss" scoped> + .extra-img { + margin-top: -60px; + text-align: center; + width: 195px; + + img { + width: 100%; + } + } + + .mobile { + .extra-img{ + margin-top: 0; + text-align: center; + width: 96px; + + img{ + width: 100%; + } + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/layouts/RouteView.vue b/ant-design-jeecg-vue/src/components/layouts/RouteView.vue new file mode 100644 index 0000000..6e99e63 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/layouts/RouteView.vue @@ -0,0 +1,17 @@ +<template> + <keep-alive v-if="keepAlive"> + <router-view /> + </keep-alive> + <router-view v-else /> +</template> + +<script> + export default { + name: "RouteView", + computed: { + keepAlive () { + return this.$route.meta.keepAlive + } + }, + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/layouts/TabLayout.vue b/ant-design-jeecg-vue/src/components/layouts/TabLayout.vue new file mode 100644 index 0000000..65c8e86 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/layouts/TabLayout.vue @@ -0,0 +1,213 @@ +<template> + <global-layout> + <contextmenu :itemList="menuItemList" :visible.sync="menuVisible" @select="onMenuSelect" /> + <a-tabs + @contextmenu.native="e => onContextmenu(e)" + v-if="multipage" + :active-key="activePage" + style="margin-top: -8px; margin-bottom: -10px" + :hide-add="true" + type="editable-card" + @change="changePage" + @edit="editPage"> + <a-tab-pane :id="page.fullPath" :key="page.fullPath" v-for="page in pageList"> + <span slot="tab" :pagekey="page.fullPath">{{ page.meta.title }}</span> + </a-tab-pane> + </a-tabs> + <transition name="page-toggle"> + <keep-alive v-if="multipage"> + <router-view /> + </keep-alive> + <router-view v-else /> + </transition> + </global-layout> +</template> + +<script> + import GlobalLayout from '@/components/page/GlobalLayout' + import Contextmenu from '@/components/menu/Contextmenu' + const indexKey="/dashboard/analysis" + export default { + name: "TabLayout", + components: { + GlobalLayout, + Contextmenu + }, + data () { + return { + pageList: [], + linkList: [], + activePage: '', + menuVisible: false, + menuItemList: [ + { key: '1', icon: 'arrow-left', text: '关闭左侧' }, + { key: '2', icon: 'arrow-right', text: '关闭右侧' }, + { key: '3', icon: 'close', text: '关闭其它' } + ] + } + }, + computed: { + multipage () { + return this.$store.state.app.multipage + } + }, + created () { + this.pageList.push(this.$route) + this.linkList.push(this.$route.fullPath) + this.activePage = this.$route.fullPath + }, + watch: { + '$route': function (newRoute) { + this.activePage = newRoute.fullPath + if (!this.multipage) { + this.linkList = [newRoute.fullPath] + this.pageList = [newRoute] + } else if (this.linkList.indexOf(newRoute.fullPath) < 0) { + this.linkList.push(newRoute.fullPath) + this.pageList.push(newRoute) + }else if(this.linkList.indexOf(newRoute.fullPath) >= 0){ + let oldIndex = this.linkList.indexOf(newRoute.fullPath); + this.pageList.splice(oldIndex,1,newRoute); + } + }, + 'activePage': function (key) { + let index = this.linkList.lastIndexOf(key); + var waitRouter = this.pageList[index]; + this.$router.push({ + path: waitRouter.path, + name: waitRouter.name, + params: waitRouter.params + }); + }, + 'multipage': function (newVal) { + if (!newVal) { + this.linkList = [this.$route.fullPath] + this.pageList = [this.$route] + } + } + }, + methods: { + changePage (key) { + this.activePage = key + }, + editPage (key, action) { + this[action](key) + }, + remove (key) { + if(key==indexKey){ + this.$message.warning('首页不能关闭!') + return + } + if (this.pageList.length === 1) { + this.$message.warning('这是最后一页,不能再关闭了啦') + return + } + this.pageList = this.pageList.filter(item => item.fullPath !== key) + let index = this.linkList.indexOf(key) + this.linkList = this.linkList.filter(item => item !== key) + index = index >= this.linkList.length ? this.linkList.length - 1 : index + this.activePage = this.linkList[index] + }, + onContextmenu (e) { + const pagekey = this.getPageKey(e.target) + if (pagekey !== null) { + e.preventDefault() + this.menuVisible = true + } + }, + getPageKey (target, depth) { + depth = depth || 0 + if (depth > 2) { + return null + } + let pageKey = target.getAttribute('pagekey') + pageKey = pageKey || (target.previousElementSibling ? target.previousElementSibling.getAttribute('pagekey') : null) + return pageKey || (target.firstElementChild ? this.getPageKey(target.firstElementChild, ++depth) : null) + }, + onMenuSelect (key, target) { + let pageKey = this.getPageKey(target) + switch (key) { + case '1': + this.closeLeft(pageKey) + break + case '2': + this.closeRight(pageKey) + break + case '3': + this.closeOthers(pageKey) + break + default: + break + } + }, + closeOthers (pageKey) { + let index = this.linkList.indexOf(pageKey) + if(pageKey==indexKey){ + this.linkList = this.linkList.slice(index, index + 1) + this.pageList = this.pageList.slice(index, index + 1) + this.activePage = this.linkList[0] + }else{ + let indexContent = this.pageList.slice(0,1)[0] + this.linkList = this.linkList.slice(index, index + 1) + this.pageList = this.pageList.slice(index, index + 1) + this.linkList.unshift(indexKey) + this.pageList.unshift(indexContent) + this.activePage = this.linkList[1] + } + }, + closeLeft (pageKey) { + if(pageKey==indexKey){ + return + } + let tempList = [...this.pageList]; + let indexContent = tempList.slice(0,1)[0] + let index = this.linkList.indexOf(pageKey) + this.linkList = this.linkList.slice(index) + this.pageList = this.pageList.slice(index) + this.linkList.unshift(indexKey) + this.pageList.unshift(indexContent) + if (this.linkList.indexOf(this.activePage) < 0) { + this.activePage = this.linkList[0] + } + }, + closeRight (pageKey) { + let index = this.linkList.indexOf(pageKey) + this.linkList = this.linkList.slice(0, index + 1) + this.pageList = this.pageList.slice(0, index + 1) + if (this.linkList.indexOf(this.activePage < 0)) { + this.activePage = this.linkList[this.linkList.length - 1] + } + } + }, + } +</script> + +<style lang="scss"> + + /* + * The following styles are auto-applied to elements with + * transition="page-transition" when their visibility is toggled + * by Vue.js. + * + * You can easily play with the page transition by editing + * these styles. + */ + + .page-transition-enter { + opacity: 0; + } + + .page-transition-leave-active { + opacity: 0; + } + + .page-transition-enter .page-transition-container, + .page-transition-leave-active .page-transition-container { + -webkit-transform: scale(1.1); + transform: scale(1.1); + } + /*美化弹出Tab样式*/ + .ant-tabs-nav-container { + margin-top: 4px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/layouts/UserLayout.vue b/ant-design-jeecg-vue/src/components/layouts/UserLayout.vue new file mode 100644 index 0000000..180d5b5 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/layouts/UserLayout.vue @@ -0,0 +1,150 @@ +<template> + <div id="userLayout" :class="['user-layout-wrapper', device]"> + <div class="container"> + <div class="top"> + <div class="header"> + <a href="/"> + <img src="~@/assets/logo.svg" class="logo" alt="logo"> + <span class="title">Jeecg Boot</span> + </a> + </div> + <div class="desc"> + Jeecg Boot 是中国最具影响力的 企业级 快速开发平台 + </div> + </div> + + <route-view></route-view> + + <div class="footer"> + <div class="links"> + <a href="_self">帮助</a> + <a href="_self">隐私</a> + <a href="_self">条款</a> + </div> + <div class="copyright"> + Copyright © 2019 <a href="http://www.jeecg.org" target="_blank">JEECG开源社区</a> 出品 + </div> + </div> + </div> + </div> +</template> + +<script> + import RouteView from "@/components/layouts/RouteView" + import { mixinDevice } from '@/utils/mixin.js' + + export default { + name: "UserLayout", + components: { RouteView }, + mixins: [mixinDevice], + data () { + return {} + }, + mounted () { + document.body.classList.add('userLayout') + }, + beforeDestroy () { + document.body.classList.remove('userLayout') + }, + } +</script> + +<style lang="scss" scoped> + #userLayout.user-layout-wrapper { + height: 100%; + + &.mobile { + .container { + .main { + max-width: 368px; + width: 98%; + } + } + } + + .container { + width: 100%; + min-height: 100%; + background: #f0f2f5 url(~@/assets/background.svg) no-repeat 50%; + background-size: 100%; + padding: 110px 0 144px; + position: relative; + + a { + text-decoration: none; + } + + .top { + text-align: center; + + .header { + height: 44px; + line-height: 44px; + + .badge { + position: absolute; + display: inline-block; + line-height: 1; + vertical-align: middle; + margin-left: -12px; + margin-top: -10px; + opacity: 0.8; + } + + .logo { + height: 44px; + vertical-align: top; + margin-right: 16px; + border-style: none; + } + + .title { + font-size: 33px; + color: rgba(0, 0, 0, .85); + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-weight: 600; + position: relative; + top: 2px; + } + } + .desc { + font-size: 14px; + color: rgba(0, 0, 0, 0.45); + margin-top: 12px; + margin-bottom: 40px; + } + } + + .main { + min-width: 260px; + width: 368px; + margin: 0 auto; + } + + .footer { + position: absolute; + width: 100%; + bottom: 0; + padding: 0 16px; + margin: 48px 0 24px; + text-align: center; + + .links { + margin-bottom: 8px; + font-size: 14px; + a { + color: rgba(0, 0, 0, 0.45); + transition: all 0.3s; + &:not(:last-child) { + margin-right: 40px; + } + } + } + .copyright { + color: rgba(0, 0, 0, 0.45); + font-size: 14px; + } + } + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/layouts/index.js b/ant-design-jeecg-vue/src/components/layouts/index.js new file mode 100644 index 0000000..7cf0f77 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/layouts/index.js @@ -0,0 +1,8 @@ +import UserLayout from '@/components/layouts/UserLayout' +import BlankLayout from '@/components/layouts/BlankLayout' +import BasicLayout from '@/components/layouts/BasicLayout' +import RouteView from '@/components/layouts/RouteView' +import PageView from '@/components/layouts/PageView' +import TabLayout from '@/components/layouts/TabLayout' + +export { UserLayout, BasicLayout, BlankLayout, RouteView, PageView, TabLayout } \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/menu/Contextmenu.vue b/ant-design-jeecg-vue/src/components/menu/Contextmenu.vue new file mode 100644 index 0000000..c3465cb --- /dev/null +++ b/ant-design-jeecg-vue/src/components/menu/Contextmenu.vue @@ -0,0 +1,71 @@ +<template> + <a-menu :style="style" class="contextmenu" v-show="visible" @click="handleClick" :selectedKeys="selectedKeys"> + <a-menu-item :key="item.key" v-for="item in itemList"> + <a-icon role="menuitemicon" v-if="item.icon" :type="item.icon" />{{ item.text }} + </a-menu-item> + </a-menu> +</template> + +<script> +export default { + name: 'Contextmenu', + props: { + visible: { + type: Boolean, + required: false, + default: false + }, + itemList: { + type: Array, + required: true, + default: () => [] + } + }, + data () { + return { + left: 0, + top: 0, + target: null, + selectedKeys: [] + } + }, + computed: { + style () { + return { + left: this.left + 'px', + top: this.top + 'px' + } + } + }, + created () { + window.addEventListener('mousedown', e => this.closeMenu(e)) + window.addEventListener('contextmenu', e => this.setPosition(e)) + }, + methods: { + closeMenu (e) { + if (['menuitemicon', 'menuitem'].indexOf(e.target.getAttribute('role')) < 0) { + this.$emit('update:visible', false) + } + }, + setPosition (e) { + this.left = e.clientX + this.top = e.clientY + this.target = e.target + }, + handleClick ({key}) { + this.$emit('select', key, this.target) + this.$emit('update:visible', false) + } + } +} +</script> + +<style lang="less" scoped> + .contextmenu{ + position: fixed; + z-index: 1; + border: 1px solid #9e9e9e; + border-radius: 4px; + box-shadow: 2px 2px 10px #aaaaaa !important; + } +</style> diff --git a/ant-design-jeecg-vue/src/components/menu/SideMenu.vue b/ant-design-jeecg-vue/src/components/menu/SideMenu.vue new file mode 100644 index 0000000..cd77a84 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/menu/SideMenu.vue @@ -0,0 +1,62 @@ +<template> + <a-layout-sider + :class="['sider', isDesktop() ? null : 'shadow', theme, fixSiderbar ? 'ant-fixed-sidemenu' : null ]" + width="248px" + :collapsible="collapsible" + v-model="collapsed" + :trigger="null"> + <logo /> + <s-menu + :collapsed="collapsed" + :menu="menus" + :theme="theme" + @select="onSelect" + :mode="mode" + style="padding: 16px 0px;"></s-menu> + </a-layout-sider> + +</template> + +<script> + import ALayoutSider from "ant-design-vue/es/layout/Sider" + import Logo from '../tools/Logo' + import SMenu from './index' + import { mixin, mixinDevice } from '@/utils/mixin.js' + + export default { + name: "SideMenu", + components: { ALayoutSider, Logo, SMenu }, + mixins: [mixin, mixinDevice], + props: { + mode: { + type: String, + required: false, + default: 'inline' + }, + theme: { + type: String, + required: false, + default: 'dark' + }, + collapsible: { + type: Boolean, + required: false, + default: false + }, + collapsed: { + type: Boolean, + required: false, + default: false + }, + menus: { + type: Array, + required: true + } + }, + methods: { + onSelect (obj) { + this.$emit('menuSelect', obj) + } + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/menu/index.js b/ant-design-jeecg-vue/src/components/menu/index.js new file mode 100644 index 0000000..5e3c901 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/menu/index.js @@ -0,0 +1,162 @@ +import Menu from 'ant-design-vue/es/menu' +import Icon from 'ant-design-vue/es/icon' + +const { Item, SubMenu } = Menu + +export default { + name: 'SMenu', + props: { + menu: { + type: Array, + required: true + }, + theme: { + type: String, + required: false, + default: 'dark' + }, + mode: { + type: String, + required: false, + default: 'inline' + }, + collapsed: { + type: Boolean, + required: false, + default: false + } + }, + data () { + return { + openKeys: [], + selectedKeys: [], + cachedOpenKeys: [] + } + }, + computed: { + rootSubmenuKeys: (vm) => { + let keys = [] + vm.menu.forEach(item => keys.push(item.path)) + return keys + } + }, + created () { + this.updateMenu() + }, + watch: { + collapsed (val) { + if (val) { + this.cachedOpenKeys = this.openKeys + this.openKeys = [] + } else { + this.openKeys = this.cachedOpenKeys + } + }, + '$route': function () { + this.updateMenu() + } + }, + methods: { + renderIcon: function (h, icon) { + return icon === 'none' || icon === undefined ? null + : h(Icon, { props: { type: icon !== undefined ? icon : '' } }) + }, + renderMenuItem: function (h, menu, pIndex, index) { + return h(Item, { key: menu.path ? menu.path : 'item_' + pIndex + '_' + index }, + [ + h( + 'router-link', + { attrs: { to: { name: menu.name } } }, + [ + this.renderIcon(h, menu.meta.icon), + h('span', [ menu.meta.title ]) + ] + ) + ] + ) + }, + renderSubMenu: function (h, menu, pIndex, index) { + const this2_ = this; + let subItem = [ h('span', + { slot: 'title' }, + [ + this.renderIcon(h, menu.meta.icon), + h('span', [ menu.meta.title ]) + ] + ) ] + let itemArr = [] + let pIndex_ = pIndex + '_' + index + if (!menu.alwaysShow) { + menu.children.forEach(function (item, i) { + itemArr.push(this2_.renderItem(h, item, pIndex_, i)) + }) + } + return h( + SubMenu, + { key: menu.path ? menu.path : 'submenu_' + pIndex + '_' + index }, + subItem.concat(itemArr) + ) + }, + renderItem: function (h, menu, pIndex, index) { + if (!menu.hidden) { + return menu.children && !menu.alwaysShow ? this.renderSubMenu(h, menu, pIndex, index) : this.renderMenuItem(h, menu, pIndex, index) + } + }, + renderMenu: function (h, menuTree) { + const this2_ = this + let menuArr = [] + menuTree.forEach(function (menu, i) { + if (!menu.hidden) { + menuArr.push(this2_.renderItem(h, menu, '0', i)) + } + }) + return menuArr + }, + onOpenChange (openKeys) { + const latestOpenKey = openKeys.find(key => this.openKeys.indexOf(key) === -1) + if (this.rootSubmenuKeys.indexOf(latestOpenKey) === -1) { + this.openKeys = openKeys + } else { + this.openKeys = latestOpenKey ? [ latestOpenKey ] : [] + } + }, + updateMenu () { + let routes = this.$route.matched.concat() + if (routes.length >= 4 && this.$route.meta.hidden) { + routes.pop() + this.selectedKeys = [ routes[2].path ] + } else { + this.selectedKeys = [ routes.pop().path ] + } + + let openKeys = [] + if (this.mode === 'inline') { + routes.forEach((item) => { + openKeys.push(item.path) + }) + } + + this.collapsed ? this.cachedOpenKeys = openKeys : this.openKeys = openKeys + } + }, + render (h) { + return h( + Menu, + { + props: { + theme: this.$props.theme, + mode: this.$props.mode, + openKeys: this.openKeys, + selectedKeys: this.selectedKeys + }, + on: { + openChange: this.onOpenChange, + select: (obj) => { + this.selectedKeys = obj.selectedKeys + this.$emit('select', obj) + } + } + }, this.renderMenu(h, this.menu) + ) + } +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/page/GlobalFooter.vue b/ant-design-jeecg-vue/src/components/page/GlobalFooter.vue new file mode 100644 index 0000000..ba3f1d3 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/page/GlobalFooter.vue @@ -0,0 +1,51 @@ +<template> + <div class="footer"> + <div class="links"> + <a href="http://www.jeecg.org" target="_blank">JEECG 首页</a> + <a href="https://github.com/zhangdaiscott/jeecg-boot" target="_blank"> + <a-icon type="github"/> + </a> + <a href="https://ant.design/">Ant Design</a> + <a href="https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/">Vue Antd</a> + </div> + <div class="copyright"> + Copyright + <a-icon type="copyright"/> + 2019 <span>JEECG开源社区 出品</span> + </div> + </div> +</template> + +<script> + export default { + name: "LayoutFooter" + } +</script> + +<style lang="scss" scoped> + .footer { + padding: 0 16px; + margin: 48px 0 24px; + text-align: center; + + .links { + margin-bottom: 8px; + + a { + color: rgba(0, 0, 0, .45); + + &:hover { + color: rgba(0, 0, 0, .65); + } + + &:not(:last-child) { + margin-right: 40px; + } + } + } + .copyright { + color: rgba(0, 0, 0, .45); + font-size: 14px; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/page/GlobalHeader.vue b/ant-design-jeecg-vue/src/components/page/GlobalHeader.vue new file mode 100644 index 0000000..39c72e8 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/page/GlobalHeader.vue @@ -0,0 +1,127 @@ +<template> + <!-- , width: fixedHeader ? `calc(100% - ${sidebarOpened ? 256 : 80}px)` : '100%' --> + <a-layout-header v-if="!headerBarFixed" :class="[fixedHeader && 'ant-header-fixedHeader', sidebarOpened ? 'ant-header-side-opened' : 'ant-header-side-closed', ]" :style="{ padding: '0' }"> + <div v-if="mode === 'sidemenu'" class="header"> + <a-icon + v-if="device==='mobile'" + class="trigger" + :type="collapsed ? 'menu-fold' : 'menu-unfold'" + @click.native="toggle"></a-icon> + <a-icon + v-else + class="trigger" + :type="collapsed ? 'menu-unfold' : 'menu-fold'" + @click.native="toggle"/> + <span>欢迎进入 Jeecg-Boot 企业级快速开发平台</span> + <user-menu></user-menu> + </div> + <div v-else :class="['top-nav-header-index', theme]"> + <div class="header-index-wide"> + <div class="header-index-left"> + <logo class="top-nav-header" :show-title="device !== 'mobile'" /> + <s-menu + v-if="device !== 'mobile'" + mode="horizontal" + :menu="menus" + :theme="theme" + ></s-menu> + <a-icon + v-else + class="trigger" + :type="collapsed ? 'menu-fold' : 'menu-unfold'" + @click.native="toggle"></a-icon> + </div> + <user-menu class="header-index-right"></user-menu> + </div> + </div> + + </a-layout-header> +</template> + +<script> + import UserMenu from '../tools/UserMenu' + import SMenu from '../menu/' + import Logo from '../tools/Logo' + + import { mixin } from '@/utils/mixin.js' + + export default { + name: "GlobalHeader", + components: { + UserMenu, + SMenu, + Logo + }, + mixins: [mixin], + props: { + mode: { + type: String, + // sidemenu, topmenu + default: 'sidemenu' + }, + menus: { + type: Array, + required: true + }, + theme: { + type: String, + required: false, + default: 'dark' + }, + collapsed: { + type: Boolean, + required: false, + default: false + }, + device: { + type: String, + required: false, + default: 'desktop' + } + }, + data() { + return { + headerBarFixed: false, + } + }, + mounted () { + window.addEventListener('scroll', this.handleScroll) + }, + methods: { + handleScroll () { + if (this.autoHideHeader) { + let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop + if (scrollTop > 100) { + this.headerBarFixed = true + } else { + this.headerBarFixed = false + } + } else { + this.headerBarFixed = false + } + }, + toggle() { + this.$emit('toggle') + } + } + } +</script> + +<style lang="scss" scoped> + /* update_begin author:scott date:20190220 for: 缩小首页布局顶部的高度*/ + .layout .top-nav-header-index .header-index-wide { + margin-left: 20px + } + .layout .header { + height: 59px; + } + .ant-layout-header { + height: 59px; + line-height: 59px; + } + .layout .top-nav-header-index .header-index-wide .ant-menu.ant-menu-horizontal { + height: 59px; + line-height: 59px; + } + /* update_end author:scott date:20190220 for: 缩小首页布局顶部的高度*/ +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/page/GlobalLayout.vue b/ant-design-jeecg-vue/src/components/page/GlobalLayout.vue new file mode 100644 index 0000000..ddc2570 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/page/GlobalLayout.vue @@ -0,0 +1,596 @@ +<template> + <a-layout class="layout" :class="[device]"> + + <template v-if="layoutMode === 'sidemenu'"> + <a-drawer + v-if="device === 'mobile'" + :wrapClassName="'drawer-sider ' + navTheme" + placement="left" + @close="() => this.collapsed = false" + :closable="false" + :visible="collapsed" + > + <side-menu + mode="inline" + :menus="menus" + @menuSelect="menuSelect" + :theme="navTheme" + :collapsed="false" + :collapsible="true"></side-menu> + </a-drawer> + + <side-menu + v-else + mode="inline" + :menus="menus" + :theme="navTheme" + :collapsed="collapsed" + :collapsible="true"></side-menu> + </template> + <!-- 下次优化这些代码 --> + <template v-else> + <a-drawer + v-if="device === 'mobile'" + :wrapClassName="'drawer-sider ' + navTheme" + placement="left" + @close="() => this.collapsed = false" + :closable="false" + :visible="collapsed" + > + <side-menu + mode="inline" + :menus="menus" + @menuSelect="menuSelect" + :theme="navTheme" + :collapsed="false" + :collapsible="true"></side-menu> + </a-drawer> + </template> + + <a-layout :class="[layoutMode, `content-width-${contentWidth}`]" :style="{ paddingLeft: fixSiderbar && isDesktop() ? `${sidebarOpened ? 256 : 80}px` : '0' }"> + <!-- layout header --> + <global-header + :mode="layoutMode" + :menus="menus" + :theme="navTheme" + :collapsed="collapsed" + :device="device" + @toggle="toggle" + /> + + <!-- layout content --> + <a-layout-content :style="{ margin: '10px 24px 0', height: '100%', paddingTop: fixedHeader ? '64px' : '0' }"> + <slot></slot> + </a-layout-content> + + <!-- layout footer --> + <a-layout-footer style="padding: 0px"> + <global-footer /> + </a-layout-footer> + </a-layout> + + <setting-drawer></setting-drawer> + </a-layout> +</template> + +<script> + import SideMenu from '@/components/menu/SideMenu' + import GlobalHeader from '@/components/page/GlobalHeader' + import GlobalFooter from '@/components/page/GlobalFooter' + import SettingDrawer from '@/components/setting/SettingDrawer' + import { triggerWindowResizeEvent } from '@/utils/util' + import { mapState, mapActions } from 'vuex' + import { mixin, mixinDevice } from '@/utils/mixin.js' + + export default { + name: "GlobalLayout", + components: { + SideMenu, + GlobalHeader, + GlobalFooter, + SettingDrawer + }, + mixins: [mixin, mixinDevice], + data () { + return { + collapsed: false, + menus: [] + } + }, + computed: { + ...mapState({ + // 主路由 + mainMenu: state => state.permission.addRouters, + }) + }, + watch: { + sidebarOpened(val) { + this.collapsed = !val + }, + }, + created() { + this.menus = this.mainMenu.find((item) => item.path === '/').children + }, + methods: { + ...mapActions(['setSidebar']), + toggle() { + this.collapsed = !this.collapsed + this.setSidebar(!this.collapsed) + triggerWindowResizeEvent() + }, + menuSelect() { + if (!this.isDesktop()) { + this.collapsed = false + } + } + }, + } +</script> + +<style lang="scss"> + body { + // 打开滚动条固定显示 + overflow-y: scroll; + + &.colorWeak { + filter: invert(80%); + } + } + + .layout { + min-height: 100vh; + overflow-x: hidden; + + &.mobile { + + .ant-layout-content { + + .content { + margin: 24px 0 0; + } + } + + /** + * ant-table-wrapper + * 覆盖的表格手机模式样式,如果想修改在手机上表格最低宽度,可以在这里改动 + */ + .ant-table-wrapper { + .ant-table-content { + overflow-y: auto; + } + .ant-table-body { + min-width: 800px; + } + } + .sidemenu { + .ant-header-fixedHeader { + + &.ant-header-side-opened, &.ant-header-side-closed { + width: 100% + } + } + } + + .topmenu { + /* 必须为 topmenu 才能启用流式布局 */ + &.content-width-Fluid { + .header-index-wide { + margin-left: 0; + } + } + } + } + + &.ant-layout-has-sider { + flex-direction: row; + } + + .trigger { + font-size: 20px; + line-height: 64px; + padding: 0 24px; + cursor: pointer; + transition: color .3s; + &:hover { + background: rgba(0, 0, 0, 0.025); + } + } + + .topmenu { + .ant-header-fixedHeader { + position: fixed; + top: 0; + right: 0; + z-index: 9; + width: 100%; + transition: width .2s; + + &.ant-header-side-opened { + width: 100%; + } + + &.ant-header-side-closed { + width: 100%; + } + } + /* 必须为 topmenu 才能启用流式布局 */ + &.content-width-Fluid { + .header-index-wide { + max-width: unset; + margin-left: 24px; + } + + .page-header-index-wide { + max-width: unset; + } + } + + } + + .sidemenu { + .ant-header-fixedHeader { + position: fixed; + top: 0; + right: 0; + z-index: 9; + width: 100%; + transition: width .2s; + + &.ant-header-side-opened { + width: calc(100% - 256px) + } + + &.ant-header-side-closed { + width: calc(100% - 80px) + } + } + } + + + + .header { + height: 64px; + padding: 0 12px 0 0; + background: #fff; + box-shadow: 0 1px 4px rgba(0, 21, 41, .08); + position: relative; + } + + .header, .top-nav-header-index { + + .user-wrapper { + float: right; + height: 100%; + + .action { + cursor: pointer; + padding: 0 12px; + display: inline-block; + transition: all .3s; + height: 100%; + + &:hover { + background: rgba(0, 0, 0, 0.025); + } + + .avatar { + margin: 20px 8px 20px 0; + color: #1890ff; + background: hsla(0, 0%, 100%, .85); + vertical-align: middle; + } + + + .icon { + font-size: 16px; + padding: 4px; + } + } + } + + &.dark { + .user-wrapper { + + .action { + color: rgba(255, 255, 255, 0.85); + + &:hover { + background: rgba(255, 255, 255, 0.16); + } + } + } + } + } + + &.mobile { + .top-nav-header-index { + + .header-index-wide { + + .header-index-left { + + .trigger { + color: rgba(255, 255, 255, 0.85); + padding: 0 12px; + } + + .logo.top-nav-header { + text-align: center; + width: 56px; + line-height: 58px; + } + } + } + + &.light { + + .header-index-wide { + + .header-index-left { + .trigger { + color: rgba(0, 0, 0, 0.65); + } + } + } + // + } + } + } + + &.tablet { + // overflow: hidden; text-overflow:ellipsis; white-space: nowrap; + .top-nav-header-index { + + .header-index-wide { + + .header-index-left { + .logo > a { + overflow: hidden; + text-overflow:ellipsis; + white-space: nowrap; + } + } + } + } + + } + + + .top-nav-header-index { + box-shadow: 0 1px 4px rgba(0,21,41,.08); + position: relative; + transition: background .3s,width .2s; + + .header-index-wide { + max-width: 1200px; + margin: auto; + padding-left: 0; + display: flex; + height: 64px; + + .ant-menu.ant-menu-horizontal { + border: none; + height: 64px; + line-height: 64px; + } + + .header-index-left { + flex: 1 1; + display: flex; + + .logo.top-nav-header { + width: 165px; + height: 64px; + position: relative; + line-height: 64px; + transition: all .3s; + overflow: hidden; + + img { + display: inline-block; + vertical-align: middle; + height: 32px; + } + + h1 { + color: #fff; + display: inline-block; + vertical-align: top; + font-size: 16px; + margin: 0 0 0 12px; + font-weight: 400; + } + } + } + + .header-index-right { + float: right; + height: 64px; + overflow: hidden; + } + } + + &.light { + background-color: #fff; + + .header-index-wide { + .header-index-left { + .logo { + h1 { + color: #002140; + } + } + } + } + } + } + + + // 内容区 + .layout-content { + margin: 24px 24px 0px; + height: 100%; + height: 64px; + padding: 0 12px 0 0; + } + + } + + .topmenu { + .page-header-index-wide { + max-width: 1200px; + margin: 0 auto; + } + } + + // drawer-sider 自定义 + .ant-drawer.drawer-sider { + .sider { + box-shadow: none; + } + + &.dark { + .ant-drawer-content { + background-color: rgb(0, 21, 41); + } + } + &.light { + box-shadow: none; + .ant-drawer-content { + background-color: #fff; + } + } + + .ant-drawer-body { + padding: 0 + } + } + + // 菜单样式 + .sider { + box-shadow: 2px 0 6px rgba(0, 21, 41, .35); + position: relative; + z-index: 10; + + &.ant-fixed-sidemenu { + position: fixed; + height: 100%; + } + + .logo { + height: 64px; + position: relative; + line-height: 64px; + padding-left: 24px; + -webkit-transition: all .3s; + transition: all .3s; + background: #002140; + overflow: hidden; + + img, h1 { + display: inline-block; + vertical-align: middle; + } + + img { + height: 32px; + } + + h1 { + color: #fff; + font-size: 20px; + margin: 0 0 0 12px; + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-weight: 600; + } + } + + &.light { + background-color: #fff; + box-shadow: 2px 0px 8px 0px rgba(29, 35, 41, 0.05); + + .logo { + background: #fff; + box-shadow: 1px 1px 0px 0px #e8e8e8; + + h1 { + color: unset; + } + } + + .ant-menu-light { + border-right-color: transparent; + } + } + + } + + // 外置的样式控制 + .user-dropdown-menu-wrapper.ant-dropdown-menu { + padding: 4px 0; + + .ant-dropdown-menu-item { + width: 160px; + } + + .ant-dropdown-menu-item > .anticon:first-child, + .ant-dropdown-menu-item > a > .anticon:first-child, + .ant-dropdown-menu-submenu-title > .anticon:first-child + .ant-dropdown-menu-submenu-title > a > .anticon:first-child { + min-width: 12px; + margin-right: 8px; + } + + } + + // 数据列表 样式 + .table-alert { + margin-bottom: 16px; + } + + .table-page-search-wrapper { + + .ant-form-inline { + + .ant-form-item { + display: flex; + margin-bottom: 24px; + margin-right: 0; + + .ant-form-item-control-wrapper { + flex: 1 1; + display: inline-block; + vertical-align: middle; + } + + >.ant-form-item-label { + line-height: 32px; + padding-right: 8px; + width: auto; + } + .ant-form-item-control { + height: 32px; + line-height: 32px; + } + } + } + + .table-page-search-submitButtons { + display: block; + margin-bottom: 24px; + white-space: nowrap; + } + + } + + .content { + + .table-operator { + margin-bottom: 18px; + + button { + margin-right: 8px; + } + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/page/PageHeader.vue b/ant-design-jeecg-vue/src/components/page/PageHeader.vue new file mode 100644 index 0000000..596650f --- /dev/null +++ b/ant-design-jeecg-vue/src/components/page/PageHeader.vue @@ -0,0 +1,238 @@ +<template> + <div class="page-header"> + <div class="page-header-index-wide"> + <a-breadcrumb class="breadcrumb"> + <a-breadcrumb-item v-for="(item, index) in breadList" :key="index"> + <router-link v-if="item.name != name" :to="{ path: item.path }"> + {{ item.meta.title }} + </router-link> + <span v-else>{{ item.meta.title }}</span> + </a-breadcrumb-item> + </a-breadcrumb> + + <div class="detail"> + <div class="main" v-if="!$route.meta.hiddenHeaderContent"> + <div class="row"> + <img v-if="logo" :src="logo" class="logo"/> + <h1 v-if="title" class="title">{{ title }}</h1> + <div class="action"> + <slot name="action"></slot> + </div> + </div> + <div class="row"> + <div v-if="avatar" class="avatar"> + <a-avatar :src="avatar"/> + </div> + <div v-if="this.$slots.content" class="headerContent"> + <slot name="content"></slot> + </div> + <div v-if="this.$slots.extra" class="extra"> + <slot name="extra"></slot> + </div> + </div> + <div> + <slot name="pageMenu"></slot> + </div> + </div> + + </div> + </div> + </div> +</template> + +<script> + import Breadcrumb from '@/components/tools/Breadcrumb' + + export default { + name: "PageHeader", + components: { + "s-breadcrumb": Breadcrumb + }, + props: { + title: { + type: String, + default: '', + required: false + }, + breadcrumb: { + type: Array, + default: null, + required: false + }, + logo: { + type: String, + default: '', + required: false + }, + avatar: { + type: String, + default: '', + required: false + } + }, + data() { + return { + name: '', + breadList: [], + } + }, + created() { + this.getBreadcrumb() + }, + methods: { + getBreadcrumb() { + + this.breadList = [] + // this.breadList.push({name: 'index', path: '/dashboard/', meta: {title: '首页'}}) + + this.name = this.$route.name + this.$route.matched.forEach((item) => { + // item.name !== 'index' && this.breadList.push(item) + this.breadList.push(item) + }) + } + }, + watch: { + $route() { + this.getBreadcrumb() + } + } + } +</script> + +<style lang="scss" scoped> + + .page-header { + background: #fff; + padding: 16px 32px 0; + border-bottom: 1px solid #e8e8e8; + + .breadcrumb { + margin-bottom: 16px; + } + + .detail { + display: flex; + /*margin-bottom: 16px;*/ + + .avatar { + flex: 0 1 72px; + margin: 0 24px 8px 0; + + & > span { + border-radius: 72px; + display: block; + width: 72px; + height: 72px; + } + } + + .main { + width: 100%; + flex: 0 1 auto; + + .row { + display: flex; + width: 100%; + + .avatar { + margin-bottom: 16px; + } + } + + .title { + font-size: 20px; + font-weight: 500; + + font-size: 20px; + line-height: 28px; + font-weight: 500; + color: rgba(0,0,0,.85); + margin-bottom: 16px; + flex: auto; + + } + .logo { + width: 28px; + height: 28px; + border-radius: 4px; + margin-right: 16px; + } + .content, .headerContent { + flex: auto; + color: rgba(0,0,0,.45); + line-height: 22px; + + .link { + margin-top: 16px; + line-height: 24px; + + a { + font-size: 14px; + margin-right: 32px; + } + } + } + .extra { + flex: 0 1 auto; + margin-left: 88px; + min-width: 242px; + text-align: right; + } + .action { + margin-left: 56px; + min-width: 266px; + flex: 0 1 auto; + text-align: right; + &:empty { + display: none; + } + } + } + } + } + + .mobile .page-header { + + .main { + + .row { + flex-wrap: wrap; + + .avatar { + flex: 0 1 25%; + margin: 0 2% 8px 0; + } + .content, .headerContent { + flex: 0 1 70%; + + .link { + margin-top: 16px; + line-height: 24px; + + a { + font-size: 14px; + margin-right: 10px; + } + } + } + .extra { + flex: 1 1 auto; + margin-left: 0; + min-width: 0; + text-align: right; + } + .action { + margin-left: unset; + min-width: 266px; + flex: 0 1 auto; + text-align: left; + margin-bottom: 12px; + &:empty { + display: none; + } + } + } + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/page/PageLayout.vue b/ant-design-jeecg-vue/src/components/page/PageLayout.vue new file mode 100644 index 0000000..bff916e --- /dev/null +++ b/ant-design-jeecg-vue/src/components/page/PageLayout.vue @@ -0,0 +1,127 @@ +<template> + <div :style="!$route.meta.pageHeader ? 'margin: -16px -24px 0px;' : null"> + <!-- pageHeader , route meta hideHeader:true on hide --> + <page-header v-if="!$route.meta.pageHeader" :title="title" :logo="logo" :avatar="avatar"> + <slot slot="action" name="action"></slot> + <slot slot="content" name="headerContent"></slot> + <div slot="content" v-if="!this.$slots.headerContent && desc"> + <p style="font-size: 14px;color: rgba(0,0,0,.65)">{{ desc }}</p> + <div class="link"> + <template v-for="(link, index) in linkList"> + <a :key="index" :href="link.href"> + <a-icon :type="link.icon"/> + <span>{{ link.title }}</span> + </a> + </template> + </div> + </div> + <slot slot="extra" name="extra"></slot> + <div slot="pageMenu"> + <div class="page-menu-search" v-if="search"> + <a-input-search style="width: 80%; max-width: 522px;" placeholder="请输入..." size="large" enterButton="搜索" /> + </div> + <div class="page-menu-tabs" v-if="tabs && tabs.items"> + <!-- @change="callback" :activeKey="activeKey" --> + <a-tabs :tabBarStyle="{margin: 0}" @change="tabs.callback" :activeKey="tabs.active()"> + <a-tab-pane v-for="item in tabs.items" :tab="item.title" :key="item.key"></a-tab-pane> + </a-tabs> + </div> + </div> + </page-header> + <div class="content"> + <div :class="['page-header-index-wide']"> + <slot></slot> + </div> + </div> + </div> +</template> + +<script> + import PageHeader from './PageHeader' + + export default { + name: "LayoutContent", + components: { + PageHeader + }, + // ['desc', 'logo', 'title', 'avatar', 'linkList', 'extraImage'] + props: { + desc: { + type: String, + default: null + }, + logo: { + type: String, + default: null + }, + title: { + type: String, + default: null + }, + avatar: { + type: String, + default: null + }, + linkList: { + type: Array, + default: null + }, + extraImage: { + type: String, + default: null + }, + search: { + type: Boolean, + default: false + }, + tabs: { + type: Object, + default: () => {} + } + }, + methods: { + } + } +</script> + +<style lang="scss" scoped> + .content { + margin: 24px 24px 0; + + .link { + margin-top: 16px; + + &:not(:empty) { + margin-bottom: 16px; + } + a { + margin-right: 32px; + height: 24px; + line-height: 24px; + display: inline-block; + + i { + font-size: 24px; + margin-right: 8px; + vertical-align: middle; + } + span { + height: 24px; + line-height: 24px; + display: inline-block; + vertical-align: middle; + } + } + } + } + .page-menu-search { + text-align: center; + margin-bottom: 16px; + } + .page-menu-tabs { + margin-top: 48px; + } + .page-header[data-v-6740ec88] { + margin: 0px 24px 0; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/page/SHeaderNotice.vue b/ant-design-jeecg-vue/src/components/page/SHeaderNotice.vue new file mode 100644 index 0000000..622636a --- /dev/null +++ b/ant-design-jeecg-vue/src/components/page/SHeaderNotice.vue @@ -0,0 +1,58 @@ +<template> + <a-popover trigger="click" placement="bottomRight" :overlayStyle="{ width: '300px' }"> + <template slot="content"> + <a-spin :spinning="loadding"> + <a-tabs> + <a-tab-pane v-for="(tab, k) in tabs" :tab="tab.title" :key="k"> + + </a-tab-pane> + </a-tabs> + </a-spin> + </template> + <span @click="fetchNotice" class="header-notice"> + <a-badge count="12"> + <a-icon style="font-size: 16px; padding: 4px" type="bell" /> + </a-badge> + </span> + </a-popover> +</template> + +<script> + export default { + name: "HeaderNotice", + props: { + tabs: { + type: Array, + default: null, + required: true + } + }, + data () { + return { + loadding: false + } + }, + methods: { + fetchNotice () { + if (this.loadding) { + this.loadding = false + return + } + this.loadding = true + setTimeout(() => { + this.loadding = false + }, 2000) + } + } + } +</script> + +<style lang="scss" scoped> + .header-notice{ + display: inline-block; + transition: all 0.3s; + span { + vertical-align: initial; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/setting/SettingDrawer.vue b/ant-design-jeecg-vue/src/components/setting/SettingDrawer.vue new file mode 100644 index 0000000..4f10299 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/setting/SettingDrawer.vue @@ -0,0 +1,314 @@ +<template> + <div class="setting-drawer"> + <a-drawer + width="300" + placement="right" + :closable="false" + @close="onClose" + :visible="visible" + :style="{}" + > + <div class="setting-drawer-index-content"> + + <div :style="{ marginBottom: '24px' }"> + <h3 class="setting-drawer-index-title">整体风格设置</h3> + + <div class="setting-drawer-index-blockChecbox"> + <a-tooltip> + <template slot="title"> + 暗色菜单风格 + </template> + <div class="setting-drawer-index-item" @click="handleMenuTheme('dark')"> + <img src="https://gw.alipayobjects.com/zos/rmsportal/LCkqqYNmvBEbokSDscrm.svg" alt="dark"> + <div class="setting-drawer-index-selectIcon" v-if="navTheme === 'dark'"> + <a-icon type="check"/> + </div> + </div> + </a-tooltip> + + <a-tooltip> + <template slot="title"> + 亮色菜单风格 + </template> + <div class="setting-drawer-index-item" @click="handleMenuTheme('light')"> + <img src="https://gw.alipayobjects.com/zos/rmsportal/jpRkZQMyYRryryPNtyIC.svg" alt="light"> + <div class="setting-drawer-index-selectIcon" v-if="navTheme !== 'dark'"> + <a-icon type="check"/> + </div> + </div> + </a-tooltip> + </div> + </div> + + <div :style="{ marginBottom: '24px' }"> + <h3 class="setting-drawer-index-title">主题色</h3> + + <div style="height: 20px"> + <a-tooltip class="setting-drawer-theme-color-colorBlock" v-for="(item, index) in colorList" :key="index"> + <template slot="title"> + {{ item.key }} + </template> + <a-tag :color="item.color" @click="changeColor(item.color)"> + <a-icon type="check" v-if="item.color === primaryColor"></a-icon> + </a-tag> + </a-tooltip> + + </div> + </div> + <a-divider /> + + <div :style="{ marginBottom: '24px' }"> + <h3 class="setting-drawer-index-title">导航模式</h3> + + <div class="setting-drawer-index-blockChecbox"> + <a-tooltip> + <template slot="title"> + 侧边栏导航 + </template> + <div class="setting-drawer-index-item" @click="handleLayout('sidemenu')"> + <img src="https://gw.alipayobjects.com/zos/rmsportal/JopDzEhOqwOjeNTXkoje.svg" alt="sidemenu"> + <div class="setting-drawer-index-selectIcon" v-if="layoutMode === 'sidemenu'"> + <a-icon type="check"/> + </div> + </div> + </a-tooltip> + + <a-tooltip> + <template slot="title"> + 顶部栏导航 + </template> + <div class="setting-drawer-index-item" @click="handleLayout('topmenu')"> + <img src="https://gw.alipayobjects.com/zos/rmsportal/KDNDBbriJhLwuqMoxcAr.svg" alt="topmenu"> + <div class="setting-drawer-index-selectIcon" v-if="layoutMode !== 'sidemenu'"> + <a-icon type="check"/> + </div> + </div> + </a-tooltip> + </div> + <div :style="{ marginTop: '24px' }"> + <a-list :split="false"> + <a-list-item> + <a-tooltip slot="actions"> + <template slot="title"> + 该设定仅 [顶部栏导航] 时有效 + </template> + <a-select size="small" style="width: 80px;" :defaultValue="contentWidth" @change="handleContentWidthChange"> + <a-select-option value="Fixed">固定</a-select-option> + <a-select-option value="Fluid" v-if="layoutMode !== 'sidemenu'">流式</a-select-option> + </a-select> + </a-tooltip> + <a-list-item-meta> + <div slot="title">内容区域宽度</div> + </a-list-item-meta> + </a-list-item> + <a-list-item> + <a-switch slot="actions" size="small" :defaultChecked="fixedHeader" @change="handleFixedHeader" /> + <a-list-item-meta> + <div slot="title">固定 Header</div> + </a-list-item-meta> + </a-list-item> + <a-list-item> + <a-switch slot="actions" size="small" :disabled="!fixedHeader" :defaultChecked="autoHideHeader" @change="handleFixedHeaderHidden" /> + <a-list-item-meta> + <div slot="title" :style="{ textDecoration: !fixedHeader ? 'line-through' : 'unset' }">下滑时隐藏 Header</div> + </a-list-item-meta> + </a-list-item> + <a-list-item > + <a-switch slot="actions" size="small" :disabled="(layoutMode === 'topmenu')" :defaultChecked="fixSiderbar" @change="handleFixSiderbar" /> + <a-list-item-meta> + <div slot="title" :style="{ textDecoration: layoutMode === 'topmenu' ? 'line-through' : 'unset' }">固定侧边菜单</div> + </a-list-item-meta> + </a-list-item> + </a-list> + </div> + </div> + <a-divider /> + + <div :style="{ marginBottom: '24px' }"> + <h3 class="setting-drawer-index-title">其他设置</h3> + <div> + <a-list :split="false"> + <a-list-item> + <a-switch slot="actions" size="small" :defaultChecked="colorWeak" @change="onColorWeak" /> + <a-list-item-meta> + <div slot="title">色弱模式</div> + </a-list-item-meta> + </a-list-item> + </a-list> + </div> + </div> + <a-divider /> + <div :style="{ marginBottom: '24px' }"> + <a-alert type="warning"> + <span slot="message"> + 配置栏只在开发环境用于预览,生产环境不会展现,请手动修改配置文件 + <a href="https://github.com/sendya/ant-design-pro-vue/blob/master/src/defaultSettings.js" target="_blank">src/defaultSettings.js</a> + </span> + </a-alert> + </div> + </div> + <div class="setting-drawer-index-handle" @click="toggle"> + <a-icon type="setting" v-if="!visible"/> + <a-icon type="close" v-else/> + </div> + </a-drawer> + </div> +</template> + +<script> + import DetailList from '@/components/tools/DetailList' + import SettingItem from '@/components/setting/SettingItem' + import config from '@/defaultSettings' + import { updateTheme, updateColorWeak, colorList } from '@/components/tools/setting' + import { mixin, mixinDevice } from '@/utils/mixin.js' + + export default { + components: { + DetailList, + SettingItem + }, + mixins: [mixin, mixinDevice], + data() { + return { + visible: true, + colorList, + } + }, + watch: { + + }, + mounted () { + const vm = this + setTimeout(() => { + vm.visible = false + }, 16) + // 当主题色不是默认色时,才进行主题编译 + if (this.primaryColor !== config.primaryColor) { + updateTheme(this.primaryColor) + } + if (this.colorWeak !== config.colorWeak) { + updateColorWeak(this.colorWeak) + } + }, + methods: { + showDrawer() { + this.visible = true + }, + onClose() { + this.visible = false + }, + toggle() { + this.visible = !this.visible + }, + onColorWeak (checked) { + this.$store.dispatch('ToggleWeak', checked) + updateColorWeak(checked) + }, + handleMenuTheme (theme) { + this.$store.dispatch('ToggleTheme', theme) + }, + handleLayout (mode) { + this.$store.dispatch('ToggleLayoutMode', mode) + // 因为顶部菜单不能固定左侧菜单栏,所以强制关闭 + // + this.handleFixSiderbar(false); + }, + handleContentWidthChange (type) { + this.$store.dispatch('ToggleContentWidth', type) + }, + changeColor (color) { + if (this.primaryColor !== color) { + this.$store.dispatch('ToggleColor', color) + updateTheme(color) + } + }, + handleFixedHeader (fixed) { + this.$store.dispatch('ToggleFixedHeader', fixed) + }, + handleFixedHeaderHidden (autoHidden) { + this.$store.dispatch('ToggleFixedHeaderHidden', autoHidden) + }, + handleFixSiderbar (fixed) { + if (this.layoutMode === 'topmenu') { + this.$store.dispatch('ToggleFixSiderbar', false) + return; + } + this.$store.dispatch('ToggleFixSiderbar', fixed) + } + }, + } +</script> + +<style lang="scss" scoped> + + .setting-drawer-index-content { + + .setting-drawer-index-blockChecbox { + display: flex; + + .setting-drawer-index-item { + margin-right: 16px; + position: relative; + border-radius: 4px; + cursor: pointer; + + img { + width: 48px; + } + + .setting-drawer-index-selectIcon { + position: absolute; + top: 0; + right: 0; + width: 100%; + padding-top: 15px; + padding-left: 24px; + height: 100%; + color: #1890ff; + font-size: 14px; + font-weight: 700; + } + } + } + .setting-drawer-theme-color-colorBlock { + width: 20px; + height: 20px; + border-radius: 2px; + float: left; + cursor: pointer; + margin-right: 8px; + padding-left: 0px; + padding-right: 0px; + text-align: center; + color: #fff; + font-weight: 700; + + i { + font-size: 14px; + } + } + } + + .setting-drawer-index-handle { + position: absolute; + top: 240px; + background: #1890ff; + width: 48px; + height: 48px; + right: 300px; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + pointer-events: auto; + z-index: 1001; + text-align: center; + font-size: 16px; + border-radius: 4px 0 0 4px; + + i { + color: rgb(255, 255, 255); + font-size: 20px; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/setting/SettingItem.vue b/ant-design-jeecg-vue/src/components/setting/SettingItem.vue new file mode 100644 index 0000000..8d96dd6 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/setting/SettingItem.vue @@ -0,0 +1,38 @@ +<template> + <div class="setting-drawer-index-item"> + <h3 class="setting-drawer-index-title">{{ title }}</h3> + <slot></slot> + <a-divider v-if="divider"/> + </div> +</template> + +<script> + export default { + name: "SettingItem", + props: { + title: { + type: String, + default: '' + }, + divider: { + type: Boolean, + default: false + } + } + } +</script> + +<style lang="scss" scoped> + + .setting-drawer-index-item { + margin-bottom: 24px; + + .setting-drawer-index-title { + font-size: 14px; + color: rgba(0, 0, 0, .85); + line-height: 22px; + margin-bottom: 12px; + } + + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/table/README.md b/ant-design-jeecg-vue/src/components/table/README.md new file mode 100644 index 0000000..ad5f641 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/table/README.md @@ -0,0 +1,292 @@ +Table 重封装组件说明 +==== + + +封装说明 +---- + +> 基础的使用方式与 API 与 [官方版(Table)](https://vuecomponent.github.io/ant-design-vue/components/table-cn/) 本一致,在其基础上,封装了加载数据的方法。 +> +> 你无需在你是用表格的页面进行分页逻辑处理,仅需向 Table 组件传递绑定 `:data="Promise"` 对象即可 + + + +例子1 +---- +(基础使用) + +```vue + +<template> + <s-table + ref="table" + :rowKey="(record) => record.data.id" + size="default" + :columns="columns" + :data="loadData" + > + </s-table> +</template> + +<script> + import STable from '@/components/table/' + + export default { + components: { + STable + }, + data() { + return { + columns: [ + { + title: '规则编号', + dataIndex: 'no' + }, + { + title: '描述', + dataIndex: 'description' + }, + { + title: '服务调用次数', + dataIndex: 'callNo', + sorter: true, + needTotal: true, + customRender: (text) => text + ' 次' + }, + { + title: '状态', + dataIndex: 'status', + needTotal: true + }, + { + title: '更新时间', + dataIndex: 'updatedAt', + sorter: true + } + ], + // 查询条件参数 + queryParam: {}, + // 加载数据方法 必须为 Promise 对象 + loadData: parameter => { + return this.$http.get('/service', { + params: Object.assign(parameter, this.queryParam) + }).then(res => { + return res.result + }) + }, + } + } + } +</script> + +``` + + + +例子2 +---- + +(简单的表格,最后一列是各种操作) + +```vue +<template> + <s-table + ref="table" + size="default" + :columns="columns" + :data="loadData" + > + <span slot="action" slot-scope="text, record"> + <a>编辑</a> + <a-divider type="vertical"/> + <a-dropdown> + <a class="ant-dropdown-link"> + 更多 <a-icon type="down"/> + </a> + <a-menu slot="overlay"> + <a-menu-item> + <a href="javascript:;">1st menu item</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">2nd menu item</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">3rd menu item</a> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + </s-table> +</template> + +<script> + import STable from '@/components/table/' + + export default { + components: { + STable + }, + data() { + return { + columns: [ + { + title: '规则编号', + dataIndex: 'no' + }, + { + title: '描述', + dataIndex: 'description' + }, + { + title: '服务调用次数', + dataIndex: 'callNo', + }, + { + title: '状态', + dataIndex: 'status', + }, + { + title: '更新时间', + dataIndex: 'updatedAt', + }, + { + table: '操作', + dataIndex: 'action', + scopedSlots: {customRender: 'action'}, + } + ], + // 查询条件参数 + queryParam: {}, + // 加载数据方法 必须为 Promise 对象 + loadData: parameter => { + return this.$http.get('/service', { + params: Object.assign(parameter, this.queryParam) + }).then(res => { + return res.result + }) + }, + } + }, + methods: { + edit(row) { + // axios 发送数据到后端 修改数据成功后 + // 调用 refresh() 重新加载列表数据 + // 这里 setTimeout 模拟发起请求的网络延迟.. + setTimeout(() => { + this.$refs.table.refresh() + }, 1500) + + } + } + } +</script> +``` + + + +内置方法 +---- + +通过 `this.$refs.table` 调用 + +`this.$refs.table.refresh()` 刷新列表 (用户新增/修改数据后,重载列表数据) + +> 注意:要调用 `refresh()` 需要给表格组件设定 `ref` 值 + + + +注意事项 +---- + +> 你可能需要为了与后端提供的接口返回结果一致而去修改以下代码: +(需要注意的是,这里的修改是全局性的,意味着整个项目所有使用该 table 组件都需要遵守这个返回结果定义的字段。) + +修改 `@/components/table/index.js` 第 106 行起 + + + +```javascript +result.then(r => { + this.localPagination = Object.assign({}, this.localPagination, { + current: r.pageNo, // 返回结果中的当前分页数 + total: r.totalCount, // 返回结果中的总记录数 + showSizeChanger: this.showSizeChanger, + pageSize: (pagination && pagination.pageSize) || + this.localPagination.pageSize + }); + + !r.totalCount && ['auto', false].includes(this.showPagination) && (this.localPagination = false) + this.localDataSource = r.data; // 返回结果中的数组数据 + this.localLoading = false +}); +``` +返回 JSON 例子: +```json +{ + "message": "", + "result": { + "data": [{ + id: 1, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', + title: 'Alipay', + description: '那是一种内在的东西, 他们到达不了,也无法触及的', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 2, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', + title: 'Angular', + description: '希望是一个好东西,也许是最好的,好东西是不会消亡的', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 3, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', + title: 'Ant Design', + description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 4, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', + title: 'Ant Design Pro', + description: '那时候我只会想自己想要什么,从不想自己拥有什么', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 5, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', + title: 'Bootstrap', + description: '凛冬将至', + status: 1, + updatedAt: '2018-07-26 00:00:00' + }, + { + id: 6, + cover: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', + title: 'Vue', + description: '生命就像一盒巧克力,结果往往出人意料', + status: 1, + updatedAt: '2018-07-26 00:00:00' + } + ], + "pageSize": 10, + "pageNo": 0, + "totalPage": 6, + "totalCount": 57 + }, + "status": 200, + "timestamp": 1534955098193 +} +``` + + + +更新时间 +---- + +该文档最后更新于: 2018-10-31 PM 08:15 \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/table/StandardTable.vue b/ant-design-jeecg-vue/src/components/table/StandardTable.vue new file mode 100644 index 0000000..bc6044a --- /dev/null +++ b/ant-design-jeecg-vue/src/components/table/StandardTable.vue @@ -0,0 +1,252 @@ +<template> + <div class="standard-table"> + <div class="alert"> + <a-alert type="info" :show-icon="true"> + <div slot="message"> + 已选择 <a style="font-weight: 600">{{ selectedRows.length }}</a> + <template v-for="(item, index) in needTotalList" v-if="item.needTotal"> + {{ item.title }} 总计 + <a :key="index" style="font-weight: 600"> + {{ item.customRender ? item.customRender(item.total) : item.total }} + </a> + </template> + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + </a-alert> + </div> + <a-table + :size="size" + :bordered="bordered" + :loading="loading" + :columns="columns" + :dataSource="current" + :rowKey="rowKey" + :pagination="pagination" + :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: updateSelect }" + > + </a-table> + </div> +</template> + +<script> + export default { + name: "StandardTable", + // props: ['bordered', 'loading', 'columns', 'data', 'rowKey', 'pagination', 'selectedRows'], + props: { + + /** + * 数据加载函数,返回值必须是 Promise + * 默认情况下必须传递 data 参数; + * 如果使用本地数据渲染表格,业务代码中将获取本地数据包装为 Promise 即可。 + * + * currentData 用于向外暴露表格当前渲染的数据, + * 业务开发中也可以直接修改 currentData,从而重新渲染表格(仅推荐用于客户端排序、数据过滤等场景) + */ + data: { + type: Function, + required: true + }, + dataSource: { + type: Array, + default () { + return [] + } + }, + columns: { + type: Array, + required: true + }, +/* pagination: { + type: Object, + default () { + return {} + } + },*/ + pageSize: { + type: Number, + default: 10 + }, + pageNum: { + type: Number, + default: 1 + }, + pageSizeOptions: { + type: Array, + default () { + return ['10', '20', '30', '40', '50'] + } + }, + responseParamsName: { + type: Object, + default () { + return {} + } + }, + bordered: { + type: Boolean, + default: false + }, + /** + * 表格大小风格,default, middle, small + */ + size: { + type: String, + default: 'default' + }, + rowKey: { + type: String, + default: '' + }, + selectedRows: { + type: Array, + default: null + } + }, + data () { + return { + needTotalList: [], + selectedRowKeys: [], + + loading: true, + + total: 0, + pageNumber: this.pageNum, + currentPageSize: this.pageSize, + defaultCurrent: 1, + sortParams: {}, + + current: [], + pagination: {}, + paramsName: {}, + } + }, + created () { + //数据请求参数配置 + this.paramsName = Object.assign( + {}, + { + pageNumber: "pageNo", + pageSize: "pageSize", + total: "totalCount", + results: "data", + sortColumns: "sortColumns" + }, + this.responseParamsName + ); + + this.needTotalList = this.initTotalList(this.columns) + + // load data + this.loadData( { pageNum: this.pageNumber } ) + }, + methods: { + updateSelect (selectedRowKeys, selectedRows) { + this.selectedRowKeys = selectedRowKeys + let list = this.needTotalList + this.needTotalList = list.map(item => { + return { + ...item, + total: selectedRows.reduce((sum, val) => { + return sum + val[item.dataIndex] + }, 0) + } + }) + this.$emit('change', selectedRowKeys, selectedRows) + }, + initTotalList (columns) { + const totalList = [] + columns.forEach(column => { + if (column.needTotal) { + totalList.push({ ...column, total: 0 }) + } + }) + return totalList + }, + + loadData (params) { + let that = this + that.loading = true + params = Object.assign({}, params) + const remoteParams = Object.assign({}, that.sortParams) + remoteParams[that.paramsName.pageNumber] = params.pageNum || that.pageNumber + remoteParams[that.paramsName.pageSize] = params.pageSize || that.currentPageSize + + if (params.pageNum) { + that.pageNumber = params.pageNum + } + if (params.pageSize) { + that.currentPageSize = params.pageSize + } + + let dataPromise = that.data(remoteParams) + + dataPromise.then( response => { + if (!response) { + that.loading = false + return + } + let results = response[that.paramsName.results] + results = (results instanceof Array && results) || [] + + that.current = results + + that.$emit("update:currentData", that.current.slice()) + that.$emit("dataloaded", that.current.slice()) + + that.total = response[that.paramsName.total] * 1 + that.pagination = that.pager() + that.loading = false + }, () => { + // error callback + that.loading = false + }) + }, + // eslint-disable-next-line + onPagerChange (page, pageSize) { + this.pageNumber = page + this.loadData({ pageNum: page }) + }, + onPagerSizeChange (current, size) { + this.currentPageSize = size + /* + if (current === this.pageNumber) this.loadData() + console.log('page-size-change', current, size) + */ + }, + onClearSelected () { + this.selectedRowKeys = [] + this.updateSelect([], []) + }, + pager () { + return { + total: this.total, + showTotal: total => `共有 ${total} 条`, + showSizeChanger: true, + pageSizeOptions: this.pageSizeOptions, + pageSize: this.pageSize, + defaultCurrent: this.defaultCurrent, + onChange: this.onPagerChange, + onShowSizeChange: this.onPagerSizeChange + } + } + }, + watch: { + 'selectedRows': function (selectedRows) { + this.needTotalList = this.needTotalList.map(item => { + return { + ...item, + total: selectedRows.reduce( (sum, val) => { + return sum + val[item.dataIndex] + }, 0) + } + }) + } + } + } +</script> + +<style scoped> + .alert { + margin-bottom: 16px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/table/index.js b/ant-design-jeecg-vue/src/components/table/index.js new file mode 100644 index 0000000..a2da3b0 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/table/index.js @@ -0,0 +1,265 @@ +import T from "ant-design-vue/es/table/Table"; +import get from "lodash.get" +export default { + data() { + return { + needTotalList: [], + + selectedRows: [], + selectedRowKeys: [], + + localLoading: false, + localDataSource: [], + localPagination: Object.assign({}, T.props.pagination) + }; + }, + props: Object.assign({}, T.props, { + rowKey: { + type: [String, Function], + default: 'id' + }, + data: { + type: Function, + required: true + }, + pageNum: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 10 + }, + showSizeChanger: { + type: Boolean, + default: true + }, + showAlertInfo: { + type: Boolean, + default: false + }, + showPagination: { + default: 'auto' + } + }), + watch: { + 'localPagination.current'(val) { + this.$router.push({ + name: this.$route.name, + params: Object.assign({}, this.$route.params, { + pageNo: val + }), + }); + }, + pageNum(val) { + Object.assign(this.localPagination, { + current: val + }); + }, + pageSize(val) { + console.log('pageSize:', val) + Object.assign(this.localPagination, { + pageSize: val + }); + }, + showSizeChanger(val) { + console.log('showSizeChanger', val) + Object.assign(this.localPagination, { + showSizeChanger: val + }); + } + }, + created() { + this.localPagination = ['auto', true].includes(this.showPagination) && Object.assign({}, this.localPagination, { + current: this.pageNum, + pageSize: this.pageSize, + showSizeChanger: this.showSizeChanger + }); + this.needTotalList = this.initTotalList(this.columns) + this.loadData(); + }, + methods: { + refresh() { + this.loadData(); + }, + loadData(pagination, filters, sorter) { + + this.localLoading = true + var result = this.data( + Object.assign({ + pageNo: (pagination && pagination.current) || + this.localPagination.current, + pageSize: (pagination && pagination.pageSize) || + this.localPagination.pageSize + }, + (sorter && sorter.field && { + sortField: sorter.field + }) || {}, + (sorter && sorter.order && { + sortOrder: sorter.order + }) || {}, { + ...filters + } + ) + ); + + if (result instanceof Promise) { + result.then(r => { + this.localPagination = Object.assign({}, this.localPagination, { + current: r.pageNo, // 返回结果中的当前分页数 + total: r.totalCount, // 返回结果中的总记录数 + showSizeChanger: this.showSizeChanger, + pageSize: (pagination && pagination.pageSize) || + this.localPagination.pageSize + }); + + !r.totalCount && ['auto', false].includes(this.showPagination) && (this.localPagination = false) + this.localDataSource = r.data; // 返回结果中的数组数据 + this.localLoading = false + }); + } + }, + initTotalList(columns) { + const totalList = [] + columns && columns instanceof Array && columns.forEach(column => { + if (column.needTotal) { + totalList.push({ ...column, + total: 0 + }) + } + }) + return totalList + }, + updateSelect(selectedRowKeys, selectedRows) { + this.selectedRowKeys = selectedRowKeys + this.selectedRows = selectedRows + let list = this.needTotalList + this.needTotalList = list.map(item => { + return { + ...item, + total: selectedRows.reduce((sum, val) => { + let total = sum + get(val, item.dataIndex) + return isNaN(total) ? 0 : total + }, 0) + } + }) + // this.$emit('change', selectedRowKeys, selectedRows) + }, + updateEdit() { + this.selectedRows = [] + }, + onClearSelected() { + this.selectedRowKeys = [] + this.updateSelect([], []) + }, + renderMsg(h) { + const _vm = this + let d = [] + // 构建 已选择 + d.push( + h('span', { + style: { + marginRight: '12px' + } + }, ['已选择 ', h('a', { + style: { + fontWeight: 600 + } + }, this.selectedRows.length)]) + ); + + // 构建 列统计 + this.needTotalList.map(item => { + d.push(h('span', { + style: { + marginRight: '12px' + } + }, + [ + `${ item.title }总计 `, + h('a', { + style: { + fontWeight: 600 + } + }, `${ !item.customRender ? item.total : item.customRender(item.total) }`) + ])) + }); + + // 构建 清空选择 + d.push(h('a', { + style: { + marginLeft: '24px' + }, + on: { + click: _vm.onClearSelected + } + }, '清空')) + + return d + }, + renderAlert(h) { + return h('span', { + slot: 'message' + }, this.renderMsg(h)) + }, + }, + + render(h) { + const _vm = this + + let props = {}, + localKeys = Object.keys(this.$data); + + Object.keys(T.props).forEach(k => { + let localKey = `local${k.substring(0,1).toUpperCase()}${k.substring(1)}`; + if (localKeys.includes(localKey)) { + return props[k] = _vm[localKey]; + } + return props[k] = _vm[k]; + }) + + + // 显示信息提示 + if (this.showAlertInfo) { + + props.rowSelection = { + selectedRowKeys: this.selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + _vm.updateSelect(selectedRowKeys, selectedRows) + _vm.$emit('onSelect', { selectedRowKeys: selectedRowKeys, selectedRows: selectedRows }) + } + }; + + return h('div', {}, [ + h("a-alert", { + style: { + marginBottom: '16px' + }, + props: { + type: 'info', + showIcon: true + } + }, [_vm.renderAlert(h)]), + h("a-table", { + tag: "component", + attrs: props, + on: { + change: _vm.loadData + }, + scopedSlots: this.$scopedSlots + }, this.$slots.default) + ]); + + } + + return h("a-table", { + tag: "component", + attrs: props, + on: { + change: _vm.loadData + }, + scopedSlots: this.$scopedSlots + }, this.$slots.default); + + } +}; \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/tools/Breadcrumb.vue b/ant-design-jeecg-vue/src/components/tools/Breadcrumb.vue new file mode 100644 index 0000000..25e9cbc --- /dev/null +++ b/ant-design-jeecg-vue/src/components/tools/Breadcrumb.vue @@ -0,0 +1,48 @@ +<template> + <a-breadcrumb class="breadcrumb"> + <a-breadcrumb-item v-for="(item, index) in breadList" :key="index"> + <router-link v-if="item.name != name" :to="{ path: item.path }"> + {{ item.meta.title }} + </router-link> + <span v-else>{{ item.meta.title }}</span> + </a-breadcrumb-item> + </a-breadcrumb> +</template> + +<script> +export default { + data() { + return { + name: '', + breadList: [], + } + }, + created () { + this.getBreadcrumb() + }, + methods: { + getBreadcrumb() { + + console.log('this.$route.matched', this.$route.matched) + + this.breadList = [] + this.breadList.push({ name: 'dashboard', path: '/dashboard/', meta: { title: '首页' } }) + + this.name = this.$route.name + this.$route.matched.forEach((item) => { + // item.meta.name === 'dashboard' ? item.path = '/dashboard' : this.$route.path === item.path + this.breadList.push(item) + }) + } + }, + watch: { + $route() { + this.getBreadcrumb() + } + } +} +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/tools/DetailList.vue b/ant-design-jeecg-vue/src/components/tools/DetailList.vue new file mode 100644 index 0000000..16530ad --- /dev/null +++ b/ant-design-jeecg-vue/src/components/tools/DetailList.vue @@ -0,0 +1,147 @@ +<template> + <div :class="['detail-list', size, layout === 'vertical' ? 'vertical': 'horizontal']"> + <div v-if="title" class="title">{{ title }}</div> + <a-row> + <slot></slot> + </a-row> + </div> +</template> + +<script> + import { Col } from 'ant-design-vue/es/grid/' + + const Item = { + name: 'DetailListItem', + props: { + term: { + type: String, + default: '', + required: false + }, + }, + inject: { + col: { + type: Number + } + }, + render () { + return ( + <Col {...{props: responsive[this.col]}}> + <div class="term">{this.$props.term}</div> + <div class="content">{this.$slots.default}</div> + </Col> + ) + } + } + + const responsive = { + 1: { xs: 24 }, + 2: { xs: 24, sm: 12 }, + 3: { xs: 24, sm: 12, md: 8 }, + 4: { xs: 24, sm: 12, md: 6 } + } + + export default { + name: "DetailList", + Item: Item, + components: { + Col + }, + props: { + title: { + type: String, + default: '', + required: false + }, + col: { + type: Number, + required: false, + default: 3 + }, + size: { + type: String, + required: false, + default: 'large' + }, + layout: { + type: String, + required: false, + default: 'horizontal' + } + }, + provide () { + return { + col: this.col > 4 ? 4 : this.col + } + } + } +</script> + +<style lang="scss"> + + .detail-list { + + .title { + color: rgba(0,0,0,.85); + font-size: 14px; + font-weight: 500; + margin-bottom: 16px; + } + + .term { + color: rgba(0,0,0,.85); + display: table-cell; + line-height: 20px; + margin-right: 8px; + padding-bottom: 16px; + white-space: nowrap; + + &:after { + content: ":"; + margin: 0 8px 0 2px; + position: relative; + top: -.5px; + } + } + + .content { + color: rgba(0,0,0,.65); + display: table-cell; + line-height: 22px; + padding-bottom: 16px; + width: 100%; + } + + &.small { + + .title { + font-size: 14px; + color: rgba(0, 0, 0, .65); + font-weight: normal; + margin-bottom: 12px; + } + .term, .content { + padding-bottom: 8px; + } + } + + &.large { + .term, .content { + padding-bottom: 16px; + } + + .title { + font-size: 16px; + } + } + + &.vertical { + .term { + padding-bottom: 8px; + } + .term, .content { + display: block; + } + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/tools/FooterToolBar.vue b/ant-design-jeecg-vue/src/components/tools/FooterToolBar.vue new file mode 100644 index 0000000..82d77b1 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/tools/FooterToolBar.vue @@ -0,0 +1,32 @@ +<template> + <div class="toolbar"> + <div style="float: left"> + <slot name="extra"></slot> + </div> + <div style="float: right"> + <slot></slot> + </div> + </div> +</template> + +<script> + export default { + name: "FooterToolBar" + } +</script> + +<style lang="scss" scoped> + .toolbar { + position: fixed; + width: 100%; + bottom: 0; + right: 0; + height: 56px; + line-height: 56px; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.03); + background: #fff; + border-top: 1px solid #e8e8e8; + padding: 0 24px; + z-index: 9; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/tools/HeadInfo.vue b/ant-design-jeecg-vue/src/components/tools/HeadInfo.vue new file mode 100644 index 0000000..c9fd462 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/tools/HeadInfo.vue @@ -0,0 +1,67 @@ +<template> + <div class="head-info" :class="center && 'center'"> + <span>{{ title }}</span> + <p>{{ content }}</p> + <em v-if="bordered"/> + </div> +</template> + +<script> + export default { + name: "HeadInfo", + props: { + title: { + type: String, + default: '' + }, + content: { + type: String, + default: '' + }, + bordered: { + type: Boolean, + default: false + }, + center: { + type: Boolean, + default: true + } + } + } +</script> + +<style lang="scss" scoped> + .head-info { + position: relative; + text-align: left; + padding: 0 32px 0 0; + min-width: 125px; + + &.center { + text-align: center; + padding: 0 32px; + } + + span { + color: rgba(0, 0, 0, .45); + display: inline-block; + font-size: 14px; + line-height: 22px; + margin-bottom: 4px; + } + p { + color: rgba(0, 0, 0, .85); + font-size: 24px; + line-height: 32px; + margin: 0; + } + em { + background-color: #e8e8e8; + position: absolute; + height: 56px; + width: 1px; + top: 0; + right: 0; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/tools/HeaderNotice.vue b/ant-design-jeecg-vue/src/components/tools/HeaderNotice.vue new file mode 100644 index 0000000..8662428 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/tools/HeaderNotice.vue @@ -0,0 +1,85 @@ +<template> + <a-popover + trigger="click" + placement="bottomRight" + :autoAdjustOverflow="true" + :arrowPointAtCenter="true" + overlayClassName="header-notice-wrapper" + :overlayStyle="{ width: '300px', top: '50px' }"> + <template slot="content"> + <a-spin :spinning="loadding"> + <a-tabs> + <a-tab-pane tab="通知" key="1"> + <a-list> + <a-list-item> + <a-list-item-meta title="你收到了 14 份新周报" description="一年前"> + <a-avatar style="background-color: white" slot="avatar" src="https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png"/> + </a-list-item-meta> + </a-list-item> + <a-list-item> + <a-list-item-meta title="你推荐的 曲妮妮 已通过第三轮面试" description="一年前"> + <a-avatar style="background-color: white" slot="avatar" src="https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png"/> + </a-list-item-meta> + </a-list-item> + <a-list-item> + <a-list-item-meta title="这种模板可以区分多种通知类型" description="一年前"> + <a-avatar style="background-color: white" slot="avatar" src="https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png"/> + </a-list-item-meta> + </a-list-item> + </a-list> + </a-tab-pane> + <a-tab-pane tab="消息" key="2"> + 123 + </a-tab-pane> + <a-tab-pane tab="待办" key="3"> + 123 + </a-tab-pane> + </a-tabs> + </a-spin> + </template> + <span @click="fetchNotice" class="header-notice"> + <a-badge count="12"> + <a-icon style="font-size: 16px; padding: 4px" type="bell" /> + </a-badge> + </span> + </a-popover> +</template> + +<script> + export default { + name: "HeaderNotice", + data () { + return { + loadding: false + } + }, + methods: { + fetchNotice () { + if (this.loadding) { + this.loadding = false + return + } + this.loadding = true + setTimeout(() => { + this.loadding = false + }, 2000) + } + } + } +</script> + +<style lang="css"> + .header-notice-wrapper { + top: 50px !important; + } +</style> +<style lang="scss" scoped> + .header-notice{ + display: inline-block; + transition: all 0.3s; + + span { + vertical-align: initial; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/tools/Logo.vue b/ant-design-jeecg-vue/src/components/tools/Logo.vue new file mode 100644 index 0000000..68c71b8 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/tools/Logo.vue @@ -0,0 +1,33 @@ +<template> + <div class="logo"> + <router-link :to="{name:'dashboard'}"> + <img src="~@/assets/logo.svg" alt="logo"> + <h1 v-if="showTitle">{{ title }}</h1> + </router-link> + </div> +</template> + +<script> + export default { + name: "Logo", + props: { + title: { + type: String, + default: 'Jeecg-Boot Pro', + required: false + }, + showTitle: { + type: Boolean, + default: true, + required: false + } + } + } +</script> +<style lang="scss" scoped> + /*缩小首页布 局顶部的高度*/ + .sider .logo { + height: 59px!important; + line-height: 59px!important; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/tools/TwoStepCaptcha.vue b/ant-design-jeecg-vue/src/components/tools/TwoStepCaptcha.vue new file mode 100644 index 0000000..52c93a0 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/tools/TwoStepCaptcha.vue @@ -0,0 +1,89 @@ +<template> + <!-- 两步验证 --> + <a-modal + centered + v-model="visible" + @cancel="handleCancel" + :maskClosable="false" + > + <div slot="title" :style="{ textAlign: 'center' }">两步验证</div> + <template slot="footer"> + <div :style="{ textAlign: 'center' }"> + <a-button key="back" @click="handleCancel">返回</a-button> + <a-button key="submit" type="primary" :loading="stepLoading" @click="handleStepOk"> + 继续 + </a-button> + </div> + </template> + + <a-spin :spinning="stepLoading"> + <a-form layout="vertical" :auto-form-create="(form)=>{this.form = form}"> + <div class="step-form-wrapper"> + <p style="text-align: center" v-if="!stepLoading">请在手机中打开 Google Authenticator 或两步验证 APP<br />输入 6 位动态码</p> + <p style="text-align: center" v-else>正在验证..<br/>请稍后</p> + <a-form-item + :style="{ textAlign: 'center' }" + hasFeedback + fieldDecoratorId="stepCode" + :fieldDecoratorOptions="{rules: [{ required: true, message: '请输入 6 位动态码!', pattern: /^\d{6}$/, len: 6 }]}" + > + <a-input :style="{ textAlign: 'center' }" @keyup.enter.native="handleStepOk" placeholder="000000" /> + </a-form-item> + <p style="text-align: center"> + <a @click="onForgeStepCode">遗失手机?</a> + </p> + </div> + </a-form> + </a-spin> + </a-modal> +</template> + +<script> +export default { + props: { + visible: { + type: Boolean, + default: false + } + }, + data() { + return { + stepLoading: false, + + form: null + }; + }, + methods: { + handleStepOk() { + const vm = this + this.stepLoading = true + this.form.validateFields((err, values) => { + if (!err) { + console.log('values', values) + setTimeout( () => { + vm.stepLoading = false + vm.$emit('success', { values }) + }, 2000) + return; + } + this.stepLoading = false + this.$emit('error', { err }) + }) + }, + handleCancel () { + this.visible = false + this.$emit('cancel') + }, + onForgeStepCode() { + + } + } +}; +</script> +<style lang="scss" scoped> + .step-form-wrapper { + margin: 0 auto; + width: 80%; + max-width: 400px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/tools/UserMenu.vue b/ant-design-jeecg-vue/src/components/tools/UserMenu.vue new file mode 100644 index 0000000..70d9c6f --- /dev/null +++ b/ant-design-jeecg-vue/src/components/tools/UserMenu.vue @@ -0,0 +1,93 @@ +<template> + <div class="user-wrapper"> + <span class="action"> + <a-icon type="question-circle-o"></a-icon> + </span> + <header-notice class="action"/> + <a-dropdown> + <span class="action ant-dropdown-link user-dropdown-menu"> + <a-avatar class="avatar" size="small" :src="getAvatar()"/> + <span>欢迎您,{{ nickname() }}</span> + </span> + <a-menu slot="overlay" class="user-dropdown-menu-wrapper"> + <a-menu-item key="0"> + <router-link :to="{ name: 'account-center' }"> + <a-icon type="user"/> + <span>个人中心</span> + </router-link> + </a-menu-item> + <a-menu-item key="1"> + <router-link :to="{ name: 'account-settings' }"> + <a-icon type="setting"/> + <span>账户设置</span> + </router-link> + </a-menu-item> + <!-- <a-menu-item key="2" disabled> + <a-icon type="setting"/> + <span>测试</span> + </a-menu-item> + <a-menu-divider/> + <a-menu-item key="3"> + <a href="javascript:;" @click="handleLogout"> + <a-icon type="logout"/> + <span>退出登录</span> + </a> + </a-menu-item>--> + </a-menu> + </a-dropdown> + <span class="action"> + <a class="logout_title" href="javascript:;" @click="handleLogout"> + <a-icon type="logout"/> + <span> 退出登录</span> + </a> + </span> + </div> +</template> + +<script> + import HeaderNotice from './HeaderNotice' + import { mapActions, mapGetters } from 'vuex' + import {imgView} from '@/api/api' + + export default { + name: "UserMenu", + components: { + HeaderNotice + }, + methods: { + ...mapActions(["Logout"]), + ...mapGetters(["nickname", "avatar"]), + getAvatar(){ + console.log('url = '+ imgView+this.avatar()) + return imgView+this.avatar() + }, + handleLogout() { + const that = this + + this.$confirm({ + title: '提示', + content: '真的要注销登录吗 ?', + onOk() { + return that.Logout({}).then(() => { + window.location.reload() + }).catch(err => { + that.$message.error({ + title: '错误', + description: err.message + }) + }) + }, + onCancel() { + }, + }); + }, + } + } +</script> + +<style scoped> + .logout_title{ + color: rgba(0, 0, 0, 0.65); + text-decoration:none; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/tools/setting.js b/ant-design-jeecg-vue/src/components/tools/setting.js new file mode 100644 index 0000000..8e41253 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/tools/setting.js @@ -0,0 +1,95 @@ +import { message } from 'ant-design-vue/es'; +// import defaultSettings from '../defaultSettings'; + +let lessNodesAppended; + +const colorList = [ + { + key: '薄暮', color: '#F5222D', + }, + { + key: '火山', color: '#FA541C', + }, + { + key: '日暮', color: '#FAAD14', + }, + { + key: '明青', color: '#13C2C2', + }, + { + key: '极光绿', color: '#52C41A', + }, + { + key: '拂晓蓝(默认)', color: '#1890FF', + }, + { + key: '极客蓝', color: '#2F54EB', + }, + { + key: '酱紫', color: '#722ED1', + }, +]; + +const updateTheme = primaryColor => { + // Don't compile less in production! + /* if (process.env.NODE_ENV === 'production') { + return; + } */ + // Determine if the component is remounted + if (!primaryColor) { + return; + } + const hideMessage = message.loading('正在编译主题!', 0); + function buildIt() { + if (!window.less) { + return; + } + setTimeout(() => { + window.less + .modifyVars({ + '@primary-color': primaryColor, + }) + .then(() => { + hideMessage(); + }) + .catch(() => { + message.error('Failed to update theme'); + hideMessage(); + }); + }, 200); + } + if (!lessNodesAppended) { + // insert less.js and color.less + const lessStyleNode = document.createElement('link'); + const lessConfigNode = document.createElement('script'); + const lessScriptNode = document.createElement('script'); + lessStyleNode.setAttribute('rel', 'stylesheet/less'); + lessStyleNode.setAttribute('href', '/color.less'); + lessConfigNode.innerHTML = ` + window.less = { + async: true, + env: 'production', + javascriptEnabled: true + }; + `; + lessScriptNode.src = 'https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js'; + lessScriptNode.async = true; + lessScriptNode.onload = () => { + buildIt(); + lessScriptNode.onload = null; + }; + document.body.appendChild(lessStyleNode); + document.body.appendChild(lessConfigNode); + document.body.appendChild(lessScriptNode); + lessNodesAppended = true; + } else { + buildIt(); + } +}; + +const updateColorWeak = colorWeak => { + // document.body.className = colorWeak ? 'colorWeak' : ''; + colorWeak ? document.body.classList.add('colorWeak') : document.body.classList.remove('colorWeak') +}; + +export { updateTheme, colorList, updateColorWeak } \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/config/router.config.js b/ant-design-jeecg-vue/src/config/router.config.js new file mode 100644 index 0000000..a7e2546 --- /dev/null +++ b/ant-design-jeecg-vue/src/config/router.config.js @@ -0,0 +1,394 @@ +import { UserLayout, TabLayout, RouteView, BlankLayout, PageView } from '@/components/layouts' + +/** + * 走菜单,走权限控制 + * @type {[null,null]} + */ +export const asyncRouterMap = [ + + { + path: '/', + name: 'index', + component: TabLayout, + meta: { title: '首页' }, + redirect: '/dashboard/workplace', + children: [ + + //系统管理 + { + path: '/system', + name: 'system', + redirect: '/isystem/user', + component: RouteView, + meta: { title: '系统管理', icon: 'dashboard', permission: [ 'dashboard' ] }, + children: [ + { + path: '/system/user', + name: 'user', + component: () => import('@/views/system/UserList'), + meta: { title: '用户管理', permission: [ 'dashboard' ] } + }, + + { + path: '/system/role', + name: 'role', + component: () => import('@/views/system/RoleList'), + meta: { title: '角色管理', permission: [ 'dashboard' ] } + }, + { + path: '/system/log', + name: 'log', + component: () => import('@/views/system/LogList'), + meta: { title: '日志管理', permission: [ 'dashboard' ] } + }, + + + ] + }, + + // dashboard + { + path: '/dashboard', + name: 'dashboard', + redirect: '/dashboard/workplace', + component: RouteView, + meta: { title: '仪表盘', icon: 'dashboard', permission: [ 'dashboard' ] }, + children: [ + { + path: '/dashboard/analysis', + name: 'Analysis', + component: () => import('@/views/dashboard/Analysis'), + meta: { title: '分析页', permission: [ 'dashboard' ] } + }, + { + path: '/dashboard/monitor', + name: 'Monitor', + hidden: true, + component: () => import('@/views/dashboard/Monitor'), + meta: { title: '监控页', permission: [ 'dashboard' ] } + }, + { + path: '/dashboard/workplace', + name: 'Workplace', + component: () => import('@/views/dashboard/Workplace'), + meta: { title: '工作台', permission: [ 'dashboard' ] } + } + ] + }, + + //jeecg + { + path: '/jeecg', + name: 'jeecg', + redirect: '/jeecg', + component: RouteView, + meta: { title: 'JEECG案例', icon: 'dashboard', permission: [ 'dashboard' ] }, + children: [ + { + path: '/jeecg/JeecgDemoList', + name: 'DemoList', + component: () => import('@/views/jeecg/JeecgDemoList'), + meta: { title: '列表例子', permission: [ 'dashboard' ] } + }, + { + path: '/jeecg/helloworld', + name: 'helloworld', + hidden : true, + component: () => import('@/views/jeecg/helloworld'), + meta: { title: 'helloworld', permission: [ 'dashboard' ] } + } + ] + }, + // forms + { + path: '/form', + redirect: '/form/basic-form', + component: PageView, + meta: { title: '表单页', icon: 'form', permission: [ 'form' ] }, + children: [ + { + path: '/form/base-form', + name: 'BaseForm', + component: () => import('@/views/form/BasicForm'), + meta: { title: '基础表单', permission: [ 'form' ] } + }, + { + path: '/form/step-form', + name: 'StepForm', + component: () => import('@/views/form/stepForm/StepForm'), + meta: { title: '分步表单', permission: [ 'form' ] } + }, + { + path: '/form/advanced-form', + name: 'AdvanceForm', + component: () => import('@/views/form/advancedForm/AdvancedForm'), + meta: { title: '高级表单', permission: [ 'form' ] } + } + ] + }, + + // list + { + path: '/list', + name: 'list', + component: PageView, + redirect: '/list/query-list', + meta: { title: '列表页', icon: 'table', permission: [ 'table' ] }, + children: [ + { + path: '/list/query-list', + name: 'QueryList', + component: () => import('@/views/list/TableList'), + meta: { title: '查询表格', permission: [ 'table' ] } + }, + { + path: '/list/edit-table', + name: 'EditList', + component: () => import('@/views/list/TableInnerEditList'), + meta: { title: '内联编辑表格', permission: [ 'table' ] } + }, + { + path: '/list/user-list', + name: 'UserList', + component: () => import('@/views/list/UserList'), + meta: { title: '用户列表', permission: [ 'table' ] } + }, + { + path: '/list/role-list', + name: 'RoleList', + component: () => import('@/views/list/RoleList'), + meta: { title: '角色列表', permission: [ 'table' ] } + }, + { + path: '/list/permission-list', + name: 'PermissionList', + component: () => import('@/views/list/PermissionList'), + meta: { title: '权限列表', permission: [ 'table' ] } + }, + { + path: '/list/basic-list', + name: 'BasicList', + component: () => import('@/views/list/StandardList'), + meta: { title: '标准列表', permission: [ 'table' ] } + }, + { + path: '/list/card', + name: 'CardList', + component: () => import('@/views/list/CardList'), + meta: { title: '卡片列表', permission: [ 'table' ] } + }, + { + path: '/list/search', + name: 'SearchList', + component: () => import('@/views/list/search/SearchLayout'), + redirect: '/list/search/article', + meta: { title: '搜索列表', permission: [ 'table' ] }, + children: [ + { + path: '/list/search/article', + name: 'SearchArticles', + component: () => import('../views/list/TableList'), + meta: { title: '搜索列表(文章)', permission: [ 'table' ] } + }, + { + path: '/list/search/project', + name: 'SearchProjects', + component: () => import('../views/list/TableList'), + meta: { title: '搜索列表(项目)', permission: [ 'table' ] } + }, + { + path: '/list/search/application', + name: 'SearchApplications', + component: () => import('../views/list/TableList'), + meta: { title: '搜索列表(应用)', permission: [ 'table' ] } + }, + ] + }, + ] + }, + + // profile + { + path: '/profile', + name: 'profile', + component: RouteView, + redirect: '/profile/basic', + meta: { title: '详情页', icon: 'profile', permission: [ 'profile' ] }, + children: [ + { + path: '/profile/basic', + name: 'ProfileBasic', + component: () => import('@/views/profile/basic/Index'), + meta: { title: '基础详情页', permission: [ 'profile' ] } + }, + { + path: '/profile/advanced', + name: 'ProfileAdvanced', + component: () => import('@/views/profile/advanced/Advanced'), + meta: { title: '高级详情页', permission: [ 'profile' ] } + } + ] + }, + + // result + { + path: '/result', + name: 'result', + component: PageView, + redirect: '/result/success', + meta: { title: '结果页', icon: 'check-circle-o', permission: [ 'result' ] }, + children: [ + { + path: '/result/success', + name: 'ResultSuccess', + component: () => import(/* webpackChunkName: "result" */ '@/views/result/Success'), + meta: { title: '成功', hiddenHeaderContent: true, permission: [ 'result' ] } + }, + { + path: '/result/fail', + name: 'ResultFail', + component: () => import(/* webpackChunkName: "result" */ '@/views/result/Error'), + meta: { title: '失败', hiddenHeaderContent: true, permission: [ 'result' ] } + } + ] + }, + + // Exception + { + path: '/exception', + name: 'exception', + component: RouteView, + redirect: '/exception/403', + meta: { title: '异常页', icon: 'warning', permission: [ 'exception' ] }, + children: [ + { + path: '/exception/403', + name: 'Exception403', + component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/403'), + meta: { title: '403', permission: [ 'exception' ] } + }, + { + path: '/exception/404', + name: 'Exception404', + component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404'), + meta: { title: '404', permission: [ 'exception' ] } + }, + { + path: '/exception/500', + name: 'Exception500', + component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/500'), + meta: { title: '500', permission: [ 'exception' ] } + } + ] + }, + + // account + { + path: '/account', + component: RouteView, + name: 'account', + meta: { title: '个人页', icon: 'user', keepAlive: true, permission: [ 'user' ] }, + children: [ + { + path: '/account/center', + name: 'center', + component: () => import('@/views/account/center/Index'), + meta: { title: '个人中心', keepAlive: true, permission: [ 'user' ] } + }, + { + path: '/account/settings', + name: 'settings', + component: () => import('@/views/account/settings/Index'), + meta: { title: '个人设置', hideHeader: true, keepAlive: true, permission: [ 'user' ] }, + redirect: '/account/settings/base', + alwaysShow: true, + children: [ + { + path: '/account/settings/base', + name: 'BaseSettings', + component: () => import('@/views/account/settings/BaseSetting'), + meta: { title: '基本设置', hidden: true, keepAlive: true, permission: [ 'user' ] } + }, + { + path: '/account/settings/security', + name: 'SecuritySettings', + component: () => import('@/views/account/settings/Security'), + meta: { title: '安全设置', hidden: true, keepAlive: true, permission: [ 'user' ] } + }, + { + path: '/account/settings/custom', + name: 'CustomSettings', + component: () => import('@/views/account/settings/Custom'), + meta: { title: '个性化设置', hidden: true, keepAlive: true, permission: [ 'user' ] } + }, + { + path: '/account/settings/binding', + name: 'BindingSettings', + component: () => import('@/views/account/settings/Binding'), + meta: { title: '账户绑定', hidden: true, keepAlive: true, permission: [ 'user' ] } + }, + { + path: '/account/settings/notification', + name: 'NotificationSettings', + component: () => import('@/views/account/settings/Notification'), + meta: { title: '新消息通知', hidden: true, keepAlive: true, permission: [ 'user' ] } + }, + ] + }, + ] + } + ] + }, + { + path: '*', redirect: '/404', hidden: true + } +] + +/** + * 基础路由 + * @type { *[] } + */ +export const constantRouterMap = [ + { + path: '/user', + component: UserLayout, + redirect: '/user/login', + hidden: true, + children: [ + { + path: 'login', + name: 'login', + component: () => import(/* webpackChunkName: "user" */ '@/views/user/Login') + }, + { + path: 'register', + name: 'register', + component: () => import(/* webpackChunkName: "user" */ '@/views/user/Register') + }, + { + path: 'register-result', + name: 'registerResult', + component: () => import(/* webpackChunkName: "user" */ '@/views/user/RegisterResult') + } + ] + }, + + { + path: '/test', + component: BlankLayout, + redirect: '/test/home', + children: [ + { + path: 'home', + name: 'TestHome', + component: () => import('@/views/Home') + } + ] + }, + + { + path: '/404', + component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404') + }, + +] diff --git a/ant-design-jeecg-vue/src/defaultSettings.js b/ant-design-jeecg-vue/src/defaultSettings.js new file mode 100644 index 0000000..62adddd --- /dev/null +++ b/ant-design-jeecg-vue/src/defaultSettings.js @@ -0,0 +1,31 @@ +/** + * 项目默认配置项 + * primaryColor - 默认主题色 + * navTheme - sidebar theme ['dark', 'light'] 两种主题 + * colorWeak - 色盲模式 + * layout - 整体布局方式 ['sidemenu', 'topmenu'] 两种布局 + * fixedHeader - 固定 Header : boolean + * fixSiderbar - 固定左侧菜单栏 : boolean + * autoHideHeader - 向下滚动时,隐藏 Header : boolean + * contentWidth - 内容区布局: 流式 | 固定 + * + * storageOptions: {} - Vue-ls 插件配置项 (localStorage/sessionStorage) + * + */ + +export default { + primaryColor: '#1890FF', // primary color of ant design + navTheme: 'light', // theme for nav menu + layout: 'sidemenu', // nav menu position: sidemenu or topmenu + contentWidth: 'Fixed', // layout of content: Fluid or Fixed, only works when layout is topmenu + fixedHeader: false, // sticky header + fixSiderbar: false, // sticky siderbar + autoHideHeader: false, // auto hide header + colorWeak: false, + // vue-ls options + storageOptions: { + namespace: 'pro__', // key prefix + name: 'ls', // name variable Vue.[ls] or this.[$ls], + storage: 'local', // storage name session, local, memory + } +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/main.js b/ant-design-jeecg-vue/src/main.js new file mode 100644 index 0000000..31c7778 --- /dev/null +++ b/ant-design-jeecg-vue/src/main.js @@ -0,0 +1,61 @@ +import Vue from 'vue' +import App from './App.vue' +import Storage from 'vue-ls' +import router from './router' +import store from './store/' + +import { VueAxios } from "@/utils/request" + +import Antd from 'ant-design-vue' +import Viser from 'viser-vue' +import 'ant-design-vue/dist/antd.less'; // or 'ant-design-vue/dist/antd.less' + +import '@/permission' // permission control +import '@/utils/filter' // base filter +import DictSelectTag from './components/dict/index.js' +import Print from 'vue-print-nb' +/*import '@babel/polyfill'*/ + +import { + ACCESS_TOKEN, + DEFAULT_COLOR, + DEFAULT_THEME, + DEFAULT_LAYOUT_MODE, + DEFAULT_COLOR_WEAK, + SIDEBAR_TYPE, + DEFAULT_FIXED_HEADER, + DEFAULT_FIXED_HEADER_HIDDEN, + DEFAULT_FIXED_SIDEMENU, + DEFAULT_CONTENT_WIDTH_TYPE +} from "@/store/mutation-types" +import config from '@/defaultSettings' + +import hasPermission from '@/utils/hasPermission' + +Vue.config.productionTip = false + +Vue.use(Storage, config.storageOptions) +Vue.use(Antd) +Vue.use(VueAxios, router) +Vue.use(Viser) +Vue.use(hasPermission) +Vue.use(DictSelectTag) +Vue.use(Print) + +new Vue({ + router, + store, + mounted () { + store.commit('SET_SIDEBAR_TYPE', Vue.ls.get(SIDEBAR_TYPE, true)) + store.commit('TOGGLE_THEME', Vue.ls.get(DEFAULT_THEME, config.navTheme)) + store.commit('TOGGLE_LAYOUT_MODE', Vue.ls.get(DEFAULT_LAYOUT_MODE, config.layout)) + store.commit('TOGGLE_FIXED_HEADER', Vue.ls.get(DEFAULT_FIXED_HEADER, config.fixedHeader)) + store.commit('TOGGLE_FIXED_SIDERBAR', Vue.ls.get(DEFAULT_FIXED_SIDEMENU, config.fixSiderbar)) + store.commit('TOGGLE_CONTENT_WIDTH', Vue.ls.get(DEFAULT_CONTENT_WIDTH_TYPE, config.contentWidth)) + store.commit('TOGGLE_FIXED_HEADER_HIDDEN', Vue.ls.get(DEFAULT_FIXED_HEADER_HIDDEN, config.autoHideHeader)) + store.commit('TOGGLE_WEAK', Vue.ls.get(DEFAULT_COLOR_WEAK, config.colorWeak)) + store.commit('TOGGLE_COLOR', Vue.ls.get(DEFAULT_COLOR, config.primaryColor)) + store.commit('SET_TOKEN', Vue.ls.get(ACCESS_TOKEN)) + }, + render: h => h(App) +}).$mount('#app') diff --git a/ant-design-jeecg-vue/src/permission.js b/ant-design-jeecg-vue/src/permission.js new file mode 100644 index 0000000..7bfed1b --- /dev/null +++ b/ant-design-jeecg-vue/src/permission.js @@ -0,0 +1,73 @@ +import Vue from 'vue' +import router from './router' +import store from './store' +import NProgress from 'nprogress' // progress bar +import 'nprogress/nprogress.css' // progress bar style +import notification from 'ant-design-vue/es/notification' +import { ACCESS_TOKEN } from '@/store/mutation-types' +import { generateIndexRouter } from "@/utils/util" + +NProgress.configure({ showSpinner: false }) // NProgress Configuration + +const whiteList = ['/user/login', '/user/register', '/user/register-result'] // no redirect whitelist + +router.beforeEach((to, from, next) => { + NProgress.start() // start progress bar + + if (Vue.ls.get(ACCESS_TOKEN)) { + /* has token */ + if (to.path === '/user/login') { + next({ path: '/dashboard/workplace' }) + NProgress.done() + } else { + if (store.getters.permissionList.length === 0) { + store.dispatch('GetPermissionList').then(res => { + const menuData = res.result; + console.log(res.message) + if (menuData === null || menuData === "" || menuData === undefined) { + return; + } + let constRoutes = []; + constRoutes = generateIndexRouter(menuData); + // 添加主界面路由 + store.dispatch('UpdateAppRouter', { constRoutes }).then(() => { + // 根据roles权限生成可访问的路由表 + // 动态添加可访问路由表 + router.addRoutes(store.getters.addRouters) + const redirect = decodeURIComponent(from.query.redirect || to.path) + if (to.path === redirect) { + // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record + next({ ...to, replace: true }) + } else { + // 跳转到目的路由 + next({ path: redirect }) + } + }) + }) + .catch(() => { + notification.error({ + message: '系统提示', + description: '请求用户信息失败,请重试!' + }) + store.dispatch('Logout').then(() => { + next({ path: '/user/login', query: { redirect: to.fullPath } }) + }) + }) + } else { + next() + } + } + } else { + if (whiteList.indexOf(to.path) !== -1) { + // 在免登录白名单,直接进入 + next() + } else { + next({ path: '/user/login', query: { redirect: to.fullPath } }) + NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it + } + } +}) + +router.afterEach(() => { + NProgress.done() // finish progress bar +}) diff --git a/ant-design-jeecg-vue/src/router/README.md b/ant-design-jeecg-vue/src/router/README.md new file mode 100644 index 0000000..9e82538 --- /dev/null +++ b/ant-design-jeecg-vue/src/router/README.md @@ -0,0 +1,139 @@ +路由/菜单说明 +==== + + + +配置文件路径 +---- + +`@/config/router.config.js` + + + +格式和说明 +---- + +```javascript +/** + * 路由配置说明: + * 建议:sider menu 请不要超过三级菜单,若超过三级菜单,则应该设计为顶部主菜单 配合左侧次级菜单 + * + **/ + { + redirect: noredirect, + name: 'router-name', + hidden: true, + meta: { + title: 'title', + icon: 'a-icon', + keepAlive: true, + hiddenHeaderContent: true, + } +} +``` + + + +`{ Route }` 对象 + +| 参数 | 说明 | 类型 | 默认值 | +| -------- | ----------------------------------------- | ------- | ------ | +| hidden | 控制路由是否显示在 sidebar | boolean | falase | +| redirect | 重定向地址, 访问这个路由时,自定进行重定向 | string | - | +| name | 路由名称, 建议设置,且不能重名 | string | - | +| meta | 路由元信息(路由附带扩展信息) | object | {} | + + + +`{ Meta }` 路由元信息对象 + +| 参数 | 说明 | 类型 | 默认值 | +| ------------------- | ------------------------------------------------------------ | ------- | ------ | +| title | 路由标题, 用于显示面包屑, 页面标题 *推荐设置 | string | - | +| icon | 路由在 menu 上显示的图标 | string | - | +| keepAlive | 缓存该路由 | boolean | false | +| hiddenHeaderContent | *特殊 隐藏 [PageHeader](https://github.com/sendya/ant-design-pro-vue/blob/master/src/components/layout/PageHeader.vue#L14) 组件中的页面带的 面包屑和页面标题栏 | boolean | false | +| permission | 与项目提供的权限拦截匹配的权限,如果不匹配,则会被禁止访问该路由页面 | array | [] | + + + +路由例子 +---- + +```ecmascript 6 +const asyncRouterMap = [ + { + path: '/', + name: 'index', + component: BasicLayout, + meta: { title: '首页' }, + redirect: '/dashboard/analysis', + children: [ + { + path: '/dashboard', + component: Layout, + name: 'dashboard', + redirect: '/dashboard/workplace', + meta: {title: '仪表盘', icon: 'dashboard', permission: ['dashboard']}, + children: [ + { + path: '/dashboard/analysis', + name: 'Analysis', + component: () => import('@/views/dashboard/Analysis'), + meta: {title: '分析页', permission: ['dashboard']} + }, + { + path: '/dashboard/monitor', + name: 'Monitor', + hidden: true, + component: () => import('@/views/dashboard/Monitor'), + meta: {title: '监控页', permission: ['dashboard']} + }, + { + path: '/dashboard/workplace', + name: 'Workplace', + component: () => import('@/views/dashboard/Workplace'), + meta: {title: '工作台', permission: ['dashboard']} + } + ] + }, + + // result + { + path: '/result', + name: 'result', + component: PageView, + redirect: '/result/success', + meta: { title: '结果页', icon: 'check-circle-o', permission: [ 'result' ] }, + children: [ + { + path: '/result/success', + name: 'ResultSuccess', + component: () => import(/* webpackChunkName: "result" */ '@/views/result/Success'), + // 该页面隐藏面包屑和页面标题栏 + meta: { title: '成功', hiddenHeaderContent: true, permission: [ 'result' ] } + }, + { + path: '/result/fail', + name: 'ResultFail', + component: () => import(/* webpackChunkName: "result" */ '@/views/result/Error'), + // 该页面隐藏面包屑和页面标题栏 + meta: { title: '失败', hiddenHeaderContent: true, permission: [ 'result' ] } + } + ] + }, + ... + ] + }, +] +``` + +> 1. 请注意 `component: () => import('..') ` 方式引入路由的页面组件为 懒加载模式。具体可以看 [Vue 官方文档](https://router.vuejs.org/zh/guide/advanced/lazy-loading.html) +> 2. 增加新的路由应该增加在 '/' (index) 路由的 `children` 内 +> 3. `permission` 可以进行自定义修改,只需要对这个模块进行自定义修改即可 [src/store/modules/permission.js#L10](https://github.com/sendya/ant-design-pro-vue/blob/master/src/store/modules/permission.js#L10) + + + +附权限路由结构: + + \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/router/index.js b/ant-design-jeecg-vue/src/router/index.js new file mode 100644 index 0000000..bdbe374 --- /dev/null +++ b/ant-design-jeecg-vue/src/router/index.js @@ -0,0 +1,12 @@ +import Vue from 'vue' +import Router from 'vue-router' +import { constantRouterMap } from '@/config/router.config' + +Vue.use(Router) + +export default new Router({ + mode: 'history', + base: process.env.BASE_URL, + scrollBehavior: () => ({ y: 0 }), + routes: constantRouterMap +}) \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/store/getters.js b/ant-design-jeecg-vue/src/store/getters.js new file mode 100644 index 0000000..3d213a6 --- /dev/null +++ b/ant-design-jeecg-vue/src/store/getters.js @@ -0,0 +1,17 @@ +import Vue from 'vue' +import { USER_INFO} from "@/store/mutation-types" +const getters = { + device: state => state.app.device, + theme: state => state.app.theme, + color: state => state.app.color, + token: state => state.user.token, + avatar: state => {state.user.avatar = Vue.ls.get(USER_INFO).avatar; return state.user.avatar}, + username: state => state.user.username, + nickname: state => {state.user.realname = Vue.ls.get(USER_INFO).realname; return state.user.realname}, + welcome: state => state.user.welcome, + permissionList: state => state.user.permissionList, + userInfo: state => {state.user.info = Vue.ls.get(USER_INFO); return state.user.info}, + addRouters: state => state.permission.addRouters +} + +export default getters \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/store/index.js b/ant-design-jeecg-vue/src/store/index.js new file mode 100644 index 0000000..4e8529a --- /dev/null +++ b/ant-design-jeecg-vue/src/store/index.js @@ -0,0 +1,27 @@ +import Vue from 'vue' +import Vuex from 'vuex' + +import app from './modules/app' +import user from './modules/user' +import permission from './modules/permission' +import getters from './getters' + +Vue.use(Vuex) + +export default new Vuex.Store({ + modules: { + app, + user, + permission + }, + state: { + + }, + mutations: { + + }, + actions: { + + }, + getters +}) diff --git a/ant-design-jeecg-vue/src/store/modules/app.js b/ant-design-jeecg-vue/src/store/modules/app.js new file mode 100644 index 0000000..d8ce233 --- /dev/null +++ b/ant-design-jeecg-vue/src/store/modules/app.js @@ -0,0 +1,121 @@ +import Vue from 'vue' +import { + SIDEBAR_TYPE, + DEFAULT_THEME, + DEFAULT_LAYOUT_MODE, + DEFAULT_COLOR, + DEFAULT_COLOR_WEAK, + DEFAULT_FIXED_HEADER, + DEFAULT_FIXED_SIDEMENU, + DEFAULT_FIXED_HEADER_HIDDEN, + DEFAULT_CONTENT_WIDTH_TYPE +} from "@/store/mutation-types" + +const app = { + state: { + sidebar: { + opened: true, + withoutAnimation: false + }, + device: 'desktop', + theme: '', + layout: '', + contentWidth: '', + fixedHeader: false, + fixSiderbar: false, + autoHideHeader: false, + color: null, + weak: false, + multipage: true + }, + mutations: { + SET_SIDEBAR_TYPE: (state, type) => { + state.sidebar.opened = type + Vue.ls.set(SIDEBAR_TYPE, type) + }, + CLOSE_SIDEBAR: (state, withoutAnimation) => { + Vue.ls.set(SIDEBAR_TYPE, true) + state.sidebar.opened = false + state.sidebar.withoutAnimation = withoutAnimation + }, + TOGGLE_DEVICE: (state, device) => { + state.device = device + }, + TOGGLE_THEME: (state, theme) => { + // setStore('_DEFAULT_THEME', theme) + Vue.ls.set(DEFAULT_THEME, theme) + state.theme = theme + }, + TOGGLE_LAYOUT_MODE: (state, layout) => { + Vue.ls.set(DEFAULT_LAYOUT_MODE, layout) + state.layout = layout + }, + TOGGLE_FIXED_HEADER: (state, fixed) => { + Vue.ls.set(DEFAULT_FIXED_HEADER, fixed) + state.fixedHeader = fixed + }, + TOGGLE_FIXED_SIDERBAR: (state, fixed) => { + Vue.ls.set(DEFAULT_FIXED_SIDEMENU, fixed) + state.fixSiderbar = fixed + }, + TOGGLE_FIXED_HEADER_HIDDEN: (state, show) => { + Vue.ls.set(DEFAULT_FIXED_HEADER_HIDDEN, show) + state.autoHideHeader = show + }, + TOGGLE_CONTENT_WIDTH: (state, type) => { + Vue.ls.set(DEFAULT_CONTENT_WIDTH_TYPE, type) + state.contentWidth = type + }, + TOGGLE_COLOR: (state, color) => { + Vue.ls.set(DEFAULT_COLOR, color) + state.color = color + }, + TOGGLE_WEAK: (state, flag) => { + Vue.ls.set(DEFAULT_COLOR_WEAK, flag) + state.weak = flag + }, + setMultipage (state, multipage) { + state.multipage = multipage + } + }, + actions: { + setSidebar: ({ commit }, type) => { + commit('SET_SIDEBAR_TYPE', type) + }, + CloseSidebar({ commit }, { withoutAnimation }) { + commit('CLOSE_SIDEBAR', withoutAnimation) + }, + ToggleDevice({ commit }, device) { + commit('TOGGLE_DEVICE', device) + }, + ToggleTheme({ commit }, theme) { + commit('TOGGLE_THEME', theme) + }, + ToggleLayoutMode({ commit }, mode) { + commit('TOGGLE_LAYOUT_MODE', mode) + }, + ToggleFixedHeader({ commit }, fixedHeader) { + if (!fixedHeader) { + commit('TOGGLE_FIXED_HEADER_HIDDEN', false) + } + commit('TOGGLE_FIXED_HEADER', fixedHeader) + }, + ToggleFixSiderbar({ commit }, fixSiderbar) { + commit( 'TOGGLE_FIXED_SIDERBAR', fixSiderbar) + }, + ToggleFixedHeaderHidden({ commit }, show) { + commit('TOGGLE_FIXED_HEADER_HIDDEN', show) + }, + ToggleContentWidth({ commit }, type) { + commit('TOGGLE_CONTENT_WIDTH', type) + }, + ToggleColor({ commit }, color) { + commit('TOGGLE_COLOR', color) + }, + ToggleWeak({ commit }, weakFlag) { + commit('TOGGLE_WEAK', weakFlag) + } + } +} + +export default app \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/store/modules/permission.js b/ant-design-jeecg-vue/src/store/modules/permission.js new file mode 100644 index 0000000..895e14b --- /dev/null +++ b/ant-design-jeecg-vue/src/store/modules/permission.js @@ -0,0 +1,90 @@ +import { asyncRouterMap, constantRouterMap } from "@/config/router.config" + +/** + * 过滤账户是否拥有某一个权限,并将菜单从加载列表移除 + * + * @param permission + * @param route + * @returns {boolean} + */ +function hasPermission(permission, route) { + if (route.meta && route.meta.permission) { + let flag = -1 + for (let i = 0, len = permission.length; i < len; i++) { + flag = route.meta.permission.indexOf(permission[i]) + if (flag >= 0) { + return true + } + } + return false + } + return true +} + +/** + * 单账户多角色时,使用该方法可过滤角色不存在的菜单 + * + * @param roles + * @param route + * @returns {*} + */ +// eslint-disable-next-line +function hasRole(roles, route) { + if (route.meta && route.meta.roles) { + return route.meta.roles.indexOf(roles.id) + } else { + return true + } +} + +function filterAsyncRouter(routerMap, roles) { + const accessedRouters = routerMap.filter(route => { + if (hasPermission(roles.permissionList, route)) { + if (route.children && route.children.length) { + route.children = filterAsyncRouter(route.children, roles) + } + return true + } + return false + }) + return accessedRouters +} + + +const permission = { + state: { + routers: constantRouterMap, + addRouters: [] + }, + mutations: { + SET_ROUTERS: (state, data) => { + state.addRouters = data + state.routers = constantRouterMap.concat(data) + console.log('-----mutations---SET_ROUTERS----', data) + } + }, + actions: { + GenerateRoutes({ commit }, data) { + return new Promise(resolve => { + const { roles } = data + console.log('-----mutations---data----', data) + let accessedRouters + accessedRouters = filterAsyncRouter(asyncRouterMap, roles) + console.log('-----mutations---accessedRouters----', accessedRouters) + commit('SET_ROUTERS', accessedRouters) + resolve() + }) + }, + // 动态添加主界面路由,需要缓存 + UpdateAppRouter({ commit }, routes) { + return new Promise(resolve => { + //const [ roles ] = routes.constRoutes + let routelist = routes.constRoutes; + commit('SET_ROUTERS', routelist) + resolve() + }) + } + } +} + +export default permission \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/store/modules/user.js b/ant-design-jeecg-vue/src/store/modules/user.js new file mode 100644 index 0000000..cf79988 --- /dev/null +++ b/ant-design-jeecg-vue/src/store/modules/user.js @@ -0,0 +1,100 @@ +import Vue from 'vue' +import { login, logout } from "@/api/login" +import { ACCESS_TOKEN, USER_NAME,USER_INFO } from "@/store/mutation-types" +import { welcome } from "@/utils/util" +import { queryPermissionsByUser } from '@/api/api' + +const user = { + state: { + token: '', + username: '', + realname: '', + welcome: '', + avatar: '', + permissionList: [], + info: {} + }, + + mutations: { + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_NAME: (state, { username, realname, welcome }) => { + state.username = username + state.realname = realname + state.welcome = welcome + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + }, + SET_PERMISSIONLIST: (state, permissionList) => { + state.permissionList = permissionList + }, + SET_INFO: (state, info) => { + state.info = info + }, + }, + + actions: { + // 登录 + Login({ commit }, userInfo) { + return new Promise((resolve, reject) => { + login(userInfo).then(response => { + if(response.code =='200'){ + const result = response.result + const userInfo = result.userInfo + Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000) + Vue.ls.set(USER_NAME, userInfo.username, 7 * 24 * 60 * 60 * 1000) + Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000) + commit('SET_TOKEN', result.token) + commit('SET_INFO', userInfo) + commit('SET_NAME', { username: userInfo.username,realname: userInfo.realname, welcome: welcome() }) + commit('SET_AVATAR', userInfo.avatar) + resolve() + }else{ + reject(response) + } + }).catch(error => { + reject(error) + }) + }) + }, + + // 获取用户信息 + GetPermissionList({ commit }) { + return new Promise((resolve, reject) => { + let username = Vue.ls.get(USER_NAME); + let params = {username:username}; + queryPermissionsByUser(params).then(response => { + const menuData = response.result; + if (menuData && menuData.length > 0) { + commit('SET_PERMISSIONLIST', menuData) + } else { + reject('getPermissionList: permissions must be a non-null array !') + } + resolve(response) + }).catch(error => { + reject(error) + }) + }) + }, + + // 登出 + Logout({ commit, state }) { + return new Promise((resolve) => { + commit('SET_TOKEN', '') + commit('SET_PERMISSIONLIST', []) + Vue.ls.remove(ACCESS_TOKEN) + + logout(state.token).then(() => { + resolve() + }).catch(() => { + resolve() + }) + }) + }, + + } +} + +export default user \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/store/mutation-types.js b/ant-design-jeecg-vue/src/store/mutation-types.js new file mode 100644 index 0000000..2fa98ae --- /dev/null +++ b/ant-design-jeecg-vue/src/store/mutation-types.js @@ -0,0 +1,17 @@ +export const ACCESS_TOKEN = 'Access-Token' +export const SIDEBAR_TYPE = 'SIDEBAR_TYPE' +export const DEFAULT_THEME = 'DEFAULT_THEME' +export const DEFAULT_LAYOUT_MODE = 'DEFAULT_LAYOUT_MODE' +export const DEFAULT_COLOR = 'DEFAULT_COLOR' +export const DEFAULT_COLOR_WEAK = 'DEFAULT_COLOR_WEAK' +export const DEFAULT_FIXED_HEADER = 'DEFAULT_FIXED_HEADER' +export const DEFAULT_FIXED_SIDEMENU= 'DEFAULT_FIXED_SIDEMENU' +export const DEFAULT_FIXED_HEADER_HIDDEN = 'DEFAULT_FIXED_HEADER_HIDDEN' +export const DEFAULT_CONTENT_WIDTH_TYPE = 'DEFAULT_CONTENT_WIDTH_TYPE' +export const USER_NAME = 'Login_Username' +export const USER_INFO = 'Login_Userinfo' + +export const CONTENT_WIDTH_TYPE = { + Fluid: 'Fluid', + Fixed: 'Fixed' +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/utils/auth.js b/ant-design-jeecg-vue/src/utils/auth.js new file mode 100644 index 0000000..03ae469 --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/auth.js @@ -0,0 +1,19 @@ +/** + * 弃用 + */ +import { setStore, getStore, clearStore } from "@/utils/storage" + +export const TokenKey = 'Access-Token' + +export function getToken() { + return getStore(TokenKey) +} + +export function setToken(token) { + // key, token, timeout = 86400s + return setStore(TokenKey, token, 86400) +} + +export function removeToken() { + return clearStore(TokenKey) +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/utils/axios.js b/ant-design-jeecg-vue/src/utils/axios.js new file mode 100644 index 0000000..d775940 --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/axios.js @@ -0,0 +1,37 @@ +const VueAxios = { + vm: {}, + // eslint-disable-next-line no-unused-vars + install(Vue, router = {}, instance) { + if (this.installed) { + return; + } + this.installed = true; + + if (!instance) { + // eslint-disable-next-line no-console + console.error('You have to install axios'); + return; + } + + Vue.axios = instance; + + Object.defineProperties(Vue.prototype, { + axios: { + get: function get() { + return instance; + } + }, + $http: { + get: function get() { + return instance; + } + } + }); + } +}; + +export { + VueAxios, + // eslint-disable-next-line no-undef + instance as axios +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/utils/device.js b/ant-design-jeecg-vue/src/utils/device.js new file mode 100644 index 0000000..6bf15fc --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/device.js @@ -0,0 +1,23 @@ +import enquireJs from 'enquire.js' + +const enquireScreen = function (call) { + // tablet + const handler = { + match: function () { + call && call(0) + }, + unmatch: function () { + call && call(-1) + } + } + // mobile + const handler2 = { + match: () => { + call && call(1) + } + } + enquireJs.register('screen and (max-width: 1087.99px)', handler) + enquireJs.register('screen and (max-width: 767.99px)', handler2) +} + +export default enquireScreen \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/utils/filter.js b/ant-design-jeecg-vue/src/utils/filter.js new file mode 100644 index 0000000..f4aa4ce --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/filter.js @@ -0,0 +1,18 @@ +import Vue from "vue"; +import * as dayjs from "dayjs"; + +Vue.filter('NumberFormat', function (value) { + if (!value) { + return '0' + } + let intPartFormat = value.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') //将整数部分逢三一断 + return intPartFormat +}) + +Vue.filter('dayjs', function(dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { + return dayjs(dataStr).format(pattern) +}) + +Vue.filter('moment', function(dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { + return dayjs(dataStr).format(pattern) +}) \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/utils/hasPermission.js b/ant-design-jeecg-vue/src/utils/hasPermission.js new file mode 100644 index 0000000..8e821eb --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/hasPermission.js @@ -0,0 +1,26 @@ +const hasPermission = { + install (Vue, options) { + console.log(options); + Vue.directive('has', { + inserted: (el, binding, vnode)=>{ + //console.log("页面权限----",el); + let permissionList = vnode.context.$route.meta.permissionList; + if (permissionList === null || permissionList === "" || permissionList === undefined) { + el.parentNode.removeChild(el) + } + let permissions = []; + for (var item of permissionList) { + permissions.push(item.action); + } + //console.log("页面权限----"+permissions); + //console.log("页面权限----"+binding.value); + if (!permissions.includes(binding.value)) { + //if(el.parentNode) + el.parentNode.removeChild(el) + } + } + }); + } +}; + +export default hasPermission; diff --git a/ant-design-jeecg-vue/src/utils/mixin.js b/ant-design-jeecg-vue/src/utils/mixin.js new file mode 100644 index 0000000..8417db6 --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/mixin.js @@ -0,0 +1,39 @@ +// import Vue from 'vue' +import { mapState } from "vuex"; + +// const mixinsComputed = Vue.config.optionMergeStrategies.computed +// const mixinsMethods = Vue.config.optionMergeStrategies.methods + +const mixin = { + computed: { + ...mapState({ + layoutMode: state => state.app.layout, + navTheme: state => state.app.theme, + primaryColor: state => state.app.color, + colorWeak: state => state.app.weak, + fixedHeader: state => state.app.fixedHeader, + fixSiderbar: state => state.app.fixSiderbar, + contentWidth: state => state.app.contentWidth, + autoHideHeader: state => state.app.autoHideHeader, + sidebarOpened: state => state.app.sidebar.opened + }) + } +} + +const mixinDevice = { + computed: { + ...mapState({ + device: state => state.app.device, + }) + }, + methods: { + isMobile () { + return this.device === 'mobile' + }, + isDesktop () { + return this.device === 'desktop' + } + } +} + +export { mixin, mixinDevice } \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/utils/permissions.js b/ant-design-jeecg-vue/src/utils/permissions.js new file mode 100644 index 0000000..e4b60bc --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/permissions.js @@ -0,0 +1,8 @@ +export function actionToObject(json) { + try { + return JSON.parse(json) + } catch (e) { + console.log('err', e.message) + } + return [] +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/utils/request.js b/ant-design-jeecg-vue/src/utils/request.js new file mode 100644 index 0000000..4765bb3 --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/request.js @@ -0,0 +1,99 @@ +import Vue from 'vue' +import axios from 'axios' +import store from '@/store' +import { VueAxios } from './axios' +import {Modal, notification} from 'ant-design-vue' +import { ACCESS_TOKEN } from "@/store/mutation-types" + +// 创建 axios 实例 +const service = axios.create({ + baseURL: '/jeecg-boot', // api base_url + timeout: 6000 // 请求超时时间 +}) + +const err = (error) => { + if (error.response) { + let data = error.response.data + const token = Vue.ls.get(ACCESS_TOKEN) + console.log("------异常响应------",token) + console.log("------异常响应------",error.response.status) + switch (error.response.status) { + case 403: + notification.error({ message: '系统提示', description: '拒绝访问',duration: 4}) + break + case 500: + //notification.error({ message: '系统提示', description:'Token失效,请重新登录!',duration: 4}) + if(data.message=="Token失效,请重新登录"){ + // update-begin- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式,不直接跳转---- + // store.dispatch('Logout').then(() => { + // window.location.reload() + // }) + Modal.error({ + title: '登录已过期', + content: '很抱歉,登录已过期,请重新登录', + okText: '重新登录', + mask: false, + onOk: () => { + store.dispatch('Logout').then(() => { + window.location.reload() + }) + } + }) + // update-end- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式,不直接跳转---- + } + break + case 404: + notification.error({ message: '系统提示', description:'很抱歉,资源未找到!',duration: 4}) + break + case 504: + notification.error({ message: '系统提示', description: '网络超时'}) + break + case 401: + notification.error({ message: '系统提示', description:'未授权,请重新登录',duration: 4}) + if (token) { + store.dispatch('Logout').then(() => { + setTimeout(() => { + window.location.reload() + }, 1500) + }) + } + break + default: + notification.error({ + message: '系统提示', + description: data.message, + duration: 4 + }) + break + } + } + return Promise.reject(error) +}; + +// request interceptor +service.interceptors.request.use(config => { + const token = Vue.ls.get(ACCESS_TOKEN) + if (token) { + config.headers[ 'X-Access-Token' ] = token // 让每个请求携带自定义 token 请根据实际情况自行修改 + } + return config +},(error) => { + return Promise.reject(error) +}) + +// response interceptor +service.interceptors.response.use((response) => { + return response.data + }, err) + +const installer = { + vm: {}, + install (Vue, router = {}) { + Vue.use(VueAxios, router, service) + } +} + +export { + installer as VueAxios, + service as axios +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/utils/storage.js b/ant-design-jeecg-vue/src/utils/storage.js new file mode 100644 index 0000000..b3c29ab --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/storage.js @@ -0,0 +1,78 @@ +/** + * Set storage + * + * @param name + * @param content + * @param maxAge + */ +export const setStore = (name, content, maxAge = null) => { + if (!global.window || !name) { + return; + } + + if (typeof content !== 'string') { + content = JSON.stringify(content) + } + + let storage = global.window.localStorage + + storage.setItem(name, content) + if (maxAge && !isNaN(parseInt(maxAge))) { + let timeout = parseInt(new Date().getTime() / 1000) + storage.setItem(`${name}_expire`, timeout + maxAge) + } +}; + +/** + * Get storage + * + * @param name + * @returns {*} + */ +export const getStore = name => { + if (!global.window || !name) { + return; + } + + let content = window.localStorage.getItem(name) + let _expire = window.localStorage.getItem(`${name}_expire`) + + if (_expire) { + let now = parseInt(new Date().getTime() / 1000) + if (now > _expire) { + return; + } + } + + try { + return JSON.parse(content) + } catch (e) { + return content + } +}; + +/** + * Clear storage + * + * @param name + */ +export const clearStore = name => { + if (!global.window || !name) { + return; + } + + window.localStorage.removeItem(name) + window.localStorage.removeItem(`${name}_expire`) +}; + +/** + * Clear all storage + */ +export const clearAll = () => { + if (!global.window || !name) { + return; + } + + window.localStorage.clear() +} + diff --git a/ant-design-jeecg-vue/src/utils/util.js b/ant-design-jeecg-vue/src/utils/util.js new file mode 100644 index 0000000..c9287cd --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/util.js @@ -0,0 +1,131 @@ + +export function timeFix() { + const time = new Date() + const hour = time.getHours() + return hour < 9 ? '早上好' : (hour <= 11 ? '上午好' : (hour <= 13 ? '中午好' : (hour < 20 ? '下午好' : '晚上好'))) +} + +export function welcome() { + const arr = ['休息一会儿吧', '准备吃什么呢?', '要不要打一把 DOTA', '我猜你可能累了'] + let index = Math.floor((Math.random()*arr.length)) + return arr[index] +} + +/** + * 触发 window.resize + */ +export function triggerWindowResizeEvent() { + let event = document.createEvent('HTMLEvents') + event.initEvent('resize', true, true) + event.eventType = 'message' + window.dispatchEvent(event) +} + +/** + * 过滤对象中为空的属性 + * @param obj + * @returns {*} + */ +export function filterObj(obj) { + if (!(typeof obj == 'object')) { + return; + } + + for ( var key in obj) { + if (obj.hasOwnProperty(key) + && (obj[key] == null || obj[key] == undefined || obj[key] == '')) { + delete obj[key]; + } + } + return obj; +} + +/** + * 时间格式化 + * @param value + * @param fmt + * @returns {*} + */ +export function formatDate(value, fmt) { + var regPos = /^\d+(\.\d+)?$/; + if(regPos.test(value)){ + //如果是数字 + let getDate = new Date(value); + let o = { + 'M+': getDate.getMonth() + 1, + 'd+': getDate.getDate(), + 'h+': getDate.getHours(), + 'm+': getDate.getMinutes(), + 's+': getDate.getSeconds(), + 'q+': Math.floor((getDate.getMonth() + 3) / 3), + 'S': getDate.getMilliseconds() + }; + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (getDate.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + for (let k in o) { + if (new RegExp('(' + k + ')').test(fmt)) { + fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) + } + } + return fmt; + }else{ + //TODO + value = value.trim(); + return value.substr(0,fmt.length); + } +} + +// 生成首页路由 +export function generateIndexRouter(data) { +let indexRouter = [{ + path: '/', + name: 'dashboard', + //component: () => import('@/components/layouts/BasicLayout'), + component: resolve => require(['@/components/layouts/TabLayout'], resolve), + meta: { title: '首页' }, + redirect: '/dashboard/analysis', + children: [ + ...generateChildRouters(data) + ] + },{ + "path": "*", "redirect": "/404", "hidden": true + }] + return indexRouter; +} + +// 生成嵌套路由(子路由) + +function generateChildRouters (data) { + const routers = []; + for (var item of data) { + let component = ""; + if(item.component.indexOf("layouts")>=0){ + component = "components/"+item.component; + }else{ + component = "views/"+item.component; + } + let menu = { + path: item.path, + name: item.name, + redirect:item.redirect, + component: resolve => require(['@/' + component+'.vue'], resolve), + hidden:item.hidden, + //component:()=> import(`@/views/${item.component}.vue`), + meta: { + title:item.meta.title , + icon: item.meta.icon, + url:item.meta.url , + permissionList:item.meta.permissionList + } + } + if(item.alwaysShow){ + menu.alwaysShow = true; + } + if (item.children && item.children.length > 0) { + menu.children = [...generateChildRouters( item.children)]; + } + routers.push(menu); + } + return routers +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/404.vue b/ant-design-jeecg-vue/src/views/404.vue new file mode 100644 index 0000000..90fe065 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/404.vue @@ -0,0 +1,15 @@ +<template> + <div> + 404 page + </div> +</template> + +<script> + export default { + name: "404" + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/Home.vue b/ant-design-jeecg-vue/src/views/Home.vue new file mode 100644 index 0000000..c9cab99 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/Home.vue @@ -0,0 +1,163 @@ +<template> + <div class="home"> + <div class="banner"> + <img alt="Vue logo" style="width: 64px; height: 64px" src="../assets/logo.png"> + <h3 style="margin-top: 1rem">Welcome to Your Vue.js App</h3> + </div> + + <br/> + + <h2># Trend 组件 </h2> + + <a-divider> 正常 </a-divider> + + <a-card> + + <trend flag="up" style="margin-right: 16px;"> + <span slot="term">工资</span> + 5% + </trend> + <trend flag="up" style="margin-right: 16px;"> + <span slot="term">工作量</span> + 50% + </trend> + <trend flag="down"> + <span slot="term">身体状态</span> + 50% + </trend> + + </a-card> + + <a-divider> 颜色反转 </a-divider> + + <a-card style="margin-bottom: 3rem"> + + <trend flag="up" :reverse-color="true" style="margin-right: 16px;"> + <span slot="term">工资</span> + 5% + </trend> + <trend flag="down" :reverse-color="true" style="margin-right: 16px;"> + <span slot="term">工作量</span> + 50% + </trend> + + </a-card> + + <h2># AvatarList 组件 </h2> + + <a-divider> AvatarList </a-divider> + <a-card style="margin-bottom: 3rem"> + <avatar-list :max-length="3"> + <avatar-list-item tips="Jake" src="https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png" /> + <avatar-list-item tips="Andy" src="https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png" /> + <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" /> + <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" /> + <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" /> + <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" /> + <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" /> + + </avatar-list> + + <a-divider type="vertical" style="margin: 0 16px" /> + + <avatar-list size="mini"> + <avatar-list-item tips="Jake" src="https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png" /> + <avatar-list-item tips="Andy" src="https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png" /> + <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" /> + </avatar-list> + </a-card> + + <h2># CountDown 组件 </h2> + + <a-divider> CountDown </a-divider> + <a-card style="margin-bottom: 3rem"> + <count-down + style="font-size: 2rem" + :target="new Date().getTime() + 3000000" + :on-end="onEndHandle"> + </count-down> + + <a-divider type="vertical" style="margin: 0 16px" /> + + <count-down + style="font-size: 2rem" + :target="new Date().getTime() + 10000" + :on-end="onEndHandle2"> + </count-down> + </a-card> + + <h2># Ellipsis 组件 </h2> + + <a-divider> Ellipsis </a-divider> + <a-card style="margin-bottom: 3rem"> + <ellipsis :length="100" tooltip> + There were injuries alleged in three cases in 2015, and a + fourth incident in September, according to the safety recall report. After meeting with US regulators in October, the firm decided to issue a voluntary recall. + </ellipsis> + </a-card> + + <h2># NumberInfo 组件 </h2> + + <a-divider> NumberInfo </a-divider> + <a-card> + <number-info + :sub-title="() => { return 'Visits this week' }" + :total="12321" + status="up" + :sub-total="17.1"></number-info> + </a-card> + </div> +</template> + +<script> + // @ is an alias to /src + + import Trend from '@/components/Trend' + import AvatarList from '@/components/AvatarList' + import CountDown from '@/components/CountDown/CountDown' + import Ellipsis from '@/components/Ellipsis' + import NumberInfo from '@/components/NumberInfo' + + const AvatarListItem = AvatarList.AvatarItem + + export default { + name: 'Home', + components: { + NumberInfo, + Ellipsis, + CountDown, + Trend, + AvatarList, + AvatarListItem + }, + data () { + return { + targetTime: new Date().getTime() + 3900000 + } + }, + methods: { + onEndHandle () { + this.$message.success('CountDown callback!!!') + }, + onEndHandle2 () { + this.$notification.open({ + message: 'Notification Title', + description: 'This is the content of the notification. This is the content of the notification. This is the content of the notification.', + }); + } + } + } +</script> + +<style scoped> + .home { + width: 900px; + margin: 0 auto; + padding: 25px 0; + } + .home > .banner { + text-align: center; + padding: 25px 0; + margin: 25px 0; + } +</style> diff --git a/ant-design-jeecg-vue/src/views/account/center/Index.vue b/ant-design-jeecg-vue/src/views/account/center/Index.vue new file mode 100644 index 0000000..024b0b8 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/center/Index.vue @@ -0,0 +1,287 @@ +<template> + <div class="page-header-index-wide page-header-wrapper-grid-content-main"> + + <a-row :gutter="24"> + <a-col :md="24" :lg="7"> + <a-card :bordered="false"> + <div class="account-center-avatarHolder"> + <div class="avatar"> + <img :src="getAvatar()"/> + </div> + <div class="username">{{ nickname() }}</div> + <div class="bio">海纳百川,有容乃大</div> + </div> + <div class="account-center-detail"> + <p> + <i class="title"></i>交互专家 + </p> + <p> + <i class="group"></i>蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED + </p> + <p> + <i class="address"></i><span>浙江省</span><span>杭州市</span> + </p> + </div> + <a-divider /> + + <div class="account-center-tags"> + <div class="tagsTitle">标签</div> + <div> + <template v-for="(tag, index) in tags"> + <a-tooltip v-if="tag.length > 20" :key="tag" :title="tag"> + <a-tag :key="tag" :closable="index !== 0" :afterClose="() => handleTagClose(tag)"> + {{ `${tag.slice(0, 20)}...` }} + </a-tag> + </a-tooltip> + <a-tag v-else :key="tag" :closable="index !== 0" :afterClose="() => handleTagClose(tag)">{{ tag }}</a-tag> + </template> + <a-input + v-if="tagInputVisible" + ref="tagInput" + type="text" + size="small" + :style="{ width: '78px' }" + :value="tagInputValue" + @change="handleInputChange" + @blur="handleTagInputConfirm" + @keyup.enter="handleTagInputConfirm" + /> + <a-tag v-else @click="showTagInput" style="background: #fff; borderStyle: dashed;"> + <a-icon type="plus" /> New Tag + </a-tag> + </div> + </div> + <a-divider :dashed="true" /> + + <div class="account-center-team"> + <div class="teamTitle">团队</div> + <a-spin :spinning="teamSpinning"> + <div class="members"> + <a-row> + <a-col :span="12" v-for="(item, index) in teams" :key="index"> + <a> + <a-avatar size="small" :src="item.avatar" /> + <span class="member">{{ item.name }}</span> + </a> + </a-col> + </a-row> + </div> + </a-spin> + </div> + </a-card> + </a-col> + <a-col :md="24" :lg="17"> + <a-card + style="width:100%" + :bordered="false" + :tabList="tabListNoTitle" + :activeTabKey="noTitleKey" + @tabChange="key => handleTabChange(key, 'noTitleKey')" + > + <article-page v-if="noTitleKey === 'article'"></article-page> + <app-page v-else-if="noTitleKey === 'app'"></app-page> + <project-page v-else-if="noTitleKey === 'project'"></project-page> + </a-card> + </a-col> + </a-row> + + + </div> +</template> + +<script> + import PageLayout from '@/components/page/PageLayout' + import RouteView from "@/components/layouts/RouteView" + import { AppPage, ArticlePage, ProjectPage } from './page' + import {imgView} from '@/api/api' + + import { mapGetters } from 'vuex' + + export default { + components: { + RouteView, + PageLayout, + AppPage, + ArticlePage, + ProjectPage + }, + data() { + return { + tags: ['很有想法的', '专注设计', '辣~', '大长腿', '川妹子', '海纳百川'], + + tagInputVisible: false, + tagInputValue: '', + + teams: [], + teamSpinning: true, + + tabListNoTitle: [{ + key: 'article', + tab: '文章(8)', + }, { + key: 'app', + tab: '应用(8)', + }, { + key: 'project', + tab: '项目(8)', + } + ], + noTitleKey: 'app', + } + }, + mounted () { + this.getTeams() + }, + methods: { + ...mapGetters(["nickname", "avatar"]), + getAvatar(){ + return imgView+this.avatar(); + }, + getTeams() { + this.$http.get('/api/workplace/teams') + .then(res => { + this.teams = res.result + this.teamSpinning = false + }) + }, + + handleTabChange (key, type) { + this[type] = key + }, + + handleTagClose (removeTag) { + const tags = this.tags.filter(tag => tag != removeTag) + this.tags = tags + }, + + showTagInput () { + this.tagInputVisible = true + this.$nextTick(() => { + this.$refs.tagInput.focus() + }) + }, + + handleInputChange (e) { + this.tagInputValue = e.target.value + }, + + handleTagInputConfirm () { + const inputValue = this.tagInputValue + let tags = this.tags + if (inputValue && tags.indexOf(inputValue) === -1) { + tags = [...tags, inputValue] + } + + Object.assign(this, { + tags, + tagInputVisible: false, + tagInputValue: '' + }) + } + }, + } +</script> + +<style lang="scss" scoped> + .page-header-wrapper-grid-content-main { + width: 100%; + height: 100%; + min-height: 100%; + transition: .3s; + + .account-center-avatarHolder { + text-align: center; + margin-bottom: 24px; + + & > .avatar { + margin: 0 auto; + width: 104px; + height: 104px; + margin-bottom: 20px; + border-radius: 50%; + overflow: hidden; + img { + height: 100%; + width: 100%; + } + } + + .username { + color: rgba(0, 0, 0, 0.85); + font-size: 20px; + line-height: 28px; + font-weight: 500; + margin-bottom: 4px; + } + } + + .account-center-detail { + + p { + margin-bottom: 8px; + padding-left: 26px; + position: relative; + } + + i { + position: absolute; + height: 14px; + width: 14px; + left: 0; + top: 4px; + background: url(https://gw.alipayobjects.com/zos/rmsportal/pBjWzVAHnOOtAUvZmZfy.svg) + } + + .title { + background-position: 0 0; + } + .group { + background-position: 0 -22px; + } + .address { + background-position: 0 -44px; + } + } + + .account-center-tags { + .ant-tag { + margin-bottom: 8px; + } + } + + .account-center-team { + + .members { + a { + display: block; + margin: 12px 0; + line-height: 24px; + height: 24px; + .member { + font-size: 14px; + color: rgba(0, 0, 0, .65); + line-height: 24px; + max-width: 100px; + vertical-align: top; + margin-left: 12px; + transition: all 0.3s; + display: inline-block; + } + &:hover { + span { + color: #1890ff; + } + } + } + } + } + + .tagsTitle, .teamTitle { + font-weight: 500; + color: rgba(0,0,0,.85); + margin-bottom: 12px; + } + + } + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/center/page/App.vue b/ant-design-jeecg-vue/src/views/account/center/page/App.vue new file mode 100644 index 0000000..57dbaa2 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/center/page/App.vue @@ -0,0 +1,113 @@ +<template> + <div class="app-list"> + <a-list + :grid="{ gutter: 24, lg: 3, md: 2, sm: 1, xs: 1 }" + :dataSource="dataSource"> + <a-list-item slot="renderItem" slot-scope="item, index"> + <a-card :hoverable="true"> + <a-card-meta> + <div style="margin-bottom: 3px" slot="title">{{ item.title }}</div> + <a-avatar class="card-avatar" slot="avatar" :src="item.avatar" size="small"/> + <div class="meta-cardInfo" slot="description"> + <div> + <p>活跃用户</p> + <p> + <span>{{ item.activeUser }}<span>万</span></span> + </p> + </div> + <div> + <p>新增用户</p> + <p>{{ item.newUser | NumberFormat }}</p> + </div> + </div> + </a-card-meta> + <template class="ant-card-actions" slot="actions"> + <a> + <a-icon type="download"/> + </a> + <a> + <a-icon type="edit"/> + </a> + <a> + <a-icon type="share-alt"/> + </a> + <a> + <a-dropdown> + <a class="ant-dropdown-link" href="javascript:;"> + <a-icon type="ellipsis"/> + </a> + <a-menu slot="overlay"> + <a-menu-item> + <a href="javascript:;">1st menu item</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">2nd menu item</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">3rd menu item</a> + </a-menu-item> + </a-menu> + </a-dropdown> + </a> + </template> + </a-card> + </a-list-item> + </a-list> + + </div> +</template> + +<script> + const dataSource = [] + for (let i = 0; i < 11; i++) { + dataSource.push({ + title: 'Alipay', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', + activeUser: 17, + newUser: 1700 + }) + } + + export default { + name: "Article", + components: {}, + data() { + return { + dataSource, + } + } + } +</script> + +<style lang="scss" scoped> + + .app-list { + + .meta-cardInfo { + zoom: 1; + margin-top: 16px; + + > div { + position: relative; + text-align: left; + float: left; + width: 50%; + + p { + line-height: 32px; + font-size: 24px; + margin: 0; + + &:first-child { + color: rgba(0, 0, 0, .45); + font-size: 12px; + line-height: 20px; + margin-bottom: 4px; + } + } + + } + } + } + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/center/page/Article.vue b/ant-design-jeecg-vue/src/views/account/center/page/Article.vue new file mode 100644 index 0000000..0d743ef --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/center/page/Article.vue @@ -0,0 +1,24 @@ +<template> + <a-list> + <a-list-item> + + </a-list-item> + </a-list> +</template> + +<script> + import AList from 'ant-design-vue/es/list' + import AListItem from 'ant-design-vue/es/list/Item' + + export default { + name: "Article", + components: { + AList, + AListItem + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/center/page/Project.vue b/ant-design-jeecg-vue/src/views/account/center/page/Project.vue new file mode 100644 index 0000000..460e02f --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/center/page/Project.vue @@ -0,0 +1,17 @@ +<template> + <a-list> + <a-list-item> + + </a-list-item> + </a-list> +</template> + +<script> + export default { + name: "Project" + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/center/page/index.js b/ant-design-jeecg-vue/src/views/account/center/page/index.js new file mode 100644 index 0000000..e80351a --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/center/page/index.js @@ -0,0 +1,5 @@ +import AppPage from './App' +import ArticlePage from './Article' +import ProjectPage from './Project' + +export { AppPage, ArticlePage, ProjectPage } \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/settings/AvatarModal.vue b/ant-design-jeecg-vue/src/views/account/settings/AvatarModal.vue new file mode 100644 index 0000000..6fe58e5 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/settings/AvatarModal.vue @@ -0,0 +1,103 @@ +<template> + <a-modal :visible="visible" title="修改头像" :maskClosable="false" :confirmLoading="confirmLoading" :width="800"> + <a-row> + <a-col :xs="24" :md="12" :style="{height: '350px'}"> + <vue-cropper + ref="cropper" + :img="options.img" + :info="true" + :autoCrop="options.autoCrop" + :autoCropWidth="options.autoCropWidth" + :autoCropHeight="options.autoCropHeight" + :fixedBox="options.fixedBox" + @realTime="realTime" + > + </vue-cropper> + </a-col> + <a-col :xs="24" :md="12" :style="{height: '350px'}"> + <div class="avatar-upload-preview"> + <img :src="previews.url" :style="previews.img"/> + </div> + </a-col> + </a-row> + + <template slot="footer"> + <a-button key="back" @click="cancelHandel">取消</a-button> + <a-button key="submit" type="primary" :loading="confirmLoading" @click="okHandel">保存</a-button> + </template> + </a-modal> +</template> +<script> + import { VueCropper } from 'vue-cropper' + + export default { + components: { + VueCropper + }, + data() { + return { + visible: false, + id: null, + confirmLoading: false, + + options: { + img: '/avatar2.jpg', + autoCrop: true, + autoCropWidth: 200, + autoCropHeight: 200, + fixedBox: true + }, + previews: {}, + }; + }, + methods: { + edit(id) { + this.visible = true; + this.id = id; + /* 获取原始头像 */ + + }, + close() { + this.id = null; + this.visible = false; + }, + cancelHandel() { + this.close(); + }, + okHandel() { + const vm = this + + vm.confirmLoading = true + setTimeout(() => { + vm.confirmLoading = false + vm.close() + vm.$message.success('上传头像成功'); + }, 2000) + + }, + + realTime(data) { + this.previews = data + } + } + }; +</script> + +<style lang="scss" scoped> + + .avatar-upload-preview { + position: absolute; + top: 50%; + transform: translate(50%, -50%); + width: 180px; + height: 180px; + border-radius: 50%; + box-shadow: 0 0 4px #ccc; + overflow: hidden; + + img { + width: 100%; + height: 100%; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/settings/BaseSetting.vue b/ant-design-jeecg-vue/src/views/account/settings/BaseSetting.vue new file mode 100644 index 0000000..8e9d4be --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/settings/BaseSetting.vue @@ -0,0 +1,161 @@ +<template> + <div class="account-settings-info-view"> + <a-row :gutter="16"> + <a-col :md="24" :lg="16"> + + <a-form layout="vertical"> + <a-form-item + label="昵称" + > + <a-input placeholder="给自己起个名字" /> + </a-form-item> + <a-form-item + label="Bio" + > + <a-textarea rows="4" placeholder="You are not alone."/> + </a-form-item> + + <a-form-item + label="电子邮件" + :required="false" + > + <a-input placeholder="exp@admin.com"/> + </a-form-item> + <a-form-item + label="加密方式" + :required="false" + > + <a-select defaultValue="aes-256-cfb"> + <a-select-option value="aes-256-cfb">aes-256-cfb</a-select-option> + <a-select-option value="aes-128-cfb">aes-128-cfb</a-select-option> + <a-select-option value="chacha20">chacha20</a-select-option> + </a-select> + </a-form-item> + <a-form-item + label="连接密码" + :required="false" + > + <a-input placeholder="h3gSbecd"/> + </a-form-item> + <a-form-item + label="登陆密码" + :required="false" + > + <a-input placeholder="密码"/> + </a-form-item> + + <a-form-item> + <a-button type="primary">提交</a-button> + <a-button style="margin-left: 8px">保存</a-button> + </a-form-item> + </a-form> + + </a-col> + <a-col :md="24" :lg="8" :style="{ minHeight: '180px' }"> + <div class="ant-upload-preview" @click="$refs.modal.edit(1)" > + <a-icon type="cloud-upload-o" class="upload-icon"/> + <div class="mask"> + <a-icon type="plus" /> + </div> + <img :src="option.img"/> + </div> + </a-col> + + </a-row> + + <avatar-modal ref="modal"> + + </avatar-modal> + </div> +</template> + +<script> + import AvatarModal from './AvatarModal' + + export default { + components: { + AvatarModal + }, + data () { + return { + // cropper + preview: {}, + option: { + img: '/avatar2.jpg', + info: true, + size: 1, + outputType: 'jpeg', + canScale: false, + autoCrop: true, + // 只有自动截图开启 宽度高度才生效 + autoCropWidth: 180, + autoCropHeight: 180, + fixedBox: true, + // 开启宽度和高度比例 + fixed: true, + fixedNumber: [1, 1] + } + } + }, + methods: { + + } + } +</script> + +<style lang="scss" scoped> + + .avatar-upload-wrapper { + height: 200px; + width: 100%; + } + + .ant-upload-preview { + position: relative; + margin: 0 auto; + width: 100%; + max-width: 180px; + border-radius: 50%; + box-shadow: 0 0 4px #ccc; + + .upload-icon { + position: absolute; + top: 0; + right: 10px; + font-size: 1.4rem; + padding: 0.5rem; + background: rgba(222, 221, 221, 0.7); + border-radius: 50%; + border: 1px solid rgba(0, 0, 0, 0.2); + } + .mask { + opacity: 0; + position: absolute; + background: rgba(0,0,0,0.4); + cursor: pointer; + transition: opacity 0.4s; + + &:hover { + opacity: 1; + } + + i { + font-size: 2rem; + position: absolute; + top: 50%; + left: 50%; + margin-left: -1rem; + margin-top: -1rem; + color: #d6d6d6; + } + } + + img, .mask { + width: 100%; + max-width: 180px; + height: 100%; + border-radius: 50%; + overflow: hidden; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/settings/Binding.vue b/ant-design-jeecg-vue/src/views/account/settings/Binding.vue new file mode 100644 index 0000000..273825b --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/settings/Binding.vue @@ -0,0 +1,25 @@ +<template> + <a-list + itemLayout="horizontal" + :dataSource="data" + > + + </a-list> +</template> + +<script> + export default { + data () { + return { + data: [] + } + }, + methods: { + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/settings/Custom.vue b/ant-design-jeecg-vue/src/views/account/settings/Custom.vue new file mode 100644 index 0000000..8734c6f --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/settings/Custom.vue @@ -0,0 +1,75 @@ +<script> + import { colorList } from '@/components/tools/setting' + import ASwitch from 'ant-design-vue/es/switch' + import AList from "ant-design-vue/es/list" + import AListItem from "ant-design-vue/es/list/Item" + import { mixin } from '@/utils/mixin.js' + + const Meta = AListItem.Meta + + export default { + components: { + AListItem, + AList, + ASwitch, + Meta + }, + mixins: [mixin], + data () { + return { + } + }, + filters: { + themeFilter(theme) { + const themeMap = { + 'dark': '暗色', + 'light': '白色' + } + return themeMap[theme] + }, + }, + methods: { + colorFilter(color) { + const c = colorList.filter(o => o.color === color)[0] + return c && c.key + }, + + onChange (checked) { + if (checked) { + this.$store.dispatch('ToggleTheme', 'dark') + } else { + this.$store.dispatch('ToggleTheme', 'light') + } + } + }, + render () { + return ( + <AList itemLayout="horizontal"> + <AListItem> + <Meta> + <a slot="title">风格配色</a> + <span slot="description"> + 整体风格配色设置 + </span> + </Meta> + <div slot="actions"> + <ASwitch checkedChildren="暗色" unCheckedChildren="白色" defaultChecked={this.navTheme === 'dark' && true || false} onChange={this.onChange} /> + </div> + </AListItem> + <AListItem> + <Meta> + <a slot="title">主题色</a> + <span slot="description"> + 页面风格配色: <a domPropsInnerHTML={ this.colorFilter(this.primaryColor) }/> + </span> + </Meta> + </AListItem> + </AList> + ) + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/settings/Index.vue b/ant-design-jeecg-vue/src/views/account/settings/Index.vue new file mode 100644 index 0000000..fb9fd4a --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/settings/Index.vue @@ -0,0 +1,154 @@ +<template> + <div class="page-header-index-wide"> + <a-card :bordered="false" :bodyStyle="{ padding: '16px 0', height: '100%' }" :style="{ height: '100%' }"> + <div class="account-settings-info-main" :class="device" :style=" 'min-height:'+ mainInfoHeight "> + <div class="account-settings-info-left"> + <a-menu + :mode="device == 'mobile' ? 'horizontal' : 'inline'" + :style="{ border: '0', width: device == 'mobile' ? '560px' : 'auto'}" + :defaultSelectedKeys="defaultSelectedKeys" + type="inner" + @openChange="onOpenChange" + > + <a-menu-item key="/account/settings/base"> + <router-link :to="{ name: 'account-settings-base' }"> + 基本设置 + </router-link> + </a-menu-item> + <a-menu-item key="/account/settings/security"> + <router-link :to="{ name: 'account-settings-security' }"> + 安全设置 + </router-link> + </a-menu-item> + <a-menu-item key="/account/settings/custom"> + <router-link :to="{ name: 'account-settings-custom' }"> + 个性化 + </router-link> + </a-menu-item> + <a-menu-item key="/account/settings/binding"> + <router-link :to="{ name: 'account-settings-binding' }"> + 账户绑定 + </router-link> + </a-menu-item> + <a-menu-item key="/account/settings/notification"> + <router-link :to="{ name: 'account-settings-notification' }"> + 新消息通知 + </router-link> + </a-menu-item> + </a-menu> + </div> + <div class="account-settings-info-right"> + <div class="account-settings-info-title"> + <span>{{ $route.meta.title }}</span> + </div> + <route-view></route-view> + </div> + </div> + </a-card> + </div> +</template> + +<script> + import PageLayout from '@/components/page/PageLayout' + import RouteView from "@/components/layouts/RouteView" + import { mixinDevice } from '@/utils/mixin.js' + + export default { + components: { + RouteView, + PageLayout + }, + mixins: [mixinDevice], + data () { + return { + // horizontal inline + mode: 'inline', + mainInfoHeight:"100%", + openKeys: [], + defaultSelectedKeys: [], + + // cropper + preview: {}, + option: { + img: '/avatar2.jpg', + info: true, + size: 1, + outputType: 'jpeg', + canScale: false, + autoCrop: true, + // 只有自动截图开启 宽度高度才生效 + autoCropWidth: 180, + autoCropHeight: 180, + fixedBox: true, + // 开启宽度和高度比例 + fixed: true, + fixedNumber: [1, 1] + }, + + pageTitle: '' + } + }, + created () { + this.updateMenu() + }, + mounted(){ + this.mainInfoHeight = (window.innerHeight-285)+"px"; + }, + methods: { + onOpenChange (openKeys) { + this.openKeys = openKeys + }, + updateMenu () { + let routes = this.$route.matched.concat() + this.defaultSelectedKeys = [ routes.pop().path ] + } + }, + } +</script> + +<style lang="scss" scoped> + .account-settings-info-main { + width: 100%; + display: flex; + height: 100%; + overflow: auto; + + &.mobile { + display: block; + + .account-settings-info-left { + border-right: unset; + border-bottom: 1px solid #e8e8e8; + width: 100%; + height: 50px; + overflow-x: auto; + overflow-y: scroll; + } + .account-settings-info-right { + padding: 20px 40px; + } + } + + .account-settings-info-left { + border-right: 1px solid #e8e8e8; + width: 224px; + } + + .account-settings-info-right { + flex: 1 1; + padding: 8px 40px; + + .account-settings-info-title { + color: rgba(0,0,0,.85); + font-size: 20px; + font-weight: 500; + line-height: 28px; + margin-bottom: 12px; + } + .account-settings-info-view { + padding-top: 12px; + } + } + } + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/settings/Notification.vue b/ant-design-jeecg-vue/src/views/account/settings/Notification.vue new file mode 100644 index 0000000..273825b --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/settings/Notification.vue @@ -0,0 +1,25 @@ +<template> + <a-list + itemLayout="horizontal" + :dataSource="data" + > + + </a-list> +</template> + +<script> + export default { + data () { + return { + data: [] + } + }, + methods: { + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/account/settings/Security.vue b/ant-design-jeecg-vue/src/views/account/settings/Security.vue new file mode 100644 index 0000000..35aedb1 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/account/settings/Security.vue @@ -0,0 +1,41 @@ +<template> + <a-list + itemLayout="horizontal" + :dataSource="data" + > + <a-list-item slot="renderItem" slot-scope="item, index" :key="index"> + <a-list-item-meta> + <a slot="title">{{ item.title }}</a> + <span slot="description"> + <span class="security-list-description">{{ item.description }}</span> + <span v-if="item.value"> : </span> + <span class="security-list-value">{{ item.value }}</span> + </span> + </a-list-item-meta> + <template v-if="item.actions"> + <a slot="actions" @click="item.actions.callback">{{ item.actions.title }}</a> + </template> + + </a-list-item> + </a-list> +</template> + +<script> + export default { + data () { + return { + data: [ + { title: '账户密码' , description: '当前密码强度', value: '强', actions: { title: '修改', callback: () => { this.$message.info('This is a normal message'); } } }, + { title: '密保手机' , description: '已绑定手机', value: '138****8293', actions: { title: '修改', callback: () => { this.$message.success('This is a message of success'); } } }, + { title: '密保问题' , description: '未设置密保问题,密保问题可有效保护账户安全', value: '', actions: { title: '设置', callback: () => { this.$message.error('This is a message of error'); } } }, + { title: '备用邮箱' , description: '已绑定邮箱', value: 'ant***sign.com', actions: { title: '修改', callback: () => { this.$message.warning('This is message of warning'); } } }, + { title: 'MFA 设备' , description: '未绑定 MFA 设备,绑定后,可以进行二次确认', value: '', actions: { title: '绑定', callback: () => { this.$message.info('This is a normal message'); } } }, + ] + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/dashboard/Analysis.vue b/ant-design-jeecg-vue/src/views/dashboard/Analysis.vue new file mode 100644 index 0000000..6313e6d --- /dev/null +++ b/ant-design-jeecg-vue/src/views/dashboard/Analysis.vue @@ -0,0 +1,267 @@ +<template> + <div class="page-header-index-wide"> + <a-row :gutter="24"> + <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }"> + <chart-card :loading="loading" title="总销售额" total="¥126,560"> + <a-tooltip title="指标说明" slot="action"> + <a-icon type="info-circle-o" /> + </a-tooltip> + <div> + <trend flag="up" style="margin-right: 16px;"> + <span slot="term">周同比</span> + 12% + </trend> + <trend flag="down"> + <span slot="term">日同比</span> + 11% + </trend> + </div> + <template slot="footer">日均销售额<span>¥ 234.56</span></template> + </chart-card> + </a-col> + <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }"> + <chart-card :loading="loading" title="访问量" :total="8846 | NumberFormat"> + <a-tooltip title="指标说明" slot="action"> + <a-icon type="info-circle-o" /> + </a-tooltip> + <div> + <mini-area /> + </div> + <template slot="footer">日访问量<span> {{ '1234' | NumberFormat }}</span></template> + </chart-card> + </a-col> + <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }"> + <chart-card :loading="loading" title="支付笔数" :total="6560 | NumberFormat"> + <a-tooltip title="指标说明" slot="action"> + <a-icon type="info-circle-o" /> + </a-tooltip> + <div> + <mini-bar /> + </div> + <template slot="footer">转化率 <span>60%</span></template> + </chart-card> + </a-col> + <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }"> + <chart-card :loading="loading" title="运营活动效果" total="78%"> + <a-tooltip title="指标说明" slot="action"> + <a-icon type="info-circle-o" /> + </a-tooltip> + <div> + <mini-progress color="rgb(19, 194, 194)" :target="80" :percentage="78" height="8px" /> + </div> + <template slot="footer"> + <trend flag="down" style="margin-right: 16px;"> + <span slot="term">同周比</span> + 12% + </trend> + <trend flag="up"> + <span slot="term">日环比</span> + 80% + </trend> + </template> + </chart-card> + </a-col> + </a-row> + + <a-card :loading="loading" :bordered="false" :body-style="{padding: '0'}"> + <div class="salesCard"> + <a-tabs default-active-key="1" size="large" :tab-bar-style="{marginBottom: '24px', paddingLeft: '16px'}"> + <div class="extra-wrapper" slot="tabBarExtraContent"> + <div class="extra-item"> + <a>今日</a> + <a>本周</a> + <a>本月</a> + <a>本年</a> + </div> + <a-range-picker :style="{width: '256px'}" /> + </div> + <a-tab-pane loading="true" tab="销售额" key="1"> + <a-row> + <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24"> + <bar title="销售额排行" /> + </a-col> + <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24"> + <rank-list title="门店销售排行榜" :list="rankList"/> + </a-col> + </a-row> + </a-tab-pane> + <a-tab-pane tab="访问量" key="2"> + <a-row> + <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24"> + <bar title="销售额趋势" /> + </a-col> + <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24"> + <rank-list title="门店销售排行榜" :list="rankList"/> + </a-col> + </a-row> + </a-tab-pane> + </a-tabs> + </div> + </a-card> + + <a-row :gutter="12"> + <a-col :xl="12" :lg="24" :md="24" :sm="24" :xs="24"> + <a-card :loading="loading" :bordered="false" title="实时访问统计" :style="{ marginTop: '24px' }"> + <a-dropdown :trigger="['click']" placement="bottomLeft" slot="extra"> + <a class="ant-dropdown-link" href="#"> + <a-icon type="ellipsis" /> + </a> + <a-menu slot="overlay"> + <a-menu-item> + <a href="javascript:;">操作一</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">操作二</a> + </a-menu-item> + </a-menu> + </a-dropdown> + <div style="height: 105px"> + <a-row> + <a-col :span="8"> + <div class="head-info" :class="center && 'center'"> + <span>今日IP</span> + <p><a>{{ loginfo.todayIp }}</a></p> + </div> + </a-col> + <a-col :span="8"> + <div class="head-info" :class="center && 'center'"> + <span>今日访问</span> + <p><a>{{ loginfo.todayVisitCount }}</a></p> + </div> + </a-col> + <a-col :span="8"> + <div class="head-info" :class="center && 'center'"> + <span>访问总览</span> + <p><a>{{ loginfo.totalVisitCount }}</a></p> + </div> + </a-col> + </a-row> + </div> + </a-card> + </a-col> + <a-col :xl="12" :lg="24" :md="24" :sm="24" :xs="24"> + <a-card :loading="loading" :bordered="false" title="销售额类别占比" :style="{ marginTop: '24px' }"> + <a-dropdown :trigger="['click']" placement="bottomLeft" slot="extra"> + <a class="ant-dropdown-link" href="#"> + <a-icon type="ellipsis" /> + </a> + <a-menu slot="overlay"> + <a-menu-item> + <a href="javascript:;">操作一</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">操作二</a> + </a-menu-item> + </a-menu> + </a-dropdown> + <p>card content</p> + <p>card content</p> + <p>card content</p> + </a-card> + </a-col> + </a-row> + </div> +</template> + +<script> + import ChartCard from '@/components/ChartCard' + import ACol from "ant-design-vue/es/grid/Col" + import ATooltip from "ant-design-vue/es/tooltip/Tooltip" + import MiniArea from '@/components/chart/MiniArea' + import MiniBar from '@/components/chart/MiniBar' + import MiniProgress from '@/components/chart/MiniProgress' + import RankList from '@/components/chart/RankList' + import Bar from '@/components/chart/Bar' + import Trend from '@/components/Trend' + import {getLoginfo} from '@/api/api.js' + + const rankList = [] + for (let i = 0; i < 7; i++) { + rankList.push({ + name: '白鹭岛 ' + (i+1) + ' 号店', + total: 1234.56 - i * 100 + }) + } + + export default { + name: "Analysis", + components: { + ATooltip, + ACol, + ChartCard, + MiniArea, + MiniBar, + MiniProgress, + RankList, + Bar, + Trend + }, + data() { + return { + loading: true, + rankList, + loginfo:{}, + } + }, + created() { + setTimeout(() => { + this.loading = !this.loading + }, 1000) + this.initLogInfo(); + }, + methods: { + initLogInfo () { + getLoginfo(null).then((res)=>{ + if(res.success){ + this.loginfo = res.result; + } + }) + }, + } + } +</script> + +<style lang="scss" scoped> + .extra-wrapper { + line-height: 55px; + padding-right: 24px; + + .extra-item { + display: inline-block; + margin-right: 24px; + + a { + margin-left: 24px; + } + } + } + + /* 首页访问量统计 */ + .head-info { + position: relative; + text-align: left; + padding: 0 32px 0 0; + min-width: 125px; + + &.center { + text-align: center; + padding: 0 32px; + } + + span { + color: rgba(0, 0, 0, .45); + display: inline-block; + font-size: .95rem; + line-height: 42px; + margin-bottom: 4px; + } + p { + line-height: 42px; + margin: 0; + a { + font-weight: 600; + font-size: 1rem; + } + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/dashboard/Monitor.vue b/ant-design-jeecg-vue/src/views/dashboard/Monitor.vue new file mode 100644 index 0000000..144e237 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/dashboard/Monitor.vue @@ -0,0 +1,15 @@ +<template> + <div> + Monitor + </div> +</template> + +<script> + export default { + name: "Monitor" + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/dashboard/Workplace.vue b/ant-design-jeecg-vue/src/views/dashboard/Workplace.vue new file mode 100644 index 0000000..0042c0b --- /dev/null +++ b/ant-design-jeecg-vue/src/views/dashboard/Workplace.vue @@ -0,0 +1,361 @@ +<template> + <page-layout :avatar="avatar"> + <div slot="headerContent"> + <div class="title">{{ timeFix }},{{ nickname() }}<span class="welcome-text">,{{ welcome() }}</span></div> + <div>前端工程师 | 蚂蚁金服 - 某某某事业群 - VUE平台</div> + </div> + <div slot="extra"> + <a-row class="more-info"> + <a-col :span="8"> + <head-info title="项目数" content="56" :center="false" :bordered="false"/> + </a-col> + <a-col :span="8"> + <head-info title="团队排名" content="8/24" :center="false" :bordered="false"/> + </a-col> + <a-col :span="8"> + <head-info title="项目访问" content="2,223" :center="false" /> + </a-col> + </a-row> + </div> + + <div> + <a-row :gutter="24"> + <a-col :xl="16" :lg="24" :md="24" :sm="24" :xs="24"> + <a-card + class="project-list" + :loading="loading" + style="margin-bottom: 24px;" + :bordered="false" + title="进行中的项目" + :body-style="{ padding: 0 }"> + <a slot="extra">全部项目</a> + <div> + <a-card-grid class="project-card-grid" :key="i" v-for="(item, i) in projects"> + <a-card :bordered="false" :body-style="{ padding: 0 }"> + <a-card-meta> + <div slot="title" class="card-title"> + <a-avatar size="small" :src="item.cover"/> + <a>{{ item.title }}</a> + </div> + <div slot="description" class="card-description"> + {{ item.description }} + </div> + </a-card-meta> + <div class="project-item"> + <a href="/#/">科学搬砖组</a> + <span class="datetime">9小时前</span> + </div> + </a-card> + </a-card-grid> + </div> + </a-card> + + <a-card :loading="loading" title="动态" :bordered="false"> + <a-list> + <a-list-item :key="index" v-for="(item, index) in activities"> + <a-list-item-meta> + <a-avatar slot="avatar" :src="item.user.avatar" /> + <div slot="title"> + <span>{{ item.user.nickname }}</span> + 在 <a href="#">{{ item.project.name }}</a> + <span>{{ item.project.action }}</span> + <a href="#">{{ item.project.event }}</a> + </div> + <div slot="description">{{ item.time }}</div> + </a-list-item-meta> + </a-list-item> + </a-list> + </a-card> + </a-col> + <a-col + style="padding: 0 12px" + :xl="8" + :lg="24" + :md="24" + :sm="24" + :xs="24"> + <a-card title="快速开始 / 便捷导航" style="margin-bottom: 24px" :bordered="false" :body-style="{padding: 0}"> + <div class="item-group"> + <a>操作一</a> + <a>操作二</a> + <a>操作三</a> + <a>操作四</a> + <a>操作五</a> + <a>操作六</a> + <a-button size="small" type="primary" ghost icon="plus">添加</a-button> + </div> + </a-card> + <a-card title="XX 指数" style="margin-bottom: 24px" :loading="radarLoading" :bordered="false" :body-style="{ padding: 0 }"> + <div style="min-height: 400px;"> + <!-- :scale="scale" :axis1Opts="axis1Opts" :axis2Opts="axis2Opts" --> + <radar :data="radarData" /> + </div> + </a-card> + <a-card :loading="loading" title="团队" :bordered="false"> + <div class="members"> + <a-row> + <a-col :span="12" v-for="(item, index) in teams" :key="index"> + <a> + <a-avatar size="small" :src="item.avatar" /> + <span class="member">{{ item.name }}</span> + </a> + </a-col> + </a-row> + </div> + </a-card> + </a-col> + </a-row> + </div> + </page-layout> +</template> + +<script> + import { timeFix } from "@/utils/util" + import {mapGetters} from "vuex" + + import PageLayout from '@/components/page/PageLayout' + import HeadInfo from '@/components/tools/HeadInfo' + import Radar from '@/components/chart/Radar' + + import { getRoleList, getServiceList } from "@/api/manage" + import {imgView} from '@/api/api' + + const DataSet = require('@antv/data-set') + + export default { + name: "Workplace", + components: { + PageLayout, + HeadInfo, + Radar + }, + data() { + return { + timeFix: timeFix(), + avatar: '', + user: {}, + + projects: [], + loading: true, + radarLoading: true, + activities: [], + teams: [], + + // data + axis1Opts: { + dataKey: 'item', + line: null, + tickLine: null, + grid: { + lineStyle: { + lineDash: null + }, + hideFirstLine: false + } + }, + axis2Opts: { + dataKey: 'score', + line: null, + tickLine: null, + grid: { + type: 'polygon', + lineStyle: { + lineDash: null + } + } + }, + scale: [{ + dataKey: 'score', + min: 0, + max: 80 + }], + axisData: [ + { item: '引用', a: 70, b: 30, c: 40 }, + { item: '口碑', a: 60, b: 70, c: 40 }, + { item: '产量', a: 50, b: 60, c: 40 }, + { item: '贡献', a: 40, b: 50, c: 40 }, + { item: '热度', a: 60, b: 70, c: 40 }, + { item: '引用', a: 70, b: 50, c: 40 } + ], + radarData: [] + } + }, + computed: { + userInfo() { + return this.$store.getters.userInfo + } + }, + created() { + this.user = this.userInfo + this.avatar = imgView + this.userInfo.avatar + + getRoleList().then(res => { + console.log('workplace -> call getRoleList()', res) + }) + + getServiceList().then(res => { + console.log('workplace -> call getServiceList()', res) + }) + }, + mounted() { + this.getProjects() + this.getActivity() + this.getTeams() + this.initRadar() + }, + methods: { + ...mapGetters(["nickname", "welcome"]), + getProjects() { + this.$http.get('/api/list/search/projects') + .then(res => { + this.projects = res.result && res.result.data + this.loading = false + }) + }, + getActivity() { + this.$http.get('/api/workplace/activity') + .then(res => { + this.activities = res.result + }) + }, + getTeams() { + this.$http.get('/api/workplace/teams') + .then(res => { + this.teams = res.result + }) + }, + initRadar() { + this.radarLoading = true + + this.$http.get('/api/workplace/radar') + .then(res => { + + const dv = new DataSet.View().source(res.result) + dv.transform({ + type: 'fold', + fields: ['个人', '团队', '部门'], + key: 'user', + value: 'score' + }) + + this.radarData = dv.rows + this.radarLoading = false + }) + } + } + } +</script> + +<style lang="scss" scoped> + .project-list { + + .card-title { + font-size: 0; + + a { + color: rgba(0, 0, 0, 0.85); + margin-left: 12px; + line-height: 24px; + height: 24px; + display: inline-block; + vertical-align: top; + font-size: 14px; + + &:hover { + color: #1890ff; + } + } + } + .card-description { + color: rgba(0, 0, 0, 0.45); + height: 44px; + line-height: 22px; + overflow: hidden; + } + .project-item { + display: flex; + margin-top: 8px; + overflow: hidden; + font-size: 12px; + height: 20px; + line-height: 20px; + a { + color: rgba(0, 0, 0, 0.45); + display: inline-block; + flex: 1 1 0; + + &:hover { + color: #1890ff; + } + } + .datetime { + color: rgba(0, 0, 0, 0.25); + flex: 0 0 auto; + float: right; + } + } + .ant-card-meta-description { + color: rgba(0, 0, 0, 0.45); + height: 44px; + line-height: 22px; + overflow: hidden; + } + } + + .item-group { + padding: 20px 0 8px 24px; + font-size: 0; + a { + color: rgba(0, 0, 0, 0.65); + display: inline-block; + font-size: 14px; + margin-bottom: 13px; + width: 25%; + } + } + + .members { + a { + display: block; + margin: 12px 0; + line-height: 24px; + height: 24px; + .member { + font-size: 14px; + color: rgba(0, 0, 0, .65); + line-height: 24px; + max-width: 100px; + vertical-align: top; + margin-left: 12px; + transition: all 0.3s; + display: inline-block; + } + &:hover { + span { + color: #1890ff; + } + } + } + } + + .mobile { + + .project-list { + + .project-card-grid { + width: 100%; + } + } + + .more-info { + border: 0; + padding-top: 16px; + margin: 16px 0 16px; + } + + .headerContent .title .welcome-text { + display: none; + } + } + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/exception/403.vue b/ant-design-jeecg-vue/src/views/exception/403.vue new file mode 100644 index 0000000..e9fc399 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/exception/403.vue @@ -0,0 +1,17 @@ +<template> + <exception-page type="403" /> +</template> + +<script> + import ExceptionPage from './ExceptionPage' + + export default { + components: { + ExceptionPage + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/exception/404.vue b/ant-design-jeecg-vue/src/views/exception/404.vue new file mode 100644 index 0000000..bc747b5 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/exception/404.vue @@ -0,0 +1,17 @@ +<template> + <exception-page type="404" /> +</template> + +<script> + import ExceptionPage from './ExceptionPage' + + export default { + components: { + ExceptionPage + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/exception/500.vue b/ant-design-jeecg-vue/src/views/exception/500.vue new file mode 100644 index 0000000..a36cabe --- /dev/null +++ b/ant-design-jeecg-vue/src/views/exception/500.vue @@ -0,0 +1,17 @@ +<template> + <exception-page type="500" /> +</template> + +<script> + import ExceptionPage from './ExceptionPage' + + export default { + components: { + ExceptionPage + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/exception/ExceptionPage.vue b/ant-design-jeecg-vue/src/views/exception/ExceptionPage.vue new file mode 100644 index 0000000..a3a3357 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/exception/ExceptionPage.vue @@ -0,0 +1,88 @@ +<template> + <div class="exception"> + <div class="img"> + <img :src="config[type].img"/> + </div> + <div class="content"> + <h1>{{ config[type].title }}</h1> + <div class="desc">{{ config[type].desc }}</div> + <div class="action"> + <a-button type="primary" @click="handleToHome">返回首页</a-button> + </div> + </div> + </div> +</template> + +<script> + import types from './type' + + export default { + name: "Exception", + props: { + type: { + type: String, + default: '404' + } + }, + data() { + return { + config: types + } + }, + methods: { + handleToHome () { + this.$router.push({ name: 'dashboard' }) + } + } + } +</script> + +<style lang="scss" scoped> + .exception { + min-height: 500px; + height: 80%; + align-items: center; + text-align: center; + margin-top: 150px; + .img { + display: inline-block; + padding-right: 52px; + zoom: 1; + img { + height: 360px; + max-width: 430px; + } + } + .content { + display: inline-block; + flex: auto; + h1 { + color: #434e59; + font-size: 72px; + font-weight: 600; + line-height: 72px; + margin-bottom: 24px; + } + .desc { + color: rgba(0, 0, 0, .45); + font-size: 20px; + line-height: 28px; + margin-bottom: 16px; + } + } + } + + .mobile { + .exception { + margin-top: 30px; + .img { + padding-right: unset; + + img { + height: 40%; + max-width: 80%; + } + } + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/exception/type.js b/ant-design-jeecg-vue/src/views/exception/type.js new file mode 100644 index 0000000..3fc7b1f --- /dev/null +++ b/ant-design-jeecg-vue/src/views/exception/type.js @@ -0,0 +1,19 @@ +const types = { + 403: { + img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg', + title: '403', + desc: '抱歉,你无权访问该页面' + }, + 404: { + img: 'https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg', + title: '404', + desc: '抱歉,你访问的页面不存在或仍在开发中' + }, + 500: { + img: 'https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg', + title: '500', + desc: '抱歉,服务器出错了' + } +} + +export default types \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/form/BasicForm.vue b/ant-design-jeecg-vue/src/views/form/BasicForm.vue new file mode 100644 index 0000000..0e4bedc --- /dev/null +++ b/ant-design-jeecg-vue/src/views/form/BasicForm.vue @@ -0,0 +1,138 @@ +<template> + <a-card :body-style="{padding: '24px 32px'}" :bordered="false"> + <a-form @submit="handleSubmit" :form="form"> + <a-form-item + label="标题" + :labelCol="{lg: {span: 7}, sm: {span: 7}}" + :wrapperCol="{lg: {span: 10}, sm: {span: 17} }"> + <a-input + v-decorator="[ + 'name', + {rules: [{ required: true, message: '请输入标题' }]} + ]" + name="name" + placeholder="给目标起个名字" /> + </a-form-item> + <a-form-item + label="起止日期" + :labelCol="{lg: {span: 7}, sm: {span: 7}}" + :wrapperCol="{lg: {span: 10}, sm: {span: 17} }"> + <a-range-picker + name="buildTime" + style="width: 100%" + v-decorator="[ + 'buildTime', + {rules: [{ required: true, message: '请选择起止日期' }]} + ]" /> + </a-form-item> + <a-form-item + label="目标描述" + :labelCol="{lg: {span: 7}, sm: {span: 7}}" + :wrapperCol="{lg: {span: 10}, sm: {span: 17} }"> + <a-textarea + rows="4" + placeholder="请输入你阶段性工作目标" + v-decorator="[ + 'description', + {rules: [{ required: true, message: '请输入目标描述' }]} + ]" /> + </a-form-item> + <a-form-item + label="衡量标准" + :labelCol="{lg: {span: 7}, sm: {span: 7}}" + :wrapperCol="{lg: {span: 10}, sm: {span: 17} }"> + <a-textarea + rows="4" + placeholder="请输入衡量标准" + v-decorator="[ + 'type', + {rules: [{ required: true, message: '请输入衡量标准' }]} + ]" /> + </a-form-item> + <a-form-item + label="客户" + :labelCol="{lg: {span: 7}, sm: {span: 7}}" + :wrapperCol="{lg: {span: 10}, sm: {span: 17} }"> + <a-input + placeholder="请描述你服务的客户,内部客户直接 @姓名/工号" + v-decorator="[ + 'customer', + {rules: [{ required: true, message: '请描述你服务的客户' }]} + ]" /> + </a-form-item> + <a-form-item + label="邀评人" + :labelCol="{lg: {span: 7}, sm: {span: 7}}" + :wrapperCol="{lg: {span: 10}, sm: {span: 17} }" + :required="false" + > + <a-input placeholder="请直接 @姓名/工号,最多可邀请 5 人" /> + </a-form-item> + <a-form-item + label="权重" + :labelCol="{lg: {span: 7}, sm: {span: 7}}" + :wrapperCol="{lg: {span: 10}, sm: {span: 17} }" + :required="false" + > + <a-input-number :min="0" :max="100" /> + <span> %</span> + </a-form-item> + <a-form-item + label="目标公开" + :labelCol="{lg: {span: 7}, sm: {span: 7}}" + :wrapperCol="{lg: {span: 10}, sm: {span: 17} }" + :required="false" + help="客户、邀评人默认被分享" + > + <a-radio-group v-model="value"> + <a-radio :value="1">公开</a-radio> + <a-radio :value="2">部分公开</a-radio> + <a-radio :value="3">不公开</a-radio> + </a-radio-group> + <a-form-item> + <a-select mode="multiple" v-if="value === 2"> + <a-select-option value="4">同事一</a-select-option> + <a-select-option value="5">同事二</a-select-option> + <a-select-option value="6">同事三</a-select-option> + </a-select> + </a-form-item> + </a-form-item> + <a-form-item + :wrapperCol="{ span: 24 }" + style="text-align: center" + > + <a-button htmlType="submit" type="primary">提交</a-button> + <a-button style="margin-left: 8px">保存</a-button> + </a-form-item> + </a-form> + </a-card> +</template> + +<script> + export default { + name: 'BaseForm', + data () { + return { + description: '表单页用于向用户收集或验证信息,基础表单常见于数据项较少的表单场景。', + value: 1, + + // form + form: this.$form.createForm(this), + + } + }, + methods: { + + // handler + handleSubmit (e) { + e.preventDefault() + this.form.validateFields((err, values) => { + if (!err) { + // eslint-disable-next-line no-console + console.log('Received values of form: ', values) + } + }) + } + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/form/advancedForm/AdvancedForm.vue b/ant-design-jeecg-vue/src/views/form/advancedForm/AdvancedForm.vue new file mode 100644 index 0000000..4558984 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/form/advancedForm/AdvancedForm.vue @@ -0,0 +1,206 @@ +<template> + <div> + <a-card class="card" title="仓库管理" :bordered="false"> + <repository-form ref="repository" :showSubmit="false" /> + </a-card> + <a-card class="card" title="任务管理" :bordered="false"> + <task-form ref="task" :showSubmit="false" /> + </a-card> + + <!-- table --> + <a-card> + <form :autoFormCreate="(form) => this.form = form"> + <a-table + :columns="columns" + :dataSource="data" + :pagination="false" + > + <template v-for="(col, i) in ['name', 'workId', 'department']" :slot="col" slot-scope="text, record, index"> + <a-input + :key="col" + v-if="record.editable" + style="margin: -5px 0" + :value="text" + :placeholder="columns[i].title" + @change="e => handleChange(e.target.value, record.key, col)" + /> + <template v-else>{{ text }}</template> + </template> + <template slot="operation" slot-scope="text, record, index"> + <template v-if="record.editable"> + <span v-if="record.isNew"> + <a @click="saveRow(record.key)">添加</a> + <a-divider type="vertical" /> + <a-popconfirm title="是否要删除此行?" @confirm="remove(record.key)"> + <a>删除</a> + </a-popconfirm> + </span> + <span v-else> + <a @click="saveRow(record.key)">保存</a> + <a-divider type="vertical" /> + <a @click="cancel(record.key)">取消</a> + </span> + </template> + <span v-else> + <a @click="toggle(record.key)">编辑</a> + <a-divider type="vertical" /> + <a-popconfirm title="是否要删除此行?" @confirm="remove(record.key)"> + <a>删除</a> + </a-popconfirm> + </span> + </template> + </a-table> + <a-button style="width: 100%; margin-top: 16px; margin-bottom: 8px" type="dashed" icon="plus" @click="newMember">新增成员</a-button> + </form> + </a-card> + + <!-- fixed footer toolbar --> + <footer-tool-bar> + <a-button type="primary" @click="validate" :loading="loading">提交</a-button> + </footer-tool-bar> + </div> +</template> + +<script> + import RepositoryForm from './RepositoryForm' + import TaskForm from './TaskForm' + import FooterToolBar from '@/components/tools/FooterToolBar' + + export default { + name: "AdvancedForm", + components: { + FooterToolBar, + RepositoryForm, + TaskForm + }, + data () { + return { + description: '高级表单常见于一次性输入和提交大批量数据的场景。', + loading: false, + + // table + columns: [ + { + title: '成员姓名', + dataIndex: 'name', + key: 'name', + width: '20%', + scopedSlots: { customRender: 'name' } + }, + { + title: '工号', + dataIndex: 'workId', + key: 'workId', + width: '20%', + scopedSlots: { customRender: 'workId' } + }, + { + title: '所属部门', + dataIndex: 'department', + key: 'department', + width: '40%', + scopedSlots: { customRender: 'department' } + }, + { + title: '操作', + key: 'action', + scopedSlots: { customRender: 'operation' } + } + ], + data: [ + { + key: '1', + name: '小明', + workId: '001', + editable: false, + department: '行政部' + }, + { + key: '2', + name: '李莉', + workId: '002', + editable: false, + department: 'IT部' + }, + { + key: '3', + name: '王小帅', + workId: '003', + editable: false, + department: '财务部' + } + ] + } + }, + methods: { + handleSubmit (e) { + e.preventDefault() + }, + newMember () { + this.data.push({ + key: '-1', + name: '', + workId: '', + department: '', + editable: true, + isNew: true + }) + }, + remove (key) { + const newData = this.data.filter(item => item.key !== key) + this.data = newData + }, + saveRow (key) { + let target = this.data.filter(item => item.key === key)[0] + target.editable = false + target.isNew = false + }, + toggle (key) { + let target = this.data.filter(item => item.key === key)[0] + target.editable = !target.editable + }, + getRowByKey (key, newData) { + const data = this.data + return (newData || data).filter(item => item.key === key)[0] + }, + cancel (key) { + let target = this.data.filter(item => item.key === key)[0] + target.editable = false + }, + handleChange (value, key, column) { + const newData = [...this.data] + const target = newData.filter(item => key === item.key)[0] + if (target) { + target[column] = value + this.data = newData + } + }, + + // 最终全页面提交 + validate () { + this.$refs.repository.form.validateFields((err, values) => { + if (!err) { + this.$notification['error']({ + message: 'Received values of form:', + description: values + }) + } + }) + this.$refs.task.form.validateFields((err, values) => { + if (!err) { + this.$notification['error']({ + message: 'Received values of form:', + description: values + }) + } + }) + } + } + } +</script> + +<style lang="scss" scoped> + .card{ + margin-bottom: 24px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/form/advancedForm/RepositoryForm.vue b/ant-design-jeecg-vue/src/views/form/advancedForm/RepositoryForm.vue new file mode 100644 index 0000000..0ad1fad --- /dev/null +++ b/ant-design-jeecg-vue/src/views/form/advancedForm/RepositoryForm.vue @@ -0,0 +1,119 @@ +<template> + <a-form @submit="handleSubmit" :form="form" class="form"> + <a-row class="form-row" :gutter="16"> + <a-col :lg="6" :md="12" :sm="24"> + <a-form-item label="仓库名"> + <a-input + placeholder="请输入仓库名称" + v-decorator="[ + 'repository.name', + {rules: [{ required: true, message: '请输入仓库名称', whitespace: true}]} + ]" /> + </a-form-item> + </a-col> + <a-col :xl="{span: 7, offset: 1}" :lg="{span: 8}" :md="{span: 12}" :sm="24"> + <a-form-item + label="仓库域名"> + <a-input + addonBefore="http://" + addonAfter=".com" + placeholder="请输入" + v-decorator="[ + 'repository.domain', + {rules: [{ required: true, message: '请输入仓库域名', whitespace: true}, {validator: validate}]} + ]" /> + </a-form-item> + </a-col> + <a-col :xl="{span: 9, offset: 1}" :lg="{span: 10}" :md="{span: 24}" :sm="24"> + <a-form-item + label="仓库管理员"> + <a-select placeholder="请选择管理员" v-decorator="[ 'repository.manager', {rules: [{ required: true, message: '请选择管理员'}]} ]"> + <a-select-option value="王同学">王同学</a-select-option> + <a-select-option value="李同学">李同学</a-select-option> + <a-select-option value="黄同学">黄同学</a-select-option> + </a-select> + </a-form-item> + </a-col> + </a-row> + <a-row class="form-row" :gutter="16"> + <a-col :lg="6" :md="12" :sm="24"> + <a-form-item + label="审批人"> + <a-select placeholder="请选择审批员" v-decorator="[ 'repository.auditor', {rules: [{ required: true, message: '请选择审批员'}]} ]"> + <a-select-option value="王晓丽">王晓丽</a-select-option> + <a-select-option value="李军">李军</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :xl="{span: 7, offset: 1}" :lg="{span: 8}" :md="{span: 12}" :sm="24"> + <a-form-item + label="生效日期"> + <a-range-picker + style="width: 100%" + v-decorator="[ + 'repository.effectiveDate', + {rules: [{ required: true, message: '请选择生效日期'}]} + ]" /> + </a-form-item> + </a-col> + <a-col :xl="{span: 9, offset: 1}" :lg="{span: 10}" :md="{span: 24}" :sm="24"> + <a-form-item + label="仓库类型"> + <a-select + placeholder="请选择仓库类型" + v-decorator="[ + 'repository.type', + {rules: [{ required: true, message: '请选择仓库类型'}]} + ]" > + <a-select-option value="公开">公开</a-select-option> + <a-select-option value="私密">私密</a-select-option> + </a-select> + </a-form-item> + </a-col> + </a-row> + <a-form-item v-if="showSubmit"> + <a-button htmlType="submit" >Submit</a-button> + </a-form-item> + </a-form> +</template> + +<script> + export default { + name: "RepositoryForm", + props: { + showSubmit: { + type: Boolean, + default: false + } + }, + data () { + return { + form: this.$form.createForm(this) + } + }, + methods: { + handleSubmit (e) { + e.preventDefault() + this.form.validateFields((err, values) => { + if (!err) { + this.$notification['error']({ + message: 'Received values of form:', + description: values + }) + } + }) + }, + validate (rule, value, callback) { + const regex = /^user-(.*)$/ + if (!regex.test(value)) { + callback('需要以 user- 开头') + } + callback() + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/form/advancedForm/TaskForm.vue b/ant-design-jeecg-vue/src/views/form/advancedForm/TaskForm.vue new file mode 100644 index 0000000..e1af2ae --- /dev/null +++ b/ant-design-jeecg-vue/src/views/form/advancedForm/TaskForm.vue @@ -0,0 +1,107 @@ +<template> + <a-form @submit="handleSubmit" :form="form" class="form"> + <a-row class="form-row" :gutter="16"> + <a-col :lg="6" :md="12" :sm="24"> + <a-form-item + label="任务名"> + <a-input placeholder="请输入任务名称" v-decorator="[ 'task.name', {rules: [{ required: true, message: '请输入任务名称', whitespace: true}]} ]" /> + </a-form-item> + </a-col> + <a-col :xl="{span: 7, offset: 1}" :lg="{span: 8}" :md="{span: 12}" :sm="24"> + <a-form-item + label="任务描述"> + <a-input placeholder="请输入任务描述" v-decorator="[ 'task.description', {rules: [{ required: true, message: '请输入任务描述', whitespace: true}]} ]" /> + </a-form-item> + </a-col> + <a-col :xl="{span: 9, offset: 1}" :lg="{span: 10}" :md="{span: 24}" :sm="24"> + <a-form-item + label="执行人"> + <a-select + placeholder="请选择执行人" + v-decorator="[ + 'task.executor', + {rules: [{ required: true, message: '请选择执行人'}]} + ]" > + <a-select-option value="黄丽丽">黄丽丽</a-select-option> + <a-select-option value="李大刀">李大刀</a-select-option> + </a-select> + </a-form-item> + </a-col> + </a-row> + <a-row class="form-row" :gutter="16"> + <a-col :lg="6" :md="12" :sm="24"> + <a-form-item + label="责任人"> + <a-select + placeholder="请选择责任人" + v-decorator="[ + 'task.manager', + {rules: [{ required: true, message: '请选择责任人'}]} + ]" > + <a-select-option value="王伟">王伟</a-select-option> + <a-select-option value="李红军">李红军</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :xl="{span: 7, offset: 1}" :lg="{span: 8}" :md="{span: 12}" :sm="24"> + <a-form-item + label="提醒时间"> + <a-time-picker + style="width: 100%" + v-decorator="[ + 'task.time', + {rules: [{ required: true, message: '请选择提醒时间'}]} + ]" /> + </a-form-item> + </a-col> + <a-col :xl="{span: 9, offset: 1}" :lg="{span: 10}" :md="{span: 24}" :sm="24"> + <a-form-item + label="任务类型"> + <a-select + placeholder="请选择任务类型" + v-decorator="[ 'task.type', {rules: [{ required: true, message: '请选择任务类型'}]} ]" > + <a-select-option value="定时执行">定时执行</a-select-option> + <a-select-option value="周期执行">周期执行</a-select-option> + </a-select> + </a-form-item> + </a-col> + </a-row> + <a-form-item v-if="showSubmit"> + <a-button htmlType="submit" >Submit</a-button> + </a-form-item> + </a-form> +</template> + +<script> + export default { + name: "TaskForm", + props: { + showSubmit: { + type: Boolean, + default: false + } + }, + data () { + return { + form: this.$form.createForm(this) + } + }, + methods: { + handleSubmit (e) { + e.preventDefault() + this.form.validateFields((err, values) => { + if (!err) { + this.$notification['error']({ + message: 'Received values of form:', + description: values + }) + } + }) + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/form/stepForm/Step1.vue b/ant-design-jeecg-vue/src/views/form/stepForm/Step1.vue new file mode 100644 index 0000000..384602c --- /dev/null +++ b/ant-design-jeecg-vue/src/views/form/stepForm/Step1.vue @@ -0,0 +1,60 @@ +<template> + <div> + <a-form style="max-width: 500px; margin: 40px auto 0;"> + <a-form-item + label="付款账户" + :labelCol="{span: 5}" + :wrapperCol="{span: 19}" + > + <a-select value="1" placeholder="ant-design@alipay.com"> + <a-select-option value="1">ant-design@alipay.com</a-select-option> + </a-select> + </a-form-item> + <a-form-item + label="收款账户" + :labelCol="{span: 5}" + :wrapperCol="{span: 19}" + > + <a-input-group :compact="true" style="display: inline-block; vertical-align: middle"> + <a-select defaultValue="alipay" style="width: 100px"> + <a-select-option value="alipay">支付宝</a-select-option> + <a-select-option value="wexinpay">微信</a-select-option> + </a-select> + <a-input :style="{width: 'calc(100% - 100px)'}" value="test@example.com"/> + </a-input-group> + </a-form-item> + <a-form-item + label="收款人姓名" + :labelCol="{span: 5}" + :wrapperCol="{span: 19}" + > + <a-input value="Alex" /> + </a-form-item> + <a-form-item + label="转账金额" + :labelCol="{span: 5}" + :wrapperCol="{span: 19}" + > + <a-input prefix="¥" value="5000" /> + </a-form-item> + <a-form-item :wrapperCol="{span: 19, offset: 5}"> + <a-button type="primary" @click="nextStep">下一步</a-button> + </a-form-item> + </a-form> + </div> +</template> + +<script> + export default { + name: "Step1", + methods: { + nextStep () { + this.$emit('nextStep') + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/form/stepForm/Step2.vue b/ant-design-jeecg-vue/src/views/form/stepForm/Step2.vue new file mode 100644 index 0000000..dd1002d --- /dev/null +++ b/ant-design-jeecg-vue/src/views/form/stepForm/Step2.vue @@ -0,0 +1,82 @@ +<template> + <div> + <a-form style="max-width: 500px; margin: 40px auto 0;"> + <a-alert + :closable="true" + message="确认转账后,资金将直接打入对方账户,无法退回。" + style="margin-bottom: 24px;" + /> + <a-form-item + label="付款账户" + :labelCol="{span: 5}" + :wrapperCol="{span: 19}" + class="stepFormText" + > + ant-design@alipay.com + </a-form-item> + <a-form-item + label="收款账户" + :labelCol="{span: 5}" + :wrapperCol="{span: 19}" + class="stepFormText" + > + test@example.com + </a-form-item> + <a-form-item + label="收款人姓名" + :labelCol="{span: 5}" + :wrapperCol="{span: 19}" + class="stepFormText" + > + Alex + </a-form-item> + <a-form-item + label="转账金额" + :labelCol="{span: 5}" + :wrapperCol="{span: 19}" + class="stepFormText" + > + ¥ 5,000.00 + </a-form-item> + <a-form-item :wrapperCol="{span: 19, offset: 5}"> + <a-button :loading="loading" type="primary" @click="nextStep">提交</a-button> + <a-button style="margin-left: 8px" @click="prevStep">上一步</a-button> + </a-form-item> + </a-form> + </div> +</template> + +<script> + export default { + name: "Step2", + data () { + return { + loading: false + } + }, + methods: { + nextStep () { + let that = this + that.loading = true + setTimeout(function () { + that.$emit('nextStep') + }, 1500) + }, + prevStep () { + this.$emit('prevStep') + } + } + } +</script> + +<style lang="scss" scoped> + .stepFormText { + margin-bottom: 24px; + + .ant-form-item-label, + .ant-form-item-control { + line-height: 22px; + } + } + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/form/stepForm/Step3.vue b/ant-design-jeecg-vue/src/views/form/stepForm/Step3.vue new file mode 100644 index 0000000..513af0f --- /dev/null +++ b/ant-design-jeecg-vue/src/views/form/stepForm/Step3.vue @@ -0,0 +1,69 @@ +<template> + <div> + <a-form style="margin: 40px auto 0;"> + <result title="操作成功" :is-success="true" description="预计两小时内到账"> + <div class="information"> + <a-row> + <a-col :sm="8" :xs="24">付款账户:</a-col> + <a-col :sm="16" :xs="24">ant-design@alipay.com</a-col> + </a-row> + <a-row> + <a-col :sm="8" :xs="24">收款账户:</a-col> + <a-col :sm="16" :xs="24">test@example.com</a-col> + </a-row> + <a-row> + <a-col :sm="8" :xs="24">收款人姓名:</a-col> + <a-col :sm="16" :xs="24">辉夜</a-col> + </a-row> + <a-row> + <a-col :sm="8" :xs="24">转账金额:</a-col> + <a-col :sm="16" :xs="24"><span class="money">500</span> 元</a-col> + </a-row> + </div> + <div slot="action"> + <a-button type="primary" @click="finish">再转一笔</a-button> + <a-button style="margin-left: 8px" @click="toOrderList">查看账单</a-button> + </div> + </result> + </a-form> + </div> +</template> + +<script> + import Result from '../../result/Result' + + export default { + name: "Step3", + components: { + Result + }, + data () { + return { + loading: false + } + }, + methods: { + finish () { + this.$emit('finish') + }, + toOrderList () { + this.$router.push('/list/query-list') + } + } + } +</script> +<style lang="scss" scoped> + .information { + line-height: 22px; + + .ant-row:not(:last-child) { + margin-bottom: 24px; + } + } + .money { + font-family: "Helvetica Neue",sans-serif; + font-weight: 500; + font-size: 20px; + line-height: 14px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/form/stepForm/StepForm.vue b/ant-design-jeecg-vue/src/views/form/stepForm/StepForm.vue new file mode 100644 index 0000000..e1ab116 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/form/stepForm/StepForm.vue @@ -0,0 +1,62 @@ +<template> + <a-card :bordered="false"> + <a-steps class="steps" :current="currentTab"> + <a-step title="填写转账信息" /> + <a-step title="确认转账信息" /> + <a-step title="完成" /> + </a-steps> + <div class="content"> + <step1 v-if="currentTab === 0" @nextStep="nextStep"/> + <step2 v-if="currentTab === 1" @nextStep="nextStep" @prevStep="prevStep"/> + <step3 v-if="currentTab === 2" @prevStep="prevStep" @finish="finish"/> + </div> + </a-card> +</template> + +<script> + import Step1 from './Step1' + import Step2 from './Step2' + import Step3 from './Step3' + + export default { + name: "StepForm", + components: { + Step1, + Step2, + Step3 + }, + data () { + return { + description: '将一个冗长或用户不熟悉的表单任务分成多个步骤,指导用户完成。', + currentTab: 0, + + // form + form: null, + } + }, + methods: { + + // handler + nextStep () { + if (this.currentTab < 2) { + this.currentTab += 1 + } + }, + prevStep () { + if (this.currentTab > 0) { + this.currentTab -= 1 + } + }, + finish () { + this.currentTab = 0 + } + } + } +</script> + +<style lang="scss" scoped> + .steps { + max-width: 750px; + margin: 16px auto; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/FlowTest.vue b/ant-design-jeecg-vue/src/views/jeecg/FlowTest.vue new file mode 100644 index 0000000..19f832d --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/FlowTest.vue @@ -0,0 +1,93 @@ +<template> + <a-card :bordered="false"> + <a-row> + <a-col :span="2"> + <a-select defaultValue="POST" style="width: 90px" @change="handleChange" size="large"> + <a-select-option value="POST">POST</a-select-option> + <!--<a-select-option value="GET">GET</a-select-option>--> + </a-select> + </a-col> + <a-col :span="22"> + <a-input-search + placeholder="input send url" + v-model="url" + @search="onSearch" + enterButton="Send" + size="large" /> + </a-col> + </a-row> + + <a-tabs defaultActiveKey="2"> + <a-tab-pane tab="params" key="2"> + <textarea style="width:100%;font-size: 16px;font-weight:500" :rows="13" @input="changeVal"> + </textarea> + </a-tab-pane> + </a-tabs> + + <a-tabs defaultActiveKey="1"> + <a-tab-pane tab="response" key="1"> + <textarea style="width:100%;font-size: 16px;font-weight:500" :rows="10" v-html="resultJson" readonly> + </textarea> + </a-tab-pane> + </a-tabs> + </a-card> +</template> +<script> + import { postAction,getAction } from '@/api/manage' + import { ACCESS_TOKEN } from "@/store/mutation-types" + import Vue from 'vue' + export default { + name: 'FlowTest', + data(){ + return { + url:"", + paramJson:"", + resultJson:{}, + requestMethod:"POST" + } + }, + methods: { + onSearch (value) { + let that = this + this.resultJson = {}; + if("POST"===this.requestMethod.toUpperCase()){ + postAction(value,this.paramJson).then((res)=>{ + console.log(res) + this.resultJson = res + }).catch((err) => { + that.$message.error("请求异常:"+err) + }) + }else { + getAction(value,this.paramJson).then((res)=>{ + console.log(res) + this.resultJson = res; + }).catch((err) => { + that.$message.error("请求异常:"+err) + }) + } + }, + changeVal(e){ + try { + let json = e.target.value; + json = json.replace(/\n/g,""); + json = json.replace(/\s*/g,""); + if(json.indexOf(",}")>0){ + json = json.replace(",}","}"); + } + this.paramJson = JSON.parse(json); + }catch (e) { + console.log(e); + this.$message.error("非法的JSON字符串") + } + }, + handleChange(value) { + this.requestMethod = value; + }, + created () { + const token = Vue.ls.get(ACCESS_TOKEN); + this.headers = {"X-Access-Token":token} + + } + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/JeecgDemoList.vue b/ant-design-jeecg-vue/src/views/jeecg/JeecgDemoList.vue new file mode 100644 index 0000000..1a94ec5 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/JeecgDemoList.vue @@ -0,0 +1,404 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :span="6"> + <a-form-item label="名称"> + <a-input placeholder="请输入名称查询" v-model="queryParam.name"></a-input> + </a-form-item> + </a-col> + <a-col :span="6"> + <a-form-item label="年龄"> + <a-input placeholder="请输入名称查询" v-model="queryParam.age"></a-input> + </a-form-item> + </a-col> + <a-col :span="6"> + <a-form-item label="性别"> + <DictSelectTag v-model="queryParam.sex" placeholder="请输入用户性别" dictCode="sex"/> + </a-form-item> + </a-col> + + <a-col :span="6" > + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + <a-button type="primary" @click="superQuery" icon="filter" style="margin-left: 8px">高级查询</a-button> + </span> + </a-col> + + </a-row> + </a-form> + </div> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + <a-button type="primary" icon="plus" @click="jump">创建单据</a-button> + <a-button type="primary" icon="plus" @click="onetomany">一对多</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"> + <a-icon type="delete"/> + 删除 + </a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 + <a-icon type="down"/> + </a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ + selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="middle" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical"/> + <a-dropdown> + <a class="ant-dropdown-link">更多 <a-icon type="down"/></a> + <a-menu slot="overlay"> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <jeecgDemo-modal ref="jeecgDemoModal" @ok="modalFormOk"></jeecgDemo-modal> + + <!-- 一对多表单区域 --> + <JeecgDemoTabsModal ref="jeecgDemoTabsModal" @ok="modalFormOk"></JeecgDemoTabsModal> + + <!-- 高级查询区域 --> + <superQueryModal ref="superQueryModal" @ok="modalFormOk" @handleSuperQuery="handleSuperQuery"></superQueryModal> + </a-card> +</template> + +<script> + import JeecgDemoModal from './modules/JeecgDemoModal' + import SuperQueryModal from './modules/SuperQueryModal' + import JeecgDemoTabsModal from './modules/JeecgDemoTabsModal' + import {filterObj} from '@/utils/util' + import {deleteAction, getAction, postAction} from '@/api/manage' + import {initDictOptions, filterDictText} from '@/components/dict/DictSelectUtil' + + export default { + name: "JeecgDemoList", + components: { + JeecgDemoModal, + SuperQueryModal, + JeecgDemoTabsModal, + }, + data() { + return { + description: '用户管理页面', + // 查询条件 + queryParam: {}, + //字典数组缓存 + sexDictOptions: [], + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key: 'rowIndex', + width: 60, + align: "center", + customRender: function (t, r, index) { + return parseInt(index) + 1; + } + }, + { + title: '姓名', + align: "center", + dataIndex: 'name' + }, + { + title: '关键词', + align: "center", + dataIndex: 'keyWord' + }, + { + title: '打卡时间', + align: "center", + dataIndex: 'punchTime' + }, + { + title: '性别', + align: "center", + dataIndex: 'sex', + customRender: (text, record, index) => { + //字典值替换通用方法 + return filterDictText(this.sexDictOptions, text); + } + }, + { + title: '年龄', + align: "center", + dataIndex: 'age' + }, + { + title: '生日', + align: "center", + dataIndex: 'birthday' + }, + { + title: '邮箱', + align: "center", + dataIndex: 'email' + }, + { + title: '个人简介', + align: "center", + dataIndex: 'content' + }, + { + title: '操作', + dataIndex: 'action', + align: "center", + scopedSlots: {customRender: 'action'}, + } + ], + //数据集 + dataSource: [], + // 分页参数 + ipagination: { + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter: { + column: 'createTime', + order: 'desc', + }, + loading: false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/test/jeecgDemo/list", + delete: "/test/jeecgDemo/delete", + deleteBatch: "/test/jeecgDemo/deleteBatch", + }, + + } + }, + created() { + this.loadData(); + //初始化字典配置 + this.initDictConfig(); + }, + methods: { + loadData(arg) { + //加载数据 若传入参数1则加载第一页的内容 + if (arg === 1) { + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list, params).then((res) => { + if (res.success) { + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + handleSuperQuery(arg) {//高级查询方法 + let params = {'superQueryParams':encodeURI(JSON.stringify(arg))}; + getAction(this.url.list, params).then((res) => { + if (res.success) { + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + }else{ + that.$message.warn(res.message); + } + }) + }, + initDictConfig() { + //初始化字典 - 性别 + initDictOptions('sex').then((res) => { + if (res.success) { + this.sexDictOptions = res.result; + } + }); + }, + getQueryParams() { + var param = Object.assign({}, this.queryParam, this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField() { + //TODO 字段权限控制 + var str = "id,"; + this.columns.forEach(function (value, index) { + str += "," + value.dataIndex; + }); + return str; + }, + onSelectChange(selectedRowKeys, selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected() { + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchQuery() { + this.loadData(1); + }, + superQuery() { + this.$refs.superQueryModal.show(); + }, + searchReset() { + var that = this; + that.queryParam = {} + that.loadData(1); + }, + batchDel: function () { + if (this.selectedRowKeys.length <= 0) { + this.$message.warning('请选择一条记录!'); + return; + } else { + var ids = ""; + for (var a = 0; a < this.selectedRowKeys.length; a++) { + ids += this.selectedRowKeys[a] + ","; + } + var that = this; + this.$confirm({ + title: "确认删除", + content: "是否删除选中数据?", + onOk: function () { + deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => { + if (res.success) { + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + } else { + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function (id) { + var that = this; + deleteAction(that.url.delete, {id: id}).then((res) => { + if (res.success) { + that.$message.success(res.message); + that.loadData(); + } else { + that.$message.warning(res.message); + } + }); + }, + handleEdit: function (record) { + this.$refs.jeecgDemoModal.edit(record); + this.$refs.jeecgDemoModal.title = "编辑"; + }, + onetomany: function (record) { + this.$refs.jeecgDemoTabsModal.add(); + this.$refs.jeecgDemoTabsModal.title = "编辑"; + }, + handleAdd: function () { + this.$refs.jeecgDemoModal.add(); + this.$refs.jeecgDemoModal.title = "新增"; + }, + handleTableChange(pagination, filters, sorter) { + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length > 0) { + this.isorter.column = sorter.field; + this.isorter.order = "ascend" == sorter.order ? "asc" : "desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk() { + // 新增/修改 成功时,重载列表 + this.loadData(); + }, + //跳转单据页面 + jump() { + this.$router.push({path: '/jeecg/helloworld'}) + } + } + } +</script> +<style scoped> + .ant-card-body .table-operator { + margin-bottom: 18px; + } + + .ant-layout-content { + margin: 12px 16px 0 !important; + } + + .ant-table-tbody .ant-table-row td { + padding-top: 15px; + padding-bottom: 15px; + } + + .anty-row-operator button { + margin: 0 5px + } + + .ant-btn-danger { + background-color: #ffffff + } + + .ant-modal-cust-warp { + height: 100% + } + + .ant-modal-cust-warp .ant-modal-body { + height: calc(100% - 110px) !important; + overflow-y: auto + } + + .ant-modal-cust-warp .ant-modal-content { + height: 90% !important; + overflow-y: hidden + } + /** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainList.vue b/ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainList.vue new file mode 100644 index 0000000..43d755e --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainList.vue @@ -0,0 +1,316 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :span="6"> + <a-form-item label="订单号"> + <a-input placeholder="请输入订单号" v-model="queryParam.orderCode"></a-input> + </a-form-item> + </a-col> + <a-col :span="6"> + <a-form-item label="订单类型"> + <a-select placeholder="请输入订单类型" v-model="queryParam.ctype"> + <a-select-option value="1">国内订单</a-select-option> + <a-select-option value="2">国际订单</a-select-option> + </a-select> + </a-form-item> + </a-col> + + <a-col :span="8" > + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + + </a-row> + </a-form> + </div> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="middle" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> + <a-menu slot="overlay"> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <jeecgOrderMain-modal ref="jeecgOrderMainModal" @ok="modalFormOk"></jeecgOrderMain-modal> + </a-card> +</template> + +<script> + import JeecgOrderMainModal from './modules/JeecgOrderMainModal' + import { filterObj } from '@/utils/util' + import { deleteAction,getAction } from '@/api/manage' + + export default { + name: "JeecgOrderMainList", + components: { + JeecgOrderMainModal + }, + data () { + return { + description: '订单管理页面', + // 查询条件 + queryParam: {}, + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + { + title: '订单号', + align:"center", + dataIndex: 'orderCode' + }, + { + title: '订单类型', + align:"center", + dataIndex: 'ctype', + customRender: (text, record, index) => { + let re = ""; + if (text === '1') { + re = "国内订单"; + } else if (text === '2') { + re = "国际订单"; + } + return re; + } + }, + { + title: '订单日期', + align:"center", + dataIndex: 'orderDate' + }, + { + title: '订单金额', + align:"center", + dataIndex: 'orderMoney' + }, + { + title: '订单备注', + align:"center", + dataIndex: 'content' + }, + { + title: '操作', + dataIndex: 'action', + align:"center", + scopedSlots: { customRender: 'action' }, + } + ], + //数据集 + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/test/jeecgOrderMain/list", + delete: "/test/jeecgOrderMain/delete", + deleteBatch: "/test/jeecgOrderMain/deleteBatch", + }, + + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list,params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + var that = this; + that.queryParam={}; + that.loadData(1); + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function(id){ + var that = this; + deleteAction(that.url.delete,{id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleEdit: function(record){ + this.$refs.jeecgOrderMainModal.edit(record); + this.$refs.jeecgOrderMainModal.title="编辑"; + }, + handleAdd: function(){ + this.$refs.jeecgOrderMainModal.add(); + this.$refs.jeecgOrderMainModal.title="新增"; + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + } + } + } +</script> +<style scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/PrintDemoList.vue b/ant-design-jeecg-vue/src/views/jeecg/PrintDemoList.vue new file mode 100644 index 0000000..e9d483d --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/PrintDemoList.vue @@ -0,0 +1,208 @@ +<template> + <a-card :bordered="false" :class="{'abcdefg':true}"> + <div class="no-print" style="text-align: right"> + <a-button v-print="'#acceptProof'" ghost type="primary">打印</a-button> + </div> + <section ref="print" id="acceptProof" class="abcdefg"> + <div style="text-align: center"> + <p style="font-size: 24px;font-weight: 800">打印测试表单</p> + </div> + <!--签字--> + <div class="sign" style="text-align: left"> + <a-form-item label="打印员:" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback> + <a-input placeholder="请输入您的名字"/> + </a-form-item> + <a-form-item label="打印日期:" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback> + <a-date-picker></a-date-picker> + </a-form-item> + <a-form-item label="打印内容:" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback> + <a-textarea placeholder="请输入打印内容..."/> + </a-form-item> + <a-form-item label="打印目的:" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback> + <a-textarea placeholder="请输入打印目的..."/> + </a-form-item> + <a-form-item label="打印说明:" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback> + <a-textarea placeholder="请输入打印说明..."/> + </a-form-item> + <a-form-item label="打印图片:" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback> + <a-upload + action="//jsonplaceholder.typicode.com/posts/" + listType="picture-card" + :fileList="fileList" + @preview="handlePreview" + @change="handleChange"> + <div v-if="fileList.length < 3"> + <a-icon type="plus" /> + <div class="ant-upload-text">Upload</div> + </div> + </a-upload> + <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel"> + <img alt="example" style="width: 100%" :src="previewImage" /> + </a-modal> + </a-form-item> + </div> + </section> + </a-card> + <!--</page-layout>--> +</template> +<script> + import ACol from "ant-design-vue/es/grid/Col"; + import ARow from "ant-design-vue/es/grid/Row"; + import {getAction} from '@/api/manage'; + import ATextarea from 'ant-design-vue/es/input/TextArea' + + export default { + components: { + ATextarea, + ARow, + ACol, + }, + name: 'Printgzsld', + props:{ + reBizCode:{ + type: String, + default: '' + } + }, + data(){ + return { + columns: [ +/* { + title: '已提交的文件资料', + dataIndex: 'fileCategoryName', + align:"center", + }, + { + title: '份数', + dataIndex: 'fileNum', + align:"center", + }, + { + title: '材料介质', + dataIndex: 'fileType', + align:"center", + },*/ + ], + dataSource:[], + applicantName:"", + labelCol: { + xs: { span: 24 }, + sm: { span: 2 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 8 }, + }, + beginYear:"", + beginMonth:"", + beginDay:"", + endYear:"", + endMonth:"", + endDay:"", + ipagination:{ + hideOnSinglePage:false, + }, + previewVisible: false, + previewImage: '', + fileList: [{ + uid: '-1', + name: 'xxx.png', + status: 'done', + url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', + }, + { + uid:'-2', + name:'pic1.png', + status:'done', + url:'https://www.gizbot.com/img/2016/11/whatsapp-error-lead-image-08-1478607387.jpg', + } + ], + url:{ + loadApplicant:"/sps/register/loadApplicants", + loadRegisterFiles:"/sps/register/getRegisterFilesConfig", + } + } + }, + created() { + this.getDate(); + }, + methods: { + loadData(reBizCode){ + // 获取材料文件 + getAction(this.url.loadRegisterFiles,{reBizCode:reBizCode}).then((res)=>{ + if(res.success){ + console.log(res.result) + this.dataSource = res.result; + } + }); + // 获取申请人信息 + getAction(this.url.loadApplicant,{reBizCode:reBizCode}).then((res)=>{ + if(res.success){ + this.applicant = res.result; + var name =""; + for(var i=0;i<res.result.length;i++){ + if(i==res.result.length-1){ + name = name+res.result[i].name; + }else{ + name = name+res.result[i].name+","; + } + } + if(name=="" || name==null ||name=="null"){ + this.applicantName = ""; + }else{ + this.applicantName = name; + } + + } + }); + + }, + getDate(){ + // 当前时间 + }, + handleCancel () { + this.previewVisible = false + }, + handlePreview (file) { + this.previewImage = file.url || file.thumbUrl + this.previewVisible = true + }, + handleChange ({ fileList }) { + this.fileList = fileList + } + } + } +</script> +<style scoped> + .abcdefg .ant-card-body{ + margin-left: 0%; + margin-right: 0%; + margin-bottom: 1%; + border:0px solid black; + min-width: 800px; + } + .explain{ + text-align: left; + margin-left: 50px; + } + .explain .ant-input,.sign .ant-input{ + font-weight:bolder; + text-align:center; + border-left-width:0px!important; + border-top-width:0px!important;; + border-right-width:0px!important;; + } + .explain div{ + margin-bottom: 10px; + } + /* you can make up upload button and sample style by using stylesheets */ + .ant-upload-select-picture-card i { + font-size: 32px; + color: #999; + } + + .ant-upload-select-picture-card .ant-upload-text { + margin-top: 8px; + color: #666; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/helloworld.vue b/ant-design-jeecg-vue/src/views/jeecg/helloworld.vue new file mode 100644 index 0000000..9b73f06 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/helloworld.vue @@ -0,0 +1,66 @@ +<template> + <a-form @submit="handleSubmit" :form="form"> + <a-form-item + label="Note" + :labelCol="{ span: 5 }" + :wrapperCol="{ span: 12 }" + > + <a-input + v-decorator="[ + 'note', + {rules: [{ required: true, message: 'Please input your note!' }]} + ]" + /> + </a-form-item> + <a-form-item + label="Gender" + :labelCol="{ span: 5 }" + :wrapperCol="{ span: 12 }" + > + <a-select + v-decorator="[ + 'gender', + {rules: [{ required: true, message: 'Please select your gender!' }]} + ]" + placeholder="Select a option and change input text above" + @change="this.handleSelectChange" + > + <a-select-option value="male">male</a-select-option> + <a-select-option value="female">female</a-select-option> + </a-select> + </a-form-item> + <a-form-item + :wrapperCol="{ span: 12, offset: 5 }"> + <a-button type="primary" htmlType="submit"> + Submit + </a-button> + </a-form-item> + </a-form> +</template> + +<script> + export default { + data () { + return { + formLayout: 'horizontal', + form: this.$form.createForm(this), + } + }, + methods: { + handleSubmit (e) { + e.preventDefault() + this.form.validateFields((err, values) => { + if (!err) { + console.log('Received values of form: ', values) + } + }) + }, + handleSelectChange (value) { + console.log(value) + this.form.setFieldsValue({ + note: `Hi, ${value === 'male' ? 'man' : 'lady'}!`, + }) + }, + }, + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/helloworld2.vue b/ant-design-jeecg-vue/src/views/jeecg/helloworld2.vue new file mode 100644 index 0000000..3f567ef --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/helloworld2.vue @@ -0,0 +1,31 @@ +<template> + <div> + hello world! + </div> +</template> +<script> + export default { + data () { + return { + description: '表单页用于向用户收集或验证信息,基础表单常见于数据项较少的表单场景。', + value: 1, + + // form + form: this.$form.createForm(this), + + } + }, + methods: { + // handler + handleSubmit (e) { + e.preventDefault() + this.form.validateFields((err, values) => { + if (!err) { + // eslint-disable-next-line no-console + console.log('Received values of form: ', values) + } + }) + } + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgDemoModal.vue b/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgDemoModal.vue new file mode 100644 index 0000000..f4c7ef4 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgDemoModal.vue @@ -0,0 +1,181 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="姓名" + hasFeedback > + <a-input placeholder="请输入姓名" v-decorator="['name', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="关键词" + hasFeedback > + <a-input placeholder="请输入关键词" v-decorator="['keyWord', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="打卡时间" + hasFeedback > + <a-date-picker showTime format="YYYY-MM-DD HH:mm:ss" v-decorator="[ 'punchTime', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="sex"> + <a-select v-decorator="['sex', {}]" placeholder="请选择性别"> + <a-select-option value="">请选择性别</a-select-option> + <a-select-option value="1">男性</a-select-option> + <a-select-option value="2">女性</a-select-option> + </a-select> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="年龄" + hasFeedback > + <a-input placeholder="请输入年龄" v-decorator="['age', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="生日" + hasFeedback > + <a-date-picker v-decorator="[ 'birthday', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="邮箱" + hasFeedback > + <a-input placeholder="请输入邮箱" v-decorator="['email', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="个人简介" + hasFeedback > + <a-input placeholder="请输入个人简介" v-decorator="['content', {}]" /> + </a-form-item> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction } from '@/api/manage' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: "JeecgDemoModal", + data () { + return { + title:"操作", + visible: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + }, + url: { + add: "/test/jeecgDemo/add", + edit: "/test/jeecgDemo/edit", + }, + } + }, + created () { + }, + methods: { + add () { + this.edit({}); + }, + edit (record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model,'name','keyWord','sex','age','email','content')) + //时间格式化 + this.form.setFieldsValue({punchTime:this.model.punchTime?moment(this.model.punchTime,'YYYY-MM-DD HH:mm:ss'):null}) + this.form.setFieldsValue({birthday:this.model.birthday?moment(this.model.birthday):null}) + }); + + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if(!this.model.id){ + httpurl+=this.url.add; + method = 'post'; + }else{ + httpurl+=this.url.edit; + method = 'put'; + } + let formData = Object.assign(this.model, values); + //时间格式化 + formData.punchTime = formData.punchTime?formData.punchTime.format('YYYY-MM-DD HH:mm:ss'):null; + formData.birthday = formData.birthday?formData.birthday.format():null; + + console.log(formData) + httpAction(httpurl,formData,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + + + + } + }) + }, + handleCancel () { + this.close() + }, + + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgDemoTabsModal.vue b/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgDemoTabsModal.vue new file mode 100644 index 0000000..8d39b30 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgDemoTabsModal.vue @@ -0,0 +1,285 @@ +<template> + <a-modal + :title="title" + :width="1200" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-card class="card" :bordered="false"> + <a-row class="form-row" :gutter="16"> + <a-col :lg="8"> + <a-form-item label="任务名"> + <a-input placeholder="请输入任务名称" v-decorator="[ 'task.name', {rules: [{ required: true, message: '请输入任务名称', whitespace: true}]} ]"/> + </a-form-item> + </a-col> + <a-col :lg="8"> + <a-form-item label="任务描述"> + <a-input placeholder="请输入任务描述" v-decorator="['task.description', {rules: [{ required: true, message: '请输入任务描述', whitespace: true}]} ]"/> + </a-form-item> + </a-col> + <a-col :lg="8"> + <a-form-item label="执行人"> + <a-select placeholder="请选择执行人" v-decorator="['task.executor',{rules: [{ required: true, message: '请选择执行人'}]} ]"> + <a-select-option value="黄丽丽">黄丽丽</a-select-option> + <a-select-option value="李大刀">李大刀</a-select-option> + </a-select> + </a-form-item> + </a-col> + </a-row> + <a-row class="form-row" :gutter="16"> + <a-col :lg="8"> + <a-form-item label="责任人"> + <a-select placeholder="请选择责任人" v-decorator="['task.manager', {rules: [{ required: true, message: '请选择责任人'}]} ]"> + <a-select-option value="王伟">王伟</a-select-option> + <a-select-option value="李红军">李红军</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :lg="8"> + <a-form-item label="提醒时间"> + <a-time-picker style="width: 100%" v-decorator="['task.time', {rules: [{ required: true, message: '请选择提醒时间'}]} ]"/> + </a-form-item> + </a-col> + <a-col :lg="8"> + <a-form-item + label="任务类型"> + <a-select placeholder="请选择任务类型" v-decorator="['task.type', {rules: [{ required: true, message: '请选择任务类型'}]} ]"> + <a-select-option value="定时执行">定时执行</a-select-option> + <a-select-option value="周期执行">周期执行</a-select-option> + </a-select> + </a-form-item> + </a-col> + </a-row> + </a-card> + + <a-tabs defaultActiveKey="1" > + <a-tab-pane tab="Tab 1" key="1"> + + <a-table :columns="columns" :dataSource="data" :pagination="false" size="middle"> + <template v-for="(col, i) in ['name', 'workId', 'department']" :slot="col" slot-scope="text, record, index"> + <a-tooltip title="必填项" :defaultVisible="false" overlayStyle="{ color: 'red' }"> + <a-input :key="col" v-if="record.editable" style="margin: -5px 0" :value="text" :placeholder="columns[i].title" @change="e => handlerRowChange(e.target.value, record.key, col)"/> + <template v-else>{{ text }}</template> + </a-tooltip> + </template> + <template slot="operation" slot-scope="text, record, index"> + <template v-if="record.editable"> + <span v-if="record.isNew"> + <a @click="saveRow(record.key)">添加</a> + <a-divider type="vertical"/> + <a-popconfirm title="是否要删除此行?" @confirm="removeRow(record.key)"><a>删除</a></a-popconfirm> + </span> + <span v-else> + <a @click="saveRow(record.key)">保存</a> + <a-divider type="vertical"/> + <a @click="cancelEditRow(record.key)">取消</a> + </span> + </template> + <span v-else> + <a @click="editRow(record.key)">编辑</a> + <a-divider type="vertical"/> + <a-popconfirm title="是否要删除此行?" @confirm="removeRow(record.key)"><a>删除</a></a-popconfirm> + </span> + </template> + </a-table> + + <a-button style="width: 100%; margin-top: 16px; margin-bottom: 8px" type="dashed" icon="plus" @click="newRow">新增成员</a-button> + </a-tab-pane> + <a-tab-pane tab="Tab 2" key="2" forceRender> + Content of Tab Pane 2 + </a-tab-pane> + <a-tab-pane tab="Tab 3" key="3">Content of Tab Pane 3</a-tab-pane> + </a-tabs> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import {httpAction} from '@/api/manage' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: "JeecgDemoTabsModal", + data() { + return { + title: "操作", + visible: false, + model: {}, + // table + columns: [ + { + title: '成员姓名', + dataIndex: 'name', + key: 'name', + width: '20%', + scopedSlots: {customRender: 'name'} + }, + { + title: '工号', + dataIndex: 'workId', + key: 'workId', + width: '20%', + scopedSlots: {customRender: 'workId'} + }, + { + title: '所属部门', + dataIndex: 'department', + key: 'department', + width: '40%', + scopedSlots: {customRender: 'department'} + }, + { + title: '操作', + key: 'action', + scopedSlots: {customRender: 'operation'} + } + ], + data: [ + { + key: '1', + name: '小明', + workId: '001', + editable: false, + department: '行政部' + }, + { + key: '2', + name: '李莉', + workId: '002', + editable: false, + department: 'IT部' + }, + { + key: '3', + name: '王小帅', + workId: '003', + editable: false, + department: '财务部' + } + ], + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules: {}, + url: { + add: "/test/jeecgDemo/add", + edit: "/test/jeecgDemo/edit", + }, + } + }, + created() { + }, + methods: { + add() { + this.edit({}); + }, + edit(record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model, 'name', 'keyWord', 'sex', 'age', 'email', 'content')) + //时间格式化 + this.form.setFieldsValue({punchTime: this.model.punchTime ? moment(this.model.punchTime, 'YYYY-MM-DD HH:mm:ss') : null}) + this.form.setFieldsValue({birthday: this.model.birthday ? moment(this.model.birthday) : null}) + }); + + }, + close() { + this.$emit('close'); + this.visible = false; + }, + handleOk() { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if (!this.model.id) { + httpurl += this.url.add; + method = 'post'; + } else { + httpurl += this.url.edit; + method = 'put'; + } + let formData = Object.assign(this.model, values); + //时间格式化 + formData.punchTime = formData.punchTime ? formData.punchTime.format('YYYY-MM-DD HH:mm:ss') : null; + formData.birthday = formData.birthday ? formData.birthday.format() : null; + + console.log(formData) + httpAction(httpurl, formData, method).then((res) => { + if (res.success) { + that.$message.success(res.message); + that.$emit('ok'); + } else { + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + } + }) + }, + handleCancel() { + this.close() + }, + newRow () { + // 通过时间戳生成 UUID + let uuid = Math.round(new Date().getTime()).toString(); + console.log('uuid: '+ uuid) + this.data.push({ + key: uuid, + name: '', + workId: '', + department: '', + editable: true, + isNew: true + }) + }, + removeRow (key) { + const newData = this.data.filter(item => item.key !== key) + this.data = newData + }, + saveRow (key) { + let target = this.data.filter(item => item.key === key)[0] + target.editable = false + target.isNew = false + }, + handlerRowChange (value, key, column) { + const newData = [...this.data] + const target = newData.filter(item => key === item.key)[0] + if (target) { + target[column] = value + this.data = newData + } + }, + editRow (key) { + let target = this.data.filter(item => item.key === key)[0] + target.editable = !target.editable + }, + cancelEditRow (key) { + let target = this.data.filter(item => item.key === key)[0] + target.editable = false + }, + } + } +</script> + +<style scoped> + .ant-modal-body { + padding: 8px!important; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderMainModal.vue b/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderMainModal.vue new file mode 100644 index 0000000..1bfec52 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderMainModal.vue @@ -0,0 +1,304 @@ +<template> + <a-modal + :title="title" + :width="1000" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + <!-- 主表单区域 --> + <a-row class="form-row" :gutter="16"> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单号"> + <a-input placeholder="请输入订单号" v-decorator="['orderCode', {rules: [{ required: true, message: '请输入订单号!' }]}]" /> + </a-form-item> + </a-col> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单类型"> + <a-select placeholder="请输入订单类型" v-decorator="['ctype',{}]"> + <a-select-option value="1">国内订单</a-select-option> + <a-select-option value="2">国际订单</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单日期"> + <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator="[ 'orderDate',{}]"/> + </a-form-item> + </a-col> + </a-row> + <a-row class="form-row" :gutter="16"> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单金额"> + <a-input-number style="width: 200px" v-decorator="[ 'orderMoney', {}]" /> + </a-form-item> + </a-col> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单备注"> + <a-input placeholder="请输入订单备注" v-decorator="['content', {}]" /> + </a-form-item> + </a-col> + </a-row> + + <!-- 子表单区域 --> + <a-tabs defaultActiveKey="1" > + <a-tab-pane tab="客户信息" key="1"> + <div> + <a-row type="flex" style="margin-bottom:10px" :gutter="16"> + <a-col :span="5">客户名</a-col> + <a-col :span="5">性别</a-col> + <a-col :span="5">身份证号码</a-col> + <a-col :span="5">手机号</a-col> + <a-col :span="4">操作</a-col> + </a-row> + + <a-row type="flex" style="margin-bottom:10px" :gutter="16" v-for="(item, index) in orderMainModel.jeecgOrderCustomerList" :key="index"> + <a-col :span="5"> + <a-form-item> + <a-input placeholder="客户名" v-decorator="['jeecgOrderCustomerList['+index+'].name', {'initialValue':item.name,rules: [{ required: true, message: '请输入用户名!' }]}]" /> + </a-form-item> + </a-col> + <a-col :span="5"> + <a-form-item> + <a-select placeholder="性别" v-decorator="['jeecgOrderCustomerList['+index+'].sex', {'initialValue':item.sex}]"> + <a-select-option value="1">男</a-select-option> + <a-select-option value="2">女</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :span="5"> + <a-form-item> + <a-input placeholder="身份证号" v-decorator="['jeecgOrderCustomerList['+index+'].idcard', {'initialValue':item.idcard,rules: [{ pattern: '^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|[xX])$', message: '身份证号格式不对!' }]}]"/> + </a-form-item> + </a-col> + <a-col :span="5"> + <a-form-item> + <a-input placeholder="手机号" v-decorator="['jeecgOrderCustomerList['+index+'].telphone', {'initialValue':item.telphone,rules: [{ pattern: '^1(3|4|5|7|8)\\d{9}$', message: '手机号格式不对!' }]}]"/> + </a-form-item> + </a-col> + <a-col :span="4"> + <a-form-item> + <a-button @click="addRowCustom" icon="plus"></a-button> + <a-button @click="delRowCustom(index)" icon="minus"></a-button> + </a-form-item> + </a-col> + </a-row> + </div> + </a-tab-pane> + + <a-tab-pane tab="机票信息" key="2" forceRender> + <div> + <a-row type="flex" style="margin-bottom:10px" :gutter="16"> + <a-col :span="6">航班号</a-col> + <a-col :span="6">航班时间</a-col> + <a-col :span="6">操作</a-col> + </a-row> + <a-row type="flex" style="margin-bottom:10px" :gutter="16" v-for="(item, index) in orderMainModel.jeecgOrderTicketList" :key="index"> + <a-col :span="6"> + <a-form-item> + <a-input placeholder="航班号" v-decorator="['jeecgOrderTicketList['+index+'].ticketCode', {'initialValue':item.ticketCode,rules: [{ required: true, message: '请输入航班号!' }]}]" /> + </a-form-item> + </a-col> + <a-col :span="6"> + <a-form-item> + <j-date placeholder="航班时间" :trigger-change="true" v-decorator="['jeecgOrderTicketList['+index+'].tickectDate', {'initialValue':item.tickectDate}]"></j-date> + </a-form-item> + </a-col> + <a-col :span="6"> + <a-form-item> + <a-button @click="addRowTicket" icon="plus"></a-button> + <a-button @click="delRowTicket(index)" icon="minus"></a-button> + </a-form-item> + </a-col> + </a-row> + </div> + </a-tab-pane> + </a-tabs> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction,getAction } from '@/api/manage' + import JDate from '@/components/jeecg/JDate' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: "JeecgOrderMainModal", + components: { + JDate + }, + data () { + return { + title:"操作", + visible: false, + orderMainModel: {jeecgOrderCustomerList: [{}], + jeecgOrderTicketList: [{}]}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + }, + url: { + add: "/test/jeecgOrderMain/add", + edit: "/test/jeecgOrderMain/edit", + orderCustomerList: "/test/jeecgOrderMain/queryOrderCustomerListByMainId", + orderTicketList: "/test/jeecgOrderMain/queryOrderTicketListByMainId", + }, + } + }, + created () { + }, + methods: { + add () { + this.edit({}); + }, + edit (record) { + this.form.resetFields(); + this.orderMainModel = Object.assign({}, record); + this.orderMainModel.jeecgOrderCustomerList = [{}]; + this.orderMainModel.jeecgOrderTicketList = [{}]; + //-------------------------------------------------------- + //初始化明细表数据 + console.log(this.orderMainModel.id) + if(this.orderMainModel.id){ + let params = {id:this.orderMainModel.id} + //初始化订单机票列表 + getAction(this.url.orderCustomerList,params).then((res)=>{ + if(res.success){ + this.orderMainModel.jeecgOrderCustomerList = res.result; + this.$forceUpdate() + } + }) + //初始化订单客户列表 + getAction(this.url.orderTicketList,params).then((res)=>{ + if(res.success){ + this.orderMainModel.jeecgOrderTicketList = res.result; + this.$forceUpdate() + } + }) + } + //-------------------------------------------------------- + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.orderMainModel,'orderCode','ctype','orderMoney','content')) + this.form.setFieldsValue({orderDate:this.orderMainModel.orderDate?moment(this.orderMainModel.orderDate):null}) //时间格式化 + }); + console.log(this.orderMainModel) + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if(!this.orderMainModel.id){ + httpurl+=this.url.add; + method = 'post'; + }else{ + httpurl+=this.url.edit; + method = 'put'; + } + let orderMainData = Object.assign(this.orderMainModel, values); + //时间格式化 + orderMainData.orderDate = orderMainData.orderDate?orderMainData.orderDate.format('YYYY-MM-DD HH:mm:ss'):null; + let formData = {jeecgOrderMain:orderMainData, + jeecgOrderCustomerList:orderMainData.jeecgOrderCustomerList, + jeecgOrderTicketList:orderMainData.jeecgOrderTicketList} + + console.log(formData) + httpAction(httpurl,formData,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + + } + }) + }, + handleCancel () { + this.close() + }, + addRowCustom () { + this.orderMainModel.jeecgOrderCustomerList.push({}); + this.$forceUpdate(); + }, + delRowCustom (index) { + console.log(index) + this.orderMainModel.jeecgOrderCustomerList.splice(index,1); + this.$forceUpdate(); + }, + addRowTicket () { + this.orderMainModel.jeecgOrderTicketList.push({}); + console.log(this.orderMainModel.jeecgOrderTicketList) + this.$forceUpdate(); + }, + delRowTicket (index) { + console.log(index) + this.orderMainModel.jeecgOrderTicketList.splice(index,1); + this.$forceUpdate(); + }, + + + } + } +</script> + +<style scoped> + .ant-btn { + padding: 0 10px; + margin-left: 3px; + } + .ant-form-item-control { + line-height: 0px; + } + /** 主表单行间距 */ + .ant-form .ant-form-item { + margin-bottom: 10px; + } + /** Tab页面行间距 */ + .ant-tabs-content .ant-form-item { + margin-bottom: 0px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/modules/SuperQueryModal.vue b/ant-design-jeecg-vue/src/views/jeecg/modules/SuperQueryModal.vue new file mode 100644 index 0000000..87909cf --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/modules/SuperQueryModal.vue @@ -0,0 +1,95 @@ +<template> + <a-modal + title="高级查询构造器" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + :mask="false" + okText="查询" + @cancel="handleCancel" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form> + <div> + <a-row type="flex" style="margin-bottom:10px" :gutter="16" v-for="(item, index) in queryParamsModel" :key="index"> + <a-col :span="6"> + <a-select placeholder="选择查询字段" v-model="item.field"> + <a-select-option value="name">用户名</a-select-option> + <a-select-option value="key_word">关键词</a-select-option> + <a-select-option value="birthday">生日</a-select-option> + <a-select-option value="age">年龄</a-select-option> + </a-select> + </a-col> + <a-col :span="6"> + <a-select placeholder="选择匹配规则" v-model="item.rule"> + <a-select-option value="=">等于</a-select-option> + <a-select-option value="!=">不等于</a-select-option> + <a-select-option value=">">大于</a-select-option> + <a-select-option value=">=">大于等于</a-select-option> + <a-select-option value="<">小于</a-select-option> + <a-select-option value="<=">小于等于</a-select-option> + <a-select-option value="LEFT_LIKE">以..开始</a-select-option> + <a-select-option value="RIGHT_LIKE">以..结尾</a-select-option> + <a-select-option value="LIKE">包含</a-select-option> + <a-select-option value="IN">在...中</a-select-option> + </a-select> + </a-col> + + <a-col :span="6"><a-input placeholder="请输入值" v-model="item.val"/></a-col> + <a-col :span="6"> + <a-button @click="handleAdd" icon="plus"></a-button> + <a-button @click="handleDel( index )" icon="minus"></a-button> + </a-col> + </a-row> + </div> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction } from '@/api/manage' + + export default { + name: "SuperQueryModal", + data () { + return { + visible: false, + queryParamsModel: [{},{}], + confirmLoading: false + } + }, + created () { + }, + methods: { + show () { + this.visible = true; + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + console.log(this.queryParamsModel) + // 子组件中触发父组件方法ee并传值cc12345 + this.$emit('handleSuperQuery', this.queryParamsModel) + }, + handleCancel () { + this.close() + }, + handleAdd () { + this.queryParamsModel.push({}); + }, + handleDel (index) { + console.log(index) + this.queryParamsModel.splice(index,1); + } + } + } +</script> + +<style scoped> +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderCustomerList.vue b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderCustomerList.vue new file mode 100644 index 0000000..e0cdb5d --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderCustomerList.vue @@ -0,0 +1,293 @@ +<template> + <a-card :bordered="false"> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="default" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link"> + 更多 <a-icon type="down" /> + </a> + <a-menu slot="overlay"> + <a-menu-item > + <a href="javascript:;" @click="handleDetail(record)">详情</a> + </a-menu-item> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + </a-table> + </div> + <!-- table区域-end --> + <!-- 表单区域 --> + <jeecgOrderCustomer-modal ref="JeecgOrderCustomerModal" @ok="modalFormOk"></jeecgOrderCustomer-modal> + </a-card> +</template> + +<script> + import JeecgOrderCustomerModal from './form/JeecgOrderCustomerModal' + import { filterObj } from '@/utils/util' + import { deleteAction,getAction } from '@/api/manage' + import JeecgOrderDMainList from './JeecgOrderDMainList' + + export default { + name: "JeecgOrderCustomerList", + components: { + JeecgOrderDMainList, + JeecgOrderCustomerModal + }, + data () { + return { + description: '订单客户信息', + // 查询条件 + queryParam: { + orderId:null, + }, + // 表头 + columns: [ + { + title: '客户名', + align:"center", + width: 100, + dataIndex: 'name', + key: 'name', + fixed: 'left' + }, + { + title: '性别', + align:"center", + dataIndex: 'sex', + customRender:function (text) { + if(text==1){ + return "男"; + }else if(text==2){ + return "女"; + }else{ + return text; + } + } + }, + { + title: '身份证号码', + align:"center", + dataIndex: 'idcard', + }, + { + title: '电话', + dataIndex: 'telphone', + align:"center", + }, + { + title: '操作', + key: 'operation', + align: 'center', + fixed: 'right', + width: 130, + scopedSlots: { customRender: 'action' }, + }, + ], + //数据集 + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/test/order/queryOrderCustomerListByMainId", + delete: "/test/order/deleteCustomer", + deleteBatch: "/test/order/deleteBatchCustomer", + }, + + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list,{id:params.orderId}).then((res)=>{ + if(res.success){ + this.dataSource = res.result; +/* + this.ipagination.total = res.result.total; +*/ + }else{ + this.dataSource = null; +/* this.ipagination.total = 0;*/ + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.orderId = this.queryParam.orderId; + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + var that = this; + for(var a in that.queryParam){ + that.queryParam[a] = ''; + } + that.loadData(1); + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function(id){ + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.delete,{id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + }, + + handleEdit: function(record){ + this.$refs.JeecgOrderCustomerModal.edit(record,'e'); + this.$refs.JeecgOrderCustomerModal.title="编辑"; + }, + handleAdd: function(){ + this.$refs.JeecgOrderCustomerModal.add(this.queryParam.orderId); + this.$refs.JeecgOrderCustomerModal.title="添加客户信息"; + }, + handleDetail: function(record){ + this.$refs.JeecgOrderCustomerModal.detail(record); + this.$refs.JeecgOrderCustomerModal.title="添加客户信息"; + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + }, + getOrderMain(orderId){ + this.queryParam.orderId = orderId.toString(); + this.loadData(1); + } + } + } +</script> +<style scoped> + .ant-card{ + margin-left: -30px; + margin-right: -30px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderDMainList.vue b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderDMainList.vue new file mode 100644 index 0000000..d44475c --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderDMainList.vue @@ -0,0 +1,347 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :span="6"> + <a-form-item label="订单号"> + <a-input placeholder="请输入订单号" v-model="queryParam.orderCode"></a-input> + </a-form-item> + </a-col> + <a-col :span="6"> + <a-form-item label="订单类型"> + <a-select placeholder="请输入订单类型" v-model="queryParam.ctype"> + <a-select-option value="1">国内订单</a-select-option> + <a-select-option value="2">国际订单</a-select-option> + </a-select> + </a-form-item> + </a-col> + + <a-col :span="8" > + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + + </a-row> + </a-form> + </div> + + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="default" + bordered + rowKey="id" + filterMultiple="filterMultiple" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange,type:type}" + @change="handleTableChange" + :customRow="clickThenCheck" + > + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + <a-divider type="vertical" /> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </span> + + </a-table> + </div> + <!-- table区域-end --> + + <a-tabs defaultActiveKey="1"> + <a-tab-pane tab="客户信息" key="1"> + <Jeecg-Order-Customer-List ref="JeecgOrderCustomerList"></Jeecg-Order-Customer-List> + </a-tab-pane> + <a-tab-pane tab="机票信息" key="2" forceRender> + <Jeecg-Order-Ticket-List ref="JeecgOrderTicketList"></Jeecg-Order-Ticket-List> + </a-tab-pane> + </a-tabs> + + <!-- 表单区域 --> + <jeecgOrderDMain-modal ref="JeecgOrderDMainModal" @ok="modalFormOk"></jeecgOrderDMain-modal> + + </a-card> +</template> + +<script> + import JeecgOrderDMainModal from './form/JeecgOrderDMainModal' + import JeecgOrderCustomerList from './JeecgOrderCustomerList' + import JeecgOrderTicketList from './JeecgOrderTicketList' + import { filterObj } from '@/utils/util' + import { deleteAction,getAction } from '@/api/manage' + import JeecgOrderCustomerModal from './form/JeecgOrderCustomerModal' + import JeecgOrderTicketModal from './form/JeecgOrderTicketModal' + + export default { + name: "JeecgOrderDMainList", + components: { + JeecgOrderTicketModal, + JeecgOrderCustomerModal, + JeecgOrderDMainModal, + JeecgOrderCustomerList, + JeecgOrderTicketList, + }, + data () { + return { + description: '订单管理页面', + // 查询条件 + queryParam: {}, + // 表头 + columns: [ { + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + { + title: '订单号', + align:"center", + dataIndex: 'orderCode' + }, + { + title: '订单类型', + align:"center", + dataIndex: 'ctype', + customRender: (text) => { + let re = ""; + if (text === '1') { + re = "国内订单"; + } else if (text === '2') { + re = "国际订单"; + } + return re; + } + }, + { + title: '订单日期', + align:"center", + dataIndex: 'orderDate' + }, + { + title: '订单金额', + align:"center", + dataIndex: 'orderMoney' + }, + { + title: '订单备注', + align:"center", + dataIndex: 'content' + }, + { + title: '操作', + dataIndex: 'action', + align:"center", + scopedSlots: { customRender: 'action' }, + }], + //数据集 + dataSource:[], + // 分页参数 + type: "radio", + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/test/order/orderList", + delete: "/test/order/delete", + deleteBatch: "/test/order/deleteBatch", + }, + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list,params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + clickThenCheck(record){ + return { + on: { + click: () => { + this.onSelectChange(record.id.split(","),[record]); + } + } + }; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + this.$refs.JeecgOrderCustomerList.getOrderMain(this.selectedRowKeys[0]); + this.$refs.JeecgOrderTicketList.getOrderMain(this.selectedRowKeys[0]); + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + this.$refs.JeecgOrderCustomerList.queryParam.orderId = null; + this.$refs.JeecgOrderTicketList.queryParam.orderId = null; + this.$refs.JeecgOrderCustomerList.loadData(); + this.$refs.JeecgOrderTicketList.loadData(); + }, + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + var that = this; + that.queryParam={}; + that.loadData(1); + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + this.$refs.JeecgOrderCustomerList.loadData(); + this.$refs.JeecgOrderTicketList.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function(id){ + var that = this; + deleteAction(that.url.delete,{id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + this.$refs.JeecgOrderCustomerList.loadData(); + this.$refs.JeecgOrderTicketList.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleEdit: function(record){ + this.$refs.JeecgOrderDMainModal.edit(record); + this.$refs.JeecgOrderDMainModal.title="编辑"; + }, + handleAdd: function(){ + this.$refs.JeecgOrderDMainModal.add(); + this.$refs.JeecgOrderDMainModal.title="新增"; + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + } + } + } +</script> +<style scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderTicketList.vue b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderTicketList.vue new file mode 100644 index 0000000..34a1284 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderTicketList.vue @@ -0,0 +1,273 @@ +<template> + <a-card :bordered="false"> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="default" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link"> + 更多 <a-icon type="down" /> + </a> + <a-menu slot="overlay"> + <a-menu-item > + <a href="javascript:;" @click="handleDetail(record)">详情</a> + </a-menu-item> + + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <JeecgOrderTicket-modal ref="JeecgOrderTicketModal" @ok="modalFormOk"></JeecgOrderTicket-modal> + </a-card> +</template> + +<script> + import { filterObj } from '@/utils/util' + import { deleteAction,getAction } from '@/api/manage' + import JeecgOrderTicketModal from './form/JeecgOrderTicketModal' + + export default { + name: "JeecgOrderTicketList", + components: { + JeecgOrderTicketModal, + }, + data () { + return { + description: '机票信息', + // 查询条件 + queryParam: { + orderId:null, + }, + // 表头 + columns: [{ + title:'航班号', + align:"center", + dataIndex:'ticketCode' + },{ + title:'航班时间', + align:"center", + dataIndex:'tickectDate' + },{ + title:'订单号码', + align:"center", + dataIndex:'orderId', + },{ + title:'创建人', + align:"center", + dataIndex:'createBy' + },{ + title:'创建时间', + align:"center", + dataIndex:'createTime', + sorter:true + },{ + title: '操作', + key: 'operation', + fixed:'right', + align:"center", + width:130, + scopedSlots: { customRender: 'action' }, + }], + //数据集 + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 5, + pageSizeOptions: ['5','10', '20'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'asc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/test/order/queryOrderTicketListByMainId", + delete: "/test/order/deleteTicket", + deleteBatch: "/test/order/deleteBatchTicket", + }, + + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list,{id:params.orderId}).then((res)=>{ + if(res.success){ + this.dataSource = res.result; +/* this.ipagination.total = res.result.total;*/ + }else{ + this.dataSource = null; +/* this.ipagination.total = 0;*/ + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + var that = this; + for(var a in that.queryParam){ + that.queryParam[a] = ''; + } + that.loadData(1); + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function(id){ + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.delete,{id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + }, + handleEdit: function(record){ + this.$refs.JeecgOrderTicketModal.edit(record,'e'); + this.$refs.JeecgOrderTicketModal.title="新增机票信息"; + }, + handleAdd: function(){ + this.$refs.JeecgOrderTicketModal.add(this.queryParam.orderId); + this.$refs.JeecgOrderTicketModal.title="新增机票信息"; + }, + handleDetail: function(record){ + this.$refs.JeecgOrderTicketModal.detail(record); + this.$refs.JeecgOrderTicketModal.title="新增机票信息"; + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + }, + getOrderMain(orderId){ + this.queryParam.orderId = orderId; + this.loadData(1); + } + } + } +</script> +<style scoped> +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue b/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue new file mode 100644 index 0000000..2333700 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue @@ -0,0 +1,383 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + :okButtonProps="{ props: {disabled: disableSubmit} }" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + + <!-- 编辑 --> + <a-spin :spinning="confirmLoading" v-if="editStatus"> + <a-form :form="form"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="客户姓名" + hasFeedback > + <a-input placeholder="请输入客户姓名" v-decorator="['name', {rules: [{ required: true, message: '请输入客户姓名!' }]}]" :readOnly="disableSubmit" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="性别" + hasFeedback > + <a-select v-decorator="['sex', {}]" placeholder="请选择性别"> + <a-select-option value="1">男性</a-select-option> + <a-select-option value="2">女性</a-select-option> + </a-select> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="身份证号码" + hasFeedback > + <a-input placeholder="请输入身份证号码" v-decorator="['idcard', validatorRules.idcard]" :readOnly="disableSubmit" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="身份证扫描件" + hasFeedback > + <a-upload + :action="uploadAction" + listType="picture-card" + :headers="headers" + :fileList="fileList" + @change="handleChange" + @preview="handlePreview" + > + <a-button> + <a-icon type="upload" /> upload + </a-button> + </a-upload> + <img v-if="model.idcardPic" :src="getIdCardView()" alt="头像" style="height:104px;max-width:300px"/> + <a-modal :visible="previewVisible" :footer="null" @cancel="handlePicCancel"> + <img alt="example" style="width: 100%" :src="previewImage" /> + </a-modal> + <br /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="联系方式" + hasFeedback > + <a-input v-decorator="[ 'telphone', validatorRules.telphone]" :readOnly="disableSubmit" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单号码" + :hidden="hiding" + hasFeedback > + <a-input v-decorator="[ 'orderId', {}]" disabled="disabled" /> + </a-form-item> + </a-form> + </a-spin> + + <!-- 新增 --> + <a-table + v-if="addStatus" + ref="table" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange" + > + </a-table> + + </a-modal> +</template> + +<script> + import { httpAction,getAction,postAction} from '@/api/manage' + import { doMian } from '@/api/api' + import pick from 'lodash.pick' + import Vue from 'vue' + import { ACCESS_TOKEN } from "@/store/mutation-types" + + export default { + name: "JeecgOrderCustomerModal", + // 查询条件 + data () { + return { + title:"操作", + visible: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + // 表头 + columns: [ + { + title: '客户名', + align:"center", + dataIndex: 'name', + }, + { + title: '性别', + align:"center", + dataIndex: 'sex', + }, + { + title: '身份证号码', + align:"center", + dataIndex: 'idcard', + }, + { + title: '身份证扫描件', + align:"center", + dataIndex: 'idcardPic', + }, + { + title: '电话', + dataIndex: 'telphone', + align:"center", + }, + { + title: '订单号码', + dataIndex: 'orderId', + align:"center", + }, + { + title: '创建人', + dataIndex: 'createBy', + align:"center", + }, + { + title: '创建时间', + dataIndex: 'createTime', + align:"center", + }, + { + title: '更新时间', + dataIndex: 'updateBy', + align:"center", + }, + { + title: '更新人', + dataIndex: 'updateTime', + align:"center", + }, + ], + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + fileList:[], + disableSubmit:false, + selectedRowKeys: [], + orderId:"", + hiding:false, + headers:{}, + picUrl:"", + previewVisible: false, + previewImage: '', + addStatus:false, + editStatus:false, + confirmLoading: false, + form: this.$form.createForm(this), + url: { + fileUpload:doMian+"sys/common/upload", + add: "/test/order/addCustomer", + edit: "/test/order/editCustomer", + imgerver:doMian+"sys/common/view", + getOrderCustomerList: "/test/order/queryOrderCustomerListByMainId", + }, + validatorRules:{ + telphone:{rules: [{ validator:this.validateMobile}]}, + idcard:{rules:[{ validator:this.validateIdCard}]} + }, + } + }, + computed:{ + uploadAction:function () { + return this.url.fileUpload; + } + }, + created () { + const token = Vue.ls.get(ACCESS_TOKEN); + this.headers = {"X-Access-Token":token} + }, + methods: { + add (orderId) { + this.hiding = true; + if(orderId){ + this.orderId = orderId; + this.edit({},''); + }else{ + this.$message.warning("请选择一个客户信息"); + } + }, + detail(record){ + this.edit(record,'d'); + }, + edit (record,v) { + this.form.resetFields(); + this.model = Object.assign({}, record); + if(record.id){ + this.hiding = false; + if(v == 'e'){ + this.disableSubmit = false; + }else { + this.disableSubmit = true; + } + this.addStatus = false; + this.editStatus = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model,'id','name','sex','idcard','idcardPic','telphone','orderId','createBy','createTime','updateBy','updateTime')) + }); + }else{ + this.addStatus = false; + this.editStatus = true; + } + // 加载客户信息 + let httpurl = this.url.getOrderCustomerList; + getAction(httpurl,{id:this.orderId}).then((res)=>{ + if(res.success){ + this.dataSource = res.result; + }else{ + this.$message.warning(res.message); + } + }); + this.visible = true; + }, + close () { + this.$emit('close'); + this.visible = false; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + console.log(selectionRows); + }, + handleOk () { + const that = this; + this.form.validateFields((err, values) => { + if (!err) { + let httpurl = ''; + let method = ''; + if(!this.model.id){ + httpurl+=this.url.add; + let formData = Object.assign(this.model, values); + formData.orderId = this.orderId; + formData.idcardPic = this.picUrl; + postAction(httpurl,formData).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + this.visible = false; + }else{ + this.$message.warning(res.message); + } + }); + }else{ + httpurl+=this.url.edit; + method = 'put'; + let formData = Object.assign(this.model, values); + //时间格式化 + httpAction(httpurl,formData,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + } + } + }) + }, + + handleTableChange(pagination, filters, sorter){ + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + handleCancel () { + this.close() + }, + validateMobile(rule,value,callback){ + if (!value || new RegExp(/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/).test(value)){ + callback(); + }else{ + callback("您的手机号码格式不正确!"); + } + }, + validateIdCard(rule,value,callback){ + if (!value || new RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/).test(value)){ + callback(); + }else{ + callback("您的身份证号码格式不正确!"); + } + }, + handleChange (info) { + this.fileList = info.fileList; + if (info.file.status === 'uploading') { + return + } + if (info.file.status === 'done') { + var response = info.file.response; + console.log(response); + if(response.success){ + this.picUrl += response.message + ","; + }else{ + this.$message.warning(response.message); + } + } + }, + handlePicCancel () { + this.previewVisible = false + }, + handlePreview (file) { + this.previewImage = file.url || file.thumbUrl + this.previewVisible = true + }, + getIdCardView(){ + let pics = this.model.idcardPic.split(","); + return this.url.imgerver +"/"+ pics[0]; + } + } + } +</script> + +<style scoped> + /* tile uploaded pictures */ + .upload-list-inline >>> .ant-upload-list-item { + float: left; + width: 200px; + margin-right: 8px; + } + .upload-list-inline >>> .ant-upload-animate-enter { + animation-name: uploadAnimateInlineIn; + } + .upload-list-inline >>> .ant-upload-animate-leave { + animation-name: uploadAnimateInlineOut; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderDMainModal.vue b/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderDMainModal.vue new file mode 100644 index 0000000..3e8bc08 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderDMainModal.vue @@ -0,0 +1,304 @@ +<template> + <a-modal + :title="title" + :width="1000" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + <!-- 主表单区域 --> + <a-row class="form-row" :gutter="16"> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单号"> + <a-input placeholder="请输入订单号" v-decorator="['orderCode', {rules: [{ required: true, message: '请输入订单号!' }]}]" /> + </a-form-item> + </a-col> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单类型"> + <a-select placeholder="请输入订单类型" v-decorator="['ctype',{}]"> + <a-select-option value="1">国内订单</a-select-option> + <a-select-option value="2">国际订单</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单日期"> + <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator="[ 'orderDate',{}]"/> + </a-form-item> + </a-col> + </a-row> + <a-row class="form-row" :gutter="16"> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单金额"> + <a-input-number style="width: 200px" v-decorator="[ 'orderMoney', {}]" /> + </a-form-item> + </a-col> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单备注"> + <a-input placeholder="请输入订单备注" v-decorator="['content', {}]" /> + </a-form-item> + </a-col> + </a-row> + + <!-- 子表单区域 --> + <a-tabs defaultActiveKey="1" > + <a-tab-pane tab="客户信息" key="1"> + <div> + <a-row type="flex" style="margin-bottom:10px" :gutter="16"> + <a-col :span="5">客户名</a-col> + <a-col :span="5">性别</a-col> + <a-col :span="5">身份证号码</a-col> + <a-col :span="5">手机号</a-col> + <a-col :span="4">操作</a-col> + </a-row> + + <a-row type="flex" style="margin-bottom:10px" :gutter="16" v-for="(item, index) in orderMainModel.jeecgOrderCustomerList" :key="index"> + <a-col :span="5"> + <a-form-item> + <a-input placeholder="客户名" v-decorator="['jeecgOrderCustomerList['+index+'].name', {'initialValue':item.name,rules: [{ required: true, message: '请输入用户名!' }]}]" /> + </a-form-item> + </a-col> + <a-col :span="5"> + <a-form-item> + <a-select placeholder="性别" v-decorator="['jeecgOrderCustomerList['+index+'].sex', {'initialValue':item.sex}]"> + <a-select-option value="1">男</a-select-option> + <a-select-option value="2">女</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :span="5"> + <a-form-item> + <a-input placeholder="身份证号" v-decorator="['jeecgOrderCustomerList['+index+'].idcard', {'initialValue':item.idcard,rules: [{ pattern: '^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|[xX])$', message: '身份证号格式不对!' }]}]"/> + </a-form-item> + </a-col> + <a-col :span="5"> + <a-form-item> + <a-input placeholder="手机号" v-decorator="['jeecgOrderCustomerList['+index+'].telphone', {'initialValue':item.telphone,rules: [{ pattern: '^1(3|4|5|7|8)\\d{9}$', message: '手机号格式不对!' }]}]"/> + </a-form-item> + </a-col> + <a-col :span="4"> + <a-form-item> + <a-button @click="addRowCustom" icon="plus"></a-button> + <a-button @click="delRowCustom(index)" icon="minus"></a-button> + </a-form-item> + </a-col> + </a-row> + </div> + </a-tab-pane> + + <a-tab-pane tab="机票信息" key="2" forceRender> + <div> + <a-row type="flex" style="margin-bottom:10px" :gutter="16"> + <a-col :span="6">航班号</a-col> + <a-col :span="6">航班时间</a-col> + <a-col :span="6">操作</a-col> + </a-row> + <a-row type="flex" style="margin-bottom:10px" :gutter="16" v-for="(item, index) in orderMainModel.jeecgOrderTicketList" :key="index"> + <a-col :span="6"> + <a-form-item> + <a-input placeholder="航班号" v-decorator="['jeecgOrderTicketList['+index+'].ticketCode', {'initialValue':item.ticketCode,rules: [{ required: true, message: '请输入航班号!' }]}]" /> + </a-form-item> + </a-col> + <a-col :span="6"> + <a-form-item> + <j-date placeholder="航班时间" :trigger-change="true" v-decorator="['jeecgOrderTicketList['+index+'].tickectDate', {'initialValue':item.tickectDate}]"></j-date> + </a-form-item> + </a-col> + <a-col :span="6"> + <a-form-item> + <a-button @click="addRowTicket" icon="plus"></a-button> + <a-button @click="delRowTicket(index)" icon="minus"></a-button> + </a-form-item> + </a-col> + </a-row> + </div> + </a-tab-pane> + </a-tabs> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction,getAction } from '@/api/manage' + import JDate from '@/components/jeecg/JDate' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: "JeecgOrderDMainModal", + components: { + JDate + }, + data () { + return { + title:"操作", + visible: false, + orderMainModel: {jeecgOrderCustomerList: [{}], + jeecgOrderTicketList: [{}]}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + }, + url: { + add: "/test/order/add", + edit: "/test/order/edit", + orderCustomerList: "/test/order/queryOrderCustomerListByMainId", + orderTicketList: "/test/order/queryOrderTicketListByMainId", + }, + } + }, + created () { + }, + methods: { + add () { + this.edit({}); + }, + edit (record) { + this.form.resetFields(); + this.orderMainModel = Object.assign({}, record); + this.orderMainModel.jeecgOrderCustomerList = [{}]; + this.orderMainModel.jeecgOrderTicketList = [{}]; + //-------------------------------------------------------- + //初始化明细表数据 + console.log(this.orderMainModel.id) + if(this.orderMainModel.id){ + let params = {id:this.orderMainModel.id} + //初始化订单机票列表 + getAction(this.url.orderCustomerList,params).then((res)=>{ + if(res.success){ + this.orderMainModel.jeecgOrderCustomerList = res.result; + this.$forceUpdate() + } + }) + //初始化订单客户列表 + getAction(this.url.orderTicketList,params).then((res)=>{ + if(res.success){ + this.orderMainModel.jeecgOrderTicketList = res.result; + this.$forceUpdate() + } + }) + } + //-------------------------------------------------------- + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.orderMainModel,'orderCode','ctype','orderMoney','content')) + this.form.setFieldsValue({orderDate:this.orderMainModel.orderDate?moment(this.orderMainModel.orderDate):null}) //时间格式化 + }); + console.log(this.orderMainModel) + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if(!this.orderMainModel.id){ + httpurl+=this.url.add; + method = 'post'; + }else{ + httpurl+=this.url.edit; + method = 'put'; + } + let orderMainData = Object.assign(this.orderMainModel, values); + //时间格式化 + orderMainData.orderDate = orderMainData.orderDate?orderMainData.orderDate.format('YYYY-MM-DD HH:mm:ss'):null; + let formData = {jeecgOrderMain:orderMainData, + jeecgOrderCustomerList:orderMainData.jeecgOrderCustomerList, + jeecgOrderTicketList:orderMainData.jeecgOrderTicketList} + + console.log(formData) + httpAction(httpurl,formData,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + + } + }) + }, + handleCancel () { + this.close() + }, + addRowCustom () { + this.orderMainModel.jeecgOrderCustomerList.push({}); + this.$forceUpdate(); + }, + delRowCustom (index) { + console.log(index) + this.orderMainModel.jeecgOrderCustomerList.splice(index,1); + this.$forceUpdate(); + }, + addRowTicket () { + this.orderMainModel.jeecgOrderTicketList.push({}); + console.log(this.orderMainModel.jeecgOrderTicketList) + this.$forceUpdate(); + }, + delRowTicket (index) { + console.log(index) + this.orderMainModel.jeecgOrderTicketList.splice(index,1); + this.$forceUpdate(); + }, + + + } + } +</script> + +<style scoped> + .ant-btn { + padding: 0 10px; + margin-left: 3px; + } + .ant-form-item-control { + line-height: 0px; + } + /** 主表单行间距 */ + .ant-form .ant-form-item { + margin-bottom: 10px; + } + /** Tab页面行间距 */ + .ant-tabs-content .ant-form-item { + margin-bottom: 0px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderTicketModal.vue b/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderTicketModal.vue new file mode 100644 index 0000000..939df14 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderTicketModal.vue @@ -0,0 +1,184 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :okButtonProps="{ props: {disabled: disableSubmit} }" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="航班号" + hasFeedback > + <a-input placeholder="请输入航班号" v-decorator="['ticketCode', {rules:[{ required: true,message: '请输入航班号!'}]}]" :readOnly="disableSubmit"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="航班时间" + hasFeedback > + <j-date v-decorator="['tickectDate',{trigger:'input',rules:[{ required: true,message: '请输入航班号!'}]}]"></j-date> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单号码" + v-model="this.orderId" + :hidden="hiding" + hasFeedback > + <a-input v-decorator="[ 'orderId', {}]" disabled="disabled"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="创建人" + :hidden="hiding" + hasFeedback > + <a-input v-decorator="[ 'createBy', {}]" :readOnly="disableSubmit"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="创建时间" + :hidden="hiding" + hasFeedback > + <a-input v-decorator="[ 'createTime', {}]" :readOnly="disableSubmit"/> + </a-form-item> + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction } from '@/api/manage' + import pick from 'lodash.pick' + import moment from 'moment' + import JDate from '@/components/jeecg/JDate' + + export default { + components: { + JDate + }, + name: "JeecgOrderTicketModal", + data () { + return { + title:"操作", + visible: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + moment, + format:"YYYY-MM-DD HH:mm:ss", + disableSubmit: false, + orderId:"", + hiding: false, + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + }, + url: { + add: "/test/order/addTicket", + edit: "/test/order/editTicket", + }, + } + }, + created () { + }, + methods: { + add (orderId) { + if(orderId){ + this.orderId = orderId; + this.edit({},''); + }else{ + this.$message.warning("请选择一条航班数据"); + } + }, + detail(record){ + this.edit(record,'d'); + }, + edit (record,v) { + if(v == 'e'){ + this.hiding = false; + this.disableSubmit = false; + }else if(v == 'd'){ + this.hiding = false; + this.disableSubmit = true; + }else{ + this.hiding = true; + this.disableSubmit = false; + } + this.form.resetFields(); + this.model = Object.assign({}, record); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model,'ticketCode','tickectDate','orderId','createBy','createTime','updateBy','updateTime')) + }); + }, + onChange(value, dateString) { + console.log('Selected Time: ', value); + console.log('Formatted Selected Time: ', dateString); + this.model.tickectDate = dateString; + }, + onOk(value) { + console.log('onOk: ', value); + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if(!this.model.id){ + httpurl+=this.url.add; + method = 'post'; + }else{ + httpurl+=this.url.edit; + method = 'put'; + } + let formData = Object.assign(this.model, values); + //时间格式化 + formData.orderId = this.orderId; + console.log(formData) + httpAction(httpurl,formData,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + } + }) + }, + handleCancel () { + this.close() + }, + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/list/CardList.vue b/ant-design-jeecg-vue/src/views/list/CardList.vue new file mode 100644 index 0000000..bb3771a --- /dev/null +++ b/ant-design-jeecg-vue/src/views/list/CardList.vue @@ -0,0 +1,110 @@ +<template> + <div class="card-list" ref="content"> + <a-list + :grid="{gutter: 24, lg: 3, md: 2, sm: 1, xs: 1}" + :dataSource="dataSource" + > + <a-list-item slot="renderItem" slot-scope="item, index"> + <template v-if="item === null"> + <a-button class="new-btn" type="dashed"> + <a-icon type="plus"/> + 新增产品 + </a-button> + </template> + <template v-else> + <a-card :hoverable="true"> + <a-card-meta> + <div style="margin-bottom: 3px" slot="title">{{ item.title }}</div> + <a-avatar class="card-avatar" slot="avatar" :src="item.avatar" size="large"/> + <div class="meta-content" slot="description">{{ item.content }}</div> + </a-card-meta> + <template class="ant-card-actions" slot="actions"> + <a>操作一</a> + <a>操作二</a> + </template> + </a-card> + </template> + </a-list-item> + </a-list> + </div> +</template> + +<script> + + const dataSource = [] + dataSource.push(null) + for (let i = 0; i < 11; i++) { + dataSource.push({ + title: 'Alipay', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', + content: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' + }) + } + + + export default { + name: "CardList", + data () { + return { + description: '段落示意:蚂蚁金服务设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态, 提供跨越设计与开发的体验解决方案。', + linkList: [ + { icon: 'rocket', href: '#', title: '快速开始' }, + { icon: 'info-circle-o', href: '#', title: '产品简介' }, + { icon: 'file-text', href: '#', title: '产品文档' } + ], + extraImage: 'https://gw.alipayobjects.com/zos/rmsportal/RzwpdLnhmvDJToTdfDPe.png', + dataSource + } + } + } +</script> + +<style lang="scss" scoped> + .card-avatar { + width: 48px; + height: 48px; + border-radius: 48px; + } + + .ant-card-actions { + background: #f7f9fa; + li { + float: left; + text-align: center; + margin: 12px 0; + color: rgba(0, 0, 0, 0.45); + width: 50%; + + &:not(:last-child) { + border-right: 1px solid #e8e8e8; + } + + a { + color: rgba(0, 0, 0, .45); + line-height: 22px; + display: inline-block; + width: 100%; + &:hover { + color: #1890ff; + } + } + } + } + + .new-btn { + background-color: #fff; + border-radius: 2px; + width: 100%; + height: 188px; + } + + .meta-content { + position: relative; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + height: 64px; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/list/PermissionList.vue b/ant-design-jeecg-vue/src/views/list/PermissionList.vue new file mode 100644 index 0000000..0eb7cc1 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/list/PermissionList.vue @@ -0,0 +1,272 @@ +<template> + <a-card :bordered="false"> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="48"> + <a-col :md="8" :sm="24"> + <a-form-item label="角色ID"> + <a-input placeholder="请输入"/> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="状态"> + <a-select placeholder="请选择" default-value="0"> + <a-select-option value="0">全部</a-select-option> + <a-select-option value="1">关闭</a-select-option> + <a-select-option value="2">运行中</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <span class="table-page-search-submitButtons"> + <a-button type="primary">查询</a-button> + <a-button style="margin-left: 8px">重置</a-button> + </span> + </a-col> + </a-row> + </a-form> + </div> + + <s-table :columns="columns" :data="loadData"> + + <span slot="actions" slot-scope="text, record"> + <a-tag v-for="(action, index) in record.actionList" :key="index">{{ action.describe }}</a-tag> + </span> + + <span slot="status" slot-scope="text"> + {{ text | statusFilter }} + </span> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link"> + 更多 <a-icon type="down" /> + </a> + <a-menu slot="overlay"> + <a-menu-item> + <a href="javascript:;">详情</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">禁用</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">删除</a> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + </s-table> + + <a-modal + title="操作" + :width="800" + v-model="visible" + @ok="handleOk" + > + <a-form :autoFormCreate="(form)=>{this.form = form}"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="唯一识别码" + hasFeedback + validateStatus="success" + > + <a-input placeholder="唯一识别码" v-model="mdl.id" id="no" disabled="disabled" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="权限名称" + hasFeedback + validateStatus="success" + > + <a-input placeholder="起一个名字" v-model="mdl.name" id="permission_name" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="状态" + hasFeedback + validateStatus="warning" + > + <a-select v-model="mdl.status"> + <a-select-option value="1">正常</a-select-option> + <a-select-option value="2">禁用</a-select-option> + </a-select> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="描述" + hasFeedback + > + <a-textarea :rows="5" v-model="mdl.describe" placeholder="..." id="describe"/> + </a-form-item> + + <a-divider /> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="赋予权限" + hasFeedback + > + <a-select + style="width: 100%" + mode="multiple" + v-model="mdl.actions" + :allowClear="true" + > + <a-select-option v-for="(action, index) in permissionList" :key="index" :value="action.value">{{ action.label }}</a-select-option> + </a-select> + </a-form-item> + + </a-form> + </a-modal> + + </a-card> +</template> + +<script> + import STable from '@/components/table/' + + export default { + name: "TableList", + components: { + STable + }, + data () { + return { + description: '列表使用场景:后台管理中的权限管理以及角色管理,可用于基于 RBAC 设计的角色权限控制,颗粒度细到每一个操作类型。', + + visible: false, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + form: null, + mdl: {}, + + // 高级搜索 展开/关闭 + advanced: false, + // 查询参数 + queryParam: {}, + // 表头 + columns: [ + { + title: '唯一识别码', + dataIndex: 'id' + }, + { + title: '权限名称', + dataIndex: 'name', + }, + { + title: '可操作权限', + dataIndex: 'actions', + scopedSlots: { customRender: 'actions' }, + }, + { + title: '状态', + dataIndex: 'status', + scopedSlots: { customRender: 'status' }, + }, + { + title: '操作', + width: '150px', + dataIndex: 'action', + scopedSlots: { customRender: 'action' }, + } + ], + // 向后端拉取可以用的操作列表 + permissionList: null, + // 加载数据方法 必须为 Promise 对象 + loadData: parameter => { + return this.$http.get('/api/permission', { + params: Object.assign(parameter, this.queryParam) + }).then(res => { + let result = res.result + result.data.map(permission => { + permission.actionList = JSON.parse(permission.actionData) + return permission + }) + return result + }) + }, + + selectedRowKeys: [], + selectedRows: [] + } + }, + filters: { + statusFilter(status) { + const statusMap = { + 1: '正常', + 2: '禁用' + } + return statusMap[status] + } + }, + created () { + this.loadPermissionList() + }, + methods: { + loadPermissionList () { + // permissionList + new Promise((resolve => { + const data = [ + { label: '新增', value: 'add', defaultChecked: false }, + { label: '查询', value: 'get', defaultChecked: false }, + { label: '修改', value: 'update', defaultChecked: false }, + { label: '列表', value: 'query', defaultChecked: false }, + { label: '删除', value: 'delete', defaultChecked: false }, + { label: '导入', value: 'import', defaultChecked: false }, + { label: '导出', value: 'export', defaultChecked: false } + ] + setTimeout(resolve(data), 1500) + })).then(res => { + this.permissionList = res + }) + }, + handleEdit (record) { + this.mdl = Object.assign({}, record) + console.log(this.mdl) + this.visible = true + }, + handleOk () { + + }, + onChange (selectedRowKeys, selectedRows) { + this.selectedRowKeys = selectedRowKeys + this.selectedRows = selectedRows + }, + toggleAdvanced () { + this.advanced = !this.advanced + }, + }, + watch: { + /* + 'selectedRows': function (selectedRows) { + this.needTotalList = this.needTotalList.map(item => { + return { + ...item, + total: selectedRows.reduce( (sum, val) => { + return sum + val[item.dataIndex] + }, 0) + } + }) + } + */ + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/list/RoleList.vue b/ant-design-jeecg-vue/src/views/list/RoleList.vue new file mode 100644 index 0000000..77c29f9 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/list/RoleList.vue @@ -0,0 +1,182 @@ +<template> + <a-card :bordered="false"> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="48"> + <a-col :md="8" :sm="24"> + <a-form-item label="角色ID"> + <a-input placeholder="请输入"/> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="状态"> + <a-select placeholder="请选择" default-value="0"> + <a-select-option value="0">全部</a-select-option> + <a-select-option value="1">正常</a-select-option> + <a-select-option value="2">禁用</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <span class="table-page-search-submitButtons"> + <a-button type="primary">查询</a-button> + <a-button style="margin-left: 8px">重置</a-button> + </span> + </a-col> + </a-row> + </a-form> + </div> + + <s-table + ref="table" + size="default" + :columns="columns" + :data="loadData" + > + <div + slot="expandedRowRender" + slot-scope="record" + style="margin: 0"> + <a-row + :gutter="24" + :style="{ marginBottom: '12px' }"> + <a-col :span="12" v-for="(role, index) in record.permissions" :key="index" :style="{ marginBottom: '12px' }"> + <a-col :span="4"> + <span>{{ role.permissionName }}:</span> + </a-col> + <a-col :span="20" v-if="role.actionEntitySet.length > 0"> + <a-tag color="cyan" v-for="(action, k) in role.actionEntitySet" :key="k">{{ action.describe }}</a-tag> + </a-col> + <a-col :span="20" v-else>-</a-col> + </a-col> + </a-row> + </div> + <span slot="action" slot-scope="text, record"> + <a @click="$refs.modal.edit(record)">编辑</a> + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link"> + 更多 <a-icon type="down" /> + </a> + <a-menu slot="overlay"> + <a-menu-item> + <a href="javascript:;">详情</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">禁用</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">删除</a> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + </s-table> + + <role-modal ref="modal" @ok="handleOk"></role-modal> + + </a-card> +</template> + +<script> + import STable from '@/components/table/' + import RoleModal from './modules/RoleModal' + + export default { + name: "TableList", + components: { + STable, + RoleModal + }, + data () { + return { + description: '列表使用场景:后台管理中的权限管理以及角色管理,可用于基于 RBAC 设计的角色权限控制,颗粒度细到每一个操作类型。', + + visible: false, + + form: null, + mdl: {}, + + // 高级搜索 展开/关闭 + advanced: false, + // 查询参数 + queryParam: {}, + // 表头 + columns: [ + { + title: '唯一识别码', + dataIndex: 'id' + }, + { + title: '角色名称', + dataIndex: 'name', + }, + { + title: '状态', + dataIndex: 'status' + }, + { + title: '创建时间', + dataIndex: 'createTime', + sorter: true + }, { + title: '操作', + width: '150px', + dataIndex: 'action', + scopedSlots: { customRender: 'action' }, + } + ], + // 加载数据方法 必须为 Promise 对象 + loadData: parameter => { + return this.$http.get('/api/role', { + params: Object.assign(parameter, this.queryParam) + }).then(res => { + return res.result + }) + }, + + selectedRowKeys: [], + selectedRows: [] + } + }, + methods: { + handleEdit (record) { + this.mdl = Object.assign({}, record) + + this.mdl.permissions.forEach(permission => { + permission.actionsOptions = permission.actionEntitySet.map(action => { + return { label: action.describe, value: action.action, defaultCheck: action.defaultCheck } + }) + }) + + console.log(this.mdl) + this.visible = true + }, + handleOk () { + // 新增/修改 成功时,重载列表 + this.$refs.table.refresh() + }, + onChange (selectedRowKeys, selectedRows) { + this.selectedRowKeys = selectedRowKeys + this.selectedRows = selectedRows + }, + toggleAdvanced () { + this.advanced = !this.advanced + }, + }, + watch: { + /* + 'selectedRows': function (selectedRows) { + this.needTotalList = this.needTotalList.map(item => { + return { + ...item, + total: selectedRows.reduce( (sum, val) => { + return sum + val[item.dataIndex] + }, 0) + } + }) + } + */ + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/list/StandardList.vue b/ant-design-jeecg-vue/src/views/list/StandardList.vue new file mode 100644 index 0000000..03e7aad --- /dev/null +++ b/ant-design-jeecg-vue/src/views/list/StandardList.vue @@ -0,0 +1,164 @@ +<template> + <div> + <a-card :bordered="false"> + <a-row> + <a-col :sm="8" :xs="24"> + <head-info title="我的待办" content="8个任务" :bordered="true"/> + </a-col> + <a-col :sm="8" :xs="24"> + <head-info title="本周任务平均处理时间" content="32分钟" :bordered="true"/> + </a-col> + <a-col :sm="8" :xs="24"> + <head-info title="本周完成任务数" content="24个"/> + </a-col> + </a-row> + </a-card> + + <a-card + style="margin-top: 24px" + :bordered="false" + title="标准列表"> + + <div slot="extra"> + <a-radio-group> + <a-radio-button>全部</a-radio-button> + <a-radio-button>进行中</a-radio-button> + <a-radio-button>等待中</a-radio-button> + </a-radio-group> + <a-input-search style="margin-left: 16px; width: 272px;" /> + </div> + + <div class="operate"> + <a-button type="dashed" style="width: 100%" icon="plus">添加</a-button> + </div> + + <a-list size="large" :pagination="{showSizeChanger: true, showQuickJumper: true, pageSize: 5, total: 50}"> + <a-list-item :key="index" v-for="(item, index) in data"> + <a-list-item-meta :description="item.description"> + <a-avatar slot="avatar" size="large" shape="square" :src="item.avatar"/> + <a slot="title">{{ item.title }}</a> + </a-list-item-meta> + <div slot="actions"> + <a>编辑</a> + </div> + <div slot="actions"> + <a-dropdown> + <a-menu slot="overlay"> + <a-menu-item><a>编辑</a></a-menu-item> + <a-menu-item><a>删除</a></a-menu-item> + </a-menu> + <a>更多<a-icon type="down"/></a> + </a-dropdown> + </div> + <div class="list-content"> + <div class="list-content-item"> + <span>Owner</span> + <p>{{ item.owner }}</p> + </div> + <div class="list-content-item"> + <span>开始时间</span> + <p>{{ item.startAt }}</p> + </div> + <div class="list-content-item"> + <a-progress :percent="item.progress.value" :status="!item.progress.status ? null : item.progress.status" style="width: 180px" /> + </div> + </div> + </a-list-item> + </a-list> + + </a-card> + </div> +</template> + +<script> + import HeadInfo from '@/components/tools/HeadInfo' + + const data = [] + data.push({ + title: 'Alipay', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', + description: '那是一种内在的东西, 他们到达不了,也无法触及的', + owner: '付晓晓', + startAt: '2018-07-26 22:44', + progress: { + value: 90 + } + }) + data.push({ + title: 'Angular', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', + description: '希望是一个好东西,也许是最好的,好东西是不会消亡的', + owner: '曲丽丽', + startAt: '2018-07-26 22:44', + progress: { + value: 54 + } + }) + data.push({ + title: 'Ant Design', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', + description: '生命就像一盒巧克力,结果往往出人意料', + owner: '林东东', + startAt: '2018-07-26 22:44', + progress: { + value: 66 + } + }) + data.push({ + title: 'Ant Design Pro', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', + description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', + owner: '周星星', + startAt: '2018-07-26 22:44', + progress: { + value: 30 + } + }) + data.push({ + title: 'Bootstrap', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', + description: '那时候我只会想自己想要什么,从不想自己拥有什么', + owner: '吴加好', + startAt: '2018-07-26 22:44', + progress: { + status: 'exception', + value: 100 + } + }) + + export default { + name: "StandardList", + components: { + HeadInfo + }, + data () { + return { + data + } + } + } +</script> + +<style lang="scss" scoped> + .ant-avatar-lg { + width: 48px; + height: 48px; + line-height: 48px; + } + + .list-content-item { + color: rgba(0, 0, 0, .45); + display: inline-block; + vertical-align: middle; + font-size: 14px; + margin-left: 40px; + span { + line-height: 20px; + } + p { + margin-top: 4px; + margin-bottom: 0; + line-height: 22px; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/list/TableInnerEditList.vue b/ant-design-jeecg-vue/src/views/list/TableInnerEditList.vue new file mode 100644 index 0000000..2520b20 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/list/TableInnerEditList.vue @@ -0,0 +1,270 @@ +<template> + <a-card :bordered="false"> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="48"> + <a-col :md="8" :sm="24"> + <a-form-item label="规则编号"> + <a-input placeholder=""/> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="使用状态"> + <a-select placeholder="请选择" default-value="0"> + <a-select-option value="0">全部</a-select-option> + <a-select-option value="1">关闭</a-select-option> + <a-select-option value="2">运行中</a-select-option> + </a-select> + </a-form-item> + </a-col> + <template v-if="advanced"> + <a-col :md="8" :sm="24"> + <a-form-item label="调用次数"> + <a-input-number style="width: 100%"/> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="更新日期"> + <a-date-picker style="width: 100%" placeholder="请输入更新日期"/> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="使用状态"> + <a-select placeholder="请选择" default-value="0"> + <a-select-option value="0">全部</a-select-option> + <a-select-option value="1">关闭</a-select-option> + <a-select-option value="2">运行中</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="使用状态"> + <a-select placeholder="请选择" default-value="0"> + <a-select-option value="0">全部</a-select-option> + <a-select-option value="1">关闭</a-select-option> + <a-select-option value="2">运行中</a-select-option> + </a-select> + </a-form-item> + </a-col> + </template> + <a-col :md="!advanced && 8 || 24" :sm="24"> + <span class="table-page-search-submitButtons" :style="advanced && { float: 'right', overflow: 'hidden' } || {} "> + <a-button type="primary">查询</a-button> + <a-button style="margin-left: 8px">重置</a-button> + <a @click="toggleAdvanced" style="margin-left: 8px"> + {{ advanced ? '收起' : '展开' }} + <a-icon :type="advanced ? 'up' : 'down'"/> + </a> + </span> + </a-col> + </a-row> + </a-form> + </div> + + <div class="table-operator"> + <a-button type="primary" icon="plus" @click="() => $router.push({name: 'anime-add'})">新建</a-button> + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1"><a-icon type="delete" />删除</a-menu-item> + <!-- lock | unlock --> + <a-menu-item key="2"><a-icon type="lock" />锁定</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> + 批量操作 <a-icon type="down" /> + </a-button> + </a-dropdown> + </div> + + <s-table + ref="table" + size="default" + :columns="columns" + :data="loadData" + :showAlertInfo="true" + @onSelect="onChange" + > + <template v-for="(col, index) in columns" v-if="col.scopedSlots" :slot="col.dataIndex" slot-scope="text, record, index"> + <div :key="index"> + <a-input + v-if="record.editable" + style="margin: -5px 0" + :value="text" + @change="e => handleChange(e.target.value, record.key, col)" + /> + <template v-else>{{ text }}</template> + </div> + </template> + <template slot="action" slot-scope="text, record, index"> + <div class="editable-row-operations"> + <span v-if="record.editable"> + <a @click="() => save(record)">保存</a> + <a-divider type="vertical" /> + <a-popconfirm title="真的放弃编辑吗?" @confirm="() => cancel(record)"> + <a>取消</a> + </a-popconfirm> + </span> + <span v-else> + <a class="edit" @click="() => edit(record)">修改</a> + <a-divider type="vertical" /> + <a class="delete" @click="() => del(record)">删除</a> + </span> + </div> + </template> + </s-table> + + </a-card> +</template> + +<script> + import STable from '@/components/table/' + + export default { + name: "TableList", + components: { + STable + }, + data () { + return { + // 高级搜索 展开/关闭 + advanced: false, + // 查询参数 + queryParam: {}, + // 表头 + columns: [ + { + title: '规则编号', + dataIndex: 'no', + width: 90 + }, + { + title: '描述', + dataIndex: 'description', + scopedSlots: { customRender: 'description' }, + }, + { + title: '服务调用次数', + dataIndex: 'callNo', + width: '150px', + sorter: true, + needTotal: true, + scopedSlots: { customRender: 'callNo' }, + // customRender: (text) => text + ' 次' + }, + { + title: '状态', + dataIndex: 'status', + width: '100px', + needTotal: true, + scopedSlots: { customRender: 'status' }, + }, + { + title: '更新时间', + dataIndex: 'updatedAt', + width: '150px', + sorter: true, + scopedSlots: { customRender: 'updatedAt' }, + }, + { + table: '操作', + dataIndex: 'action', + width: '120px', + scopedSlots: { customRender: 'action' }, + } + ], + // 加载数据方法 必须为 Promise 对象 + loadData: parameter => { + return this.$http.get('/api/service', { + params: Object.assign(parameter, this.queryParam) + }).then(res => { + return res.result + }) + }, + + selectedRowKeys: [], + selectedRows: [] + } + }, + methods: { + + handleChange (value, key, column) { + console.log(value, key, column) + }, + edit (row) { + row.editable = true + // row = Object.assign({}, row) + this.$refs.table.updateEdit() + }, + // eslint-disable-next-line + del (row) { + this.$confirm({ + title: '警告', + content: '真的要删除吗?', + okText: '删除', + okType: 'danger', + cancelText: '取消', + onOk() { + console.log('OK'); + // 在这里调用删除接口 + return new Promise((resolve, reject) => { + setTimeout(Math.random() > 0.5 ? resolve : reject, 1000); + }).catch(() => console.log('Oops errors!')); + }, + onCancel() { + console.log('Cancel'); + }, + }); + }, + save (row) { + delete row.editable + this.$refs.table.updateEdit() + }, + cancel (row) { + delete row.editable + this.$refs.table.updateEdit() + }, + + onChange (row) { + this.selectedRowKeys = row.selectedRowKeys + this.selectedRows = row.selectedRows + }, + toggleAdvanced () { + this.advanced = !this.advanced + }, + }, + watch: { + /* + 'selectedRows': function (selectedRows) { + this.needTotalList = this.needTotalList.map(item => { + return { + ...item, + total: selectedRows.reduce( (sum, val) => { + return sum + val[item.dataIndex] + }, 0) + } + }) + } + */ + } + } +</script> + +<style lang="scss" scoped> + .search { + margin-bottom: 54px; + } + + .fold { + width: calc(100% - 216px); + display: inline-block + } + + .operator { + margin-bottom: 18px; + } + + @media screen and (max-width: 900px) { + .fold { + width: 100%; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/list/TableList.vue b/ant-design-jeecg-vue/src/views/list/TableList.vue new file mode 100644 index 0000000..ac9e064 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/list/TableList.vue @@ -0,0 +1,337 @@ +<template> + <a-card :bordered="false"> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="48"> + <a-col :md="8" :sm="24"> + <a-form-item label="规则编号"> + <a-input v-model="queryParam.id" placeholder=""/> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="使用状态"> + <a-select v-model="queryParam.status" placeholder="请选择" default-value="0"> + <a-select-option value="0">全部</a-select-option> + <a-select-option value="1">关闭</a-select-option> + <a-select-option value="2">运行中</a-select-option> + </a-select> + </a-form-item> + </a-col> + <template v-if="advanced"> + <a-col :md="8" :sm="24"> + <a-form-item label="调用次数"> + <a-input-number v-model="queryParam.callNo" style="width: 100%"/> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="更新日期"> + <a-date-picker v-model="queryParam.date" style="width: 100%" placeholder="请输入更新日期"/> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="使用状态"> + <a-select v-model="queryParam.useStatus" placeholder="请选择" default-value="0"> + <a-select-option value="0">全部</a-select-option> + <a-select-option value="1">关闭</a-select-option> + <a-select-option value="2">运行中</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="使用状态"> + <a-select placeholder="请选择" default-value="0"> + <a-select-option value="0">全部</a-select-option> + <a-select-option value="1">关闭</a-select-option> + <a-select-option value="2">运行中</a-select-option> + </a-select> + </a-form-item> + </a-col> + </template> + <a-col :md="!advanced && 8 || 24" :sm="24"> + <span class="table-page-search-submitButtons" :style="advanced && { float: 'right', overflow: 'hidden' } || {} "> + <a-button type="primary">查询</a-button> + <a-button style="margin-left: 8px" @click="resetSearchForm">重置</a-button> + <a @click="toggleAdvanced" style="margin-left: 8px"> + {{ advanced ? '收起' : '展开' }} + <a-icon :type="advanced ? 'up' : 'down'"/> + </a> + </span> + </a-col> + </a-row> + </a-form> + </div> + + <div class="table-operator"> + <a-button type="primary" icon="plus" @click="() => this.handleModalVisible(true)">新建</a-button> + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1"><a-icon type="delete" />删除</a-menu-item> + <!-- lock | unlock --> + <a-menu-item key="2"><a-icon type="lock" />锁定</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> + 批量操作 <a-icon type="down" /> + </a-button> + </a-dropdown> + </div> + + <s-table + ref="table" + size="default" + :columns="columns" + :data="loadData" + :showAlertInfo="true" + @onSelect="onChange" + > + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link"> + 更多 <a-icon type="down" /> + </a> + <a-menu slot="overlay"> + <a-menu-item> + <a href="javascript:;">详情</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">禁用</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">删除</a> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + </s-table> + + <a-modal + title="操作" + :width="800" + v-model="visible" + @ok="handleOk" + > + <a-form :autoFormCreate="(form)=>{this.form = form}"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="规则编号" + hasFeedback + validateStatus="success" + > + <a-input placeholder="规则编号" v-model="mdl.no" id="no" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="服务调用次数" + hasFeedback + validateStatus="success" + > + <a-input-number :min="1" id="callNo" v-model="mdl.callNo" style="width: 100%" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="状态" + hasFeedback + validateStatus="warning" + > + <a-select defaultValue="1" v-model="mdl.status"> + <a-select-option value="1">Option 1</a-select-option> + <a-select-option value="2">Option 2</a-select-option> + <a-select-option value="3">Option 3</a-select-option> + </a-select> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="描述" + hasFeedback + help="请填写一段描述" + > + <a-textarea :rows="5" v-model="mdl.description" placeholder="..." id="description"/> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="更新时间" + hasFeedback + validateStatus="error" + > + <a-date-picker + style="width: 100%" + showTime + format="YYYY-MM-DD HH:mm:ss" + placeholder="Select Time" + /> + </a-form-item> + + </a-form> + </a-modal> + + <a-modal title="新建规则" destroyOnClose :visible="visibleCreateModal" @ok="handleCreateModalOk" @cancel="handleCreateModalCancel"> + <!----> + <a-form style="margin-top: 8px" :autoFormCreate="(form)=>{this.createForm = form}"> + <a-form-item :labelCol="{ span: 5 }" :wrapperCol="{ span: 15 }" label="描述" fieldDecoratorId="description" :fieldDecoratorOptions="{rules: [{ required: true, message: '请输入至少五个字符的规则描述!', min: 5 }]}"> + <a-input placeholder="请输入" /> + </a-form-item> + </a-form> + </a-modal> + + </a-card> +</template> + +<script> + import STable from '@/components/table/' + import ATextarea from "ant-design-vue/es/input/TextArea" + import AInput from "ant-design-vue/es/input/Input" + import moment from "moment" + import axios from 'axios'; + import { getRoleList, getServiceList } from '@/api/manage' + + export default { + name: "TableList", + components: { + AInput, + ATextarea, + STable + }, + data () { + return { + visibleCreateModal:false, + visible: false, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 12 }, + }, + form: null, + mdl: {}, + + // 高级搜索 展开/关闭 + advanced: true, + // 查询参数 + queryParam: {}, + // 表头 + columns: [ + { + title: '规则编号', + dataIndex: 'no' + }, + { + title: '描述', + dataIndex: 'description' + }, + { + title: '服务调用次数', + dataIndex: 'callNo', + sorter: true, + needTotal: true, + customRender: (text) => text + ' 次' + }, + { + title: '状态', + dataIndex: 'status', + needTotal: true + }, + { + title: '更新时间', + dataIndex: 'updatedAt', + sorter: true + }, + { + table: '操作', + dataIndex: 'action', + width: '150px', + scopedSlots: { customRender: 'action' }, + } + ], + // 加载数据方法 必须为 Promise 对象 + loadData: parameter => { + return getServiceList(Object.assign(parameter, this.queryParam)) + .then(res => { + return res.result + }) + }, + + selectedRowKeys: [], + selectedRows: [] + } + }, + created () { + getRoleList({ t: new Date()}) + }, + methods: { + handleEdit (record) { + this.mdl = Object.assign({}, record) + console.log(this.mdl) + this.visible = true + }, + handleOk () { + + }, + + //添加逻辑 + handleModalVisible(isVisible) { + this.visibleCreateModal = isVisible; + }, + handleCreateModalOk() { + this.createForm.validateFields((err, fieldsValue) => { + if (err) { + return; + } + const description = this.createForm.getFieldValue('description'); + axios.post('/saveRule', { + desc: description, + }).then((res) => { + this.createForm.resetFields(); + this.visibleCreateModal = false; + this.loadRuleData(); + }); + }); + }, + handleCreateModalCancel() { + this.visibleCreateModal = false; + }, + + onChange (row) { + this.selectedRowKeys = row.selectedRowKeys + this.selectedRows = row.selectedRows + + console.log(this.$refs.table) + }, + toggleAdvanced () { + this.advanced = !this.advanced + }, + + resetSearchForm () { + this.queryParam = { + date: moment(new Date()) + } + } + }, + watch: { + /* + 'selectedRows': function (selectedRows) { + this.needTotalList = this.needTotalList.map(item => { + return { + ...item, + total: selectedRows.reduce( (sum, val) => { + return sum + val[item.dataIndex] + }, 0) + } + }) + } + */ + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/list/UserList.vue b/ant-design-jeecg-vue/src/views/list/UserList.vue new file mode 100644 index 0000000..a3b95be --- /dev/null +++ b/ant-design-jeecg-vue/src/views/list/UserList.vue @@ -0,0 +1,264 @@ +<template> + <a-card :bordered="false"> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="48"> + <a-col :md="8" :sm="24"> + <a-form-item label="角色ID"> + <a-input placeholder="请输入"/> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <a-form-item label="状态"> + <a-select placeholder="请选择" default-value="0"> + <a-select-option value="0">全部</a-select-option> + <a-select-option value="1">关闭</a-select-option> + <a-select-option value="2">运行中</a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :md="8" :sm="24"> + <span class="table-page-search-submitButtons"> + <a-button type="primary">查询</a-button> + <a-button style="margin-left: 8px">重置</a-button> + </span> + </a-col> + </a-row> + </a-form> + </div> + + <s-table + size="default" + :columns="columns" + :data="loadData" + > + <div + slot="expandedRowRender" + slot-scope="record" + style="margin: 0"> + <a-row + :gutter="24" + :style="{ marginBottom: '12px' }"> + <a-col :span="12" v-for="(role, index) in record.permissions" :key="index" :style="{ marginBottom: '12px' }"> + <a-col :lg="4" :md="24"> + <span>{{ role.permissionName }}:</span> + </a-col> + <a-col :lg="20" :md="24" v-if="role.actionEntitySet.length > 0"> + <a-tag color="cyan" v-for="(action, k) in role.actionEntitySet" :key="k">{{ action.describe }}</a-tag> + </a-col> + <a-col :span="20" v-else>-</a-col> + </a-col> + </a-row> + </div> + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link"> + 更多 <a-icon type="down" /> + </a> + <a-menu slot="overlay"> + <a-menu-item> + <a href="javascript:;">详情</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">禁用</a> + </a-menu-item> + <a-menu-item> + <a href="javascript:;">删除</a> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + </s-table> + + <a-modal + title="操作" + style="top: 20px;" + :width="800" + v-model="visible" + @ok="handleOk" + > + <a-form :autoFormCreate="(form)=>{this.form = form}"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="唯一识别码" + hasFeedback + validateStatus="success" + > + <a-input placeholder="唯一识别码" v-model="mdl.id" id="no" disabled="disabled" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="角色名称" + hasFeedback + validateStatus="success" + > + <a-input placeholder="起一个名字" v-model="mdl.name" id="role_name" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="状态" + hasFeedback + validateStatus="warning" + > + <a-select v-model="mdl.status"> + <a-select-option value="1">正常</a-select-option> + <a-select-option value="2">禁用</a-select-option> + </a-select> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="描述" + hasFeedback + > + <a-textarea :rows="5" v-model="mdl.describe" placeholder="..." id="describe"/> + </a-form-item> + + <a-divider /> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="拥有权限" + hasFeedback + > + <a-row :gutter="16" v-for="(permission, index) in mdl.permissions" :key="index"> + <a-col :span="4"> + {{ permission.permissionName }}: + </a-col> + <a-col :span="20"> + <a-checkbox-group :options="permission.actionsOptions"/> + </a-col> + </a-row> + + </a-form-item> + + </a-form> + </a-modal> + + </a-card> +</template> + +<script> + import STable from '@/components/table/' + import { getRoleList, getServiceList } from '@/api/manage' + + export default { + name: "TableList", + components: { + STable + }, + data () { + return { + description: '列表使用场景:后台管理中的权限管理以及角色管理,可用于基于 RBAC 设计的角色权限控制,颗粒度细到每一个操作类型。', + + visible: false, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + form: null, + mdl: {}, + + // 高级搜索 展开/关闭 + advanced: false, + // 查询参数 + queryParam: {}, + // 表头 + columns: [ + { + title: '唯一识别码', + dataIndex: 'id' + }, + { + title: '角色名称', + dataIndex: 'name', + }, + { + title: '状态', + dataIndex: 'status' + }, + { + title: '创建时间', + dataIndex: 'createTime', + sorter: true + }, { + title: '操作', + width: '150px', + dataIndex: 'action', + scopedSlots: { customRender: 'action' }, + } + ], + // 加载数据方法 必须为 Promise 对象 + loadData: parameter => { + return getRoleList(parameter) + .then(res => { + return res.result + }) + }, + + selectedRowKeys: [], + selectedRows: [] + } + }, + created () { + getServiceList().then(res => { + console.log('getServiceList.call()', res) + }) + + getRoleList().then(res => { + console.log('getRoleList.call()', res) + }) + }, + methods: { + handleEdit (record) { + this.mdl = Object.assign({}, record) + + this.mdl.permissions.forEach(permission => { + permission.actionsOptions = permission.actionEntitySet.map(action => { + return { label: action.describe, value: action.action, defaultCheck: action.defaultCheck } + }) + }) + + this.visible = true + }, + handleOk () { + + }, + onChange (selectedRowKeys, selectedRows) { + this.selectedRowKeys = selectedRowKeys + this.selectedRows = selectedRows + }, + toggleAdvanced () { + this.advanced = !this.advanced + }, + }, + watch: { + /* + 'selectedRows': function (selectedRows) { + this.needTotalList = this.needTotalList.map(item => { + return { + ...item, + total: selectedRows.reduce( (sum, val) => { + return sum + val[item.dataIndex] + }, 0) + } + }) + } + */ + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/list/modules/RoleModal.vue b/ant-design-jeecg-vue/src/views/list/modules/RoleModal.vue new file mode 100644 index 0000000..4f9f832 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/list/modules/RoleModal.vue @@ -0,0 +1,203 @@ +<template> + <a-modal + title="操作" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + > + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="唯一识别码" + hasFeedback + > + <a-input placeholder="唯一识别码" disabled="disabled" v-decorator="[ 'id', {rules: []} ]" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="角色名称" + hasFeedback > + <a-input placeholder="起一个名字" v-decorator="[ 'name', {rules: [{ required: true, message: '不起一个名字吗?' }] }]" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="状态" + hasFeedback > + <a-select v-decorator="[ 'status', {rules: []} ]"> + <a-select-option :value="1">正常</a-select-option> + <a-select-option :value="2">禁用</a-select-option> + </a-select> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="描述" + hasFeedback + > + <a-textarea :rows="5" placeholder="..." v-decorator="[ 'describe', { rules: [] } ]" /> + </a-form-item> + + <a-divider/> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="拥有权限" + hasFeedback + > + <a-row :gutter="16" v-for="(permission, index) in permissions" :key="index"> + <a-col :span="4"> + {{ permission.name }}: + </a-col> + <a-col :span="20"> + <a-checkbox + v-if="permission.actionsOptions.length > 0" + :indeterminate="permission.indeterminate" + :checked="permission.checkedAll" + @change="onChangeCheckAll($event, permission)"> + 全选 + </a-checkbox> + <a-checkbox-group :options="permission.actionsOptions" v-model="permission.selected" @change="onChangeCheck(permission)" /> + </a-col> + </a-row> + + </a-form-item> + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { getPermissions } from '@/api/manage' + import { actionToObject } from '@/utils/permissions' + import pick from 'lodash.pick' + + export default { + name: "RoleModal", + data () { + return { + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + visible: false, + confirmLoading: false, + mdl: {}, + + form: this.$form.createForm(this), + permissions: [] + } + }, + created () { + this.loadPermissions() + }, + methods: { + add () { + this.edit({ id: 0 }) + }, + edit (record) { + this.mdl = Object.assign({}, record) + this.visible = true + + // 有权限表,处理勾选 + if (this.mdl.permissions && this.permissions) { + // 先处理要勾选的权限结构 + const permissionsAction = {} + this.mdl.permissions.forEach(permission => { + permissionsAction[permission.permissionId] = permission.actionEntitySet.map(entity => entity.action) + }) + // 把权限表遍历一遍,设定要勾选的权限 action + this.permissions.forEach(permission => { + permission.selected = permissionsAction[permission.id] + }) + } + + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.mdl, 'id', 'name', 'status', 'describe')) + }) + console.log('this.mdl', this.mdl) + + }, + close () { + this.$emit('close') + this.visible = false + }, + handleOk () { + const _this = this + // 触发表单验证 + this.form.validateFields((err, values) => { + // 验证表单没错误 + if (!err) { + console.log('form values', values) + + _this.confirmLoading = true + // 模拟后端请求 2000 毫秒延迟 + new Promise((resolve) => { + setTimeout(() => resolve(), 2000) + }).then(() => { + // Do something + _this.$message.success('保存成功') + _this.$emit('ok') + }).catch(() => { + // Do something + }).finally(() => { + _this.confirmLoading = false + _this.close() + }) + } + }) + }, + handleCancel () { + this.close() + }, + onChangeCheck (permission) { + permission.indeterminate = !!permission.selected.length && (permission.selected.length < permission.actionsOptions.length) + permission.checkedAll = permission.selected.length === permission.actionsOptions.length + }, + onChangeCheckAll (e, permission) { + Object.assign(permission, { + selected: e.target.checked ? permission.actionsOptions.map(obj => obj.value) : [], + indeterminate: false, + checkedAll: e.target.checked + }) + }, + loadPermissions () { + getPermissions().then(res => { + let result = res.result + this.permissions = result.map(permission => { + const options = actionToObject(permission.actionData) + permission.checkedAll = false + permission.selected = [] + permission.indeterminate = false + permission.actionsOptions = options.map(option => { + return { + label: option.describe, + value: option.action + } + }) + return permission + }) + }) + } + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/list/search/SearchLayout.vue b/ant-design-jeecg-vue/src/views/list/search/SearchLayout.vue new file mode 100644 index 0000000..16aa0f5 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/list/search/SearchLayout.vue @@ -0,0 +1,78 @@ +<template> + <div class="search-content"> + <router-view /> + </div> +</template> + +<script> + export default { + name: "SearchLayout", + data () { + return { + tabs: { + items: [ + { + key: '1', + title: '文章' + }, + { + key: '2', + title: '项目' + }, + { + key: '3', + title: '应用' + }, + ], + active: () => { + switch (this.$route.path) { + case '/list/search/article': + return '1' + case '/list/search/project': + return '2' + case '/list/search/application': + return '3' + default: + return '1' + } + }, + callback: (key) => { + switch (key) { + case '1': + this.$router.push('/list/search/article') + break + case '2': + this.$router.push('/list/search/project') + break + case '3': + this.$router.push('/list/search/application') + break + default: + this.$router.push('/workplace') + } + } + }, + search: true + } + }, + computed: { + + }, + methods: { + } + } +</script> + +<style lang="scss" scoped> + .search-head{ + background-color: #fff; + margin: -25px -24px -24px; + .search-input{ + text-align: center; + margin-bottom: 16px; + } + } + .search-content{ + margin-top: 48px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/profile/advanced/Advanced.vue b/ant-design-jeecg-vue/src/views/profile/advanced/Advanced.vue new file mode 100644 index 0000000..f584292 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/profile/advanced/Advanced.vue @@ -0,0 +1,342 @@ +<template> + <page-layout title="单号:234231029431" logo="https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png"> + + <detail-list slot="headerContent" size="small" :col="2" class="detail-layout"> + <detail-list-item term="创建人">曲丽丽</detail-list-item> + <detail-list-item term="订购产品">XX服务</detail-list-item> + <detail-list-item term="创建时间">2018-08-07</detail-list-item> + <detail-list-item term="关联单据"><a>12421</a></detail-list-item> + <detail-list-item term="生效日期">2018-08-07 ~ 2018-12-11</detail-list-item> + <detail-list-item term="备注">请于两个工作日内确认</detail-list-item> + </detail-list> + <a-row slot="extra" class="status-list"> + <a-col :xs="12" :sm="12"> + <div class="text">状态</div> + <div class="heading">待审批</div> + </a-col> + <a-col :xs="12" :sm="12"> + <div class="text">订单金额</div> + <div class="heading">¥ 568.08</div> + </a-col> + </a-row> + <!-- actions --> + <template slot="action"> + <a-button-group style="margin-right: 4px;"> + <a-button>操作</a-button> + <a-button>操作</a-button> + <a-button><a-icon type="ellipsis"/></a-button> + </a-button-group> + <a-button type="primary" >主操作</a-button> + </template> + + <a-card :bordered="false" title="流程进度"> + <a-steps :direction="isMobile() && 'vertical' || 'horizontal'" :current="1" progressDot> + <a-step title="创建项目"> + </a-step> + <a-step title="部门初审"> + </a-step> + <a-step title="财务复核"> + </a-step> + <a-step title="完成"> + </a-step> + </a-steps> + </a-card> + + <a-card style="margin-top: 24px" :bordered="false" title="用户信息"> + <detail-list> + <detail-list-item term="用户姓名">付晓晓</detail-list-item> + <detail-list-item term="会员卡号">32943898021309809423</detail-list-item> + <detail-list-item term="身份证">3321944288191034921</detail-list-item> + <detail-list-item term="联系方式">18112345678</detail-list-item> + <detail-list-item term="联系地址">浙江省杭州市西湖区黄姑山路工专路交叉路口</detail-list-item> + </detail-list> + <detail-list title="信息组"> + <detail-list-item term="某某数据">725</detail-list-item> + <detail-list-item term="该数据更新时间">2018-08-08</detail-list-item> + <detail-list-item > </detail-list-item> + <detail-list-item term="某某数据">725</detail-list-item> + <detail-list-item term="该数据更新时间">2018-08-08</detail-list-item> + <detail-list-item > </detail-list-item> + </detail-list> + <a-card type="inner" title="多层信息组"> + <detail-list title="组名称" size="small"> + <detail-list-item term="负责人">林东东</detail-list-item> + <detail-list-item term="角色码">1234567</detail-list-item> + <detail-list-item term="所属部门">XX公司-YY部</detail-list-item> + <detail-list-item term="过期时间">2018-08-08</detail-list-item> + <detail-list-item term="描述">这段描述很长很长很长很长很长很长很长很长很长很长很长很长很长很长...</detail-list-item> + </detail-list> + <a-divider style="margin: 16px 0" /> + <detail-list title="组名称" size="small" :col="1"> + <detail-list-item term="学名"> Citrullus lanatus (Thunb.) Matsum. et Nakai一年生蔓生藤本;茎、枝粗壮,具明显的棱。卷须较粗..</detail-list-item> + </detail-list> + <a-divider style="margin: 16px 0" /> + <detail-list title="组名称" size="small" :col="2"> + <detail-list-item term="负责人">付小小</detail-list-item> + <detail-list-item term="角色码">1234567</detail-list-item> + </detail-list> + </a-card> + + </a-card> + + <a-card style="margin-top: 24px" :bordered="false" title="用户近半年来电记录"> + <div class="no-data"><a-icon type="frown-o"/>暂无数据</div> + </a-card> + + <!-- 操作 --> + <a-card + style="margin-top: 24px" + :bordered="false" + :tabList="tabList" + :activeTabKey="activeTabKey" + @tabChange="(key) => {this.activeTabKey = key}" + > + <a-table + v-if="activeTabKey === '1'" + :columns="operationColumns" + :dataSource="operation1" + :pagination="false" + > + <template + slot="status" + slot-scope="status"> + <a-badge :status="status | statusTypeFilter" :text="status | statusFilter"/> + </template> + </a-table> + <a-table + v-if="activeTabKey === '2'" + :columns="operationColumns" + :dataSource="operation2" + :pagination="false" + > + <template + slot="status" + slot-scope="status"> + <a-badge :status="status | statusTypeFilter" :text="status | statusFilter"/> + </template> + </a-table> + <a-table + v-if="activeTabKey === '3'" + :columns="operationColumns" + :dataSource="operation3" + :pagination="false" + > + <template + slot="status" + slot-scope="status"> + <a-badge :status="status | statusTypeFilter" :text="status | statusFilter"/> + </template> + </a-table> + </a-card> + + </page-layout> +</template> + +<script> + import { mixinDevice } from '@/utils/mixin.js' + import PageLayout from '@/components/page/PageLayout' + import DetailList from '@/components/tools/DetailList' + + const DetailListItem = DetailList.Item + + export default { + name: "Advanced", + components: { + PageLayout, + DetailList, + DetailListItem + }, + mixins: [mixinDevice], + data () { + return { + tabList: [ + { + key: '1', + tab: '操作日志一' + }, + { + key: '2', + tab: '操作日志二' + }, + { + key: '3', + tab: '操作日志三' + } + ], + activeTabKey: '1', + + operationColumns: [ + { + title: '操作类型', + dataIndex: 'type', + key: 'type' + }, + { + title: '操作人', + dataIndex: 'name', + key: 'name' + }, + { + title: '执行结果', + dataIndex: 'status', + key: 'status', + scopedSlots: { customRender: 'status' }, + }, + { + title: '操作时间', + dataIndex: 'updatedAt', + key: 'updatedAt' + }, + { + title: '备注', + dataIndex: 'remark', + key: 'remark' + } + ], + operation1: [ + { + key: 'op1', + type: '订购关系生效', + name: '曲丽丽', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + remark: '-' + }, + { + key: 'op2', + type: '财务复审', + name: '付小小', + status: 'reject', + updatedAt: '2017-10-03 19:23:12', + remark: '不通过原因' + }, + { + key: 'op3', + type: '部门初审', + name: '周毛毛', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + remark: '-' + }, + { + key: 'op4', + type: '提交订单', + name: '林东东', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + remark: '很棒' + }, + { + key: 'op5', + type: '创建订单', + name: '汗牙牙', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + remark: '-' + } + ], + operation2: [ + { + key: 'op2', + type: '财务复审', + name: '付小小', + status: 'reject', + updatedAt: '2017-10-03 19:23:12', + remark: '不通过原因' + }, + { + key: 'op3', + type: '部门初审', + name: '周毛毛', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + remark: '-' + }, + { + key: 'op4', + type: '提交订单', + name: '林东东', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + remark: '很棒' + } + ], + operation3: [ + { + key: 'op2', + type: '财务复审', + name: '付小小', + status: 'reject', + updatedAt: '2017-10-03 19:23:12', + remark: '不通过原因' + }, + { + key: 'op3', + type: '部门初审', + name: '周毛毛', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + remark: '-' + } + ], + } + }, + filters: { + statusFilter(status) { + const statusMap = { + 'agree': '成功', + 'reject': '驳回' + } + return statusMap[status] + }, + statusTypeFilter(type) { + const statusTypeMap = { + 'agree': 'success', + 'reject': 'error' + } + return statusTypeMap[type] + } + } + } +</script> + +<style lang="scss" scoped> + + .detail-layout { + margin-left: 44px; + } + .text { + color: rgba(0, 0, 0, .45); + } + + .heading { + color: rgba(0, 0, 0, .85); + font-size: 20px; + } + + .no-data { + color: rgba(0, 0, 0, .25); + text-align: center; + line-height: 64px; + font-size: 16px; + + i { + font-size: 24px; + margin-right: 16px; + position: relative; + top: 3px; + } + } + + .mobile { + .detail-layout { + margin-left: unset; + } + .text { + + } + .status-list { + text-align: left; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/profile/basic/Index.vue b/ant-design-jeecg-vue/src/views/profile/basic/Index.vue new file mode 100644 index 0000000..c43ee3a --- /dev/null +++ b/ant-design-jeecg-vue/src/views/profile/basic/Index.vue @@ -0,0 +1,255 @@ +<template> + <page-layout :title="title"> + <a-card :bordered="false"> + <detail-list title="退款申请"> + <detail-list-item term="取货单号">1000000000</detail-list-item> + <detail-list-item term="状态">已取货</detail-list-item> + <detail-list-item term="销售单号">1234123421</detail-list-item> + <detail-list-item term="子订单">3214321432</detail-list-item> + </detail-list> + <a-divider style="margin-bottom: 32px"/> + <detail-list title="用户信息"> + <detail-list-item term="用户姓名">付小小</detail-list-item> + <detail-list-item term="联系电话">18100000000</detail-list-item> + <detail-list-item term="常用快递">菜鸟仓储</detail-list-item> + <detail-list-item term="取货地址">浙江省杭州市西湖区万塘路18号</detail-list-item> + <detail-list-item term="备注"> 无</detail-list-item> + </detail-list> + <a-divider style="margin-bottom: 32px"/> + + <div class="title">退货商品</div> + <s-table + style="margin-bottom: 24px" + :columns="goodsColumns" + :data="loadGoodsData"> + + </s-table> + + <div class="title">退货进度</div> + <s-table + style="margin-bottom: 24px" + :columns="scheduleColumns" + :data="loadScheduleData"> + + <template + slot="status" + slot-scope="status"> + <a-badge :status="status" :text="status | statusFilter"/> + </template> + + </s-table> + </a-card> + </page-layout> +</template> + +<script> + import PageLayout from '@/components/page/PageLayout' + import STable from '@/components/table/' + import DetailList from '@/components/tools/DetailList' + import ABadge from "ant-design-vue/es/badge/Badge" + const DetailListItem = DetailList.Item + + export default { + components: { + PageLayout, + ABadge, + DetailList, + DetailListItem, + STable + }, + data () { + return { + goodsColumns: [ + { + title: '商品编号', + dataIndex: 'id', + key: 'id' + }, + { + title: '商品名称', + dataIndex: 'name', + key: 'name' + }, + { + title: '商品条码', + dataIndex: 'barcode', + key: 'barcode' + }, + { + title: '单价', + dataIndex: 'price', + key: 'price', + align: 'right' + }, + { + title: '数量(件)', + dataIndex: 'num', + key: 'num', + align: 'right' + }, + { + title: '金额', + dataIndex: 'amount', + key: 'amount', + align: 'right' + } + ], + // 加载数据方法 必须为 Promise 对象 + loadGoodsData: () => { + return new Promise((resolve => { + resolve({ + data: [ + { + id: '1234561', + name: '矿泉水 550ml', + barcode: '12421432143214321', + price: '2.00', + num: '1', + amount: '2.00' + }, + { + id: '1234562', + name: '凉茶 300ml', + barcode: '12421432143214322', + price: '3.00', + num: '2', + amount: '6.00' + }, + { + id: '1234563', + name: '好吃的薯片', + barcode: '12421432143214323', + price: '7.00', + num: '4', + amount: '28.00' + }, + { + id: '1234564', + name: '特别好吃的蛋卷', + barcode: '12421432143214324', + price: '8.50', + num: '3', + amount: '25.50' + } + ], + pageSize: 10, + pageNo: 1, + totalPage: 1, + totalCount: 10 + }) + })).then(res => { + return res + }) + }, + + scheduleColumns: [ + { + title: '时间', + dataIndex: 'time', + key: 'time' + }, + { + title: '当前进度', + dataIndex: 'rate', + key: 'rate' + }, + { + title: '状态', + dataIndex: 'status', + key: 'status', + scopedSlots: { customRender: 'status' }, + }, + { + title: '操作员ID', + dataIndex: 'operator', + key: 'operator' + }, + { + title: '耗时', + dataIndex: 'cost', + key: 'cost' + } + ], + loadScheduleData: () => { + return new Promise((resolve => { + resolve({ + data: [ + { + key: '1', + time: '2017-10-01 14:10', + rate: '联系客户', + status: 'processing', + operator: '取货员 ID1234', + cost: '5mins' + }, + { + key: '2', + time: '2017-10-01 14:05', + rate: '取货员出发', + status: 'success', + operator: '取货员 ID1234', + cost: '1h' + }, + { + key: '3', + time: '2017-10-01 13:05', + rate: '取货员接单', + status: 'success', + operator: '取货员 ID1234', + cost: '5mins' + }, + { + key: '4', + time: '2017-10-01 13:00', + rate: '申请审批通过', + status: 'success', + operator: '系统', + cost: '1h' + }, + { + key: '5', + time: '2017-10-01 12:00', + rate: '发起退货申请', + status: 'success', + operator: '用户', + cost: '5mins' + } + ], + pageSize: 10, + pageNo: 1, + totalPage: 1, + totalCount: 10 + }) + })).then(res => { + return res + }) + }, + } + }, + filters: { + statusFilter(status) { + const statusMap = { + 'processing': '进行中', + 'success': '完成', + 'failed': '失败' + } + return statusMap[status] + } + }, + computed: { + title () { + return this.$route.meta.title + } + }, + + } +</script> + +<style lang="scss" scoped> + .title { + color: rgba(0,0,0,.85); + font-size: 16px; + font-weight: 500; + margin-bottom: 16px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/result/Error.vue b/ant-design-jeecg-vue/src/views/result/Error.vue new file mode 100644 index 0000000..634c4b6 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/result/Error.vue @@ -0,0 +1,45 @@ +<template> + <a-card :bordered="false"> + <result :is-success="false" :title="title" :description="description"> + <template slot="action"> + <a-button type="primary" >返回修改</a-button> + </template> + <div> + <div style="font-size: 16px; color: rgba(0, 0, 0, 0.85); font-weight: 500; margin-bottom: 16px"> + 您提交的内容有如下错误: + </div> + <div style="margin-bottom: 16px"> + <a-icon type="close-circle-o" style="color: #f5222d; margin-right: 8px"/> + 您的账户已被冻结 + <a style="margin-left: 16px">立即解冻 <a-icon type="right" /></a> + </div> + <div> + <a-icon type="close-circle-o" style="color: #f5222d; margin-right: 8px"/> + 您的账户还不具备申请资格 + <a style="margin-left: 16px">立即升级 <a-icon type="right" /></a> + </div> + </div> + </result> + </a-card> +</template> + +<script> + import Result from './Result' + + export default { + name: "Error", + components: { + Result + }, + data () { + return { + title: '提交失败', + description: '请核对并修改以下信息后,再重新提交。' + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/result/Result.vue b/ant-design-jeecg-vue/src/views/result/Result.vue new file mode 100644 index 0000000..85f81fb --- /dev/null +++ b/ant-design-jeecg-vue/src/views/result/Result.vue @@ -0,0 +1,91 @@ +<template> + <div class="result"> + <div> + <a-icon :class="[isSuccess ? 'success' : 'error' ,'icon']" :type="isSuccess ? 'check-circle' : 'close-circle'"/> + </div> + <div class="title" v-if="title">{{ title }}</div> + <div class="description" v-if="description">{{ description }}</div> + <div class="content" v-if="content"> + <slot></slot> + </div> + <div class="action"> + <slot name="action"></slot> + </div> + </div> +</template> + +<script> + export default { + name: "Result", + // 'isSuccess', 'title', 'description' + props: { + isSuccess: { + type: Boolean, + default: false + }, + title: { + type: String, + default: '' + }, + description: { + type: String, + default: '' + }, + content: { + type: Boolean, + default: true + } + } + } +</script> + +<style lang="scss" scoped> + .result { + text-align: center; + width: 72%; + margin: 0 auto; + padding: 24px 0 8px; + + .icon { + font-size: 72px; + line-height: 72px; + margin-bottom: 24px; + } + .success { + color: #52c41a; + } + .error { + color: red; + } + .title { + font-size: 24px; + color: rgba(0, 0, 0, .85); + font-weight: 500; + line-height: 32px; + margin-bottom: 16px; + } + .description { + font-size: 14px; + line-height: 22px; + color: rgba(0, 0, 0, 0.45); + margin-bottom: 24px; + } + .content { + background: #fafafa; + padding: 24px 40px; + border-radius: 2px; + text-align: left; + } + .action { + margin-top: 32px; + } + } + + .mobile { + .result { + width: 100%; + margin: 0 auto; + padding: unset; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/result/Success.vue b/ant-design-jeecg-vue/src/views/result/Success.vue new file mode 100644 index 0000000..b5061e3 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/result/Success.vue @@ -0,0 +1,92 @@ +<template> + <a-card :bordered="false"> + <result :is-success="true" :description="description" :title="title"> + <template slot="action"> + <a-button type="primary">返回列表</a-button> + <a-button style="margin-left: 8px">查看项目</a-button> + <a-button style="margin-left: 8px">打印</a-button> + </template> + <div> + <div style="font-size: 16px; color: rgba(0, 0, 0, 0.85); font-weight: 500; margin-bottom: 20px;">项目名称</div> + <a-row style="margin-bottom: 16px"> + <a-col :xs="24" :sm="12" :md="12" :lg="12" :xl="6"> + <span style="color: rgba(0, 0, 0, 0.85)">项目 ID:</span> + 20180724089 + </a-col> + <a-col :xs="24" :sm="12" :md="12" :lg="12" :xl="6"> + <span style="color: rgba(0, 0, 0, 0.85)">负责人:</span> + 曲丽丽是谁? + </a-col> + <a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12"> + <span style="color: rgba(0, 0, 0, 0.85)">生效时间:</span> + 2016-12-12 ~ 2017-12-12 + </a-col> + </a-row> + <a-steps :current="1" :direction="isMobile() && directionType.vertical || directionType.horizontal" progressDot> + <a-step > + <span style="font-size: 14px" slot="title">创建项目</span> + <template slot="description"> + <div style="fontSize: 12px; color: rgba(0, 0, 0, 0.45); position: relative; left: 42px;" slot="description" > + <div style="margin: 8px 0 4px"> + 曲丽丽 + <a-icon style="margin-left: 8px" type="dingding-o" /> + </div> + <div>2016-12-12 12:32</div> + </div> + </template> + </a-step> + <a-step title="部门初审"> + <span style="font-size: 14px" slot="title">部门初审</span> + <template slot="description"> + <div style="fontSize: 12px; color: rgba(0, 0, 0, 0.45); position: relative; left: 42px;" slot="description" > + <div style="margin: 8px 0 4px"> + 周毛毛 + <a-icon style="margin-left: 8px; color: #00A0E9" type="dingding-o" /> + </div> + <div><a href="">催一下</a></div> + </div> + </template> + </a-step> + <a-step title="财务复核"> + <span style="font-size: 14px" slot="title">财务复核</span> + </a-step> + <a-step title="完成" > + <span style="font-size: 14px" slot="title">完成</span> + </a-step> + </a-steps> + </div> + </result> + </a-card> +</template> + +<script> + import Result from './Result' + import { mixinDevice } from '@/utils/mixin.js' + + const directionType = { + horizontal: 'horizontal', + vertical: 'vertical' + } + + export default { + name: "Success", + components: { + Result + }, + mixins: [mixinDevice], + data () { + return { + title: '提交成功', + description: '提交结果页用于反馈一系列操作任务的处理结果,\n' + + ' 如果仅是简单操作,使用 Message 全局提示反馈即可。\n' + + ' 本文字区域可以展示简单的补充说明,如果有类似展示\n' + + ' “单据”的需求,下面这个灰色区域可以呈现比较复杂的内容。', + directionType + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/DepartList.vue b/ant-design-jeecg-vue/src/views/system/DepartList.vue new file mode 100644 index 0000000..7b7c555 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/DepartList.vue @@ -0,0 +1,417 @@ +<template> + <a-layout style="height:100%" :class="{ 'anty-node-layout':true }"> + <a-layout-header class="header"> + <div class="anty-opt-btn"> + <!-- 按钮操作区域 --> + <a-button @click="handleAdd(2)" style="margin-left: 18px" type="primary" icon="plus">添加子部门</a-button> + <a-button @click="handleAdd(1)" type="default" icon="plus">添加一级部门</a-button> + <a-button title="删除多条数据" @click="batchDel" type="default" icon="delete">批量删除</a-button> + <a-button @click="refresh" type="default" icon="reload">刷新</a-button> + </div> + </a-layout-header> + + <a-layout-content> + <a-layout style="background: #fff"> + <a-layout-sider width="400" style="background: #fff;padding-left:16px;height: 100%;"> + <a-alert type="info" :showIcon="true" > + <div slot="message"> + 当前选择: + <a v-if="this.currSelected.title">{{ getCurrSelectedTitle() }}</a> + <a v-if="this.currSelected.title" style="margin-left: 10px" @click="onClearSelected">取消选择</a> + </div> + </a-alert> + <a-input-search @search="onSearch" style="width:100%;margin-top: 10px" placeholder="请输入部门名称进行搜索" /> + <!-- 树--> + <a-tree + checkable + multiple + @select="onSelect" + @check="onCheck" + :selectedKeys="selectedKeys" + :checkedKeys="checkedKeys" + :treeData="departTree" + :checkStrictly="true" + :expandedKeys="iExpandedKeys" + :autoExpandParent="autoExpandParent" + @expand="onExpand"/> + </a-layout-sider> + + <a-layout-content :style="{ padding: '16px 24px 30px 24px', height: '100%' }"> + <a-form :form="form"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="机构名称"> + <a-input placeholder="请输入机构/部门名称" v-decorator="['departName', validatorRules.departName ]"/> + </a-form-item> + <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="上级部门"> + <a-tree-select + style="width:100%" + :dropdownStyle="{maxHeight:'200px',overflow:'auto'}" + :treeData="treeData" + :disabled="disable" + v-model="model.parentId" + placeholder="无"> + </a-tree-select> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="排序"> + <a-input-number v-decorator="[ 'departOrder',{'initialValue':0}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="传真"> + <a-input placeholder="请输入传真" v-decorator="['fax', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="地址"> + <a-input placeholder="请输入地址" v-decorator="['address', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="备注"> + <a-textarea placeholder="请输入备注" v-decorator="['memo', {}]" /> + </a-form-item> + </a-form> + + <div class="anty-form-btn"> + <a-button @click="emptyCurrForm" type="default" htmlType="button" icon="sync">重置</a-button> + <a-button @click="submitCurrForm" type="primary" htmlType="button" icon="form">修改并保存</a-button> + </div> + </a-layout-content> + </a-layout> + </a-layout-content> + + <Depart-modal ref="DepartModal" @ok="loadTree"></Depart-modal> + </a-layout> +</template> +<script> + import DepartModal from './modules/DepartModal' + import pick from 'lodash.pick' + import {queryDepartTreeList, searchByKeywords} from '@/api/api' + import { httpAction,deleteAction } from '@/api/manage' + // 表头 + const columns = [ + { + title: '机构名称', + dataIndex: 'departName', + }, + { + title: '机构类型', + align:"center", + dataIndex: 'orgType' + }, + { + title: '机构编码', + dataIndex: 'orgCode' + }, + { + title: '手机号', + dataIndex: 'mobile' + }, + { + title: '传真', + dataIndex: 'fax' + }, + { + title: '地址', + dataIndex: 'address' + }, + { + title:'排序', + align:'center', + dataIndex:'departOrder' + }, + { + title: '操作', + align:"center", + dataIndex: 'action', + scopedSlots: { customRender: 'action' }, + } + ]; + export default { + name: "DepartList", + components: { + DepartModal + }, + data(){ + return { + iExpandedKeys:[], + autoExpandParent:true, + currFlowId:"", + currFlowName:"", + disable:true, + treeData: [], + departTree:[], + hiding:true, + model:{}, + depart:{}, + columns:columns, + disableSubmit:false, + checkedKeys:[], + selectedKeys:[], + currSelected:{}, + form: this.$form.createForm(this), + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + graphDatasource:{ + nodes:[], + edges:[] + }, + validatorRules:{ + departName:{rules: [{ required: true, message: '请输入机构/部门名称!' }]}, + orgCode:{rules: [{ required: true, message: '请输入机构编码!' }]}, + mobile:{rules: [{validator:this.validateMobile}]} + }, + url: { + delete: "/sysdepart/sysDepart/delete", + edit: "/sysdepart/sysDepart/edit", + deleteBatch: "/sysdepart/sysDepart/deleteBatch", + }, + } + }, + methods:{ + loadTree(){ + var that = this; + that.treeData = []; + that.departTree = []; + queryDepartTreeList().then((res)=>{ + if(res.success){ + for (let i = 0; i < res.result.length; i++) { + let temp = res.result[i]; + that.treeData.push(temp); + that.departTree.push(temp); + that.setThisExpandedKeys(temp); + console.log(temp.id) + } + } + }); + }, + setThisExpandedKeys(node){ + if(node.children && node.children.length>0){ + this.iExpandedKeys.push(node.key); + for(let a=0;a<node.children.length;a++){ + this.setThisExpandedKeys(node.children[a]); + } + } + }, + refresh(){ + this.loadTree(); + }, + onExpand (expandedKeys) { + console.log('onExpand', expandedKeys) + // if not set autoExpandParent to false, if children expanded, parent can not collapse. + // or, you can remove all expanded children keys. + this.iExpandedKeys = expandedKeys + this.autoExpandParent = false + }, + backFlowList(){ + this.$router.back(-1); + }, + addRootNode(){ + this.$refs.nodeModal.add(this.currFlowId,''); + }, + batchDel: function(){ + console.log(this.checkedKeys) + if(this.checkedKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + }else{ + var ids = ""; + for(var a =0;a<this.checkedKeys.length;a++){ + ids+=this.checkedKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"确定要删除所选中的 "+this.checkedKeys.length+" 条数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadTree(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + onSearch(value){ + let that = this; + if(value){ + searchByKeywords({keyWord:value}).then((res) =>{ + if(res.success){ + that.departTree = []; + for (let i = 0; i < res.result.length; i++) { + let temp = res.result[i]; + that.departTree.push(temp); + } + }else{ + that.$message.warning(res.message); + } + }) + }else{ + that.loadTree(); + } + + }, + nodeModalOk(){ + this.loadTree(); + }, + nodeModalClose(){ + }, + onCheck (checkedKeys,info) { + console.log('onCheck', checkedKeys, info) + this.hiding = false; + this.checkedKeys = checkedKeys.checked; + }, + onSelect (selectedKeys,e) { + console.log('selected', selectedKeys, e) + this.hiding = false; + let record = e.node.dataRef; + console.log("onSelect-record",record); + this.currSelected = Object.assign({},record); + this.model = this.currSelected; + this.selectedKeys = [record.key]; + this.model.parentId = record.parentId; + this.$nextTick(() => { + this.form.setFieldsValue(pick(record,'departName','departOrder','mobile','fax','address','memo')) + }); + + }, + getCurrSelectedTitle(){ + return !this.currSelected.title?"":this.currSelected.title; + }, + onClearSelected(){ + this.hiding = true; + this.model = {}; + this.checkedKeys={}; + this.currSelected={}; + this.selectedKeys = []; + }, + handleNodeTypeChange(val){ + this.currSelected.nodeType = val; + }, + notifyTriggerTypeChange(value){ + this.currSelected.notifyTriggerType = value; + }, + receiptTriggerTypeChange(value){ + this.currSelected.receiptTriggerType = value; + }, + submitCurrForm(){ + this.form.validateFields((err, values) =>{ + if (!err) { + if(!this.currSelected.id){ + this.$message.warning("请点击选择要修改部门!"); + return + } + + let formData = Object.assign(this.currSelected, values); + console.log('Received values of form: ', formData) + httpAction(this.url.edit, formData, "put").then((res) => { + if (res.success) { + this.$message.success("保存成功!"); + this.loadTree(); + this.selectedKeys = []; + } + }) + } + }); + }, + emptyCurrForm(){ + this.form.setFieldsValue({ + parentId:"", + departName:"", + departNameEn:"", + departNameAbbr:"", + departOrder:"", + orgCode:"", + mobile:"", + fax:"", + address:"", + memo:"", + description:"", + }); + }, + nodeSettingFormSubmit(){ + this.form.validateFields((err, values) =>{ + if (!err) { + console.log('Received values of form: ', values) + } + }); + }, + openSelect(){ + this.$refs.sysDirectiveModal.show(); + }, + handleAdd(num){ + if(num == 1){ + this.$refs.DepartModal.add(); + this.$refs.DepartModal.title="新增"; + }else{ + let key = this.currSelected.key; + if(!key){ + this.$message.warning("请先选中一条记录!"); + return false; + } + this.$refs.DepartModal.add(this.selectedKeys); + this.$refs.DepartModal.title="新增"; + } + }, + selectDirectiveOk(record){ + console.log("选中指令数据",record); + this.nodeSettingForm.setFieldsValue({directiveCode:record.directiveCode}); + this.currSelected.sysCode = record.sysCode; + }, + getFlowGraphData(node){ + this.graphDatasource.nodes.push({ + id:node.id, + text:node.flowNodeName + }) + if(node.children.length>0){ + for(let a=0;a<node.children.length;a++){ + let temp = node.children[a] + this.graphDatasource.edges.push({ + source:node.id, + target:temp.id + }); + this.getFlowGraphData(temp); + } + } + } + }, + created(){ + this.currFlowId = this.$route.params.id; + this.currFlowName = this.$route.params.name; + this.loadTree(); + }, + + } +</script> +<style scoped> + .anty-form-btn{width: 100%;text-align: center;} + .anty-form-btn button{margin:0 5px;} + .anty-node-layout .ant-layout-content{margin:0 !important;} + .anty-node-layout .ant-layout-header{padding-right:0} + .header{padding:0 8px;} + .header button{margin:0 3px} + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} + #app .desktop { + height: auto !important; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/DepartList2.vue b/ant-design-jeecg-vue/src/views/system/DepartList2.vue new file mode 100644 index 0000000..2b0bca3 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/DepartList2.vue @@ -0,0 +1,270 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <!-- +--> + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + <a-table + ref="table" + size="middle" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> + <a-menu slot="overlay"> + <a-menu-item> + <a href="javascript:;" @click="handleDetail(record)">详情</a> + </a-menu-item> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <sysDepart-modal ref="sysDepartModal" @ok="modalFormOk"></sysDepart-modal> + </a-card> +</template> + +<script> + import SysDepartModal from './modules/DepartModal' +/* import { filterObj } from '@/utils/util' + , queryByFactories*/ + import { queryDepartTreeList} from '@/api/api' + import { deleteAction } from '@/api/manage' + + // 表头 + const columns = [ + { + title: '机构名称', + dataIndex: 'departName', + }, + { + title: '机构类型', + align:"center", + dataIndex: 'orgType' + }, + { + title: '机构编码', + dataIndex: 'orgCode' + }, + { + title: '手机号', + dataIndex: 'mobile' + }, + { + title: '传真', + dataIndex: 'fax' + }, + { + title: '地址', + dataIndex: 'address' + }, + { + title:'排序', + align:'center', + dataIndex:'departOrder' + }, + { + title: '操作', + align:"center", + dataIndex: 'action', + scopedSlots: { customRender: 'action' }, + } + ]; + + export default { + name: "DepartList2", + components: { + SysDepartModal + }, + data () { + return { + description: 'jeecg 生成SysDepart代码管理页面', + // 查询条件 + queryParam: {}, + //数据集 + factories:'', + dataSource:[], + columns:columns, + // 分页参数 +/* ipagination:{ + current: 1, + pageSize: 5, + pageSizeOptions: ['5', '10', '20'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + },*/ + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/sysdepart/sysDepart/list", + delete: "/sysdepart/sysDepart/delete", + deleteBatch: "/sysdepart/sysDepart/deleteBatch", + }, + + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (){ + this.dataSource = []; + queryDepartTreeList().then((res)=>{ + if(res.success){ + this.dataSource = res.result; + } + }) + + }, + + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, +//TODO getQueryParams + handleDelete:function(id){ + var that = this; + deleteAction(that.url.delete,{id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleDetail(record){ + this.$refs.sysDepartModal.edit(record); + this.$refs.sysDepartModal.title="详情"; + this.$refs.sysDepartModal.disableSubmit = true; + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleEdit:function(record){ + this.$refs.sysDepartModal.edit(record); + this.$refs.sysDepartModal.title="编辑"; + }, + handleAdd(){ + this.$refs.sysDepartModal.add(); + this.$refs.sysDepartModal.title="新增"; + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + /*this.ipagination = pagination;*/ + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + } + } + } +</script> +<style scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/DictList.vue b/ant-design-jeecg-vue/src/views/system/DictList.vue new file mode 100644 index 0000000..30c9346 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/DictList.vue @@ -0,0 +1,460 @@ +<template> + <a-card :bordered="false"> + + <!-- 右侧面板 --> + <a-col :span="5"> + <div class="table-operator" style="margin-bottom: 18px;"> + <a-row :gutter="24"> + <a-col :span="9"> + <a-button @click="addDict" type="primary" icon="plus">添加字典</a-button> + </a-col> + + <a-col :span="9"> + <a-dropdown> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="editDict">编辑字典</a-menu-item> + <a-menu-item key="2" @click="delDict">删除字典</a-menu-item> + <a-menu-item key="3" @click="refreshDict">刷新</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px">更多操作 <a-icon type="down" /></a-button> + </a-dropdown> + </a-col> + </a-row> + </div> + + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;padding: 5px"> + <a-icon type="select"/> + 当前选中: + <span v-if="visible"> + <span style="color: #40a9ff;font-size: 12px;font-weight: 600;">{{ dict.dictName }}【{{ dict.dictCode }}】</span> + <a><span @click="cancelDict" style="color:#2d8cf0"> 取消选择</span></a> + </span> + + </div> + + <div> + <a-input-search + placeholder="输入搜索字典" + @search="onSearch" + style="margin-bottom: 16px;" + /> + <a-tree + :treeData="treeData" + @select="this.onSelect"> + </a-tree> + </div> + </a-col> + + <!-- 中间面板 --> + <a-col :span="1"/> + + <!-- 右侧面板 --> + <a-col :span="18"> + <div class="table-operator"> + <a-form layout="inline"> + <a-row :gutter="24"> + <a-col :span="8"> + <a-form-item label="名称"> + <a-input placeholder="请输入名称" v-model="queryParam.itemText"></a-input> + </a-form-item> + </a-col> + + <a-col :span="8"> + <a-form-item label="状态"> + <a-select + style="width: 200px" + v-model="queryParam.status" + placeholder="请选择状态" + > + <a-select-option value="1">正常</a-select-option> + <a-select-option value="0">禁用</a-select-option> + </a-select> + </a-form-item> + </a-col> + + <a-col :span="8"> + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" icon="search" @click="searchByquery">查询</a-button> + <a-button type="primary" icon="reload" @click="searchReset" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + </a-row> + </a-form> + </div> + + <div style="margin-bottom: 16px;"> + <a-button type="primary" icon="plus" @click="addDictItem">新增</a-button> + <a-button type="primary" :loading="loadrefresh" icon="reload" @click="refreshDictItem" style="margin-left: 8px">刷新</a-button> + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay" @click="handleMenuClick"> + <a-menu-item key="1"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px">批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> + 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + bordered + rowKey="id" + size="middle" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange" + > + + <span slot="action" slot-scope="text, record"> + <a @click="editDictItem(record)">编辑</a> + <a-divider type="vertical" /> + <a-popconfirm title="确定删除吗?" @confirm="() => delDictItem(record.id)"> + <a>删除</a> + </a-popconfirm> + </span> + + </a-table> + </div> + <!-- table区域-end --> + </a-col> + + <dict-modal ref="modal" @ok="modalFormOk"></dict-modal> <!-- 字典类型 --> + <dict-item-modal ref="itemModal" @ok="modalFormOk"></dict-item-modal> <!-- 字典数据 --> + </a-card> +</template> + +<script> + import { filterObj } from '@/utils/util'; + import DictModal from './modules/DictModal' + import DictItemModal from './modules/DictItemModal' + import {delDict,getDictItemList,delDictItem,delDictItemList,treeList} from '@/api/api' + + export default { + name: "DictList", + components: {DictModal,DictItemModal}, + data () { + return { + description: '这是数据字典页面', + visible:false, + // 查询条件 + queryParam: { + dictId:"", + dictName:null, + delFlag:"1", + status:[], + }, + // 表头 + columns: [ + { + title: '排序', + align: "center", + dataIndex: 'sortOrder', + width: "100px", + sorter: true + }, + { + title: '名称', + align: "center", + dataIndex: 'itemText', + }, + { + title: '数据值', + align: "center", + dataIndex: 'itemValue', + }, + { + title: '描述', + align: "center", + dataIndex: 'description', + }, + { + title: '状态', + align: "center", + dataIndex: 'status', + customRender:function (text) { + if(text==1){ + return "正常"; + }else if(text==0){ + return "禁用"; + }else{ + return text; + } + }, + }, + { + title: '创建时间', + dataIndex: 'createTime', + align: "center", + sorter: true + }, + { + title: '操作', + dataIndex: 'action', + align: "center", + width: "120px", + scopedSlots: {customRender: 'action'}, + } + ], + //字典数据集 + dataSource: [], + //字典集 + treeData:[], + dict:"", + // 分页参数 + ipagination: { + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter: { + column: 'createTime', + order: 'asc', + }, + loading: false, + loadrefresh: false, + selectedRowKeys: [], + selectedRows: [], + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + if(arg===1){ + this.ipagination.current = 1; + } + this.loading=true; + // 查询字典 + treeList({dictName:this.queryParam.dictName,delFlag:this.queryParam.delFlag}).then((res)=>{ + if(res.success){ + this.treeData=[]; + for(let a=0;a<res.result.length;a++){ + let temp = res.result[a]; + this.treeData.push(temp); + } + } + }) + // 查询字典数据 + var params = this.getQueryParams();//查询条件 + getDictItemList(params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + this.loadrefresh=false; + this.loading=false; + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.dictId = this.dictId; + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + + //添加字典 + addDict(){ + this.$refs.modal.add(); + this.$refs.modal.title="新增"; + }, + //编辑字典 + editDict(){ + if(!this.dict.id){ + this.$message.warning("您还未选择要编辑的字典"); + }else{ + this.$refs.modal.edit(this.dict); + this.$refs.modal.title="编辑"; + } + }, + //删除字典 + delDict(){ + let that=this; + if(!this.dict.id){ + this.$message.warning("您还未选择要删除的字典"); + }else{ + that.$confirm({ + title:"确认删除", + content:"您确定要删除 "+this.dict.dictName+" 字典类型?", + onOk: function(){ + delDict({id:that.dict.id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.cancelDict(); + }else{ + that.$message.warning(res.message); + } + }); + }, + onCancel() {}, + }); + } + }, + //刷新字典 + refreshDict(){ + this.loadData(); + }, + //选择字典 + onSelect (selectedKeys, info) { + this.dict = info.selectedNodes[0].data.props; + this.dict.dictName = info.selectedNodes[0].data.props.title; + this.dictId = this.dict.id; + this.visible = true; + this.loadData(); + }, + //取消选择 + cancelDict(){ + this.dict=""; + this.dictId = ""; + this.visible = false; + this.loadData(); + }, + //查询字典 + onSearch (value) { + if(value){ + this.queryParam.dictName = value; + }else{ + this.queryParam.dictId = null; + this.queryParam.dictName = null; + } + this.loadData(); + }, + + + // 添加字典数据 + addDictItem(){ + if(!this.dict.id){ + this.$message.warning("请选择一个字典类别"); + }else{ + this.$refs.itemModal.add(this.dict.id); + this.$refs.itemModal.title="新增 "+this.dict.dictName+"("+this.dict.dictCode+") 的数据"; + } + }, + //编辑字典数据 + editDictItem(record){ + if(!this.dict.id){ + this.$refs.itemModal.title="编辑字典的数据"; + }else{ + this.$refs.itemModal.title="编辑 "+this.dict.dictName+"("+this.dict.dictCode+") 的数据"; + } + this.$refs.itemModal.edit(record); + }, + handleMenuClick(e){ + if(e.key==1){ + this.batchdel(); + } + }, + // 批量删除字典数据 + batchdel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning("您还未选择要删除的数据"); + }else{ + let ids=""; + let that = this; + that.selectedRowKeys.forEach(function(val){ + ids+=val+","; + }); + that.$confirm({ + title:"确认删除", + content:"您确定要删除所选的"+that.selectedRowKeys.length+"条数据?", + onOk: function(){ + delDictItemList({ids:ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + }, + onCancel() {}, + }); + } + }, + //删除字典 + delDictItem(id){ + delDictItem({id:id}).then((res)=>{ + if(res.success){ + this.$message.success(res.message); + this.loadData(); + }else{ + this.$message.warning(res.message); + } + }); + }, + // 查询字典数据 + searchByquery(){ + this.loadData(); + }, + // 重置字典数据 + searchReset(){ + var that = this; + that.queryParam.status=[]; + that.queryParam.itemText=""; + that.loadData(this.ipagination.current); + }, + // 刷新 + refreshDictItem(){ + this.loadrefresh=true; + this.loadData(); + }, + + handleTableChange(pagination, filters, sorter){ + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + modalFormOk () { + this.loadData(); + }, + }, + watch: { + openKeys (val) { + console.log('openKeys', val) + }, + }, + } +</script> + +<style scoped> + .table-operator{margin-bottom: 10px} + .ant-tree li span.ant-tree-switcher, .ant-tree li span.ant-tree-iconEle{width:0px} +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/LogList.vue b/ant-design-jeecg-vue/src/views/system/LogList.vue new file mode 100644 index 0000000..e803668 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/LogList.vue @@ -0,0 +1,260 @@ +<template> + <a-card :bordered="false"> + <!--导航区域--> + <div> + <a-tabs defaultActiveKey="1" @change="callback"> + <a-tab-pane tab="登陆日志" key="1"></a-tab-pane> + <a-tab-pane tab="操作日志" key="2"></a-tab-pane> + </a-tabs> + </div> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :span="6"> + <a-form-item label="搜索日志"> + <a-input placeholder="请输入搜索关键词" v-model="queryParam.keyWord"></a-input> + </a-form-item> + </a-col> + + <a-col :span="10"> + <a-form-item label="创建时间"> + <a-range-picker + :showTime="{ format: 'HH:mm' }" + v-model="queryParam.createTimeRange" + format="YYYY-MM-DD HH:mm" + :placeholder="['开始时间', '结束时间']" + @change="onDateChange" + @ok="onDateOk" + /> + </a-form-item> + </a-col> + + <a-col :span="8" > + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchByquery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + + </a-row> + </a-form> + </div> + + <!-- table区域-begin --> + <a-table + ref="table" + size="middle" + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + @change="handleTableChange"> + + <p v-show="queryParam.logType==2" slot="expandedRowRender" slot-scope="record" style="margin: 0"> + 请求方法: {{ record.method }} + <a-divider dashed/> + 请求参数: {{ record.requestParam }} + </p> + + </a-table> + </div> + <!-- table区域-end --> + </a-card> +</template> + +<script> + import { filterObj } from '@/utils/util'; + import {getLogList,deleteLog,deleteLogList} from '@/api/api' + + export default { + name: "LogList", + data () { + return { + description: '这是日志管理页面', + // 查询条件 + queryParam: { + ipInfo:'', + createTimeRange:[], + logType:'1', + keyWord:'', + }, + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + fixed:'center', + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + { + title: '日志内容', + align:"left", + dataIndex: 'logContent', + fixed:'center', + sorter: true + }, + { + title: '操作人ID', + dataIndex: 'userid', + align:"center", + sorter: true + }, + { + title: '操作人名称', + dataIndex: 'username', + align:"center", + sorter: true + }, + { + title: 'IP', + dataIndex: 'ip', + align:"center", + sorter: true + }, + { + title: '耗时(毫秒)', + dataIndex: 'costTime', + align:"center", + sorter: true + }, + { + title: '日志类型', + dataIndex: 'logType', + customRender:function (text) { + if(text==1){ + return "登录日志"; + }else if(text==2){ + return "操作日志"; + }else{ + return text; + } + }, + align:"center", + }, + { + title: '创建时间', + dataIndex: 'createTime', + align:"center", + sorter: true + } + ], + //数据集 + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + this.loading=true; + getLogList(params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + this.loading=false; + this.loadrefresh = false; + } + }) + }, + getQueryParams(){ + console.log(this.queryParam.createTimeRange) + var param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + delete param.createTimeRange; // 时间参数不传递后台 + return filterObj(param); + }, + getQueryField(){ + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + // 查询 + searchByquery(){ + this.loadData(1); + }, + // 重置 + searchReset(){ + var that = this; + var logType = that.queryParam.logType; + that.queryParam = {}; //清空查询区域参数 + that.queryParam.logType = logType; + that.loadData(this.ipagination.current); + }, + // 日志类型 + callback(key){ + let that=this; + that.queryParam.logType=key; + that.loadData(); + }, + onDateChange: function (value, dateString) { + console.log(dateString[0],dateString[1]); + this.queryParam.createTime_begin=dateString[0]; + this.queryParam.createTime_end=dateString[1]; + }, + onDateOk(value) { + console.log(value); + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + } + } +</script> +<style scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + .ant-divider-horizontal{margin: 10px 0;} +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/PermissionList.vue b/ant-design-jeecg-vue/src/views/system/PermissionList.vue new file mode 100644 index 0000000..c93fd70 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/PermissionList.vue @@ -0,0 +1,256 @@ +<template> + <a-card :bordered="false"> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + <a-button + @click="batchdel" + style="margin-left:8px" + v-if="selectedRowKeys.length > 0" + ghost + type="primary" + icon="delete">批量删除</a-button> + </div> + + <!-- table区域-begin --> + <div> + + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> + 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + :columns="columns" + size="middle" + :dataSource="dataSource" + :rowSelection="rowSelection" + > + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link"> + 更多 <a-icon type="down" /> + </a> + <a-menu slot="overlay"> + <a-menu-item> + <a href="javascript:;" @click="handleDetail(record)">详情</a> + </a-menu-item> + + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + + <!--<a-menu-item v-if="record.status==1"> + <a-popconfirm title="确定冻结吗?" @confirm="() => handleFrozen(record.id,2)"> + <a>冻结</a> + </a-popconfirm> + </a-menu-item> + + <a-menu-item v-if="record.status==2"> + <a-popconfirm title="确定解冻吗?" @confirm="() => handleFrozen(record.id,1)"> + <a>解冻</a> + </a-popconfirm> + </a-menu-item>--> + + </a-menu> + </a-dropdown> + </span> + + </a-table> + + </div> + <!-- table区域-end --> + + <permission-modal ref="permissionmodal" @ok="modalFormOk"></permission-modal> + + </a-card> +</template> + +<script> + import PermissionModal from './modules/PermissionModal' + import {getPermissionList,deletePermission,deletePermissionList} from '@/api/api' + + const columns = [ + { + title: '菜单名称', + dataIndex: 'name', + key: 'name' + },{ + title: '菜单类型', + dataIndex: 'menuType', + key: 'menuType', + customRender:function (text) { + if(text==0){ + return "菜单"; + }else if(text==1){ + return "菜单"; + }else if(text==2){ + return "按钮"; + }else{ + return text; + } + } + },/*{ + title: '权限编码', + dataIndex: 'perms', + key: 'permissionCode', + },*/{ + title: 'icon', + dataIndex: 'icon', + key: 'icon', + }, + { + title: '组件', + dataIndex: 'component', + key: 'component', + }, + { + title: '路径', + dataIndex: 'url', + key: 'url', + }, + { + title: '排序', + dataIndex: 'sortNo', + key: 'sortNo', + }, + { + title: '操作', + dataIndex: 'action', + scopedSlots: { customRender: 'action' }, + fixed:"right", + align:"center", + width:150 + } + ]; + + export default { + name: "PermissionList", + components: { + PermissionModal + }, + data () { + return { + description: '这是菜单管理页面', + //数据集 + dataSource:[], + // 表头 + columns:columns, + rowSelection:{ + onChange: (selectedRowKeys) => { + //console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows); + this.selectedRowKeys = selectedRowKeys; + }, + + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (){ + this.dataSource = []; + getPermissionList().then((res)=>{ + if(res.success){ + console.log( res.result); + this.dataSource = res.result; + + /*for(let a = 0;a<res.result.length;a++){ + let temp = res.result[a]; + + this.dataSource.push(temp); + }*/ + } + }) + }, + onClearSelected(){ + this.selectedRowKeys = []; + }, + handleAdd(){ + this.$refs.permissionmodal.add(); + this.$refs.permissionmodal.title="新增"; + }, + handleEdit: function(record){ + this.$refs.permissionmodal.edit(record); + this.$refs.permissionmodal.title="编辑"; + }, + handleDetail(record){ + this.$refs.permissionmodal.edit(record); + this.$refs.permissionmodal.title="详情"; + this.$refs.permissionmodal.disableSubmit = true; + }, + handleDelete(id){ + var that = this; + deletePermission({id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + batchdel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deletePermissionList({ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + }, + } + } +</script> +<style scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/QuartzJobList.vue b/ant-design-jeecg-vue/src/views/system/QuartzJobList.vue new file mode 100644 index 0000000..5aa6526 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/QuartzJobList.vue @@ -0,0 +1,365 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :span="6"> + <a-form-item label="任务类名"> + <a-input placeholder="请输入任务类名" v-model="queryParam.jobClassName"></a-input> + </a-form-item> + </a-col> + <a-col :span="6"> + <a-form-item label="任务状态"> + <a-select style="width: 150px" v-model="queryParam.status" placeholder="请选择状态"> + <a-select-option value="">全部</a-select-option> + <a-select-option value="0">正常</a-select-option> + <a-select-option value="-1">停止</a-select-option> + </a-select> + </a-form-item> + </a-col> + + <a-col :span="8" > + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + + </a-row> + </a-form> + </div> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="middle" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="resumeJob(record)" v-if="record.status==-1">启动</a> + <a @click="pauseJob(record)" v-if="record.status==0">停止</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> + <a-menu slot="overlay"> + <a-menu-item><a @click="handleEdit(record)">编辑</a></a-menu-item> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + <!-- 状态渲染模板 --> + <template slot="customRenderStatus" slot-scope="status, record"> + <a-tag v-if="status==0" color="green">已启动</a-tag> + <a-tag v-if="status==-1" color="orange">已暂停</a-tag> + </template> + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <quartzJob-modal ref="quartzJobModal" @ok="modalFormOk"></quartzJob-modal> + </a-card> +</template> + +<script> + import QuartzJobModal from './modules/QuartzJobModal' + import { filterObj } from '@/utils/util' + import { deleteAction,getAction,postAction } from '@/api/manage' + + export default { + name: "QuartzJobList", + components: { + QuartzJobModal + }, + data () { + return { + description: '定时任务在线管理', + // 查询条件 + queryParam: {}, + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + + { + title: '任务类名', + align:"center", + dataIndex: 'jobClassName', + sorter: true + }, + { + title: 'cron表达式', + align:"center", + dataIndex: 'cronExpression' + }, + { + title: '参数', + align:"center", + dataIndex: 'parameter' + }, + { + title: '描述', + align:"center", + dataIndex: 'description' + }, + { + title: '状态', + align:"center", + dataIndex: 'status', + scopedSlots: { customRender: 'customRenderStatus' }, + filters: [ + { text: '已启动', value: '0' }, + { text: '已暂停', value: '-1' }, + ] + }, + { + title: '操作', + dataIndex: 'action', + align:"center", + scopedSlots: { customRender: 'action' }, + } + ], + //数据集 + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/sys/quartzJob/list", + delete: "/sys/quartzJob/delete", + deleteBatch: "/sys/quartzJob/deleteBatch", + pause: "/sys/quartzJob/pause", + resume: "/sys/quartzJob/resume", + }, + + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list,params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + var that = this; + for(var a in that.queryParam){ + that.queryParam[a] = ''; + } + that.loadData(1); + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function(id){ + var that = this; + deleteAction(that.url.delete,{id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleEdit: function(record){ + this.$refs.quartzJobModal.edit(record); + this.$refs.quartzJobModal.title="编辑"; + }, + pauseJob: function(record){ + var that = this; + //暂停定时任务 + this.$confirm({ + title:"确认暂停", + content:"是否暂停选中任务?", + onOk: function(){ + postAction(that.url.pause,record).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + + }, + resumeJob: function(record){ + var that = this; + //恢复定时任务 + this.$confirm({ + title:"确认暂停", + content:"是否暂停选中任务?", + onOk: function(){ + postAction(that.url.resume,record).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + }, + handleAdd: function(){ + this.$refs.quartzJobModal.add(); + this.$refs.quartzJobModal.title="新增"; + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + } + } + } +</script> +<style scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:10px; + padding-bottom:10px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/RoleList.vue b/ant-design-jeecg-vue/src/views/system/RoleList.vue new file mode 100644 index 0000000..68ecfbb --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/RoleList.vue @@ -0,0 +1,327 @@ +<template> + <a-card :bordered="false" class="card-area"> + + <!-- 查询区域 --> + <div> + <!-- 搜索区域 --> + <a-form layout="horizontal"> + <div class="fold"> + <a-row > + <a-col :md="12" :sm="24" > + <a-form-item + label="名称" + :labelCol="{span: 5}" + :wrapperCol="{span: 18, offset: 1}"> + <a-input placeholder="请输入名称查询" v-model="queryParam.roleName"></a-input> + </a-form-item> + </a-col> + <a-col :md="12" :sm="24" > + <a-form-item + label="创建时间" + :labelCol="{span: 5}" + :wrapperCol="{span: 18, offset: 1}"> + <a-range-picker @change="onChangeDate" v-model="queryParam.createTimeIsRange"/> + </a-form-item> + </a-col> + </a-row> + </div> + <span style="float: right; margin-top: 3px;"> + <a-button type="primary" @click="searchQuery">查询</a-button> + <a-button style="margin-left: 8px" @click="searchReset">重置</a-button> + </span> + </a-form> + </div> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> + 批量操作 <a-icon type="down" /> + </a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="middle" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link"> + 更多 <a-icon type="down" /> + </a> + <a-menu slot="overlay"> + <a-menu-item> + <a @click="handlePerssion(record.id)">授权</a> + </a-menu-item> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <role-modal ref="roleModal" @ok="modalFormOk"></role-modal> + <user-role-modal ref="modalUserRole"></user-role-modal> + </a-card> +</template> + +<script> + import RoleModal from './modules/RoleModal' + import { filterObj } from '@/utils/util' + import UserRoleModal from './modules/UserRoleModal' + import {getRoleList,deleteRole,deleteRoleList} from '@/api/api' + + export default { + name: "RoleList", + components: { + RoleModal, + UserRoleModal + }, + data () { + return { + description: '角色管理页面', + // 查询条件 + queryParam: {roleName:'',createTimeIsRange:[]}, + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + { + title: '角色名称', + align:"center", + dataIndex: 'roleName' + }, + { + title: '角色编码', + align:"center", + dataIndex: 'roleCode' + }, + { + title: '备注', + align:"center", + dataIndex: 'description' + }, + { + title: '创建时间', + dataIndex: 'createTime', + align:"center", + sorter: true + }, + { + title: '更新时间', + dataIndex: 'updateTime', + align:"center", + sorter: true + }, + { + title: '操作', + dataIndex: 'action', + align:"center", + scopedSlots: { customRender: 'action' }, + } + ], + //数据集 + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getRoleList(params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + var that = this; + for(var a in that.queryParam){ + that.queryParam[a] = ''; + } + that.loadData(1); + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteRoleList({ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function(id){ + var that = this; + deleteRole({id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleEdit: function(record){ + this.$refs.roleModal.edit(record); + this.$refs.roleModal.title="编辑"; + }, + handleAdd: function(){ + this.$refs.roleModal.add(); + this.$refs.roleModal.title="新增"; + }, + handlePerssion: function(roleId){ + // alert(roleId); + this.$refs.modalUserRole.show(roleId); + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + }, + onChangeDate(date, dateString) { + console.log(date, dateString); + }, + } + } +</script> +<style scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} + + @import '../../assets/less/index.less'; +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/SysAnnouncementList.vue b/ant-design-jeecg-vue/src/views/system/SysAnnouncementList.vue new file mode 100644 index 0000000..3eb99cf --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/SysAnnouncementList.vue @@ -0,0 +1,406 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :span="6"> + <a-form-item label="标题"> + <a-input placeholder="请输入标题" v-model="queryParam.titile"></a-input> + </a-form-item> + </a-col> + <a-col :span="6"> + <a-form-item label="内容"> + <a-input placeholder="请输入内容" v-model="queryParam.msgContent"></a-input> + </a-form-item> + </a-col> + + <a-col :span="8" > + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + + </a-row> + </a-form> + </div> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="middle" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> + <a-menu slot="overlay"> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + <a-menu-item v-if="record.sendStatus == 0"> + <a-popconfirm title="确定发布吗?" @confirm="() => releaseData(record.id)"> + <a>发布</a> + </a-popconfirm> + </a-menu-item> + <a-menu-item v-if="record.sendStatus == 1"> + <a-popconfirm title="确定撤销吗?" @confirm="() => reovkeData(record.id)"> + <a>撤销</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <sysAnnouncement-modal ref="sysAnnouncementModal" @ok="modalFormOk"></sysAnnouncement-modal> + </a-card> +</template> + +<script> + import SysAnnouncementModal from './modules/SysAnnouncementModal' + import { filterObj } from '@/utils/util' + import { deleteAction,getAction } from '@/api/manage' + import { doReleaseData,doReovkeData } from '@/api/api' + + export default { + name: "SysAnnouncementList", + components: { + SysAnnouncementModal + }, + data () { + return { + description: '系统通告表管理页面', + // 查询条件 + queryParam: {}, + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + + { + title: '标题', + align:"center", + dataIndex: 'titile' + }, + /*{ + title: '内容', + align:"center", + dataIndex: 'msgContent' + },*/ + { + title: '开始时间', + align:"center", + dataIndex: 'startTime' + }, + { + title: '结束时间', + align:"center", + dataIndex: 'endTime' + }, + { + title: '发布人', + align:"center", + dataIndex: 'sender' + }, + { + title: '优先级', + align:"center", + dataIndex: 'priority', + customRender:function (text) { + if(text=='L'){ + return "低"; + }else if(text=="M"){ + return "中"; + }else if(text=="H"){ + return "高"; + } else { + return text; + } + } + }, + { + title: '通告对象类型', + align:"center", + dataIndex: 'msgType', + customRender:function (text) { + if(text=='USER'){ + return "指定用户"; + }else if(text=="ALL"){ + return "全体用户"; + } else { + return text; + } + } + }, + { + title: '发布状态', + align:"center", + dataIndex: 'sendStatus', + customRender:function (text) { + if(text==0){ + return "未发布"; + }else if(text==1){ + return "已发布"; + }else if(text==2){ + return "已撤销"; + } else { + return text; + } + } + }, + { + title: '发布时间', + align:"center", + dataIndex: 'sendTime' + }, + { + title: '撤销时间', + align:"center", + dataIndex: 'cancelTime' + }, + /*{ + title: '删除状态(0,正常,1已删除)', + align:"center", + dataIndex: 'delFlag' + },*/ + { + title: '操作', + dataIndex: 'action', + align:"center", + scopedSlots: { customRender: 'action' }, + } + ], + //数据集 + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/sys/annountCement/list", + delete: "/sys/annountCement/delete", + deleteBatch: "/sys/annountCement/deleteBatch", + releaseDataUrl:"/sys/annountCement/doReleaseData", + reovkeDataUrl:"sys/annountCement/doReovkeData", + }, + + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list,params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + var that = this; + for(var a in that.queryParam){ + that.queryParam[a] = ''; + } + that.loadData(1); + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function(id){ + var that = this; + deleteAction(that.url.delete,{id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleEdit: function(record){ + this.$refs.sysAnnouncementModal.edit(record); + this.$refs.sysAnnouncementModal.title="编辑"; + }, + handleAdd: function(){ + this.$refs.sysAnnouncementModal.add(); + this.$refs.sysAnnouncementModal.title="新增"; + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + }, + //执行发布操作 + releaseData: function(id){ + console.log(id); + var that = this; + doReleaseData({id:id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(1); + }else{ + that.$message.warning(res.message); + } + }); + }, + //执行撤销操作 + reovkeData: function(id){ + var that = this; + doReovkeData({id:id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(1); + }else{ + that.$message.warning(res.message); + } + }); + }, + } + } +</script> +<style scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/UserList.vue b/ant-design-jeecg-vue/src/views/system/UserList.vue new file mode 100644 index 0000000..9a0454a --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/UserList.vue @@ -0,0 +1,502 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :span="6"> + <a-form-item label="账号"> + <a-input placeholder="请输入账号查询" v-model="queryParam.username"></a-input> + </a-form-item> + </a-col> + + <a-col :span="6"> + <a-form-item label="性别"> + <a-select v-model="queryParam.sex" placeholder="请选择性别查询"> + <a-select-option value="">请选择性别查询</a-select-option> + <a-select-option value="1">男性</a-select-option> + <a-select-option value="2">女性</a-select-option> + </a-select> + </a-form-item> + </a-col> + + + <template v-if="toggleSearchStatus"> + <a-col :span="6"> + <a-form-item label="邮箱"> + <a-input placeholder="请输入邮箱查询" v-model="queryParam.email"></a-input> + </a-form-item> + </a-col> + + <a-col :span="6"> + <a-form-item label="手机号码"> + <a-input placeholder="请输入手机号码查询" v-model="queryParam.phone"></a-input> + </a-form-item> + </a-col> + + <a-col :span="6"> + <a-form-item label="状态"> + <a-select v-model="queryParam.status" placeholder="请选择用户状态查询"> + <a-select-option value="">请选择用户状态</a-select-option> + <a-select-option value="1">正常</a-select-option> + <a-select-option value="2">解冻</a-select-option> + </a-select> + </a-form-item> + </a-col> + </template> + + <a-col :span="6" > + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchByquery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + <a @click="handleToggleSearch" style="margin-left: 8px"> + {{ toggleSearchStatus ? '收起' : '展开' }} + <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> + </a> + </span> + </a-col> + + </a-row> + </a-form> + </div> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">添加用户</a-button> + <!--<a-button + + style="margin-left:8px" + v-if="selectedRowKeys.length > 0" + ghost + type="primary" + icon="delete">批量删除</a-button>--> + + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay" @click="handleMenuClick"> + <a-menu-item key="1"><a-icon type="delete" @click="batchdel"/>删除</a-menu-item> + <a-menu-item key="2"><a-icon type="lock" @click="batchFrozen('2')"/>冻结</a-menu-item> + <a-menu-item key="3"><a-icon type="unlock" @click="batchFrozen('1')"/>解冻</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> + 批量操作 <a-icon type="down" /> + </a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> + 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + bordered + size="middle" + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <template slot="avatarslot" slot-scope="text, record, index"> + <div class="anty-img-wrap"> + <img :src="getAvatarView(record.avatar)"/> + </div> + + </template> + + <!--<span slot="action" slot-scope="text, record" class="anty-row-operator"> + <a-button type="primary" size="small" icon="setting">角色配置</a-button> + <a-button type="default" size="small" icon="edit" @click="handleEdit(record)">编辑</a-button> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a-button type="danger" size="small" icon="delete">删除</a-button> + </a-popconfirm> + </span>--> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link"> + 更多 <a-icon type="down" /> + </a> + <a-menu slot="overlay"> + <a-menu-item > + <a href="javascript:;" @click="handleDetail(record)">详情</a> + </a-menu-item> + + <a-menu-item > + <a href="javascript:;" @click="handleChangePassword(record.username)">修改密码</a> + </a-menu-item> + + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + + <a-menu-item v-if="record.status==1"> + <a-popconfirm title="确定冻结吗?" @confirm="() => handleFrozen(record.id,2)"> + <a>冻结</a> + </a-popconfirm> + </a-menu-item> + + <a-menu-item v-if="record.status==2"> + <a-popconfirm title="确定解冻吗?" @confirm="() => handleFrozen(record.id,1)"> + <a>解冻</a> + </a-popconfirm> + </a-menu-item> + + </a-menu> + </a-dropdown> + </span> + + + </a-table> + </div> + <!-- table区域-end --> + + <user-modal ref="modal" @ok="modalFormOk"></user-modal> + + <password-modal ref="passwordmodal" @ok="passwordModalOk"></password-modal> + + </a-card> +</template> + +<script> + import { filterObj } from '@/utils/util'; + import UserModal from './modules/UserModal' + import PasswordModal from './modules/PasswordModal' + + import {doMian,getUserList,deleteUser,deleteUserList,frozenBatch} from '@/api/api' + + export default { + name: "UserList", + components: { + UserModal, + PasswordModal + }, + data () { + return { + description: '这是用户管理页面', + queryParam: {}, + columns: [ + /*{ + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + },*/ + { + title: '用户账号', + align:"center", + dataIndex: 'username', + fixed:'left', + width:200 + }, + { + title: '真实姓名', + align:"center", + dataIndex: 'realname', + }, + { + title: '头像', + align:"center", + dataIndex: 'avatar', + scopedSlots:{customRender:"avatarslot"} + }, + + { + title: '性别', + align:"center", + dataIndex: 'sex', + customRender:function (text) { + if(text==1){ + return "男"; + }else if(text==2){ + return "女"; + }else{ + return text; + } + } + }, + { + title: '生日', + align:"center", + dataIndex: 'birthday' + }, + { + title: '手机号码', + align:"center", + dataIndex: 'phone' + }, + { + title: '邮箱', + align:"center", + dataIndex: 'email' + }, + { + title: '状态', + align:"center", + dataIndex: 'status', + customRender:function (text) { + if(text==1){ + return "正常"; + }else if(text==2){ + return "冻结"; + }else{ + return text; + } + } + }, + { + title: '创建时间', + align:"center", + dataIndex: 'createTime', + sorter:true + }, + { + title: '操作', + dataIndex: 'action', + scopedSlots: { customRender: 'action' }, + fixed:"right", + align:"center", + width:150 + } + + ], + dataSource:[], + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + toggleSearchStatus:false, + url: { + imgerver:doMian+"/sys/common/view" + }, + + } + }, + created() { + this.loadData(); + }, + + methods: { + loadData (arg){ + if(arg===1){ + this.ipagination.current = 1; + } + let params = this.getQueryParams();//查询条件 + getUserList(params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + getQueryParams(){ + let param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.current = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + let str = "id,"; + for(let a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + getAvatarView:function(avatar){ + return this.url.imgerver +"/"+ avatar; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchByquery(){ + this.loadData(1); + }, + searchReset(){ + let that = this; + Object.keys(that.queryParam).forEach(function(key){ + that.queryParam[key] = ''; + }); + that.loadData(1); + }, + batchFrozen:function(status){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return false; + }else{ + let ids = ""; + let that = this; + that.selectedRowKeys.forEach(function(val) { + ids+=val+","; + }); + that.$confirm({ + title:"确认操作", + content:"是否"+(status==1?"解冻":"冻结")+"选中账号?", + onOk: function(){ + frozenBatch({ids: ids,status:status}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + batchdel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return false; + }else{ + let ids = ""; + let that = this; + that.selectedRowKeys.forEach(function(val) { + ids+=val+","; + }); + that.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteUserList({ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleMenuClick(e){ + if(e.key==1){ + this.batchdel(); + }else if(e.key==2){ + this.batchFrozen(2); + }else if(e.key==3){ + this.batchFrozen(1); + } + }, + handleDelete: function(id){ + let that = this; + deleteUser({id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleFrozen: function(id,status){ + let that = this; + frozenBatch({ids: id,status:status}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleEdit: function(record){ + this.$refs.modal.edit(record); + this.$refs.modal.title="编辑"; + }, + handleAdd: function(){ + this.$refs.modal.add(); + this.$refs.modal.title="新增"; + }, + handleDetail:function(record){ + this.$refs.modal.edit(record); + this.$refs.modal.title="详情"; + this.$refs.modal.disableSubmit = true; + }, + handleTableChange(pagination, filters, sorter){ + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + handleToggleSearch(){ + this.toggleSearchStatus = !this.toggleSearchStatus; + }, + handleChangePassword(username){ + this.$refs.passwordmodal.show(username); + }, + modalFormOk () { + this.loadData(); + }, + passwordModalOk(){ + //TODO 密码修改完成 不需要刷新页面,可以把datasource中的数据更新一下 + } + } + + } +</script> +<style scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} + + .anty-img-wrap{height:25px;position: relative;} + .anty-img-wrap > img{max-height:100%;} +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/DepartModal.vue b/ant-design-jeecg-vue/src/views/system/modules/DepartModal.vue new file mode 100644 index 0000000..e55e87b --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/DepartModal.vue @@ -0,0 +1,194 @@ +<template> + <a-modal + :title="title" + :width="800" + :ok=false + :visible="visible" + :confirmLoading="confirmLoading" + :okButtonProps="{ props: {disabled: disableSubmit} }" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="机构名称" + :hidden="false" + hasFeedback > + <a-input id="departName" placeholder="请输入机构/部门名称" v-decorator="['departName', validatorRules.departName ]"/> + </a-form-item> + <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :hidden="seen" label="上级部门" hasFeedback> + <a-tree-select + style="width:100%" + :dropdownStyle="{maxHeight:'200px',overflow:'auto'}" + :treeData="departTree" + v-model="model.parentId" + placeholder="请选择上级部门" + :disabled="condition"> + </a-tree-select> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="电话"> + <a-input placeholder="请输入电话" v-decorator="['mobile',validatorRules.mobile]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="传真"> + <a-input placeholder="请输入传真" v-decorator="['fax', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="地址"> + <a-input placeholder="请输入地址" v-decorator="['address', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="排序"> + <a-input-number v-decorator="[ 'departOrder',{'initialValue':0}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="备注"> + <a-textarea placeholder="请输入备注" v-decorator="['memo', {}]" /> + </a-form-item> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction } from '@/api/manage' + import { queryIdTree } from '@/api/api' + import pick from 'lodash.pick' + import ATextarea from 'ant-design-vue/es/input/TextArea' + export default { + name: "SysDepartModal", + components: { ATextarea }, + data () { + return { + departTree:[], + orgTypeData:[], + phoneWarning:'', + departName:"", + title:"操作", + seen:false, + visible: false, + condition:true, + disableSubmit:false, + model: {}, + menuhidden:false, + menuusing:true, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + departName:{rules: [{ required: true, message: '请输入机构/部门名称!' }]}, + orgCode:{rules: [{ required: true, message: '请输入机构编码!' }]}, + mobile:{rules: [{validator:this.validateMobile}]} + }, + url: { + add: "/sysdepart/sysDepart/add", + }, + } + }, + created () { + }, + methods: { + loadTreeData(){ + var that = this; + queryIdTree().then((res)=>{ + if(res.success){ + that.departTree = []; + for (let i = 0; i < res.result.length; i++) { + let temp = res.result[i]; + that.departTree.push(temp); + console.log(temp.id) + } + } + + }) + }, + add (depart) { + if(depart){ + this.seen = false; + }else{ + this.seen = true; + } + this.edit(depart); + }, + edit (record) { + this.form.resetFields(); + this.model = Object.assign({}, {}); + this.visible = true; + this.loadTreeData(); + this.model.parentId = record!=null?record.toString():null; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model,'departName','departNameEn','departNameAbbr','departOrder','description','orgType','orgCode','mobile','fax','address','memo','status','delFlag')) + }); + }, + close () { + this.$emit('close'); + this.disableSubmit = false; + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let formData = Object.assign(this.model, values); + //时间格式化 + console.log(formData) + httpAction(this.url.add,formData,"post").then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadTreeData(); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + + } + }) + }, + handleCancel () { + this.close() + }, + validateMobile(rule,value,callback){ + if (!value || new RegExp(/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/).test(value)){ + callback(); + }else{ + callback("您的手机号码格式不正确!"); + } + + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/DepartWindow.vue b/ant-design-jeecg-vue/src/views/system/modules/DepartWindow.vue new file mode 100644 index 0000000..da93383 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/DepartWindow.vue @@ -0,0 +1,167 @@ +<template> + <a-modal + :width="modalWidth" + :visible="visible" + title="部门搜索" + :confirmLoading="confirmLoading" + @ok="handleSubmit" + @cancel="handleCancel" + cancelText="关闭" + wrapClassName="ant-modal-cust-warp" + > + <!--部门树--> + <template> + <a-form :form="form"> + <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="上级部门"> + <a-tree + multiple + treeCheckable="tree" + checkable + :checkedKeys="checkedKeys" + allowClear="true" + :checkStrictly="true" + @check="onCheck" + :dropdownStyle="{maxHeight:'200px',overflow:'auto'}" + :treeData="departTree" + placeholder="请选择上级部门" + > + </a-tree> + </a-form-item> + </a-form> + </template> + </a-modal> +</template> + +<script> + import pick from 'lodash.pick' + import { getAction } from '@/api/manage' + import { queryIdTree } from '@/api/api' + import userModal from './UserModal' + export default { + name: "DepartWindow", + components: { + userModal, + }, + data () { + return { + checkedKeys:[], // 存储选中的部门id + userId:"", // 存储用户id + model:{}, // 存储SysUserDepartsVO表 + userDepartModel:{userId:'',departIdList:[]}, // 存储用户id一对多部门信息的对象 + departList:[], // 存储部门信息 + modalWidth:400, + departTree:[], + title:"操作", + visible: false, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + confirmLoading: false, + headers:{}, + form:this.$form.createForm(this), + url: { + userId:"/sys/user/generateUserId", // 引入生成添加用户情况下的url + }, + } + }, + methods: { + add (checkedDepartKeys,userId) { + this.checkedKeys = checkedDepartKeys; + this.userId = userId; + this.edit({}); + }, + edit (record) { + this.departList = []; + this.queryDepartTree(); + this.form.resetFields(); + this.visible = true; + this.model = Object.assign({}, record); + let filedsVal = pick(this.model,'id','userId','departIdList'); + this.$nextTick(() => { + this.form.setFieldsValue(filedsVal); + }); + }, + close () { + this.$emit('close'); + this.visible = false; + this.departList = []; + this.checkedKeys = []; + }, + handleSubmit () { + const that = this; + // 触发表单验证 + this.form.validateFields((err) => { + if (!err) { + that.confirmLoading = true; + if(this.userId == null){ + getAction(this.url.userId).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + let formData = {userId:res.result, + departIdList:this.departList} + console.log(formData) + that.$emit('ok', formData); + }else{ + that.$message.warning("添加失败!"); + } + }).finally(() => { + that.departList = []; + that.confirmLoading = false; + that.close(); + }) + }else { + let formData = {userId:this.userId, + departIdList:this.departList} + console.log(formData) + that.departList = []; + that.$emit('ok', formData); + that.confirmLoading = false; + that.close(); + } + } + }) + }, + handleCancel () { + this.close() + }, + + // 选择部门时作用的API + onCheck(checkedKeys, info){ + this.departList = []; + this.checkedKeys = checkedKeys.checked; + let checkedNodes = info.checkedNodes; + for (let i = 0; i < checkedNodes.length; i++) { + let de = checkedNodes[i].data.props; + let depart = {key:"",value:"",title:""}; + depart.key = de.value; + depart.value = de.value; + depart.title = de.title; + this.departList.push(depart); + } + console.log('onCheck', checkedKeys, info); + }, + queryDepartTree(){ + queryIdTree().then((res)=>{ + if(res.success){ + this.departTree = res.result; + } + }) + }, + modalFormOk(){ + + } + }, + } +</script> + +<style scoped> + .ant-table-tbody .ant-table-row td{ + padding-top:10px; + padding-bottom:10px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/DictItemModal.vue b/ant-design-jeecg-vue/src/views/system/modules/DictItemModal.vue new file mode 100644 index 0000000..cda81a3 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/DictItemModal.vue @@ -0,0 +1,154 @@ +<template> + <a-modal + :title="title" + :width="600" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭" + > + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="名称"> + <a-input placeholder="请输入名称" v-decorator="['itemText', validatorRules.itemText]" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="数据值"> + <a-input placeholder="请输入数据值" v-decorator="['itemValue', validatorRules.itemValue]"/> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="描述"> + <a-input v-decorator="['description']"/> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="排序值"> + <a-input-number :min="1" v-decorator="['sortOrder',{'initialValue':1}]"/> 值越小越靠前,支持小数 + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="是否启用" + hasFeedback > + <a-switch checkedChildren="启用" unCheckedChildren="禁用" @change="onChose" v-model="visibleCheck"/> + </a-form-item> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import pick from 'lodash.pick' + import {addDictItem,editDictItem} from '@/api/api' + + export default { + name: "DictItemModal", + data () { + return { + title:"操作", + visible: false, + visibleCheck: true, + model: {}, + dictId:"", + status:1, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + itemText:{rules: [{ required: true, message: '请输入名称!' }]}, + itemValue:{rules: [{ required: true, message: '请输入数据值!' }]}, + }, + } + }, + created () { + }, + methods: { + add (dictId) { + this.dictId = dictId; + this.edit({}); + }, + edit (record) { + if(record.id){ + this.dictId = record.dictId; + this.visibleCheck = (record.status == 1)?true:false; + } + this.form.resetFields(); + this.model = Object.assign({}, record); + this.model.dictId = this.dictId; + this.model.status = this.status; + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model,'itemText','itemValue','description','sortOrder')) + }); + }, + onChose(checked) { + if(checked){ + this.status=1; + this.visibleCheck=true; + }else{ + this.status=0; + this.visibleCheck=false; + } + }, + // 确定 + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let formData = Object.assign(this.model, values); + formData.status = this.status; + let obj; + if(!this.model.id){ + obj=addDictItem(formData); + }else{ + obj=editDictItem(formData); + } + obj.then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + } + }) + }, + // 关闭 + handleCancel () { + this.close(); + }, + close () { + this.$emit('close'); + this.visible = false; + }, + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/DictModal.vue b/ant-design-jeecg-vue/src/views/system/modules/DictModal.vue new file mode 100644 index 0000000..20ca328 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/DictModal.vue @@ -0,0 +1,130 @@ +<template> + <a-modal + :title="title" + :width="600" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭" + > + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="字典名称"> + <a-input placeholder="请输入字典名称" v-decorator="[ 'dictName', validatorRules.dictName]" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="字典编码"> + <a-input placeholder="请输入字典编码" v-decorator="[ 'dictCode', validatorRules.dictCode]"/> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="描述"> + <a-input v-decorator="[ 'description']"/> + </a-form-item> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import pick from 'lodash.pick' + import {addDict,editDict} from '@/api/api' + + export default { + name: "DictModal", + data () { + return { + value:1, + title:"操作", + visible: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + dictName:{rules: [{ required: true, message: '请输入字典名称!' }]}, + dictCode:{rules: [{ required: true, message: '请输入字典编码!' }]}, + }, + } + }, + created () { + }, + methods: { + handleChange(value) { + this.model.status = value; + }, + add () { + this.edit({}); + }, + edit (record) { + if(record.id){ + this.visiblekey = true; + }else{ + this.visiblekey = false; + } + this.form.resetFields(); + this.model = Object.assign({}, record); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model,'dictName','dictCode','description')) + }); + }, + // 确定 + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let formData = Object.assign(this.model, values); + let obj; + console.log(formData) + if(!this.model.id){ + formData.delFlag = "1"; + obj=addDict(formData); + }else{ + obj=editDict(formData); + } + obj.then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + } + }) + }, + // 关闭 + handleCancel () { + this.close(); + }, + close () { + this.$emit('close'); + this.visible = false; + }, + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/PasswordModal.vue b/ant-design-jeecg-vue/src/views/system/modules/PasswordModal.vue new file mode 100644 index 0000000..d419f94 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/PasswordModal.vue @@ -0,0 +1,136 @@ +<template> + <a-modal + title="重新设定密码" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleSubmit" + @cancel="handleCancel" + cancelText="关闭" + style="top:20px;" + > + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol"> + <a-input placeholder="请输入用户账号" v-decorator="[ 'username', {}]" :readOnly="true"/> + </a-form-item> + + <a-form-item label="登陆密码" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-input type="password" placeholder="请输入登陆密码" v-decorator="[ 'password', validatorRules.password]" /> + </a-form-item> + + <a-form-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-input type="password" @blur="handleConfirmBlur" placeholder="请重新输入登陆密码" v-decorator="[ 'confirmpassword', validatorRules.confirmpassword]"/> + </a-form-item> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import {changPassword} from '@/api/api' + + export default { + name: "PasswordModal", + data () { + return { + visible: false, + confirmLoading: false, + confirmDirty: false, + validatorRules:{ + password:{ + rules: [{ + required: true, message: '请输入登陆密码!', + }, { + validator: this.validateToNextPassword, + }], + }, + confirmpassword:{ + rules: [{ + required: true, message: '请重新输入登陆密码!', + }, { + validator: this.compareToFirstPassword, + }], + }, + }, + + model: {}, + + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + form:this.$form.createForm(this) + } + }, + created () { + console.log("created"); + }, + + methods: { + show (username) { + this.form.resetFields(); + this.visible = true; + this.model.username = username; + this.$nextTick(() => { + this.form.setFieldsValue({username:username}); + }); + }, + close () { + this.$emit('close'); + this.visible = false; + this.disableSubmit = false; + this.selectedRole = []; + }, + handleSubmit () { + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + this.confirmLoading = true; + let formData = Object.assign(this.model, values); + changPassword(formData).then((res)=>{ + if(res.success){ + this.$message.success(res.message); + this.$emit('ok'); + }else{ + this.$message.warning(res.message); + } + }).finally(() => { + this.confirmLoading = false; + this.close(); + }); + } + }) + }, + handleCancel () { + this.close() + }, + validateToNextPassword (rule, value, callback) { + const form = this.form; + if (value && this.confirmDirty) { + form.validateFields(['confirm'], { force: true }) + } + callback(); + }, + compareToFirstPassword (rule, value, callback) { + const form = this.form; + if (value && value !== form.getFieldValue('password')) { + callback('两次输入的密码不一样!'); + } else { + callback() + } + }, + handleConfirmBlur (e) { + const value = e.target.value + this.confirmDirty = this.confirmDirty || !!value + } + + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/PermissionModal.vue b/ant-design-jeecg-vue/src/views/system/modules/PermissionModal.vue new file mode 100644 index 0000000..231d8ac --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/PermissionModal.vue @@ -0,0 +1,287 @@ +<template> + <a-modal + :title="title" + :width="900" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + :okButtonProps="{ props: {disabled: disableSubmit} }" + cancelText="关闭" + wrapClassName="ant-modal-cust-warp" + style="top:5%;height: 95%;"> + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item label="菜单类型" :labelCol="labelCol" :wrapperCol="wrapperCol" > + <a-radio-group @change="onChangeMenuType" v-decorator="['menuType',{'initialValue':1}]"> + <a-radio :value="0">一级菜单</a-radio> + <a-radio :value="1">子菜单</a-radio> + <a-radio :value="2">按钮</a-radio> + </a-radio-group> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + :label="menuLabel" + hasFeedback > + <a-input placeholder="请输入菜单名称" v-decorator="[ 'name', validatorRules.name]" :readOnly="disableSubmit"/> + </a-form-item> + + + <a-form-item + v-show="localMenuType!=0" + label="上级菜单" + :labelCol="labelCol" + :wrapperCol="wrapperCol" > + <a-tree-select + style="width:100%" + :dropdownStyle="{ maxHeight: '200px', overflow: 'auto' }" + :treeData="treeData" + v-model="model.parentId" + placeholder="请选择父级菜单" + :disabled="disableSubmit"> + </a-tree-select> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="菜单路径"> + <a-input placeholder="请输入菜单路径" v-decorator="[ 'url',{}]" :readOnly="disableSubmit"/> + </a-form-item> + + <a-form-item + v-show="show" + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="前端组件"> + <a-input placeholder="请输入前端组件" v-decorator="[ 'component', {}]" :readOnly="disableSubmit"/> + </a-form-item> + + <a-form-item + v-show="localMenuType==0" + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="默认跳转地址"> + <a-input placeholder="请输入路由参数 redirect" v-decorator="[ 'redirect',{}]" :readOnly="disableSubmit"/> + </a-form-item> + + <a-form-item + v-show="!show" + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="授权标识"> + <a-input placeholder="多个用逗号分隔, 如: user:list,user:create" v-decorator="[ 'perms', {}]" :readOnly="disableSubmit"/> + </a-form-item> + + <a-form-item + v-show="show" + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="菜单图标"> + <a-input placeholder="点击右侧按钮选择图标" v-model="model.icon" :readOnly="disableSubmit"> + <a-icon slot="addonAfter" type="setting" @click="selectIcons" /> + </a-input> + </a-form-item> + + <a-form-item + v-show="show" + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="排序"> + <a-input-number placeholder="请输入菜单排序" style="width: 200px" v-decorator="[ 'sortNo', {'initialValue':1.0,'rule':validatorRules.sortNo}]" :readOnly="disableSubmit"/> + </a-form-item> + + <a-form-item + v-show="show" + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="隐藏路由"> + <a-switch checkedChildren="是" unCheckedChildren="否" v-model="menuHidden"/> + </a-form-item> + + <a-form-item + v-show="show" + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="聚合路由"> + <a-switch checkedChildren="是" unCheckedChildren="否" v-model="alwaysShow"/> + </a-form-item> + + + </a-form> + + <!-- 选择图标 --> + <icons @choose="handleIconChoose" @close="handleIconCancel" :iconChooseVisible="iconChooseVisible"></icons> + </a-spin> + </a-modal> +</template> + +<script> + import {addPermission,editPermission,queryTreeList} from '@/api/api' + import Icons from './icon/Icons' + import pick from 'lodash.pick' + + export default { + name: "PermissionModal", + components: {Icons}, + data () { + return { + treeData:[], + treeValue: '0-0-4', + title:"操作", + visible: false, + disableSubmit:false, + model: {}, + localMenuType:'1', + alwaysShow:false,//表单元素-聚合路由 + menuHidden:false,//表单元素-隐藏路由 + show:true,//根据菜单类型,动态显示隐藏表单元素 + menuLabel:'菜单名称', + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + name:{rules: [{ required: true, message: '请输入菜单标题!' }]}, + sortNo:{rules: [{validator: this.validateNumber}]}, + }, + iconChooseVisible: false, + } + }, + created () { + }, + methods: { + loadTree(){ + var that = this; + queryTreeList().then((res)=>{ + if(res.success){ + console.log('----queryTreeList---') + console.log(res) + that.treeData = []; + let treeList = res.result.treeList + for(let a=0;a<treeList.length;a++){ + let temp = treeList[a]; + temp.isLeaf = temp.leaf; + that.treeData.push(temp); + } + } + }); + }, + add () { + this.edit(); + }, + edit (record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + //菜单类型切换 + if(record){ + console.log(record) + this.alwaysShow = !record.alwaysShow?false:true; + this.menuHidden = !record.hidden?false:true; + + //console.log('record.menuType', record.menuType); + this.show = record.menuType==2?false:true; + this.menuLabel = record.menuType==2?'按钮名称':'菜单名称'; + + if(this.model.parentId){ + this.localMenuType = 1; + }else{ + this.localMenuType = 0; + } + }else{ + this.show = true; + this.menuLabel = '菜单名称'; + } + + this.visible = true; + this.loadTree(); + let fieldsVal = pick(this.model,'name','perms','component','url','sortNo','menuType'); + this.$nextTick(() => { + this.form.setFieldsValue(fieldsVal) + }); + }, + close () { + this.$emit('close'); + this.disableSubmit = false; + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + this.model.alwaysShow = this.alwaysShow; + this.model.hidden = this.menuHidden; + let formData = Object.assign(this.model, values); + console.log(formData); + let obj; + if(!this.model.id){ + obj=addPermission(formData); + }else{ + obj=editPermission(formData); + } + obj.then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + } + }) + }, + handleCancel () { + this.close() + }, + validateNumber(rule, value, callback){ + if(!value || new RegExp(/^[0-9]*[1-9][0-9]*$/).test(value)){ + callback(); + }else{ + callback("请输入正整数!"); + } + }, + onChangeMenuType(e) { + console.log('localMenuType checked', e.target.value) + this.localMenuType=e.target.value + if(e.target.value == 2){ + this.show = false; + this.menuLabel = '按钮名称'; + }else{ + this.show = true; + this.menuLabel = '菜单名称'; + } + }, + selectIcons(){ + this.iconChooseVisible = true + }, + handleIconCancel () { + this.iconChooseVisible = false + }, + handleIconChoose (value) { + console.log(value) + this.model.icon = value + this.form.icon = value + this.iconChooseVisible = false + }, + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/QuartzJobModal.vue b/ant-design-jeecg-vue/src/views/system/modules/QuartzJobModal.vue new file mode 100644 index 0000000..b7c4cc7 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/QuartzJobModal.vue @@ -0,0 +1,157 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + okText="保存并安排任务" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="任务类名" + hasFeedback > + <a-input placeholder="请输入任务类名" v-decorator="['jobClassName', {rules: [{ required: true, message: '请输入任务类名!' }]}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="cron表达式"> + <a-input placeholder="请输入cron表达式" v-decorator="['cronExpression', {'initialValue':'0/1 * * * * ?',rules: [{ required: true, message: '请输入任务类名!' }]}]" /> + <a target="_blank" href="http://cron.qqe2.com/"> + <a-icon type="share-alt" /> + 在线cron表达式生成 + </a> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="参数" + hasFeedback > + <a-input placeholder="请输入参数" v-decorator="['parameter', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="描述" + hasFeedback > + <a-input placeholder="请输入描述" v-decorator="['description', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="状态"> + <a-radio-group buttonStyle="solid" v-decorator="[ 'status', {'initialValue':0}]"> + <a-radio-button :value="0">正常</a-radio-button> + <a-radio-button :value="-1">停止</a-radio-button> + </a-radio-group> + </a-form-item> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction } from '@/api/manage' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: "QuartzJobModal", + data () { + return { + title:"操作", + visible: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + }, + url: { + add: "/sys/quartzJob/add", + edit: "/sys/quartzJob/edit", + }, + } + }, + created () { + }, + methods: { + add () { + this.edit({}); + }, + edit (record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + console.log(this.model) + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model,'jobClassName','cronExpression','parameter','description','status')); + }); + + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if(!this.model.id){ + httpurl+=this.url.add; + method = 'post'; + }else{ + httpurl+=this.url.edit; + method = 'put'; + } + let formData = Object.assign(this.model, values); + //时间格式化 + + console.log(formData) + httpAction(httpurl,formData,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + + } + }) + }, + handleCancel () { + this.close() + }, + + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/RoleModal.vue b/ant-design-jeecg-vue/src/views/system/modules/RoleModal.vue new file mode 100644 index 0000000..f8c934e --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/RoleModal.vue @@ -0,0 +1,155 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭" + wrapClassName="ant-modal-cust-warp" + style="top:5%;height: 85%;overflow-y: hidden"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="角色名称"> + <a-input placeholder="请输入角色名称" v-decorator="[ 'roleName', validatorRules.roleName]" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="角色编码"> + <a-input placeholder="请输入角色编码" :disabled="roleDisabled" v-decorator="[ 'roleCode', validatorRules.roleCode]" /> + </a-form-item> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="描述"> + <a-textarea :rows="5" placeholder="..." v-decorator="[ 'description', {} ]" /> + </a-form-item> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import pick from 'lodash.pick' + import {addRole,editRole,checkRoleCode } from '@/api/api' + + export default { + name: "RoleModal", + data () { + return { + title:"操作", + visible: false, + roleDisabled: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + roleName:{rules: [{ required: true, message: '请输入角色名称!' }]}, + roleCode:{ + rules: [ + {required: true, message: '请输入角色名称!'}, + {validator: this.validateRoleCode} + ]} + }, + } + }, + created () { + }, + methods: { + add () { + this.edit({}); + }, + edit (record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + this.visible = true; + + //编辑页面禁止修改角色编码 + if(this.model.id){ + this.roleDisabled = true; + }else{ + this.roleDisabled = false; + } + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model,'roleName', 'description','roleCode')) + }); + + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let formData = Object.assign(this.model, values); + let obj; + console.log(formData) + if(!this.model.id){ + obj=addRole(formData); + }else{ + obj=editRole(formData); + } + obj.then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + } + }) + }, + handleCancel () { + this.close() + }, + validateRoleCode(rule, value, callback){ + if(/[\u4E00-\u9FA5]/g.test(value)){ + callback("角色编码不可输入汉字!"); + }else{ + var params = { + id:this.model.id, + roleCode:value + }; + checkRoleCode(params).then((res)=>{ + if(res.success){ + callback(); + }else{ + callback("角色编码已存在!"); + } + }); + } + } + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/SysAnnouncementModal.vue b/ant-design-jeecg-vue/src/views/system/modules/SysAnnouncementModal.vue new file mode 100644 index 0000000..d0f8290 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/SysAnnouncementModal.vue @@ -0,0 +1,208 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="标题"> + <a-input placeholder="请输入标题" v-decorator="['titile', validatorRules.title]" :readOnly="disableSubmit" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="内容"> + <!--<a-input placeholder="请输入内容" v-decorator="['msgContent', {}]" />--> + <a-textarea :rows="5" placeholder="..." v-decorator="[ 'msgContent', {} ]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="开始时间"> + <a-date-picker showTime format="YYYY-MM-DD HH:mm:ss" v-decorator="[ 'startTime', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="结束时间"> + <a-date-picker showTime format="YYYY-MM-DD HH:mm:ss" v-decorator="[ 'endTime', {}]" /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="优先级"> + <a-select + v-decorator="[ 'priority', {}]" + placeholder="请选择优先级" + :disabled="disableSubmit"> + <a-select-option value="L">低</a-select-option> + <a-select-option value="M">中</a-select-option> + <a-select-option value="H">高</a-select-option> + </a-select> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="通告对象类型"> + <a-select + v-decorator="[ 'msgType', {}]" + placeholder="请选择通告对象类型" + :disabled="disableSubmit" + @change="chooseMsgType"> + <a-select-option value="USER">指定用户</a-select-option> + <a-select-option value="ALL">全体用户</a-select-option> + </a-select> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="指定用户" + v-if="userType"> + <a-input placeholder="请选择用户" v-decorator="['userIds',{}]" @click="selectUserIds" disabled="true" /> + </a-form-item> + <!--<a-modal + :title="用户选择" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleSubmit" + @cancel="handleCancel" + cancelText="关闭" + wrapClassName="ant-modal-cust-warp" + style="top:5%;height: 95%;overflow-y: hidden" ref="modelSelectUser" + > + 123 + + </a-modal>--> + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction } from '@/api/manage' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: "SysAnnouncementModal", + data () { + return { + title:"操作", + visible: false, + disableSubmit:false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + title:{rules: [{ required: true, message: '请输入标题!' }]}, + }, + url: { + add: "/sys/annountCement/add", + edit: "/sys/annountCement/edit", + }, + userType:false, + visible: false, + confirmLoading: false, + } + }, + created () { + }, + methods: { + add () { + this.edit({}); + }, + edit (record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model,'titile','msgContent','priority','msgType')) + //时间格式化 + this.form.setFieldsValue({startTime:this.model.startTime?moment(this.model.startTime):null}) + this.form.setFieldsValue({endTime:this.model.endTime?moment(this.model.endTime):null}) + }); + + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if(!this.model.id){ + httpurl+=this.url.add; + method = 'post'; + }else{ + httpurl+=this.url.edit; + method = 'put'; + } + let formData = Object.assign(this.model, values); + //时间格式化 + formData.startTime = formData.startTime?formData.startTime.format('YYYY-MM-DD HH:mm:ss'):null; + formData.endTime = formData.endTime?formData.endTime.format('YYYY-MM-DD HH:mm:ss'):null; + + console.log(formData) + httpAction(httpurl,formData,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + + + + } + }) + }, + handleCancel () { + this.close() + }, + chooseMsgType(value) { + if("USER" == value) { + this.userType = true; + } else { + this.userType = false; + } + }, + selectUserIds() { + console.log(1); + this.$refs.modalSelectUser.show(); + } + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/UserModal.vue b/ant-design-jeecg-vue/src/views/system/modules/UserModal.vue new file mode 100644 index 0000000..167c75b --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/UserModal.vue @@ -0,0 +1,378 @@ +<template> + <a-modal + :width="modalWidth" + :visible="visible" + :confirmLoading="confirmLoading" + :okButtonProps="{ props: {disabled: disableSubmit} }" + @ok="handleSubmit" + @cancel="handleCancel" + cancelText="关闭" + wrapClassName="ant-modal-cust-warp" + style="top:5%;height: 95%;overflow-y: hidden"> + + <template slot="title"> + <div style="width: 100%;"> + <span>{{ title }}</span> + <span style="display:inline-block;width:calc(100% - 56px);padding-top: 2px;padding-right:10px;text-align: right"> + <a-button @click="togglescreen" style="height:18px;width:18px;padding: 0;border-width: 2px"> </a-button> + </span> + </div> + + </template> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback> + <a-input placeholder="请输入用户账号" v-decorator="[ 'username', validatorRules.username]" :readOnly="!!model.id"/> + </a-form-item> + + <template v-if="!model.id"> + <a-form-item label="登陆密码" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-input type="password" placeholder="请输入登陆密码" v-decorator="[ 'password', validatorRules.password]" /> + </a-form-item> + + <a-form-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-input type="password" @blur="handleConfirmBlur" placeholder="请重新输入登陆密码" v-decorator="[ 'confirmpassword', validatorRules.confirmpassword]"/> + </a-form-item> + </template> + + <a-form-item label="用户名称" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-input placeholder="请输入用户名称" v-decorator="[ 'realname', validatorRules.realname]" /> + </a-form-item> + + <a-form-item label="角色分配" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-select + mode="multiple" + style="width: 100%" + placeholder="请选择用户角色" + v-model="selectedRole"> + <a-select-option v-for="(role,roleindex) in roleList" :key="roleindex.toString()" :value="role.id"> + {{ role.roleName }} + </a-select-option> + + + </a-select> + + </a-form-item> + + + + + <a-form-item label="头像" :labelCol="labelCol" :wrapperCol="wrapperCol"> + <a-upload + listType="picture-card" + class="avatar-uploader" + :showUploadList="false" + :action="uploadAction" + :data="{'isup':1}" + :headers="headers" + :beforeUpload="beforeUpload" + @change="handleChange" + > + <img v-if="model.avatar" :src="getAvatarView()" alt="头像" style="height:104px;max-width:300px"/> + <div v-else> + <a-icon :type="uploadLoading ? 'loading' : 'plus'" /> + <div class="ant-upload-text">上传</div> + </div> + </a-upload> + </a-form-item> + + <a-form-item label="生日" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-date-picker + style="width: 100%" + placeholder="请选择生日" + v-decorator="['birthday', {initialValue:!model.birthday?null:moment(model.birthday,dateFormat)}]"/> + </a-form-item> + + <a-form-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-select + v-decorator="[ 'sex', {initialValue:model.sex && model.sex.toString()}]" + placeholder="请选择性别"> + <a-select-option value="1">男</a-select-option> + <a-select-option value="2">女</a-select-option> + </a-select> + </a-form-item> + + <a-form-item label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-input placeholder="请输入邮箱" v-decorator="[ 'email', validatorRules.email]" /> + </a-form-item> + + <a-form-item label="手机号码" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-input placeholder="请输入手机号码" v-decorator="[ 'phone', validatorRules.phone]" /> + </a-form-item> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import pick from 'lodash.pick' + import moment from 'moment' + import Vue from 'vue' + import { ACCESS_TOKEN } from "@/store/mutation-types" + import {doMian,addUser,editUser,queryUserRole,queryall,checkUsername} from '@/api/api' + + export default { + name: "RoleModal", + data () { + return { + modalWidth:800, + modaltoggleFlag:true, + confirmDirty: false, + disableSubmit:false, + dateFormat:"YYYY-MM-DD", + validatorRules:{ + username:{ + rules: [{ + required: true, message: '请输入用户账号!' + },{ + validator: this.validateUsername, + }] + }, + password:{ + rules: [{ + required: true, message: '请输入密码!', + }, { + validator: this.validateToNextPassword, + }], + }, + confirmpassword:{ + rules: [{ + required: true, message: '请重新输入登陆密码!', + }, { + validator: this.compareToFirstPassword, + }], + }, + realname:{rules: [{ required: true, message: '请输入用户名称!' }]}, + phone:{rules: [{validator: this.validatePhone}]}, + email:{rules: [{type: 'email', message: '请输入正确格式的电子邮箱!',}]}, + roles:{} + // sex:{initialValue:((!this.model.sex)?"": (this.model.sex+""))} + }, + title:"操作", + visible: false, + model: {}, + roleList:[], + selectedRole:[], + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + uploadLoading:false, + confirmLoading: false, + headers:{}, + form:this.$form.createForm(this), + url: { + fileUpload:doMian+"sys/common/upload", + imgerver:doMian+"sys/common/view", + }, + } + }, + created () { + const token = Vue.ls.get(ACCESS_TOKEN); + this.headers = {"X-Access-Token":token} + + }, + computed:{ + uploadAction:function () { + return this.url.fileUpload; + } + }, + methods: { + + togglescreen(){ + if(this.modaltoggleFlag){ + this.modalWidth = window.innerWidth; + }else{ + this.modalWidth = 800; + } + this.modaltoggleFlag = !this.modaltoggleFlag; + }, + initialRoleList(){ + queryall().then((res)=>{ + if(res.success){ + this.roleList = res.result; + }else{ + console.log(res.message); + } + }); + }, + loadUserRoles(userid){ + queryUserRole({userid:userid}).then((res)=>{ + if(res.success){ + this.selectedRole = res.result; + }else{ + console.log(res.message); + } + }); + }, + add () { + this.edit({}); + }, + edit (record) { + this.initialRoleList(); + this.form.resetFields(); + if(record.hasOwnProperty("id")){ + this.loadUserRoles(record.id); + } + this.visible = true; + this.model = Object.assign({}, record); + let filedsVal = pick(this.model,'username','password','realname','email','phone'); + filedsVal.confirmpassword = this.model.password; + this.$nextTick(() => { + this.form.setFieldsValue(filedsVal); + }); + + }, + close () { + this.$emit('close'); + this.visible = false; + this.disableSubmit = false; + this.selectedRole = []; + }, + moment, + handleSubmit () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let avatar = that.model.avatar; + if(!values.birthday){ + values.birthday = ''; + }else{ + values.birthday = values.birthday.format(this.dateFormat); + } + let formData = Object.assign(this.model, values); + formData.avatar = avatar; + formData.selectedroles = this.selectedRole.length>0?this.selectedRole.join(","):''; + let obj; + if(!this.model.id){ + obj=addUser(formData); + }else{ + obj=editUser(formData); + } + obj.then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + + } + }) + }, + handleCancel () { + this.close() + }, + validateToNextPassword (rule, value, callback) { + const form = this.form; + if (value && this.confirmDirty) { + form.validateFields(['confirm'], { force: true }) + } + callback(); + }, + compareToFirstPassword (rule, value, callback) { + const form = this.form; + if (value && value !== form.getFieldValue('password')) { + callback('两次输入的密码不一样!'); + } else { + callback() + } + }, + validatePhone(rule, value, callback){ + if(!value || new RegExp(/^1[3|4|5|7|8][0-9]\d{8}$/).test(value)){ + callback(); + }else{ + callback("请输入正确格式的手机号码!"); + } + }, + validateUsername(rule, value, callback){ + var params = { + id:this.model.id, + username:value + }; + checkUsername(params).then((res)=>{ + if(res.success){ + callback(); + }else{ + callback("用户账号已存在!"); + } + }); + }, + handleConfirmBlur (e) { + const value = e.target.value + this.confirmDirty = this.confirmDirty || !!value + }, + + normFile (e) { + console.log('Upload event:', e) + if (Array.isArray(e)) { + return e + } + return e && e.fileList + }, + beforeUpload: function(file){ + var fileType = file.type; + if(fileType.indexOf('image')<0){ + this.$message.warning('请上传图片'); + return false; + } + //TODO 验证文件大小 + }, + handleChange (info) { + if (info.file.status === 'uploading') { + this.uploadLoading = true + return + } + if (info.file.status === 'done') { + var response = info.file.response; + this.uploadLoading = false; + console.log(response); + if(response.success){ + this.model.avatar = response.message; + }else{ + this.$message.warning(response.message); + } + } + }, + getAvatarView(){ + return this.url.imgerver +"/"+ this.model.avatar; + }, + + } + } +</script> + +<style scoped> + .avatar-uploader > .ant-upload { + width:104px; + height:104px; + } + .ant-upload-select-picture-card i { + font-size: 49px; + color: #999; + } + + .ant-upload-select-picture-card .ant-upload-text { + margin-top: 8px; + color: #666; + } + + .ant-table-tbody .ant-table-row td{ + padding-top:10px; + padding-bottom:10px; + } + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/UserRoleModal.vue b/ant-design-jeecg-vue/src/views/system/modules/UserRoleModal.vue new file mode 100644 index 0000000..e935f29 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/UserRoleModal.vue @@ -0,0 +1,168 @@ +<template> + <a-drawer + :title="title" + :maskClosable="true" + width=650 + placement="right" + :closable="true" + @close="close" + :visible="visible" + style="height: calc(100% - 55px);overflow: auto;padding-bottom: 53px;"> + + <a-form> + <a-form-item label='所拥有的权限'> + <a-tree + checkable + @check="onCheck" + :checkedKeys="checkedKeys" + :treeData="treeData" + @expand="onExpand" + :expandedKeys="expandedKeysss" + :checkStrictly="checkStrictly"/> + </a-form-item> + </a-form> + + <div class="drawer-bootom-button"> + <a-dropdown style="float: left" :trigger="['click']" placement="topCenter"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item> + <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item> + <a-menu-item key="3" @click="checkALL">全部勾选</a-menu-item> + <a-menu-item key="4" @click="cancelCheckALL">取消全选</a-menu-item> + <a-menu-item key="5" @click="expandAll">展开所有</a-menu-item> + <a-menu-item key="6" @click="closeAll">合并所有</a-menu-item> + </a-menu> + <a-button> + 树操作 <a-icon type="up" /> + </a-button> + </a-dropdown> + <a-popconfirm title="确定放弃编辑?" @confirm="close" okText="确定" cancelText="取消"> + <a-button style="margin-right: .8rem">取消</a-button> + </a-popconfirm> + <a-button @click="handleSubmit" type="primary" :loading="loading">提交</a-button> + </div> + </a-drawer> + +</template> +<script> + import {queryTreeList,queryRolePermission,saveRolePermission} from '@/api/api' + export default { + name: "RoleModal", + data(){ + return { + roleId:"", + treeData: [], + defaultCheckedKeys:[], + checkedKeys:[], + expandedKeysss:[], + allTreeKeys:[], + autoExpandParent: true, + checkStrictly: true, + title:"角色权限配置", + visible: false, + loading: false, + } + }, + methods: { + onCheck (o) { + if(this.checkStrictly){ + this.checkedKeys = o.checked; + }else{ + this.checkedKeys = o + } + }, + show(roleId){ + this.roleId=roleId + this.visible = true; + }, + close () { + this.reset() + this.$emit('close'); + this.visible = false; + }, + onExpand(expandedKeys){ + this.expandedKeysss = expandedKeys; + this.autoExpandParent = false + }, + reset () { + this.expandedKeysss = [] + this.checkedKeys = [] + this.defaultCheckedKeys = [] + this.loading = false + }, + expandAll () { + this.expandedKeysss = this.allTreeKeys + }, + closeAll () { + this.expandedKeysss = [] + }, + checkALL () { + this.checkedKeys = this.allTreeKeys + }, + cancelCheckALL () { + //this.checkedKeys = this.defaultCheckedKeys + this.checkedKeys = [] + }, + switchCheckStrictly (v) { + if(v==1){ + this.checkStrictly = false + }else if(v==2){ + this.checkStrictly = true + } + }, + handleCancel () { + this.close() + }, + handleSubmit(){ + let that = this; + let params = { + permissionIds:that.checkedKeys.join(","), + roleId:that.roleId + }; + that.loading = true; + console.log("请求参数:",params); + saveRolePermission(params).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loading = false; + that.close(); + }else { + that.$message.error(res.message); + that.loading = false; + that.close(); + } + }) + }, + }, + watch: { + visible () { + if (this.visible) { + queryTreeList().then((res) => { + this.treeData = res.result.treeList + this.allTreeKeys = res.result.ids + queryRolePermission({roleId:this.roleId}).then((res)=>{ + this.checkedKeys = [...res.result]; + this.defaultCheckedKeys = [...res.result]; + this.expandedKeysss = this.allTreeKeys; + //console.log(this.defaultCheckedKeys) + }) + }) + } + } + } + } + +</script> +<style lang="scss" scoped> + .drawer-bootom-button { + position: absolute; + bottom: 0; + width: 100%; + border-top: 1px solid #e8e8e8; + padding: 10px 16px; + text-align: right; + left: 0; + background: #fff; + border-radius: 0 0 2px 2px; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/icon/Icon.less b/ant-design-jeecg-vue/src/views/system/modules/icon/Icon.less new file mode 100644 index 0000000..5e37187 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/icon/Icon.less @@ -0,0 +1,35 @@ +@active-color: #4a4a48; +ul { + max-height: 700px; + overflow-y: auto; + padding-left: .5rem; + i { + font-size: 1.5rem; + border: 1px solid #f1f1f1; + padding: .2rem; + margin: .3rem; + cursor: pointer; + &.active, &:hover { + border-radius: 2px; + border-color: @active-color; + background-color: @active-color; + color: #fff; + transition: all .3s; + } + } + li { + list-style: none; + float: left; + width: 5%; + text-align: center; + cursor: pointer; + color: #555; + transition: color .3s ease-in-out,background-color .3s ease-in-out; + position: relative; + margin: 3px 0; + border-radius: 4px; + background-color: #fff; + overflow: hidden; + padding: 10px 0 0; + } +} diff --git a/ant-design-jeecg-vue/src/views/system/modules/icon/Icons.vue b/ant-design-jeecg-vue/src/views/system/modules/icon/Icons.vue new file mode 100644 index 0000000..4b18ced --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/icon/Icons.vue @@ -0,0 +1,123 @@ +<template> + <a-modal + v-model="show" + :width="900" + :keyboard="false" + :closable="false" + :centered="true" + @ok="ok" + @cancel="cancel" + :maskClosable="false" + :mask="false" + okText="确认" + cancelText="取消"> + <a-tabs> + <a-tab-pane tab="方向性图标" key="1"> + <ul> + <li v-for="icon in icons.directionIcons" :key="icon"> + <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/> + </li> + </ul> + </a-tab-pane> + <a-tab-pane tab="指示性图标" key="2"> + <ul> + <li v-for="icon in icons.suggestionIcons" :key="icon"> + <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/> + </li> + </ul> + </a-tab-pane> + <a-tab-pane tab="编辑类图标" key="3"> + <ul> + <li v-for="icon in icons.editIcons" :key="icon"> + <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/> + </li> + </ul> + </a-tab-pane> + <a-tab-pane tab="数据类图标" key="4"> + <ul> + <li v-for="icon in icons.dataIcons" :key="icon"> + <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/> + </li> + </ul> + </a-tab-pane> + <a-tab-pane tab="网站通用图标" key="5"> + <ul> + <li v-for="icon in icons.webIcons" :key="icon"> + <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/> + </li> + </ul> + </a-tab-pane> + <a-tab-pane tab="品牌和标识" key="6"> + <ul> + <li v-for="icon in icons.logoIcons" :key="icon"> + <a-icon :type="icon" :title="icon" @click="chooseIcon(icon)" :class="{'active':activeIndex === icon}"/> + </li> + </ul> + </a-tab-pane> + </a-tabs> + </a-modal> +</template> +<script> +const directionIcons = ['step-backward', 'step-forward', 'fast-backward', 'fast-forward', 'shrink', 'arrows-alt', 'down', 'up', 'left', 'right', 'caret-up', 'caret-down', 'caret-left', 'caret-right', 'up-circle', 'down-circle', 'left-circle', 'right-circle', 'up-circle-o', 'down-circle-o', 'right-circle-o', 'left-circle-o', 'double-right', 'double-left', 'vertical-left', 'vertical-right', 'forward', 'backward', 'rollback', 'enter', 'retweet', 'swap', 'swap-left', 'swap-right', 'arrow-up', 'arrow-down', 'arrow-left', 'arrow-right', 'play-circle', 'play-circle-o', 'up-square', 'down-square', 'left-square', 'right-square', 'up-square-o', 'down-square-o', 'left-square-o', 'right-square-o', 'login', 'logout', 'menu-fold', 'menu-unfold', 'border-bottom', 'border-horizontal', 'border-inner', 'border-left', 'border-right', 'border-top', 'border-verticle', 'pic-center', 'pic-left', 'pic-right', 'radius-bottomleft', 'radius-bottomright', 'radius-upleft', 'radius-upright', 'fullscreen', 'fullscreen-exit'] +const suggestionIcons = ['question', 'question-circle', 'plus', 'plus-circle', 'pause', 'pause-circle', 'minus', 'minus-circle', 'plus-square', 'minus-square', 'info', 'info-circle', 'exclamation', 'exclamation-circle', 'close', 'close-circle', 'close-square', 'check', 'check-circle', 'check-square', 'clock-circle', 'warning', 'issues-close', 'stop'] +const editIcons = ['edit', 'form', 'copy', 'scissor', 'delete', 'snippets', 'diff', 'highlight', 'align-center', 'align-left', 'align-right', 'bg-colors', 'bold', 'italic', 'underline', 'strikethrough', 'redo', 'undo', 'zoom-in', 'zoom-out', 'font-colors', 'font-size', 'line-height', 'colum-height', 'dash', 'small-dash', 'sort-ascending', 'sort-descending', 'drag', 'ordered-list', 'radius-setting'] +const dataIcons = ['area-chart', 'pie-chart', 'bar-chart', 'dot-chart', 'line-chart', 'radar-chart', 'heat-map', 'fall', 'rise', 'stock', 'box-plot', 'fund', 'sliders'] +const webIcons = ['lock', 'unlock', 'bars', 'book', 'calendar', 'cloud', 'cloud-download', 'code', 'copy', 'credit-card', 'delete', 'desktop', 'download', 'ellipsis', 'file', 'file-text', 'file-unknown', 'file-pdf', 'file-word', 'file-excel', 'file-jpg', 'file-ppt', 'file-markdown', 'file-add', 'folder', 'folder-open', 'folder-add', 'hdd', 'frown', 'meh', 'smile', 'inbox', 'laptop', 'appstore', 'link', 'mail', 'mobile', 'notification', 'paper-clip', 'picture', 'poweroff', 'reload', 'search', 'setting', 'share-alt', 'shopping-cart', 'tablet', 'tag', 'tags', 'to-top', 'upload', 'user', 'video-camera', 'home', 'loading', 'loading-3-quarters', 'cloud-upload', 'star', 'heart', 'environment', 'eye', 'camera', 'save', 'team', 'solution', 'phone', 'filter', 'exception', 'export', 'customer-service', 'qrcode', 'scan', 'like', 'dislike', 'message', 'pay-circle', 'calculator', 'pushpin', 'bulb', 'select', 'switcher', 'rocket', 'bell', 'disconnect', 'database', 'compass', 'barcode', 'hourglass', 'key', 'flag', 'layout', 'printer', 'sound', 'usb', 'skin', 'tool', 'sync', 'wifi', 'car', 'schedule', 'user-add', 'user-delete', 'usergroup-add', 'usergroup-delete', 'man', 'woman', 'shop', 'gift', 'idcard', 'medicine-box', 'red-envelope', 'coffee', 'copyright', 'trademark', 'safety', 'wallet', 'bank', 'trophy', 'contacts', 'global', 'shake', 'api', 'fork', 'dashboard', 'table', 'profile', 'alert', 'audit', 'branches', 'build', 'border', 'crown', 'experiment', 'fire', 'money-collect', 'property-safety', 'read', 'reconciliation', 'rest', 'security-scan', 'insurance', 'interation', 'safety-certificate', 'project', 'thunderbolt', 'block', 'cluster', 'deployment-unit', 'dollar', 'euro', 'pound', 'file-done', 'file-exclamation', 'file-protect', 'file-search', 'file-sync', 'gateway', 'gold', 'robot', 'shopping'] +const logoIcons = ['android', 'apple', 'windows', 'ie', 'chrome', 'github', 'aliwangwang', 'dingding', 'weibo-square', 'weibo-circle', 'taobao-circle', 'html5', 'weibo', 'twitter', 'wechat', 'youtube', 'alipay-circle', 'taobao', 'skype', 'qq', 'medium-workmark', 'gitlab', 'medium', 'linkedin', 'google-plus', 'dropbox', 'facebook', 'codepen', 'amazon', 'google', 'codepen-circle', 'alipay', 'ant-design', 'aliyun', 'zhihu', 'slack', 'slack-square', 'behance', 'behance-square', 'dribbble', 'dribbble-square', 'instagram', 'yuque', 'alibaba', 'yahoo'] +export default { + name: 'Icons', + props: { + iconChooseVisible: { + default: false + } + }, + data () { + return { + icons: { + directionIcons, + suggestionIcons, + editIcons, + dataIcons, + webIcons, + logoIcons + }, + choosedIcon: '', + activeIndex: '' + } + }, + computed: { + show: { + get: function () { + return this.iconChooseVisible + }, + set: function () { + } + } + }, + methods: { + reset () { + this.activeIndex = '' + }, + chooseIcon (icon) { + this.activeIndex = icon + this.choosedIcon = icon + this.$message.success(`选中 ${icon}`) + }, + ok () { + if (this.choosedIcon === '') { + this.$message.warning('尚未选择任何图标') + return + } + this.reset() + this.$emit('choose', this.choosedIcon) + }, + cancel () { + this.reset() + this.$emit('close') + } + } +} +</script> +<style lang="less" scoped> +@import "Icon"; +</style> diff --git a/ant-design-jeecg-vue/src/views/user/Login.vue b/ant-design-jeecg-vue/src/views/user/Login.vue new file mode 100644 index 0000000..f836857 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/user/Login.vue @@ -0,0 +1,317 @@ +<template> + <div class="main"> + <a-form class="user-layout-login" ref="formLogin" :autoFormCreate="(form)=>{this.form = form}" id="formLogin"> + <a-tabs + :activeKey="customActiveKey" + :tabBarStyle="{ textAlign: 'center', borderBottom: 'unset' }" + @change="handleTabClick"> + <a-tab-pane key="tab1" tab="账号密码登陆"> + + <a-form-item + fieldDecoratorId="username" + :fieldDecoratorOptions="{rules: [{ required: true, message: '请输入帐户名或邮箱' }, { validator: this.handleUsernameOrEmail }], validateTrigger: 'change'}"> + <a-input size="large" type="text" placeholder="请输入帐户名 / jeecg"> + <a-icon slot="prefix" type="user" :style="{ color: 'rgba(0,0,0,.25)' }"/> + </a-input> + </a-form-item> + + <a-form-item + fieldDecoratorId="password" + :fieldDecoratorOptions="{rules: [{ required: true, message: '请输入密码' }], validateTrigger: 'blur'}"> + <a-input size="large" type="password" autocomplete="false" placeholder="密码 / 123456"> + <a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }"/> + </a-input> + </a-form-item> + </a-tab-pane> + <a-tab-pane key="tab2" tab="手机号登陆"> + <a-form-item + fieldDecoratorId="mobile" + :fieldDecoratorOptions="{rules: [{ required: true, pattern: /^1[34578]\d{9}$/, message: '请输入正确的手机号' }], validateTrigger: 'change'}"> + <a-input size="large" type="text" placeholder="手机号"> + <a-icon slot="prefix" type="mobile" :style="{ color: 'rgba(0,0,0,.25)' }"/> + </a-input> + </a-form-item> + + <a-row :gutter="16"> + <a-col class="gutter-row" :span="16"> + <a-form-item + fieldDecoratorId="captcha" + :fieldDecoratorOptions="{rules: [{ required: true, message: '请输入验证码' }], validateTrigger: 'blur'}"> + <a-input size="large" type="text" placeholder="验证码"> + <a-icon slot="prefix" type="mail" :style="{ color: 'rgba(0,0,0,.25)' }"/> + </a-input> + </a-form-item> + </a-col> + <a-col class="gutter-row" :span="8"> + <a-button + class="getCaptcha" + tabindex="-1" + :disabled="state.smsSendBtn" + @click.stop.prevent="getCaptcha" + v-text="!state.smsSendBtn && '获取验证码' || (state.time+' s')"></a-button> + </a-col> + </a-row> + </a-tab-pane> + </a-tabs> + + <a-form-item> + <a-checkbox v-model="formLogin.rememberMe">自动登陆</a-checkbox> + <router-link :to="{ name: 'recover', params: { user: 'aaa'} }" class="forge-password" style="float: right;"> + 忘记密码 + </router-link> + </a-form-item> + + <a-form-item style="margin-top:24px"> + <a-button + size="large" + type="primary" + htmlType="submit" + class="login-button" + :loading="loginBtn" + @click.stop.prevent="handleSubmit" + :disabled="loginBtn">确定 + </a-button> + </a-form-item> + + <div class="user-login-other"> + <span>其他登陆方式</span> + <a><a-icon class="item-icon" type="alipay-circle"></a-icon></a> + <a><a-icon class="item-icon" type="taobao-circle"></a-icon></a> + <a><a-icon class="item-icon" type="weibo-circle"></a-icon></a> + <router-link class="register" :to="{ name: 'register' }"> + 注册账户 + </router-link> + </div> + </a-form> + + <two-step-captcha + v-if="requiredTwoStepCaptcha" + :visible="stepCaptchaVisible" + @success="stepCaptchaSuccess" + @cancel="stepCaptchaCancel"></two-step-captcha> + </div> +</template> + +<script> + //import md5 from "md5" + import api from '@/api' + import TwoStepCaptcha from '@/components/tools/TwoStepCaptcha' + import { mapActions } from "vuex" + import { timeFix } from "@/utils/util" + import Vue from 'vue' + import { ACCESS_TOKEN } from "@/store/mutation-types" + + export default { + components: { + TwoStepCaptcha + }, + data () { + return { + customActiveKey: "tab1", + loginBtn: false, + // login type: 0 email, 1 username, 2 telephone + loginType: 0, + requiredTwoStepCaptcha: false, + stepCaptchaVisible: false, + form: null, + state: { + time: 60, + smsSendBtn: false, + }, + formLogin: { + username: "", + password: "", + captcha: "", + mobile: "", + rememberMe: true + }, + } + }, + created () { + Vue.ls.remove(ACCESS_TOKEN) + // update-begin- --- author:scott ------ date:20190225 ---- for:暂时注释,未实现登录验证码功能 +// this.$http.get('/auth/2step-code') +// .then(res => { +// this.requiredTwoStepCaptcha = res.result.stepCode +// }).catch(err => { +// console.log('2step-code:', err) +// }) + // update-end- --- author:scott ------ date:20190225 ---- for:暂时注释,未实现登录验证码功能 + // this.requiredTwoStepCaptcha = true + + }, + methods: { + ...mapActions([ "Login", "Logout" ]), + // handler + handleUsernameOrEmail (rule, value, callback) { + const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; + if (regex.test(value)) { + this.loginType = 0 + } else { + this.loginType = 1 + } + callback() + }, + handleTabClick (key) { + this.customActiveKey = key + // this.form.resetFields() + }, + handleSubmit () { + let that = this + let flag = false + + let loginParams = { + remember_me: that.formLogin.rememberMe + }; + + // 使用账户密码登陆 + if (that.customActiveKey === 'tab1') { + that.form.validateFields([ 'username', 'password' ], { force: true }, (err, values) => { + if (!err) { + flag = true + loginParams[!that.loginType ? 'email' : 'username'] = values.username + //loginParams.password = md5(values.password) + loginParams.password = values.password + } + }) + // 使用手机号登陆 + } else { + that.form.validateFields([ 'mobile', 'captcha' ], { force: true }, (err, values) => { + if (!err) { + flag = true + loginParams = Object.assign(loginParams, values) + } + }) + } + + if (!flag) return + + that.loginBtn = true + + that.Login(loginParams).then(() => { + if (that.requiredTwoStepCaptcha) { + that.stepCaptchaVisible = true + } else { + that.loginSuccess() + } + }).catch((err) => { + that.requestFailed(err); + }) + + }, + getCaptcha (e) { + e.preventDefault() + let that = this + + this.form.validateFields([ 'mobile' ], { force: true }, + (err) => { + if (!err) { + this.state.smsSendBtn = true; + + let interval = window.setInterval(() => { + if (that.state.time-- <= 0) { + that.state.time = 60; + that.state.smsSendBtn = false; + window.clearInterval(interval); + } + }, 1000); + + const hide = this.$message.loading('验证码发送中..', 0); + this.$http.post(api.SendSms, { mobile: that.formLogin.mobile }) + .then(res => { + setTimeout(hide, 2500); + this.$notification[ 'success' ]({ + message: '提示', + description: '验证码获取成功,您的验证码为:' + res.result.captcha, + duration: 8 + }) + }) + .catch(err => { + setTimeout(hide, 1); + clearInterval(interval); + that.state.time = 60; + that.state.smsSendBtn = false; + this.requestFailed(err); + }); + } + } + ); + }, + stepCaptchaSuccess () { + this.loginSuccess() + }, + stepCaptchaCancel () { + this.Logout().then(() => { + this.loginBtn = false + this.stepCaptchaVisible = false + }) + }, + loginSuccess () { + this.loginBtn = false + this.$router.push({ name: "dashboard" }) + this.$notification.success({ + message: '欢迎', + description: `${timeFix()},欢迎回来`, + }); + }, + requestFailed (err) { + this.$notification[ 'error' ]({ + message: '登录失败', + description: ((err.response || {}).data || {}).message || err.message || "请求出现错误,请稍后再试", + duration: 4, + }); + this.loginBtn = false; + }, + } + } +</script> + +<style lang="scss" scoped> + + .user-layout-login { + label { + font-size: 14px; + } + + .getCaptcha { + display: block; + width: 100%; + height: 40px; + } + + .forge-password { + font-size: 14px; + } + + button.login-button { + padding: 0 15px; + font-size: 16px; + height: 40px; + width: 100%; + } + + .user-login-other { + text-align: left; + margin-top: 24px; + line-height: 22px; + + .item-icon { + font-size: 24px; + color: rgba(0,0,0,.2); + margin-left: 16px; + vertical-align: middle; + cursor: pointer; + transition: color .3s; + + &:hover { + color: #1890ff; + } + } + + .register { + float: right; + } + } + } + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/user/Register.vue b/ant-design-jeecg-vue/src/views/user/Register.vue new file mode 100644 index 0000000..52008b7 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/user/Register.vue @@ -0,0 +1,316 @@ +<template> + <div class="main user-layout-register"> + <h3><span>注册</span></h3> + <a-form ref="formRegister" :autoFormCreate="(form)=>{this.form = form}" id="formRegister"> + <a-form-item + fieldDecoratorId="email" + :fieldDecoratorOptions="{rules: [{ required: true, type: 'email', message: '请输入邮箱地址' }], validateTrigger: ['change', 'blur']}"> + + <a-input size="large" type="text" placeholder="邮箱"></a-input> + </a-form-item> + + <a-popover placement="rightTop" trigger="click" :visible="state.passwordLevelChecked"> + <template slot="content"> + <div :style="{ width: '240px' }" > + <div :class="['user-register', passwordLevelClass]">强度:<span>{{ passwordLevelName }}</span></div> + <a-progress :percent="state.percent" :showInfo="false" :strokeColor=" passwordLevelColor " /> + <div style="margin-top: 10px;"> + <span>请至少输入 6 个字符。请不要使用容易被猜到的密码。</span> + </div> + </div> + </template> + <a-form-item + fieldDecoratorId="password" + :fieldDecoratorOptions="{rules: [{ required: true, message: '至少6位密码,区分大小写'}, { validator: this.handlePasswordLevel }], validateTrigger: ['change', 'blur']}"> + <a-input size="large" type="password" @click="handlePasswordInputClick" autocomplete="false" placeholder="至少6位密码,区分大小写"></a-input> + </a-form-item> + </a-popover> + + <a-form-item + fieldDecoratorId="password2" + :fieldDecoratorOptions="{rules: [{ required: true, message: '至少6位密码,区分大小写' }, { validator: this.handlePasswordCheck }], validateTrigger: ['change', 'blur']}"> + + <a-input size="large" type="password" autocomplete="false" placeholder="确认密码"></a-input> + </a-form-item> + + <a-form-item + fieldDecoratorId="mobile" + :fieldDecoratorOptions="{rules: [{ required: true, message: '请输入正确的手机号', pattern: /^1[3456789]\d{9}$/ }, { validator: this.handlePhoneCheck } ], validateTrigger: ['change', 'blur'] }"> + <a-input size="large" placeholder="11 位手机号"> + <a-select slot="addonBefore" size="large" defaultValue="+86"> + <a-select-option value="+86">+86</a-select-option> + <a-select-option value="+87">+87</a-select-option> + </a-select> + </a-input> + </a-form-item> + <!--<a-input-group size="large" compact> + <a-select style="width: 20%" size="large" defaultValue="+86"> + <a-select-option value="+86">+86</a-select-option> + <a-select-option value="+87">+87</a-select-option> + </a-select> + <a-input style="width: 80%" size="large" placeholder="11 位手机号"></a-input> + </a-input-group>--> + + <a-row :gutter="16"> + <a-col class="gutter-row" :span="16"> + <a-form-item + fieldDecoratorId="captcha" + :fieldDecoratorOptions="{rules: [{ required: true, message: '请输入验证码' }], validateTrigger: 'blur'}"> + <a-input size="large" type="text" placeholder="验证码"> + <a-icon slot="prefix" type="mail" :style="{ color: 'rgba(0,0,0,.25)' }"/> + </a-input> + </a-form-item> + </a-col> + <a-col class="gutter-row" :span="8"> + <a-button + class="getCaptcha" + size="large" + :disabled="state.smsSendBtn" + @click.stop.prevent="getCaptcha" + v-text="!state.smsSendBtn && '获取验证码'||(state.time+' s')"></a-button> + </a-col> + </a-row> + + <a-form-item> + <a-button + size="large" + type="primary" + htmlType="submit" + class="register-button" + :loading="registerBtn" + @click.stop.prevent="handleSubmit" + :disabled="registerBtn">注册 + </a-button> + <router-link class="login" :to="{ name: 'login' }">使用已有账户登录</router-link> + </a-form-item> + + </a-form> + </div> +</template> + +<script> + import { mixinDevice } from '@/utils/mixin.js' + import { getSmsCaptcha } from '@/api/login' + + const levelNames = { + 0: '低', + 1: '低', + 2: '中', + 3: '强' + } + const levelClass = { + 0: 'error', + 1: 'error', + 2: 'warning', + 3: 'success' + } + const levelColor = { + 0: '#ff0000', + 1: '#ff0000', + 2: '#ff7e05', + 3: '#52c41a', + } + export default { + name: "Register", + components: { + }, + mixins: [mixinDevice], + data() { + return { + form: null, + + state: { + time: 60, + smsSendBtn: false, + passwordLevel: 0, + passwordLevelChecked: false, + percent: 10, + progressColor: '#FF0000' + }, + registerBtn: false + } + }, + computed: { + passwordLevelClass () { + return levelClass[this.state.passwordLevel] + }, + passwordLevelName () { + return levelNames[this.state.passwordLevel] + }, + passwordLevelColor () { + return levelColor[this.state.passwordLevel] + } + }, + methods: { + + handlePasswordLevel (rule, value, callback) { + + let level = 0 + + // 判断这个字符串中有没有数字 + if (/[0-9]/.test(value)) { + level++ + } + // 判断字符串中有没有字母 + if (/[a-zA-Z]/.test(value)) { + level++ + } + // 判断字符串中有没有特殊符号 + if (/[^0-9a-zA-Z_]/.test(value)) { + level++ + } + this.state.passwordLevel = level + this.state.percent = level * 30 + if (level >= 2) { + if (level >= 3) { + this.state.percent = 100 + } + callback() + } else { + if (level === 0) { + this.state.percent = 10 + } + callback(new Error('密码强度不够')) + } + }, + + handlePasswordCheck (rule, value, callback) { + let password = this.form.getFieldValue('password') + console.log('value', value) + if (value === undefined) { + callback(new Error('请输入密码')) + } + if (value && password && value.trim() !== password.trim()) { + callback(new Error('两次密码不一致')) + } + callback() + }, + + handlePhoneCheck (rule, value, callback) { + console.log('handlePhoneCheck, rule:', rule) + console.log('handlePhoneCheck, value', value) + console.log('handlePhoneCheck, callback', callback) + + callback() + }, + + handlePasswordInputClick () { + if (!this.isMobile()) { + this.state.passwordLevelChecked = true + return; + } + this.state.passwordLevelChecked = false + }, + + handleSubmit() { + this.form.validateFields((err, values) => { + if (!err) { + this.$router.push({ name: 'registerResult', params: {...values} }) + } + }) + }, + + getCaptcha(e) { + e.preventDefault() + let that = this + + this.form.validateFields(['mobile'], {force: true}, + (err, values) => { + if (!err) { + this.state.smsSendBtn = true; + + let interval = window.setInterval(() => { + if (that.state.time-- <= 0) { + that.state.time = 60; + that.state.smsSendBtn = false; + window.clearInterval(interval); + } + }, 1000); + + const hide = this.$message.loading('验证码发送中..', 0); + + getSmsCaptcha({mobile: values.mobile}).then(res => { + setTimeout(hide, 2500); + this.$notification['success']({ + message: '提示', + description: '验证码获取成功,您的验证码为:' + res.result.captcha, + duration: 8 + }) + }).catch(err => { + setTimeout(hide, 1); + clearInterval(interval); + that.state.time = 60; + that.state.smsSendBtn = false; + this.requestFailed(err); + }); + } + } + ); + }, + requestFailed(err) { + this.$notification['error']({ + message: '错误', + description: ((err.response || {}).data || {}).message || "请求出现错误,请稍后再试", + duration: 4, + }); + this.registerBtn = false; + }, + }, + watch: { + 'state.passwordLevel' (val) { + console.log(val) + + } + } + } +</script> +<style lang="scss"> + .user-register { + + &.error { + color: #ff0000; + } + + &.warning { + color: #ff7e05; + } + + &.success { + color: #52c41a; + } + + + } + + .user-layout-register { + .ant-input-group-addon:first-child { + background-color: #fff; + } + } +</style> +<style lang="scss" scoped> + .user-layout-register { + + & > h3 { + font-size: 16px; + margin-bottom: 20px; + } + + + + .getCaptcha { + display: block; + width: 100%; + height: 40px; + } + + .register-button { + width: 50%; + } + + .login { + float: right; + line-height: 40px; + } + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/user/RegisterResult.vue b/ant-design-jeecg-vue/src/views/user/RegisterResult.vue new file mode 100644 index 0000000..e471f19 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/user/RegisterResult.vue @@ -0,0 +1,50 @@ +<template> + <result + :isSuccess="true" + :content="false" + :title="email" + :description="description"> + + <template slot="action"> + <a-button size="large" type="primary">查看邮箱</a-button> + <a-button size="large" style="margin-left: 8px" @click="goHomeHandle">返回首页</a-button> + </template> + + </result> +</template> + +<script> + import Result from '@/views/result/Result' + + export default { + name: "RegisterResult", + components: { + Result + }, + data () { + return { + description: '激活邮件已发送到你的邮箱中,邮件有效期为24小时。请及时登录邮箱,点击邮件中的链接激活帐户。', + form: {} + } + }, + computed: { + email () { + let v = this.form && this.form.email || 'xxx' + let title = `你的账户:${v} 注册成功` + return title + } + }, + created () { + this.form = this.$route.params + }, + methods: { + goHomeHandle () { + this.$router.push({ name: 'login' }) + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/vue.config.js b/ant-design-jeecg-vue/vue.config.js new file mode 100644 index 0000000..f3cf6da --- /dev/null +++ b/ant-design-jeecg-vue/vue.config.js @@ -0,0 +1,73 @@ +const path = require('path') + +function resolve(dir) { + return path.join(__dirname, dir) +} + +// vue.config.js +module.exports = { + /* + Vue-cli3: + Crashed when using Webpack `import()` #2463 + https://github.com/vuejs/vue-cli/issues/2463 + + */ + /* + pages: { + index: { + entry: 'src/main.js', + chunks: ['chunk-vendors', 'chunk-common', 'index'] + } + }, + */ + configureWebpack: {}, + + chainWebpack: (config) => { + config.resolve.alias + .set('@$', resolve('src')) + .set('@api', resolve('src/api')) + .set('@assets', resolve('src/assets')) + .set('@comp', resolve('src/components')) + .set('@views', resolve('src/views')) + .set('@layout', resolve('src/layout')) + .set('@static', resolve('src/static')) + }, + + css: { + loaderOptions: { + less: { + modifyVars: { + /* less 变量覆盖,用于自定义 ant design 主题 */ + + /* + 'primary-color': '#F5222D', + 'link-color': '#F5222D', + 'border-radius-base': '4px', + */ + }, + javascriptEnabled: true, + } + } + }, + + devServer: { + port: 3000, + proxy: { + /* '/api': { + target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro', //mock API接口系统 + ws: false, + changeOrigin: true, + pathRewrite: { + '/jeecg-boot': '' //默认所有请求都加了jeecg-boot前缀,需要去掉 + } + },*/ + '/jeecg-boot': { + target: 'http://localhost:8080', //请求本地 需要jeecg-boot后台项目 + ws: false, + changeOrigin: true + }, + } + }, + + lintOnSave: undefined +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/yarn.lock b/ant-design-jeecg-vue/yarn.lock new file mode 100644 index 0000000..d225534 --- /dev/null +++ b/ant-design-jeecg-vue/yarn.lock @@ -0,0 +1,9448 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@antv/adjust@~0.1.0": + version "0.1.0" + resolved "http://registry.npm.taobao.org/@antv/adjust/download/@antv/adjust-0.1.0.tgz#c4bce8ba0aef7cd5b3bf271f75f434c07bd215a0" + integrity sha1-xLzougrvfNWzvycfdfQ0wHvSFaA= + dependencies: + "@antv/util" "~1.3.1" + +"@antv/attr@~0.1.2": + version "0.1.2" + resolved "http://registry.npm.taobao.org/@antv/attr/download/@antv/attr-0.1.2.tgz#2eeb122fcaaf851a2d8749abc7c60519d3f77e37" + integrity sha1-LusSL8qvhRoth0mrx8YFGdP3fjc= + dependencies: + "@antv/util" "~1.3.1" + +"@antv/component@~0.3.1": + version "0.3.1" + resolved "http://registry.npm.taobao.org/@antv/component/download/@antv/component-0.3.1.tgz#25eb53e3ed3a0f413896be2f83e7e704bfb6b097" + integrity sha1-JetT4+06D0E4lr4vg+fnBL+2sJc= + dependencies: + "@antv/attr" "~0.1.2" + "@antv/g" "~3.3.5" + "@antv/util" "~1.3.1" + wolfy87-eventemitter "~5.1.0" + +"@antv/coord@~0.1.0": + version "0.1.0" + resolved "http://registry.npm.taobao.org/@antv/coord/download/@antv/coord-0.1.0.tgz#48a80ae36d07552f96657e7f8095227c63f0c0a9" + integrity sha1-SKgK420HVS+WZX5/gJUifGPwwKk= + dependencies: + "@antv/util" "~1.3.1" + +"@antv/data-set@^0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@antv/data-set/-/data-set-0.10.1.tgz#b8b103f166362508a91f69c8d0a989dbcf046ed5" + integrity sha512-Pg2VO2i3euZke9sUZgU84Ywb/zrYQTBPMRKOgRJTvyBaTHJXAzbKYSJII5e+a2tkOR4t/sHcp0zE4Lwkrb4RRw== + dependencies: + "@antv/hierarchy" "~0.4.0" + "@antv/util" "~1.3.1" + d3-array "~1.2.0" + d3-composite-projections "~1.2.0" + d3-dsv "~1.0.5" + d3-geo "~1.6.4" + d3-geo-projection "~2.1.2" + d3-hexjson "~1.0.1" + d3-hierarchy "~1.1.5" + d3-sankey "~0.7.1" + d3-voronoi "~1.1.2" + dagre "~0.8.2" + point-at-length "~1.0.2" + regression "~2.0.0" + simple-statistics "~6.1.0" + topojson-client "~3.0.0" + wolfy87-eventemitter "~5.1.0" + +"@antv/g2-brush@^0.0.2": + version "0.0.2" + resolved "http://registry.npm.taobao.org/@antv/g2-brush/download/@antv/g2-brush-0.0.2.tgz#0b65f3ebbf82690202913d0b6759ab2900faa841" + integrity sha1-C2Xz67+CaQICkT0LZ1mrKQD6qEE= + +"@antv/g2-plugin-slider@^2.1.0": + version "2.1.0" + resolved "http://registry.npm.taobao.org/@antv/g2-plugin-slider/download/@antv/g2-plugin-slider-2.1.0.tgz#7f2f5879d33dcfb14dd2b955092ca198ad9152b9" + integrity sha1-fy9YedM9z7FN0rlVCSyhmK2RUrk= + +"@antv/g2@^3.3.0": + version "3.4.5" + resolved "http://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.4.5.tgz#87b8b169f38af318b42e93c4cd5323f20d2d01fb" + integrity sha1-h7ixafOK8xi0LpPEzVMj8g0tAfs= + dependencies: + "@antv/adjust" "~0.1.0" + "@antv/attr" "~0.1.2" + "@antv/component" "~0.3.1" + "@antv/coord" "~0.1.0" + "@antv/g" "~3.3.5" + "@antv/scale" "~0.1.0" + "@antv/util" "~1.3.1" + venn.js "~0.2.20" + wolfy87-eventemitter "~5.1.0" + +"@antv/g@~3.3.5": + version "3.3.5" + resolved "http://registry.npm.taobao.org/@antv/g/download/@antv/g-3.3.5.tgz#9959baad1b85199614e591c9926879afb1fbb943" + integrity sha1-mVm6rRuFGZYU5ZHJkmh5r7H7uUM= + dependencies: + "@antv/gl-matrix" "~2.7.1" + "@antv/util" "~1.3.1" + d3-ease "~1.0.3" + d3-interpolate "~1.1.5" + d3-timer "~1.0.6" + wolfy87-eventemitter "~5.1.0" + +"@antv/gl-matrix@^2.7.1", "@antv/gl-matrix@~2.7.1": + version "2.7.1" + resolved "http://registry.npm.taobao.org/@antv/gl-matrix/download/@antv/gl-matrix-2.7.1.tgz#acb8e37f7ab3df01345aba4372d7942be42eba14" + integrity sha1-rLjjf3qz3wE0WrpDcteUK+QuuhQ= + +"@antv/hierarchy@~0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@antv/hierarchy/-/hierarchy-0.4.0.tgz#712b5b4477ee0b8b8db174c682b5356b0411aab6" + integrity sha512-ols+m+Z8QA4895SWMTOSjVImOX4tEbWQTwJ0NE+WATc0WLSKs6D9y2yaR+ZWt6P60BMGVIKS6lIfabO3CwGgnQ== + dependencies: + "@antv/util" "~1.3.1" + +"@antv/scale@~0.1.0": + version "0.1.0" + resolved "http://registry.npm.taobao.org/@antv/scale/download/@antv/scale-0.1.0.tgz#2b5459a100f97aac04781376d53904ccab18aab7" + integrity sha1-K1RZoQD5eqwEeBN21TkEzKsYqrc= + dependencies: + "@antv/util" "~1.3.1" + fecha "~2.3.3" + +"@antv/util@~1.3.1": + version "1.3.1" + resolved "http://registry.npm.taobao.org/@antv/util/download/@antv/util-1.3.1.tgz#30a34b201ff9126ec0d58c72c8166a9c3e644ccd" + integrity sha1-MKNLIB/5Em7A1YxyyBZqnD5kTM0= + dependencies: + "@antv/gl-matrix" "^2.7.1" + +"@babel/code-frame@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + integrity sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g== + dependencies: + "@babel/highlight" "7.0.0-beta.44" + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha1-BuKrGb21NThVWaq7W6WXKUgoAPg= + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.0.0", "@babel/core@^7.1.2": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.6.tgz#3733cbee4317429bc87c62b29cf8587dba7baeb3" + integrity sha512-Hz6PJT6e44iUNpAn8AoyAs6B3bl60g7MJQaI0rZEar6ECzh6+srYO1xlIdssio34mPaUtAb1y+XlkkSJzok3yw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.1.6" + "@babel/helpers" "^7.1.5" + "@babel/parser" "^7.1.6" + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.1.6" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + integrity sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ== + dependencies: + "@babel/types" "7.0.0-beta.44" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/generator@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.6.tgz#001303cf87a5b9d093494a4bf251d7b5d03d3999" + integrity sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ== + dependencies: + "@babel/types" "^7.1.6" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha1-Mj053QtQ4Qx8Bsp9djjmhk2MXDI= + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha1-a2lijf5Ah3mODE7Zjj1Kay+9L18= + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/helper-call-delegate/download/@babel/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha1-apV/EF83dV6GRTQ9MDiiLhRJzEo= + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + integrity sha1-O3TK7DKbPIDBFikIh8DdmuRowgw= + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha1-U3+hP28WdN90WwwA7I/k6ZaByPY= + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + integrity sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg== + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.44" + "@babel/template" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha1-oM6wFoX3M1XUNgwSR/WCv6/I/1M= + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha1-g1ctQyDipGVyY3NBE8QoaLZOScM= + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha1-Rq3ExedYZFrnpF3rkrqwkYwju4g= + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha1-jNFLCg33/wDwCefXpDaUX0fHoW8= + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha1-lggbcRHkhtpNLNlxrRpP4hbMLj0= + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" + integrity sha1-Rw1PlnbZ+tULMkzczl+6u8PaV4c= + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha1-opIMVwKwc8Fd5REGIAqoytIEl9U= + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha1-u7P77phmHFaQNCN8wDlnupm08lA= + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha1-LBcYkjtX+bvmRwX/5WQKxk2b2yc= + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha1-Nh2AghtvONp1vT8HheziCojF/n8= + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" + integrity sha1-X8Md5SLsDvCJncmz589qXdZV82I= + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha1-Ze65VMjCRb6qToWdphiPOdceWFw= + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + integrity sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA== + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha1-Oq4oXAMRwqsJXZl7jJqUytVH2BM= + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66" + integrity sha1-jPVOkZBwYGfwFq+Pdcs9+CnMjGY= + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helpers@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.5.tgz#68bfc1895d685f2b8f1995e788dbfe1f6ccb1996" + integrity sha512-2jkcdL02ywNBry1YNFAH/fViq4fXG0vdckHqeJk+75fpQ2OH+Az6076tX/M0835zA45E0Cqa6pV5Kiv9YOqjEg== + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.1.5" + +"@babel/highlight@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + integrity sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha1-9xDDjI1Fjm3ZogGvtjf8t4HOmeQ= + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.1.2", "@babel/parser@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.6.tgz#16e97aca1ec1062324a01c5a6a7d0df8dd189854" + integrity sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ== + +"@babel/plugin-proposal-async-generator-functions@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce" + integrity sha1-QcGnAuEAgUVuI6e3TYkZIt0bts4= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + +"@babel/plugin-proposal-class-properties@^7.0.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz#9af01856b1241db60ec8838d84691aa0bd1e8df4" + integrity sha512-/PCJWN+CKt5v1xcGn4vnuu13QDoV+P7NcICP44BoonAJoPSGwVkgrXihFIQGiEjjPlUDBIw1cM7wYFLARS2/hw== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + +"@babel/plugin-proposal-decorators@^7.1.0": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.6.tgz#460c31edbd01953efe45d491583b3ec31661d689" + integrity sha512-U42f8KhUbtlhUDyV/wK4Rq/wWh8vWyttYABckG/v0vVnMPvayOewZC/83CbVdmyP+UhEqI368FEQ7hHMfhBpQA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.1.0" + +"@babel/plugin-proposal-json-strings@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" + integrity sha1-O017XPUeHy5w9SNR0o1E/Clw0B4= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.0.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" + integrity sha1-mhe1R/ZNBna2yc7NTt90qCq4Xn4= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" + integrity sha1-thDZKP5VH/cRfULIu0EO7DEqZCU= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" + integrity sha1-SYs5zXJTbNfEsmF30DAibroIzTM= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" + integrity sha1-vwiR3Nv1lVg1nQxib9yUkOILwTw= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-class-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0.tgz#e051af5d300cbfbcec4a7476e37a803489881634" + integrity sha512-cR12g0Qzn4sgkjrbrzWy2GE7m9vMl/sFkqZ3gIpAQdrvPDnLM8180i+ANDFIXfjHo9aqp0ccJlQ0QNZcFUbf9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-decorators@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.1.0.tgz#2fa7c1a7905a299c9853ebcef340306675f9cbdc" + integrity sha512-uQvRSbgQ0nQg3jsmIixXXDCgSpkBolJ9X7NYThMKCcjvE8dN2uWJUzTUNNAeuKOjARTd+wUQV0ztXpgunZYKzQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0.tgz#6dfb7d8b6c3be14ce952962f658f3b7eb54c33ee" + integrity sha512-Gt9xNyRrCHCiyX/ZxDGOcBnlJl0I3IWicpZRC4CdC0P5a/I07Ya2OAMEBU+J7GmRFVmIetqEYRko6QYRuKOESw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" + integrity sha1-DSWaaAkOFbODzjcQ4B1bI/N3DL0= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz#034d5e2b4e14ccaea2e4c137af7e4afb39375ffd" + integrity sha512-PdmL2AoPsCLWxhIr3kG2+F9v4WH06Q3z+NoGVpQgnUNGcagXHq5sB3OXxkSahKq9TLdNMN/AJzFYSOo8UKDMHg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" + integrity sha1-N9j7yvIWvWWOoa6764t16I68VJs= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" + integrity sha1-iG9yAIs6ixhZd/fLcHE7ReUe5HU= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" + integrity sha1-psFIdYSMaKO0sxY6SGU17yXH50k= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" + integrity sha1-EJ4DZJbFHdZYV+FqyrO6/fPFeBE= + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" + integrity sha1-SCs/dRA5J+NyiLO2e2X4SOKqDQc= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.1.5.tgz#3e8e0bc9a5104519923302a24f748f72f2f61f37" + integrity sha512-jlYcDrz+5ayWC7mxgpn1Wj8zj0mmjCT2w0mPIMSwO926eXBRxpEgoN/uQVRBfjtr8ayjcmS+xk2G1jaP8JjMJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" + integrity sha1-qz+KVkNhgAy8irHKbyEQgDhDIkk= + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" + integrity sha1-L7uJAM0+gljyou3pCbkOdVYYXjE= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.1.3" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.1.3.tgz#e69ff50ca01fac6cb72863c544e516c2b193012f" + integrity sha1-5p/1DKAfrGy3KGPFROUWwrGTAS8= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" + integrity sha1-c6JNppvDw3AlH0Oj0EgZhUYRXlg= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" + integrity sha1-oGAeWAmR58rOCA5M+RnP1Y2nToY= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" + integrity sha1-nDTC7n/XfgJ3nPo35AOi4QA8zHM= + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" + integrity sha1-8rpOrbg70X3Dx+mzD0cHNl4cPjk= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" + integrity sha1-KcVVDVxGII5/cwUW1B7t3Ur/rbs= + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" + integrity sha1-KuwdKc3STEBzWckwzdiekU7o/4Y= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.1.0.tgz#f9e0a7072c12e296079b5a59f408ff5b97bf86a8" + integrity sha1-+eCnBywS4pYHm1pZ9Aj/W5e/hqg= + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" + integrity sha1-Cp2GRRy7+ym9FRhjBol8Z/b5oFw= + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.0.0": + version "7.1.3" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.1.3.tgz#2119a3e3db612fd74a19d88652efbfe9613a5db0" + integrity sha1-IRmj49thL9dKGdiGUu+/6WE6XbA= + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.1.0.tgz#a29a7d85d6f28c3561c33964442257cc6a21f2a8" + integrity sha1-opp9hdbyjDVhwzlkRCJXzGoh8qg= + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + integrity sha1-ro+9iVF/p4ktIOZWTmQeh3DDqko= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" + integrity sha1-sa4ZSgVLgm2NS6fKkUhtStoPkbs= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.1.0": + version "7.1.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" + integrity sha1-RPSS+dYYyRJAJuYjAcKWv2Bqeu0= + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + integrity sha1-W0Foa07UC++HTX7WqEvdhJwT4ME= + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-runtime@^7.0.0", "@babel/plugin-transform-runtime@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz#9f76920d42551bb577e2dc594df229b5f7624b63" + integrity sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" + integrity sha1-hfivWS3MB2R1QaA1DoyVx79BnRU= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" + integrity sha1-k1g85I3YyF5T86RgVshW5K8wtJs= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" + integrity sha1-MKnWSsKrRu7Ah7hTBTW+zZDnM2Y= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" + integrity sha1-CE8ZUu/lsVPdrmnriUX4gsepfGU= + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" + integrity sha1-Tc8eUulD5SZ7cxO/80f9vg+Bzsk= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.0.0" + resolved "http://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" + integrity sha1-xngOWxhjp2/nktkO3tn81bUdaPw= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.1.0": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.6.tgz#a0bf4b96b6bfcf6e000afc5b72b4abe7cc13ae97" + integrity sha512-YIBfpJNQMBkb6MCkjz/A9J76SNCSuGVamOVBgoUkLzpJD/z8ghHi9I42LQ4pulVX68N/MmImz6ZTixt7Azgexw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.1.0" + "@babel/plugin-proposal-json-strings" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.1.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.1.5" + "@babel/plugin-transform-classes" "^7.1.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-dotall-regex" "^7.0.0" + "@babel/plugin-transform-duplicate-keys" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.1.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.1.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.1.0" + "@babel/plugin-transform-modules-commonjs" "^7.1.0" + "@babel/plugin-transform-modules-systemjs" "^7.0.0" + "@babel/plugin-transform-modules-umd" "^7.1.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.1.0" + "@babel/plugin-transform-parameters" "^7.1.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typeof-symbol" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + browserslist "^4.1.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/runtime@^7.0.0": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.5.tgz#4170907641cf1f61508f563ece3725150cc6fe39" + integrity sha512-xKnPpXG/pvK1B90JkwwxSGii90rQGKtzcMt2gI5G6+M0REXaq6rOHsGC2ay6/d0Uje7zzvSzjEzfR3ENhFlrfA== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/template@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + lodash "^4.2.0" + +"@babel/template@^7.1.0", "@babel/template@^7.1.2": + version "7.1.2" + resolved "http://registry.npm.taobao.org/@babel/template/download/@babel/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + integrity sha1-CQSEpXT+9aLS13JqZ07O2lxbVkQ= + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" + +"@babel/traverse@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" + integrity sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA== + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/generator" "7.0.0-beta.44" + "@babel/helper-function-name" "7.0.0-beta.44" + "@babel/helper-split-export-declaration" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + debug "^3.1.0" + globals "^11.1.0" + invariant "^2.2.0" + lodash "^4.2.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.6.tgz#c8db9963ab4ce5b894222435482bd8ea854b7b5c" + integrity sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.1.6" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.6" + "@babel/types" "^7.1.6" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.10" + +"@babel/types@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" + integrity sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ== + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.5", "@babel/types@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.6.tgz#0adb330c3a281348a190263aceb540e10f04bcce" + integrity sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w== + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + +"@intervolga/optimize-cssnano-plugin@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz#be7c7846128b88f6a9b1d1261a0ad06eb5c0fdf8" + integrity sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA== + dependencies: + cssnano "^4.0.0" + cssnano-preset-default "^4.0.0" + postcss "^7.0.0" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz#54c5a964462be3d4d78af631363c18d6fa91ac26" + integrity sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw== + +"@types/d3-format@*": + version "1.3.0" + resolved "http://registry.npm.taobao.org/@types/d3-format/download/@types/d3-format-1.3.0.tgz#c5e115fac8e6861ce656fe9861892b22f6b0cfcb" + integrity sha1-xeEV+sjmhhzmVv6YYYkrIvawz8s= + +"@types/lodash@*": + version "4.14.118" + resolved "http://registry.npm.taobao.org/@types/lodash/download/@types/lodash-4.14.118.tgz#247bab39bfcc6d910d4927c6e06cbc70ec376f27" + integrity sha1-JHurOb/MbZENSSfG4Gy8cOw3byc= + +"@types/node@*": + version "10.12.11" + resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-10.12.11.tgz#715c476c99a5f6898a1ae61caf9825e43c03912e" + integrity sha1-cVxHbJml9omKGuYcr5gl5DwDkS4= + +"@types/node@^8.0.53": + version "8.10.38" + resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-8.10.38.tgz#e05c201a668492e534b48102aca0294898f449f6" + integrity sha1-4FwgGmaEkuU0tIECrKApSJj0SfY= + +"@vue/babel-preset-app@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-3.2.0.tgz#a443acdbd34f66d7645db271d9ac58fbe4fe870d" + integrity sha512-yDPMhdeOnQ49EOsOnHXJZQ4aR+g+TZVkImUjRBN90MKv9V1C9HXxhU73Je6pWUQaJ0yugMr5jl058ns6Mx6mNA== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-decorators" "^7.1.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/preset-env" "^7.0.0" + "@babel/runtime" "^7.0.0" + babel-helper-vue-jsx-merge-props "^2.0.3" + babel-plugin-dynamic-import-node "^2.2.0" + babel-plugin-transform-vue-jsx "^4.0.1" + core-js "^2.5.7" + +"@vue/cli-overlay@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-3.2.0.tgz#bb5d781914bb5af97d92410babbaa3720707b728" + integrity sha512-RKMSfgTtRs4VOXQhmbrNZJaCCheshebji9NcPNGyXzukCMBtoAbu3cG9HxizCSUA//oFFAdPP5BGeHvv0cpu/A== + +"@vue/cli-plugin-babel@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-3.2.0.tgz#5548e052f07512156942f50dcf18948ad29be7ec" + integrity sha512-HRhwsUIZ9DZYH+cVS8O0Qfk2W43vKpl5/JcvCS8YWWmRjwZjjHtRDifnfQuLC3Q0cUMTcv4bv8vnPMtkAbvXKg== + dependencies: + "@babel/core" "^7.0.0" + "@vue/babel-preset-app" "^3.2.0" + babel-loader "^8.0.4" + +"@vue/cli-plugin-eslint@^3.2.0": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.2.1.tgz#4dc353add93023363bf4c6b347e64472d1f2f432" + integrity sha512-Z/eQw18FjTypMMryNg8WCYJxEBmSAtnzukRWWNFwqNnh2zM/2J6yR4dYhsyjNtMEMUOnQsAsJnqgw45rLu8sJg== + dependencies: + "@vue/cli-shared-utils" "^3.2.0" + babel-eslint "^10.0.1" + eslint "^4.19.1" + eslint-loader "^2.1.1" + eslint-plugin-vue "^4.7.1" + globby "^8.0.1" + +"@vue/cli-service@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-3.2.0.tgz#96e8ee7b33a911ab71710c126ab55cd64c2a4c51" + integrity sha512-HTiaz1IBXV/JCfrmyhHJvDOYpPTBK0uQAekSVRTt5AddCeOV68ktdUqHbDe3VPDfrWFA5x3d3kIHlJd6WK31mA== + dependencies: + "@intervolga/optimize-cssnano-plugin" "^1.0.5" + "@vue/cli-overlay" "^3.2.0" + "@vue/cli-shared-utils" "^3.2.0" + "@vue/preload-webpack-plugin" "^1.1.0" + "@vue/web-component-wrapper" "^1.2.0" + acorn "^6.0.4" + acorn-walk "^6.1.1" + address "^1.0.3" + autoprefixer "^8.6.5" + cache-loader "^1.2.5" + case-sensitive-paths-webpack-plugin "^2.1.2" + chalk "^2.4.1" + clipboardy "^1.2.3" + cliui "^4.1.0" + copy-webpack-plugin "^4.6.0" + css-loader "^1.0.1" + cssnano "^4.1.7" + debug "^4.1.0" + escape-string-regexp "^1.0.5" + file-loader "^2.0.0" + friendly-errors-webpack-plugin "^1.7.0" + fs-extra "^7.0.1" + globby "^8.0.1" + hash-sum "^1.0.2" + html-webpack-plugin "^3.2.0" + launch-editor-middleware "^2.2.1" + lodash.defaultsdeep "^4.6.0" + lodash.mapvalues "^4.6.0" + lodash.transform "^4.6.0" + mini-css-extract-plugin "^0.4.5" + minimist "^1.2.0" + ora "^3.0.0" + portfinder "^1.0.19" + postcss-loader "^3.0.0" + read-pkg "^4.0.1" + semver "^5.6.0" + slash "^2.0.0" + source-map-url "^0.4.0" + ssri "^6.0.1" + string.prototype.padend "^3.0.0" + terser-webpack-plugin "^1.1.0" + thread-loader "^1.2.0" + url-loader "^1.1.2" + vue-loader "^15.4.2" + webpack "^4.26.1" + webpack-bundle-analyzer "^3.0.3" + webpack-chain "^4.11.0" + webpack-dev-server "^3.1.14" + webpack-merge "^4.1.4" + yorkie "^2.0.0" + +"@vue/cli-shared-utils@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-3.2.0.tgz#504037063c2a4a346dc35c9652bd3863da4816e7" + integrity sha512-FCX5ABFg5pWhomyXLpCaogJktMvjsS5d4Mn5BfvqcJxCvzOX6ze8ihFK3u//XMeM78dOFpHSjxnRSvHtkEwgsg== + dependencies: + chalk "^2.4.1" + execa "^1.0.0" + joi "^13.0.0" + launch-editor "^2.2.1" + lru-cache "^4.1.3" + node-ipc "^9.1.1" + opn "^5.3.0" + ora "^2.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + semver "^5.5.0" + string.prototype.padstart "^3.0.0" + +"@vue/component-compiler-utils@^2.0.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-2.2.0.tgz#bbbb7ed38a9a8a7c93abe7ef2e54a90a04b631b4" + integrity sha512-pS4zlcdD7BvedyB+IfiTfrbi6C977UMIfulSk8r6uL0BU46ZE2+fUj/zbSNSfVxeaj9ElmnSni5OMwF9np+b+w== + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^6.0.20" + postcss-selector-parser "^3.1.1" + prettier "1.13.7" + source-map "^0.5.6" + vue-template-es2015-compiler "^1.6.0" + +"@vue/eslint-config-standard@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@vue/eslint-config-standard/-/eslint-config-standard-4.0.0.tgz#6be447ee674e3b0f733c584098fd9a22e6d76fcd" + integrity sha512-bQghq1cw1BuMRHNhr3tRpAJx1tpGy0QtajQX873kLtA9YVuOIoXR7nAWnTN09bBHnSUh2N288vMsqPi2fI4Hzg== + dependencies: + eslint-config-standard "^12.0.0" + eslint-plugin-import "^2.14.0" + eslint-plugin-node "^8.0.0" + eslint-plugin-promise "^4.0.1" + eslint-plugin-standard "^4.0.0" + +"@vue/preload-webpack-plugin@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.0.tgz#d768dba004261c029b53a77c5ea2d5f9ee4f3cce" + integrity sha512-rcn2KhSHESBFMPj5vc5X2pI9bcBNQQixvJXhD5gZ4rN2iym/uH2qfDSQfUS5+qwiz0a85TCkeUs6w6jxFDudbw== + +"@vue/web-component-wrapper@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz#bb0e46f1585a7e289b4ee6067dcc5a6ae62f1dd1" + integrity sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw== + +"@webassemblyjs/ast@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" + integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== + dependencies: + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + +"@webassemblyjs/floating-point-hex-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" + integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== + +"@webassemblyjs/helper-api-error@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" + integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== + +"@webassemblyjs/helper-buffer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" + integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== + +"@webassemblyjs/helper-code-frame@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" + integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== + dependencies: + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/helper-fsm@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" + integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== + +"@webassemblyjs/helper-module-context@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" + integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== + +"@webassemblyjs/helper-wasm-bytecode@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" + integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== + +"@webassemblyjs/helper-wasm-section@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" + integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + +"@webassemblyjs/ieee754@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" + integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" + integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== + dependencies: + "@xtuc/long" "4.2.1" + +"@webassemblyjs/utf8@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" + integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== + +"@webassemblyjs/wasm-edit@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" + integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/helper-wasm-section" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-opt" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/wasm-gen@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" + integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wasm-opt@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" + integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + +"@webassemblyjs/wasm-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" + integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wast-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" + integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/floating-point-hex-parser" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-code-frame" "1.7.11" + "@webassemblyjs/helper-fsm" "1.7.11" + "@xtuc/long" "4.2.1" + +"@webassemblyjs/wast-printer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" + integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + "@xtuc/long" "4.2.1" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "http://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A= + +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "http://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + integrity sha1-XIXWYvdvodNFdXZsXc1mFavNMNg= + +abbrev@1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg= + +abs-svg-path@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" + integrity sha1-32Acjo0roQ1KdtYl4japo5wnI78= + +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/acorn-dynamic-import/download/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + integrity sha1-kBzu5Mf6rvfgetKkfokGddpQong= + dependencies: + acorn "^5.0.0" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= + dependencies: + acorn "^3.0.4" + +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + +acorn-walk@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= + +acorn@^5.0.0, acorn@^5.5.0, acorn@^5.6.2, acorn@^5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.2, acorn@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" + integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== + +add-dom-event-listener@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz#6a92db3a0dd0abc254e095c0f1dc14acbbaae310" + integrity sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw== + dependencies: + object-assign "4.x" + +address@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" + integrity sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg== + +ajv-errors@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" + integrity sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk= + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= + +ajv-keywords@^3.1.0: + version "3.2.0" + resolved "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= + +ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0, ajv@^6.5.3, ajv@^6.5.5, ajv@^6.6.1: + version "6.6.1" + resolved "http://registry.npm.taobao.org/ajv/download/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" + integrity sha1-Y2D17Q2A8jLMKylMNi1dwuU43WE= + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +amdefine@>=0.0.4: + version "1.0.1" + resolved "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-colors@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.1.0.tgz#dcfaacc90ef9187de413ec3ef8d5eb981a98808f" + integrity sha512-hTv1qPdi+sVEk3jYsdjox5nQI0C9HTbjKShbCdYLKb1LOfNbb7wsF4d7OEKIZoxIHx02tSp3m94jcPW2EfMjmA== + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" + integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= + dependencies: + color-convert "^1.9.0" + +ant-design-vue@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/ant-design-vue/-/ant-design-vue-1.1.10.tgz#b9ebcbab6dc72e0576920f8dc3fe7498e9d4bf61" + integrity sha512-NJefmFr1WZO6HQVtENDyIquTYMx+3NLKgQdb0PY/U1+VYfnCw21TBl3eOLJTFDC7YKamnCH3pz0Ok0OKr7IVfw== + dependencies: + add-dom-event-listener "^1.0.2" + array-tree-filter "^2.1.0" + async-validator "^1.8.2" + babel-helper-vue-jsx-merge-props "^2.0.3" + babel-runtime "6.x" + classnames "^2.2.5" + component-classes "^1.2.6" + dom-align "^1.7.0" + dom-closest "^0.2.0" + dom-scroll-into-view "^1.2.1" + enquire.js "^2.1.6" + intersperse "^1.0.0" + is-negative-zero "^2.0.0" + json2mq "^0.2.0" + lodash "^4.17.5" + moment "^2.21.0" + omit.js "^1.0.0" + raf "^3.4.0" + resize-observer-polyfill "^1.5.0" + shallow-equal "^1.0.0" + shallowequal "^1.0.2" + vue-ref "^1.0.3" + warning "^3.0.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha1-vLJLTzeTTZqnrBe0ra+J58du8us= + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "http://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha1-aALmJk79GMeQobDVF/DyYnvyyUo= + +arch@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" + integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "http://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha1-SzXClE8GKov82mZBB2A1D+nd/CE= + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= + +arr-union@^3.1.0: + version "3.1.0" + resolved "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "http://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + integrity sha1-Qmu52oQJDBg42BLIFQryCoMx4pY= + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@~2.0.3: + version "2.0.6" + resolved "http://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "http://registry.npm.taobao.org/asn1.js/download/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA= + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY= + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.4.1" + resolved "http://registry.npm.taobao.org/assert/download/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + +async-foreach@^0.1.3: + version "0.1.3" + resolved "http://registry.npm.taobao.org/async-foreach/download/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async-validator@^1.8.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.10.0.tgz#59a392a1b48565c2eb43faddb4e54d7d86dce293" + integrity sha512-tjkUJ3OXURZbm1nrlU2QtH0XJe4YvhN1J9AYiKFN9ODBqt0AFIE6YZdZByrWG2SidPUOOK5KIAsqskqFj/43ZQ== + dependencies: + babel-runtime "6.x" + +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.3.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== + dependencies: + lodash "^4.17.10" + +asynckit@^0.4.0: + version "0.4.0" + resolved "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.1: + version "2.1.2" + resolved "http://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= + +autoprefixer@^8.6.5: + version "8.6.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-8.6.5.tgz#343f3d193ed568b3208e00117a1b96eb691d4ee9" + integrity sha512-PLWJN3Xo/rycNkx+mp8iBDMTm3FeWe4VmYaZDSqL5QQB9sLsQkG5k8n+LNDFnhh9kdq2K+egL/icpctOmDHwig== + dependencies: + browserslist "^3.2.8" + caniuse-lite "^1.0.30000864" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.23" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8= + +axios@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" + integrity sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI= + dependencies: + follow-redirects "^1.3.0" + is-buffer "^1.1.5" + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-eslint@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed" + integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" + +babel-eslint@^8.2.3: + version "8.2.6" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" + integrity sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA== + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/traverse" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" + +babel-helper-vue-jsx-merge-props@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" + integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg== + +babel-loader@^8.0.0-beta.0, babel-loader@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.4.tgz#7bbf20cbe4560629e2e41534147692d3fecbdce6" + integrity sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw== + dependencies: + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + util.promisify "^1.0.0" + +babel-plugin-dynamic-import-node@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz#c0adfb07d95f4a4495e9aaac6ec386c4d7c2524e" + integrity sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA== + dependencies: + object.assign "^4.1.0" + +babel-plugin-transform-runtime@^6.23.0: + version "6.23.0" + resolved "http://registry.npm.taobao.org/babel-plugin-transform-runtime/download/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" + integrity sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-vue-jsx@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-4.0.1.tgz#2c8bddce87a6ef09eaa59869ff1bfbeeafc5f88d" + integrity sha512-wbOz7ITB5cloLSjKUU1hWn8zhR+Dwah/RZiTiJY/CQliCwhowmzu6m7NEF+y5EJX/blDzGjRtZvC10Vdb3Q7vw== + dependencies: + esutils "^2.0.2" + +babel-runtime@6.x, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babylon@7.0.0-beta.44: + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" + integrity sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.0" + resolved "http://registry.npm.taobao.org/base64-js/download/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM= + +base@^0.11.1: + version "0.11.2" + resolved "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha1-e95c7RRbbVUakNuH+DxVi060io8= + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bfj@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48" + integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ== + dependencies: + bluebird "^3.5.1" + check-types "^7.3.0" + hoopy "^0.1.2" + tryer "^1.0.0" + +big.js@^3.1.3: + version "3.2.0" + resolved "http://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4= + +binary-extensions@^1.0.0: + version "1.12.0" + resolved "http://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + integrity sha1-wteA9T1Fu6gxeokC1M7q86Y4WxQ= + +block-stream@*: + version "0.0.9" + resolved "http://registry.npm.taobao.org/block-stream/download/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bluebird@^3.1.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" + integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg== + +bluebird@^3.5.1: + version "3.5.3" + resolved "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha1-fQHG+WFsmlGrD4xUmnnf5uwz76c= + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "http://registry.npm.taobao.org/bn.js/download/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha1-LN4J617jQfSEdGuwMJsyU7GxRC8= + +body-parser@1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "http://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "http://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "http://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha1-Mmc0ZC9APavDADIJhTu3CtQo70g= + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha1-jWR0wbhwv9q807z8wZNKEOlPFfA= + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw= + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "http://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "http://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "http://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha1-KGlFnZqjviRf6P4sofRuLn9U1z8= + dependencies: + pako "~1.0.5" + +browserslist@^3.2.8: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +browserslist@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.0.tgz#779a235bd1ace0f3841a9b294df4cd47ac046c9d" + integrity sha512-j0jLqo+6ZhFWvTjEIcDyR8LIiN8pA3cUrT/SGAs0LPp/cKvkRpCnzuxtnAW+sOPLTic5wfb+TQvRX2RTN2wo4w== + dependencies: + caniuse-lite "^1.0.30000893" + electron-to-chromium "^1.3.80" + node-releases "^1.0.0-alpha.14" + +browserslist@^4.1.0: + version "4.3.5" + resolved "http://registry.npm.taobao.org/browserslist/download/browserslist-4.3.5.tgz#1a917678acc07b55606748ea1adf9846ea8920f7" + integrity sha1-GpF2eKzAe1VgZ0jqGt+YRuqJIPc= + dependencies: + caniuse-lite "^1.0.30000912" + electron-to-chromium "^1.3.86" + node-releases "^1.0.5" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8= + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "http://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.1" + resolved "http://registry.npm.taobao.org/buffer/download/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +cacache@^10.0.4: + version "10.0.4" + resolved "http://registry.npm.taobao.org/cacache/download/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + integrity sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA= + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cacache@^11.0.2: + version "11.3.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f" + integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA== + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + figgy-pudding "^3.1.0" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.3" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.0" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cache-loader@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-1.2.5.tgz#9ab15b0ae5f546f376083a695fc1a75f546cb266" + integrity sha512-enWKEQ4kO3YreDFd7AtVRjtJBmNiqh/X9hVDReu0C4qm8gsGmySkwuWtdc+N5O+vq5FzxL1mIZc30NyXCB7o/Q== + dependencies: + loader-utils "^1.1.0" + mkdirp "^0.5.1" + neo-async "^2.5.0" + schema-utils "^0.4.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= + +camelcase@^2.0.0: + version "2.1.1" + resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864: + version "1.0.30000893" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000893.tgz#284b20932bd41b93e21626975f2050cb01561986" + integrity sha512-kOddHcTEef+NgN/fs0zmX2brHTNATVOWMEIhlZHCuwQRtXobjSw9pAECc44Op4bTBcavRjkLaPrGomknH7+Jvg== + +caniuse-lite@^1.0.30000893, caniuse-lite@^1.0.30000912: + version "1.0.30000913" + resolved "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000913.tgz#560311ecf242eaf12159b720e64b11ebd759b5e4" + integrity sha1-VgMR7PJC6vEhWbcg5ksR69dZteQ= + +case-sensitive-paths-webpack-plugin@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.2.tgz#c899b52175763689224571dad778742e133f0192" + integrity sha512-oEZgAFfEvKtjSRCu6VgYkuGxwrWXMnQzyBmlLPP7r6PWQVtHxP5Z5N6XsuJvtoVax78am/r7lr46bwo3IVEBOg== + +caseless@~0.12.0: + version "0.12.0" + resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +center-align@^0.1.1: + version "0.1.3" + resolved "http://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: + version "2.4.1" + resolved "http://registry.npm.taobao.org/chalk/download/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha1-GMSasWoDe26wFSzIPjRxM4IVtm4= + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + +check-types@^7.3.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4" + integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg== + +chokidar@^2.0.0, chokidar@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.0.1, chownr@^1.1.1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/chownr/download/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha1-VHJri4//TfBTxCGH6AH7RBLfFJQ= + +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + integrity sha1-Rakb0sIMlBHwljtarrmhuV4JzEg= + dependencies: + tslib "^1.9.0" + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "http://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + +class-utils@^0.3.5: + version "0.3.6" + resolved "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM= + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.5: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-css@4.2.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" + integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== + dependencies: + source-map "~0.6.0" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +clipboardy@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" + integrity sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA== + dependencies: + arch "^2.1.0" + execa "^0.8.0" + +cliui@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0, cliui@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ== + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.0" + shallow-clone "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.1, clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +co@^4.6.0: + version "4.6.0" + resolved "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af" + integrity sha512-5wfTTO8E2/ja4jFSxePXlG5nRu5bBtL/r1HCIpJW/lzT6yDtKl0u0Z4o/Vpz32IpKmBn7HerheEZQgA9N2DarQ== + dependencies: + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc" + integrity sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg= + dependencies: + delayed-stream "~1.0.0" + +commander@2, commander@^2.18.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +commander@2.17.x, commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + +commondir@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-classes@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691" + integrity sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE= + dependencies: + component-indexof "0.0.3" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-indexof@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24" + integrity sha1-EdCRMSI5648yyPJa6csAL/6NPCQ= + +compressible@~2.0.14: + version "2.0.15" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" + integrity sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw== + dependencies: + mime-db ">= 1.36.0 < 2" + +compression@^1.5.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + integrity sha1-sGhzk0vF40T+9hGhlqb6rgruAVo= + +console-browserify@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/console-browserify/download/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/console-control-strings/download/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== + dependencies: + bluebird "^3.1.1" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +contour_plot@^0.0.1: + version "0.0.1" + resolved "http://registry.npm.taobao.org/contour_plot/download/contour_plot-0.0.1.tgz#475870f032b8e338412aa5fc507880f0bf495c77" + integrity sha1-R1hw8DK44zhBKqX8UHiA8L9JXHc= + +convert-source-map@^1.1.0: + version "1.6.0" + resolved "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA= + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "http://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha1-kilzmMrjSTf8r9bsgTnBgFHwteA= + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-webpack-plugin@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae" + integrity sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA== + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + globby "^7.1.1" + is-glob "^4.0.0" + loader-utils "^1.1.0" + minimatch "^3.0.4" + p-limit "^1.0.0" + serialize-javascript "^1.4.0" + +core-js@^2.4.0, core-js@^2.5.7: + version "2.5.7" + resolved "http://registry.npm.taobao.org/core-js/download/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + integrity sha1-+XJgj/DOrWi4QaFqky0LGDeRgU4= + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" + integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== + dependencies: + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + require-from-string "^2.0.1" + +cosmiconfig@^5.0.0: + version "5.0.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" + integrity sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ== + dependencies: + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "http://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8= + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "http://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY= + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "http://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8= + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "http://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha1-OWz58xN/A+S45TLFj2mCVOAPgOw= + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-loader@^1.0.0, css-loader@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe" + integrity sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw== + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash "^4.17.11" + postcss "^6.0.23" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + +css-select-base-adapter@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz#0102b3d14630df86c3eb9fa9f5456270106cf990" + integrity sha1-AQKz0UYw34bD65+p9UVicBBs+ZA= + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-select@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.0.tgz#7aa2921392114831f68db175c0b6a555df74bbd5" + integrity sha512-MGhoq1S9EyPgZIGnts8Yz5WwUOyHmPMdlqeifsYs/xFX7AAm3hY0RJe1dqVlXtYPI66Nsk39R/sa5/ree6L2qg== + dependencies: + boolbase "^1.0.0" + css-what "2.1" + domutils "^1.7.0" + nth-check "^1.0.1" + +css-selector-tokenizer@^0.7.0: + version "0.7.1" + resolved "http://registry.npm.taobao.org/css-selector-tokenizer/download/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" + integrity sha1-oXcnGovKUBkXL0+JH8bu2cv2jV0= + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + +css-tree@1.0.0-alpha.28: + version "1.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" + integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= + +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + integrity sha1-lGfQMsOM+u+58teVASUwYvh/ob0= + +cssesc@^0.1.0: + version "0.1.0" + resolved "http://registry.npm.taobao.org/cssesc/download/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= + +cssesc@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-1.0.1.tgz#ef7bd8d0229ed6a3a7051ff7771265fe7330e0a8" + integrity sha512-S2hzrpWvE6G/rW7i7IxJfWBYn27QWfOIncUW++8Rbo1VB5zsJDSVPcnI+Q8z7rhxT6/yZeLOCja4cZnghJrNGA== + +cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.3.tgz#9bfd1b06d4aa3991ed958ad9b9ec25a179261705" + integrity sha512-RYxcuQhGGybn+4twdn/c/A6Ephq31znqbWMdtjWdyC84IcqnXxBuLue0iNxHhwUr+eNtaJU4pJX8ro9F7Crw5w== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.0" + postcss-colormin "^4.0.2" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.1" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.6" + postcss-merge-rules "^4.0.2" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.1" + postcss-minify-params "^4.0.1" + postcss-minify-selectors "^4.0.1" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.1" + postcss-normalize-positions "^4.0.1" + postcss-normalize-repeat-style "^4.0.1" + postcss-normalize-string "^4.0.1" + postcss-normalize-timing-functions "^4.0.1" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.1" + postcss-ordered-values "^4.1.1" + postcss-reduce-initial "^4.0.2" + postcss-reduce-transforms "^4.0.1" + postcss-svgo "^4.0.1" + postcss-unique-selectors "^4.0.1" + +cssnano-preset-default@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.5.tgz#d1756c0259d98ad311e601ba76e95c60f6771ac1" + integrity sha512-f1uhya0ZAjPYtDD58QkBB0R+uYdzHPei7cDxJyQQIHt5acdhyGXaSXl2nDLzWHLwGFbZcHxQtkJS8mmNwnxTvw== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.0" + postcss-colormin "^4.0.2" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.1" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.9" + postcss-merge-rules "^4.0.2" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.1" + postcss-minify-params "^4.0.1" + postcss-minify-selectors "^4.0.1" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.1" + postcss-normalize-positions "^4.0.1" + postcss-normalize-repeat-style "^4.0.1" + postcss-normalize-string "^4.0.1" + postcss-normalize-timing-functions "^4.0.1" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.1" + postcss-ordered-values "^4.1.1" + postcss-reduce-initial "^4.0.2" + postcss-reduce-transforms "^4.0.1" + postcss-svgo "^4.0.1" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.0.0: + version "4.1.5" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.5.tgz#cfe5ffa722079f339ac2a6d547d88dd8ac8a498d" + integrity sha512-+6m3g8zV87VDIMCXpDzlaXyzo9h9VrIn9o/XRU6ufH/AddZw/mHzmmmNv83+MxpX5rnVbYPxuAMYPjuDgjd9Hw== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.2" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +cssnano@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.7.tgz#0bf112294bec103ab5f68d3f805732c8325a0b1b" + integrity sha512-AiXL90l+MDuQmRNyypG2P7ux7K4XklxYzNNUd5HXZCNcH8/N9bHPcpN97v8tXgRVeFL/Ed8iP8mVmAAu0ZpT7A== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.5" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== + dependencies: + css-tree "1.0.0-alpha.29" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "http://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cyclist@~0.2.2: + version "0.2.2" + resolved "http://registry.npm.taobao.org/cyclist/download/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= + +d3-array@1, d3-array@~1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +d3-collection@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + +d3-color@1: + version "1.2.3" + resolved "http://registry.npm.taobao.org/d3-color/download/d3-color-1.2.3.tgz#6c67bb2af6df3cc8d79efcc4d3a3e83e28c8048f" + integrity sha1-bGe7KvbfPMjXnvzE06PoPijIBI8= + +d3-composite-projections@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-composite-projections/-/d3-composite-projections-1.2.0.tgz#fa0e6f1442f17d04643843a3a883c7d94e0c27c0" + integrity sha1-+g5vFELxfQRkOEOjqIPH2U4MJ8A= + dependencies: + d3-geo "1.2.4" + d3-path "^1.0.1" + +d3-dispatch@1: + version "1.0.5" + resolved "http://registry.npm.taobao.org/d3-dispatch/download/d3-dispatch-1.0.5.tgz#e25c10a186517cd6c82dd19ea018f07e01e39015" + integrity sha1-4lwQoYZRfNbILdGeoBjwfgHjkBU= + +d3-dsv@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.0.10.tgz#4371c489a2a654a297aca16fcaf605a6f31a6f51" + integrity sha512-vqklfpxmtO2ZER3fq/B33R/BIz3A1PV0FaZRuFM8w6jLo7sUX1BZDh73fPlr0s327rzq4H6EN1q9U+eCBCSN8g== + dependencies: + commander "2" + iconv-lite "0.4" + rw "1" + +d3-ease@1, d3-ease@~1.0.3: + version "1.0.5" + resolved "http://registry.npm.taobao.org/d3-ease/download/d3-ease-1.0.5.tgz#8ce59276d81241b1b72042d6af2d40e76d936ffb" + integrity sha1-jOWSdtgSQbG3IELWry1A522Tb/s= + +d3-format@^1.3.0: + version "1.3.2" + resolved "http://registry.npm.taobao.org/d3-format/download/d3-format-1.3.2.tgz#6a96b5e31bcb98122a30863f7d92365c00603562" + integrity sha1-apa14xvLmBIqMIY/fZI2XABgNWI= + +d3-geo-projection@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/d3-geo-projection/-/d3-geo-projection-2.1.2.tgz#7df8e1e9d046d631c6509f7e531357d4adc24aa3" + integrity sha1-ffjh6dBG1jHGUJ9+UxNX1K3CSqM= + dependencies: + commander "2" + d3-array "1" + d3-geo "^1.1.0" + +d3-geo@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.2.4.tgz#d179f3baa76e623ef1e0d83693db705b7c599006" + integrity sha1-0XnzuqduYj7x4Ng2k9twW3xZkAY= + dependencies: + d3-array "1" + +d3-geo@^1.1.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.11.1.tgz#3f35e582c0d29296618b02a8ade0fdffb2c0e63c" + integrity sha512-GsG7x9G9sykseLviOVSJ3h5yjw0ItLopOtuDQKUt1TRklEegCw5WAmnIpYYiCkSH/QgUMleAeE2xZK38Qb+1+Q== + dependencies: + d3-array "1" + +d3-geo@~1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.6.4.tgz#f20e1e461cb1845f5a8be55ab6f876542a7e3199" + integrity sha1-8g4eRhyxhF9ai+Vatvh2VCp+MZk= + dependencies: + d3-array "1" + +d3-hexjson@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d3-hexjson/-/d3-hexjson-1.0.1.tgz#6a23111e8359f1e214f5d0afa379c02b2b67df0b" + integrity sha512-TeH4T0PSbDazMm3gHgc4ulO0PfrZpz0Uk3y5tCGz+NgC7HnX7KBdem7uAN+j9x3ZshTh7raN3V/bFhaLB2C8DA== + dependencies: + d3-array "1" + +d3-hierarchy@~1.1.5: + version "1.1.8" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz#7a6317bd3ed24e324641b6f1e76e978836b008cc" + integrity sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w== + +d3-interpolate@1: + version "1.3.2" + resolved "http://registry.npm.taobao.org/d3-interpolate/download/d3-interpolate-1.3.2.tgz#417d3ebdeb4bc4efcc8fd4361c55e4040211fd68" + integrity sha1-QX0+vetLxO/Mj9Q2HFXkBAIR/Wg= + dependencies: + d3-color "1" + +d3-interpolate@~1.1.5: + version "1.1.6" + resolved "http://registry.npm.taobao.org/d3-interpolate/download/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6" + integrity sha1-LPOVriOBgE3wiqG/dmt/l7X2j7Y= + dependencies: + d3-color "1" + +d3-path@1, d3-path@^1.0.1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.7.tgz#8de7cd693a75ac0b5480d3abaccd94793e58aae8" + integrity sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA== + +d3-sankey@~0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.7.1.tgz#d229832268fc69a7fec84803e96c2256a614c521" + integrity sha1-0imDImj8aaf+yEgD6WwiVqYUxSE= + dependencies: + d3-array "1" + d3-collection "1" + d3-shape "^1.2.0" + +d3-selection@^1.0.2, d3-selection@^1.1.0: + version "1.3.2" + resolved "http://registry.npm.taobao.org/d3-selection/download/d3-selection-1.3.2.tgz#6e70a9df60801c8af28ac24d10072d82cbfdf652" + integrity sha1-bnCp32CAHIryisJNEActgsv99lI= + +d3-shape@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.2.tgz#f9dba3777a5825f9a8ce8bc928da08c17679e9a7" + integrity sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ== + dependencies: + d3-path "1" + +d3-timer@1, d3-timer@~1.0.6: + version "1.0.9" + resolved "http://registry.npm.taobao.org/d3-timer/download/d3-timer-1.0.9.tgz#f7bb8c0d597d792ff7131e1c24a36dd471a471ba" + integrity sha1-97uMDVl9eS/3Ex4cJKNt1HGkcbo= + +d3-transition@^1.0.1: + version "1.1.3" + resolved "http://registry.npm.taobao.org/d3-transition/download/d3-transition-1.1.3.tgz#3a435b05ce9cef9524fe0d38121cfb6905331ca6" + integrity sha1-OkNbBc6c75Uk/g04Ehz7aQUzHKY= + dependencies: + d3-color "1" + d3-dispatch "1" + d3-ease "1" + d3-interpolate "1" + d3-selection "^1.1.0" + d3-timer "1" + +d3-voronoi@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" + integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== + +dagre@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.2.tgz#755b79f4d5499d63cf74c3368fb08add93eceafe" + integrity sha512-TEOOGZOkCOgCG7AoUIq64sJ3d21SMv8tyoqteLpX+UsUsS9Qw8iap4hhogXY4oB3r0bbZuAjO0atAilgCmsE0Q== + dependencies: + graphlib "^2.1.5" + lodash "^4.17.4" + +dashdash@^1.12.0: + version "1.14.1" + resolved "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "http://registry.npm.taobao.org/date-now/download/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +dayjs@^1.7.5: + version "1.7.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.7.7.tgz#8df20f78ac2476e3f5348ef49f8f22ebc3016370" + integrity sha512-Qlkiu0NNDpYwhk0syK4ImvAl/5YnsEMkvC2O123INviGeOA3Q8s5VyVkZzmN5SC7Wv9bb1+rfwO+uSqtHB4UWw== + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= + dependencies: + ms "2.0.0" + +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@^3.2.5: + version "3.2.6" + resolved "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha1-6D0X3hbYp++3cX7b5fsQE17uYps= + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" + integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== + dependencies: + ms "^2.1.1" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== + dependencies: + xregexp "4.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1, deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw= + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deepmerge@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" + integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== + +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ== + dependencies: + execa "^0.10.0" + ip-regex "^2.1.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.3" + resolved "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0= + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@~1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/defined/download/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/des.js/download/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "http://registry.npm.taobao.org/detect-libc/download/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-node@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "http://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha1-QOjumPVaIUlgcUaSHGPhrl89KHU= + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +dom-align@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.8.0.tgz#c0e89b5b674c6e836cd248c52c2992135f093654" + integrity sha512-B85D4ef2Gj5lw0rK0KM2+D5/pH7yqNxg2mB+E8uzFaolpm7RQmsxEfjyEuNiF8UBBkffumYDeKRzTzc3LePP+w== + +dom-closest@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-closest/-/dom-closest-0.2.0.tgz#ebd9f91d1bf22e8d6f477876bbcd3ec90216c0cf" + integrity sha1-69n5HRvyLo1vR3h2u80+yQIWwM8= + dependencies: + dom-matches ">=1.0.1" + +dom-converter@~0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-matches@>=1.0.1: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-matches/-/dom-matches-2.0.0.tgz#d2728b416a87533980eb089b848d253cf23a758c" + integrity sha1-0nKLQWqHUzmA6wibhI0lPPI6dYw= + +dom-scroll-into-view@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz#e8f36732dd089b0201a88d7815dc3f88e6d66c7e" + integrity sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4= + +dom-serializer@0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "http://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto= + +domelementtype@1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI= + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= + +domhandler@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" + integrity sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ= + dependencies: + domelementtype "1" + +domutils@1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" + integrity sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU= + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.1" + resolved "http://registry.npm.taobao.org/duplexify/download/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" + integrity sha1-saeinEq/1jlYXvrszoDWZrHjQSU= + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +easy-stack@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.0.tgz#12c91b3085a37f0baa336e9486eac4bf94e3e788" + integrity sha1-EskbMIWjfwuqM26UhurEv5Tj54g= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== + +electron-to-chromium@^1.3.47: + version "1.3.80" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.80.tgz#e99ec7efe64c2c6a269d3885ff411ea88852fa53" + integrity sha512-WClidEWEUNx7OfwXehB0qaxCuetjbKjev2SmXWgybWPLKAThBiMTF/2Pd8GSUDtoGOavxVzdkKwfFAPRSWlkLw== + +electron-to-chromium@^1.3.80, electron-to-chromium@^1.3.86: + version "1.3.87" + resolved "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.87.tgz#f0481ca84824752bced51673396e9a6c74fe5ec7" + integrity sha1-8EgcqEgkdSvO1RZzOW6abHT+Xsc= + +elliptic@^6.0.0: + version "6.4.1" + resolved "http://registry.npm.taobao.org/elliptic/download/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha1-wtC3d2kRuGcixjLDwGxg8vgZk5o= + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha1-7SljTRm6ukY7bOa4CjchPqtx7EM= + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "http://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha1-Qcfgv9/nSsH/4eV61qXGyfN0Kn8= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enquire.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/enquire.js/-/enquire.js-2.1.6.tgz#3e8780c9b8b835084c3f60e166dbc3c2a3c89814" + integrity sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ= + +entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "http://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg= + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz#4ae8dbaa2bf90a8b450707b9149dcabca135520d" + integrity sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw== + dependencies: + stackframe "^1.0.4" + +es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.6.1: + version "1.12.0" + resolved "http://registry.npm.taobao.org/es-abstract/download/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + integrity sha1-nbvdJ8aFbwABQhyhh4LXhr+KYWU= + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.2.0" + resolved "http://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha1-7fckeAM0VujdqO8J4ArZZQcH83c= + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-config-standard@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" + integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== + +eslint-import-resolver-node@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-loader@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.1.1.tgz#2a9251523652430bfdd643efdb0afc1a2a89546a" + integrity sha512-1GrJFfSevQdYpoDzx8mEE2TDWsb/zmFuY09l6hURg1AeFIKQOvZ+vH0UPjzmd1CZIbfTV5HUkMeBmFiDBkgIsQ== + dependencies: + loader-fs-cache "^1.0.0" + loader-utils "^1.0.2" + object-assign "^4.0.1" + object-hash "^1.1.4" + rimraf "^2.6.1" + +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + integrity sha1-snA2LNiLGkitMIl2zn+lTphBF0Y= + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + +eslint-plugin-es@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" + integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== + dependencies: + eslint-utils "^1.3.0" + regexpp "^2.0.1" + +eslint-plugin-import@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + integrity sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g== + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + +eslint-plugin-node@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.0.tgz#fb9e8911f4543514f154bb6a5924b599aa645568" + integrity sha512-Y+ln8iQ52scz9+rSPnSWRaAxeWaoJZ4wIveDR0vLHkuSZGe44Vk1J4HX7WvEP5Cm+iXPE8ixo7OM7gAO3/OKpQ== + dependencies: + eslint-plugin-es "^1.3.1" + eslint-utils "^1.3.1" + ignore "^5.0.2" + minimatch "^3.0.4" + resolve "^1.8.1" + semver "^5.5.0" + +eslint-plugin-promise@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz#2d074b653f35a23d1ba89d8e976a985117d1c6a2" + integrity sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg== + +eslint-plugin-standard@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz#f845b45109c99cd90e77796940a344546c8f6b5c" + integrity sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA== + +eslint-plugin-vue@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-4.7.1.tgz#c829b9fc62582c1897b5a0b94afd44ecca511e63" + integrity sha512-esETKhVMI7Vdli70Wt4bvAwnZBJeM0pxVX9Yb0wWKxdCJc2EADalVYK/q2FzMw8oKN0wPMdqVCKS8kmR89recA== + dependencies: + vue-eslint-parser "^2.0.3" + +eslint-plugin-vue@^5.0.0-0: + version "5.0.0-beta.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-5.0.0-beta.5.tgz#d478abfcea7eaa98cbe28eedec4aea0e596fbdb2" + integrity sha512-ETVqyctk0cta99tTi3NjDDGyJiQZTHlf6J7fl6Ig58/926U2tjzU3T0A/c6/jkiTw1m9yErxLyF+IPnwX7j6bg== + dependencies: + vue-eslint-parser "^3.2.1" + +eslint-scope@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + integrity sha1-UL8wcekzi83EMzF5Sgy1M/ATYXI= + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.0, eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +eslint@^5.8.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.9.0.tgz#b234b6d15ef84b5849c6de2af43195a2d59d408e" + integrity sha512-g4KWpPdqN0nth+goDNICNXGfJF7nNnepthp46CAlJoJtC5K/cLu3NgCM3AHu1CkJ5Hzt9V0Y0PBAO6Ay/gGb+w== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.5.3" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^4.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + imurmurhash "^0.1.4" + inquirer "^6.1.0" + is-resolvable "^1.1.0" + js-yaml "^3.12.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.5" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^2.0.1" + require-uncached "^1.0.3" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.0.2" + text-table "^0.2.0" + +espree@^3.5.2, espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +espree@^4.0.0, espree@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" + integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w== + dependencies: + acorn "^6.0.2" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.0, esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8= + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +esutils@^2.0.2: + version "2.0.2" + resolved "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-pubsub@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" + integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== + +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + +events@^1.0.0: + version "1.1.1" + resolved "http://registry.npm.taobao.org/events/download/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "http://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI= + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.16.2, express@^4.16.3: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= + +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +external-editor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-glob@^2.0.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.3.tgz#d09d378e9ef6b0076a0fa1ba7519d9d4d9699c28" + integrity sha512-NiX+JXjnx43RzvVFwRWfPKo4U+1BrK5pJPsHQdKMlLoFHrrGktXglQhHliSihWAq+m1z6fHk3uwGHrtRbS9vLA== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.0.1" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.1" + micromatch "^3.1.10" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastparse@^1.1.1: + version "1.1.2" + resolved "http://registry.npm.taobao.org/fastparse/download/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha1-kXKMWllC7O2FMSg8eUQe5BIsNak= + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg= + dependencies: + websocket-driver ">=0.5.1" + +fecha@~2.3.3: + version "2.3.3" + resolved "http://registry.npm.taobao.org/fecha/download/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" + integrity sha1-lI50FX3xoy/RsSw6PDzctuydls0= + +figgy-pudding@^3.1.0, figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +file-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" + integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ== + dependencies: + loader-utils "^1.0.2" + schema-utils "^1.0.0" + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-cache-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^3.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + integrity sha1-xdWG7zivYJdlC0m8QbVfq7GfNb0= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +fmin@0.0.2: + version "0.0.2" + resolved "http://registry.npm.taobao.org/fmin/download/fmin-0.0.2.tgz#59bbb40d43ffdc1c94cd00a568c41f95f1973017" + integrity sha1-Wbu0DUP/3ByUzQClaMQflfGXMBc= + dependencies: + contour_plot "^0.0.1" + json2module "^0.0.3" + rollup "^0.25.8" + tape "^4.5.1" + uglify-js "^2.6.2" + +follow-redirects@^1.0.0, follow-redirects@^1.3.0: + version "1.5.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6" + integrity sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w== + dependencies: + debug "=3.1.0" + +for-each@~0.3.3: + version "0.3.3" + resolved "http://registry.npm.taobao.org/for-each/download/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha1-abRH6IoKXTLD5whPPxcQA0shN24= + dependencies: + is-callable "^1.1.3" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +friendly-errors-webpack-plugin@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz#efc86cbb816224565861a1be7a9d84d0aafea136" + integrity sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw== + dependencies: + chalk "^1.1.3" + error-stack-parser "^2.0.0" + string-width "^2.0.0" + +from2@^2.1.0: + version "2.3.0" + resolved "http://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "http://registry.npm.taobao.org/fs-minipass/download/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha1-BsJ3IYRU7CiN93raVKA7hwKqy50= + dependencies: + minipass "^2.2.1" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "http://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.2: + version "1.2.4" + resolved "http://registry.npm.taobao.org/fsevents/download/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + integrity sha1-9B3LGvJYKvNpLaNvxVy9jhBBxCY= + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fstream@^1.0.0, fstream@^1.0.2: + version "1.0.11" + resolved "http://registry.npm.taobao.org/fstream/download/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1, function-bind@~1.1.1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gauge@~2.7.3: + version "2.7.4" + resolved "http://registry.npm.taobao.org/gauge/download/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "http://registry.npm.taobao.org/gaze/download/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko= + dependencies: + globule "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o= + +get-stdin@^4.0.1: + version "4.0.1" + resolved "http://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "http://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1, glob@~7.1.2: + version "7.1.3" + resolved "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE= + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.0.1: + version "11.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" + integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== + +globals@^11.1.0, globals@^11.7.0: + version "11.9.0" + resolved "http://registry.npm.taobao.org/globals/download/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" + integrity sha1-veI2gI6YfykHaKk9BlBg145qskk= + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" + integrity sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw== + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "http://registry.npm.taobao.org/globule/download/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha1-Xf+xsZHyLSB5epNptJ6rTpg5aW0= + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.1.15" + resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha1-/7cD4QZuig7qpMi4C6klPu77+wA= + +graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= + +graphlib@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.5.tgz#6afe1afcc5148555ec799e499056795bd6938c87" + integrity sha512-XvtbqCcw+EM5SqQrIetIKKD+uZVNQtDPD1goIg7K73RuRZtVI5rYMdcCVSHm/AS1sCBZ7vt0p5WgXouucHQaOA== + dependencies: + lodash "^4.11.1" + +gzip-size@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80" + integrity sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA== + dependencies: + duplexer "^0.1.1" + pify "^3.0.0" + +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ= + +har-schema@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha1-HvievT5JllV2de7ZiTEQ3DUPoIA= + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/has-unicode/download/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.1, has@~1.0.3: + version "1.0.3" + resolved "http://registry.npm.taobao.org/has/download/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "http://registry.npm.taobao.org/hash-base/download/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "http://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I= + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.1.x: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= + +he@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@5.x.x: + version "5.0.4" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-5.0.4.tgz#0f7fa270a1cafeb364a4b2ddfaa33f864e4157da" + integrity sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w== + +hoopy@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha1-l/I2l3vW4SVAiTD/bePuxigewEc= + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +html-minifier@^3.2.3: + version "3.5.20" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.20.tgz#7b19fd3caa0cb79f7cde5ee5c3abdf8ecaa6bb14" + integrity sha512-ZmgNLaTp54+HFKkONyLFEfs5dd/ZOtlquKaTnqIWFmx3Av5zG6ZPcV2d0o9XM2fXOTxxIf6eDcwzFFotke/5zA== + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.1.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +htmlparser2@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" + integrity sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4= + dependencies: + domelementtype "1" + domhandler "2.1" + domutils "1.1" + readable-stream "1.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.4.0: + version "0.4.13" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" + integrity sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc= + +http-proxy-middleware@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" + integrity sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q== + dependencies: + http-proxy "^1.16.2" + is-glob "^4.0.0" + lodash "^4.17.5" + micromatch "^3.1.9" + +http-proxy@^1.16.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== + dependencies: + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/icss-utils/download/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI= + dependencies: + postcss "^6.0.1" + +ieee754@^1.1.4: + version "1.1.12" + resolved "http://registry.npm.taobao.org/ieee754/download/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + integrity sha1-UL8k5bnIu5ivSWTJQc2wkY2ntgs= + +iferr@^0.1.5: + version "0.1.5" + resolved "http://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "http://registry.npm.taobao.org/ignore-walk/download/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha1-qD5i59JyrA47VRqqgoMaGbafgvg= + dependencies: + minimatch "^3.0.4" + +ignore@^3.3.3, ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.0.2: + version "5.0.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.4.tgz#33168af4a21e99b00c5d41cbadb6a6cb49903a45" + integrity sha512-WLsTMEhsQuXpCiG173+f3aymI43SXa+fB1rSfbzyP4GkPP+ZFVuO0/3sFUGNBtifisPeDcl/uD/Y2NxZ7xFq4g== + +image-size@~0.5.0: + version "0.5.5" + resolved "http://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +in-publish@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/in-publish/download/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= + +indent-string@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +indexof@0.0.1: + version "0.0.1" + resolved "http://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +inflight@^1.0.4: + version "1.0.6" + resolved "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inherits@2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +ini@~1.3.0: + version "1.3.5" + resolved "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc= + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" + integrity sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.17.10" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^5.0.0" + through "^2.3.6" + +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q== + dependencies: + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" + +intersperse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/intersperse/-/intersperse-1.0.0.tgz#f2561fb1cfef9f5277cc3347a22886b4351a5181" + integrity sha1-8lYfsc/vn1J3zDNHoiiGtDUaUYE= + +invariant@^2.2.0, invariant@^2.2.2: + version "2.2.4" + resolved "http://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY= + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= + +ipaddr.js@^1.5.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" + integrity sha1-+kt5+kf9Pe9eOxWYJRYcClGclCc= + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5, is-buffer@~1.1.1: + version "1.1.6" + resolved "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha1-76ouqdqg16suoTqXsritUf776L4= + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4: + version "1.1.4" + resolved "http://registry.npm.taobao.org/is-callable/download/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU= + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "http://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/is-glob/download/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + +is-number@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "http://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4: + version "1.0.4" + resolved "http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-resolvable@^1.0.0, is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg= + dependencies: + has-symbols "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@0.0.1, isarray@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isemail@3.x.x: + version "3.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" + integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg== + dependencies: + punycode "2.x.x" + +isexe@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +javascript-stringify@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3" + integrity sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM= + +joi@^13.0.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-13.7.0.tgz#cfd85ebfe67e8a1900432400b4d03bbd93fb879f" + integrity sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q== + dependencies: + hoek "5.x.x" + isemail "3.x.x" + topo "3.x.x" + +js-base64@^2.1.8: + version "2.4.9" + resolved "http://registry.npm.taobao.org/js-base64/download/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" + integrity sha1-dIkR+wT0imDEdxs3XKxFqA3xHAM= + +js-cookie@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.0.tgz#1b2c279a6eece380a12168b92485265b35b1effb" + integrity sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s= + +js-levenshtein@^1.1.3: + version "1.1.4" + resolved "http://registry.npm.taobao.org/js-levenshtein/download/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" + integrity sha1-Olbjy/WJygCB6yLNm6CxKQoW0m4= + +js-message@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.5.tgz#2300d24b1af08e89dd095bc1a4c9c9cfcb892d15" + integrity sha1-IwDSSxrwjondCVvBpMnJz8uJLRU= + +js-queue@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/js-queue/-/js-queue-2.0.0.tgz#362213cf860f468f0125fc6c96abc1742531f948" + integrity sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug= + dependencies: + easy-stack "^1.0.0" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= + +js-yaml@^3.12.0, js-yaml@^3.9.0, js-yaml@^3.9.1: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^2.5.1: + version "2.5.2" + resolved "http://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q= + +jsesc@~0.5.0: + version "0.5.0" + resolved "http://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= + +json-schema@0.2.3: + version "0.2.3" + resolved "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json2module@^0.0.3: + version "0.0.3" + resolved "http://registry.npm.taobao.org/json2module/download/json2module-0.0.3.tgz#00fb5f4a9b7adfc3f0647c29cb17bcd1979be9b2" + integrity sha1-APtfSpt638PwZHwpyxe80Zeb6bI= + dependencies: + rw "^1.3.2" + +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + integrity sha1-tje9O6nqvhIsg+lyBIOusQ0skEo= + dependencies: + string-convert "^0.2.0" + +json3@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= + +json5@^0.5.0: + version "0.5.1" + resolved "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsprim@^1.2.2: + version "1.4.1" + resolved "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +killable@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha1-ARRrNqYhjmTljzqNZt5df8b20FE= + +launch-editor-middleware@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz#e14b07e6c7154b0a4b86a0fd345784e45804c157" + integrity sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg== + dependencies: + launch-editor "^2.2.1" + +launch-editor@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.2.1.tgz#871b5a3ee39d6680fcc26d37930b6eeda89db0ca" + integrity sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw== + dependencies: + chalk "^2.3.0" + shell-quote "^1.6.1" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +lcid@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +less-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e" + integrity sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg== + dependencies: + clone "^2.1.1" + loader-utils "^1.1.0" + pify "^3.0.0" + +less@^3.8.1: + version "3.9.0" + resolved "http://registry.npm.taobao.org/less/download/less-3.9.0.tgz#b7511c43f37cf57dc87dffd9883ec121289b1474" + integrity sha1-t1EcQ/N89X3Iff/ZiD7BISibFHQ= + dependencies: + clone "^2.1.2" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.4.1" + mkdirp "^0.5.0" + promise "^7.1.1" + request "^2.83.0" + source-map "~0.6.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-fs-cache@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc" + integrity sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw= + dependencies: + find-cache-dir "^0.1.1" + mkdirp "0.5.1" + +loader-runner@^2.3.0: + version "2.3.1" + resolved "http://registry.npm.taobao.org/loader-runner/download/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" + integrity sha1-Am8S/nwxFZkolqwCugIrqSlxuXk= + +loader-utils@^0.2.16: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/loader-utils/download/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "http://registry.npm.taobao.org/lodash.assign/download/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "http://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "http://registry.npm.taobao.org/lodash.debounce/download/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.defaultsdeep@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" + integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.mapvalues@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.mergewith@^4.6.0: + version "4.6.1" + resolved "http://registry.npm.taobao.org/lodash.mergewith/download/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + integrity sha1-Y5BX5ybDr72z59QnQcqo1uQzWSc= + +lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= + +lodash.transform@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0" + integrity sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.0.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@~4.17.10: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +loglevel@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" + integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= + +longest@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +loose-envify@^1.0.0: + version "1.4.0" + resolved "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8= + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "http://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lru-cache@^4.0.1, lru-cache@^4.1.1: + version "4.1.5" + resolved "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80= + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^4.1.2, lru-cache@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "http://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha1-ecEDO4BRW9bSTsmTPoYMp17ifww= + dependencies: + pify "^3.0.0" + +map-age-cleaner@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" + integrity sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "http://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8= + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +md5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + integrity sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^1.0.0" + p-is-promise "^1.1.0" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "http://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.7.0: + version "3.7.0" + resolved "http://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + +merge2@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: + version "3.1.10" + resolved "http://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha1-cIWbyVyYQJUvNZoGij/En57PrCM= + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "http://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha1-8IA1HIZbDcViqEYpZtqlNUPHik0= + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +"mime-db@>= 1.36.0 < 2", mime-db@~1.37.0: + version "1.37.0" + resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" + integrity sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng= + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.21" + resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" + integrity sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y= + dependencies: + mime-db "~1.37.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mime@^1.4.1: + version "1.6.0" + resolved "http://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= + +mime@^2.0.3, mime@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + integrity sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mini-css-extract-plugin@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.5.tgz#c99e9e78d54f3fa775633aee5933aeaa4e80719a" + integrity sha512-dqBanNfktnp2hwL2YguV9Jh91PFX7gu7nRLs4TGsbAfAG6WOtlynFRYzwDwmmeSb5uIwHo9nx1ta0f7vAZVp2w== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc= + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "http://registry.npm.taobao.org/minipass/download/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha1-ys6+SSAiSX9law8PUeJoKp7S2Eg= + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/minizlib/download/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" + integrity sha1-ZzSswEWkbmHVlqQ7udnNMm4ZzEI= + dependencies: + minipass "^2.2.1" + +mississippi@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/mississippi/download/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + integrity sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8= + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "http://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4= + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +moment@^2.21.0: + version "2.22.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" + integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.1" + resolved "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.10.0, nan@^2.9.2: + version "2.11.1" + resolved "http://registry.npm.taobao.org/nan/download/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" + integrity sha1-kOIrzLjKV+pM03zIPTgZtS7qZ2Y= + +nanomatch@^1.2.9: + version "1.2.13" + resolved "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +needle@^2.2.1: + version "2.2.4" + resolved "http://registry.npm.taobao.org/needle/download/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha1-UZMb/4JTOxkot9HWngHxsA/9Kk4= + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= + +neo-async@^2.5.0: + version "2.6.0" + resolved "http://registry.npm.taobao.org/neo-async/download/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha1-udFeTXHGdikIZUtRg+04t1M0CDU= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== + +node-gyp@^3.8.0: + version "3.8.0" + resolved "http://registry.npm.taobao.org/node-gyp/download/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw= + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-ipc@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.1.tgz#4e245ed6938e65100e595ebc5dc34b16e8dd5d69" + integrity sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w== + dependencies: + event-pubsub "4.3.0" + js-message "1.0.5" + js-queue "2.0.0" + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + integrity sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8= + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "http://registry.npm.taobao.org/node-pre-gyp/download/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha1-MHAEBxav3HeHR7YbaIe/eIgLgPw= + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.0.0-alpha.14, node-releases@^1.0.5: + version "1.0.5" + resolved "http://registry.npm.taobao.org/node-releases/download/node-releases-1.0.5.tgz#a641adcc968b039a27345d92ef10b093e5cbd41d" + integrity sha1-pkGtzJaLA5onNF2S7xCwk+XL1B0= + dependencies: + semver "^5.3.0" + +node-sass@^4.9.0: + version "4.10.0" + resolved "http://registry.npm.taobao.org/node-sass/download/node-sass-4.10.0.tgz#dcc2b364c0913630945ccbf7a2bbf1f926effca4" + integrity sha1-3MKzZMCRNjCUXMv3orvx+Sbv/KQ= + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.10.0" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +"nopt@2 || 3": + version "3.0.6" + resolved "http://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "http://registry.npm.taobao.org/nopt/download/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha1-EvlaMH1YNSB1oEkHuErIvpisAS8= + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" + integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= + +normalize-path@^2.1.1: + version "2.1.1" + resolved "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-bundled@^1.0.1: + version "1.0.5" + resolved "http://registry.npm.taobao.org/npm-bundled/download/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + integrity sha1-PBcyt7qTazoQMlrvYWRnwMy8yXk= + +npm-packlist@^1.1.6: + version "1.1.12" + resolved "http://registry.npm.taobao.org/npm-packlist/download/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" + integrity sha1-Ir3i68EucspIKr1nr8UetJN3JDo= + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.2" + resolved "http://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha1-CKfyqL9zRgR3mp76StXMcXq7lUs= + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= + +nth-check@^1.0.1, nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + integrity sha1-mSms32KPwsQQmN6rgqxYDPFJquQ= + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= + +object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^1.1.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2" + integrity sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ== + +object-inspect@~1.6.0: + version "1.6.0" + resolved "http://registry.npm.taobao.org/object-inspect/download/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha1-xwtsv3LydKq0w0wMgvUWe/gs8Vs= + +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== + +object-visit@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "http://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" + integrity sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +omit.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/omit.js/-/omit.js-1.0.0.tgz#e013cb86a7517b9cf6f7cfb0ddb4297256a99288" + integrity sha512-O1rwbvEfAdhtonTv+v6IQeMOKTi/wlHcXpI3hehyPDlujkjSBQC6Vtzg0mdy+v2KVDmuPf7hAbHlTBM6q1bUHQ== + dependencies: + babel-runtime "^6.23.0" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +opn@^5.1.0, opn@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" + integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw== + dependencies: + is-wsl "^1.1.0" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +ora@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" + integrity sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA== + dependencies: + chalk "^2.3.1" + cli-cursor "^2.1.0" + cli-spinners "^1.1.0" + log-symbols "^2.2.0" + strip-ansi "^4.0.0" + wcwidth "^1.0.1" + +ora@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.0.0.tgz#8179e3525b9aafd99242d63cc206fd64732741d0" + integrity sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg== + dependencies: + chalk "^2.3.1" + cli-cursor "^2.1.0" + cli-spinners "^1.1.0" + log-symbols "^2.2.0" + strip-ansi "^4.0.0" + wcwidth "^1.0.1" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "http://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "http://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw== + dependencies: + execa "^0.10.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "http://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha1-hc36+uso6Gd/QW4odZK18/SepBA= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + +p-limit@^1.0.0, p-limit@^1.1.0: + version "1.3.0" + resolved "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg= + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + +p-try@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + +pako@~1.0.5: + version "1.0.7" + resolved "http://registry.npm.taobao.org/pako/download/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" + integrity sha1-JHNDkCG1fxUWyC9YvnJ1rY7xuyc= + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "http://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + integrity sha1-9r8pOBgzK9DatU77Fgh3JHRebKg= + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-json@^2.2.0: + version "2.2.0" + resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-svg-path@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" + integrity sha1-en7A0esG+lMlx9PgCbhZoJtdSes= + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "http://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.0: + version "0.0.0" + resolved "http://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.5: + version "1.0.6" + resolved "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha1-1i27VnlAXXLEc37FhgDp3c8G0kw= + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "http://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha1-l2wgZTBhexTrsyEUI597CTNuk6Y= + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^2.0.0: + version "2.3.0" + resolved "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + +point-at-length@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/point-at-length/-/point-at-length-1.0.2.tgz#9176d8d6d7c8162f12b646f707db9f0ea728125e" + integrity sha1-kXbY1tfIFi8Stkb3B9ufDqcoEl4= + dependencies: + abs-svg-path "~0.1.1" + isarray "~0.0.1" + parse-svg-path "~0.1.1" + +portfinder@^1.0.19: + version "1.0.20" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" + integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +portfinder@^1.0.9: + version "1.0.18" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.18.tgz#cf1106ff336fd4329b7ce32fda7d17d62c6bcf37" + integrity sha512-KanzLOERzKoX3En5yTiV8K/arnU1ykYVokmtEn0PgCzqKZG9489tqW8ifp9+v3/VJZ5YDjvDt/PAP5WaPgk7FA== + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.0.tgz#cf0e78e1d7d9f75119b833abc786fa4b61afedda" + integrity sha512-o04XICBwDxXVYw1TXkzxs36WRgk9OECGiSUoyYMNoFWHLAQCKKeaqhrNBTUKdStMfwik3gSLLztHebTSV5kJOA== + dependencies: + css-unit-converter "^1.1.1" + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + postcss-value-parser "^3.3.0" + +postcss-colormin@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.2.tgz#93cd1fa11280008696887db1a528048b18e7ed99" + integrity sha512-1QJc2coIehnVFsz0otges8kQLsryi4lo19WD+U5xCWvXd0uw/Z+KKYnbiNDCnO9GP+PvErPHCG0jNvWTngk9Rw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.1.tgz#30697735b0c476852a7a11050eb84387a67ef55d" + integrity sha512-Ay+rZu1Sz6g8IdzRjUgG2NafSNpp2MSMOQUb+9kkzzzP+kh07fP0yNbhtFejURnyVXSX3FYy2nVNW1QTnNjgBQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-load-config@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" + integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ== + dependencies: + cosmiconfig "^4.0.0" + import-cwd "^2.0.0" + +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-merge-longhand@^4.0.6: + version "4.0.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.7.tgz#77430fa60e36745887c1c725ab3782c40f48363d" + integrity sha512-b2g9jC52xY0bwl8Dz1Xzfvn8x1KfmSQ0O8rc88hiv0bmYM6ky3xk1Zq128UClizM6SMBx0w7aqfrpS9u71d4Ow== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-longhand@^4.0.9: + version "4.0.9" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.9.tgz#c2428b994833ffb2a072f290ca642e75ceabcd6f" + integrity sha512-UVMXrXF5K/kIwUbK/crPFCytpWbNX2Q3dZSc8+nQUgfOHrCT4+MHncpdxVphUlQeZxlLXUJbDyXc5NBhTnS2tA== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.2.tgz#2be44401bf19856f27f32b8b12c0df5af1b88e74" + integrity sha512-UiuXwCCJtQy9tAIxsnurfF0mrNHKc4NnNx6NxqmzNNjXpQwLSukUxELHTRF0Rg1pAmcoKLih8PwvZbiordchag== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.1.tgz#6da95c6e92a809f956bb76bf0c04494953e1a7dd" + integrity sha512-pySEW3E6Ly5mHm18rekbWiAjVi/Wj8KKt2vwSfVFAWdW6wOIekgqxKxLU7vJfb107o3FDNPkaYFCxGAJBFyogA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.1.tgz#5b2e2d0264dd645ef5d68f8fec0d4c38c1cf93d2" + integrity sha512-h4W0FEMEzBLxpxIVelRtMheskOKKp52ND6rJv+nBS33G1twu2tCyurYj/YtgU76+UDCvWeNs0hs8HFAWE2OUFg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.1.tgz#a891c197977cc37abf60b3ea06b84248b1c1e9cd" + integrity sha512-8+plQkomve3G+CodLCgbhAKrb5lekAnLYuL1d7Nz+/7RANpBEVdgBkPNwljfSKvZ9xkkZTZITd04KP+zeJTJqg== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^1.2.0: + version "1.2.1" + resolved "http://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" + integrity sha1-3IfjQUjsfqtfeR981YSYMzdbdBo= + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "http://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz#d9a83d47c716e8a980f22f632c8b0458cfb48a4c" + integrity sha512-R5mC4vaDdvsrku96yXP7zak+O3Mm9Y8IslUobk7IMP+u/g+lXvcN4jngmHY5zeJnrQvE13dfAg5ViU05ZFDwdg== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.1.tgz#ee2d4b67818c961964c6be09d179894b94fd6ba1" + integrity sha512-GNoOaLRBM0gvH+ZRb2vKCIujzz4aclli64MBwDuYGU2EY53LwiP7MxOZGE46UGtotrSnmarPPZ69l2S/uxdaWA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.1.tgz#5293f234b94d7669a9f805495d35b82a581c50e5" + integrity sha512-fFHPGIjBUyUiswY2rd9rsFcC0t3oRta4wxE1h3lpwfQZwFeFjXFSiDtdJ7APCmHQOnUZnqYBADNRPKPwFAONgA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.1.tgz#23c5030c2cc24175f66c914fa5199e2e3c10fef3" + integrity sha512-IJoexFTkAvAq5UZVxWXAGE0yLoNN/012v7TQh5nDo6imZJl2Fwgbhy3J2qnIoaDBrtUP0H7JrXlX1jjn2YcvCQ== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.1.tgz#8be83e0b9cb3ff2d1abddee032a49108f05f95d7" + integrity sha512-1nOtk7ze36+63ONWD8RCaRDYsnzorrj+Q6fxkQV+mlY5+471Qx9kspqv0O/qQNMeApg8KNrRf496zHwJ3tBZ7w== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.1.tgz#d14cb639b61238418ac8bc8d3b7bdd65fc86575e" + integrity sha512-U8MBODMB2L+nStzOk6VvWWjZgi5kQNShCyjRhMT3s+W9Jw93yIjOnrEkKYD3Ul7ChWbEcjDWmXq0qOL9MIAnAw== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.1.tgz#2e3b432ef3e489b18333aeca1f1295eb89be9fc2" + integrity sha512-PeJiLgJWPzkVF8JuKSBcylaU+hDJ/TX3zqAMIjlghgn1JBi6QwQaDZoDIlqWRcCAI8SxKrt3FCPSRmOgKRB97Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.2.tgz#bac8e325d67510ee01fa460676dc8ea9e3b40f15" + integrity sha512-epUiC39NonKUKG+P3eAOKKZtm5OtAtQJL7Ye0CBN1f+UQTHzqotudp+hki7zxXm7tT0ZAKDMBj1uihpPjP25ug== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.1.tgz#8600d5553bdd3ad640f43bff81eb52f8760d4561" + integrity sha512-sZVr3QlGs0pjh6JAIe6DzWvBaqYw05V1t3d9Tp+VnFRT5j+rsqoWsysh/iSD7YNsULjq9IAylCznIwVd5oU/zA== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@^3.0.0, postcss-selector-parser@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3: + version "5.0.0-rc.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0-rc.3.tgz#c4525dcc8eb90166c53dcbf0cb9317ceff5a15b5" + integrity sha512-kBl1vc+zJgWCBmmxEXE2/15tmmYdD50lO5r6tLNXEx3K4LtszdLFaSNo8SNVuoI+BGODbWhavoG/n1DrYphBsw== + dependencies: + babel-eslint "^8.2.3" + cssesc "^1.0.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.1.tgz#5628cdb38f015de6b588ce6d0bf0724b492b581d" + integrity sha512-YD5uIk5NDRySy0hcI+ZJHwqemv2WiqqzDgtvgMzO8EGSkK5aONyX8HMVFRFJSdO8wUWTuisUFn/d7yRRbBr5Qw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss@^6.0.1, postcss@^6.0.20, postcss@^6.0.23: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.2: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55" + integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.5.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier@1.13.7: + version "1.13.7" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281" + integrity sha512-KIU72UmYPGk4MujZGYMFwinB7lOf2LsDNGSOC8ufevsrPLISrZbNJlWstRi3m0AMuszbH+EFSQ/r6w56RSPK6w== + +pretty-error@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +private@^0.1.6: + version "0.1.8" + resolved "http://registry.npm.taobao.org/private/download/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8= + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o= + +process@^0.11.10: + version "0.11.10" + resolved "http://registry.npm.taobao.org/process/download/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" + integrity sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise@^7.1.1: + version "7.3.1" + resolved "http://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078= + dependencies: + asap "~2.0.3" + +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + +prr@~1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24: + version "1.1.29" + resolved "http://registry.npm.taobao.org/psl/download/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + integrity sha1-YPWA02AXC7cip5fMcEQR5tqFDGc= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "http://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA= + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk= + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "http://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4= + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@2.x.x, punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.5.2, qs@~6.5.2: + version "6.5.2" + resolved "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "http://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "http://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" + integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== + +raf@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" + integrity sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "http://registry.npm.taobao.org/randombytes/download/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + integrity sha1-0wLFIpSFiISKjTAMkytEwkIx2oA= + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "http://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha1-ySGW/IarQr6YPxvzF3giSTHWFFg= + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.0.3, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.2.7: + version "1.2.8" + resolved "http://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0= + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" + integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= + dependencies: + normalize-package-data "^2.3.2" + parse-json "^4.0.0" + pify "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@1.0: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.0.0: + version "2.2.1" + resolved "http://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha1-DodiKjMlqjPokihcr4tOhGUppSU= + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +redent@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "http://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + integrity sha1-EHQFr8xKGQ7F7UUOyqAO0Mr6ekw= + dependencies: + regenerate "^1.4.0" + +regenerate@^1.2.1, regenerate@^1.4.0: + version "1.4.0" + resolved "http://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha1-SoVuxLVuQHfFV1icroXnpMiGmhE= + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk= + +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "http://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + integrity sha1-JkvZ/zioziSwbgY2SWsshWtXvLs= + dependencies: + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/regexpu-core/download/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.2.0" + resolved "http://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" + integrity sha1-o3RPoDgGz/4UbepEIaPnO9zEex0= + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.4.0" + regjsparser "^0.3.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "http://registry.npm.taobao.org/regjsgen/download/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsgen@^0.4.0: + version "0.4.0" + resolved "http://registry.npm.taobao.org/regjsgen/download/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" + integrity sha1-wetMiaIJJj+HF8eCWRUjkT7eJWE= + +regjsparser@^0.1.4: + version "0.1.5" + resolved "http://registry.npm.taobao.org/regjsparser/download/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + +regjsparser@^0.3.0: + version "0.3.0" + resolved "http://registry.npm.taobao.org/regjsparser/download/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" + integrity sha1-PDJtp/z9afoNMyV1pByMDN9YjJY= + dependencies: + jsesc "~0.5.0" + +regression@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regression/-/regression-2.0.1.tgz#8d29c3e8224a10850c35e337e85a8b2fac3b0c87" + integrity sha1-jSnD6CJKEIUMNeM36FqLL6w7DIc= + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.2.tgz#12d310f255360c07ad8fde253f6c9e9de372d2aa" + integrity sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg== + dependencies: + css-select "^1.1.0" + dom-converter "~0.2" + htmlparser2 "~3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4= + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +request@^2.83.0, request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha1-nC/KT301tZLv5Xx/ClXoEFIST+8= + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resize-observer-polyfill@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69" + integrity sha512-M2AelyJDVR/oLnToJLtuDJRBBWUGUvvGigj1411hXhAdyFWqMaqHp7TixW3FpiLuVaikIcR1QL+zqoJoZlOgpg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: + version "1.8.1" + resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha1-gvHsGaQjrB+9CAsLqwa6NuhKeiY= + dependencies: + path-parse "^1.0.5" + +resolve@~1.7.1: + version "1.7.1" + resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" + integrity sha1-qt1lY3T9KYruiVvAJrgpdBhnf9M= + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +resumer@~0.0.0: + version "0.0.0" + resolved "http://registry.npm.taobao.org/resumer/download/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + dependencies: + through "~2.3.4" + +ret@~0.1.10: + version "0.1.15" + resolved "http://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +right-align@^0.1.1: + version "0.1.3" + resolved "http://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "http://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw= + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup@^0.25.8: + version "0.25.8" + resolved "http://registry.npm.taobao.org/rollup/download/rollup-0.25.8.tgz#bf6ce83b87510d163446eeaa577ed6a6fc5835e0" + integrity sha1-v2zoO4dRDRY0Ru6qV37WpvxYNeA= + dependencies: + chalk "^1.1.1" + minimist "^1.2.0" + source-map-support "^0.3.2" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "http://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rw@1, rw@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= + +rxjs@^6.1.0: + version "6.3.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" + integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= + +safe-regex@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= + +sass-graph@^2.2.4: + version "2.2.4" + resolved "http://registry.npm.taobao.org/sass-graph/download/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" + integrity sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w== + dependencies: + clone-deep "^2.0.1" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + neo-async "^2.5.0" + pify "^3.0.0" + semver "^5.5.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^0.4.2, schema-utils@^0.4.4: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A= + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "http://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.9.1: + version "1.10.4" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" + integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== + dependencies: + node-forge "0.7.5" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.6.0" + resolved "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha1-fnQlb7qknHWqfHogXMInmcrIAAQ= + +semver@~5.3.0: + version "5.3.0" + resolved "http://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "http://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + integrity sha1-GqM2FiyIqJDdrVOEuuvJOmVRYf4= + +serve-index@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "http://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "http://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA== + dependencies: + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" + +shallow-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.0.0.tgz#508d1838b3de590ab8757b011b25e430900945f7" + integrity sha1-UI0YOLPeWQq4dXsBGyXkMJAJRfc= + +shallowequal@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shell-quote@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-statistics@~6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/simple-statistics/-/simple-statistics-6.1.1.tgz#e3a0799ffc49914d6f421c5a4ac585f6a13e2bad" + integrity sha512-zGwn0DDRa9Zel4H4n2pjTFIyGoAGpnpjrGIctreCxj5XWrcx9v7Xy7270FkC967WMmcvuc8ZU7m0ZG+hGN7gAA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + +slice-ansi@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.0.0.tgz#5373bdb8559b45676e8541c66916cdd6251612e7" + integrity sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" + integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ= + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk= + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.3.2: + version "0.3.3" + resolved "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.3.3.tgz#34900977d5ba3f07c7757ee72e73bb1a9b53754f" + integrity sha1-NJAJd9W6PwfHdX7nLnO7GptTdU8= + dependencies: + source-map "0.1.32" + +source-map-support@~0.5.6: + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.1.32: + version "0.1.32" + resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" + integrity sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.4.2: + version "0.4.4" + resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.7" + resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= + +spdx-correct@^3.0.0: + version "3.0.2" + resolved "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" + integrity sha1-GbtAnpG0exrVQVkkP3MSqFjbPC4= + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc= + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha1-meEZt6XaAOBUkcn6M4t5BII7QdA= + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.2" + resolved "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" + integrity sha1-pZ78CXhMKlutoTz+r1x13SFARNI= + +spdy-transport@^2.0.18: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" + integrity sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g== + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + integrity sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw= + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "http://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.15.2" + resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" + integrity sha1-yUbWvZsaOdDoY1dj9SQtbtbctik= + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^5.2.4: + version "5.3.0" + resolved "http://registry.npm.taobao.org/ssri/download/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + integrity sha1-ujhyycbTOgcEp9cf8EXl7EiZnQY= + dependencies: + safe-buffer "^5.1.1" + +ssri@^6.0.0, ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stable@~0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stackframe@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b" + integrity sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw== + +static-extend@^0.1.1: + version "0.1.2" + resolved "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "http://registry.npm.taobao.org/stdout-stream/download/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4= + dependencies: + readable-stream "^2.0.1" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "http://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha1-6+J6DDibBPvMIzZClS4Qcxr6m64= + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "http://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw= + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c= + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string.prototype.padend@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" + integrity sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.4.3" + function-bind "^1.0.2" + +string.prototype.padstart@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz#5bcfad39f4649bb2d031292e19bcf0b510d4b242" + integrity sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.4.3" + function-bind "^1.0.2" + +string.prototype.trim@~1.1.2: + version "1.1.2" + resolved "http://registry.npm.taobao.org/string.prototype.trim/download/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" + +string_decoder@^1.0.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha1-/obnOLGVRK/nBGkkOyoe6SQOro0= + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" + integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== + dependencies: + ansi-regex "^4.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +style-loader@^0.23.1: + version "0.23.1" + resolved "http://registry.npm.taobao.org/style-loader/download/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha1-y5FUYG8+dxq2xKtjcCahBJF02SU= + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +stylehacks@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.1.tgz#3186595d047ab0df813d213e51c8b94e0b9010f2" + integrity sha512-TK5zEPeD9NyC1uPIdjikzsgWxdQQN/ry1X3d1iOz1UkYDCmcr928gWD1KHgyC27F50UnE0xCTrBOO1l6KR8M4w== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= + dependencies: + has-flag "^3.0.0" + +svgo@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.1.1.tgz#12384b03335bcecd85cfa5f4e3375fed671cb985" + integrity sha512-GBkJbnTuFpM4jFbiERHDWhZc/S/kpHToqmZag3aEBjPYK44JAN2QBjvrGIxLOoCyMZjuFQIfTO2eJd8uwLY/9g== + dependencies: + coa "~2.0.1" + colors "~1.1.2" + css-select "^2.0.0" + css-select-base-adapter "~0.1.0" + css-tree "1.0.0-alpha.28" + css-url-regex "^1.1.0" + csso "^3.5.0" + js-yaml "^3.12.0" + mkdirp "~0.5.1" + object.values "^1.0.4" + sax "~1.2.4" + stable "~0.1.6" + unquote "~1.1.1" + util.promisify "~1.0.0" + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +table@^5.0.2: + version "5.1.1" + resolved "https://registry.yarnpkg.com/table/-/table-5.1.1.tgz#92030192f1b7b51b6eeab23ed416862e47b70837" + integrity sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw== + dependencies: + ajv "^6.6.1" + lodash "^4.17.11" + slice-ansi "2.0.0" + string-width "^2.1.1" + +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.1" + resolved "http://registry.npm.taobao.org/tapable/download/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" + integrity sha1-TSl5I8WnKkI2DeKrUtrfquwAAY4= + +tape@^4.5.1: + version "4.9.1" + resolved "http://registry.npm.taobao.org/tape/download/tape-4.9.1.tgz#1173d7337e040c76fbf42ec86fcabedc9b3805c9" + integrity sha1-EXPXM34EDHb79C7Ib8q+3Js4Bck= + dependencies: + deep-equal "~1.0.1" + defined "~1.0.0" + for-each "~0.3.3" + function-bind "~1.1.1" + glob "~7.1.2" + has "~1.0.3" + inherits "~2.0.3" + minimist "~1.2.0" + object-inspect "~1.6.0" + resolve "~1.7.1" + resumer "~0.0.0" + string.prototype.trim "~1.1.2" + through "~2.3.8" + +tar@^2.0.0: + version "2.2.1" + resolved "http://registry.npm.taobao.org/tar/download/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tar@^4: + version "4.4.8" + resolved "http://registry.npm.taobao.org/tar/download/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha1-sZ7sP94qluZGZt+f20DFyhvDdH0= + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +terser-webpack-plugin@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" + integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.8.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.8.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0" + integrity sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + source-map-support "~0.5.6" + +text-table@^0.2.0, text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +thread-loader@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-1.2.0.tgz#35dedb23cf294afbbce6c45c1339b950ed17e7a4" + integrity sha512-acJ0rvUk53+ly9cqYWNOpPqOgCkNpmHLPDGduNm4hDQWF7EDKEJXAopG9iEWsPPcml09wePkq3NF+ZUqnO6tbg== + dependencies: + async "^2.3.0" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + +through2@^2.0.0: + version "2.0.5" + resolved "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0= + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6, through@~2.3.4, through@~2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" + integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "http://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha1-HSjj0qrfHVpZlsTp+VYBzQU0gK4= + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "http://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +topo@3.x.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.0.tgz#37e48c330efeac784538e0acd3e62ca5e231fe7a" + integrity sha512-Tlu1fGlR90iCdIPURqPiufqAlCZYzLjHYVVbcFWDMcX7+tK8hdZWAfsMrD/pBul9jqHHwFjNdf1WaxA9vTRRhw== + dependencies: + hoek "5.x.x" + +topojson-client@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.0.0.tgz#1f99293a77ef42a448d032a81aa982b73f360d2f" + integrity sha1-H5kpOnfvQqRI0DKoGqmCtz82DS8= + dependencies: + commander "2" + +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= + +tough-cookie@>=2.3.3, tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-right@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "http://registry.npm.taobao.org/true-case-path/download/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0= + dependencies: + glob "^7.1.2" + +tryer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +tslib@^1.9.0: + version "1.9.3" + resolved "http://registry.npm.taobao.org/tslib/download/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY= + +tty-browserify@0.0.0: + version "0.0.0" + resolved "http://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +uglify-js@3.4.x: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + +uglify-js@^2.6.2: + version "2.8.29" + resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "http://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha1-JhmADEyCWADv3YNDr33Zkzy+KBg= + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "http://registry.npm.taobao.org/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw= + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + integrity sha1-nx3HaSbWzPRSMQVk/YNKzgWWY9Q= + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "http://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + integrity sha1-WlM/MbQxfqdvF9gH+g0RZUYRHdA= + +union-value@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.0: + version "1.1.1" + resolved "http://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA= + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha1-Xp7cbRzo+yZNsYpQfvm9hURFHKY= + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.0.5: + version "1.1.0" + resolved "http://registry.npm.taobao.org/upath/download/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + integrity sha1-NSVll+RqWB20eT0M5H+prr/J+r0= + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.2.2" + resolved "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha1-lMVA4f93KVbiKZUHwBCupsiDjrA= + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8" + integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg== + dependencies: + loader-utils "^1.1.0" + mime "^2.0.3" + schema-utils "^1.0.0" + +url-parse@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15" + integrity sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw== + dependencies: + querystringify "^2.0.0" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "http://registry.npm.taobao.org/url/download/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "http://registry.npm.taobao.org/use/download/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0, util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA= + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "http://registry.npm.taobao.org/util/download/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.10.3: + version "0.10.4" + resolved "http://registry.npm.taobao.org/util/download/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha1-OqASW/5mikZy3liFfTrOJ+y3aQE= + dependencies: + inherits "2.0.3" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1, uuid@^3.3.2: + version "3.3.2" + resolved "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE= + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== + +venn.js@~0.2.20: + version "0.2.20" + resolved "http://registry.npm.taobao.org/venn.js/download/venn.js-0.2.20.tgz#3f0e50cc75cba1f58692a8a32f67bd7aaf1aa6fa" + integrity sha1-Pw5QzHXLofWGkqijL2e9eq8apvo= + dependencies: + d3-selection "^1.0.2" + d3-transition "^1.0.1" + fmin "0.0.2" + +verror@1.10.0: + version "1.10.0" + resolved "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +viser-vue@^2.3.3: + version "2.4.2" + resolved "http://registry.npm.taobao.org/viser-vue/download/viser-vue-2.4.2.tgz#f67c63e17fad58985cd8db73acb3d39336d2abc1" + integrity sha1-9nxj4X+tWJhc2NtzrLPTkzbSq8E= + dependencies: + "@types/node" "*" + viser "^2.0.0" + vue "^2.5.3" + +viser@^2.0.0: + version "2.4.2" + resolved "http://registry.npm.taobao.org/viser/download/viser-2.4.2.tgz#9c145fdf7d6510e8da2b2886ed29d3c3ebe3cccd" + integrity sha1-nBRf331lEOjaKyiG7SnTw+vjzM0= + dependencies: + "@antv/g2" "^3.3.0" + "@antv/g2-brush" "^0.0.2" + "@antv/g2-plugin-slider" "^2.1.0" + "@types/d3-format" "*" + "@types/lodash" "*" + "@types/node" "^8.0.53" + d3-format "^1.3.0" + lodash "^4.17.4" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "http://registry.npm.taobao.org/vm-browserify/download/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= + dependencies: + indexof "0.0.1" + +vue-cropper@^0.4.4: + version "0.4.6" + resolved "http://registry.npm.taobao.org/vue-cropper/download/vue-cropper-0.4.6.tgz#be08882ce105ce6c151b4c7f0ea2c1baf82c81fd" + integrity sha1-vgiILOEFzmwVG0x/DqLBuvgsgf0= + dependencies: + "@babel/core" "^7.1.2" + "@babel/plugin-transform-runtime" "^7.1.0" + "@babel/preset-env" "^7.1.0" + babel-loader "^8.0.0-beta.0" + babel-plugin-transform-runtime "^6.23.0" + babel-runtime "^6.26.0" + css-loader "^1.0.0" + style-loader "^0.23.1" + vue "^2.5.17" + vue-template-compiler "^2.5.17" + webpack "^4.20.2" + +vue-eslint-parser@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" + integrity sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw== + dependencies: + debug "^3.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.2" + esquery "^1.0.0" + lodash "^4.17.4" + +vue-eslint-parser@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-3.3.0.tgz#06b195d18bb66ac72c6b7f2469b549109a61d72c" + integrity sha512-gUsSihfwXmSIbxtqq8YT9CBdkqTHj+6ahj+glY6vJSYu0ylMHQ1A9ClC1YkF5YLRs+WShAwJklXfiL8CEZhgog== + dependencies: + debug "^4.1.0" + eslint-scope "^4.0.0" + eslint-visitor-keys "^1.0.0" + espree "^4.1.0" + esquery "^1.0.1" + lodash "^4.17.11" + +vue-hot-reload-api@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.1.tgz#b2d3d95402a811602380783ea4f566eb875569a2" + integrity sha512-AA86yKZ5uOKz87/q1UpngEXhbRkaYg1b7HMMVRobNV1IVKqZe8oLIzo6iMocVwZXnYitlGwf2k4ZRLOZlS8oPQ== + +vue-loader@^15.4.2: + version "15.4.2" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.4.2.tgz#812bb26e447dd3b84c485eb634190d914ce125e2" + integrity sha512-nVV27GNIA9MeoD8yQ3dkUzwlAaAsWeYSWZHsu/K04KCD339lW0Jv2sJWsjj3721SP7sl2lYdPmjcHgkWQSp5bg== + dependencies: + "@vue/component-compiler-utils" "^2.0.0" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-ls@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vue-ls/-/vue-ls-3.2.0.tgz#33356ad3ec9c30dac203757cf4036abe4ff767b3" + integrity sha512-39FGQMrT9NbG5WGDJfxWj19ZD1tsVoBBN1n8qvq6/+uRB9BansQ9NSyclQ9TzZatRkkM/VEQo5oTsijdM5hGFw== + +vue-ref@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/vue-ref/-/vue-ref-1.0.3.tgz#5b7bbfc6f5833e13f5a9155ac686fafdb03dbcad" + integrity sha512-6t9bwx6qJGKF+Mo6wEQWMzBAwx+h/oiEKuTC4+eiKzLdIRDPbbvTpsemWFsOKBOUwRGi6WKKqMzVQkkE8QcEfg== + +vue-router@^3.0.1: + version "3.0.2" + resolved "http://registry.npm.taobao.org/vue-router/download/vue-router-3.0.2.tgz#dedc67afe6c4e2bc25682c8b1c2a8c0d7c7e56be" + integrity sha1-3txnr+bE4rwlaCyLHCqMDXx+Vr4= + +vue-style-loader@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" + integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ== + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@^2.5.17: + version "2.5.17" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.17.tgz#52a4a078c327deb937482a509ae85c06f346c3cb" + integrity sha512-63uI4syCwtGR5IJvZM0LN5tVsahrelomHtCxvRkZPJ/Tf3ADm1U1wG6KWycK3qCfqR+ygM5vewUvmJ0REAYksg== + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" + integrity sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg== + +vue@^2.5.17, vue@^2.5.3: + version "2.5.17" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.17.tgz#0f8789ad718be68ca1872629832ed533589c6ada" + integrity sha512-mFbcWoDIJi0w0Za4emyLiW72Jae0yjANHbCVquMKijcavBGypqlF7zHRgMa5k4sesdv7hv2rB4JPdZfR+TPfhQ== + +vuex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2" + integrity sha512-wLoqz0B7DSZtgbWL1ShIBBCjv22GV5U+vcBFox658g6V0s4wZV9P4YjCNyoHSyIBpj1f29JBoNQIqD82cR4O3w== + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + +watchpack@^1.5.0: + version "1.6.0" + resolved "http://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha1-S8EsLr6KonenHx0/FNaFx7RGzQA= + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webpack-bundle-analyzer@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.3.tgz#dbc7fff8f52058b6714a20fddf309d0790e3e0a0" + integrity sha512-naLWiRfmtH4UJgtUktRTLw6FdoZJ2RvCR9ePbwM9aRMsS/KjFerkPZG9epEvXRAw5d5oPdrs9+3p+afNjxW8Xw== + dependencies: + acorn "^5.7.3" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-chain@^4.11.0: + version "4.12.1" + resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-4.12.1.tgz#6c8439bbb2ab550952d60e1ea9319141906c02a6" + integrity sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ== + dependencies: + deepmerge "^1.5.2" + javascript-stringify "^1.6.0" + +webpack-dev-middleware@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" + integrity sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA== + dependencies: + memory-fs "~0.4.1" + mime "^2.3.1" + range-parser "^1.0.3" + webpack-log "^2.0.0" + +webpack-dev-server@^3.1.14: + version "3.1.10" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz#507411bee727ee8d2fdffdc621b66a64ab3dea2b" + integrity sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^3.1.0" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "~0.18.0" + import-local "^2.0.0" + internal-ip "^3.0.1" + ip "^1.1.5" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" + schema-utils "^1.0.0" + selfsigned "^1.9.1" + serve-index "^1.7.2" + sockjs "0.3.19" + sockjs-client "1.3.0" + spdy "^3.4.1" + strip-ansi "^3.0.0" + supports-color "^5.1.0" + webpack-dev-middleware "3.4.0" + webpack-log "^2.0.0" + yargs "12.0.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" + integrity sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ== + dependencies: + lodash "^4.17.5" + +webpack-sources@^1.1.0, webpack-sources@^1.3.0: + version "1.3.0" + resolved "http://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha1-KijcufH0X+lg2PFJMlK17mUw+oU= + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.20.2, webpack@^4.26.1: + version "4.26.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.26.1.tgz#ff3a9283d363c07b3494dfa702d08f4f2ef6cb39" + integrity sha512-i2oOvEvuvLLSuSCkdVrknaxAhtUZ9g+nLSoHCWV0gDzqGX2DXaCrMmMUpbRsTSSLrUqAI56PoEiyMUZIZ1msug== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/wasm-edit" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + acorn "^5.6.2" + acorn-dynamic-import "^3.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^0.4.4" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" + +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +which-module@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1, which@^1.2.9: + version "1.3.1" + resolved "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "http://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha1-rgdOa9wMFKQx6ATmJFScYzsABFc= + dependencies: + string-width "^1.0.2 || 2" + +window-size@0.1.0: + version "0.1.0" + resolved "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= + +wolfy87-eventemitter@~5.1.0: + version "5.1.0" + resolved "http://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.1.0.tgz#35c1ac0dd1ac0c15e35d981508fc22084a13a011" + integrity sha1-NcGsDdGsDBXjXZgVCPwiCEoToBE= + +wordwrap@0.0.2: + version "0.0.2" + resolved "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +worker-farm@^1.5.2: + version "1.6.0" + resolved "http://registry.npm.taobao.org/worker-farm/download/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha1-rsxAWXb6talVJhgIRvDboojzpKA= + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= + dependencies: + mkdirp "^0.5.1" + +ws@^6.0.0: + version "6.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" + integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== + dependencies: + async-limiter "~1.0.0" + +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "http://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +y18n@^3.2.1: + version "3.2.1" + resolved "http://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "http://registry.npm.taobao.org/yallist/download/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha1-tLBJ4xS+VF486AIjbWzSLNkcPek= + +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + +yargs@12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== + dependencies: + cliui "^4.0.0" + decamelize "^2.0.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "http://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yorkie@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9" + integrity sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw== + dependencies: + execa "^0.8.0" + is-ci "^1.0.10" + normalize-path "^1.0.0" + strip-indent "^2.0.0" diff --git a/jeecg-boot/docs/- 项目说明 b/jeecg-boot/docs/- 项目说明 new file mode 100644 index 0000000..8d6e9ee --- /dev/null +++ b/jeecg-boot/docs/- 项目说明 @@ -0,0 +1,11 @@ + +一、技术文档 + http://jeecg-boot.mydoc.io + +二、部署文档 + 修改redis、数据库配置文件 + 修改上传文件目录 + 修改登录页面提示账号密码 + 修改前端API的图片访问域名 + + 默认账号密码: admin/123456 \ No newline at end of file diff --git a/jeecg-boot/docs/db/sys-init-20190225.sql b/jeecg-boot/docs/db/sys-init-20190225.sql new file mode 100644 index 0000000..e164ad8 --- /dev/null +++ b/jeecg-boot/docs/db/sys-init-20190225.sql @@ -0,0 +1,1342 @@ +/* +Navicat MySQL Data Transfer + +Source Server : mysql +Source Server Version : 50037 +Source Host : localhost:3306 +Source Database : jeecg-boot + +Target Server Type : MYSQL +Target Server Version : 50037 +File Encoding : 65001 + +Date: 2019-02-25 16:29:00 +*/ + +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for demo +-- ---------------------------- +DROP TABLE IF EXISTS `demo`; +CREATE TABLE `demo` ( + `id` varchar(50) NOT NULL COMMENT '主键ID', + `name` varchar(30) default NULL COMMENT '姓名', + `key_word` varchar(255) default NULL COMMENT '关键词', + `punch_time` datetime default NULL COMMENT '打卡时间', + `salary_money` decimal(10,3) default NULL COMMENT '工资', + `bonus_money` double(10,2) default NULL COMMENT '奖金', + `sex` varchar(2) default NULL COMMENT '性别 {男:1,女:2}', + `age` int(11) default NULL COMMENT '年龄', + `birthday` date default NULL COMMENT '生日', + `email` varchar(50) default NULL COMMENT '邮箱', + `content` varchar(1000) default NULL COMMENT '个人简介', + `create_by` varchar(32) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(32) default NULL COMMENT '修改人', + `update_time` datetime default NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of demo +-- ---------------------------- +INSERT INTO `demo` VALUES ('1c2ba51b29a42d9de02bbd708ea8121a', '777777', '777', '2018-12-07 19:43:17', null, null, null, '7', '2018-12-07', null, null, null, null, 'admin', '2019-02-21 18:26:04'); +INSERT INTO `demo` VALUES ('1dc29e80be14d1400f165b5c6b30c707', 'zhang daihao', null, null, null, null, '2', null, null, 'zhangdaiscott@163.com', null, null, null, null, null); +INSERT INTO `demo` VALUES ('304e651dc769d5c9b6e08fb30457a602', '小白兔', null, null, null, null, '2', '28', null, null, null, 'scott', '2019-01-19 13:12:53', 'qinfeng', '2019-01-19 13:13:12'); +INSERT INTO `demo` VALUES ('4', 'Sandy', '开源,很好', '2018-12-15 00:00:00', null, null, '2', '21', '2018-12-15', 'test4@baomidou.com', '聪明00', null, null, null, null); +INSERT INTO `demo` VALUES ('42c08b1a2e5b2a96ffa4cc88383d4b11', '秦50090', null, '2019-01-05 20:33:31', null, null, null, '28', '2019-01-05', null, null, 'admin', '2019-01-19 20:33:54', 'admin', '2019-01-19 20:34:29'); +INSERT INTO `demo` VALUES ('4436302a0de50bb83025286bc414d6a9', 'zhang daihao', null, null, null, null, null, null, null, 'zhangdaiscott@163.com', null, 'admin', '2019-01-19 15:39:04', null, null); +INSERT INTO `demo` VALUES ('7', 'zhangdaiscott', null, null, null, null, '1', null, '2019-01-03', null, null, null, null, null, null); +INSERT INTO `demo` VALUES ('917e240eaa0b1b2d198ae869b64a81c3', 'zhang daihao', null, null, null, null, '2', '0', '2018-11-29', 'zhangdaiscott@163.com', null, null, null, null, null); +INSERT INTO `demo` VALUES ('94420c5d8fc4420dde1e7196154b3a24', '秦111', null, null, null, null, null, null, null, null, null, 'scott', '2019-01-19 12:54:58', 'qinfeng', '2019-01-19 13:12:10'); +INSERT INTO `demo` VALUES ('b86897900c770503771c7bb88e5d1e9b', 'scott1', '开源、很好、hello', null, null, null, '1', null, null, 'zhangdaiscott@163.com', null, 'scott', '2019-01-19 12:22:34', null, null); +INSERT INTO `demo` VALUES ('c0b7c3de7c62a295ab715943de8a315d', '秦风555', null, null, null, null, null, null, null, null, null, 'admin', '2019-01-19 13:18:30', 'admin', '2019-01-19 13:18:50'); +INSERT INTO `demo` VALUES ('c2c0d49e3c01913067cf8d1fb3c971d2', 'zhang daihao', null, null, null, null, null, null, null, 'zhangdaiscott@163.com', null, 'admin', '2019-01-19 23:37:18', 'admin', '2019-01-21 16:49:06'); +INSERT INTO `demo` VALUES ('d24668721446e8478eeeafe4db66dcff', 'zhang daihao999', null, null, null, null, '1', null, null, 'zhangdaiscott@163.com', null, null, null, null, null); +INSERT INTO `demo` VALUES ('eaa6c1116b41dc10a94eae34cf990133', 'zhang daihao', null, null, null, null, null, null, null, 'zhangdaiscott@163.com', null, null, null, null, null); +INSERT INTO `demo` VALUES ('ffa9da1ad40632dfcabac51d766865bd', '秦999', null, null, null, null, null, null, null, null, null, 'admin', '2019-01-19 23:36:34', 'admin', '2019-02-14 17:30:43'); + +-- ---------------------------- +-- Table structure for jeecg_order_customer +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_order_customer`; +CREATE TABLE `jeecg_order_customer` ( + `id` varchar(32) NOT NULL COMMENT '主键', + `name` varchar(100) NOT NULL COMMENT '客户名', + `sex` varchar(4) default NULL COMMENT '性别', + `idcard` varchar(18) default NULL COMMENT '身份证号码', + `idcard_pic` varchar(500) default NULL COMMENT '身份证扫描件', + `telphone` varchar(32) default NULL COMMENT '电话1', + `order_id` varchar(32) NOT NULL COMMENT '外键', + `create_by` varchar(32) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(32) default NULL COMMENT '修改人', + `update_time` datetime default NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_order_customer +-- ---------------------------- +INSERT INTO `jeecg_order_customer` VALUES ('0e2326ab54710dc4df5eaff164f2a679', '秦风', '1', '370285198602058822', null, '18611788676', '54e739bef5b67569c963c38da52581ec', 'jeecg', '2019-02-20 17:21:02', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('58702a52bd79c093235eac6ab582f0e3', 'zhangdaiscott222', null, null, null, null, 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', '2019-02-21 16:23:23', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('62f6494f9ac9d31c84a07c032096256b', 'x秦风', '1', null, null, null, 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2019-02-15 18:39:29', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('80e45b7f44a8277b5cc46764ede67e4e', '小王', '2', '370285198604033222', null, '18611788674', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', '2019-02-18 10:22:24', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('a28195feae7318b69213b5a264c9bd7b', '张经理', '2', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'jeecg', '2019-02-20 17:21:02', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('bce38126fbd86f5720d97f270f44e72a', 'scott', '2', null, null, null, 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2019-02-15 18:39:29', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('c341b7c1999e62c2b3a4bf3802dad8b7', '小张', '1', '370285198602058211', null, '18611788676', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', '2019-02-18 10:22:24', null, null); + +-- ---------------------------- +-- Table structure for jeecg_order_main +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_order_main`; +CREATE TABLE `jeecg_order_main` ( + `id` varchar(32) NOT NULL COMMENT '主键', + `order_code` varchar(50) default NULL COMMENT '订单号', + `ctype` varchar(500) default NULL COMMENT '订单类型', + `order_date` datetime default NULL COMMENT '订单日期', + `order_money` double(10,3) default NULL COMMENT '订单金额', + `content` varchar(500) default NULL COMMENT '订单备注', + `create_by` varchar(32) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(32) default NULL COMMENT '修改人', + `update_time` datetime default NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_order_main +-- ---------------------------- +INSERT INTO `jeecg_order_main` VALUES ('54e739bef5b67569c963c38da52581ec', 'NC911', '1', '2019-02-18 09:58:51', '40.000', null, 'admin', '2019-02-18 09:58:47', 'admin', '2019-02-18 09:58:59'); +INSERT INTO `jeecg_order_main` VALUES ('b190737bd04cca8360e6f87c9ef9ec4e', 'B0018888', '1', null, null, null, 'admin', '2019-02-15 18:39:29', 'admin', '2019-02-15 18:39:37'); +INSERT INTO `jeecg_order_main` VALUES ('eb13ab35d2946a2b0cfe3452bca1e73f', 'BJ9980', '1', null, '90.000', null, 'admin', '2019-02-16 17:36:42', 'admin', '2019-02-16 17:46:16'); + +-- ---------------------------- +-- Table structure for jeecg_order_ticket +-- ---------------------------- +DROP TABLE IF EXISTS `jeecg_order_ticket`; +CREATE TABLE `jeecg_order_ticket` ( + `id` varchar(32) NOT NULL COMMENT '主键', + `ticket_code` varchar(100) NOT NULL COMMENT '航班号', + `tickect_date` datetime default NULL COMMENT '航班时间', + `order_id` varchar(32) NOT NULL COMMENT '外键', + `create_by` varchar(32) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(32) default NULL COMMENT '修改人', + `update_time` datetime default NULL COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of jeecg_order_ticket +-- ---------------------------- +INSERT INTO `jeecg_order_ticket` VALUES ('17fa15b9e8b396338e83dc66d418e9cb', 'ffff', '2019-02-21 00:00:00', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', '2019-02-21 16:24:14', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('3017078886539ff13f780d6af6ab919f', 'C10029', '2019-02-20 00:00:00', '54e739bef5b67569c963c38da52581ec', 'jeecg', '2019-02-20 17:21:02', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('57ef198c68dfe0ba83709d3afaa097bc', '111', '2019-02-01 00:00:00', 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2019-02-15 18:39:29', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('ba9d22c73af43fa109971ee21e3171ce', 'C10019', '2019-02-18 00:00:00', '54e739bef5b67569c963c38da52581ec', 'jeecg', '2019-02-20 17:21:02', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('c07a0581bdb8915cc70a20fef8e3b2af', '222', '2019-02-23 00:00:00', 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2019-02-15 18:39:29', null, null); + +-- ---------------------------- +-- Table structure for qrtz_blob_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `BLOB_DATA` blob, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_blob_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_calendars +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `SCHED_NAME` varchar(120) NOT NULL, + `CALENDAR_NAME` varchar(200) NOT NULL, + `CALENDAR` blob NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_calendars +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_cron_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `CRON_EXPRESSION` varchar(200) NOT NULL, + `TIME_ZONE_ID` varchar(80) default NULL, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_cron_triggers +-- ---------------------------- +INSERT INTO `qrtz_cron_triggers` VALUES ('quartzScheduler', 'org.jeecg.modules.quartz.job.SampleJob', 'DEFAULT', '0/1 * * * * ?', 'Asia/Shanghai'); + +-- ---------------------------- +-- Table structure for qrtz_fired_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `ENTRY_ID` varchar(95) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `INSTANCE_NAME` varchar(200) NOT NULL, + `FIRED_TIME` bigint(13) NOT NULL, + `SCHED_TIME` bigint(13) NOT NULL, + `PRIORITY` int(11) NOT NULL, + `STATE` varchar(16) NOT NULL, + `JOB_NAME` varchar(200) default NULL, + `JOB_GROUP` varchar(200) default NULL, + `IS_NONCONCURRENT` varchar(1) default NULL, + `REQUESTS_RECOVERY` varchar(1) default NULL, + PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_fired_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_job_details +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `SCHED_NAME` varchar(120) NOT NULL, + `JOB_NAME` varchar(200) NOT NULL, + `JOB_GROUP` varchar(200) NOT NULL, + `DESCRIPTION` varchar(250) default NULL, + `JOB_CLASS_NAME` varchar(250) NOT NULL, + `IS_DURABLE` varchar(1) NOT NULL, + `IS_NONCONCURRENT` varchar(1) NOT NULL, + `IS_UPDATE_DATA` varchar(1) NOT NULL, + `REQUESTS_RECOVERY` varchar(1) NOT NULL, + `JOB_DATA` blob, + PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_job_details +-- ---------------------------- +INSERT INTO `qrtz_job_details` VALUES ('quartzScheduler', 'org.jeecg.modules.quartz.job.SampleJob', 'DEFAULT', null, 'org.jeecg.modules.quartz.job.SampleJob', '0', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C77080000001000000001740009706172616D65746572707800); + +-- ---------------------------- +-- Table structure for qrtz_locks +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `SCHED_NAME` varchar(120) NOT NULL, + `LOCK_NAME` varchar(40) NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_locks +-- ---------------------------- +INSERT INTO `qrtz_locks` VALUES ('quartzScheduler', 'TRIGGER_ACCESS'); + +-- ---------------------------- +-- Table structure for qrtz_paused_trigger_grps +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_paused_trigger_grps +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_scheduler_state +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `SCHED_NAME` varchar(120) NOT NULL, + `INSTANCE_NAME` varchar(200) NOT NULL, + `LAST_CHECKIN_TIME` bigint(13) NOT NULL, + `CHECKIN_INTERVAL` bigint(13) NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_scheduler_state +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_simple_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `REPEAT_COUNT` bigint(7) NOT NULL, + `REPEAT_INTERVAL` bigint(12) NOT NULL, + `TIMES_TRIGGERED` bigint(10) NOT NULL, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_simple_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_simprop_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `STR_PROP_1` varchar(512) default NULL, + `STR_PROP_2` varchar(512) default NULL, + `STR_PROP_3` varchar(512) default NULL, + `INT_PROP_1` int(11) default NULL, + `INT_PROP_2` int(11) default NULL, + `LONG_PROP_1` bigint(20) default NULL, + `LONG_PROP_2` bigint(20) default NULL, + `DEC_PROP_1` decimal(13,4) default NULL, + `DEC_PROP_2` decimal(13,4) default NULL, + `BOOL_PROP_1` varchar(1) default NULL, + `BOOL_PROP_2` varchar(1) default NULL, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_simprop_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `SCHED_NAME` varchar(120) NOT NULL, + `TRIGGER_NAME` varchar(200) NOT NULL, + `TRIGGER_GROUP` varchar(200) NOT NULL, + `JOB_NAME` varchar(200) NOT NULL, + `JOB_GROUP` varchar(200) NOT NULL, + `DESCRIPTION` varchar(250) default NULL, + `NEXT_FIRE_TIME` bigint(13) default NULL, + `PREV_FIRE_TIME` bigint(13) default NULL, + `PRIORITY` int(11) default NULL, + `TRIGGER_STATE` varchar(16) NOT NULL, + `TRIGGER_TYPE` varchar(8) NOT NULL, + `START_TIME` bigint(13) NOT NULL, + `END_TIME` bigint(13) default NULL, + `CALENDAR_NAME` varchar(200) default NULL, + `MISFIRE_INSTR` smallint(2) default NULL, + `JOB_DATA` blob, + PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), + KEY `SCHED_NAME` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- +INSERT INTO `qrtz_triggers` VALUES ('quartzScheduler', 'org.jeecg.modules.quartz.job.SampleJob', 'DEFAULT', 'org.jeecg.modules.quartz.job.SampleJob', 'DEFAULT', null, '1550751226000', '1550751225000', '5', 'PAUSED', 'CRON', '1547697830000', '0', null, '0', ''); + +-- ---------------------------- +-- Table structure for sys_announcement +-- ---------------------------- +DROP TABLE IF EXISTS `sys_announcement`; +CREATE TABLE `sys_announcement` ( + `id` varchar(32) NOT NULL, + `titile` varchar(100) default NULL COMMENT '标题', + `msg_content` text COMMENT '内容', + `start_time` datetime default NULL COMMENT '开始时间', + `end_time` datetime default NULL COMMENT '结束时间', + `sender` varchar(100) default NULL COMMENT '发布人', + `priority` varchar(255) default NULL COMMENT '优先级(L低,M中,H高)', + `msg_type` varchar(10) default NULL COMMENT '通告对象类型(USER:指定用户,ALL:全体用户)', + `send_status` varchar(10) default NULL COMMENT '发布状态(0未发布,1已发布,2已撤销)', + `send_time` datetime default NULL COMMENT '发布时间', + `cancel_time` datetime default NULL COMMENT '撤销时间', + `del_flag` varchar(255) default NULL COMMENT '删除状态(0,正常,1已删除)', + `create_by` varchar(255) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(255) default NULL COMMENT '更新人', + `update_time` datetime default NULL COMMENT '更新时间', + `user_ids` text COMMENT '指定用户', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统通告表'; + +-- ---------------------------- +-- Records of sys_announcement +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_announcement_send +-- ---------------------------- +DROP TABLE IF EXISTS `sys_announcement_send`; +CREATE TABLE `sys_announcement_send` ( + `id` varchar(32) default NULL, + `annt_id` varchar(32) default NULL COMMENT '通告ID', + `user_id` varchar(32) default NULL COMMENT '用户id', + `read_flag` varchar(10) default NULL COMMENT '阅读状态(0未读,1已读)', + `read_time` datetime default NULL COMMENT '阅读时间', + `create_by` varchar(255) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(255) default NULL COMMENT '更新人', + `update_time` datetime default NULL COMMENT '更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户通告阅读标记表'; + +-- ---------------------------- +-- Records of sys_announcement_send +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_depart +-- ---------------------------- +DROP TABLE IF EXISTS `sys_depart`; +CREATE TABLE `sys_depart` ( + `id` varchar(32) NOT NULL COMMENT 'ID', + `parent_id` varchar(32) default NULL COMMENT '父机构ID', + `depart_name` varchar(100) NOT NULL COMMENT '机构/部门名称', + `depart_name_en` varchar(500) default NULL COMMENT '英文名', + `depart_name_abbr` varchar(500) default NULL COMMENT '缩写', + `depart_order` int(11) default '0' COMMENT '排序', + `description` text COMMENT '描述', + `org_type` varchar(10) default NULL COMMENT '机构类型', + `org_code` varchar(64) NOT NULL COMMENT '机构编码', + `mobile` varchar(32) default NULL COMMENT '手机号', + `fax` varchar(32) default NULL COMMENT '传真', + `address` varchar(100) default NULL COMMENT '地址', + `memo` varchar(500) default NULL COMMENT '备注', + `status` varchar(10) default NULL COMMENT '状态(1启用,0不启用)', + `del_flag` varchar(10) default NULL COMMENT '删除状态(0,正常,1已删除)', + `create_by` varchar(50) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建日期', + `update_by` varchar(50) default NULL COMMENT '更新人', + `update_time` datetime default NULL COMMENT '更新日期', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='组织机构表'; + +-- ---------------------------- +-- Records of sys_depart +-- ---------------------------- +INSERT INTO `sys_depart` VALUES ('4f1765520d6346f9bd9c79e2479e5b12', 'c6d7cb4deeac411cb3384b1b31278596', '市场部', null, null, '0', null, '2', 'A01A03', null, null, null, null, null, '0', 'admin', '2019-02-20 17:15:34', null, null); +INSERT INTO `sys_depart` VALUES ('57197590443c44f083d42ae24ef26a2c', 'c6d7cb4deeac411cb3384b1b31278596', '研发部', null, null, '0', null, '2', 'A01A05', null, null, null, null, null, '0', 'admin', '2019-02-21 16:14:41', null, null); +INSERT INTO `sys_depart` VALUES ('67fc001af12a4f9b8458005d3f19934a', 'c6d7cb4deeac411cb3384b1b31278596', '财务部', null, null, '0', null, '2', 'A01A04', null, null, null, null, null, '0', 'admin', '2019-02-21 16:14:35', 'admin', '2019-02-25 12:49:41'); +INSERT INTO `sys_depart` VALUES ('c6d7cb4deeac411cb3384b1b31278596', '', '北京国炬信息技术有限公司', null, null, '0', null, '1', 'A01', null, null, null, null, null, '0', 'admin', '2019-02-11 14:21:51', 'admin', '2019-02-18 23:17:33'); + +-- ---------------------------- +-- Table structure for sys_dict +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict`; +CREATE TABLE `sys_dict` ( + `id` varchar(32) NOT NULL, + `dict_name` varchar(255) default NULL COMMENT '字典名称', + `dict_code` varchar(255) default NULL COMMENT '字典编码', + `description` varchar(255) default NULL COMMENT '描述', + `del_flag` int(11) default NULL COMMENT '删除状态', + `create_by` varchar(255) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(255) default NULL COMMENT '更新人', + `update_time` datetime default NULL COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='字典表'; + +-- ---------------------------- +-- Records of sys_dict +-- ---------------------------- +INSERT INTO `sys_dict` VALUES ('3d9a351be3436fbefb1307d4cfb49bf2', '性别', 'sex', null, '1', null, '2019-01-04 14:56:32', null, null); +INSERT INTO `sys_dict` VALUES ('6b78e3f59faec1a4750acff08030a79b', '用户类型', 'user_type', null, '1', null, '2019-01-04 14:59:01', null, null); + +-- ---------------------------- +-- Table structure for sys_dict_item +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_item`; +CREATE TABLE `sys_dict_item` ( + `id` varchar(255) NOT NULL, + `dict_id` varchar(255) default NULL COMMENT '字典id', + `item_text` varchar(255) default NULL COMMENT '字典项文本', + `item_value` varchar(255) default NULL COMMENT '字典项值', + `description` varchar(255) default NULL COMMENT '描述', + `sort_order` decimal(10,2) default NULL COMMENT '排序', + `status` int(11) default NULL COMMENT '状态(1启用 0不启用)', + `create_by` varchar(255) default NULL, + `create_time` datetime default NULL, + `update_by` varchar(255) default NULL, + `update_time` datetime default NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of sys_dict_item +-- ---------------------------- +INSERT INTO `sys_dict_item` VALUES ('5d84a8634c8fdfe96275385075b105c9', '3d9a351be3436fbefb1307d4cfb49bf2', '女', '2', null, '2.00', '1', null, '2019-01-04 14:56:56', null, '2019-01-04 17:38:12'); +INSERT INTO `sys_dict_item` VALUES ('700e9f030654f3f90e9ba76ab0713551', '6b78e3f59faec1a4750acff08030a79b', '333', '333', null, null, '1', 'admin', '2019-02-21 19:59:47', null, null); +INSERT INTO `sys_dict_item` VALUES ('b57f98b88363188daf38d42f25991956', '6b78e3f59faec1a4750acff08030a79b', '22', '222', null, null, '1', 'admin', '2019-02-21 19:59:43', null, null); +INSERT INTO `sys_dict_item` VALUES ('df168368dcef46cade2aadd80100d8aa', '3d9a351be3436fbefb1307d4cfb49bf2', '男', '1', null, '1.00', '1', null, '2019-01-04 14:56:49', 'admin', '2019-02-25 12:49:31'); + +-- ---------------------------- +-- Table structure for sys_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_log`; +CREATE TABLE `sys_log` ( + `id` varchar(255) NOT NULL, + `log_type` int(11) default NULL COMMENT '日志类型(1登录日志,2操作日志)', + `log_content` varchar(1000) default NULL COMMENT '日志内容', + `operate_type` int(11) default NULL COMMENT '操作类型', + `userid` varchar(255) default NULL COMMENT '操作用户账号', + `username` varchar(255) default NULL COMMENT '操作用户名称', + `ip` varchar(255) default NULL COMMENT 'IP', + `method` varchar(500) default NULL COMMENT '请求java方法', + `request_url` varchar(255) default NULL COMMENT '请求路径', + `request_param` varchar(255) default NULL COMMENT '请求参数', + `request_type` varchar(255) default NULL COMMENT '请求类型', + `cost_time` bigint(20) default NULL COMMENT '耗时', + `create_by` varchar(255) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(255) default NULL COMMENT '更新人', + `update_time` datetime default NULL COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='系统日志表'; + +-- ---------------------------- +-- Records of sys_log +-- ---------------------------- +INSERT INTO `sys_log` VALUES ('b09ccd219a1ce5c7270bb659748b8330', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 15:34:38', null, null); +INSERT INTO `sys_log` VALUES ('a22ddd4b5b0b84bd7794edd24b25fc64', '2', '添加测试DEMO', null, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.add()', null, '[{\"createBy\":\"admin\",\"createTime\":1547883299809,\"email\":\"zhangdaiscott@163.com\",\"id\":\"7eac655877842eb39dc2f0469f3964ec\",\"name\":\"zhang daihao\"}]', null, '25', 'admin', '2019-01-19 15:34:59', null, null); +INSERT INTO `sys_log` VALUES ('07a0b3f8b4140a7a586305c2f40a2310', '2', '删除测试DEMO', null, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.delete()', null, '[\"7eac655877842eb39dc2f0469f3964ec\"]', null, '14', 'admin', '2019-01-19 15:38:11', null, null); +INSERT INTO `sys_log` VALUES ('d7902eeab2c34611fad046a79bff1c1b', '2', '添加测试DEMO', null, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.add()', null, '[{\"createBy\":\"admin\",\"createTime\":1547883544104,\"email\":\"zhangdaiscott@163.com\",\"id\":\"4436302a0de50bb83025286bc414d6a9\",\"name\":\"zhang daihao\"}]', null, '1682', 'admin', '2019-01-19 15:39:05', null, null); +INSERT INTO `sys_log` VALUES ('a68160f37cace166fedd299c4ca0be10', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 15:40:00', null, null); +INSERT INTO `sys_log` VALUES ('c6c0316b6989bf1eea0a3803f593bf69', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 15:47:19', null, null); +INSERT INTO `sys_log` VALUES ('4b1341863a8fffeccda8bbe413bd815f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 15:59:52', null, null); +INSERT INTO `sys_log` VALUES ('ed50b1fbc80c3b953f4551081b10335e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 16:19:06', null, null); +INSERT INTO `sys_log` VALUES ('dabdcb8e15ea9215a1af22f7567ff73d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 16:48:13', null, null); +INSERT INTO `sys_log` VALUES ('446724ea6dd41f4a03111c42e00d80cd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 16:56:36', null, null); +INSERT INTO `sys_log` VALUES ('0e41fe3a34d5715bf4c88e220663583a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 17:04:06', null, null); +INSERT INTO `sys_log` VALUES ('9f2db1ffaf89518a25cc6701da0c5858', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 17:05:07', null, null); +INSERT INTO `sys_log` VALUES ('954f1ccb8b230d2d7d4858eec3aba0a4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 17:08:37', null, null); +INSERT INTO `sys_log` VALUES ('7374f3a2ccb20216cf8eecb26037ce0a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 18:08:51', null, null); +INSERT INTO `sys_log` VALUES ('130de55edac71aab730786307cc65936', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 20:22:57', null, null); +INSERT INTO `sys_log` VALUES ('0bc44e2d682c9f28525d203589a90b43', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 20:31:08', null, null); +INSERT INTO `sys_log` VALUES ('122edcafd54dd06e12838f41123d9d5d', '2', '添加测试DEMO', null, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.add()', null, '[{\"age\":28,\"birthday\":1546617600000,\"createBy\":\"admin\",\"createTime\":1547901234989,\"id\":\"42c08b1a2e5b2a96ffa4cc88383d4b11\",\"name\":\"秦500\",\"punchTime\":1546691611000}]', null, '21387', 'admin', '2019-01-19 20:34:11', null, null); +INSERT INTO `sys_log` VALUES ('1a570aac0c30ac2955b59e2dc7a6204c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 20:58:26', null, null); +INSERT INTO `sys_log` VALUES ('c18db091677ec01d55e913662b9028a9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 21:19:07', null, null); +INSERT INTO `sys_log` VALUES ('88d8b4b50bdab58c52fe25fa711fbbef', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 21:21:39', null, null); +INSERT INTO `sys_log` VALUES ('6b876be6e384337b36ad28a4a5868be8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 21:22:12', null, null); +INSERT INTO `sys_log` VALUES ('cb6b52fbbdd4c5698c17edaf9960e11e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 21:22:23', null, null); +INSERT INTO `sys_log` VALUES ('fea8e1e2d229557185be0d9a10ebce17', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 21:55:55', null, null); +INSERT INTO `sys_log` VALUES ('c1842fc83cdf0b0cc0264bf093e9c55d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 21:56:15', null, null); +INSERT INTO `sys_log` VALUES ('543970eba4d1c522e3cb597b0fd4ad13', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 22:53:18', null, null); +INSERT INTO `sys_log` VALUES ('e9ce2b3f7ac1fa3f5f7fd247207ca5c0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 22:53:35', null, null); +INSERT INTO `sys_log` VALUES ('0e365a21c60e4460813bdc4e3cb320a3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 23:01:34', null, null); +INSERT INTO `sys_log` VALUES ('d3df1a4057b6d7fb4dab073a727ba21f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 23:14:02', null, null); +INSERT INTO `sys_log` VALUES ('8f616500d666a5a67bc98e7ccd73c2e2', '2', '添加测试DEMO', null, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.add()', null, '[{\"createBy\":\"admin\",\"createTime\":1547912194199,\"id\":\"ffa9da1ad40632dfcabac51d766865bd\",\"name\":\"秦999\"}]', null, '386', 'admin', '2019-01-19 23:36:34', null, null); +INSERT INTO `sys_log` VALUES ('055cf35c8865761b479c7f289dc36616', '2', '添加测试DEMO', null, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.add()', null, '[{\"createBy\":\"admin\",\"createTime\":1547912238787,\"email\":\"zhangdaiscott@163.com\",\"id\":\"c2c0d49e3c01913067cf8d1fb3c971d2\",\"name\":\"zhang daihao\"}]', null, '16', 'admin', '2019-01-19 23:37:18', null, null); +INSERT INTO `sys_log` VALUES ('69e3164d007be2b9834e4fb398186f39', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-19 23:38:17', null, null); +INSERT INTO `sys_log` VALUES ('92e514fee917a1a459c4ffdb0ca42516', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 10:20:52', null, null); +INSERT INTO `sys_log` VALUES ('d3f08843a9b2b3284711e376fb785beb', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 10:58:03', null, null); +INSERT INTO `sys_log` VALUES ('76bea561f662ec0ccf05bc370f1ffe35', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 11:08:55', null, null); +INSERT INTO `sys_log` VALUES ('273081678d85acebaa6615973bff31db', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 15:02:50', null, null); +INSERT INTO `sys_log` VALUES ('b26369680b41d581649cf865e88331e9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 15:03:07', null, null); +INSERT INTO `sys_log` VALUES ('7313b43ff53015d79a58b4dc7c660721', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 15:03:07', null, null); +INSERT INTO `sys_log` VALUES ('f99912c5ff252594f14d31b768f8ad15', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 15:03:10', null, null); +INSERT INTO `sys_log` VALUES ('dcec1957987abbe6658f1f2c96980366', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 15:05:21', null, null); +INSERT INTO `sys_log` VALUES ('c7b6156c4f42b70c562b507766f4546c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 15:14:08', null, null); +INSERT INTO `sys_log` VALUES ('52673feae24ea5bc3ca111f19c9a85d4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 15:16:46', null, null); +INSERT INTO `sys_log` VALUES ('507b55d3b5ddc487fb40ca1f716a1253', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 15:43:02', null, null); +INSERT INTO `sys_log` VALUES ('7351132f4f5f65e5bf157dd7ad5344a4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 15:51:36', null, null); +INSERT INTO `sys_log` VALUES ('961992e05772bc7ad2ca927cf7649440', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 15:55:10', null, null); +INSERT INTO `sys_log` VALUES ('3b07fda32423a5696b2097e1c23c00d4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 16:04:32', null, null); +INSERT INTO `sys_log` VALUES ('8447099784da63b3b2cd2fbbc5eabcea', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 16:04:49', null, null); +INSERT INTO `sys_log` VALUES ('b20ff98a10af3c25c1991741fd59ea64', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 16:07:48', null, null); +INSERT INTO `sys_log` VALUES ('9acebd2d37c9078f9568125fb9696976', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 16:07:59', null, null); +INSERT INTO `sys_log` VALUES ('d70c2847d8d0936a2a761f745a84aa48', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 16:39:34', null, null); +INSERT INTO `sys_log` VALUES ('279e519d647f1a4e1f85f9b90ab370b9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 17:01:30', null, null); +INSERT INTO `sys_log` VALUES ('b605a83a9b5f3cdaaa1b3f4f41a5f12d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 17:04:20', null, null); +INSERT INTO `sys_log` VALUES ('0a24b1f04f79a2bcb83c4cd12d077cbc', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 17:34:37', null, null); +INSERT INTO `sys_log` VALUES ('661c4792f00b0814e486c3d623d7259f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 18:06:11', null, null); +INSERT INTO `sys_log` VALUES ('d1746c5c937fcb650bd835ff74dabdff', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 18:06:32', null, null); +INSERT INTO `sys_log` VALUES ('8ec3a287a37d155047e80a80769d5226', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 18:37:14', null, null); +INSERT INTO `sys_log` VALUES ('6cbd2a9257fae1cb7ff7bc2eb264b3ab', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 19:08:14', null, null); +INSERT INTO `sys_log` VALUES ('f06e8fa83b408be905b4dc7caeaf9a80', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 19:40:33', null, null); +INSERT INTO `sys_log` VALUES ('f84e86c9a21149134b1f2599a424164b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-21 20:12:27', null, null); +INSERT INTO `sys_log` VALUES ('88bfc5b77b4be0d6d0f7c8661cf24853', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 10:25:53', null, null); +INSERT INTO `sys_log` VALUES ('b9bf472a12fc25a9d4b500421b08b025', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 10:53:54', null, null); +INSERT INTO `sys_log` VALUES ('dbbcfb7f59311637a613ec9a6c63f04a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 10:53:57', null, null); +INSERT INTO `sys_log` VALUES ('69ea2322f72b41bcdc7f235889132703', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 10:54:43', null, null); +INSERT INTO `sys_log` VALUES ('62d197757e2cb40f9e8cb57fa6a207f7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 10:54:54', null, null); +INSERT INTO `sys_log` VALUES ('ccad29843623a6c3ca59548b1d533b15', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 10:56:33', null, null); +INSERT INTO `sys_log` VALUES ('4d9299e2daac1f49eac0cec75a90c32e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 11:28:39', null, null); +INSERT INTO `sys_log` VALUES ('43848099c1e70910ba1572868ee40415', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 11:28:48', null, null); +INSERT INTO `sys_log` VALUES ('6fb7db45b11bc22347b234fda07700c8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 12:00:22', null, null); +INSERT INTO `sys_log` VALUES ('e8cde8dcd6253b249d67a05aaf10f968', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 12:30:28', null, null); +INSERT INTO `sys_log` VALUES ('6a4231540c73ad67128d5a24e6a877ff', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 12:54:30', null, null); +INSERT INTO `sys_log` VALUES ('2b3be3da6ba9d1ee49f378d729d69c50', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 13:24:41', null, null); +INSERT INTO `sys_log` VALUES ('78f519b618f82a39adad391fbf6b9c7a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 13:49:58', null, null); +INSERT INTO `sys_log` VALUES ('1487d69ff97888f3a899e2ababb5ae48', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 14:21:17', null, null); +INSERT INTO `sys_log` VALUES ('cc7fa5567e7833a3475b29b7441a2976', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 14:21:31', null, null); +INSERT INTO `sys_log` VALUES ('52e36d72cd04bea2604747e006b038ec', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 19:47:17', null, null); +INSERT INTO `sys_log` VALUES ('523a54948d5edaf421566014b66f9465', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 19:50:27', null, null); +INSERT INTO `sys_log` VALUES ('48e4e10ac7e583050fd85734f0676a7c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 19:58:08', null, null); +INSERT INTO `sys_log` VALUES ('dee4d42c439b51b228ab5db5d0723fc0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-22 20:02:56', null, null); +INSERT INTO `sys_log` VALUES ('965c74ffe09d8a06bb817efa6d62254b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-23 10:01:35', null, null); +INSERT INTO `sys_log` VALUES ('059bac84373e9dae94363ea18802d70f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-23 10:06:56', null, null); +INSERT INTO `sys_log` VALUES ('9ef3f1ed07003e3abec3445920b062f1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-23 11:17:05', null, null); +INSERT INTO `sys_log` VALUES ('0169622dcd4e89b177a0917778ac7f9c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-23 11:17:18', null, null); +INSERT INTO `sys_log` VALUES ('f8960d64e93606fa52220cc9c4ae35a2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-23 11:21:02', null, null); +INSERT INTO `sys_log` VALUES ('4261867172d0fd5c04c993638661ac0b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-23 11:24:47', null, null); +INSERT INTO `sys_log` VALUES ('32464c6f7f772ddda0a963b19ad2fd70', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-23 11:30:20', null, null); +INSERT INTO `sys_log` VALUES ('d29cf7aae44523bf2f3d187e91356fe8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-23 12:20:35', null, null); +INSERT INTO `sys_log` VALUES ('0e9c0d0d26ddc652a7277912e0784d11', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-23 12:27:41', null, null); +INSERT INTO `sys_log` VALUES ('25f8b1b345b1c8a070fe81d715540c85', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-23 15:39:46', null, null); +INSERT INTO `sys_log` VALUES ('8327cced60486bad4009276e14403502', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-24 09:56:29', null, null); +INSERT INTO `sys_log` VALUES ('515c28df59f07478339b61ca5b1b54a8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-24 10:34:51', null, null); +INSERT INTO `sys_log` VALUES ('fa0612372b332b6c3ce787d9ca6dd2cc', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-24 11:48:21', null, null); +INSERT INTO `sys_log` VALUES ('8300e85a2c2f16c2358d31e8b364edf7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-24 11:55:39', null, null); +INSERT INTO `sys_log` VALUES ('3d9874f248a984608ca98c36c21c5a7a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-24 13:05:56', null, null); +INSERT INTO `sys_log` VALUES ('cc8ab347f332c55570830c5fc39bbf9f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-24 13:08:38', null, null); +INSERT INTO `sys_log` VALUES ('8742a458bf166fd5f134ac65fa8903f9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-24 13:09:10', null, null); +INSERT INTO `sys_log` VALUES ('bbe2e637bafa0d7f465dc9e1266cff3d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-25 11:16:50', null, null); +INSERT INTO `sys_log` VALUES ('b3474fc5aad9ec2f36ccbbf7bf864a69', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-25 11:17:24', null, null); +INSERT INTO `sys_log` VALUES ('260bb025d91b59d0135d635ef85eeb82', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-25 11:40:13', null, null); +INSERT INTO `sys_log` VALUES ('1a5b71c9458c17f9bcb19a5747fd47dd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-25 11:56:48', null, null); +INSERT INTO `sys_log` VALUES ('e720278084b0d4316448ec59d4e3399d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-25 15:52:45', null, null); +INSERT INTO `sys_log` VALUES ('f6646950c8465da1d1219b7a7a209fc2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-25 19:14:07', null, null); +INSERT INTO `sys_log` VALUES ('36358cacfc5eb3ba7e85cfe156218b71', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-25 19:14:17', null, null); +INSERT INTO `sys_log` VALUES ('ee2bb63c47c868d59a45503b3d2f34ea', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-25 19:16:14', null, null); +INSERT INTO `sys_log` VALUES ('b0d11dfec52e02f504c63e2f8224b00d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-25 19:27:44', null, null); +INSERT INTO `sys_log` VALUES ('4acfbc327681d89dab861c77401f8992', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-28 10:54:36', null, null); +INSERT INTO `sys_log` VALUES ('96ada57ac17c4477f4e4c8d596d4cc1a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-28 10:54:44', null, null); +INSERT INTO `sys_log` VALUES ('e4e40e21437b23b74324e0402cceb71a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-28 11:34:40', null, null); +INSERT INTO `sys_log` VALUES ('d92d9e003666c6b020f079eaee721f9f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-28 12:08:43', null, null); +INSERT INTO `sys_log` VALUES ('68f7394ca53c59438b2b41e7bb9f3094', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-28 14:09:34', null, null); +INSERT INTO `sys_log` VALUES ('a9b34565c6460dc9cede00ad150393f9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-28 14:17:53', null, null); +INSERT INTO `sys_log` VALUES ('fa427f74dc6bd9cca3db478b5842f7f7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-28 14:19:07', null, null); +INSERT INTO `sys_log` VALUES ('8b66ec251e3107765768dbd0590eeb29', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-28 14:25:48', null, null); +INSERT INTO `sys_log` VALUES ('e42a38382fce916909d6d09f66147006', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-28 14:28:44', null, null); +INSERT INTO `sys_log` VALUES ('ed0bbe9047a7471ae1cdc1c2941eccb1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-29 17:52:38', null, null); +INSERT INTO `sys_log` VALUES ('36fd54ce8bc1ee4aac9e3ea4bfdcd5a8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-29 18:49:34', null, null); +INSERT INTO `sys_log` VALUES ('40b3a9bee45b23548250936310b273f4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-30 14:42:03', null, null); +INSERT INTO `sys_log` VALUES ('c9be887c9292153e39861c91243b7432', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-30 15:12:15', null, null); +INSERT INTO `sys_log` VALUES ('e40823376fa8c0e74a4e760de695e824', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-30 15:36:38', null, null); +INSERT INTO `sys_log` VALUES ('993010965223b8e3a7a784409f7e377e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-30 15:50:41', null, null); +INSERT INTO `sys_log` VALUES ('aa47c8cf2a4f2de16f415b9d9d3dbf05', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-30 16:14:36', null, null); +INSERT INTO `sys_log` VALUES ('4a0020835a71fc6dcaefd01968d21f81', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-30 18:46:37', null, null); +INSERT INTO `sys_log` VALUES ('fa9cebbb6af23d2830584b3aacd51e46', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-31 13:59:17', null, null); +INSERT INTO `sys_log` VALUES ('60a975067f02cf05e74fa7b71e8e862a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-31 14:31:58', null, null); +INSERT INTO `sys_log` VALUES ('fbb8834e9736bdd4b6d3baee895c4ca4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-01-31 18:05:03', null, null); +INSERT INTO `sys_log` VALUES ('623e4bc7c098f368abcc368227235caf', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-01 09:48:57', null, null); +INSERT INTO `sys_log` VALUES ('9f31eedbe3f3c5c431b490d5fec0094c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-01 09:56:36', null, null); +INSERT INTO `sys_log` VALUES ('b945fe8b63e0fc26d02c85466f36ebd9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-01 09:57:34', null, null); +INSERT INTO `sys_log` VALUES ('968d434c45aae64c9ad0e86d18238065', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-01 10:02:22', null, null); +INSERT INTO `sys_log` VALUES ('732a1015057fde25d81ee12a7fbf66b2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-01 10:05:08', null, null); +INSERT INTO `sys_log` VALUES ('d9a0bb9fe6d2c675aa84f9441c0bd8bb', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-11 10:56:23', null, null); +INSERT INTO `sys_log` VALUES ('9c64406daa2b6e7ad1f6776789d61e43', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-11 10:56:46', null, null); +INSERT INTO `sys_log` VALUES ('1912a44dd4a6ffa1636d2dde9c2f1ab7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-11 11:01:03', null, null); +INSERT INTO `sys_log` VALUES ('d19b6e77ab1b6d6aa58996a93918754c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-11 11:33:06', null, null); +INSERT INTO `sys_log` VALUES ('81f7a606359aff9f97f95c15ce8e7c69', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-11 11:33:42', null, null); +INSERT INTO `sys_log` VALUES ('7da063020a42db99e0f3bb9500498828', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-11 13:45:36', null, null); +INSERT INTO `sys_log` VALUES ('b6ee157afd006ceddc8c7558c251192e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-11 14:20:56', null, null); +INSERT INTO `sys_log` VALUES ('65ace1ae98891f48ab4121d9258e4f1e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-12 10:45:20', null, null); +INSERT INTO `sys_log` VALUES ('e2af7674bb716a7c0b703c7c7e20b906', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-12 11:38:55', null, null); +INSERT INTO `sys_log` VALUES ('60d4f59974170c67826e64480533d793', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-12 13:25:40', null, null); +INSERT INTO `sys_log` VALUES ('775e987a2ca37edc4f21e022b265a84a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-12 13:36:13', null, null); +INSERT INTO `sys_log` VALUES ('dd6fbb9b6224c927c0923c16b9285525', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-12 13:37:01', null, null); +INSERT INTO `sys_log` VALUES ('f3d371d6f71409ea2fe52405b725db4a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-12 13:38:15', null, null); +INSERT INTO `sys_log` VALUES ('c33b4e0bbf998330e44fad65e9d0029e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-12 15:54:56', null, null); +INSERT INTO `sys_log` VALUES ('189842bf681338dc99dfa66d366a0e6f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-12 15:55:01', null, null); +INSERT INTO `sys_log` VALUES ('e14cd21cf5eaad9ea3689730a824a50c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-12 16:12:32', null, null); +INSERT INTO `sys_log` VALUES ('5cf2431447eab30fd3623e831033eea0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-12 19:17:29', null, null); +INSERT INTO `sys_log` VALUES ('9bfe7312f2951503082a28c2cc966ce4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 10:24:02', null, null); +INSERT INTO `sys_log` VALUES ('da9a15efcf4e1e4f24647db7e2143238', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 11:19:54', null, null); +INSERT INTO `sys_log` VALUES ('8317a81bce60a10afeb44af6ef6c807a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 11:27:58', null, null); +INSERT INTO `sys_log` VALUES ('0a6eb1fa998b749012216542a2447ae7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 11:29:30', null, null); +INSERT INTO `sys_log` VALUES ('e5a9b045449136719d4c19c429c2dd56', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 13:08:05', null, null); +INSERT INTO `sys_log` VALUES ('aaf10eab9c2b6ed6af1d7a9ce844d146', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 13:08:10', null, null); +INSERT INTO `sys_log` VALUES ('b4ccdfc1280e73439eb1ad183076675b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 14:10:45', null, null); +INSERT INTO `sys_log` VALUES ('018fe8d3f049a32fb8b541c893058713', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 15:17:42', null, null); +INSERT INTO `sys_log` VALUES ('f3aab8f9dff7bf705aa29c6dcce49011', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 15:18:27', null, null); +INSERT INTO `sys_log` VALUES ('efa591832b375b4609a5890b0c6f3250', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 16:00:13', null, null); +INSERT INTO `sys_log` VALUES ('2c6822927334eb0810b71465fd9c4945', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 16:02:47', null, null); +INSERT INTO `sys_log` VALUES ('7289cf420ac87ea0538bde81435b1aaa', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 16:03:51', null, null); +INSERT INTO `sys_log` VALUES ('db8adca4aa7972fdc283be96d877efe0', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 16:04:28', null, null); +INSERT INTO `sys_log` VALUES ('c5e541648bab341230c93377b4d4e262', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 16:05:09', null, null); +INSERT INTO `sys_log` VALUES ('e261674e2640fe6d0a3cd86df631537d', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 16:05:51', null, null); +INSERT INTO `sys_log` VALUES ('406e79995e3340d052d85a74a5d40d1b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 16:23:16', null, null); +INSERT INTO `sys_log` VALUES ('4de1ed55165f7086f1a425a26a2f56ec', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 16:26:27', null, null); +INSERT INTO `sys_log` VALUES ('d8eed69045aae6cedbff402b4e35f495', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-13 18:22:52', null, null); +INSERT INTO `sys_log` VALUES ('bbf4fb593d6918cc767bb50c9b6c16c5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-14 10:44:20', null, null); +INSERT INTO `sys_log` VALUES ('506ce2d73a038b6e491a35a6c74a7343', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-14 13:44:04', null, null); +INSERT INTO `sys_log` VALUES ('4303dbb3e502f11a3c4078f899bb3070', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-14 17:28:44', null, null); +INSERT INTO `sys_log` VALUES ('2de252a92b59ebfbf16860cc563e3865', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-14 22:04:17', null, null); +INSERT INTO `sys_log` VALUES ('e4c330b381e2fbfde49f1d4dd43e68b7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-14 22:22:01', null, null); +INSERT INTO `sys_log` VALUES ('22735c059b01949a87cb918f5ef3be76', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-14 22:41:28', null, null); +INSERT INTO `sys_log` VALUES ('c5954beca75d6a0c014e2de3b621275a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-14 22:41:31', null, null); +INSERT INTO `sys_log` VALUES ('db8c89112bf4706fb558664dd741aa46', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 09:33:23', null, null); +INSERT INTO `sys_log` VALUES ('fa0ce422c12a565461eca56006052891', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 10:13:21', null, null); +INSERT INTO `sys_log` VALUES ('a34ed4c6fef2b9f07a20e54ef4501b99', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 10:48:00', null, null); +INSERT INTO `sys_log` VALUES ('b55cc05e8dd4279c0fa145833db19ba8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 11:37:40', null, null); +INSERT INTO `sys_log` VALUES ('5c675eeb69795180eee2c1069efc114b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 12:59:43', null, null); +INSERT INTO `sys_log` VALUES ('5dee273feb8dd12989b40c2c92ce8c4a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 13:42:58', null, null); +INSERT INTO `sys_log` VALUES ('994efef0ebca19292e14a39b385b0e21', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 16:22:24', null, null); +INSERT INTO `sys_log` VALUES ('fc22aaf9660e66558689a58dfa443074', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 16:30:55', null, null); +INSERT INTO `sys_log` VALUES ('2c6ede513b83fbc23aaedb89dbfa868a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 18:03:00', null, null); +INSERT INTO `sys_log` VALUES ('13c1e763e9d624a69727a38b85411352', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 18:39:00', null, null); +INSERT INTO `sys_log` VALUES ('fadb32d678346ee4bab02997988ff3bc', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-15 22:55:16', null, null); +INSERT INTO `sys_log` VALUES ('0aa792eadeae39a1ed2a98ea5d2f6d27', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-16 09:11:39', null, null); +INSERT INTO `sys_log` VALUES ('0aa9272c0581e1d7f62b1293375b4574', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-16 17:26:36', null, null); +INSERT INTO `sys_log` VALUES ('81c9056ac38e6f881d60f3d41df1845e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-17 11:44:47', null, null); +INSERT INTO `sys_log` VALUES ('eb4536aa50a58985baf0a763a1ce2ebf', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-17 19:48:49', null, null); +INSERT INTO `sys_log` VALUES ('f9062582881b42f6b139c313d8ab0463', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-17 20:47:26', null, null); +INSERT INTO `sys_log` VALUES ('22d8a2fbd53eafb21f6f62ae073c0fc1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-17 22:28:52', null, null); +INSERT INTO `sys_log` VALUES ('7bc7b1ff923dbb19fb0ecd800cd690bd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-18 09:34:59', null, null); +INSERT INTO `sys_log` VALUES ('faea0dbfb7f86b571fed0dd270623831', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-18 14:12:14', null, null); +INSERT INTO `sys_log` VALUES ('063baad688535096d2ed906ae6f3a128', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-18 22:09:21', null, null); +INSERT INTO `sys_log` VALUES ('528baecc596a66eaadc8887bff911f55', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-19 10:08:48', null, null); +INSERT INTO `sys_log` VALUES ('e540ca989819c54baefffbc3d05e8b58', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-19 10:10:54', null, null); +INSERT INTO `sys_log` VALUES ('0643f3ad4394de9fb3c491080c6a7a03', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-19 10:18:42', null, null); +INSERT INTO `sys_log` VALUES ('eb0b8a7cdf77df133566d7bd5a5f1fc0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-19 11:02:55', null, null); +INSERT INTO `sys_log` VALUES ('0913bb0e92715892c470cf538726dfbc', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-19 16:17:09', null, null); +INSERT INTO `sys_log` VALUES ('5034aec34f0b79da510e66008dbf2fcc', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-19 16:18:29', null, null); +INSERT INTO `sys_log` VALUES ('e4afd66ac249dde9c3bd9da50f9c2469', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-19 17:41:54', null, null); +INSERT INTO `sys_log` VALUES ('07132c1228b1c165f62ea35f4ff1cbe9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-19 18:15:44', null, null); +INSERT INTO `sys_log` VALUES ('4f7f587bec68ed5bf9f68b0ccd76d62b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-19 21:01:47', null, null); +INSERT INTO `sys_log` VALUES ('12709e62742056aa4a57fa8c2c82d84a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 09:13:10', null, null); +INSERT INTO `sys_log` VALUES ('680b3e6e4768d80d6ea0ce8ba71bdd0e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 09:14:03', null, null); +INSERT INTO `sys_log` VALUES ('a6e323785535592ee208aa7e53554644', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 09:15:27', null, null); +INSERT INTO `sys_log` VALUES ('3a4a0e27d77aa8b624180e5fd5e4004e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 09:51:58', null, null); +INSERT INTO `sys_log` VALUES ('b98b7ac9e890657aa86a900763afbe2a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 11:49:44', null, null); +INSERT INTO `sys_log` VALUES ('d1eb2a8ebed28d34199c5fc4a1579c4c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 12:55:09', null, null); +INSERT INTO `sys_log` VALUES ('85949de2d54078e6b8f3df0a3c79c43d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 17:08:44', null, null); +INSERT INTO `sys_log` VALUES ('77579d78a903635cc4942882f568e9e5', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 17:13:33', null, null); +INSERT INTO `sys_log` VALUES ('679e12ba247575749e03aa8f67347ac6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 17:14:42', null, null); +INSERT INTO `sys_log` VALUES ('5c35117cbeb39428fcc2ddd90ce96a2b', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 17:18:51', null, null); +INSERT INTO `sys_log` VALUES ('7225200c3cec4789af4f1da2c46b129d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 17:19:23', null, null); +INSERT INTO `sys_log` VALUES ('22ad9f87788506456c774801389d6a01', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 17:20:10', null, null); +INSERT INTO `sys_log` VALUES ('81c95e1c8805fa191753fc99ba54c3e9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:01:21', null, null); +INSERT INTO `sys_log` VALUES ('7285730e2644f49def0937dc99bfbe3d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:07:01', null, null); +INSERT INTO `sys_log` VALUES ('4922f2f1173a1edc11dfd11cb2a100ae', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:08:27', null, null); +INSERT INTO `sys_log` VALUES ('e37cce529d0c98c47b4977d7ddf963c0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:17:54', null, null); +INSERT INTO `sys_log` VALUES ('66493cd0347eeb6ee2ef5ee923604683', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:29:47', null, null); +INSERT INTO `sys_log` VALUES ('f04910792a74c563d057c4fcb345f963', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:30:00', null, null); +INSERT INTO `sys_log` VALUES ('210a01dcb34302eaed0d1e95820655d0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:30:15', null, null); +INSERT INTO `sys_log` VALUES ('48929ec94226d9ccff9fae4ff48e95e3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:32:55', null, null); +INSERT INTO `sys_log` VALUES ('d2ac19a709ea08f7259286df28efd635', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:35:37', null, null); +INSERT INTO `sys_log` VALUES ('d8fd478e6ceb03a575719e1a54342333', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:43:43', null, null); +INSERT INTO `sys_log` VALUES ('a35a476c303983701045507c9af3fa03', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-20 18:44:58', null, null); +INSERT INTO `sys_log` VALUES ('7e41208e29d412d586fc39375628b0d0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-21 15:34:35', null, null); +INSERT INTO `sys_log` VALUES ('1f33d11e1833ae497e3ef65a3f02dd5b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-21 19:51:12', null, null); +INSERT INTO `sys_log` VALUES ('dae0658783324c81fa6909b6e4a25a65', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 11:46:41', null, null); +INSERT INTO `sys_log` VALUES ('a77d29673cfe97c9e03cfb879b934f62', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 12:41:15', null, null); +INSERT INTO `sys_log` VALUES ('baaf37e5937f938ac92856bc74cc2b86', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 13:48:53', null, null); +INSERT INTO `sys_log` VALUES ('3f47afcdce94596494746ac34eebf13b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 13:59:10', null, null); +INSERT INTO `sys_log` VALUES ('b99fc7c53d4e3edc0c618edc11d3a073', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 15:58:43', null, null); +INSERT INTO `sys_log` VALUES ('024a4c5ba78538d05373dac650b227d1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 15:59:50', null, null); +INSERT INTO `sys_log` VALUES ('873f425879ef9ca7ced982acda19ea58', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 16:35:59', null, null); +INSERT INTO `sys_log` VALUES ('1b05434820cbcb038028da9f5cda31bb', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 17:45:16', null, null); +INSERT INTO `sys_log` VALUES ('5f314fc45492d7f90b74d1ca74d1d392', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 17:45:48', null, null); +INSERT INTO `sys_log` VALUES ('20751803c1e5b2d758b981ba22f61fcd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 18:11:05', null, null); +INSERT INTO `sys_log` VALUES ('50e8de3e6b45f8625b8fd5590c9fd834', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 18:23:18', null, null); +INSERT INTO `sys_log` VALUES ('6737424e01b38f2273e9728bf39f3e37', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-22 19:43:37', null, null); +INSERT INTO `sys_log` VALUES ('0473dedf4aa653b253b008dacff2937c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 13:04:44', null, null); +INSERT INTO `sys_log` VALUES ('a95192071de908f37f4998af4c269bcb', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 14:26:53', null, null); +INSERT INTO `sys_log` VALUES ('3569ada5c43a4022d3d13ac801aff40e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 14:50:55', null, null); +INSERT INTO `sys_log` VALUES ('562092eb81561ee0f63be5dd9367d298', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 22:20:59', null, null); +INSERT INTO `sys_log` VALUES ('131ccd390401b6e3894a37e4d1d195d3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 22:26:52', null, null); +INSERT INTO `sys_log` VALUES ('c12e3d7655a5a8b192bb9964a2a66946', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 22:35:45', null, null); +INSERT INTO `sys_log` VALUES ('6bc98b7dc91a3924f794202867367aca', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 22:50:34', null, null); +INSERT INTO `sys_log` VALUES ('002b7112a147edeb6149a891494577d0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 22:52:15', null, null); +INSERT INTO `sys_log` VALUES ('202344b08b69ad70754e6adaa777eae0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 22:54:22', null, null); +INSERT INTO `sys_log` VALUES ('eeb1f2e2c1b480e0bb62533848cbb176', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 22:55:46', null, null); +INSERT INTO `sys_log` VALUES ('94fe4465d779e0438cfe6f0cb1a1aa7e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 22:57:42', null, null); +INSERT INTO `sys_log` VALUES ('d03aaee882d13b796db860cb95f27724', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 22:59:54', null, null); +INSERT INTO `sys_log` VALUES ('1db82f78233c120c6ec7648ca1177986', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 23:07:39', null, null); +INSERT INTO `sys_log` VALUES ('7dc448f04edf4b9655362ad1a1c58753', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 23:10:17', null, null); +INSERT INTO `sys_log` VALUES ('fce1553149aea9bfd93e089f387199c8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 23:11:35', null, null); +INSERT INTO `sys_log` VALUES ('e713a89e753cbecf1e10247b2112c3f8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-24 23:14:36', null, null); +INSERT INTO `sys_log` VALUES ('0a634ed086442afa7a5fc9aa000b898a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:10:39', null, null); +INSERT INTO `sys_log` VALUES ('bfa0766f53dbd3a0fe4043f57bd9bbee', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:35:33', null, null); +INSERT INTO `sys_log` VALUES ('e3b531fa12e47ac19a2ab0c883dee595', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:40:13', null, null); +INSERT INTO `sys_log` VALUES ('18eafaeec588403245269a41732d1a74', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:45:14', null, null); +INSERT INTO `sys_log` VALUES ('99357d793f2507cfb7b270677b4fe56c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:46:42', null, null); +INSERT INTO `sys_log` VALUES ('b38f42f4e15ee72e494bdf6f6feb0ae7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:49:58', null, null); +INSERT INTO `sys_log` VALUES ('bfe758860662ae07a15598396a12cfaa', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:50:00', null, null); +INSERT INTO `sys_log` VALUES ('69a7a5b960d6aedda5c4bd8b877be0a8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:50:48', null, null); +INSERT INTO `sys_log` VALUES ('4084f184160940a96e47d7be1fab4ea3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:51:11', null, null); +INSERT INTO `sys_log` VALUES ('1241cf8e9fd0e28478a07bf755f528c5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:51:12', null, null); +INSERT INTO `sys_log` VALUES ('e0da357be27d66de1c9e9b8ecb22f9f9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:51:13', null, null); +INSERT INTO `sys_log` VALUES ('9f4960f89a10d7fdcf22d1ea46143fff', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:51:13', null, null); +INSERT INTO `sys_log` VALUES ('ab8a71b7565d356d12e12c6730b0ceb0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:51:13', null, null); +INSERT INTO `sys_log` VALUES ('35fdedc363d9fe514b44095da40f170b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:51:30', null, null); +INSERT INTO `sys_log` VALUES ('7126b35521cd0dba932e6f04b0dac88f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:52:22', null, null); +INSERT INTO `sys_log` VALUES ('9bd6e11c5a2f0bb70215cfa097a4b29c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 10:57:52', null, null); +INSERT INTO `sys_log` VALUES ('7e2edea80050d2e46aa2e8faef8e29ce', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:01:38', null, null); +INSERT INTO `sys_log` VALUES ('190eb7b4d493eb01b13c5b97916eeb13', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:09:05', null, null); +INSERT INTO `sys_log` VALUES ('ea268ad02db29012b2f1bd3d4aea1419', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:10:22', null, null); +INSERT INTO `sys_log` VALUES ('7dc498b45fbf25c59686d9dda0d3eb66', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:12:38', null, null); +INSERT INTO `sys_log` VALUES ('583d3aa445d408f4ecd19ee0a85514af', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:18:04', null, null); +INSERT INTO `sys_log` VALUES ('9cea908c7a78dc77fdaed975819983bd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:20:15', null, null); +INSERT INTO `sys_log` VALUES ('d70329497664391dabc25effe7406c50', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:25:12', null, null); +INSERT INTO `sys_log` VALUES ('0b9940fc5487026a3f16cade73efead5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:28:28', null, null); +INSERT INTO `sys_log` VALUES ('f21f9f700bf4f5bd9edda7a16ed338f8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:30:05', null, null); +INSERT INTO `sys_log` VALUES ('f5c08b45885d248c422a5d406cd5f223', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:41:54', null, null); +INSERT INTO `sys_log` VALUES ('e9a31bfc128b3f5ae01656916c605ddb', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:44:56', null, null); +INSERT INTO `sys_log` VALUES ('6baccd034e970c6f109791cff43bc327', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:46:12', null, null); +INSERT INTO `sys_log` VALUES ('d2b516c5d834bd0fca91cda416fe499e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:46:42', null, null); +INSERT INTO `sys_log` VALUES ('f9abb524e0dc3571571dc6e50ec6db75', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:47:13', null, null); +INSERT INTO `sys_log` VALUES ('d1111594fef195980370c5f91ccf9212', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:48:09', null, null); +INSERT INTO `sys_log` VALUES ('9174fe77fe8ba69243f72d5577b391d3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:48:38', null, null); +INSERT INTO `sys_log` VALUES ('2ab9cf95ac35fdbb8fe976e13c404c41', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:49:05', null, null); +INSERT INTO `sys_log` VALUES ('9be945480d69038865279f02df5cee45', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:49:47', null, null); +INSERT INTO `sys_log` VALUES ('c2bfe3b92e6bfb7016cc82e95419a602', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 11:54:05', null, null); +INSERT INTO `sys_log` VALUES ('7c310b99a84411798a2aaf4074a28e7e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 12:42:57', null, null); +INSERT INTO `sys_log` VALUES ('b23293288a84ba965509f466ed0e7e2f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 12:43:11', null, null); +INSERT INTO `sys_log` VALUES ('cf590576a5f6a42b347e6b5bf5ebf5bd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 12:43:31', null, null); +INSERT INTO `sys_log` VALUES ('b5df1807f08af5db640da11affec24d3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 12:49:25', null, null); +INSERT INTO `sys_log` VALUES ('2746af3dd0309cdeeff7d27999fbcda1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 12:52:55', null, null); +INSERT INTO `sys_log` VALUES ('2a383edf5445dc8493f5240144ca72f5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 12:56:05', null, null); +INSERT INTO `sys_log` VALUES ('d2910961a0ff046cc3ef6cf8d33a8094', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 15:38:47', null, null); +INSERT INTO `sys_log` VALUES ('00f763e007e5a6bddf4cb8e562a53005', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 15:41:31', null, null); +INSERT INTO `sys_log` VALUES ('8ab131214232450ca202103ef81f0a2d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 15:46:29', null, null); +INSERT INTO `sys_log` VALUES ('606cb4f81f9bb412e2b2bdaa0f3e5dda', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 16:27:23', null, null); +INSERT INTO `sys_log` VALUES ('7b85fba62bc001773fff1a54e1609aef', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 16:28:20', null, null); +INSERT INTO `sys_log` VALUES ('b3127e34f395e1f1790450da5689a4a1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 16:28:35', null, null); + +-- ---------------------------- +-- Table structure for sys_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sys_permission`; +CREATE TABLE `sys_permission` ( + `id` varchar(32) NOT NULL COMMENT '主键id', + `parent_id` varchar(32) default NULL COMMENT '父id', + `name` varchar(255) default NULL COMMENT '菜单标题', + `url` varchar(255) default NULL COMMENT '路径', + `component` varchar(255) default NULL COMMENT '组件', + `redirect` varchar(255) default NULL COMMENT '一级菜单跳转地址', + `menu_type` int(11) default NULL COMMENT '菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)', + `perms` varchar(255) default NULL COMMENT '菜单权限编码', + `sort_no` double(3,2) default NULL COMMENT '菜单排序', + `always_show` int(3) default NULL COMMENT '聚合子路由: 1是0否', + `icon` varchar(255) default NULL COMMENT '菜单图标', + `is_leaf` int(2) default NULL COMMENT '是否叶子节点: 1:是 0:不是', + `hidden` int(2) default '0' COMMENT '是否隐藏路由: 0否,1是', + `description` varchar(255) default NULL COMMENT '描述', + `create_by` varchar(255) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(255) default NULL COMMENT '更新人', + `update_time` datetime default NULL COMMENT '更新时间', + `del_flag` int(11) default '0' COMMENT '删除状态 0正常 1已删除', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单权限表'; + +-- ---------------------------- +-- Records of sys_permission +-- ---------------------------- +INSERT INTO `sys_permission` VALUES ('00a2a0ae65cdca5e93209cdbde97cbe6', '2e42e3835c2b44ec9f7bc26c146ee531', '成功', '/result/success', 'result/Success', null, '1', null, '1.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('05b3c82ddb2536a4a5ee1a4c46b5abef', '540a2936940846cb98114ffb0d145cb8', '用户列表', '/list/user-list', 'list/UserList', null, '1', null, '3.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('078f9558cdeab239aecb2bda1a8ed0d1', 'fb07ca05a3e13674dbf6d3245956da2e', '搜索列表(文章)', '/list/search/article', 'list/TableList', null, '1', null, '1.00', '0', null, '1', '0', null, 'admin', '2019-02-12 14:00:34', 'admin', '2019-02-12 14:17:54', '0'); +INSERT INTO `sys_permission` VALUES ('08e6b9dc3c04489c8e1ff2ce6f105aa4', null, '系统监控', '/dashboard3', 'layouts/RouteView', null, '0', null, '2.00', '0', 'dashboard', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-01-30 15:10:05', '0'); +INSERT INTO `sys_permission` VALUES ('13212d3416eb690c2e1d5033166ff47a', '2e42e3835c2b44ec9f7bc26c146ee531', '失败', '/result/fail', 'result/Error', null, '1', null, '2.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('1367a93f2c410b169faa7abcbad2f77c', '6e73eb3c26099c191bf03852ee1310a1', '基本设置', '/account/settings/base', 'account/settings/BaseSetting', null, '1', 'BaseSettings', null, null, null, '1', null, null, null, '2018-12-26 18:58:35', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('200006f0edf145a2b50eacca07585451', 'fb07ca05a3e13674dbf6d3245956da2e', '搜索列表(应用)', '/list/search/application', 'list/TableList', null, '1', null, '1.00', '0', null, '1', '0', null, 'admin', '2019-02-12 14:02:51', 'admin', '2019-02-12 14:14:01', '0'); +INSERT INTO `sys_permission` VALUES ('277bfabef7d76e89b33062b16a9a5020', 'e3c13679c73a4f829bcff2aba8fd68b1', '基础表单', '/form/base-form', 'form/BasicForm', null, '1', null, '1.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('2a470fc0c3954d9dbb61de6d80846549', null, '常见案例', '/jeecg', 'layouts/RouteView', null, '0', null, '3.00', '0', 'qrcode', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-02-19 22:46:09', '0'); +INSERT INTO `sys_permission` VALUES ('2dbbafa22cda07fa5d169d741b81fe12', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '在线文档', 'http://localhost:8080/jeecg-boot/swagger-ui.html#/', 'layouts/IframePageView', null, '1', null, '3.00', '0', null, '1', '0', null, 'admin', '2019-01-30 10:00:01', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('2e42e3835c2b44ec9f7bc26c146ee531', null, '结果页', '/result', 'layouts/PageView', null, '0', null, '7.00', null, 'check-circle-o', '0', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('339329ed54cf255e1f9392e84f136901', '2a470fc0c3954d9dbb61de6d80846549', 'helloworld', '/jeecg/helloworld', 'jeecg/helloworld', null, '1', null, '4.00', '0', null, '1', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-02-15 16:24:56', '0'); +INSERT INTO `sys_permission` VALUES ('3f915b2769fc80648e92d04e84ca059d', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '用户管理', '/isystem/user', 'system/UserList', null, '1', null, '1.00', '0', null, '1', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-01-23 11:52:22', '0'); +INSERT INTO `sys_permission` VALUES ('4148ec82b6acd69f470bea75fe41c357', '2a470fc0c3954d9dbb61de6d80846549', '单表模型示例', '/jeecg/jeecgDemoList', 'jeecg/JeecgDemoList', null, '1', null, '1.00', '0', null, '1', '0', null, null, '2018-12-28 15:57:30', 'admin', '2019-02-15 16:24:37', '0'); +INSERT INTO `sys_permission` VALUES ('418964ba087b90a84897b62474496b93', '540a2936940846cb98114ffb0d145cb8', '查询表格', '/list/query-list', 'list/TableList', null, '1', null, '1.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('45c966826eeff4c99b8f8ebfe74511fc', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '部门管理', '/isystem/depart', 'system/DepartList', null, '1', null, '1.00', '0', null, '1', '0', null, 'admin', '2019-01-29 18:47:40', 'admin', '2019-01-29 18:51:29', '0'); +INSERT INTO `sys_permission` VALUES ('4875ebe289344e14844d8e3ea1edd73f', null, '详情页', '/profile', 'layouts/RouteView', null, '0', null, '6.00', null, 'profile', '0', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('4f66409ef3bbd69c1d80469d6e2a885e', '6e73eb3c26099c191bf03852ee1310a1', '账户绑定', '/account/settings/binding', 'account/settings/Binding', null, '1', 'BindingSettings', null, null, null, '1', null, null, null, '2018-12-26 19:01:20', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('4f84f9400e5e92c95f05b554724c2b58', '540a2936940846cb98114ffb0d145cb8', '角色列表', '/list/role-list', 'list/RoleList', null, '1', null, '4.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('540a2936940846cb98114ffb0d145cb8', null, '列表页', '/list', 'layouts/PageView', '/list/query-list', '0', null, '5.00', '0', 'table', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-02-12 14:55:20', '0'); +INSERT INTO `sys_permission` VALUES ('54dd5457a3190740005c1bfec55b1c34', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '菜单管理', '/isystem/permission', 'system/PermissionList', null, '1', null, '3.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('58857ff846e61794c69208e9d3a85466', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '日志管理', '/isystem/log', 'system/LogList', null, '1', null, '4.00', '0', 'question-circle', '1', '0', null, null, '2018-12-26 10:11:18', 'admin', '2019-02-19 16:38:58', '0'); +INSERT INTO `sys_permission` VALUES ('6531cf3421b1265aeeeabaab5e176e6d', 'e3c13679c73a4f829bcff2aba8fd68b1', '分步表单', '/form/step-form', 'form/stepForm/StepForm', null, '1', null, '2.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('65a8f489f25a345836b7f44b1181197a', 'c65321e57b7949b7a975313220de0422', '403', '/exception/403', 'exception/403', null, '1', null, '1.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('693ce69af3432bd00be13c3971a57961', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '监控页', '/dashboard/monitor', 'dashboard/Monitor', null, '1', null, '2.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('6ad53fd1b220989a8b71ff482d683a5a', '2a470fc0c3954d9dbb61de6d80846549', '一对多Tab示例', '/jeecg/tablist/JeecgOrderDMainList', 'jeecg/tablist/JeecgOrderDMainList', null, '1', null, '2.00', '0', null, '1', '0', null, 'admin', '2019-02-20 14:45:09', 'admin', '2019-02-21 16:26:21', '0'); +INSERT INTO `sys_permission` VALUES ('6e73eb3c26099c191bf03852ee1310a1', '717f6bee46f44a3897eca9abd6e2ec44', '个人设置', '/account/settings', 'account/settings/Index', null, '1', null, '2.00', '1', null, '0', null, null, null, '2018-12-25 20:34:38', null, '2018-12-26 19:05:26', '0'); +INSERT INTO `sys_permission` VALUES ('717f6bee46f44a3897eca9abd6e2ec44', null, '个人页', '/account', 'layouts/RouteView', null, '0', null, '9.00', '0', 'user', '0', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('73678f9daa45ed17a3674131b03432fb', '540a2936940846cb98114ffb0d145cb8', '权限列表', '/list/permission-list', 'list/PermissionList', null, '1', null, '5.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('7ac9eb9ccbde2f7a033cd4944272bf1e', '540a2936940846cb98114ffb0d145cb8', '卡片列表', '/list/card', 'list/CardList', null, '1', null, '7.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('882a73768cfd7f78f3a37584f7299656', '6e73eb3c26099c191bf03852ee1310a1', '个性化设置', '/account/settings/custom', 'account/settings/Custom', null, '1', 'CustomSettings', null, null, null, '1', null, null, null, '2018-12-26 19:00:46', null, '2018-12-26 21:13:25', '0'); +INSERT INTO `sys_permission` VALUES ('8fb8172747a78756c11916216b8b8066', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '工作台', '/dashboard/workplace', 'dashboard/Workplace', null, '1', null, '3.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('9502685863ab87f0ad1134142788a385', '', '首页', '/dashboard/analysis', 'dashboard/Analysis', null, '0', null, '1.00', '0', 'bank', '1', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-02-22 12:40:02', '0'); +INSERT INTO `sys_permission` VALUES ('a400e4f4d54f79bf5ce160a3432231af', '2a470fc0c3954d9dbb61de6d80846549', 'online表单', 'http://localhost:8080/jeecg-boot/auto/cgform/list', 'layouts/IframePageView', null, '1', null, '4.00', '0', null, '1', '0', null, 'admin', '2019-01-29 19:44:06', 'admin', '2019-02-15 16:25:11', '0'); +INSERT INTO `sys_permission` VALUES ('a400e4f4d54f79bf5ce160ae432231af', '2a470fc0c3954d9dbb61de6d80846549', '百度', 'http://www.baidu.com', 'layouts/IframePageView', null, '1', null, '4.00', '0', null, '1', '0', null, 'admin', '2019-01-29 19:44:06', 'admin', '2019-02-15 16:25:02', '0'); +INSERT INTO `sys_permission` VALUES ('ae4fed059f67086fd52a73d913cf473d', '540a2936940846cb98114ffb0d145cb8', '内联编辑表格', '/list/edit-table', 'list/TableInnerEditList', null, '1', null, '2.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('aedbf679b5773c1f25e9f7b10111da73', '08e6b9dc3c04489c8e1ff2ce6f105aa4', 'SQL监控', 'http://localhost:8080/jeecg-boot/druid/', 'layouts/IframePageView', null, '1', null, '1.00', '0', null, '1', '0', null, 'admin', '2019-01-30 09:43:22', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('b1cb0a3fedf7ed0e4653cb5a229837ee', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '定时任务', '/isystem/QuartzJobList', 'system/QuartzJobList', null, '1', null, '5.00', null, null, '1', null, null, null, '2019-01-03 09:38:52', 'admin', '2019-01-19 14:08:59', '0'); +INSERT INTO `sys_permission` VALUES ('b3c824fc22bd953e2eb16ae6914ac8f9', '4875ebe289344e14844d8e3ea1edd73f', '高级详情页', '/profile/advanced', 'profile/advanced/Advanced', null, '1', null, '2.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('b4dfc7d5dd9e8d5b6dd6d4579b1aa559', 'c65321e57b7949b7a975313220de0422', '500', '/exception/500', 'exception/500', null, '1', null, '3.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('c65321e57b7949b7a975313220de0422', null, '异常页', '/exception', 'layouts/RouteView', null, '0', null, '8.00', null, 'warning', '0', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('c6cf95444d80435eb37b2f9db3971ae6', '2a470fc0c3954d9dbb61de6d80846549', '数据回执模拟', '/jeecg/FlowTest', 'jeecg/FlowTest', null, '1', null, '6.00', '0', null, '1', '0', null, 'admin', '2019-02-19 16:02:23', 'admin', '2019-02-21 16:25:45', '0'); +INSERT INTO `sys_permission` VALUES ('cc50656cf9ca528e6f2150eba4714ad2', '4875ebe289344e14844d8e3ea1edd73f', '基础详情页', '/profile/basic', 'profile/basic/Index', null, '1', null, '1.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('d2bbf9ebca5a8fa2e227af97d2da7548', 'c65321e57b7949b7a975313220de0422', '404', '/exception/404', 'exception/404', null, '1', null, '2.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('d7d6e2e4e2934f2c9385a623fd98c6f3', null, '系统管理', '/isystem', 'layouts/RouteView', null, '0', null, '1.00', '0', 'setting', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-02-22 13:49:30', '0'); +INSERT INTO `sys_permission` VALUES ('d86f58e7ab516d3bc6bfb1fe10585f97', '717f6bee46f44a3897eca9abd6e2ec44', '个人中心', '/account/center', 'account/center/Index', null, '1', null, '1.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('de13e0f6328c069748de7399fcc1dbbd', 'fb07ca05a3e13674dbf6d3245956da2e', '搜索列表(项目)', '/list/search/project', 'list/TableList', null, '1', null, '1.00', '0', null, '1', '0', null, 'admin', '2019-02-12 14:01:40', 'admin', '2019-02-12 14:14:18', '0'); +INSERT INTO `sys_permission` VALUES ('e08cb190ef230d5d4f03824198773950', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '系统通告', '/isystem/annountCement', 'system/SysAnnouncementList', null, '1', 'annountCement', '6.00', null, '', '1', null, null, null, '2019-01-02 17:23:01', null, '2019-01-02 17:31:23', '0'); +INSERT INTO `sys_permission` VALUES ('e3c13679c73a4f829bcff2aba8fd68b1', null, '表单页', '/form', 'layouts/PageView', null, '0', null, '4.00', null, 'form', '0', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('e5973686ed495c379d829ea8b2881fc6', 'e3c13679c73a4f829bcff2aba8fd68b1', '高级表单', '/form/advanced-form', 'form/advancedForm/AdvancedForm', null, '1', null, '3.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('e6bfd1fcabfd7942fdd05f076d1dad38', '2a470fc0c3954d9dbb61de6d80846549', '打印测试', '/jeecg/PrintDemoList', 'jeecg/PrintDemoList', null, '1', null, '3.00', '0', null, '1', '0', null, 'admin', '2019-02-19 15:58:48', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('e8af452d8948ea49d37c934f5100ae6a', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '角色管理', '/isystem/role', 'system/RoleList', null, '1', null, '2.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('ec8d607d0156e198b11853760319c646', '6e73eb3c26099c191bf03852ee1310a1', '安全设置', '/account/settings/security', 'account/settings/Security', null, '1', 'SecuritySettings', null, null, null, '1', null, null, null, '2018-12-26 18:59:52', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('f1cb187abf927c88b89470d08615f5ac', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '数据字典', '/isystem/dict', 'system/DictList', null, '1', null, '5.00', null, null, '1', null, null, null, '2018-12-28 13:54:43', null, '2018-12-28 15:37:54', '0'); +INSERT INTO `sys_permission` VALUES ('f23d9bfff4d9aa6b68569ba2cff38415', '540a2936940846cb98114ffb0d145cb8', '标准列表', '/list/basic-list', 'list/StandardList', null, '1', null, '6.00', null, null, '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('fb07ca05a3e13674dbf6d3245956da2e', '540a2936940846cb98114ffb0d145cb8', '搜索列表', '/list/search', 'list/search/SearchLayout', '/list/search/article', '1', null, '8.00', '0', null, '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-02-12 15:09:13', '0'); +INSERT INTO `sys_permission` VALUES ('fb367426764077dcf94640c843733985', '2a470fc0c3954d9dbb61de6d80846549', '一对多示例', '/jeecg/JeecgOrderMainList', 'jeecg/JeecgOrderMainList', null, '1', null, '2.00', '0', null, '1', '0', null, 'admin', '2019-02-15 16:24:11', 'admin', '2019-02-18 10:50:14', '0'); +INSERT INTO `sys_permission` VALUES ('fedfbf4420536cacc0218557d263dfea', '6e73eb3c26099c191bf03852ee1310a1', '新消息通知', '/account/settings/notification', 'account/settings/Notification', null, '1', 'NotificationSettings', null, null, '', '1', null, null, null, '2018-12-26 19:02:05', null, null, '0'); + +-- ---------------------------- +-- Table structure for sys_quartz_job +-- ---------------------------- +DROP TABLE IF EXISTS `sys_quartz_job`; +CREATE TABLE `sys_quartz_job` ( + `id` varchar(255) NOT NULL, + `create_by` varchar(255) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `del_flag` int(11) default NULL COMMENT '删除状态', + `update_by` varchar(255) default NULL COMMENT '修改人', + `update_time` datetime default NULL COMMENT '修改时间', + `job_class_name` varchar(255) default NULL COMMENT '任务类名', + `cron_expression` varchar(255) default NULL COMMENT 'cron表达式', + `parameter` varchar(255) default NULL COMMENT '参数', + `description` varchar(255) default NULL COMMENT '描述', + `status` int(11) default NULL COMMENT '状态 0正常 -1停止', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of sys_quartz_job +-- ---------------------------- +INSERT INTO `sys_quartz_job` VALUES ('df26ecacf0f75d219d746750fe84bbee', null, null, '0', 'admin', '2019-01-19 15:09:41', 'org.jeecg.modules.quartz.job.SampleParamJob', '0/1 * * * * ?', 'scott', '带参测试 后台将每隔1秒执行输出日志', '-1'); +INSERT INTO `sys_quartz_job` VALUES ('58180f2a7c8cd36a121fd0fff3f02a36', null, null, '0', 'admin', '2019-01-19 15:09:44', 'org.jeecg.modules.quartz.job.SampleJob', '0/1 * * * * ?', null, null, '-1'); + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `id` varchar(32) NOT NULL COMMENT '主键id', + `role_name` varchar(255) default NULL COMMENT '角色名称', + `role_code` varchar(255) default NULL COMMENT '角色编码', + `description` varchar(255) default NULL COMMENT '描述', + `create_by` varchar(255) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(255) default NULL COMMENT '更新人', + `update_time` datetime default NULL COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色表'; + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- +INSERT INTO `sys_role` VALUES ('e51758fa916c881624b046d26bd09230', '人力资源部', 'hr', null, 'admin', '2019-01-21 18:07:24', 'admin', '2019-02-25 12:50:57'); +INSERT INTO `sys_role` VALUES ('ee8626f80f7c2619917b6236f3a7f02b', '临时角色', 'test', '这是新建的临时角色123', null, '2018-12-20 10:59:04', 'admin', '2019-02-19 15:08:37'); +INSERT INTO `sys_role` VALUES ('f6817f48af4fb3af11b9e8bf182f618b', '管理员', 'admin', '管理员', null, '2018-12-21 18:03:39', 'admin', '2019-02-22 19:49:42'); + +-- ---------------------------- +-- Table structure for sys_role_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_permission`; +CREATE TABLE `sys_role_permission` ( + `id` varchar(32) NOT NULL, + `role_id` varchar(32) default NULL COMMENT '角色id', + `permission_id` varchar(32) default NULL COMMENT '权限id', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色权限表'; + +-- ---------------------------- +-- Records of sys_role_permission +-- ---------------------------- +INSERT INTO `sys_role_permission` VALUES ('00597d88ce793df4baa9e84a1584bb04', 'ee8626f80f7c2619917b6236f3a7f02b', '4148ec82b6acd69f470bea75fe41c357'); +INSERT INTO `sys_role_permission` VALUES ('00b0748f04d3ea52c8cfa179c1c9d384', '52b0cf022ac4187b2a70dfa4f8b2d940', 'd7d6e2e4e2934f2c9385a623fd98c6f3'); +INSERT INTO `sys_role_permission` VALUES ('0156071f9a513ecebe28d821cfe936a9', 'f6817f48af4fb3af11b9e8bf182f618b', 'd2bbf9ebca5a8fa2e227af97d2da7548'); +INSERT INTO `sys_role_permission` VALUES ('0243ce4bfcb4a1cbf8d88bcce5b423f6', 'f6817f48af4fb3af11b9e8bf182f618b', 'f23d9bfff4d9aa6b68569ba2cff38415'); +INSERT INTO `sys_role_permission` VALUES ('02fce9a21ba1b273a9be22e6d08aa888', 'ee8626f80f7c2619917b6236f3a7f02b', 'fedfbf4420536cacc0218557d263dfea'); +INSERT INTO `sys_role_permission` VALUES ('03e071916bac02c5e56892f5fff6fad4', 'ee8626f80f7c2619917b6236f3a7f02b', '45c966826eeff4c99b8f8ebfe74511fc'); +INSERT INTO `sys_role_permission` VALUES ('04a5e9edc188b4fb2d4d7c97433699ad', 'ee8626f80f7c2619917b6236f3a7f02b', '717f6bee46f44a3897eca9abd6e2ec44'); +INSERT INTO `sys_role_permission` VALUES ('050749293826f69e34e17ad9e881aeb5', 'ee8626f80f7c2619917b6236f3a7f02b', 'd2bbf9ebca5a8fa2e227af97d2da7548'); +INSERT INTO `sys_role_permission` VALUES ('073aca2db3df7032ff2a2367dfcb36be', 'f6817f48af4fb3af11b9e8bf182f618b', '418964ba087b90a84897b62474496b93'); +INSERT INTO `sys_role_permission` VALUES ('07def0a8f102a6088f5fdc5a7f2de13c', 'ee8626f80f7c2619917b6236f3a7f02b', '4f84f9400e5e92c95f05b554724c2b58'); +INSERT INTO `sys_role_permission` VALUES ('0a84e65fe004524ce1dcfbbc9c5d158d', 'ee8626f80f7c2619917b6236f3a7f02b', 'cc50656cf9ca528e6f2150eba4714ad2'); +INSERT INTO `sys_role_permission` VALUES ('0b59fa905bd7cd390c1716c7600fd8b6', 'e51758fa916c881624b046d26bd09230', '4148ec82b6acd69f470bea75fe41c357'); +INSERT INTO `sys_role_permission` VALUES ('0e01985969b267138ea79289f4d80992', 'f6817f48af4fb3af11b9e8bf182f618b', '13212d3416eb690c2e1d5033166ff47a'); +INSERT INTO `sys_role_permission` VALUES ('131ec4598bb76ca85c4bb4a903f17cec', 'ee8626f80f7c2619917b6236f3a7f02b', '3f915b2769fc80648e92d04e84ca059d'); +INSERT INTO `sys_role_permission` VALUES ('139f250153158eacc56d717800a744fe', 'ee8626f80f7c2619917b6236f3a7f02b', '882a73768cfd7f78f3a37584f7299656'); +INSERT INTO `sys_role_permission` VALUES ('14cf7edb826d41ada12c97fc43289dc4', 'ee8626f80f7c2619917b6236f3a7f02b', '7ac9eb9ccbde2f7a033cd4944272bf1e'); +INSERT INTO `sys_role_permission` VALUES ('1605b849beecfdb0364dbefa5fe14164', 'ee8626f80f7c2619917b6236f3a7f02b', '58857ff846e61794c69208e9d3a85466'); +INSERT INTO `sys_role_permission` VALUES ('17a3b2758daf79e3bf071c38c9f3fd72', 'ee8626f80f7c2619917b6236f3a7f02b', '2dbbafa22cda07fa5d169d741b81fe12'); +INSERT INTO `sys_role_permission` VALUES ('17ead5b7d97ed365398ab20009a69ea3', '52b0cf022ac4187b2a70dfa4f8b2d940', 'e08cb190ef230d5d4f03824198773950'); +INSERT INTO `sys_role_permission` VALUES ('1ac1688ef8456f384091a03d88a89ab1', '52b0cf022ac4187b2a70dfa4f8b2d940', '693ce69af3432bd00be13c3971a57961'); +INSERT INTO `sys_role_permission` VALUES ('1adc4cf29655e34e172227ed23f69456', 'ee8626f80f7c2619917b6236f3a7f02b', 'fb07ca05a3e13674dbf6d3245956da2e'); +INSERT INTO `sys_role_permission` VALUES ('1dd46063cefb13c1c0832328e755fdd6', 'ee8626f80f7c2619917b6236f3a7f02b', 'c6cf95444d80435eb37b2f9db3971ae6'); +INSERT INTO `sys_role_permission` VALUES ('1f2d90dddd4a541f6e5739eb696c43c5', 'f6817f48af4fb3af11b9e8bf182f618b', 'b3c824fc22bd953e2eb16ae6914ac8f9'); +INSERT INTO `sys_role_permission` VALUES ('1fe4d408b85f19618c15bcb768f0ec22', '1750a8fb3e6d90cb7957c02de1dc8e59', '9502685863ab87f0ad1134142788a385'); +INSERT INTO `sys_role_permission` VALUES ('20c5d914795847f1578a720407d45e01', 'f6817f48af4fb3af11b9e8bf182f618b', '58857ff846e61794c69208e9d3a85466'); +INSERT INTO `sys_role_permission` VALUES ('21843cd6bcce21a3be77c56357c9e15e', 'f6817f48af4fb3af11b9e8bf182f618b', '882a73768cfd7f78f3a37584f7299656'); +INSERT INTO `sys_role_permission` VALUES ('2339c57dd0e5ccb690d0b1cf59167e55', 'f6817f48af4fb3af11b9e8bf182f618b', '8f486c17bf7016301432019fdba7aed8'); +INSERT INTO `sys_role_permission` VALUES ('241681d67a51a30252f0fa39e0b6afeb', 'ee8626f80f7c2619917b6236f3a7f02b', 'f23d9bfff4d9aa6b68569ba2cff38415'); +INSERT INTO `sys_role_permission` VALUES ('248d288586c6ff3bd14381565df84163', '52b0cf022ac4187b2a70dfa4f8b2d940', '3f915b2769fc80648e92d04e84ca059d'); +INSERT INTO `sys_role_permission` VALUES ('26efbc128b53ec664d51cb123aa4af48', 'f6817f48af4fb3af11b9e8bf182f618b', 'b2fc6087dfb66fa4a9d0323b10143aad'); +INSERT INTO `sys_role_permission` VALUES ('2710a82c7aa13eec37cdc0666a249770', 'ee8626f80f7c2619917b6236f3a7f02b', 'f1cb187abf927c88b89470d08615f5ac'); +INSERT INTO `sys_role_permission` VALUES ('28d1a189ff4c3f2fafe72b9685e2419b', 'f6817f48af4fb3af11b9e8bf182f618b', 'a400e4f4d54f79bf5ce160ae432231af'); +INSERT INTO `sys_role_permission` VALUES ('28f53e49d49bd85e26b4c6fe8bc16882', 'f6817f48af4fb3af11b9e8bf182f618b', '9017fb8c7485d04c342e2396c481a045'); +INSERT INTO `sys_role_permission` VALUES ('2c462293cbb0eab7e8ae0a3600361b5f', '52b0cf022ac4187b2a70dfa4f8b2d940', '9502685863ab87f0ad1134142788a385'); +INSERT INTO `sys_role_permission` VALUES ('2dc5ffc63bd188ae5687522b6de3e645', 'ee8626f80f7c2619917b6236f3a7f02b', 'e5973686ed495c379d829ea8b2881fc6'); +INSERT INTO `sys_role_permission` VALUES ('2ecb2f5b5acdeb831c4b55b34563a638', 'ee8626f80f7c2619917b6236f3a7f02b', '6e73eb3c26099c191bf03852ee1310a1'); +INSERT INTO `sys_role_permission` VALUES ('2fdaed22dfa4c8d4629e44ef81688c6a', '52b0cf022ac4187b2a70dfa4f8b2d940', 'aedbf679b5773c1f25e9f7b10111da73'); +INSERT INTO `sys_role_permission` VALUES ('300c462b7fec09e2ff32574ef8b3f0bd', '52b0cf022ac4187b2a70dfa4f8b2d940', '2a470fc0c3954d9dbb61de6d80846549'); +INSERT INTO `sys_role_permission` VALUES ('3126647f19dce968218cfb02a16db559', 'e51758fa916c881624b046d26bd09230', '45c966826eeff4c99b8f8ebfe74511fc'); +INSERT INTO `sys_role_permission` VALUES ('35ac7cae648de39eb56213ca1b649713', '52b0cf022ac4187b2a70dfa4f8b2d940', 'b1cb0a3fedf7ed0e4653cb5a229837ee'); +INSERT INTO `sys_role_permission` VALUES ('3684f08c808866feabfa3d8954524f1c', 'f6817f48af4fb3af11b9e8bf182f618b', '05b3c82ddb2536a4a5ee1a4c46b5abef'); +INSERT INTO `sys_role_permission` VALUES ('37e471af5ee4521192dae98f949fe625', 'ee8626f80f7c2619917b6236f3a7f02b', '200006f0edf145a2b50eacca07585451'); +INSERT INTO `sys_role_permission` VALUES ('388657cba491daddde0f6651f101089a', 'ee8626f80f7c2619917b6236f3a7f02b', '277bfabef7d76e89b33062b16a9a5020'); +INSERT INTO `sys_role_permission` VALUES ('39e3af8b87c5729b082c64f0516ebc97', 'e51758fa916c881624b046d26bd09230', 'a400e4f4d54f79bf5ce160ae432231af'); +INSERT INTO `sys_role_permission` VALUES ('3bef3422fb97c2b51f4af97c6a497185', 'e51758fa916c881624b046d26bd09230', 'b4dfc7d5dd9e8d5b6dd6d4579b1aa559'); +INSERT INTO `sys_role_permission` VALUES ('3cd59ac3de34288a2558dbbfb71d12b1', 'ee8626f80f7c2619917b6236f3a7f02b', 'aedbf679b5773c1f25e9f7b10111da73'); +INSERT INTO `sys_role_permission` VALUES ('3da5a50baf32a65966b27fed94eb78ca', 'ee8626f80f7c2619917b6236f3a7f02b', 'e08cb190ef230d5d4f03824198773950'); +INSERT INTO `sys_role_permission` VALUES ('3e563751942b0879c88ca4de19757b50', '1750a8fb3e6d90cb7957c02de1dc8e59', '58857ff846e61794c69208e9d3a85466'); +INSERT INTO `sys_role_permission` VALUES ('406b325850d869ef3ca22451db3d69e2', 'ee8626f80f7c2619917b6236f3a7f02b', '4f66409ef3bbd69c1d80469d6e2a885e'); +INSERT INTO `sys_role_permission` VALUES ('412e2de37a35b3442d68db8dd2f3c190', '52b0cf022ac4187b2a70dfa4f8b2d940', 'f1cb187abf927c88b89470d08615f5ac'); +INSERT INTO `sys_role_permission` VALUES ('42538c6d8add1897482080420956fe79', 'ee8626f80f7c2619917b6236f3a7f02b', '4875ebe289344e14844d8e3ea1edd73f'); +INSERT INTO `sys_role_permission` VALUES ('4439453c41bb4cb39890ae0426be798f', 'ee8626f80f7c2619917b6236f3a7f02b', '2e42e3835c2b44ec9f7bc26c146ee531'); +INSERT INTO `sys_role_permission` VALUES ('4825c27d3e256fb4d50ab54cb76365ec', 'e51758fa916c881624b046d26bd09230', '13212d3416eb690c2e1d5033166ff47a'); +INSERT INTO `sys_role_permission` VALUES ('48a59d6192d6db2053341056a3b1d079', 'f6817f48af4fb3af11b9e8bf182f618b', '4875ebe289344e14844d8e3ea1edd73f'); +INSERT INTO `sys_role_permission` VALUES ('48ec3c2c2fc487e86078aaf4e14273be', 'f6817f48af4fb3af11b9e8bf182f618b', 'd7d6e2e4e2934f2c9385a623fd98c6f3'); +INSERT INTO `sys_role_permission` VALUES ('4a1f54fa08889ff9d63f83e01fbfb5ef', 'f6817f48af4fb3af11b9e8bf182f618b', '73678f9daa45ed17a3674131b03432fb'); +INSERT INTO `sys_role_permission` VALUES ('4b9eac9fd79a1ca63be34b2a6b640738', 'f6817f48af4fb3af11b9e8bf182f618b', '4f66409ef3bbd69c1d80469d6e2a885e'); +INSERT INTO `sys_role_permission` VALUES ('4e2dc0d9aabbaab34120febdd23241b8', 'f6817f48af4fb3af11b9e8bf182f618b', 'e08cb190ef230d5d4f03824198773950'); +INSERT INTO `sys_role_permission` VALUES ('50a5f72e811970d107c50ff43587bdfb', 'e51758fa916c881624b046d26bd09230', '3f915b2769fc80648e92d04e84ca059d'); +INSERT INTO `sys_role_permission` VALUES ('57c0b3a547b815ea3ec8e509b08948b3', '1750a8fb3e6d90cb7957c02de1dc8e59', '3f915b2769fc80648e92d04e84ca059d'); +INSERT INTO `sys_role_permission` VALUES ('58105249b395c46b45ab52050c54716b', 'ee8626f80f7c2619917b6236f3a7f02b', '13212d3416eb690c2e1d5033166ff47a'); +INSERT INTO `sys_role_permission` VALUES ('58f1d42a8477733f9a949ceca0599780', 'f6817f48af4fb3af11b9e8bf182f618b', '078f9558cdeab239aecb2bda1a8ed0d1'); +INSERT INTO `sys_role_permission` VALUES ('593ee05c4fe4645c7826b7d5e14f23ec', '52b0cf022ac4187b2a70dfa4f8b2d940', '8fb8172747a78756c11916216b8b8066'); +INSERT INTO `sys_role_permission` VALUES ('59c24cd9220fba3e6a7e5c0bc2c2bcb5', 'ee8626f80f7c2619917b6236f3a7f02b', '73678f9daa45ed17a3674131b03432fb'); +INSERT INTO `sys_role_permission` VALUES ('5a5ba1a8c862f161981ab8ca75bd8f54', 'f6817f48af4fb3af11b9e8bf182f618b', '8e8517f135e55f1ef9340a558c9367f1'); +INSERT INTO `sys_role_permission` VALUES ('5b7e0aa65d547bd9586a068525a82efa', 'f6817f48af4fb3af11b9e8bf182f618b', 'e3c13679c73a4f829bcff2aba8fd68b1'); +INSERT INTO `sys_role_permission` VALUES ('61ab8ca7bc9dcd63ee49e4298d5d3520', 'f6817f48af4fb3af11b9e8bf182f618b', '6531cf3421b1265aeeeabaab5e176e6d'); +INSERT INTO `sys_role_permission` VALUES ('633d508c336b3e20fbbe7b2e1db55631', 'f6817f48af4fb3af11b9e8bf182f618b', '200006f0edf145a2b50eacca07585451'); +INSERT INTO `sys_role_permission` VALUES ('66180a9104f7593a74c7cfd8da673db6', 'ee8626f80f7c2619917b6236f3a7f02b', 'c65321e57b7949b7a975313220de0422'); +INSERT INTO `sys_role_permission` VALUES ('6a4ecfd721814517205ef5be062dec0b', 'f6817f48af4fb3af11b9e8bf182f618b', 'e8af452d8948ea49d37c934f5100ae6a'); +INSERT INTO `sys_role_permission` VALUES ('6ba390047557a46a0c9fe33031a12fde', 'f6817f48af4fb3af11b9e8bf182f618b', 'e6bfd1fcabfd7942fdd05f076d1dad38'); +INSERT INTO `sys_role_permission` VALUES ('6bb48ab31621f9dadfc0bff52543516a', 'f6817f48af4fb3af11b9e8bf182f618b', 'c6cf95444d80435eb37b2f9db3971ae6'); +INSERT INTO `sys_role_permission` VALUES ('6bbc5e38cd1f62072ee89fddacd93b38', 'ee8626f80f7c2619917b6236f3a7f02b', 'b3c824fc22bd953e2eb16ae6914ac8f9'); +INSERT INTO `sys_role_permission` VALUES ('6c09b922b32679365627586284d7809e', 'f6817f48af4fb3af11b9e8bf182f618b', '9502685863ab87f0ad1134142788a385'); +INSERT INTO `sys_role_permission` VALUES ('6ece067b09cc2ec8536fde2a4b5abd19', 'ee8626f80f7c2619917b6236f3a7f02b', '8fb8172747a78756c11916216b8b8066'); +INSERT INTO `sys_role_permission` VALUES ('6f0bf59157b633ffe1ae2f2f22f65418', 'f6817f48af4fb3af11b9e8bf182f618b', 'a400e4f4d54f79bf5ce160a3432231af'); +INSERT INTO `sys_role_permission` VALUES ('6f8a3f1205caf521a5a7cbb9a60763f4', 'f6817f48af4fb3af11b9e8bf182f618b', 'de13e0f6328c069748de7399fcc1dbbd'); +INSERT INTO `sys_role_permission` VALUES ('701856cb1422173e171ed851c3cab1ee', 'ee8626f80f7c2619917b6236f3a7f02b', '05b3c82ddb2536a4a5ee1a4c46b5abef'); +INSERT INTO `sys_role_permission` VALUES ('717ea664474132c93cae847e1ffc5807', 'ee8626f80f7c2619917b6236f3a7f02b', 'a400e4f4d54f79bf5ce160ae432231af'); +INSERT INTO `sys_role_permission` VALUES ('74e999bf3b7f4f67ed51048f281b81bc', 'f6817f48af4fb3af11b9e8bf182f618b', '8fb8172747a78756c11916216b8b8066'); +INSERT INTO `sys_role_permission` VALUES ('75002588591820806', '16457350655250432', '5129710648430592'); +INSERT INTO `sys_role_permission` VALUES ('75002588604403712', '16457350655250432', '5129710648430593'); +INSERT INTO `sys_role_permission` VALUES ('75002588612792320', '16457350655250432', '40238597734928384'); +INSERT INTO `sys_role_permission` VALUES ('75002588625375232', '16457350655250432', '57009744761589760'); +INSERT INTO `sys_role_permission` VALUES ('75002588633763840', '16457350655250432', '16392452747300864'); +INSERT INTO `sys_role_permission` VALUES ('75002588637958144', '16457350655250432', '16392767785668608'); +INSERT INTO `sys_role_permission` VALUES ('75002588650541056', '16457350655250432', '16439068543946752'); +INSERT INTO `sys_role_permission` VALUES ('75a2852363236af7c35cb4b0ca583a78', 'f6817f48af4fb3af11b9e8bf182f618b', 'aedbf679b5773c1f25e9f7b10111da73'); +INSERT INTO `sys_role_permission` VALUES ('77277779875336192', '496138616573952', '5129710648430592'); +INSERT INTO `sys_role_permission` VALUES ('77277780043108352', '496138616573952', '5129710648430593'); +INSERT INTO `sys_role_permission` VALUES ('77277780055691264', '496138616573952', '15701400130424832'); +INSERT INTO `sys_role_permission` VALUES ('77277780064079872', '496138616573952', '16678126574637056'); +INSERT INTO `sys_role_permission` VALUES ('77277780072468480', '496138616573952', '15701915807518720'); +INSERT INTO `sys_role_permission` VALUES ('77277780076662784', '496138616573952', '15708892205944832'); +INSERT INTO `sys_role_permission` VALUES ('77277780085051392', '496138616573952', '16678447719911424'); +INSERT INTO `sys_role_permission` VALUES ('77277780089245696', '496138616573952', '25014528525733888'); +INSERT INTO `sys_role_permission` VALUES ('77277780097634304', '496138616573952', '56898976661639168'); +INSERT INTO `sys_role_permission` VALUES ('77277780135383040', '496138616573952', '40238597734928384'); +INSERT INTO `sys_role_permission` VALUES ('77277780139577344', '496138616573952', '45235621697949696'); +INSERT INTO `sys_role_permission` VALUES ('77277780147965952', '496138616573952', '45235787867885568'); +INSERT INTO `sys_role_permission` VALUES ('77277780156354560', '496138616573952', '45235939278065664'); +INSERT INTO `sys_role_permission` VALUES ('77277780164743168', '496138616573952', '43117268627886080'); +INSERT INTO `sys_role_permission` VALUES ('77277780168937472', '496138616573952', '45236734832676864'); +INSERT INTO `sys_role_permission` VALUES ('77277780181520384', '496138616573952', '45237010692050944'); +INSERT INTO `sys_role_permission` VALUES ('77277780189908992', '496138616573952', '45237170029465600'); +INSERT INTO `sys_role_permission` VALUES ('77277780198297600', '496138616573952', '57009544286441472'); +INSERT INTO `sys_role_permission` VALUES ('77277780206686208', '496138616573952', '57009744761589760'); +INSERT INTO `sys_role_permission` VALUES ('77277780215074816', '496138616573952', '57009981228060672'); +INSERT INTO `sys_role_permission` VALUES ('77277780219269120', '496138616573952', '56309618086776832'); +INSERT INTO `sys_role_permission` VALUES ('77277780227657728', '496138616573952', '57212882168844288'); +INSERT INTO `sys_role_permission` VALUES ('77277780236046336', '496138616573952', '61560041605435392'); +INSERT INTO `sys_role_permission` VALUES ('77277780244434944', '496138616573952', '61560275261722624'); +INSERT INTO `sys_role_permission` VALUES ('77277780257017856', '496138616573952', '61560480518377472'); +INSERT INTO `sys_role_permission` VALUES ('77277780265406464', '496138616573952', '44986029924421632'); +INSERT INTO `sys_role_permission` VALUES ('77277780324126720', '496138616573952', '45235228800716800'); +INSERT INTO `sys_role_permission` VALUES ('77277780332515328', '496138616573952', '45069342940860416'); +INSERT INTO `sys_role_permission` VALUES ('77277780340903937', '496138616573952', '5129710648430594'); +INSERT INTO `sys_role_permission` VALUES ('77277780349292544', '496138616573952', '16687383932047360'); +INSERT INTO `sys_role_permission` VALUES ('77277780357681152', '496138616573952', '16689632049631232'); +INSERT INTO `sys_role_permission` VALUES ('77277780366069760', '496138616573952', '16689745006432256'); +INSERT INTO `sys_role_permission` VALUES ('77277780370264064', '496138616573952', '16689883993083904'); +INSERT INTO `sys_role_permission` VALUES ('77277780374458369', '496138616573952', '16690313745666048'); +INSERT INTO `sys_role_permission` VALUES ('77277780387041280', '496138616573952', '5129710648430595'); +INSERT INTO `sys_role_permission` VALUES ('77277780395429888', '496138616573952', '16694861252005888'); +INSERT INTO `sys_role_permission` VALUES ('77277780403818496', '496138616573952', '16695107491205120'); +INSERT INTO `sys_role_permission` VALUES ('77277780412207104', '496138616573952', '16695243126607872'); +INSERT INTO `sys_role_permission` VALUES ('77277780420595712', '496138616573952', '75002207560273920'); +INSERT INTO `sys_role_permission` VALUES ('77277780428984320', '496138616573952', '76215889006956544'); +INSERT INTO `sys_role_permission` VALUES ('77277780433178624', '496138616573952', '76216071333351424'); +INSERT INTO `sys_role_permission` VALUES ('77277780441567232', '496138616573952', '76216264070008832'); +INSERT INTO `sys_role_permission` VALUES ('77277780449955840', '496138616573952', '76216459709124608'); +INSERT INTO `sys_role_permission` VALUES ('77277780458344448', '496138616573952', '76216594207870976'); +INSERT INTO `sys_role_permission` VALUES ('77277780466733056', '496138616573952', '76216702639017984'); +INSERT INTO `sys_role_permission` VALUES ('77277780475121664', '496138616573952', '58480609315524608'); +INSERT INTO `sys_role_permission` VALUES ('77277780483510272', '496138616573952', '61394706252173312'); +INSERT INTO `sys_role_permission` VALUES ('77277780491898880', '496138616573952', '61417744146370560'); +INSERT INTO `sys_role_permission` VALUES ('77277780496093184', '496138616573952', '76606430504816640'); +INSERT INTO `sys_role_permission` VALUES ('77277780504481792', '496138616573952', '76914082455752704'); +INSERT INTO `sys_role_permission` VALUES ('77277780508676097', '496138616573952', '76607201262702592'); +INSERT INTO `sys_role_permission` VALUES ('77277780517064704', '496138616573952', '39915540965232640'); +INSERT INTO `sys_role_permission` VALUES ('77277780525453312', '496138616573952', '41370251991977984'); +INSERT INTO `sys_role_permission` VALUES ('77277780538036224', '496138616573952', '45264987354042368'); +INSERT INTO `sys_role_permission` VALUES ('77277780546424832', '496138616573952', '45265487029866496'); +INSERT INTO `sys_role_permission` VALUES ('77277780554813440', '496138616573952', '45265762415284224'); +INSERT INTO `sys_role_permission` VALUES ('77277780559007744', '496138616573952', '45265886315024384'); +INSERT INTO `sys_role_permission` VALUES ('77277780567396352', '496138616573952', '45266070000373760'); +INSERT INTO `sys_role_permission` VALUES ('77277780571590656', '496138616573952', '41363147411427328'); +INSERT INTO `sys_role_permission` VALUES ('77277780579979264', '496138616573952', '41363537456533504'); +INSERT INTO `sys_role_permission` VALUES ('77277780588367872', '496138616573952', '41364927394353152'); +INSERT INTO `sys_role_permission` VALUES ('77277780596756480', '496138616573952', '41371711400054784'); +INSERT INTO `sys_role_permission` VALUES ('77277780605145088', '496138616573952', '41469219249852416'); +INSERT INTO `sys_role_permission` VALUES ('77277780613533696', '496138616573952', '39916171171991552'); +INSERT INTO `sys_role_permission` VALUES ('77277780621922304', '496138616573952', '39918482854252544'); +INSERT INTO `sys_role_permission` VALUES ('77277780630310912', '496138616573952', '41373430515240960'); +INSERT INTO `sys_role_permission` VALUES ('77277780718391296', '496138616573952', '41375330996326400'); +INSERT INTO `sys_role_permission` VALUES ('77277780722585600', '496138616573952', '63741744973352960'); +INSERT INTO `sys_role_permission` VALUES ('77277780730974208', '496138616573952', '42082442672082944'); +INSERT INTO `sys_role_permission` VALUES ('77277780739362816', '496138616573952', '41376192166629376'); +INSERT INTO `sys_role_permission` VALUES ('77277780747751424', '496138616573952', '41377034236071936'); +INSERT INTO `sys_role_permission` VALUES ('77277780756140032', '496138616573952', '56911328312299520'); +INSERT INTO `sys_role_permission` VALUES ('77277780764528640', '496138616573952', '41378916912336896'); +INSERT INTO `sys_role_permission` VALUES ('77277780768722944', '496138616573952', '63482475359244288'); +INSERT INTO `sys_role_permission` VALUES ('77277780772917249', '496138616573952', '64290663792906240'); +INSERT INTO `sys_role_permission` VALUES ('77277780785500160', '496138616573952', '66790433014943744'); +INSERT INTO `sys_role_permission` VALUES ('77277780789694464', '496138616573952', '42087054753927168'); +INSERT INTO `sys_role_permission` VALUES ('77277780798083072', '496138616573952', '67027338952445952'); +INSERT INTO `sys_role_permission` VALUES ('77277780806471680', '496138616573952', '67027909637836800'); +INSERT INTO `sys_role_permission` VALUES ('77277780810665985', '496138616573952', '67042515441684480'); +INSERT INTO `sys_role_permission` VALUES ('77277780823248896', '496138616573952', '67082402312228864'); +INSERT INTO `sys_role_permission` VALUES ('77277780827443200', '496138616573952', '16392452747300864'); +INSERT INTO `sys_role_permission` VALUES ('77277780835831808', '496138616573952', '16392767785668608'); +INSERT INTO `sys_role_permission` VALUES ('77277780840026112', '496138616573952', '16438800255291392'); +INSERT INTO `sys_role_permission` VALUES ('77277780844220417', '496138616573952', '16438962738434048'); +INSERT INTO `sys_role_permission` VALUES ('77277780852609024', '496138616573952', '16439068543946752'); +INSERT INTO `sys_role_permission` VALUES ('77277860062040064', '496138616573953', '5129710648430592'); +INSERT INTO `sys_role_permission` VALUES ('77277860070428672', '496138616573953', '5129710648430593'); +INSERT INTO `sys_role_permission` VALUES ('77277860078817280', '496138616573953', '40238597734928384'); +INSERT INTO `sys_role_permission` VALUES ('77277860091400192', '496138616573953', '43117268627886080'); +INSERT INTO `sys_role_permission` VALUES ('77277860099788800', '496138616573953', '57009744761589760'); +INSERT INTO `sys_role_permission` VALUES ('77277860112371712', '496138616573953', '56309618086776832'); +INSERT INTO `sys_role_permission` VALUES ('77277860120760320', '496138616573953', '44986029924421632'); +INSERT INTO `sys_role_permission` VALUES ('77277860129148928', '496138616573953', '5129710648430594'); +INSERT INTO `sys_role_permission` VALUES ('77277860141731840', '496138616573953', '5129710648430595'); +INSERT INTO `sys_role_permission` VALUES ('77277860150120448', '496138616573953', '75002207560273920'); +INSERT INTO `sys_role_permission` VALUES ('77277860158509056', '496138616573953', '58480609315524608'); +INSERT INTO `sys_role_permission` VALUES ('77277860162703360', '496138616573953', '76606430504816640'); +INSERT INTO `sys_role_permission` VALUES ('77277860171091968', '496138616573953', '76914082455752704'); +INSERT INTO `sys_role_permission` VALUES ('77277860179480576', '496138616573953', '76607201262702592'); +INSERT INTO `sys_role_permission` VALUES ('77277860187869184', '496138616573953', '39915540965232640'); +INSERT INTO `sys_role_permission` VALUES ('77277860196257792', '496138616573953', '41370251991977984'); +INSERT INTO `sys_role_permission` VALUES ('77277860204646400', '496138616573953', '41363147411427328'); +INSERT INTO `sys_role_permission` VALUES ('77277860208840704', '496138616573953', '41371711400054784'); +INSERT INTO `sys_role_permission` VALUES ('77277860213035009', '496138616573953', '39916171171991552'); +INSERT INTO `sys_role_permission` VALUES ('77277860221423616', '496138616573953', '39918482854252544'); +INSERT INTO `sys_role_permission` VALUES ('77277860225617920', '496138616573953', '41373430515240960'); +INSERT INTO `sys_role_permission` VALUES ('77277860234006528', '496138616573953', '41375330996326400'); +INSERT INTO `sys_role_permission` VALUES ('77277860242395136', '496138616573953', '63741744973352960'); +INSERT INTO `sys_role_permission` VALUES ('77277860250783744', '496138616573953', '42082442672082944'); +INSERT INTO `sys_role_permission` VALUES ('77277860254978048', '496138616573953', '41376192166629376'); +INSERT INTO `sys_role_permission` VALUES ('77277860263366656', '496138616573953', '41377034236071936'); +INSERT INTO `sys_role_permission` VALUES ('77277860271755264', '496138616573953', '56911328312299520'); +INSERT INTO `sys_role_permission` VALUES ('77277860313698304', '496138616573953', '41378916912336896'); +INSERT INTO `sys_role_permission` VALUES ('77277860322086912', '496138616573953', '63482475359244288'); +INSERT INTO `sys_role_permission` VALUES ('77277860326281216', '496138616573953', '64290663792906240'); +INSERT INTO `sys_role_permission` VALUES ('77277860334669824', '496138616573953', '66790433014943744'); +INSERT INTO `sys_role_permission` VALUES ('77277860343058432', '496138616573953', '42087054753927168'); +INSERT INTO `sys_role_permission` VALUES ('77277860347252736', '496138616573953', '67027338952445952'); +INSERT INTO `sys_role_permission` VALUES ('77277860351447041', '496138616573953', '67027909637836800'); +INSERT INTO `sys_role_permission` VALUES ('77277860359835648', '496138616573953', '67042515441684480'); +INSERT INTO `sys_role_permission` VALUES ('77277860364029952', '496138616573953', '67082402312228864'); +INSERT INTO `sys_role_permission` VALUES ('77277860368224256', '496138616573953', '16392452747300864'); +INSERT INTO `sys_role_permission` VALUES ('77277860372418560', '496138616573953', '16392767785668608'); +INSERT INTO `sys_role_permission` VALUES ('77277860376612865', '496138616573953', '16438800255291392'); +INSERT INTO `sys_role_permission` VALUES ('77277860385001472', '496138616573953', '16438962738434048'); +INSERT INTO `sys_role_permission` VALUES ('77277860389195776', '496138616573953', '16439068543946752'); +INSERT INTO `sys_role_permission` VALUES ('7a5d31ba48fe3fb1266bf186dc5f7ba7', '52b0cf022ac4187b2a70dfa4f8b2d940', '58857ff846e61794c69208e9d3a85466'); +INSERT INTO `sys_role_permission` VALUES ('7da0a684903280c9582fe3f0063a6b4a', 'f6817f48af4fb3af11b9e8bf182f618b', '08e6b9dc3c04489c8e1ff2ce6f105aa4'); +INSERT INTO `sys_role_permission` VALUES ('7de42bdc0b8c5446b7d428c66a7abc12', '52b0cf022ac4187b2a70dfa4f8b2d940', '54dd5457a3190740005c1bfec55b1c34'); +INSERT INTO `sys_role_permission` VALUES ('805818784d80e30d60d0bc19c85d6bfd', 'ee8626f80f7c2619917b6236f3a7f02b', 'd7d6e2e4e2934f2c9385a623fd98c6f3'); +INSERT INTO `sys_role_permission` VALUES ('8359760581bf3f3a8b17d2d3d813f988', 'e51758fa916c881624b046d26bd09230', 'fb367426764077dcf94640c843733985'); +INSERT INTO `sys_role_permission` VALUES ('848d2e5b9a81f46199bbf2026581718f', 'ee8626f80f7c2619917b6236f3a7f02b', '418964ba087b90a84897b62474496b93'); +INSERT INTO `sys_role_permission` VALUES ('848d34a47accfce4892be408de900181', 'f6817f48af4fb3af11b9e8bf182f618b', '6e73eb3c26099c191bf03852ee1310a1'); +INSERT INTO `sys_role_permission` VALUES ('8501e54beca4d97e9b637fbc8088c9dc', 'f6817f48af4fb3af11b9e8bf182f618b', '540a2936940846cb98114ffb0d145cb8'); +INSERT INTO `sys_role_permission` VALUES ('85035d45e89059e7eeec1c5ed4a503ad', 'f6817f48af4fb3af11b9e8bf182f618b', 'ec8d607d0156e198b11853760319c646'); +INSERT INTO `sys_role_permission` VALUES ('8677678f8d2f38b2511890cdac0eae0b', 'f6817f48af4fb3af11b9e8bf182f618b', '2a470fc0c3954d9dbb61de6d80846549'); +INSERT INTO `sys_role_permission` VALUES ('86a6b794496c82586dd2f7e160f0084b', 'f6817f48af4fb3af11b9e8bf182f618b', '0b6debda2d5a214aa81540971575a6b2'); +INSERT INTO `sys_role_permission` VALUES ('86d964c21192cb8aecfb6571a6478041', 'e51758fa916c881624b046d26bd09230', 'd7d6e2e4e2934f2c9385a623fd98c6f3'); +INSERT INTO `sys_role_permission` VALUES ('87a130cf99c9bb8d8504e2b4850e8f05', 'e51758fa916c881624b046d26bd09230', 'e8af452d8948ea49d37c934f5100ae6a'); +INSERT INTO `sys_role_permission` VALUES ('87d1fe4a702017386ba10b4ee8690f32', 'ee8626f80f7c2619917b6236f3a7f02b', 'fb367426764077dcf94640c843733985'); +INSERT INTO `sys_role_permission` VALUES ('88824681e84cbb11ee123460a9dd2be6', 'e51758fa916c881624b046d26bd09230', '58857ff846e61794c69208e9d3a85466'); +INSERT INTO `sys_role_permission` VALUES ('8885e0c7239d877a108e5e14913d02c9', 'f6817f48af4fb3af11b9e8bf182f618b', '277bfabef7d76e89b33062b16a9a5020'); +INSERT INTO `sys_role_permission` VALUES ('89309192c469ebe55cac2189dde81375', 'e51758fa916c881624b046d26bd09230', 'e08cb190ef230d5d4f03824198773950'); +INSERT INTO `sys_role_permission` VALUES ('8a60df8d8b4c9ee5fa63f48aeee3ec00', '1750a8fb3e6d90cb7957c02de1dc8e59', 'd7d6e2e4e2934f2c9385a623fd98c6f3'); +INSERT INTO `sys_role_permission` VALUES ('8a63af8ef2a4a1a641eb80d3e66140dd', 'f6817f48af4fb3af11b9e8bf182f618b', '9271af487e0184387c326383d655ca37'); +INSERT INTO `sys_role_permission` VALUES ('8b6309dac37f642e41073ecf9d5f8a4f', 'ee8626f80f7c2619917b6236f3a7f02b', 'b4dfc7d5dd9e8d5b6dd6d4579b1aa559'); +INSERT INTO `sys_role_permission` VALUES ('8ce1022dac4e558ff9694600515cf510', '1750a8fb3e6d90cb7957c02de1dc8e59', '08e6b9dc3c04489c8e1ff2ce6f105aa4'); +INSERT INTO `sys_role_permission` VALUES ('8d848ca7feec5b7ebb3ecb32b2c8857a', '52b0cf022ac4187b2a70dfa4f8b2d940', '4148ec82b6acd69f470bea75fe41c357'); +INSERT INTO `sys_role_permission` VALUES ('9264104cee9b10c96241d527b2d0346d', '1750a8fb3e6d90cb7957c02de1dc8e59', '54dd5457a3190740005c1bfec55b1c34'); +INSERT INTO `sys_role_permission` VALUES ('97bb13727b2faa5f7ab0f006a600ecb7', 'ee8626f80f7c2619917b6236f3a7f02b', '2a470fc0c3954d9dbb61de6d80846549'); +INSERT INTO `sys_role_permission` VALUES ('98943175f29f12ae88c6bc5991559058', 'f6817f48af4fb3af11b9e8bf182f618b', 'e5973686ed495c379d829ea8b2881fc6'); +INSERT INTO `sys_role_permission` VALUES ('99fd4a7aa629ab77c0265285f779cfc8', 'f6817f48af4fb3af11b9e8bf182f618b', '4148ec82b6acd69f470bea75fe41c357'); +INSERT INTO `sys_role_permission` VALUES ('9a7a8020c3c6544773239c21daebfbc8', 'ee8626f80f7c2619917b6236f3a7f02b', '540a2936940846cb98114ffb0d145cb8'); +INSERT INTO `sys_role_permission` VALUES ('9b3be7550e49dae4264d055b9578f937', 'e51758fa916c881624b046d26bd09230', '08e6b9dc3c04489c8e1ff2ce6f105aa4'); +INSERT INTO `sys_role_permission` VALUES ('9c4c310005bf9b3aa10d0855b851dd4a', 'f6817f48af4fb3af11b9e8bf182f618b', '45c966826eeff4c99b8f8ebfe74511fc'); +INSERT INTO `sys_role_permission` VALUES ('9deb6902c4dd2068cc36068d8f92b129', 'ee8626f80f7c2619917b6236f3a7f02b', 'ec8d607d0156e198b11853760319c646'); +INSERT INTO `sys_role_permission` VALUES ('9ea5c9a17bd0fe2998f8f5bf3ff03340', 'ee8626f80f7c2619917b6236f3a7f02b', '65a8f489f25a345836b7f44b1181197a'); +INSERT INTO `sys_role_permission` VALUES ('9eb1c9695038cb5821a373d0faf4893a', 'f6817f48af4fb3af11b9e8bf182f618b', '339329ed54cf255e1f9392e84f136901'); +INSERT INTO `sys_role_permission` VALUES ('9f3734bd5df9a10e94a61991c8e6385b', 'f6817f48af4fb3af11b9e8bf182f618b', 'b1cb0a3fedf7ed0e4653cb5a229837ee'); +INSERT INTO `sys_role_permission` VALUES ('9f8311ecccd44e079723098cf2ffe1cc', '1750a8fb3e6d90cb7957c02de1dc8e59', '693ce69af3432bd00be13c3971a57961'); +INSERT INTO `sys_role_permission` VALUES ('a3ad5828891623739f972adec7b72925', 'e51758fa916c881624b046d26bd09230', 'c65321e57b7949b7a975313220de0422'); +INSERT INTO `sys_role_permission` VALUES ('a4703e53d8a1ef028f5c1e989aa181ab', 'ee8626f80f7c2619917b6236f3a7f02b', '693ce69af3432bd00be13c3971a57961'); +INSERT INTO `sys_role_permission` VALUES ('abc615092450682973b97fdf1517d70a', 'ee8626f80f7c2619917b6236f3a7f02b', '078f9558cdeab239aecb2bda1a8ed0d1'); +INSERT INTO `sys_role_permission` VALUES ('ac3a3e4f965e26639ba2157f9c87510f', 'e51758fa916c881624b046d26bd09230', 'f1cb187abf927c88b89470d08615f5ac'); +INSERT INTO `sys_role_permission` VALUES ('ac68f782147d10e832361955799f797e', 'f6817f48af4fb3af11b9e8bf182f618b', 'ae4fed059f67086fd52a73d913cf473d'); +INSERT INTO `sys_role_permission` VALUES ('acf83ea75957c4479b2454184d43db25', 'f6817f48af4fb3af11b9e8bf182f618b', '54dd5457a3190740005c1bfec55b1c34'); +INSERT INTO `sys_role_permission` VALUES ('ad2aff227a7e5c77a28978d5ec0aacd1', 'f6817f48af4fb3af11b9e8bf182f618b', 'c65321e57b7949b7a975313220de0422'); +INSERT INTO `sys_role_permission` VALUES ('ada57af3189bbf6ca6403e399b57ddc8', 'f6817f48af4fb3af11b9e8bf182f618b', '5efbf11a764db7759c36c669a263f292'); +INSERT INTO `sys_role_permission` VALUES ('aefc8c22e061171806e59cd222f6b7e1', '52b0cf022ac4187b2a70dfa4f8b2d940', 'e8af452d8948ea49d37c934f5100ae6a'); +INSERT INTO `sys_role_permission` VALUES ('af984985ac4d9c506dd14b2852db8b46', 'e51758fa916c881624b046d26bd09230', '2a470fc0c3954d9dbb61de6d80846549'); +INSERT INTO `sys_role_permission` VALUES ('b10400742083ee1f54965e9a8bd66cf7', 'ee8626f80f7c2619917b6236f3a7f02b', '08e6b9dc3c04489c8e1ff2ce6f105aa4'); +INSERT INTO `sys_role_permission` VALUES ('b173f181712c97d9f4090bbe1c842b7d', 'f6817f48af4fb3af11b9e8bf182f618b', '7ac9eb9ccbde2f7a033cd4944272bf1e'); +INSERT INTO `sys_role_permission` VALUES ('b3bca65182c8e8e8962be046f92bb114', 'f6817f48af4fb3af11b9e8bf182f618b', 'b4dfc7d5dd9e8d5b6dd6d4579b1aa559'); +INSERT INTO `sys_role_permission` VALUES ('b44e8fcab5b56e31a518c03a7365e740', 'f6817f48af4fb3af11b9e8bf182f618b', 'd86f58e7ab516d3bc6bfb1fe10585f97'); +INSERT INTO `sys_role_permission` VALUES ('b5ac258a406d007eeda459bac92d2bdb', 'e51758fa916c881624b046d26bd09230', '8fb8172747a78756c11916216b8b8066'); +INSERT INTO `sys_role_permission` VALUES ('b5d8777b207bc8542c582d8c0181b026', 'f6817f48af4fb3af11b9e8bf182f618b', '6ad53fd1b220989a8b71ff482d683a5a'); +INSERT INTO `sys_role_permission` VALUES ('b6fd9f4c680916c50576089226c868bb', 'ee8626f80f7c2619917b6236f3a7f02b', 'e3c13679c73a4f829bcff2aba8fd68b1'); +INSERT INTO `sys_role_permission` VALUES ('b929baebd4f991007f3e9b39c570cacf', 'f6817f48af4fb3af11b9e8bf182f618b', '3eb07a99bd7dcea6d9bef40e37735c7f'); +INSERT INTO `sys_role_permission` VALUES ('bc933866f29c688d12ebcbc6ba380609', 'ee8626f80f7c2619917b6236f3a7f02b', 'e6bfd1fcabfd7942fdd05f076d1dad38'); +INSERT INTO `sys_role_permission` VALUES ('bcac0166161d3d02fa0797ef6989aa43', 'f6817f48af4fb3af11b9e8bf182f618b', 'fb367426764077dcf94640c843733985'); +INSERT INTO `sys_role_permission` VALUES ('bdc0b7f20bf0d4b7a0a23783cd430ca2', 'ee8626f80f7c2619917b6236f3a7f02b', 'de13e0f6328c069748de7399fcc1dbbd'); +INSERT INTO `sys_role_permission` VALUES ('c1899d05c0e53a6698c0a2671db4c8e2', 'ee8626f80f7c2619917b6236f3a7f02b', '54dd5457a3190740005c1bfec55b1c34'); +INSERT INTO `sys_role_permission` VALUES ('c41c0dbd1e7568b4334f4cee6f1f53b7', 'e51758fa916c881624b046d26bd09230', 'd2bbf9ebca5a8fa2e227af97d2da7548'); +INSERT INTO `sys_role_permission` VALUES ('c42611ea289f02e5e1d85aa84df6a215', 'f6817f48af4fb3af11b9e8bf182f618b', 'f1cb187abf927c88b89470d08615f5ac'); +INSERT INTO `sys_role_permission` VALUES ('c8a4552dd8f3bb64d8bfd1930631d592', 'f6817f48af4fb3af11b9e8bf182f618b', '2dbbafa22cda07fa5d169d741b81fe12'); +INSERT INTO `sys_role_permission` VALUES ('ca4dd892d770632a2bbf3b4174aef0fd', 'f6817f48af4fb3af11b9e8bf182f618b', 'fedfbf4420536cacc0218557d263dfea'); +INSERT INTO `sys_role_permission` VALUES ('cd2f88e859c11a292e8b5c8da8005b2f', 'ee8626f80f7c2619917b6236f3a7f02b', '6531cf3421b1265aeeeabaab5e176e6d'); +INSERT INTO `sys_role_permission` VALUES ('cd60279d117b4b0435c8c78a4bcadb83', 'e51758fa916c881624b046d26bd09230', 'b1cb0a3fedf7ed0e4653cb5a229837ee'); +INSERT INTO `sys_role_permission` VALUES ('d3fe195d59811531c05d31d8436f5c8b', '1750a8fb3e6d90cb7957c02de1dc8e59', 'e8af452d8948ea49d37c934f5100ae6a'); +INSERT INTO `sys_role_permission` VALUES ('d553ad49e741d6299acb3b295bcb209f', 'f6817f48af4fb3af11b9e8bf182f618b', '89d70d3c72ad5cc778f511f8ac9f3242'); +INSERT INTO `sys_role_permission` VALUES ('d633bcc436fc482a958deeb2a9e72438', 'f6817f48af4fb3af11b9e8bf182f618b', 'fb07ca05a3e13674dbf6d3245956da2e'); +INSERT INTO `sys_role_permission` VALUES ('d6d39c7f15c04e48d1f5ad4919c48bee', 'f6817f48af4fb3af11b9e8bf182f618b', '65a8f489f25a345836b7f44b1181197a'); +INSERT INTO `sys_role_permission` VALUES ('daa3ba8acc7d5ec69d022db6ad962131', 'f6817f48af4fb3af11b9e8bf182f618b', 'cc50656cf9ca528e6f2150eba4714ad2'); +INSERT INTO `sys_role_permission` VALUES ('e046676385b007df88f95650ea885828', 'f6817f48af4fb3af11b9e8bf182f618b', 'ceab6bab4aea3f155de638e737c808ee'); +INSERT INTO `sys_role_permission` VALUES ('e0ee13939a1707ff0ada050ee81a35f5', 'f6817f48af4fb3af11b9e8bf182f618b', '717f6bee46f44a3897eca9abd6e2ec44'); +INSERT INTO `sys_role_permission` VALUES ('e270ad76a1db8b6cb3352d77eff600f3', 'ee8626f80f7c2619917b6236f3a7f02b', '1367a93f2c410b169faa7abcbad2f77c'); +INSERT INTO `sys_role_permission` VALUES ('e27a125002fff5556ca7c8c58a41f495', 'ee8626f80f7c2619917b6236f3a7f02b', '00a2a0ae65cdca5e93209cdbde97cbe6'); +INSERT INTO `sys_role_permission` VALUES ('e28bbe8b7bea9946016fe9f26fd47941', 'ee8626f80f7c2619917b6236f3a7f02b', 'b1cb0a3fedf7ed0e4653cb5a229837ee'); +INSERT INTO `sys_role_permission` VALUES ('e3e922673f4289b18366bb51b6200f17', '52b0cf022ac4187b2a70dfa4f8b2d940', '45c966826eeff4c99b8f8ebfe74511fc'); +INSERT INTO `sys_role_permission` VALUES ('e424befcb56fe26109eb5825783aeae8', 'ee8626f80f7c2619917b6236f3a7f02b', 'd86f58e7ab516d3bc6bfb1fe10585f97'); +INSERT INTO `sys_role_permission` VALUES ('e6c4d984c59dbf02cbd53ff9b3592178', 'f6817f48af4fb3af11b9e8bf182f618b', '00a2a0ae65cdca5e93209cdbde97cbe6'); +INSERT INTO `sys_role_permission` VALUES ('e853cee937560cb4b68904d382c513fb', 'ee8626f80f7c2619917b6236f3a7f02b', 'ae4fed059f67086fd52a73d913cf473d'); +INSERT INTO `sys_role_permission` VALUES ('ec25a3f64638f1b58f42b6a3da708189', 'f6817f48af4fb3af11b9e8bf182f618b', '2e42e3835c2b44ec9f7bc26c146ee531'); +INSERT INTO `sys_role_permission` VALUES ('efed119ff9eb2e1ec9b8386aaf69584f', 'f6817f48af4fb3af11b9e8bf182f618b', '1367a93f2c410b169faa7abcbad2f77c'); +INSERT INTO `sys_role_permission` VALUES ('f041ba27d075dbe53cc4ad5132cfcd32', 'ee8626f80f7c2619917b6236f3a7f02b', '9502685863ab87f0ad1134142788a385'); +INSERT INTO `sys_role_permission` VALUES ('f112a2eac584acf623916e676dbb8280', 'e51758fa916c881624b046d26bd09230', '54dd5457a3190740005c1bfec55b1c34'); +INSERT INTO `sys_role_permission` VALUES ('f2742febef62f2c1f1fc05c7252451e3', 'ee8626f80f7c2619917b6236f3a7f02b', 'e8af452d8948ea49d37c934f5100ae6a'); +INSERT INTO `sys_role_permission` VALUES ('f27cc0a40bcfa7752238e4b1000519a7', 'f6817f48af4fb3af11b9e8bf182f618b', '3f915b2769fc80648e92d04e84ca059d'); +INSERT INTO `sys_role_permission` VALUES ('f7881a0cefda56b986578418ad940063', 'f6817f48af4fb3af11b9e8bf182f618b', '4f84f9400e5e92c95f05b554724c2b58'); +INSERT INTO `sys_role_permission` VALUES ('fa3a980e2e135462216af6188c535909', 'e51758fa916c881624b046d26bd09230', 'aedbf679b5773c1f25e9f7b10111da73'); +INSERT INTO `sys_role_permission` VALUES ('fe90569d40b7464335760bf17a6a8d32', 'e51758fa916c881624b046d26bd09230', '65a8f489f25a345836b7f44b1181197a'); +INSERT INTO `sys_role_permission` VALUES ('fed41a4671285efb266cd404f24dd378', '52b0cf022ac4187b2a70dfa4f8b2d940', '00a2a0ae65cdca5e93209cdbde97cbe6'); + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `id` varchar(32) NOT NULL COMMENT '主键id', + `username` varchar(100) default NULL COMMENT '登录账号', + `realname` varchar(255) default NULL COMMENT '真实姓名', + `password` varchar(255) default NULL COMMENT '密码', + `salt` varchar(45) default NULL COMMENT 'md5密码盐', + `avatar` varchar(255) default NULL COMMENT '头像', + `birthday` datetime default NULL COMMENT '生日', + `sex` int(11) default NULL COMMENT '性别(1:男 2:女)', + `email` varchar(45) default NULL COMMENT '电子邮件', + `phone` varchar(45) default NULL COMMENT '电话', + `status` int(11) default NULL COMMENT '状态(1:正常 2:冻结 )', + `del_flag` varchar(255) default NULL COMMENT '删除状态(0,正常,1已删除)', + `create_by` varchar(255) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(255) default NULL COMMENT '更新人', + `update_time` datetime default NULL COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO `sys_user` VALUES ('a75d45a015c44384a04449ee80dc3503', 'jeecg', 'jeecg', '3dd8371f3cf8240e', 'vDDkDzrK', 'user/20190220/e1fe9925bc315c60addea1b98eb1cb1349547719_1550656892940.jpg', null, null, null, null, '1', '0', 'admin', '2019-02-13 16:02:36', 'admin', '2019-02-20 18:30:50'); +INSERT INTO `sys_user` VALUES ('e9ca23d68d884d4ebb19d07889727dae', 'admin', '管理员', 'cb362cfeefbf3d8d', 'RCGTeGiH', 'user/20190119/logo-2_1547868176839.png', '2018-12-05 00:00:00', '1', '11@qq.com', '18566666666', '1', '0', null, '2018-12-21 17:54:10', 'admin', '2019-01-19 23:38:10'); + +-- ---------------------------- +-- Table structure for sys_user_depart +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_depart`; +CREATE TABLE `sys_user_depart` ( + `ID` varchar(32) NOT NULL COMMENT 'id', + `user_id` varchar(32) default NULL COMMENT '用户id', + `dep_id` varchar(32) default NULL COMMENT '部门id', + PRIMARY KEY (`ID`), + KEY `userid` (`user_id`), + KEY `orgid` (`dep_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of sys_user_depart +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `id` varchar(32) NOT NULL COMMENT '主键id', + `user_id` varchar(32) default NULL COMMENT '用户id', + `role_id` varchar(32) default NULL COMMENT '角色id', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户角色表'; + +-- ---------------------------- +-- Records of sys_user_role +-- ---------------------------- +INSERT INTO `sys_user_role` VALUES ('0eba8656e7466ecc9504ea23c2466492', 'a75d45a015c44384a04449ee80dc3503', 'ee8626f80f7c2619917b6236f3a7f02b'); +INSERT INTO `sys_user_role` VALUES ('0ede6d23d53bc7dc990346ff14faabee', '3db4cf42353f4e868b7ccfeef90505d2', 'ee8626f80f7c2619917b6236f3a7f02b'); +INSERT INTO `sys_user_role` VALUES ('469eb183e8fc8cac5ad1963e53fb59fa', 'e9ca23d68d884d4ebb19d07889727dae', 'f6817f48af4fb3af11b9e8bf182f618b'); +INSERT INTO `sys_user_role` VALUES ('b3ffd9311a1ca296c44e2409b547384f', '01b802058ea94b978a2c96f4807f6b48', '1'); +INSERT INTO `sys_user_role` VALUES ('ee45d0343ecec894b6886effc92cb0b7', '4d8fef4667574b24a9ccfedaf257810c', 'f6817f48af4fb3af11b9e8bf182f618b'); +INSERT INTO `sys_user_role` VALUES ('f2922a38ba24fb53749e45a0c459adb3', '439ae3e9bcf7418583fcd429cadb1d72', '1'); +INSERT INTO `sys_user_role` VALUES ('f72c6190b0722e798147e73c776c6ac9', '439ae3e9bcf7418583fcd429cadb1d72', 'ee8626f80f7c2619917b6236f3a7f02b'); diff --git a/jeecg-boot/pom.xml b/jeecg-boot/pom.xml new file mode 100644 index 0000000..3b0ab81 --- /dev/null +++ b/jeecg-boot/pom.xml @@ -0,0 +1,193 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>org.jeecgframework.boot</groupId> + <artifactId>jeecg-boot</artifactId> + <version>1.0.1</version> + + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>2.0.3.RELEASE</version> + <relativePath/> + </parent> + + <repositories> + <repository> + <id>aliyun</id> + <name>aliyun Repository</name> + <url>http://maven.aliyun.com/nexus/content/groups/public</url> + <snapshots> + <enabled>false</enabled> + </snapshots> + </repository> + <repository> + <id>jeecg</id> + <name>jeecg Repository</name> + <url>http://maven.jeecg.org/nexus/content/repositories/jeecg</url> + <snapshots> + <enabled>false</enabled> + </snapshots> + </repository> + </repositories> + + <properties> + <java.version>1.8</java.version> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <mybatis-plus.version>3.0.6</mybatis-plus.version> + <druid.version>1.1.10</druid.version> + <jwt.version>0.9.1</jwt.version> + </properties> + + <dependencies> + <!--集成springmvc框架并实现自动配置 --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-aop</artifactId> + </dependency> + + <!-- Lombok get set 构造方法 toString logger 自动生成工具--> + <!--注意:需要IDE也安装对应插件,可直接在plugins里面搜,不安装,语法报错但不影响编译和运行--> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-devtools</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-freemarker</artifactId> + </dependency> + + <!-- mybatis-plus --> + <dependency> + <groupId>com.baomidou</groupId> + <artifactId>mybatis-plus-boot-starter</artifactId> + <version>${mybatis-plus.version}</version> + </dependency> + <!-- mybatis-plus --> + + <!-- druid阿里巴巴数据库连接池 --> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>druid-spring-boot-starter</artifactId> + <version>1.1.10</version> + </dependency> + + <!-- 动态数据源 --> + <dependency> + <groupId>com.baomidou</groupId> + <artifactId>dynamic-datasource-spring-boot-starter</artifactId> + <version>2.5.0</version> + </dependency> + + <!-- json --> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>fastjson</artifactId> + <version>1.2.35</version> + </dependency> + + <!--mysql--> + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <scope>runtime</scope> + </dependency> + + <!-- Quartz定时任务 --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-quartz</artifactId> + </dependency> + + <!--JWT--> + <dependency> + <groupId>com.auth0</groupId> + <artifactId>java-jwt</artifactId> + <version>3.4.1</version> + </dependency> + + <!--shiro--> + <dependency> + <groupId>org.apache.shiro</groupId> + <artifactId>shiro-spring-boot-starter</artifactId> + <version>1.4.0-RC2</version> + </dependency> + + <!-- Swagger API文档 --> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger2</artifactId> + <version>2.9.2</version> + </dependency> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger-ui</artifactId> + <version>2.9.2</version> + </dependency> + <!-- redis --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-redis</artifactId> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-pool2</artifactId> + </dependency> + <!-- jeecg-boot 代码生成器 --> + <dependency> + <groupId>org.jeecgframework.boot</groupId> + <artifactId>codegenerate</artifactId> + <version>1.0.0</version> + </dependency> + + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + </plugin> + <!-- 指定JDK编译版本 --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.8</source> + <target>1.8</target> + <encoding>UTF-8</encoding> + </configuration> + </plugin> + </plugins> + <resources> + <resource> + <directory>src/main/resources</directory> + <filtering>true</filtering> + </resource> + <resource> + <directory>src/main/java</directory> + <includes> + <include>**/*.xml</include> + <include>**/*.json</include> + </includes> + </resource> + </resources> + </build> + +</project> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/JeecgApplication.java b/jeecg-boot/src/main/java/org/jeecg/JeecgApplication.java new file mode 100644 index 0000000..b90bfc2 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/JeecgApplication.java @@ -0,0 +1,16 @@ +package org.jeecg; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@EnableSwagger2 +@SpringBootApplication +public class JeecgApplication { + + public static void main(String[] args) { + System.setProperty("spring.devtools.restart.enabled", "true"); + SpringApplication.run(JeecgApplication.class, args); + } +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/JeecgCodeGenerator.java b/jeecg-boot/src/main/java/org/jeecg/JeecgCodeGenerator.java new file mode 100644 index 0000000..1e41e4c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/JeecgCodeGenerator.java @@ -0,0 +1,46 @@ +package org.jeecg; + +import org.jeecgframework.codegenerate.generate.impl.CodeGenerateOne; +import org.jeecgframework.codegenerate.generate.pojo.TableVo; + +/** + * jeecg-boot代码生成器 + * 功能说明: 一键生成增删改查所有代码(包括:controller、service、dao、mapper、entity、vue) + * 自定义模板: 模板位置在/src/main/resources/jeecg/code-template + * @author scott + * + */ +public class JeecgCodeGenerator { + + /** + * 代码生成器使用说明(单表模型) + * + * [1]、全局配置文件 + * src/main/resources/jeecg/jeecg_config.properties : 代码生成器基础配置文件(项目路径、根业务包路径) + * src/main/resources/jeecg/jeecg_database.properties :代码生成器数据库配置文件(独立的数据源配置) + * + * [3]、页面使用说明: + * 1. 页面生成路径: src/main/java/{业务包根路径}/{子业务包}/vue/ + * 2. 使用方法,手工复制到webstorm项目下面 + * 3. 配置访问菜单 + */ + public static void main(String[] args) { + System.out.println("----jeecg--------- Code------------- Generation -----[单表模型]------- 生成中。。。"); + + /**[2]、表配置参数 */ + TableVo table = new TableVo(); + //表名 + table.setTableName("jeecg_order_main"); + //表主键策略(目前只支持UUID) + table.setPrimaryKeyPolicy("uuid"); + //子业务包名 + table.setEntityPackage("test2"); + //实体类名 + table.setEntityName("JeecgOrderMain"); + //功能描述 + table.setFtlDescription("订单"); + new CodeGenerateOne(table).generateCodeFile(); + System.out.println("----jeecg--------- Code------------- Generation -----[单表模型]------- 生成完成。。。"); + } + +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/common/api/vo/Result.java b/jeecg-boot/src/main/java/org/jeecg/common/api/vo/Result.java new file mode 100644 index 0000000..13cc4d6 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/api/vo/Result.java @@ -0,0 +1,84 @@ +package org.jeecg.common.api.vo; + +import java.io.Serializable; + +import org.jeecg.common.constant.CommonConstant; + +import lombok.Data; + +/** + * 接口返回数据格式 + * @author scott + * @email jeecgos@163.com + * @date 2019年1月19日 + */ +@Data +public class Result<T> implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 成功标志 + */ + private boolean success; + + /** + * 返回处理消息 + */ + private String message; + + /** + * 返回代码 + */ + private Integer code; + + /** + * 返回数据对象 data + */ + private T result; + + /** + * 时间戳 + */ + private long timestamp = System.currentTimeMillis(); + + public void error500(String message) { + this.message = message; + this.code = CommonConstant.SC_INTERNAL_SERVER_ERROR_500; + this.success = false; + } + + public void success(String message) { + this.message = message; + this.code = CommonConstant.SC_OK_200; + this.success = true; + } + + public static Result<Object> error(String msg) { + return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg); + } + + public static Result<Object> error(int code, String msg) { + Result<Object> r = new Result<Object>(); + r.setCode(code); + r.setMessage(msg); + r.setSuccess(false); + return r; + } + + public static Result<Object> ok(String msg) { + Result<Object> r = new Result<Object>(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setMessage(msg); + return r; + } + + public static Result<Object> ok(Object obj) { + Result<Object> r = new Result<Object>(); + r.setSuccess(true); + r.setCode(CommonConstant.SC_OK_200); + r.setResult(obj); + return r; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java b/jeecg-boot/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java new file mode 100644 index 0000000..06a1c61 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java @@ -0,0 +1,99 @@ +package org.jeecg.common.aspect; + +import org.apache.shiro.SecurityUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.util.IPUtils; +import org.jeecg.common.util.SpringContextUtils; +import org.jeecg.modules.system.entity.SysLog; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.service.ISysLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson.JSONObject; +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Date; + + +/** + * 系统日志,切面处理类 + * + * @author scott + * @email jeecgos@163.com + * @date 2018年1月14日 + */ +@Aspect +@Component +public class AutoLogAspect { + @Autowired + private ISysLogService sysLogService; + + @Pointcut("@annotation(org.jeecg.common.aspect.annotation.AutoLog)") + public void logPointCut() { + + } + + @Around("logPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable { + long beginTime = System.currentTimeMillis(); + //执行方法 + Object result = point.proceed(); + //执行时长(毫秒) + long time = System.currentTimeMillis() - beginTime; + + //保存日志 + saveSysLog(point, time); + + return result; + } + + private void saveSysLog(ProceedingJoinPoint joinPoint, long time) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + + SysLog sysLog = new SysLog(); + AutoLog syslog = method.getAnnotation(AutoLog.class); + if(syslog != null){ + //注解上的描述,操作日志内容 + sysLog.setLogContent(syslog.value()); + sysLog.setLogType(syslog.logType()); + } + + //请求的方法名 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = signature.getName(); + sysLog.setMethod(className + "." + methodName + "()"); + + //请求的参数 + Object[] args = joinPoint.getArgs(); + try{ + String params = JSONObject.toJSONString(args); + sysLog.setRequestParam(params); + }catch (Exception e){ + + } + + //获取request + HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); + //设置IP地址 + sysLog.setIp(IPUtils.getIpAddr(request)); + + //获取登录用户信息 + SysUser sysUser = (SysUser)SecurityUtils.getSubject().getPrincipal(); + if(sysUser!=null){ + sysLog.setUserid(sysUser.getUsername()); + sysLog.setUsername(sysUser.getRealname()); + + } + //耗时 + sysLog.setCostTime(time); + sysLog.setCreateTime(new Date()); + //保存系统日志 + sysLogService.save(sysLog); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/AutoLog.java b/jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/AutoLog.java new file mode 100644 index 0000000..50aa2c9 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/AutoLog.java @@ -0,0 +1,36 @@ +package org.jeecg.common.aspect.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.jeecg.common.constant.CommonConstant; + +/** + * 系统日志注解 + * + * @author scott + * @email jeecgos@163.com + * @date 2019年1月14日 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface AutoLog { + + /** + * 日志内容 + * + * @return + */ + String value() default ""; + + /** + * 日志类型 + * + * @return 0:操作日志;1:登录日志;2:定时任务; + */ + int logType() default CommonConstant.LOG_TYPE_2; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/constant/CommonConstant.java b/jeecg-boot/src/main/java/org/jeecg/common/constant/CommonConstant.java new file mode 100644 index 0000000..b2df937 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/constant/CommonConstant.java @@ -0,0 +1,60 @@ +package org.jeecg.common.constant; + +public interface CommonConstant { + + /** + * 正常状态 + */ + Integer STATUS_NORMAL = 0; + + /** + * 禁用状态 + */ + Integer STATUS_DISABLE = -1; + + /** + * 删除标志 + */ + Integer DEL_FLAG_1 = 1; + + /** + * 未删除 + */ + Integer DEL_FLAG_0 = 0; + + /** + * 系统日志类型: 登录 + */ + int LOG_TYPE_1 = 1; + + /** + * 系统日志类型: 操作 + */ + int LOG_TYPE_2 = 2; + + + /** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */ + public static final Integer SC_INTERNAL_SERVER_ERROR_500 = 500; + /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */ + public static final Integer SC_OK_200 = 200; + + + public static String PREFIX_USER_ROLE = "PREFIX_USER_ROLE"; + public static String PREFIX_USER_PERMISSION = "PREFIX_USER_PERMISSION "; + public static int TOKEN_EXPIRE_TIME = 3600; + + public static String PREFIX_USER_TOKEN = "PREFIX_USER_TOKEN "; + + /** + * 0:一级菜单 + */ + public static Integer MENU_TYPE_0 = 0; + /** + * 1:子菜单 + */ + public static Integer MENU_TYPE_1 = 1; + /** + * 2:按钮权限 + */ + public static Integer MENU_TYPE_2 = 2; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/constant/CommonSendStatus.java b/jeecg-boot/src/main/java/org/jeecg/common/constant/CommonSendStatus.java new file mode 100644 index 0000000..88e43db --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/constant/CommonSendStatus.java @@ -0,0 +1,15 @@ +package org.jeecg.common.constant; + +/** + * 系统通告 - 发布状态 + * @author LeeShaoQing + * + */ +public interface CommonSendStatus { + + String UNPUBLISHED_STATUS_0 = "0"; //未发布 + + String PUBLISHED_STATUS_1 = "1"; //已发布 + + String REVOKE_STATUS_2 = "2"; //撤销 +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/exception/JeecgBootException.java b/jeecg-boot/src/main/java/org/jeecg/common/exception/JeecgBootException.java new file mode 100644 index 0000000..703b7e7 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/exception/JeecgBootException.java @@ -0,0 +1,19 @@ +package org.jeecg.common.exception; + +public class JeecgBootException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public JeecgBootException(String message){ + super(message); + } + + public JeecgBootException(Throwable cause) + { + super(cause); + } + + public JeecgBootException(String message,Throwable cause) + { + super(message,cause); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java b/jeecg-boot/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java new file mode 100644 index 0000000..62a1051 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java @@ -0,0 +1,55 @@ +package org.jeecg.common.exception; + +import org.apache.shiro.authz.AuthorizationException; +import org.jeecg.common.api.vo.Result; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.NoHandlerFoundException; + +import lombok.extern.slf4j.Slf4j; + +/** + * 异常处理器 + * + * @author chenshun + * @email sunlightcs@gmail.com + * @date 2016年10月27日 下午10:16:19 + */ +@RestControllerAdvice +@Slf4j +public class JeecgBootExceptionHandler { + + /** + * 处理自定义异常 + */ + @ExceptionHandler(JeecgBootException.class) + public Result<?> handleRRException(JeecgBootException e){ + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + + @ExceptionHandler(NoHandlerFoundException.class) + public Result<?> handlerNoFoundException(Exception e) { + log.error(e.getMessage(), e); + return Result.error(404, "路径不存在,请检查路径是否正确"); + } + + @ExceptionHandler(DuplicateKeyException.class) + public Result<?> handleDuplicateKeyException(DuplicateKeyException e){ + log.error(e.getMessage(), e); + return Result.error("数据库中已存在该记录"); + } + + @ExceptionHandler(AuthorizationException.class) + public Result<?> handleAuthorizationException(AuthorizationException e){ + log.error(e.getMessage(), e); + return Result.error("没有权限,请联系管理员授权"); + } + + @ExceptionHandler(Exception.class) + public Result<?> handleException(Exception e){ + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-boot/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java new file mode 100644 index 0000000..ed31de1 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -0,0 +1,12 @@ +package org.jeecg.common.system.api; + +public interface ISysBaseAPI { + + /** + * 日志添加 + * @param LogContent 内容 + * @param logType 日志类型(0:操作日志;1:登录日志;2:定时任务) + * @param operatetype 操作类型(1:添加;2:修改;3:删除;) + */ + void addLog(String LogContent, Integer logType, Integer operatetype); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/system/controller/CommonController.java b/jeecg-boot/src/main/java/org/jeecg/common/system/controller/CommonController.java new file mode 100644 index 0000000..e93d9ac --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/system/controller/CommonController.java @@ -0,0 +1,143 @@ +package org.jeecg.common.system.controller; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.system.entity.SysUser; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.HandlerMapping; + +import lombok.extern.slf4j.Slf4j; + +/** + * <p> + * 用户表 前端控制器 + * </p> + * + * @author scott + * @since 2018-12-20 + */ +@Slf4j +@RestController +@RequestMapping("/sys/common") +public class CommonController { + + @Value(value = "${uploadpath}") + private String uploadpath; + + @PostMapping(value = "/upload") + public Result<SysUser> upload(HttpServletRequest request, HttpServletResponse response) { + Result<SysUser> result = new Result<>(); + try { + String ctxPath = uploadpath; + String fileName = null; + String bizPath = "user"; + String nowday = new SimpleDateFormat("yyyyMMdd").format(new Date()); + File file = new File(ctxPath + File.separator + bizPath + File.separator + nowday); + if (!file.exists()) { + file.mkdirs();// 创建文件根目录 + } + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + MultipartFile mf = multipartRequest.getFile("file");// 获取上传文件对象 + String orgName = mf.getOriginalFilename();// 获取文件名 + fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf(".")); + String savePath = file.getPath() + File.separator + fileName; + File savefile = new File(savePath); + FileCopyUtils.copy(mf.getBytes(), savefile); + String dbpath = bizPath + File.separator + nowday + File.separator + fileName; + if (dbpath.contains("\\")) { + dbpath = dbpath.replace("\\", "/"); + } + result.setMessage(dbpath); + result.setSuccess(true); + } catch (IOException e) { + result.setSuccess(false); + result.setMessage(e.getMessage()); + e.printStackTrace(); + } + return result; + } + + /** + * 预览图片 + * 请求地址:http://localhost:8080/common/view/{user/20190119/e1fe9925bc315c60addea1b98eb1cb1349547719_1547866868179.jpg} + * + * @param request + * @param response + */ + @GetMapping(value = "/view/**") + public void view(HttpServletRequest request, HttpServletResponse response) { + // ISO-8859-1 ==> UTF-8 进行编码转换 + String imgPath = extractPathFromPattern(request); + // 其余处理略 + InputStream inputStream = null; + OutputStream outputStream = null; + try { + imgPath = imgPath.replace("..", ""); + if (imgPath.endsWith(",")) { + imgPath = imgPath.substring(0, imgPath.length() - 1); + } + response.setContentType("image/jpeg;charset=utf-8"); + String localPath = uploadpath; + String imgurl = localPath + File.separator + imgPath; + inputStream = new BufferedInputStream(new FileInputStream(imgurl)); + outputStream = response.getOutputStream(); + byte[] buf = new byte[1024]; + int len; + while ((len = inputStream.read(buf)) > 0) { + outputStream.write(buf, 0, len); + } + response.flushBuffer(); + } catch (IOException e) { + log.info("预览图片失败" + e.getMessage()); + // e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + /** + * 把指定URL后的字符串全部截断当成参数 + * 这么做是为了防止URL中包含中文或者特殊字符(/等)时,匹配不了的问题 + * @param request + * @return + */ + private static String extractPathFromPattern(final HttpServletRequest request) { + String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); + String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); + return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/DateUtils.java b/jeecg-boot/src/main/java/org/jeecg/common/util/DateUtils.java new file mode 100644 index 0000000..2186b39 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/DateUtils.java @@ -0,0 +1,620 @@ +package org.jeecg.common.util; + +import java.beans.PropertyEditorSupport; +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.springframework.util.StringUtils; + +/** + * + * 类描述:时间操作定义类 + * + * @author: 张代浩 @date: 日期:2012-12-8 时间:下午12:15:03 + * @version 1.0 + */ +public class DateUtils extends PropertyEditorSupport { + // 各种时间格式 + public static final SimpleDateFormat date_sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 各种时间格式 + public static final SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd"); + // 各种时间格式 + public static final SimpleDateFormat date_sdf_wz = new SimpleDateFormat("yyyy年MM月dd日"); + public static final SimpleDateFormat time_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + public static final SimpleDateFormat yyyymmddhhmmss = new SimpleDateFormat("yyyyMMddHHmmss"); + public static final SimpleDateFormat short_time_sdf = new SimpleDateFormat("HH:mm"); + public static final SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 以毫秒表示的时间 + private static final long DAY_IN_MILLIS = 24 * 3600 * 1000; + private static final long HOUR_IN_MILLIS = 3600 * 1000; + private static final long MINUTE_IN_MILLIS = 60 * 1000; + private static final long SECOND_IN_MILLIS = 1000; + + // 指定模式的时间格式 + private static SimpleDateFormat getSDFormat(String pattern) { + return new SimpleDateFormat(pattern); + } + + /** + * 当前日历,这里用中国时间表示 + * + * @return 以当地时区表示的系统当前日历 + */ + public static Calendar getCalendar() { + return Calendar.getInstance(); + } + + /** + * 指定毫秒数表示的日历 + * + * @param millis 毫秒数 + * @return 指定毫秒数表示的日历 + */ + public static Calendar getCalendar(long millis) { + Calendar cal = Calendar.getInstance(); + // --------------------cal.setTimeInMillis(millis); + cal.setTime(new Date(millis)); + return cal; + } + + // //////////////////////////////////////////////////////////////////////////// + // getDate + // 各种方式获取的Date + // //////////////////////////////////////////////////////////////////////////// + + /** + * 当前日期 + * + * @return 系统当前时间 + */ + public static Date getDate() { + return new Date(); + } + + /** + * 指定毫秒数表示的日期 + * + * @param millis 毫秒数 + * @return 指定毫秒数表示的日期 + */ + public static Date getDate(long millis) { + return new Date(millis); + } + + /** + * 时间戳转换为字符串 + * + * @param time + * @return + */ + public static String timestamptoStr(Timestamp time) { + Date date = null; + if (null != time) { + date = new Date(time.getTime()); + } + return date2Str(date_sdf); + } + + /** + * 字符串转换时间戳 + * + * @param str + * @return + */ + public static Timestamp str2Timestamp(String str) { + Date date = str2Date(str, date_sdf); + return new Timestamp(date.getTime()); + } + + /** + * 字符串转换成日期 + * + * @param str + * @param sdf + * @return + */ + public static Date str2Date(String str, SimpleDateFormat sdf) { + if (null == str || "".equals(str)) { + return null; + } + Date date = null; + try { + date = sdf.parse(str); + return date; + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 日期转换为字符串 + * + * @param date 日期 + * @param format 日期格式 + * @return 字符串 + */ + public static String date2Str(SimpleDateFormat date_sdf) { + Date date = getDate(); + if (null == date) { + return null; + } + return date_sdf.format(date); + } + + /** + * 格式化时间 + * + * @param date + * @param format + * @return + */ + public static String dateformat(String date, String format) { + SimpleDateFormat sformat = new SimpleDateFormat(format); + Date _date = null; + try { + _date = sformat.parse(date); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return sformat.format(_date); + } + + /** + * 日期转换为字符串 + * + * @param date 日期 + * @param format 日期格式 + * @return 字符串 + */ + public static String date2Str(Date date, SimpleDateFormat date_sdf) { + if (null == date) { + return null; + } + return date_sdf.format(date); + } + + /** + * 日期转换为字符串 + * + * @param date 日期 + * @param format 日期格式 + * @return 字符串 + */ + public static String getDate(String format) { + Date date = new Date(); + if (null == date) { + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat(format); + return sdf.format(date); + } + + /** + * 指定毫秒数的时间戳 + * + * @param millis 毫秒数 + * @return 指定毫秒数的时间戳 + */ + public static Timestamp getTimestamp(long millis) { + return new Timestamp(millis); + } + + /** + * 以字符形式表示的时间戳 + * + * @param time 毫秒数 + * @return 以字符形式表示的时间戳 + */ + public static Timestamp getTimestamp(String time) { + return new Timestamp(Long.parseLong(time)); + } + + /** + * 系统当前的时间戳 + * + * @return 系统当前的时间戳 + */ + public static Timestamp getTimestamp() { + return new Timestamp(new Date().getTime()); + } + + /** + * 当前时间,格式 yyyy-MM-dd HH:mm:ss + * + * @return 当前时间的标准形式字符串 + */ + public static String now() { + return datetimeFormat.format(getCalendar().getTime()); + } + + /** + * 指定日期的时间戳 + * + * @param date 指定日期 + * @return 指定日期的时间戳 + */ + public static Timestamp getTimestamp(Date date) { + return new Timestamp(date.getTime()); + } + + /** + * 指定日历的时间戳 + * + * @param cal 指定日历 + * @return 指定日历的时间戳 + */ + public static Timestamp getCalendarTimestamp(Calendar cal) { + // ---------------------return new Timestamp(cal.getTimeInMillis()); + return new Timestamp(cal.getTime().getTime()); + } + + public static Timestamp gettimestamp() { + Date dt = new Date(); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String nowTime = df.format(dt); + java.sql.Timestamp buydate = java.sql.Timestamp.valueOf(nowTime); + return buydate; + } + + // //////////////////////////////////////////////////////////////////////////// + // getMillis + // 各种方式获取的Millis + // //////////////////////////////////////////////////////////////////////////// + + /** + * 系统时间的毫秒数 + * + * @return 系统时间的毫秒数 + */ + public static long getMillis() { + return new Date().getTime(); + } + + /** + * 指定日历的毫秒数 + * + * @param cal 指定日历 + * @return 指定日历的毫秒数 + */ + public static long getMillis(Calendar cal) { + // --------------------return cal.getTimeInMillis(); + return cal.getTime().getTime(); + } + + /** + * 指定日期的毫秒数 + * + * @param date 指定日期 + * @return 指定日期的毫秒数 + */ + public static long getMillis(Date date) { + return date.getTime(); + } + + /** + * 指定时间戳的毫秒数 + * + * @param ts 指定时间戳 + * @return 指定时间戳的毫秒数 + */ + public static long getMillis(Timestamp ts) { + return ts.getTime(); + } + + // //////////////////////////////////////////////////////////////////////////// + // formatDate + // 将日期按照一定的格式转化为字符串 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 默认方式表示的系统当前日期,具体格式:年-月-日 + * + * @return 默认日期按“年-月-日“格式显示 + */ + public static String formatDate() { + return date_sdf.format(getCalendar().getTime()); + } + + /** + * 默认方式表示的系统当前日期,具体格式:yyyy-MM-dd HH:mm:ss + * + * @return 默认日期按“yyyy-MM-dd HH:mm:ss“格式显示 + */ + public static String formatDateTime() { + return datetimeFormat.format(getCalendar().getTime()); + } + + /** + * 获取时间字符串 + */ + public static String getDataString(SimpleDateFormat formatstr) { + return formatstr.format(getCalendar().getTime()); + } + + /** + * 指定日期的默认显示,具体格式:年-月-日 + * + * @param cal 指定的日期 + * @return 指定日期按“年-月-日“格式显示 + */ + public static String formatDate(Calendar cal) { + return date_sdf.format(cal.getTime()); + } + + /** + * 指定日期的默认显示,具体格式:年-月-日 + * + * @param date 指定的日期 + * @return 指定日期按“年-月-日“格式显示 + */ + public static String formatDate(Date date) { + return date_sdf.format(date); + } + + /** + * 指定毫秒数表示日期的默认显示,具体格式:年-月-日 + * + * @param millis 指定的毫秒数 + * @return 指定毫秒数表示日期按“年-月-日“格式显示 + */ + public static String formatDate(long millis) { + return date_sdf.format(new Date(millis)); + } + + /** + * 默认日期按指定格式显示 + * + * @param pattern 指定的格式 + * @return 默认日期按指定格式显示 + */ + public static String formatDate(String pattern) { + return getSDFormat(pattern).format(getCalendar().getTime()); + } + + /** + * 指定日期按指定格式显示 + * + * @param cal 指定的日期 + * @param pattern 指定的格式 + * @return 指定日期按指定格式显示 + */ + public static String formatDate(Calendar cal, String pattern) { + return getSDFormat(pattern).format(cal.getTime()); + } + + /** + * 指定日期按指定格式显示 + * + * @param date 指定的日期 + * @param pattern 指定的格式 + * @return 指定日期按指定格式显示 + */ + public static String formatDate(Date date, String pattern) { + return getSDFormat(pattern).format(date); + } + + // //////////////////////////////////////////////////////////////////////////// + // formatTime + // 将日期按照一定的格式转化为字符串 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 默认方式表示的系统当前日期,具体格式:年-月-日 时:分 + * + * @return 默认日期按“年-月-日 时:分“格式显示 + */ + public static String formatTime() { + return time_sdf.format(getCalendar().getTime()); + } + + /** + * 指定毫秒数表示日期的默认显示,具体格式:年-月-日 时:分 + * + * @param millis 指定的毫秒数 + * @return 指定毫秒数表示日期按“年-月-日 时:分“格式显示 + */ + public static String formatTime(long millis) { + return time_sdf.format(new Date(millis)); + } + + /** + * 指定日期的默认显示,具体格式:年-月-日 时:分 + * + * @param cal 指定的日期 + * @return 指定日期按“年-月-日 时:分“格式显示 + */ + public static String formatTime(Calendar cal) { + return time_sdf.format(cal.getTime()); + } + + /** + * 指定日期的默认显示,具体格式:年-月-日 时:分 + * + * @param date 指定的日期 + * @return 指定日期按“年-月-日 时:分“格式显示 + */ + public static String formatTime(Date date) { + return time_sdf.format(date); + } + + // //////////////////////////////////////////////////////////////////////////// + // formatShortTime + // 将日期按照一定的格式转化为字符串 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 默认方式表示的系统当前日期,具体格式:时:分 + * + * @return 默认日期按“时:分“格式显示 + */ + public static String formatShortTime() { + return short_time_sdf.format(getCalendar().getTime()); + } + + /** + * 指定毫秒数表示日期的默认显示,具体格式:时:分 + * + * @param millis 指定的毫秒数 + * @return 指定毫秒数表示日期按“时:分“格式显示 + */ + public static String formatShortTime(long millis) { + return short_time_sdf.format(new Date(millis)); + } + + /** + * 指定日期的默认显示,具体格式:时:分 + * + * @param cal 指定的日期 + * @return 指定日期按“时:分“格式显示 + */ + public static String formatShortTime(Calendar cal) { + return short_time_sdf.format(cal.getTime()); + } + + /** + * 指定日期的默认显示,具体格式:时:分 + * + * @param date 指定的日期 + * @return 指定日期按“时:分“格式显示 + */ + public static String formatShortTime(Date date) { + return short_time_sdf.format(date); + } + + // //////////////////////////////////////////////////////////////////////////// + // parseDate + // parseCalendar + // parseTimestamp + // 将字符串按照一定的格式转化为日期或时间 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间 + * + * @param src 将要转换的原始字符窜 + * @param pattern 转换的匹配格式 + * @return 如果转换成功则返回转换后的日期 + * @throws ParseException + * @throws AIDateFormatException + */ + public static Date parseDate(String src, String pattern) throws ParseException { + return getSDFormat(pattern).parse(src); + + } + + /** + * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间 + * + * @param src 将要转换的原始字符窜 + * @param pattern 转换的匹配格式 + * @return 如果转换成功则返回转换后的日期 + * @throws ParseException + * @throws AIDateFormatException + */ + public static Calendar parseCalendar(String src, String pattern) throws ParseException { + + Date date = parseDate(src, pattern); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal; + } + + public static String formatAddDate(String src, String pattern, int amount) throws ParseException { + Calendar cal; + cal = parseCalendar(src, pattern); + cal.add(Calendar.DATE, amount); + return formatDate(cal); + } + + /** + * 根据指定的格式将字符串转换成Date 如输入:2003-11-19 11:20:20将按照这个转成时间 + * + * @param src 将要转换的原始字符窜 + * @param pattern 转换的匹配格式 + * @return 如果转换成功则返回转换后的时间戳 + * @throws ParseException + * @throws AIDateFormatException + */ + public static Timestamp parseTimestamp(String src, String pattern) throws ParseException { + Date date = parseDate(src, pattern); + return new Timestamp(date.getTime()); + } + + // //////////////////////////////////////////////////////////////////////////// + // dateDiff + // 计算两个日期之间的差值 + // //////////////////////////////////////////////////////////////////////////// + + /** + * 计算两个时间之间的差值,根据标志的不同而不同 + * + * @param flag 计算标志,表示按照年/月/日/时/分/秒等计算 + * @param calSrc 减数 + * @param calDes 被减数 + * @return 两个日期之间的差值 + */ + public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) { + + long millisDiff = getMillis(calSrc) - getMillis(calDes); + + if (flag == 'y') { + return (calSrc.get(calSrc.YEAR) - calDes.get(calDes.YEAR)); + } + + if (flag == 'd') { + return (int) (millisDiff / DAY_IN_MILLIS); + } + + if (flag == 'h') { + return (int) (millisDiff / HOUR_IN_MILLIS); + } + + if (flag == 'm') { + return (int) (millisDiff / MINUTE_IN_MILLIS); + } + + if (flag == 's') { + return (int) (millisDiff / SECOND_IN_MILLIS); + } + + return 0; + } + + /** + * String类型 转换为Date, 如果参数长度为10 转换格式”yyyy-MM-dd“ 如果参数长度为19 转换格式”yyyy-MM-dd + * HH:mm:ss“ * @param text String类型的时间值 + */ + public void setAsText(String text) throws IllegalArgumentException { + if (StringUtils.hasText(text)) { + try { + if (text.indexOf(":") == -1 && text.length() == 10) { + setValue(this.date_sdf.parse(text)); + } else if (text.indexOf(":") > 0 && text.length() == 19) { + setValue(this.datetimeFormat.parse(text)); + } else { + throw new IllegalArgumentException("Could not parse date, date format is error "); + } + } catch (ParseException ex) { + IllegalArgumentException iae = new IllegalArgumentException("Could not parse date: " + ex.getMessage()); + iae.initCause(ex); + throw iae; + } + } else { + setValue(null); + } + } + + public static int getYear() { + GregorianCalendar calendar = new GregorianCalendar(); + calendar.setTime(getDate()); + return calendar.get(Calendar.YEAR); + } + +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/IPUtils.java b/jeecg-boot/src/main/java/org/jeecg/common/util/IPUtils.java new file mode 100644 index 0000000..492b859 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/IPUtils.java @@ -0,0 +1,58 @@ +package org.jeecg.common.util; + +import com.alibaba.druid.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletRequest; + +/** + * IP地址 + * + * @author scott + * @email jeecgos@163.com + * @date 2019年01月14日 + */ +public class IPUtils { + private static Logger logger = LoggerFactory.getLogger(IPUtils.class); + + /** + * 获取IP地址 + * + * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 + * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 + */ + public static String getIpAddr(HttpServletRequest request) { + String ip = null; + try { + ip = request.getHeader("x-forwarded-for"); + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + } catch (Exception e) { + logger.error("IPUtils ERROR ", e); + } + +// //使用代理,则获取第一个IP地址 +// if(StringUtils.isEmpty(ip) && ip.length() > 15) { +// if(ip.indexOf(",") > 0) { +// ip = ip.substring(0, ip.indexOf(",")); +// } +// } + + return ip; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/MD5Util.java b/jeecg-boot/src/main/java/org/jeecg/common/util/MD5Util.java new file mode 100644 index 0000000..0bba84b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/MD5Util.java @@ -0,0 +1,41 @@ +package org.jeecg.common.util; + +import java.security.MessageDigest; + +public class MD5Util { + + public static String byteArrayToHexString(byte b[]) { + StringBuffer resultSb = new StringBuffer(); + for (int i = 0; i < b.length; i++) + resultSb.append(byteToHexString(b[i])); + + return resultSb.toString(); + } + + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) + n += 256; + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } + + public static String MD5Encode(String origin, String charsetname) { + String resultString = null; + try { + resultString = new String(origin); + MessageDigest md = MessageDigest.getInstance("MD5"); + if (charsetname == null || "".equals(charsetname)) + resultString = byteArrayToHexString(md.digest(resultString.getBytes())); + else + resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname))); + } catch (Exception exception) { + } + return resultString; + } + + private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/MyClassLoader.java b/jeecg-boot/src/main/java/org/jeecg/common/util/MyClassLoader.java new file mode 100644 index 0000000..5f84e78 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/MyClassLoader.java @@ -0,0 +1,87 @@ +package org.jeecg.common.util; + +/** + * @author 张代浩 + */ +public class MyClassLoader extends ClassLoader { + public static Class getClassByScn(String className) { + Class myclass = null; + try { + myclass = Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + throw new RuntimeException(className+" not found!"); + } + return myclass; + } + + // 获得类的全名,包括包名 + public static String getPackPath(Object object) { + // 检查用户传入的参数是否为空 + if (object == null) + throw new java.lang.IllegalArgumentException("参数不能为空!"); + // 获得类的全名,包括包名 + String clsName = object.getClass().getName(); + return clsName; + } + + public static String getAppPath(Class cls) { + // 检查用户传入的参数是否为空 + if (cls == null) + throw new java.lang.IllegalArgumentException("参数不能为空!"); + ClassLoader loader = cls.getClassLoader(); + // 获得类的全名,包括包名 + String clsName = cls.getName() + ".class"; + // 获得传入参数所在的包 + Package pack = cls.getPackage(); + String path = ""; + // 如果不是匿名包,将包名转化为路径 + if (pack != null) { + String packName = pack.getName(); + // 此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库 + if (packName.startsWith("java.") || packName.startsWith("javax.")) + throw new java.lang.IllegalArgumentException("不要传送系统类!"); + // 在类的名称中,去掉包名的部分,获得类的文件名 + clsName = clsName.substring(packName.length() + 1); + // 判定包名是否是简单包名,如果是,则直接将包名转换为路径, + if (packName.indexOf(".") < 0) + path = packName + "/"; + else {// 否则按照包名的组成部分,将包名转换为路径 + int start = 0, end = 0; + end = packName.indexOf("."); + while (end != -1) { + path = path + packName.substring(start, end) + "/"; + start = end + 1; + end = packName.indexOf(".", start); + } + path = path + packName.substring(start) + "/"; + } + } + // 调用ClassLoader的getResource方法,传入包含路径信息的类文件名 + java.net.URL url = loader.getResource(path + clsName); + // 从URL对象中获取路径信息 + String realPath = url.getPath(); + // 去掉路径信息中的协议名"file:" + int pos = realPath.indexOf("file:"); + if (pos > -1) + realPath = realPath.substring(pos + 5); + // 去掉路径信息最后包含类文件信息的部分,得到类所在的路径 + pos = realPath.indexOf(path + clsName); + realPath = realPath.substring(0, pos - 1); + // 如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名 + if (realPath.endsWith("!")) + realPath = realPath.substring(0, realPath.lastIndexOf("/")); + /*------------------------------------------------------------ + ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径 + 中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要 + 的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的 + 中文及空格路径 + -------------------------------------------------------------*/ + try { + realPath = java.net.URLDecoder.decode(realPath, "utf-8"); + } catch (Exception e) { + throw new RuntimeException(e); + } + return realPath; + }// getAppPath定义结束 +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/PasswordUtil.java b/jeecg-boot/src/main/java/org/jeecg/common/util/PasswordUtil.java new file mode 100644 index 0000000..382f94a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/PasswordUtil.java @@ -0,0 +1,179 @@ +package org.jeecg.common.util; + +import java.security.Key; +import java.security.SecureRandom; +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.PBEParameterSpec; +public class PasswordUtil { + + /** + * JAVA6支持以下任意一种算法 PBEWITHMD5ANDDES PBEWITHMD5ANDTRIPLEDES + * PBEWITHSHAANDDESEDE PBEWITHSHA1ANDRC2_40 PBKDF2WITHHMACSHA1 + * */ + + /** + * 定义使用的算法为:PBEWITHMD5andDES算法 + */ + public static final String ALGORITHM = "PBEWithMD5AndDES";//加密算法 + public static final String Salt = "63293188";//密钥 + + /** + * 定义迭代次数为1000次 + */ + private static final int ITERATIONCOUNT = 1000; + + /** + * 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. 盐长度必须为8字节 + * + * @return byte[] 盐值 + * */ + public static byte[] getSalt() throws Exception { + // 实例化安全随机数 + SecureRandom random = new SecureRandom(); + // 产出盐 + return random.generateSeed(8); + } + + public static byte[] getStaticSalt() { + // 产出盐 + return Salt.getBytes(); + } + + /** + * 根据PBE密码生成一把密钥 + * + * @param password + * 生成密钥时所使用的密码 + * @return Key PBE算法密钥 + * */ + private static Key getPBEKey(String password) { + // 实例化使用的算法 + SecretKeyFactory keyFactory; + SecretKey secretKey = null; + try { + keyFactory = SecretKeyFactory.getInstance(ALGORITHM); + // 设置PBE密钥参数 + PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); + // 生成密钥 + secretKey = keyFactory.generateSecret(keySpec); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return secretKey; + } + + /** + * 加密明文字符串 + * + * @param plaintext + * 待加密的明文字符串 + * @param password + * 生成密钥时所使用的密码 + * @param salt + * 盐值 + * @return 加密后的密文字符串 + * @throws Exception + */ + public static String encrypt(String plaintext, String password, String salt) { + + Key key = getPBEKey(password); + byte[] encipheredData = null; + PBEParameterSpec parameterSpec = new PBEParameterSpec(salt.getBytes(), ITERATIONCOUNT); + try { + Cipher cipher = Cipher.getInstance(ALGORITHM); + + cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec); + + encipheredData = cipher.doFinal(plaintext.getBytes()); + } catch (Exception e) { + } + return bytesToHexString(encipheredData); + } + + /** + * 解密密文字符串 + * + * @param ciphertext + * 待解密的密文字符串 + * @param password + * 生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致) + * @param salt + * 盐值(如需解密,该参数需要与加密时使用的一致) + * @return 解密后的明文字符串 + * @throws Exception + */ + public static String decrypt(String ciphertext, String password, String salt) { + + Key key = getPBEKey(password); + byte[] passDec = null; + PBEParameterSpec parameterSpec = new PBEParameterSpec(salt.getBytes(), ITERATIONCOUNT); + try { + Cipher cipher = Cipher.getInstance(ALGORITHM); + + cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec); + + passDec = cipher.doFinal(hexStringToBytes(ciphertext)); + } + + catch (Exception e) { + // TODO: handle exception + } + return new String(passDec); + } + + /** + * 将字节数组转换为十六进制字符串 + * + * @param src + * 字节数组 + * @return + */ + public static String bytesToHexString(byte[] src) { + StringBuilder stringBuilder = new StringBuilder(""); + if (src == null || src.length <= 0) { + return null; + } + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + + /** + * 将十六进制字符串转换为字节数组 + * + * @param hexString + * 十六进制字符串 + * @return + */ + public static byte[] hexStringToBytes(String hexString) { + if (hexString == null || hexString.equals("")) { + return null; + } + hexString = hexString.toUpperCase(); + int length = hexString.length() / 2; + char[] hexChars = hexString.toCharArray(); + byte[] d = new byte[length]; + for (int i = 0; i < length; i++) { + int pos = i * 2; + d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); + } + return d; + } + + private static byte charToByte(char c) { + return (byte) "0123456789ABCDEF".indexOf(c); + } + + +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/RedisUtil.java b/jeecg-boot/src/main/java/org/jeecg/common/util/RedisUtil.java new file mode 100644 index 0000000..7e185aa --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/RedisUtil.java @@ -0,0 +1,571 @@ +package org.jeecg.common.util; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +/** + * redis 工具类 + * @author Scott + * + */ +@Component +public class RedisUtil { + + @Autowired + private RedisTemplate<String, Object> redisTemplate; + @Autowired + private StringRedisTemplate stringRedisTemplate; + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return + */ + public boolean expire(String key, long time) { + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete(CollectionUtils.arrayToList(key)); + } + } + } + + // ============================String============================= + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 递增 + * + * @param key 键 + * @param by 要增加几(大于0) + * @return + */ + public long incr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, delta); + } + + /** + * 递减 + * + * @param key 键 + * @param by 要减少几(小于0) + * @return + */ + public long decr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递减因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, -delta); + } + + // ================================Map================================= + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map<Object, Object> hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map<String, Object> map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map<String, Object> map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public double hincr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public double hdecr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================set============================= + /** + * 根据key获取Set中的所有值 + * + * @param key 键 + * @return + */ + public Set<Object> sGet(String key) { + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 根据value从一个set中查询,是否存在 + * + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + try { + return redisTemplate.opsForSet().isMember(key, value); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) + expire(key, time); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获取set缓存的长度 + * + * @param key 键 + * @return + */ + public long sGetSetSize(String key) { + try { + return redisTemplate.opsForSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 移除值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + // ===============================list================================= + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List<Object> lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return + */ + public Object lGetIndex(String key, long index) { + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value) { + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value, long time) { + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List<Object> value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List<Object> value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + * @return + */ + public boolean lUpdateIndex(String key, long index, Object value) { + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public long lRemove(String key, long count, Object value) { + try { + Long remove = redisTemplate.opsForList().remove(key, count, value); + return remove; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/SpringContextUtils.java b/jeecg-boot/src/main/java/org/jeecg/common/util/SpringContextUtils.java new file mode 100644 index 0000000..fa229fd --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/SpringContextUtils.java @@ -0,0 +1,84 @@ +package org.jeecg.common.util; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +@Component +public class SpringContextUtils implements ApplicationContextAware { + + /** + * 上下文对象实例 + */ + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + /** + * 获取applicationContext + * + * @return + */ + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + /** + * 获取HttpServletRequest + */ + public static HttpServletRequest getHttpServletRequest() { + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + } + + public static String getDomain(){ + HttpServletRequest request = getHttpServletRequest(); + StringBuffer url = request.getRequestURL(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString(); + } + + public static String getOrigin(){ + HttpServletRequest request = getHttpServletRequest(); + return request.getHeader("Origin"); + } + + /** + * 通过name获取 Bean. + * + * @param name + * @return + */ + public static Object getBean(String name) { + return getApplicationContext().getBean(name); + } + + /** + * 通过class获取Bean. + * + * @param clazz + * @param <T> + * @return + */ + public static <T> T getBean(Class<T> clazz) { + return getApplicationContext().getBean(clazz); + } + + /** + * 通过name,以及Clazz返回指定的Bean + * + * @param name + * @param clazz + * @param <T> + * @return + */ + public static <T> T getBean(String name, Class<T> clazz) { + return getApplicationContext().getBean(name, clazz); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java b/jeecg-boot/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java new file mode 100644 index 0000000..0ee043f --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java @@ -0,0 +1,173 @@ +package org.jeecg.common.util; + +import io.netty.util.internal.StringUtil; + +/** + * 流水号生成规则(按默认规则递增,数字从1-99开始递增,数字到99,递增字母;位数不够增加位数) + * A001 + * A001A002 + * @author zhangdaihao + * + */ +public class YouBianCodeUtil { + + // 数字位数(默认生成3位的数字) + + private static final int numLength = 2;//代表数字位数 + + public static final int zhanweiLength = 1+numLength; + + /** + * 根据前一个code,获取同级下一个code + * 例如:当前最大code为D01A04,下一个code为:D01A05 + * + * @param code + * @return + */ + public static synchronized String getNextYouBianCode(String code) { + String newcode = ""; + if (code == null || code =="") { + String zimu = "A"; + String num = getStrNum(1); + newcode = zimu + num; + } else { + String before_code = code.substring(0, code.length() - 1- numLength); + String after_code = code.substring(code.length() - 1 - numLength,code.length()); + char after_code_zimu = after_code.substring(0, 1).charAt(0); + Integer after_code_num = Integer.parseInt(after_code.substring(1)); +// org.jeecgframework.core.util.LogUtil.info(after_code); +// org.jeecgframework.core.util.LogUtil.info(after_code_zimu); +// org.jeecgframework.core.util.LogUtil.info(after_code_num); + + String nextNum = ""; + char nextZimu = 'A'; + // 先判断数字等于999*,则计数从1重新开始,递增 + if (after_code_num == getMaxNumByLength(numLength)) { + nextNum = getNextStrNum(0); + } else { + nextNum = getNextStrNum(after_code_num); + } + // 先判断数字等于999*,则字母从A重新开始,递增 + if(after_code_num == getMaxNumByLength(numLength)) { + nextZimu = getNextZiMu(after_code_zimu); + }else{ + nextZimu = after_code_zimu; + } + + // 例如Z99,下一个code就是Z99A01 + if ('Z' == after_code_zimu && getMaxNumByLength(numLength) == after_code_num) { + newcode = code + (nextZimu + nextNum); + } else { + newcode = before_code + (nextZimu + nextNum); + } + } + return newcode; + + } + + /** + * 根据父亲code,获取下级的下一个code + * + * 例如:父亲CODE:A01 + * 当前CODE:A01B03 + * 获取的code:A01B04 + * + * @param parentCode 上级code + * @param localCode 同级code + * @return + */ + public static synchronized String getSubYouBianCode(String parentCode,String localCode) { + if(localCode!=null && localCode!=""){ + +// return parentCode + getNextYouBianCode(localCode); + return getNextYouBianCode(localCode); + + }else{ + parentCode = parentCode + "A"+ getNextStrNum(0); + } + return parentCode; + } + + + + /** + * 将数字前面位数补零 + * + * @param num + * @return + */ + private static String getNextStrNum(int num) { + return getStrNum(getNextNum(num)); + } + + /** + * 将数字前面位数补零 + * + * @param num + * @return + */ + private static String getStrNum(int num) { + String s = String.format("%0" + numLength + "d", num); + return s; + } + + /** + * 递增获取下个数字 + * + * @param num + * @return + */ + private static int getNextNum(int num) { + num++; + return num; + } + + /** + * 递增获取下个字母 + * + * @param num + * @return + */ + private static char getNextZiMu(char zimu) { + if (zimu == 'Z') { + return 'A'; + } + zimu++; + return zimu; + } + + /** + * 根据数字位数获取最大值 + * @param length + * @return + */ + private static int getMaxNumByLength(int length){ + if(length==0){ + return 0; + } + String max_num = ""; + for (int i=0;i<length;i++){ + max_num = max_num + "9"; + } + return Integer.parseInt(max_num); + } + public static String[] cutYouBianCode(String code){ + if(code==null || StringUtil.isNullOrEmpty(code)){ + return null; + }else{ + //获取标准长度为numLength+1,截取的数量为code.length/numLength+1 + int c = code.length()/(numLength+1); + String[] cutcode = new String[c]; + for(int i =0 ; i <c;i++){ + cutcode[i] = code.substring(0,(i+1)*(numLength+1)); + } + return cutcode; + } + + } + public static void main(String[] args) { + // org.jeecgframework.core.util.LogUtil.info(getNextZiMu('C')); + // org.jeecgframework.core.util.LogUtil.info(getNextNum(8)); + // org.jeecgframework.core.util.LogUtil.info(cutYouBianCode("C99A01B01")[2]); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/oConvertUtils.java b/jeecg-boot/src/main/java/org/jeecg/common/util/oConvertUtils.java new file mode 100644 index 0000000..9723bb8 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/oConvertUtils.java @@ -0,0 +1,535 @@ +package org.jeecg.common.util; + +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.sql.Date; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; + +/** + * + * @author 张代浩 + * + */ +public class oConvertUtils { + public static boolean isEmpty(Object object) { + if (object == null) { + return (true); + } + if (object.equals("")) { + return (true); + } + if (object.equals("null")) { + return (true); + } + return (false); + } + + public static boolean isNotEmpty(Object object) { + if (object != null && !object.equals("") && !object.equals("null")) { + return (true); + } + return (false); + } + + public static String decode(String strIn, String sourceCode, String targetCode) { + String temp = code2code(strIn, sourceCode, targetCode); + return temp; + } + + public static String StrToUTF(String strIn, String sourceCode, String targetCode) { + strIn = ""; + try { + strIn = new String(strIn.getBytes("ISO-8859-1"), "GBK"); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return strIn; + + } + + private static String code2code(String strIn, String sourceCode, String targetCode) { + String strOut = null; + if (strIn == null || (strIn.trim()).equals("")) + return strIn; + try { + byte[] b = strIn.getBytes(sourceCode); + for (int i = 0; i < b.length; i++) { + System.out.print(b[i] + " "); + } + strOut = new String(b, targetCode); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return strOut; + } + + public static int getInt(String s, int defval) { + if (s == null || s == "") { + return (defval); + } + try { + return (Integer.parseInt(s)); + } catch (NumberFormatException e) { + return (defval); + } + } + + public static int getInt(String s) { + if (s == null || s == "") { + return 0; + } + try { + return (Integer.parseInt(s)); + } catch (NumberFormatException e) { + return 0; + } + } + + public static int getInt(String s, Integer df) { + if (s == null || s == "") { + return df; + } + try { + return (Integer.parseInt(s)); + } catch (NumberFormatException e) { + return 0; + } + } + + public static Integer[] getInts(String[] s) { + Integer[] integer = new Integer[s.length]; + if (s == null) { + return null; + } + for (int i = 0; i < s.length; i++) { + integer[i] = Integer.parseInt(s[i]); + } + return integer; + + } + + public static double getDouble(String s, double defval) { + if (s == null || s == "") { + return (defval); + } + try { + return (Double.parseDouble(s)); + } catch (NumberFormatException e) { + return (defval); + } + } + + public static double getDou(Double s, double defval) { + if (s == null) { + return (defval); + } + return s; + } + + /*public static Short getShort(String s) { + if (StringUtil.isNotEmpty(s)) { + return (Short.parseShort(s)); + } else { + return null; + } + }*/ + + public static int getInt(Object object, int defval) { + if (isEmpty(object)) { + return (defval); + } + try { + return (Integer.parseInt(object.toString())); + } catch (NumberFormatException e) { + return (defval); + } + } + + public static int getInt(BigDecimal s, int defval) { + if (s == null) { + return (defval); + } + return s.intValue(); + } + + public static Integer[] getIntegerArry(String[] object) { + int len = object.length; + Integer[] result = new Integer[len]; + try { + for (int i = 0; i < len; i++) { + result[i] = new Integer(object[i].trim()); + } + return result; + } catch (NumberFormatException e) { + return null; + } + } + + public static String getString(String s) { + return (getString(s, "")); + } + + /** + * 转义成Unicode编码 + * @param s + * @return + */ + /*public static String escapeJava(Object s) { + return StringEscapeUtils.escapeJava(getString(s)); + }*/ + + public static String getString(Object object) { + if (isEmpty(object)) { + return ""; + } + return (object.toString().trim()); + } + + public static String getString(int i) { + return (String.valueOf(i)); + } + + public static String getString(float i) { + return (String.valueOf(i)); + } + + public static String getString(String s, String defval) { + if (isEmpty(s)) { + return (defval); + } + return (s.trim()); + } + + public static String getString(Object s, String defval) { + if (isEmpty(s)) { + return (defval); + } + return (s.toString().trim()); + } + + public static long stringToLong(String str) { + Long test = new Long(0); + try { + test = Long.valueOf(str); + } catch (Exception e) { + } + return test.longValue(); + } + + /** + * 获取本机IP + */ + public static String getIp() { + String ip = null; + try { + InetAddress address = InetAddress.getLocalHost(); + ip = address.getHostAddress(); + + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return ip; + } + + /** + * 判断一个类是否为基本数据类型。 + * + * @param clazz + * 要判断的类。 + * @return true 表示为基本数据类型。 + */ + private static boolean isBaseDataType(Class clazz) throws Exception { + return (clazz.equals(String.class) || clazz.equals(Integer.class) || clazz.equals(Byte.class) || clazz.equals(Long.class) || clazz.equals(Double.class) || clazz.equals(Float.class) || clazz.equals(Character.class) || clazz.equals(Short.class) || clazz.equals(BigDecimal.class) || clazz.equals(BigInteger.class) || clazz.equals(Boolean.class) || clazz.equals(Date.class) || clazz.isPrimitive()); + } + + /** + * @param request + * IP + * @return IP Address + */ + public static String getIpAddrByRequest(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } + + /** + * @return 本机IP + * @throws SocketException + */ + public static String getRealIp() throws SocketException { + String localip = null;// 本地IP,如果没有配置外网IP则返回它 + String netip = null;// 外网IP + + Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces(); + InetAddress ip = null; + boolean finded = false;// 是否找到外网IP + while (netInterfaces.hasMoreElements() && !finded) { + NetworkInterface ni = netInterfaces.nextElement(); + Enumeration<InetAddress> address = ni.getInetAddresses(); + while (address.hasMoreElements()) { + ip = address.nextElement(); + if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 外网IP + netip = ip.getHostAddress(); + finded = true; + break; + } else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 内网IP + localip = ip.getHostAddress(); + } + } + } + + if (netip != null && !"".equals(netip)) { + return netip; + } else { + return localip; + } + } + + /** + * java去除字符串中的空格、回车、换行符、制表符 + * + * @param str + * @return + */ + public static String replaceBlank(String str) { + String dest = ""; + if (str != null) { + Pattern p = Pattern.compile("\\s*|\t|\r|\n"); + Matcher m = p.matcher(str); + dest = m.replaceAll(""); + } + return dest; + + } + + /** + * 判断元素是否在数组内 + * + * @param substring + * @param source + * @return + */ + public static boolean isIn(String substring, String[] source) { + if (source == null || source.length == 0) { + return false; + } + for (int i = 0; i < source.length; i++) { + String aSource = source[i]; + if (aSource.equals(substring)) { + return true; + } + } + return false; + } + + /** + * 获取Map对象 + */ + public static Map<Object, Object> getHashMap() { + return new HashMap<Object, Object>(); + } + + /** + * SET转换MAP + * + * @param str + * @return + */ + public static Map<Object, Object> SetToMap(Set<Object> setobj) { + Map<Object, Object> map = getHashMap(); + for (Iterator iterator = setobj.iterator(); iterator.hasNext();) { + Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>) iterator.next(); + map.put(entry.getKey().toString(), entry.getValue() == null ? "" : entry.getValue().toString().trim()); + } + return map; + + } + + public static boolean isInnerIP(String ipAddress) { + boolean isInnerIp = false; + long ipNum = getIpNum(ipAddress); + /** + * 私有IP:A类 10.0.0.0-10.255.255.255 B类 172.16.0.0-172.31.255.255 C类 192.168.0.0-192.168.255.255 当然,还有127这个网段是环回地址 + **/ + long aBegin = getIpNum("10.0.0.0"); + long aEnd = getIpNum("10.255.255.255"); + long bBegin = getIpNum("172.16.0.0"); + long bEnd = getIpNum("172.31.255.255"); + long cBegin = getIpNum("192.168.0.0"); + long cEnd = getIpNum("192.168.255.255"); + isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || ipAddress.equals("127.0.0.1"); + return isInnerIp; + } + + private static long getIpNum(String ipAddress) { + String[] ip = ipAddress.split("\\."); + long a = Integer.parseInt(ip[0]); + long b = Integer.parseInt(ip[1]); + long c = Integer.parseInt(ip[2]); + long d = Integer.parseInt(ip[3]); + + long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d; + return ipNum; + } + + private static boolean isInner(long userIp, long begin, long end) { + return (userIp >= begin) && (userIp <= end); + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。 + * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br> + * 例如:hello_world->helloWorld + * + * @param name + * 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String camelName(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains("_")) { + // 不含下划线,仅将首字母小写 + //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + return name.substring(0, 1).toLowerCase() + name.substring(1).toLowerCase(); + //update-end--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + } + // 用下划线将原始字符串分割 + String camels[] = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 处理真正的驼峰片段 + if (result.length() == 0) { + // 第一个驼峰片段,全部字母都小写 + result.append(camel.toLowerCase()); + } else { + // 其他的驼峰片段,首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + } + return result.toString(); + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。 + * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br> + * 例如:hello_world,test_id->helloWorld,testId + * + * @param name + * 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String camelNames(String names) { + if(names==null||names.equals("")){ + return null; + } + StringBuffer sf = new StringBuffer(); + String[] fs = names.split(","); + for (String field : fs) { + field = camelName(field); + sf.append(field + ","); + } + String result = sf.toString(); + return result.substring(0, result.length() - 1); + } + + //update-begin--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + /** + * 将下划线大写方式命名的字符串转换为驼峰式。(首字母写) + * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br> + * 例如:hello_world->HelloWorld + * + * @param name + * 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String camelNameCapFirst(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains("_")) { + // 不含下划线,仅将首字母小写 + return name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase(); + } + // 用下划线将原始字符串分割 + String camels[] = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 其他的驼峰片段,首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + //update-end--Author:zhoujf Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能 + + /** + * 将驼峰命名转化成下划线 + * @param para + * @return + */ + public static String camelToUnderline(String para){ + StringBuilder sb=new StringBuilder(para); + int temp=0;//定位 + for(int i=0;i<para.length();i++){ + if(Character.isUpperCase(para.charAt(i))){ + sb.insert(i+temp, "_"); + temp+=1; + } + } + return sb.toString().toLowerCase(); + } + + /** + * 随机数 + * @param place 定义随机数的位数 + */ + public static String randomGen(int place) { + String base = "qwertyuioplkjhgfdsazxcvbnmQAZWSXEDCRFVTGBYHNUJMIKLOP0123456789"; + StringBuffer sb = new StringBuffer(); + Random rd = new Random(); + for(int i=0;i<place;i++) { + sb.append(base.charAt(rd.nextInt(base.length()))); + } + return sb.toString(); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/ObjectParseUtil.java b/jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/ObjectParseUtil.java new file mode 100644 index 0000000..2a6ad3c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/ObjectParseUtil.java @@ -0,0 +1,60 @@ +package org.jeecg.common.util.superSearch; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +/** + * 判断类型,追加查询规则 + * + * @author Scott + * @date 2019年02月14日 + */ +public class ObjectParseUtil { + + /** + * + * @param queryWrapper QueryWrapper + * @param name 字段名字 + * @param rule 查询规则 + * @param value 查询条件值 + */ + public static void addCriteria(QueryWrapper<?> queryWrapper, String name, QueryRuleEnum rule, Object value) { + if (value == null || rule == null) { + return; + } + switch (rule) { + case GT: + queryWrapper.gt(name, value); + break; + case GE: + queryWrapper.ge(name, value); + break; + case LT: + queryWrapper.lt(name, value); + break; + case LE: + queryWrapper.le(name, value); + break; + case EQ: + queryWrapper.eq(name, value); + break; + case NE: + queryWrapper.ne(name, value); + break; + case IN: + queryWrapper.in(name, (Object[]) value); + break; + case LIKE: + queryWrapper.like(name, value); + break; + case LEFT_LIKE: + queryWrapper.likeLeft(name, value); + break; + case RIGHT_LIKE: + queryWrapper.likeRight(name, value); + break; + default: + break; + } + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/QueryRuleEnum.java b/jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/QueryRuleEnum.java new file mode 100644 index 0000000..4345479 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/QueryRuleEnum.java @@ -0,0 +1,60 @@ +package org.jeecg.common.util.superSearch; + +import org.jeecg.common.util.oConvertUtils; + +/** + * Query 规则 常量 + * @author Scott + * @date 2019年02月14日 + */ +public enum QueryRuleEnum { + + GT(">","大于"), + GE(">=","大于等于"), + LT("<","小于"), + LE("<=","小于等于"), + EQ("=","等于"), + NE("!=","不等于"), + IN("IN","包含"), + LIKE("LIKE","全模糊"), + LEFT_LIKE("LEFT_LIKE","左模糊"), + RIGHT_LIKE("RIGHT_LIKE","右模糊"), + SQL_RULES("EXTEND_SQL","自定义SQL片段"); + + private String value; + + private String msg; + + QueryRuleEnum(String value, String msg){ + this.value = value; + this.msg = msg; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public static QueryRuleEnum getByValue(String value){ + if(oConvertUtils.isEmpty(value)) { + return null; + } + for(QueryRuleEnum val :values()){ + if (val.getValue().equals(value)){ + return val; + } + } + return null; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/QueryRuleVo.java b/jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/QueryRuleVo.java new file mode 100644 index 0000000..b3e3303 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/superSearch/QueryRuleVo.java @@ -0,0 +1,11 @@ +package org.jeecg.common.util.superSearch; + +import lombok.Data; + +@Data +public class QueryRuleVo { + + private String field; + private String rule; + private String val; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/config/MybatisPlusConfig.java b/jeecg-boot/src/main/java/org/jeecg/config/MybatisPlusConfig.java new file mode 100644 index 0000000..6bde7f3 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/config/MybatisPlusConfig.java @@ -0,0 +1,35 @@ +package org.jeecg.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor; + +/** + * 单数据源配置(jeecg.datasource.open = false时生效) + * @author zhoujf + * + */ +@Configuration +@MapperScan(value={"org.jeecg.modules.**.mapper*"}) +public class MybatisPlusConfig { + + /** + * 分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } + +// /** +// * mybatis-plus SQL执行效率插件【生产环境可以关闭】 +// */ +// @Bean +// public PerformanceInterceptor performanceInterceptor() { +// return new PerformanceInterceptor(); +// } + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/config/RedisConfig.java b/jeecg-boot/src/main/java/org/jeecg/config/RedisConfig.java new file mode 100644 index 0000000..940b043 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/config/RedisConfig.java @@ -0,0 +1,80 @@ +package org.jeecg.config; + +import java.lang.reflect.Method; + +import javax.annotation.Resource; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; + +@Configuration +@EnableCaching // 开启缓存支持 +public class RedisConfig extends CachingConfigurerSupport { + + @Resource + private LettuceConnectionFactory lettuceConnectionFactory; + + /** + * @description 自定义的缓存key的生成策略 若想使用这个key + * 只需要讲注解上keyGenerator的值设置为keyGenerator即可</br> + * @return 自定义策略生成的key + */ + @Bean + public KeyGenerator keyGenerator() { + return new KeyGenerator() { + @Override + public Object generate(Object target, Method method, Object... params) { + StringBuffer sb = new StringBuffer(); + sb.append(target.getClass().getName()); + sb.append(method.getName()); + for (Object obj : params) { + sb.append(obj.toString()); + } + return sb.toString(); + } + }; + } + + // 这个注释不能放开,发现自定义缓存管理器,会导致实体解析失败 + //TODO +// @Bean +// public CacheManager cacheManager() { +// RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(lettuceConnectionFactory); +// return builder.build(); +// } + + /** + * RedisTemplate配置 + */ + @Bean + public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { + // 设置序列化 + Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class); + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, Visibility.ANY); + om.enableDefaultTyping(DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(om); + // 配置redisTemplate + RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); + redisTemplate.setConnectionFactory(lettuceConnectionFactory); + RedisSerializer<?> stringSerializer = new StringRedisSerializer(); + redisTemplate.setKeySerializer(stringSerializer);// key序列化 + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化 + redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化 + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化 + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/config/ShiroConfig.java b/jeecg-boot/src/main/java/org/jeecg/config/ShiroConfig.java new file mode 100644 index 0000000..9fd0d5f --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/config/ShiroConfig.java @@ -0,0 +1,134 @@ +package org.jeecg.config; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import javax.servlet.Filter; +import org.apache.shiro.mgt.DefaultSessionStorageEvaluator; +import org.apache.shiro.mgt.DefaultSubjectDAO; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.spring.LifecycleBeanPostProcessor; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.jeecg.modules.shiro.authc.MyRealm; +import org.jeecg.modules.shiro.authc.aop.JwtFilter; +import org.jeecg.modules.shiro.authc.aop.ResourceCheckFilter; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; + +/** + * @author: Scott + * @date: 2018/2/7 + * @description: shiro 配置类 + */ + +@Configuration +public class ShiroConfig { + + /** + * Filter Chain定义说明 + * + * 1、一个URL可以配置多个Filter,使用逗号分隔 + * 2、当设置多个过滤器时,全部验证通过,才视为通过 + * 3、部分过滤器可指定参数,如perms,roles + */ + @Bean("shiroFilter") + public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + shiroFilterFactoryBean.setSecurityManager(securityManager); + // 拦截器 + Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); + // 配置不会被拦截的链接 顺序判断 + filterChainDefinitionMap.put("/sys/login", "anon"); //登录接口排除 + filterChainDefinitionMap.put("/sys/common/view/**", "anon");//图片预览不限制token + filterChainDefinitionMap.put("/api/auth/logout", "anon");//退出登录 + filterChainDefinitionMap.put("/auth/2step-code", "anon");//退出登录 + + filterChainDefinitionMap.put("/**.js", "anon"); + filterChainDefinitionMap.put("/**.css", "anon"); + filterChainDefinitionMap.put("/druid/**", "anon"); + filterChainDefinitionMap.put("/swagger-ui.html", "anon"); + filterChainDefinitionMap.put("/swagger**/**", "anon"); + filterChainDefinitionMap.put("/webjars/**", "anon"); + filterChainDefinitionMap.put("/v2/**", "anon"); + + + filterChainDefinitionMap.put("/processInstance/**", "anon"); + filterChainDefinitionMap.put("/task/**", "anon"); + + + //TODO 排除Online请求 + filterChainDefinitionMap.put("/auto/cgform/**", "anon"); + //filterChainDefinitionMap.put("/cgAutoListController?list&id=**", "anon"); + //filterChainDefinitionMap.put("/cgFormBuildController/**", "anon"); + //TODO 排除FineReport请求 + //filterChainDefinitionMap.put("/ReportServer?reportlet=**", "anon"); + + + //用户,需要角色权限 “user” + //filterChainDefinitionMap.put("/test/**", "roles[test]"); + //管理员,需要角色权限 “admin” + //filterChainDefinitionMap.put("/sys/**", "roles[admin]"); + + // 添加自己的过滤器并且取名为jwt + Map<String, Filter> filterMap = new HashMap<String, Filter>(1); + filterMap.put("jwt", new JwtFilter()); + filterMap.put("resourceCheckFilter", new ResourceCheckFilter()); + shiroFilterFactoryBean.setFilters(filterMap); + // <!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边 + filterChainDefinitionMap.put("/**", "jwt"); + //filterChainDefinitionMap.put("/**", "resourceCheckFilter"); + + // 未授权界面; + shiroFilterFactoryBean.setUnauthorizedUrl("/403"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + return shiroFilterFactoryBean; + } + + @Bean("securityManager") + public DefaultWebSecurityManager securityManager(MyRealm myRealm) { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + securityManager.setRealm(myRealm); + + /* + * 关闭shiro自带的session,详情见文档 + * http://shiro.apache.org/session-management.html#SessionManagement- + * StatelessApplications%28Sessionless%29 + */ + DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO(); + DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator(); + defaultSessionStorageEvaluator.setSessionStorageEnabled(false); + subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator); + securityManager.setSubjectDAO(subjectDAO); + + return securityManager; + } + + /** + * 下面的代码是添加注解支持 + * @return + */ + @Bean + @DependsOn("lifecycleBeanPostProcessor") + public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { + DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); + defaultAdvisorAutoProxyCreator.setProxyTargetClass(true); + return defaultAdvisorAutoProxyCreator; + } + + @Bean + public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { + return new LifecycleBeanPostProcessor(); + } + + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); + advisor.setSecurityManager(securityManager); + return advisor; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/config/Swagger2Config.java b/jeecg-boot/src/main/java/org/jeecg/config/Swagger2Config.java new file mode 100644 index 0000000..d09e078 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/config/Swagger2Config.java @@ -0,0 +1,97 @@ +package org.jeecg.config; + +import java.util.ArrayList; +import java.util.List; + +import org.jeecg.modules.shiro.vo.DefContants; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import io.swagger.annotations.ApiOperation; +import springfox.documentation.service.Parameter; +import lombok.extern.slf4j.Slf4j; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * @author scott + */ +@Slf4j +@Configuration +@EnableSwagger2 +public class Swagger2Config implements WebMvcConfigurer { + + /** + * + * 显示swagger-ui.html文档展示页,还必须注入swagger资源: + * + * @param registry + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + } + + /** + * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等 + * + * @return Docket + */ + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + //此包路径下的类,才生成接口文档 + .apis(RequestHandlerSelectors.basePackage("org.jeecg.modules")) + //加了ApiOperation注解的类,才生成接口文档 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .paths(PathSelectors.any()) + .build() + .globalOperationParameters(setHeaderToken()); + } + + /** + * JWT token + * @return + */ + private List<Parameter> setHeaderToken() { + ParameterBuilder tokenPar = new ParameterBuilder(); + List<Parameter> pars = new ArrayList<>(); + tokenPar.name(DefContants.X_ACCESS_TOKEN).description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build(); + pars.add(tokenPar.build()); + return pars; + } + + /** + * api文档的详细信息函数,注意这里的注解引用的是哪个 + * + * @return + */ + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + // //大标题 + .title("Jeecg-Boot 后台服务API接口文档") + // 版本号 + .version("1.0") +// .termsOfServiceUrl("NO terms of service") + // 描述 + .description("restful 风格接口") + // 作者 +// .contact(new Contact("scott", "http://jeecg.org", "jeecgos@163.com")) +// .license("The Apache License, Version 2.0") +// .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") + .build(); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/config/WebMvcConfiguration.java b/jeecg-boot/src/main/java/org/jeecg/config/WebMvcConfiguration.java new file mode 100644 index 0000000..0dc6c0f --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/config/WebMvcConfiguration.java @@ -0,0 +1,33 @@ +package org.jeecg.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * Spring Boot 2.0 解决跨域问题 + * @author qinfeng + * + */ +@Configuration +public class WebMvcConfiguration implements WebMvcConfigurer { + + @Bean + public CorsFilter corsFilter() { + final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); + final CorsConfiguration corsConfiguration = new CorsConfiguration(); + /*是否允许请求带有验证信息*/ + corsConfiguration.setAllowCredentials(true); + /*允许访问的客户端域名*/ + corsConfiguration.addAllowedOrigin("*"); + /*允许服务端访问的客户端请求头*/ + corsConfiguration.addAllowedHeader("*"); + /*允许访问的方法名,GET POST等*/ + corsConfiguration.addAllowedMethod("*"); + urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); + return new CorsFilter(urlBasedCorsConfigurationSource); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java b/jeecg-boot/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java new file mode 100644 index 0000000..2aa5be0 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java @@ -0,0 +1,144 @@ +package org.jeecg.config.mybatis; + +import java.lang.reflect.Field; +import java.util.Date; +import java.util.Properties; + +import org.apache.ibatis.binding.MapperMethod.ParamMap; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.plugin.Intercepts; +import org.apache.ibatis.plugin.Invocation; +import org.apache.ibatis.plugin.Plugin; +import org.apache.ibatis.plugin.Signature; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysUser; +import org.springframework.stereotype.Component; + +import lombok.extern.slf4j.Slf4j; + +/** + * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间 + * @author scott + * @date 2019-01-19 + * + */ +@Slf4j +@Component +@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) }) +public class MybatisInterceptor implements Interceptor { + + @Override + public Object intercept(Invocation invocation) throws Throwable { + MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; + String sqlId = mappedStatement.getId(); + log.debug("------sqlId------" + sqlId); + SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); + Object parameter = invocation.getArgs()[1]; + log.info("------sqlCommandType------" + sqlCommandType); + + if (parameter == null) { + return invocation.proceed(); + } + if (SqlCommandType.INSERT == sqlCommandType) { + Field[] fields = parameter.getClass().getDeclaredFields(); + for (Field field : fields) { + log.debug("------field.name------" + field.getName()); + try { + if ("createBy".equals(field.getName())) { + field.setAccessible(true); + Object local_createBy = field.get(parameter); + field.setAccessible(false); + if (local_createBy == null || local_createBy.equals("")) { + String createBy = "jeecg-boot"; + // 获取登录用户信息 + SysUser sysUser = (SysUser) SecurityUtils.getSubject().getPrincipal(); + if (sysUser != null) { + // 登录账号 + createBy = sysUser.getUsername(); + } + if (!oConvertUtils.isEmpty(createBy)) { + field.setAccessible(true); + field.set(parameter, createBy); + field.setAccessible(false); + } + } + } + // 注入创建时间 + if ("createTime".equals(field.getName())) { + field.setAccessible(true); + Object local_createDate = field.get(parameter); + field.setAccessible(false); + if (local_createDate == null || local_createDate.equals("")) { + field.setAccessible(true); + field.set(parameter, new Date()); + field.setAccessible(false); + } + } + } catch (Exception e) { + } + } + } + if (SqlCommandType.UPDATE == sqlCommandType) { + Field[] fields = null; + if (parameter instanceof ParamMap) { + ParamMap<?> p = (ParamMap<?>) parameter; + parameter = p.get("param1"); + fields = parameter.getClass().getDeclaredFields(); + } else { + fields = parameter.getClass().getDeclaredFields(); + } + + for (Field field : fields) { + log.debug("------field.name------" + field.getName()); + try { + if ("updateBy".equals(field.getName())) { + field.setAccessible(true); + Object local_updateBy = field.get(parameter); + field.setAccessible(false); + if (local_updateBy == null || local_updateBy.equals("")) { + String updateBy = "jeecg-boot"; + // 获取登录用户信息 + SysUser sysUser = (SysUser) SecurityUtils.getSubject().getPrincipal(); + if (sysUser != null) { + // 登录账号 + updateBy = sysUser.getUsername(); + } + if (!oConvertUtils.isEmpty(updateBy)) { + field.setAccessible(true); + field.set(parameter, updateBy); + field.setAccessible(false); + } + } + } + if ("updateTime".equals(field.getName())) { + field.setAccessible(true); + Object local_updateDate = field.get(parameter); + field.setAccessible(false); + if (local_updateDate == null || local_updateDate.equals("")) { + field.setAccessible(true); + field.set(parameter, new Date()); + field.setAccessible(false); + } + } + } catch (Exception e) { + } + } + } + return invocation.proceed(); + } + + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + + @Override + public void setProperties(Properties properties) { + // TODO Auto-generated method stub + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/MockController.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/MockController.java new file mode 100644 index 0000000..7882b67 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/MockController.java @@ -0,0 +1,86 @@ +package org.jeecg.modules.demo.mock; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.commons.io.IOUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api") +public class MockController { + + @GetMapping(value = "/user") + public String user() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/user.json"); + } + + @GetMapping(value = "/role") + public String role() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/role.json"); + } + + @GetMapping(value = "/service") + public String service() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/service.json"); + } + + @GetMapping(value = "/permission") + public String permission() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/permission.json"); + } + + @GetMapping(value = "/permission/no-pager") + public String permission_no_page() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/permission_no_page.json"); + } + + + //------------------------------------------------------------------------------------------- + /** + * 工作台首页的数据 + * @return + */ + @GetMapping(value = "/list/search/projects") + public String projects() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/workplace_projects.json"); + } + + @GetMapping(value = "/workplace/activity") + public String activity() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/workplace_activity.json"); + } + + @GetMapping(value = "/workplace/teams") + public String teams() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/workplace_teams.json"); + } + + @GetMapping(value = "/workplace/radar") + public String radar() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/workplace_radar.json"); + } + //------------------------------------------------------------------------------------------- + + /** + * 读取json格式文件 + * @param jsonSrc + * @return + */ + private String readJson(String jsonSrc) { + String json = ""; + try { + //File jsonFile = ResourceUtils.getFile(jsonSrc); + //json = FileUtils.re.readFileToString(jsonFile); + //换个写法,解决springboot读取jar包中文件的问题 + InputStream stream = getClass().getClassLoader().getResourceAsStream(jsonSrc.replace("classpath:", "")); + json = IOUtils.toString(stream); + } catch (IOException e) { + e.printStackTrace(); + } + return json; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/permission.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/permission.json new file mode 100644 index 0000000..96e8d2e --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/permission.json @@ -0,0 +1,156 @@ +{ + "message": "", + "result": { + "data": [ + { + "id": "marketing", + "name": "营销管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "sptDaTypes": null, + "optionalFields": null, + "parents": null, + "type": null, + "deleted": 0, + "actions": [ + "add", + "query", + "get", + "update", + "delete" + ] + }, + { + "id": "member", + "name": "会员管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "query", + "get", + "update", + "delete" + ] + }, + { + "id": "menu", + "name": "菜单管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "import", + "get", + "update" + ] + }, + { + "id": "order", + "name": "订单管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "query", + "get", + "update", + "delete" + ] + }, + { + "id": "permission", + "name": "权限管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "get", + "update", + "delete" + ] + }, + { + "id": "role", + "name": "角色管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "get", + "update", + "delete" + ] + }, + { + "id": "test", + "name": "测试权限", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "get" + ] + }, + { + "id": "user", + "name": "用户管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"add\",\"describe\":\"新增\",\"defaultCheck\":false},{\"action\":\"get\",\"describe\":\"查询\",\"defaultCheck\":false}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "get" + ] + } + ], + "pageSize": 10, + "pageNo": 0, + "totalPage": 1, + "totalCount": 5 + }, + "status": 200, + "timestamp": 1537082021471 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/permission_no_page.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/permission_no_page.json new file mode 100644 index 0000000..58be9d7 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/permission_no_page.json @@ -0,0 +1,150 @@ +{ + "message": "", + "result": [ + { + "id": "marketing", + "name": "营销管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "sptDaTypes": null, + "optionalFields": null, + "parents": null, + "type": null, + "deleted": 0, + "actions": [ + "add", + "query", + "get", + "update", + "delete" + ] + }, + { + "id": "member", + "name": "会员管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "query", + "get", + "update", + "delete" + ] + }, + { + "id": "menu", + "name": "菜单管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "import", + "get", + "update" + ] + }, + { + "id": "order", + "name": "订单管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "query", + "get", + "update", + "delete" + ] + }, + { + "id": "permission", + "name": "权限管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "get", + "update", + "delete" + ] + }, + { + "id": "role", + "name": "角色管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "get", + "update", + "delete" + ] + }, + { + "id": "test", + "name": "测试权限", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "get" + ] + }, + { + "id": "user", + "name": "用户管理", + "describe": null, + "status": 1, + "actionData": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"export\",\"defaultCheck\":false,\"describe\":\"导出\"}]", + "sptDaTypes": null, + "optionalFields": "[]", + "parents": null, + "type": "default", + "deleted": 0, + "actions": [ + "add", + "get" + ] + } + ], + "status": 200, + "timestamp": 1537082021471 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/role.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/role.json new file mode 100644 index 0000000..8ffb0ed --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/role.json @@ -0,0 +1,608 @@ +{ + "message": "", + "result": { + "data": [ + { + "id": "admin", + "name": "管理员", + "describe": "拥有所有权限", + "status": 1, + "creatorId": "system", + "createTime": 1497160610259, + "deleted": 0, + "permissions": [ + { + "roleId": "admin", + "permissionId": "comment", + "permissionName": "评论管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "member", + "permissionName": "会员管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "menu", + "permissionName": "菜单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "order", + "permissionName": "订单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "permission", + "permissionName": "权限管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "role", + "permissionName": "角色管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "test", + "permissionName": "测试权限", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "user", + "permissionName": "用户管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"},{\"action\":\"export\",\"defaultCheck\":false,\"describe\":\"导出\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + }, + { + "action": "export", + "describe": "导出", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + } + ] + }, + { + "id": "svip", + "name": "SVIP", + "describe": "超级会员", + "status": 1, + "creatorId": "system", + "createTime": 1532417744846, + "deleted": 0, + "permissions": [ + { + "roleId": "admin", + "permissionId": "comment", + "permissionName": "评论管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "member", + "permissionName": "会员管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "menu", + "permissionName": "菜单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "order", + "permissionName": "订单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "permission", + "permissionName": "权限管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "role", + "permissionName": "角色管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "test", + "permissionName": "测试权限", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "user", + "permissionName": "用户管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"},{\"action\":\"export\",\"defaultCheck\":false,\"describe\":\"导出\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + } + ] + }, + { + "id": "user", + "name": "普通会员", + "describe": "普通用户,只能查询", + "status": 1, + "creatorId": "system", + "createTime": 1497160610259, + "deleted": 0, + "permissions": [ + { + "roleId": "user", + "permissionId": "comment", + "permissionName": "评论管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "marketing", + "permissionName": "营销管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "member", + "permissionName": "会员管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "menu", + "permissionName": "菜单管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "order", + "permissionName": "订单管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "permission", + "permissionName": "权限管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "role", + "permissionName": "角色管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "test", + "permissionName": "测试权限", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "user", + "permissionName": "用户管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + } + ] + } + ], + "pageSize": 10, + "pageNo": 0, + "totalPage": 1, + "totalCount": 5 + }, + "status": 200, + "timestamp": 1537079497645 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/service.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/service.json new file mode 100644 index 0000000..53a591f --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/service.json @@ -0,0 +1,103 @@ +{ + "message": "", + "result": { + "pageSize": 10, + "pageNo": 0, + "totalCount": 57, + "totalPage": 6, + "data": [ + { + "key": 1, + "no": "No 1", + "description": "这是一段描述", + "callNo": 127, + "status": 2, + "updatedAt": "1970-06-24 11:51:20", + "editable": false + }, + { + "key": 2, + "no": "No 2", + "description": "这是一段描述", + "callNo": 573, + "status": 2, + "updatedAt": "1994-12-11 00:37:35", + "editable": false + }, + { + "key": 3, + "no": "No 3", + "description": "这是一段描述", + "callNo": 869, + "status": 2, + "updatedAt": "2013-11-11 08:04:03", + "editable": false + }, + { + "key": 4, + "no": "No 4", + "description": "这是一段描述", + "callNo": 26, + "status": 2, + "updatedAt": "1990-11-04 15:41:42", + "editable": false + }, + { + "key": 5, + "no": "No 5", + "description": "这是一段描述", + "callNo": 20, + "status": 2, + "updatedAt": "1970-01-05 11:04:56", + "editable": false + }, + { + "key": 6, + "no": "No 6", + "description": "这是一段描述", + "callNo": 675, + "status": 2, + "updatedAt": "1983-06-06 04:09:04", + "editable": false + }, + { + "key": 7, + "no": "No 7", + "description": "这是一段描述", + "callNo": 512, + "status": 3, + "updatedAt": "1996-08-26 21:47:44", + "editable": false + }, + { + "key": 8, + "no": "No 8", + "description": "这是一段描述", + "callNo": 962, + "status": 2, + "updatedAt": "2004-08-15 23:15:22", + "editable": false + }, + { + "key": 9, + "no": "No 9", + "description": "这是一段描述", + "callNo": 318, + "status": 3, + "updatedAt": "1988-08-10 14:36:35", + "editable": false + }, + { + "key": 10, + "no": "No 10", + "description": "这是一段描述", + "callNo": 789, + "status": 0, + "updatedAt": "1988-12-27 23:39:41", + "editable": false + } + ] + }, + "status": 200, + "timestamp": 1534955098193 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/user.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/user.json new file mode 100644 index 0000000..060ee7a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/user.json @@ -0,0 +1,2388 @@ +{ + "message": "", + "result": { + "data": [ + { + "id": "3e1f9d2373b740b09eff34adca649458", + "name": "zzc", + "username": "zzc", + "password": "default", + "status": 1, + "telephone": "", + "lastLoginIp": "127.0.0.1", + "lastLoginTime": 1534917683651, + "creatorId": null, + "createTime": 1533290866069, + "merchantCode": "TLif2btpzg079h15bk", + "deleted": 0, + "roleId": "admin", + "role": { + "id": "admin", + "name": "管理员", + "describe": "拥有所有权限", + "status": 1, + "creatorId": "system", + "createTime": 1497160610259, + "deleted": 0, + "permissions": [ + { + "roleId": "admin", + "permissionId": "comment", + "permissionName": "评论管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "feedback", + "permissionName": "反馈管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "goods", + "permissionName": "商品管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "member", + "permissionName": "会员管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "menu", + "permissionName": "菜单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "merchant", + "permissionName": "商家管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "order", + "permissionName": "订单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "permission", + "permissionName": "权限管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "role", + "permissionName": "角色管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "table", + "permissionName": "桌子管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "user", + "permissionName": "用户管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"},{\"action\":\"export\",\"defaultCheck\":false,\"describe\":\"导出\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + }, + { + "action": "export", + "describe": "导出", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + } + ] + }, + "permissions": null + }, + { + "id": "4291d7da9005377ec9aec4a71ea837f", + "name": "管理员", + "username": "admin", + "password": "default", + "status": 1, + "telephone": "", + "lastLoginIp": "120.41.221.157", + "lastLoginTime": 1534955070227, + "creatorId": "admin", + "createTime": 1497160610259, + "merchantCode": "TLif2btpzg079h15bk", + "deleted": 0, + "roleId": "admin", + "role": { + "id": "admin", + "name": "管理员", + "describe": "拥有所有权限", + "status": 1, + "creatorId": "system", + "createTime": 1497160610259, + "deleted": 0, + "permissions": [ + { + "roleId": "admin", + "permissionId": "comment", + "permissionName": "评论管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "feedback", + "permissionName": "反馈管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "goods", + "permissionName": "商品管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "member", + "permissionName": "会员管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "menu", + "permissionName": "菜单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "merchant", + "permissionName": "商家管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "order", + "permissionName": "订单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "permission", + "permissionName": "权限管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "role", + "permissionName": "角色管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "table", + "permissionName": "桌子管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "user", + "permissionName": "用户管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"},{\"action\":\"export\",\"defaultCheck\":false,\"describe\":\"导出\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + }, + { + "action": "export", + "describe": "导出", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + } + ] + }, + "permissions": null + }, + { + "id": "4415f49c05f843579de26f79d62ed2d4", + "name": "每日咖啡 测试店", + "username": "zengyp", + "password": "default", + "status": 1, + "telephone": null, + "lastLoginIp": "27.154.27.120", + "lastLoginTime": 1533715238621, + "creatorId": null, + "createTime": 1533708419903, + "merchantCode": "TLif2btpzg079h15bk", + "deleted": 0, + "roleId": "user", + "role": { + "id": "user", + "name": "普通会员", + "describe": "普通用户,只能查询", + "status": 1, + "creatorId": "system", + "createTime": 1497160610259, + "deleted": 0, + "permissions": [ + { + "roleId": "user", + "permissionId": "comment", + "permissionName": "评论管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "feedback", + "permissionName": "反馈管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "goods", + "permissionName": "商品管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "member", + "permissionName": "会员管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "menu", + "permissionName": "菜单管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "merchant", + "permissionName": "商家管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "order", + "permissionName": "订单管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "permission", + "permissionName": "权限管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "role", + "permissionName": "角色管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "table", + "permissionName": "桌子管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "user", + "permissionId": "user", + "permissionName": "用户管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + } + ] + }, + "permissions": null + }, + { + "id": "5138dd8f31129121e96506e4f6e750a0", + "name": "TLif2btpzg079h15bk", + "username": "lxq123", + "password": "default", + "status": 1, + "telephone": null, + "lastLoginIp": "27.154.74.117", + "lastLoginTime": 1534816137636, + "creatorId": null, + "createTime": 1534319595416, + "merchantCode": "TLif2btpzg079h15bk", + "deleted": 0, + "roleId": "shopuser", + "role": { + "id": "shopuser", + "name": "商户", + "describe": "商户组", + "status": 1, + "creatorId": "system", + "createTime": 1533107680557, + "deleted": 0, + "permissions": [ + { + "roleId": "shopuser", + "permissionId": "comment", + "permissionName": "评论管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "feedback", + "permissionName": "反馈管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "goods", + "permissionName": "商品管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "member", + "permissionName": "会员管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "menu", + "permissionName": "菜单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "merchant", + "permissionName": "商家管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "order", + "permissionName": "订单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "permission", + "permissionName": "权限管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "role", + "permissionName": "角色管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "shop", + "permissionName": "店铺管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "table", + "permissionName": "桌子管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "user", + "permissionName": "用户管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + } + ] + }, + "permissions": null + }, + { + "id": "9cd287329ede459baaf75a36a2d77b7d", + "name": "yyyyyy", + "username": "yyyyy", + "password": "default", + "status": 1, + "telephone": null, + "lastLoginIp": "127.0.0.1", + "lastLoginTime": null, + "creatorId": null, + "createTime": 1532346665573, + "merchantCode": "123", + "deleted": 0, + "roleId": "admin", + "role": { + "id": "admin", + "name": "管理员", + "describe": "拥有所有权限", + "status": 1, + "creatorId": "system", + "createTime": 1497160610259, + "deleted": 0, + "permissions": [ + { + "roleId": "admin", + "permissionId": "comment", + "permissionName": "评论管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "feedback", + "permissionName": "反馈管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "goods", + "permissionName": "商品管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "member", + "permissionName": "会员管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "menu", + "permissionName": "菜单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "merchant", + "permissionName": "商家管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "order", + "permissionName": "订单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "permission", + "permissionName": "权限管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "role", + "permissionName": "角色管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "table", + "permissionName": "桌子管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "user", + "permissionName": "用户管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"},{\"action\":\"export\",\"defaultCheck\":false,\"describe\":\"导出\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + }, + { + "action": "export", + "describe": "导出", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + } + ] + }, + "permissions": null + }, + { + "id": "b8dcb4144a05b076f5bb07a9366e2c88", + "name": "言肆", + "username": "yladmxa", + "password": "default", + "status": 1, + "telephone": "", + "lastLoginIp": "27.154.27.120", + "lastLoginTime": 1533627970671, + "creatorId": "admin", + "createTime": 1497160610259, + "merchantCode": "TLif2btpzg079h15bk", + "deleted": 0, + "roleId": "admin", + "role": { + "id": "admin", + "name": "管理员", + "describe": "拥有所有权限", + "status": 1, + "creatorId": "system", + "createTime": 1497160610259, + "deleted": 0, + "permissions": [ + { + "roleId": "admin", + "permissionId": "comment", + "permissionName": "评论管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "feedback", + "permissionName": "反馈管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "goods", + "permissionName": "商品管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "member", + "permissionName": "会员管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "menu", + "permissionName": "菜单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "merchant", + "permissionName": "商家管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "order", + "permissionName": "订单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "permission", + "permissionName": "权限管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "role", + "permissionName": "角色管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "table", + "permissionName": "桌子管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "admin", + "permissionId": "user", + "permissionName": "用户管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"},{\"action\":\"export\",\"defaultCheck\":false,\"describe\":\"导出\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + }, + { + "action": "export", + "describe": "导出", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + } + ] + }, + "permissions": null + }, + { + "id": "test1", + "name": "test1", + "username": "test1", + "password": "default", + "status": 1, + "telephone": null, + "lastLoginIp": "127.0.0.1", + "lastLoginTime": 1533264475896, + "creatorId": "admin", + "createTime": 1497160610259, + "merchantCode": "TLif2btpzg079h15bk", + "deleted": 0, + "roleId": "shopuser", + "role": { + "id": "shopuser", + "name": "商户", + "describe": "商户组", + "status": 1, + "creatorId": "system", + "createTime": 1533107680557, + "deleted": 0, + "permissions": [ + { + "roleId": "shopuser", + "permissionId": "comment", + "permissionName": "评论管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "feedback", + "permissionName": "反馈管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "goods", + "permissionName": "商品管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "member", + "permissionName": "会员管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "menu", + "permissionName": "菜单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"import\",\"defaultCheck\":false,\"describe\":\"导入\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "import", + "describe": "导入", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "merchant", + "permissionName": "商家管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "order", + "permissionName": "订单管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "permission", + "permissionName": "权限管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "role", + "permissionName": "角色管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "shop", + "permissionName": "店铺管理", + "actions": "[{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"}]", + "actionEntitySet": [ + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "table", + "permissionName": "桌子管理", + "actions": "[{\"action\":\"add\",\"defaultCheck\":false,\"describe\":\"新增\"},{\"action\":\"query\",\"defaultCheck\":false,\"describe\":\"查询\"},{\"action\":\"get\",\"defaultCheck\":false,\"describe\":\"详情\"},{\"action\":\"update\",\"defaultCheck\":false,\"describe\":\"修改\"},{\"action\":\"delete\",\"defaultCheck\":false,\"describe\":\"删除\"}]", + "actionEntitySet": [ + { + "action": "add", + "describe": "新增", + "defaultCheck": false + }, + { + "action": "query", + "describe": "查询", + "defaultCheck": false + }, + { + "action": "get", + "describe": "详情", + "defaultCheck": false + }, + { + "action": "update", + "describe": "修改", + "defaultCheck": false + }, + { + "action": "delete", + "describe": "删除", + "defaultCheck": false + } + ], + "actionList": null, + "dataAccess": null + }, + { + "roleId": "shopuser", + "permissionId": "user", + "permissionName": "用户管理", + "actions": "[]", + "actionEntitySet": [], + "actionList": null, + "dataAccess": null + } + ] + }, + "permissions": null + } + ], + "pageSize": 10, + "pageNo": 0, + "totalPage": 1, + "totalCount": 7 + }, + "status": 200, + "timestamp": 1534955098193 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_activity.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_activity.json new file mode 100644 index 0000000..83c7321 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_activity.json @@ -0,0 +1,85 @@ +{ + "message": "", + "result": [ + { + "id": 1, + "user": { + "nickname": "Barbara Lee", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png" + }, + "project": { + "name": "白鹭酱油开发组", + "action": "更新", + "event": "番组计划" + }, + "time": "2018-08-23 14:47:00" + }, + { + "id": 1, + "user": { + "nickname": "蓝莓酱", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png" + }, + "project": { + "name": "白鹭酱油开发组", + "action": "更新", + "event": "番组计划" + }, + "time": "2018-08-23 09:35:37" + }, + { + "id": 1, + "user": { + "nickname": "Brian Young", + "avatar": "http://dummyimage.com/64x64" + }, + "project": { + "name": "白鹭酱油开发组", + "action": "创建", + "event": "番组计划" + }, + "time": "2017-05-27 00:00:00" + }, + { + "id": 1, + "user": { + "nickname": "曲丽丽", + "avatar": "http://dummyimage.com/64x64" + }, + "project": { + "name": "高逼格设计天团", + "action": "更新", + "event": "六月迭代" + }, + "time": "2018-08-23 14:47:00" + }, + { + "id": 1, + "user": { + "nickname": "Dorothy Thompson", + "avatar": "http://dummyimage.com/64x64" + }, + "project": { + "name": "高逼格设计天团", + "action": "created", + "event": "六月迭代" + }, + "time": "2018-08-23 14:47:00" + }, + { + "id": 1, + "user": { + "nickname": "曲丽丽", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png" + }, + "project": { + "name": "高逼格设计天团", + "action": "created", + "event": "六月迭代" + }, + "time": "2018-08-23 14:47:00" + } + ], + "status": 200, + "timestamp": 0 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_projects.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_projects.json new file mode 100644 index 0000000..7c9f8c2 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_projects.json @@ -0,0 +1,61 @@ +{ + "message": "", + "result": { + "data": [ + { + "id": 1, + "cover": "https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png", + "title": "Alipay", + "description": "那是一种内在的东西, 他们到达不了,也无法触及的", + "status": 1, + "updatedAt": "2018-07-26 00:00:00" + }, + { + "id": 2, + "cover": "https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png", + "title": "Angular", + "description": "希望是一个好东西,也许是最好的,好东西是不会消亡的", + "status": 1, + "updatedAt": "2018-07-26 00:00:00" + }, + { + "id": 3, + "cover": "https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png", + "title": "Ant Design", + "description": "城镇中有那么多的酒馆,她却偏偏走进了我的酒馆", + "status": 1, + "updatedAt": "2018-07-26 00:00:00" + }, + { + "id": 4, + "cover": "https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png", + "title": "Ant Design Pro", + "description": "那时候我只会想自己想要什么,从不想自己拥有什么", + "status": 1, + "updatedAt": "2018-07-26 00:00:00" + }, + { + "id": 5, + "cover": "https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png", + "title": "Bootstrap", + "description": "凛冬将至", + "status": 1, + "updatedAt": "2018-07-26 00:00:00" + }, + { + "id": 6, + "cover": "https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png", + "title": "Vue", + "description": "生命就像一盒巧克力,结果往往出人意料", + "status": 1, + "updatedAt": "2018-07-26 00:00:00" + } + ], + "pageSize": 10, + "pageNo": 1, + "totalPage": 6, + "totalCount": 57 + }, + "status": 200, + "timestamp": 1534955098193 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_radar.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_radar.json new file mode 100644 index 0000000..e9f7382 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_radar.json @@ -0,0 +1,43 @@ +{ + "message": "", + "result": [ + { + "item": "引用", + "个人": 70, + "团队": 30, + "部门": 40 + }, + { + "item": "口碑", + "个人": 60, + "团队": 70, + "部门": 40 + }, + { + "item": "产量", + "个人": 50, + "团队": 60, + "部门": 40 + }, + { + "item": "贡献", + "个人": 40, + "团队": 50, + "部门": 40 + }, + { + "item": "热度", + "个人": 60, + "团队": 70, + "部门": 40 + }, + { + "item": "引用", + "个人": 70, + "团队": 50, + "部门": 40 + } + ], + "status": 200, + "timestamp": 1534955098193 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_teams.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_teams.json new file mode 100644 index 0000000..043ce0d --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/workplace_teams.json @@ -0,0 +1,32 @@ +{ + "message": "", + "result": [ + { + "id": 1, + "name": "科学搬砖组", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png" + }, + { + "id": 2, + "name": "程序员日常", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png" + }, + { + "id": 1, + "name": "设计天团", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png" + }, + { + "id": 1, + "name": "中二少女团", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/ubnKSIfAJTxIgXOKlciN.png" + }, + { + "id": 1, + "name": "骗你学计算机", + "avatar": "https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png" + } + ], + "status": 200, + "timestamp": 0 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/AutoController.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/AutoController.java new file mode 100644 index 0000000..acbab15 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/AutoController.java @@ -0,0 +1,42 @@ +package org.jeecg.modules.demo.test.controller; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; +import lombok.extern.slf4j.Slf4j; + +/** + * @Description: auto/cgform + * @author: scott + * @date: 2019-01-30 + * @version:V1.0 + */ +@RestController +@RequestMapping("/auto/cgform") +@Slf4j +public class AutoController { + + @GetMapping(value = "/list") + public ModelAndView list(HttpServletRequest request, HttpServletResponse response,ModelAndView modelAndView) { + HttpSession session = request.getSession(); + log.info(" session id = " + session.getId()); + + modelAndView.setViewName("demo3"); + List<String> userList = new ArrayList<String>(); + userList.add("admin"); + userList.add("user1"); + userList.add("user2"); + log.info("--------------test--------------"); + modelAndView.addObject("userList", userList); + modelAndView.addObject("sessionid", session.getId()); + return modelAndView; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java new file mode 100644 index 0000000..0360bf7 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java @@ -0,0 +1,296 @@ +package org.jeecg.modules.demo.test.controller; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.util.DateUtils; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.common.util.superSearch.ObjectParseUtil; +import org.jeecg.common.util.superSearch.QueryRuleEnum; +import org.jeecg.common.util.superSearch.QueryRuleVo; +import org.jeecg.modules.demo.test.entity.JeecgDemo; +import org.jeecg.modules.demo.test.service.IJeecgDemoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; + +/** + * @Title: Controller + * @Description: 测试demo + * @author: jeecg-boot + * @date: 2018-12-29 + * @version:V1.0 + */ +@RestController +@RequestMapping("/test/jeecgDemo") +@Slf4j +public class JeecgDemoController { + @Autowired + private IJeecgDemoService jeecgDemoService; + + @Autowired + private RedisUtil redisUtil; + + /** + * 分页列表查询 + * + * @param jeecgDemo + * @param pageNo + * @param pageSize + * @param req + * @return + */ + + @ApiOperation(value = "获取Demo数据列表", notes = "获取所有Demo数据列表", produces = "application/json") + @GetMapping(value = "/list") + public Result<IPage<JeecgDemo>> list(JeecgDemo jeecgDemo, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + Result<IPage<JeecgDemo>> result = new Result<IPage<JeecgDemo>>(); + QueryWrapper<JeecgDemo> queryWrapper = null; + //================================================================================ + //高级组合查询 + try { + String superQueryParams = req.getParameter("superQueryParams"); + if(oConvertUtils.isNotEmpty(superQueryParams)) { + // 解码 + superQueryParams = URLDecoder.decode(superQueryParams, "UTF-8"); + List<QueryRuleVo> userList = JSON.parseArray(superQueryParams, QueryRuleVo.class); + log.info(superQueryParams); + queryWrapper = new QueryWrapper<JeecgDemo>(); + for (QueryRuleVo rule : userList) { + if(oConvertUtils.isNotEmpty(rule.getField()) && oConvertUtils.isNotEmpty(rule.getRule()) && oConvertUtils.isNotEmpty(rule.getVal())){ + ObjectParseUtil.addCriteria(queryWrapper, rule.getField(), QueryRuleEnum.getByValue(rule.getRule()), rule.getVal()); + } + } + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + //================================================================================ + + // 手工转换实体驼峰字段为下划线分隔表字段 + queryWrapper = queryWrapper==null?new QueryWrapper<JeecgDemo>(jeecgDemo):queryWrapper; + Page<JeecgDemo> page = new Page<JeecgDemo>(pageNo, pageSize); + + // 排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if ("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + } else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + + IPage<JeecgDemo> pageList = jeecgDemoService.page(page, queryWrapper); +// log.info("查询当前页:" + pageList.getCurrent()); +// log.info("查询当前页数量:" + pageList.getSize()); +// log.info("查询结果数量:" + pageList.getRecords().size()); +// log.info("数据总数:" + pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * + * @param jeecgDemo + * @return + */ + @PostMapping(value = "/add") + @AutoLog(value = "添加测试DEMO") + public Result<JeecgDemo> add(@RequestBody JeecgDemo jeecgDemo) { + Result<JeecgDemo> result = new Result<JeecgDemo>(); + try { + jeecgDemoService.save(jeecgDemo); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * + * @param jeecgDemo + * @return + */ + @PutMapping(value = "/edit") + public Result<JeecgDemo> eidt(@RequestBody JeecgDemo jeecgDemo) { + Result<JeecgDemo> result = new Result<JeecgDemo>(); + JeecgDemo jeecgDemoEntity = jeecgDemoService.getById(jeecgDemo.getId()); + if (jeecgDemoEntity == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = jeecgDemoService.updateById(jeecgDemo); + // TODO 返回false说明什么? + if (ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "删除测试DEMO") + @DeleteMapping(value = "/delete") + public Result<JeecgDemo> delete(@RequestParam(name = "id", required = true) String id) { + Result<JeecgDemo> result = new Result<JeecgDemo>(); + JeecgDemo jeecgDemo = jeecgDemoService.getById(id); + if (jeecgDemo == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = jeecgDemoService.removeById(id); + if (ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<JeecgDemo> deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + Result<JeecgDemo> result = new Result<JeecgDemo>(); + if (ids == null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + } else { + this.jeecgDemoService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @ApiOperation(value = "获取Demo信息", tags = { "获取Demo信息" }, notes = "注意问题点") + @GetMapping(value = "/queryById") + public Result<JeecgDemo> queryById(@ApiParam(name = "id", value = "示例id", required = true) @RequestParam(name = "id", required = true) String id) { + Result<JeecgDemo> result = new Result<JeecgDemo>(); + JeecgDemo jeecgDemo = jeecgDemoService.getById(id); + if (jeecgDemo == null) { + result.error500("未找到对应实体"); + } else { + result.setResult(jeecgDemo); + result.setSuccess(true); + } + return result; + } + + + // ================================================================================================================ + /** + * redis操作 -- set + */ + @GetMapping(value = "/redisSet") + public void redisSet() { + redisUtil.set("name", "张三" + DateUtils.now()); + } + + /** + * redis操作 -- get + */ + @GetMapping(value = "/redisGet") + public String redisGet() { + return (String) redisUtil.get("name"); + } + + /** + * redis操作 -- setObj + */ + @GetMapping(value = "/redisSetObj") + public void redisSetObj() { + JeecgDemo p = new JeecgDemo(); + p.setAge(10); + p.setBirthday(new Date()); + p.setContent("hello"); + p.setName("张三"); + p.setSex("男"); + redisUtil.set("user-zdh", p); + } + + /** + * redis操作 -- setObj + */ + @GetMapping(value = "/redisGetObj") + public Object redisGetObj() { + return redisUtil.get("user-zdh"); + } + + /** + * redis操作 -- get + */ + @GetMapping(value = "/redisDemo/{id}") + public JeecgDemo redisGetJeecgDemo(@PathVariable("id") String id) { + JeecgDemo t = jeecgDemoService.getByIdCacheable(id); + System.out.println(t); + return t; + } + + /** + * freemaker方式 【页面路径: src/main/resources/templates】 + * + * @param modelAndView + * @return + */ + @RequestMapping("/demo3") + public ModelAndView demo3(ModelAndView modelAndView) { + modelAndView.setViewName("demo3"); + List<String> userList = new ArrayList<String>(); + userList.add("admin"); + userList.add("user1"); + userList.add("user2"); + log.info("--------------test--------------"); + modelAndView.addObject("userList", userList); + return modelAndView; + } + + // ================================================================================================================ + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderDMainController.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderDMainController.java new file mode 100644 index 0000000..841f34d --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderDMainController.java @@ -0,0 +1,404 @@ +package org.jeecg.modules.demo.test.controller; + +import java.util.Arrays; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; +import org.jeecg.modules.demo.test.entity.JeecgOrderMain; +import org.jeecg.modules.demo.test.entity.JeecgOrderTicket; +import org.jeecg.modules.demo.test.service.IJeecgOrderCustomerService; +import org.jeecg.modules.demo.test.service.IJeecgOrderMainService; +import org.jeecg.modules.demo.test.service.IJeecgOrderTicketService; +import org.jeecg.modules.demo.test.vo.JeecgOrderMainPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + * @Title: Controller + * @Description: 订单模拟 + * @author: ZhiLin + * @Date: 2019-02-20 + * @version: v1.0 + */ +@Slf4j +@RestController +@RequestMapping("/test/order") +public class JeecgOrderDMainController { + @Autowired + private IJeecgOrderMainService jeecgOrderMainService; + @Autowired + private IJeecgOrderCustomerService jeecgOrderCustomerService; + @Autowired + private IJeecgOrderTicketService jeecgOrderTicketService; + @Autowired + private IJeecgOrderCustomerService customerService; + @Autowired + private IJeecgOrderTicketService ticketService; + + /** + * 分页列表查询 + * @param jeecgOrderMain + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/orderList") + public Result<IPage<JeecgOrderMain>> respondePagedData(JeecgOrderMain jeecgOrderMain, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req){ + Result<IPage<JeecgOrderMain>> result = new Result<IPage<JeecgOrderMain>>(); + QueryWrapper<JeecgOrderMain> queryWrapper = new QueryWrapper<JeecgOrderMain>(jeecgOrderMain); + Page<JeecgOrderMain> page = new Page<JeecgOrderMain>(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + IPage<JeecgOrderMain> pageList = jeecgOrderMainService.page(page, queryWrapper); + //log.debug("查询当前页:"+pageList.getCurrent()); + //log.debug("查询当前页数量:"+pageList.getSize()); + //log.debug("查询结果数量:"+pageList.getRecords().size()); + //log.debug("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param jeecgOrderMainPage + * @return + */ + @PostMapping(value = "/add") + public Result<JeecgOrderMain> add(@RequestBody JeecgOrderMainPage jeecgOrderMainPage){ + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + try { + jeecgOrderMainService.saveMain(jeecgOrderMainPage.getJeecgOrderMain(), jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList());; + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param jeecgOrderMainPage + * @return + */ + @PutMapping("/edit") + public Result<JeecgOrderMain> edit(@RequestBody JeecgOrderMainPage jeecgOrderMainPage){ + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + JeecgOrderMain jeecgOrderMain = jeecgOrderMainPage.getJeecgOrderMain(); + JeecgOrderMain jeecgOrderMainEntity = jeecgOrderMainService.getById(jeecgOrderMain.getId()); + if(jeecgOrderMainEntity==null) { + result.error500("未找到对应实体"); + }else { + jeecgOrderMainService.updateMain(jeecgOrderMain, jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList()); + result.success("修改成功!"); + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result<JeecgOrderMain> delete(@RequestParam(name = "id",required = true) String id){ + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + JeecgOrderMain jeecgOrderMain = jeecgOrderMainService.getById(id); + if(jeecgOrderMain==null) { + result.error500("未找到对应实体"); + }else { + jeecgOrderMainService.delMain(id); + result.success("删除成功!"); + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<JeecgOrderMain> deleteBatch(@RequestParam(name = "ids", required = true) String ids){ + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.jeecgOrderMainService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result<JeecgOrderMain> queryById(@RequestParam(name = "id", required = true) String id){ + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + JeecgOrderMain jeecgOrderMain = jeecgOrderMainService.getById(id); + if(jeecgOrderMain==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(jeecgOrderMain); + result.setSuccess(true); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryOrderCustomerListByMainId") + public Result<List<JeecgOrderCustomer>> queryOrderCustomerListByMainId(@RequestParam(name="id",required=true) String id){ + Result<List<JeecgOrderCustomer>> result = new Result<List<JeecgOrderCustomer>>(); + List<JeecgOrderCustomer> jeecgOrderCustomerList = jeecgOrderCustomerService.selectCustomersByMainId(id); + result.setResult(jeecgOrderCustomerList); + result.setSuccess(true); + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryOrderTicketListByMainId") + public Result<List<JeecgOrderTicket>> queryOrderTicketListByMainId(@RequestParam(name="id",required=true) String id) { + Result<List<JeecgOrderTicket>> result = new Result<List<JeecgOrderTicket>>(); + List<JeecgOrderTicket> jeecgOrderTicketList = jeecgOrderTicketService.selectTicketsByMainId(id); + result.setResult(jeecgOrderTicketList); + result.setSuccess(true); + return result; + } + +// ================================以下是客户信息相关的API================================= + /** + * 添加 + * @param jeecgOrderCustomer + * @return + */ + @PostMapping(value = "/addCustomer") + public Result<JeecgOrderCustomer> addCustomer(@RequestBody JeecgOrderCustomer jeecgOrderCustomer){ + Result<JeecgOrderCustomer> result = new Result<>(); + try { + boolean ok = customerService.save(jeecgOrderCustomer); + if(ok) { + result.setSuccess(true); + result.setMessage("添加数据成功"); + }else { + result.setSuccess(false); + result.setMessage("添加数据失败"); + } + return result; + }catch(Exception e) { + e.fillInStackTrace(); + result.setSuccess(false); + result.setMessage("遇到问题了!"); + return result; + } + + } + + /** + * 编辑 + * @param jeecgOrderCustomer + * @return + */ + @PutMapping("/editCustomer") + public Result<JeecgOrderCustomer> editCustomer(@RequestBody JeecgOrderCustomer jeecgOrderCustomer){ + Result<JeecgOrderCustomer> result = new Result<>(); + try { + boolean ok = customerService.updateById(jeecgOrderCustomer); + if(ok) { + result.setSuccess(true); + result.setMessage("更新成功"); + }else{ + result.setSuccess(false); + result.setMessage("更新失败"); + } + return result; + }catch(Exception e) { + e.fillInStackTrace(); + result.setSuccess(true); + result.setMessage("更新中碰到异常了"); + return result; + } + + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/deleteCustomer") + public Result<JeecgOrderCustomer> deleteCustomer(@RequestParam(name = "id",required = true) String id){ + Result<JeecgOrderCustomer> result = new Result<>(); + try { + boolean ok = customerService.removeById(id); + if(ok) { + result.setSuccess(true); + result.setMessage("删除成功"); + }else { + result.setSuccess(false); + result.setMessage("删除失败"); + } + return result; + }catch(Exception e) { + e.fillInStackTrace(); + result.setSuccess(false); + result.setMessage("删除过程中碰到异常了"); + return result; + } + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatchCustomer") + public Result<JeecgOrderCustomer> deleteBatchCustomer(@RequestParam(name = "ids", required = true) String ids){ + Result<JeecgOrderCustomer> result = new Result<JeecgOrderCustomer>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.customerService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } +//===========================以下是机票的相关API==================================== + /** + * 添加 + * @param jeecgOrderTicket + * @return + */ + @PostMapping(value = "/addTicket") + public Result<JeecgOrderTicket> addTicket(@RequestBody JeecgOrderTicket jeecgOrderTicket){ + Result<JeecgOrderTicket> result = new Result<>(); + try { + boolean ok = ticketService.save(jeecgOrderTicket); + if(ok) { + result.setSuccess(true); + result.setMessage("添加机票信息成功."); + }else { + result.setSuccess(false); + result.setMessage("添加机票信息失败!"); + } + return result; + }catch(Exception e) { + e.fillInStackTrace(); + result.setSuccess(false); + result.setMessage("添加机票信息过程中出现了异常: "+e.getMessage()); + return result; + } + + } + + /** + * 编辑 + * @param jeecgOrderTicket + * @return + */ + @PutMapping("/editTicket") + public Result<JeecgOrderTicket> editTicket(@RequestBody JeecgOrderTicket jeecgOrderTicket){ + Result<JeecgOrderTicket> result = new Result<>(); + try { + boolean ok = ticketService.updateById(jeecgOrderTicket); + if(ok) { + result.setSuccess(true); + result.setMessage("更新数据成功."); + }else { + result.setSuccess(false); + result.setMessage("更新机票 信息失败!"); + } + return result; + }catch(Exception e) { + result.setSuccess(false); + result.setMessage("更新数据过程中出现异常啦: " + e.getMessage()); + return result; + } + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/deleteTicket") + public Result<JeecgOrderTicket> deleteTicket(@RequestParam(name = "id",required = true) String id){ + Result<JeecgOrderTicket> result = new Result<>(); + try { + boolean ok = ticketService.removeById(id); + if(ok) { + result.setSuccess(true); + result.setMessage("删除机票信息成功."); + }else { + result.setSuccess(false); + result.setMessage("删除机票信息失败!"); + } + return result; + }catch(Exception e) { + result.setSuccess(false); + result.setMessage("删除机票信息过程中出现异常啦: " + e.getMessage()); + return result; + } + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatchTicket") + public Result<JeecgOrderTicket> deleteBatchTicket(@RequestParam(name = "ids", required = true) String ids){ + Result<JeecgOrderTicket> result = new Result<JeecgOrderTicket>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.ticketService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + } \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java new file mode 100644 index 0000000..725ec15 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java @@ -0,0 +1,205 @@ +package org.jeecg.modules.demo.test.controller; + +import java.util.Arrays; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; +import org.jeecg.modules.demo.test.entity.JeecgOrderMain; +import org.jeecg.modules.demo.test.entity.JeecgOrderTicket; +import org.jeecg.modules.demo.test.service.IJeecgOrderCustomerService; +import org.jeecg.modules.demo.test.service.IJeecgOrderMainService; +import org.jeecg.modules.demo.test.service.IJeecgOrderTicketService; +import org.jeecg.modules.demo.test.vo.JeecgOrderMainPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + + /** + * @Title: Controller + * @Description: 订单 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +@RestController +@RequestMapping("/test/jeecgOrderMain") +@Slf4j +public class JeecgOrderMainController { + @Autowired + private IJeecgOrderMainService jeecgOrderMainService; + @Autowired + private IJeecgOrderCustomerService jeecgOrderCustomerService; + @Autowired + private IJeecgOrderTicketService jeecgOrderTicketService; + + /** + * 分页列表查询 + * @param jeecgOrderMain + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/list") + public Result<IPage<JeecgOrderMain>> queryPageList(JeecgOrderMain jeecgOrderMain, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result<IPage<JeecgOrderMain>> result = new Result<IPage<JeecgOrderMain>>(); + QueryWrapper<JeecgOrderMain> queryWrapper = new QueryWrapper<JeecgOrderMain>(jeecgOrderMain); + Page<JeecgOrderMain> page = new Page<JeecgOrderMain>(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + IPage<JeecgOrderMain> pageList = jeecgOrderMainService.page(page, queryWrapper); + //log.debug("查询当前页:"+pageList.getCurrent()); + //log.debug("查询当前页数量:"+pageList.getSize()); + //log.debug("查询结果数量:"+pageList.getRecords().size()); + //log.debug("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param jeecgOrderMain + * @return + */ + @PostMapping(value = "/add") + public Result<JeecgOrderMain> add(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) { + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + try { + jeecgOrderMainService.saveMain(jeecgOrderMainPage.getJeecgOrderMain(), jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList());; + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param jeecgOrderMain + * @return + */ + @PutMapping(value = "/edit") + public Result<JeecgOrderMain> eidt(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) { + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + JeecgOrderMain jeecgOrderMain = jeecgOrderMainPage.getJeecgOrderMain(); + JeecgOrderMain jeecgOrderMainEntity = jeecgOrderMainService.getById(jeecgOrderMain.getId()); + if(jeecgOrderMainEntity==null) { + result.error500("未找到对应实体"); + }else { + jeecgOrderMainService.updateMain(jeecgOrderMain, jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList()); + result.success("修改成功!"); + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result<JeecgOrderMain> delete(@RequestParam(name="id",required=true) String id) { + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + JeecgOrderMain jeecgOrderMain = jeecgOrderMainService.getById(id); + if(jeecgOrderMain==null) { + result.error500("未找到对应实体"); + }else { + jeecgOrderMainService.delMain(id); + result.success("删除成功!"); + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<JeecgOrderMain> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.jeecgOrderMainService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result<JeecgOrderMain> queryById(@RequestParam(name="id",required=true) String id) { + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + JeecgOrderMain jeecgOrderMain = jeecgOrderMainService.getById(id); + if(jeecgOrderMain==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(jeecgOrderMain); + result.setSuccess(true); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryOrderCustomerListByMainId") + public Result<List<JeecgOrderCustomer>> queryOrderCustomerListByMainId(@RequestParam(name="id",required=true) String id) { + Result<List<JeecgOrderCustomer>> result = new Result<List<JeecgOrderCustomer>>(); + List<JeecgOrderCustomer> jeecgOrderCustomerList = jeecgOrderCustomerService.selectCustomersByMainId(id); + result.setResult(jeecgOrderCustomerList); + result.setSuccess(true); + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryOrderTicketListByMainId") + public Result<List<JeecgOrderTicket>> queryOrderTicketListByMainId(@RequestParam(name="id",required=true) String id) { + Result<List<JeecgOrderTicket>> result = new Result<List<JeecgOrderTicket>>(); + List<JeecgOrderTicket> jeecgOrderTicketList = jeecgOrderTicketService.selectTicketsByMainId(id); + result.setResult(jeecgOrderTicketList); + result.setSuccess(true); + return result; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java new file mode 100644 index 0000000..0cb2d41 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java @@ -0,0 +1,62 @@ +package org.jeecg.modules.demo.test.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: jeecg 测试demo + * @author: jeecg-boot + * @date: 2018-12-29 + * @version:V1.0 + */ +@Data +@TableName("demo") +public class JeecgDemo implements Serializable { + private static final long serialVersionUID = 1L; + + /** 主键ID */ + @TableId(type = IdType.UUID) + private java.lang.String id; + /** 姓名 */ + private java.lang.String name; + /** 关键词 */ + private java.lang.String keyWord; + /** 打卡时间 */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date punchTime; + /** 工资 */ + private java.math.BigDecimal salaryMoney; + /** 奖金 */ + private java.lang.Double bonusMoney; + /** 性别 {男:1,女:2} */ + private java.lang.String sex; + /** 年龄 */ + private java.lang.Integer age; + /** 生日 */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private java.util.Date birthday; + /** 邮箱 */ + private java.lang.String email; + /** 个人简介 */ + private java.lang.String content; + /** createTime */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /** 创建人 */ + private String createBy; + /** 更新人 */ + private String updateBy; + /** 更新时间 */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.java new file mode 100644 index 0000000..4493db0 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.java @@ -0,0 +1,50 @@ +package org.jeecg.modules.demo.test.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: 订单客户 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +@Data +@TableName("jeecg_order_customer") +public class JeecgOrderCustomer implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.UUID) + private java.lang.String id; + /**客户名*/ + private java.lang.String name; + /**性别*/ + private java.lang.String sex; + /**身份证号码*/ + private java.lang.String idcard; + /**身份证扫描件*/ + private java.lang.String idcardPic; + /**电话1*/ + private java.lang.String telphone; + /**外键*/ + private java.lang.String orderId; + /**创建人*/ + private java.lang.String createBy; + /**创建时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**修改人*/ + private java.lang.String updateBy; + /**修改时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderMain.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderMain.java new file mode 100644 index 0000000..7c1fa63 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderMain.java @@ -0,0 +1,50 @@ +package org.jeecg.modules.demo.test.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: 订单 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +@Data +@TableName("jeecg_order_main") +public class JeecgOrderMain implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.UUID) + private java.lang.String id; + /**订单号*/ + private java.lang.String orderCode; + /**订单类型*/ + private java.lang.String ctype; + /**订单日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date orderDate; + /**订单金额*/ + private java.lang.Double orderMoney; + /**订单备注*/ + private java.lang.String content; + /**创建人*/ + private java.lang.String createBy; + /**创建时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**修改人*/ + private java.lang.String updateBy; + /**修改时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderTicket.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderTicket.java new file mode 100644 index 0000000..9aec8df --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderTicket.java @@ -0,0 +1,46 @@ +package org.jeecg.modules.demo.test.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: 订单机票 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +@Data +@TableName("jeecg_order_ticket") +public class JeecgOrderTicket implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.UUID) + private java.lang.String id; + /**航班号*/ + private java.lang.String ticketCode; + /**航班时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date tickectDate; + /**外键*/ + private java.lang.String orderId; + /**创建人*/ + private java.lang.String createBy; + /**创建时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**修改人*/ + private java.lang.String updateBy; + /**修改时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java new file mode 100644 index 0000000..d50d563 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.demo.test.mapper; + +import java.util.List; +import org.jeecg.modules.demo.test.entity.JeecgDemo; +import org.springframework.data.repository.query.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: jeecg 测试demo + * @author: jeecg-boot + * @date: 2018-12-29 + * @version: V1.0 + */ +public interface JeecgDemoMapper extends BaseMapper<JeecgDemo> { + + public List<JeecgDemo> getDemoByName(@Param("name") String name); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java new file mode 100644 index 0000000..f3ab0de --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java @@ -0,0 +1,29 @@ +package org.jeecg.modules.demo.test.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Select; +import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 订单客户 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +public interface JeecgOrderCustomerMapper extends BaseMapper<JeecgOrderCustomer> { + + /** + * 通过主表外键批量删除客户 + * @param mainId + * @return + */ + @Delete("DELETE FROM JEECG_ORDER_CUSTOMER WHERE ORDER_ID = #{mainId}") + public boolean deleteCustomersByMainId(String mainId); + + @Select("SELECT * FROM JEECG_ORDER_CUSTOMER WHERE ORDER_ID = #{mainId}") + public List<JeecgOrderCustomer> selectCustomersByMainId(String mainId); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderMainMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderMainMapper.java new file mode 100644 index 0000000..a47f53b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderMainMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.test.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.test.entity.JeecgOrderMain; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 订单 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +public interface JeecgOrderMainMapper extends BaseMapper<JeecgOrderMain> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderTicketMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderTicketMapper.java new file mode 100644 index 0000000..0eb93ea --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderTicketMapper.java @@ -0,0 +1,29 @@ +package org.jeecg.modules.demo.test.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Select; +import org.jeecg.modules.demo.test.entity.JeecgOrderTicket; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 订单机票 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +public interface JeecgOrderTicketMapper extends BaseMapper<JeecgOrderTicket> { + + /** + * 通过主表外键批量删除客户 + * @param mainId + * @return + */ + @Delete("DELETE FROM JEECG_ORDER_TICKET WHERE ORDER_ID = #{mainId}") + public boolean deleteTicketsByMainId(String mainId); + + + @Select("SELECT * FROM JEECG_ORDER_TICKET WHERE ORDER_ID = #{mainId}") + public List<JeecgOrderTicket> selectTicketsByMainId(String mainId); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml new file mode 100644 index 0000000..9f4fe89 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.demo.test.mapper.JeecgDemoMapper"> + + <!-- 根据用户名查询 --> + <select id="getDemoByName" resultType="org.jeecg.modules.demo.test.entity.JeecgDemo"> + select * from demo where name = #{name} + </select> +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderCustomerMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderCustomerMapper.xml new file mode 100644 index 0000000..759b03f --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderCustomerMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.demo.test.mapper.JeecgOrderCustomerMapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderMainMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderMainMapper.xml new file mode 100644 index 0000000..ec2d056 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderMainMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.demo.test.mapper.JeecgOrderMainMapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderTicketMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderTicketMapper.xml new file mode 100644 index 0000000..46530bd --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderTicketMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.demo.test.mapper.JeecgOrderTicketMapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDemoService.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDemoService.java new file mode 100644 index 0000000..ced19ea --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDemoService.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.test.service; + +import org.jeecg.modules.demo.test.entity.JeecgDemo; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: jeecg 测试demo + * @author: jeecg-boot + * @date: 2018-12-29 + * @version: V1.0 + */ +public interface IJeecgDemoService extends IService<JeecgDemo> { + public void testTran(); + + public JeecgDemo getByIdCacheable(String id); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderCustomerService.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderCustomerService.java new file mode 100644 index 0000000..70682fa --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderCustomerService.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.demo.test.service; + +import java.util.List; + +import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 订单客户 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +public interface IJeecgOrderCustomerService extends IService<JeecgOrderCustomer> { + + public List<JeecgOrderCustomer> selectCustomersByMainId(String mainId); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderMainService.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderMainService.java new file mode 100644 index 0000000..bdd4c28 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderMainService.java @@ -0,0 +1,44 @@ +package org.jeecg.modules.demo.test.service; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; +import org.jeecg.modules.demo.test.entity.JeecgOrderMain; +import org.jeecg.modules.demo.test.entity.JeecgOrderTicket; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 订单 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +public interface IJeecgOrderMainService extends IService<JeecgOrderMain> { + + /** + * 添加一对多 + * + */ + public void saveMain(JeecgOrderMain jeecgOrderMain,List<JeecgOrderCustomer> jeecgOrderCustomerList,List<JeecgOrderTicket> jeecgOrderTicketList) ; + + /** + * 修改一对多 + * + */ + public void updateMain(JeecgOrderMain jeecgOrderMain,List<JeecgOrderCustomer> jeecgOrderCustomerList,List<JeecgOrderTicket> jeecgOrderTicketList); + + /** + * 删除一对多 + * @param jformOrderMain + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * @param jformOrderMain + */ + public void delBatchMain (Collection<? extends Serializable> idList); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderTicketService.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderTicketService.java new file mode 100644 index 0000000..11aa645 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderTicketService.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.demo.test.service; + +import java.util.List; + +import org.jeecg.modules.demo.test.entity.JeecgOrderTicket; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 订单机票 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +public interface IJeecgOrderTicketService extends IService<JeecgOrderTicket> { + + public List<JeecgOrderTicket> selectTicketsByMainId(String mainId); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java new file mode 100644 index 0000000..0a1ad74 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java @@ -0,0 +1,61 @@ +package org.jeecg.modules.demo.test.service.impl; + +import org.jeecg.modules.demo.test.entity.JeecgDemo; +import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper; +import org.jeecg.modules.demo.test.service.IJeecgDemoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: jeecg 测试demo + * @author: jeecg-boot + * @date: 2018-12-29 + * @version: V1.0 + */ +@Service +public class JeecgDemoServiceImpl extends ServiceImpl<JeecgDemoMapper, JeecgDemo> implements IJeecgDemoService { + @Autowired + JeecgDemoMapper jeecgDemoMapper; + + + /** + * 事务控制在service层面 + * 加上注解:@Transactional,声明的方法就是一个独立的事务(有异常DB操作全部回滚) + */ + @Transactional + public void testTran() { + JeecgDemo pp = new JeecgDemo(); + pp.setAge(1111); + pp.setName("测试事务 小白兔 1"); + jeecgDemoMapper.insert(pp); + + JeecgDemo pp2 = new JeecgDemo(); + pp2.setAge(2222); + pp2.setName("测试事务 小白兔 2"); + jeecgDemoMapper.insert(pp2); + + Integer.parseInt("hello");//自定义异常 + + JeecgDemo pp3 = new JeecgDemo(); + pp3.setAge(3333); + pp3.setName("测试事务 小白兔 3"); + jeecgDemoMapper.insert(pp3); + return ; + } + + + /** + * 缓存注解测试: redis + */ + @Cacheable(cacheNames="jeecgDemo", key="#id") + public JeecgDemo getByIdCacheable(String id) { + JeecgDemo t = jeecgDemoMapper.selectById(id); + System.err.println(t); + return t; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderCustomerServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderCustomerServiceImpl.java new file mode 100644 index 0000000..bb9931b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderCustomerServiceImpl.java @@ -0,0 +1,30 @@ +package org.jeecg.modules.demo.test.service.impl; + +import java.util.List; + +import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; +import org.jeecg.modules.demo.test.mapper.JeecgOrderCustomerMapper; +import org.jeecg.modules.demo.test.service.IJeecgOrderCustomerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 订单客户 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +@Service +public class JeecgOrderCustomerServiceImpl extends ServiceImpl<JeecgOrderCustomerMapper, JeecgOrderCustomer> implements IJeecgOrderCustomerService { + + @Autowired + private JeecgOrderCustomerMapper jeecgOrderCustomerMapper; + + @Override + public List<JeecgOrderCustomer> selectCustomersByMainId(String mainId) { + return jeecgOrderCustomerMapper.selectCustomersByMainId(mainId); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderMainServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderMainServiceImpl.java new file mode 100644 index 0000000..c301d7c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderMainServiceImpl.java @@ -0,0 +1,88 @@ +package org.jeecg.modules.demo.test.service.impl; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; +import org.jeecg.modules.demo.test.entity.JeecgOrderMain; +import org.jeecg.modules.demo.test.entity.JeecgOrderTicket; +import org.jeecg.modules.demo.test.mapper.JeecgOrderCustomerMapper; +import org.jeecg.modules.demo.test.mapper.JeecgOrderMainMapper; +import org.jeecg.modules.demo.test.mapper.JeecgOrderTicketMapper; +import org.jeecg.modules.demo.test.service.IJeecgOrderMainService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 订单 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +@Service +public class JeecgOrderMainServiceImpl extends ServiceImpl<JeecgOrderMainMapper, JeecgOrderMain> implements IJeecgOrderMainService { + + @Autowired + private JeecgOrderMainMapper jeecgOrderMainMapper; + @Autowired + private JeecgOrderCustomerMapper jeecgOrderCustomerMapper; + @Autowired + private JeecgOrderTicketMapper jeecgOrderTicketMapper; + + @Override + @Transactional + public void saveMain(JeecgOrderMain jeecgOrderMain, List<JeecgOrderCustomer> jeecgOrderCustomerList, List<JeecgOrderTicket> jeecgOrderTicketList) { + jeecgOrderMainMapper.insert(jeecgOrderMain); + for(JeecgOrderCustomer entity:jeecgOrderCustomerList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderCustomerMapper.insert(entity); + } + for(JeecgOrderTicket entity:jeecgOrderTicketList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderTicketMapper.insert(entity); + } + } + + @Override + @Transactional + public void updateMain(JeecgOrderMain jeecgOrderMain, List<JeecgOrderCustomer> jeecgOrderCustomerList, List<JeecgOrderTicket> jeecgOrderTicketList) { + jeecgOrderMainMapper.updateById(jeecgOrderMain); + + //1.先删除子表数据 + jeecgOrderTicketMapper.deleteTicketsByMainId(jeecgOrderMain.getId()); + jeecgOrderCustomerMapper.deleteCustomersByMainId(jeecgOrderMain.getId()); + + //2.子表数据重新插入 + for(JeecgOrderCustomer entity:jeecgOrderCustomerList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderCustomerMapper.insert(entity); + } + for(JeecgOrderTicket entity:jeecgOrderTicketList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderTicketMapper.insert(entity); + } + } + + @Override + @Transactional + public void delMain(String id) { + jeecgOrderMainMapper.deleteById(id); + jeecgOrderTicketMapper.deleteTicketsByMainId(id); + jeecgOrderCustomerMapper.deleteCustomersByMainId(id); + } + + @Override + @Transactional + public void delBatchMain(Collection<? extends Serializable> idList) { + for(Serializable id:idList) { + jeecgOrderMainMapper.deleteById(id); + jeecgOrderTicketMapper.deleteTicketsByMainId(id.toString()); + jeecgOrderCustomerMapper.deleteCustomersByMainId(id.toString()); + } + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderTicketServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderTicketServiceImpl.java new file mode 100644 index 0000000..af221cf --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderTicketServiceImpl.java @@ -0,0 +1,29 @@ +package org.jeecg.modules.demo.test.service.impl; + +import java.util.List; + +import org.jeecg.modules.demo.test.entity.JeecgOrderTicket; +import org.jeecg.modules.demo.test.mapper.JeecgOrderTicketMapper; +import org.jeecg.modules.demo.test.service.IJeecgOrderTicketService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 订单机票 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +@Service +public class JeecgOrderTicketServiceImpl extends ServiceImpl<JeecgOrderTicketMapper, JeecgOrderTicket> implements IJeecgOrderTicketService { + @Autowired + private JeecgOrderTicketMapper jeecgOrderTicketMapper; + + @Override + public List<JeecgOrderTicket> selectTicketsByMainId(String mainId) { + return jeecgOrderTicketMapper.selectTicketsByMainId(mainId); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java new file mode 100644 index 0000000..0a6bf62 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java @@ -0,0 +1,16 @@ +package org.jeecg.modules.demo.test.vo; + +import java.util.List; +import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; +import org.jeecg.modules.demo.test.entity.JeecgOrderMain; +import org.jeecg.modules.demo.test.entity.JeecgOrderTicket; +import lombok.Data; + +@Data +public class JeecgOrderMainPage { + + private JeecgOrderMain jeecgOrderMain; + private List<JeecgOrderCustomer> jeecgOrderCustomerList; + private List<JeecgOrderTicket> jeecgOrderTicketList; + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java new file mode 100644 index 0000000..3c2753d --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java @@ -0,0 +1,297 @@ +package org.jeecg.modules.quartz.controller; + +import java.util.Arrays; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.quartz.entity.QuartzJob; +import org.jeecg.modules.quartz.service.IQuartzJobService; +import org.quartz.CronScheduleBuilder; +import org.quartz.CronTrigger; +import org.quartz.Job; +import org.quartz.JobBuilder; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; + +/** + * @Title: Controller + * @Description: 定时任务在线管理 + * @author: jeecg-boot + * @date: 2019-01-02 + * @version:V1.0 + */ +@RestController +@RequestMapping("/sys/quartzJob") +@Slf4j +public class QuartzJobController { + @Autowired + private IQuartzJobService quartzJobService; + @Autowired + private Scheduler scheduler; + + /** + * 分页列表查询 + * + * @param quartzJob + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequestMapping(value = "/list", method = RequestMethod.GET) + public Result<IPage<QuartzJob>> queryPageList(QuartzJob quartzJob, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { + Result<IPage<QuartzJob>> result = new Result<IPage<QuartzJob>>(); + QueryWrapper<QuartzJob> queryWrapper = new QueryWrapper<QuartzJob>(quartzJob); + Page<QuartzJob> page = new Page<QuartzJob>(pageNo, pageSize); + // 排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if ("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + } else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + IPage<QuartzJob> pageList = quartzJobService.page(page, queryWrapper); +// log.info("查询当前页:" + pageList.getCurrent()); +// log.info("查询当前页数量:" + pageList.getSize()); +// log.info("查询结果数量:" + pageList.getRecords().size()); +// log.info("数据总数:" + pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加定时任务 + * + * @param quartzJob + * @return + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result<?> add(@RequestBody QuartzJob quartzJob) { + Result<QuartzJob> result = new Result<QuartzJob>(); + + List<QuartzJob> list = quartzJobService.findByJobClassName(quartzJob.getJobClassName()); + if (list != null && list.size() > 0) { + return Result.error("该定时任务类名已存在"); + } + try { + schedulerAdd(quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter()); + // + quartzJob.setDelFlag(CommonConstant.DEL_FLAG_0); + quartzJob.setStatus(CommonConstant.STATUS_NORMAL); + quartzJobService.save(quartzJob); + result.success("创建定时任务成功"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("创建定时任务失败,"+e.getMessage()); + } + return result; + } + + /** + * 更新定时任务 + * + * @param quartzJob + * @return + */ + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + public Result<QuartzJob> eidt(@RequestBody QuartzJob quartzJob) { + Result<QuartzJob> result = new Result<QuartzJob>(); + QuartzJob quartzJobEntity = quartzJobService.getById(quartzJob.getId()); + if (quartzJobEntity == null) { + result.error500("未找到对应实体"); + } else { + schedulerDelete(quartzJob.getJobClassName().trim()); + if(CommonConstant.STATUS_NORMAL == quartzJob.getStatus()) { + schedulerAdd(quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter()); + } + boolean ok = quartzJobService.updateById(quartzJob); + if (ok) { + result.success("更新定时任务成功!"); + } + } + return result; + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result<QuartzJob> delete(@RequestParam(name = "id", required = true) String id) { + Result<QuartzJob> result = new Result<QuartzJob>(); + QuartzJob quartzJob = quartzJobService.getById(id); + if (quartzJob == null) { + result.error500("未找到对应实体"); + } else { + QuartzJob job = quartzJobService.getById(id); + schedulerDelete(job.getJobClassName().trim()); + boolean ok = quartzJobService.removeById(id); + if (ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result<QuartzJob> deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + Result<QuartzJob> result = new Result<QuartzJob>(); + if (ids == null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + } else { + for (String id : Arrays.asList(ids.split(","))) { + QuartzJob job = quartzJobService.getById(id); + schedulerDelete(job.getJobClassName().trim()); + quartzJobService.removeById(id); + } + result.success("删除定时任务成功!"); + } + return result; + } + + /** + * 暂停定时任务 + * @param job + * @return + */ + @RequestMapping(value = "/pause", method = RequestMethod.POST) + @ApiOperation(value = "暂停定时任务") + public Result<Object> pauseJob(@RequestBody QuartzJob job) { + + try { + scheduler.pauseJob(JobKey.jobKey(job.getJobClassName().trim())); + } catch (SchedulerException e) { + throw new JeecgBootException("暂停定时任务失败"); + } + job.setStatus(CommonConstant.STATUS_DISABLE); + quartzJobService.updateById(job); + return Result.ok("暂停定时任务成功"); + } + + /** + * 启动定时任务 + * @param job + * @return + */ + @RequestMapping(value = "/resume", method = RequestMethod.POST) + @ApiOperation(value = "恢复定时任务") + public Result<Object> resumeJob(@RequestBody QuartzJob job) { + + try { + scheduler.resumeJob(JobKey.jobKey(job.getJobClassName().trim())); + } catch (SchedulerException e) { + throw new JeecgBootException("恢复定时任务失败"); + } + job.setStatus(CommonConstant.STATUS_NORMAL); + quartzJobService.updateById(job); + return Result.ok("恢复定时任务成功"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @RequestMapping(value = "/queryById", method = RequestMethod.GET) + public Result<QuartzJob> queryById(@RequestParam(name = "id", required = true) String id) { + Result<QuartzJob> result = new Result<QuartzJob>(); + QuartzJob quartzJob = quartzJobService.getById(id); + if (quartzJob == null) { + result.error500("未找到对应实体"); + } else { + result.setResult(quartzJob); + result.setSuccess(true); + } + return result; + } + + /** + * 添加定时任务 + * + * @param jobClassName + * @param cronExpression + * @param parameter + */ + private void schedulerAdd(String jobClassName, String cronExpression, String parameter) { + + try { + // 启动调度器 + scheduler.start(); + + // 构建job信息 + JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(jobClassName).usingJobData("parameter", parameter).build(); + + // 表达式调度构建器(即任务执行的时间) + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); + + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName).withSchedule(scheduleBuilder).build(); + + scheduler.scheduleJob(jobDetail, trigger); + } catch (SchedulerException e) { + log.error(e.toString()); + throw new JeecgBootException("创建定时任务失败"); + } catch (Exception e) { + throw new JeecgBootException("后台找不到该类名任务"); + } + } + + /** + * 删除定时任务 + * + * @param jobClassName + */ + private void schedulerDelete(String jobClassName) { + + try { + scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName)); + scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName)); + scheduler.deleteJob(JobKey.jobKey(jobClassName)); + } catch (Exception e) { + throw new JeecgBootException("删除定时任务失败"); + } + } + + private static Job getClass(String classname) throws Exception { + Class<?> class1 = Class.forName(classname); + return (Job) class1.newInstance(); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/quartz/entity/QuartzJob.java b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/entity/QuartzJob.java new file mode 100644 index 0000000..b7f68dc --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/entity/QuartzJob.java @@ -0,0 +1,52 @@ +package org.jeecg.modules.quartz.entity; + +import java.io.Serializable; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + +/** + * @Description: 定时任务在线管理 + * @author: jeecg-boot + * @date: 2019-01-02 + * @version: V1.0 + */ +@Data +@TableName("sys_quartz_job") +public class QuartzJob implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.UUID) + private java.lang.String id; + /**创建人*/ + private java.lang.String createBy; + /**创建时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**删除状态*/ + private java.lang.Integer delFlag; + /**修改人*/ + private java.lang.String updateBy; + /**修改时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; + /**任务类名*/ + private java.lang.String jobClassName; + /**cron表达式*/ + private java.lang.String cronExpression; + /**参数*/ + private java.lang.String parameter; + /**描述*/ + private java.lang.String description; + /**状态 0正常 -1停止*/ + private java.lang.Integer status; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java new file mode 100644 index 0000000..844a7a1 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java @@ -0,0 +1,23 @@ +package org.jeecg.modules.quartz.job; + +import org.jeecg.common.util.DateUtils; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import lombok.extern.slf4j.Slf4j; + +/** + * 示例不带参定时任务 + * + * @author Scott + */ +@Slf4j +public class SampleJob implements Job { + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + log.info(String.format(" Jeecg-Boot 普通定时任务 SampleJob ! 时间:" + DateUtils.getTimestamp())); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/quartz/job/SampleParamJob.java b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/job/SampleParamJob.java new file mode 100644 index 0000000..0489744 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/job/SampleParamJob.java @@ -0,0 +1,32 @@ +package org.jeecg.modules.quartz.job; + +import org.jeecg.common.util.DateUtils; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import lombok.extern.slf4j.Slf4j; + +/** + * 示例带参定时任务 + * + * @author Scott + */ +@Slf4j +public class SampleParamJob implements Job { + + /** + * 若参数变量名修改 QuartzJobController中也需对应修改 + */ + private String parameter; + + public void setParameter(String parameter) { + this.parameter = parameter; + } + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + log.info(String.format("welcome %s! Jeecg-Boot 带参数定时任务 SampleParamJob ! 时间:" + DateUtils.now(), this.parameter)); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/quartz/mapper/QuartzJobMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/mapper/QuartzJobMapper.java new file mode 100644 index 0000000..87df52b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/mapper/QuartzJobMapper.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.quartz.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.quartz.entity.QuartzJob; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 定时任务在线管理 + * @author: jeecg-boot + * @date: 2019-01-02 + * @version: V1.0 + */ +public interface QuartzJobMapper extends BaseMapper<QuartzJob> { + + public List<QuartzJob> findByJobClassName(@Param("jobClassName") String jobClassName); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/quartz/mapper/xml/QuartzJobMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/mapper/xml/QuartzJobMapper.xml new file mode 100644 index 0000000..2f6f0a0 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/mapper/xml/QuartzJobMapper.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.quartz.mapper.QuartzJobMapper"> + + <!-- 根据jobClassName查询 --> + <select id="findByJobClassName" resultType="org.jeecg.modules.quartz.entity.QuartzJob"> + select * from sys_quartz_job where job_class_name = #{jobClassName} + </select> +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/quartz/service/IQuartzJobService.java b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/service/IQuartzJobService.java new file mode 100644 index 0000000..0ceda4b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/service/IQuartzJobService.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.quartz.service; + +import java.util.List; + +import org.jeecg.modules.quartz.entity.QuartzJob; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 定时任务在线管理 + * @author: jeecg-boot + * @date: 2019-01-02 + * @version: V1.0 + */ +public interface IQuartzJobService extends IService<QuartzJob> { + + List<QuartzJob> findByJobClassName(String jobClassName); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/quartz/service/impl/QuartzJobServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/service/impl/QuartzJobServiceImpl.java new file mode 100644 index 0000000..5e2aad9 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/quartz/service/impl/QuartzJobServiceImpl.java @@ -0,0 +1,29 @@ +package org.jeecg.modules.quartz.service.impl; + +import java.util.List; + +import org.jeecg.modules.quartz.entity.QuartzJob; +import org.jeecg.modules.quartz.mapper.QuartzJobMapper; +import org.jeecg.modules.quartz.service.IQuartzJobService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 定时任务在线管理 + * @author: jeecg-boot + * @date: 2019-01-02 + * @version: V1.0 + */ +@Service +public class QuartzJobServiceImpl extends ServiceImpl<QuartzJobMapper, QuartzJob> implements IQuartzJobService { + @Autowired + private QuartzJobMapper quartzJobMapper; + + @Override + public List<QuartzJob> findByJobClassName(String jobClassName) { + return quartzJobMapper.findByJobClassName(jobClassName); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/JwtToken.java b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/JwtToken.java new file mode 100644 index 0000000..058b711 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/JwtToken.java @@ -0,0 +1,28 @@ +package org.jeecg.modules.shiro.authc; + +import org.apache.shiro.authc.AuthenticationToken; + +/** + * @author Scott + * @create 2018-07-12 15:19 + * @desc + **/ +public class JwtToken implements AuthenticationToken { + + private static final long serialVersionUID = 1L; + private String token; + + public JwtToken(String token) { + this.token = token; + } + + @Override + public Object getPrincipal() { + return token; + } + + @Override + public Object getCredentials() { + return token; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/MyRealm.java b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/MyRealm.java new file mode 100644 index 0000000..7bc807a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/MyRealm.java @@ -0,0 +1,185 @@ +package org.jeecg.modules.shiro.authc; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.shiro.authc.util.JwtUtil; +import org.jeecg.modules.system.entity.SysPermission; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.service.ISysPermissionService; +import org.jeecg.modules.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; + +/** + * @author Scott + * @create 2018-07-12 15:23 + * @desc + **/ +@Component +@Slf4j +public class MyRealm extends AuthorizingRealm { + + @Autowired + private ISysPermissionService sysPermissionService; + @Autowired + private ISysUserService sysUserService; + @Autowired + private StringRedisTemplate stringRedisTemplate; + @Autowired + private RedisUtil redisUtil; + + /** + * 必须重写此方法,不然Shiro会报错 + */ + @Override + public boolean supports(AuthenticationToken token) { + return token instanceof JwtToken; + } + + /** + * 获取授权信息 Shiro中,只有当需要检测用户权限的时候才会调用此方法,例如checkRole,checkPermission之类的 + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { + log.info("————权限认证 [ roles、permissions]————"); + SysUser sysUser = null; + String username = null; + if(principals!=null) { + sysUser = (SysUser) principals.getPrimaryPrincipal(); + username = sysUser.getUsername(); + } + + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + // 设置该用户拥有角色 + List<String> roles = null; + //从redis缓存中查询权限角色 + String rolesStr = stringRedisTemplate.opsForValue().get(CommonConstant.PREFIX_USER_ROLE + username); + if (rolesStr != null) { + roles = JSON.parseArray(rolesStr.toString(), String.class); + } else { + //从数据库查询权限放到redis中 + roles = sysUserService.getRole(username); + stringRedisTemplate.opsForValue().set(CommonConstant.PREFIX_USER_ROLE + username, JSON.toJSONString(roles)); + } + //设置超时时间 + stringRedisTemplate.expire(CommonConstant.PREFIX_USER_ROLE + username, CommonConstant.TOKEN_EXPIRE_TIME, TimeUnit.SECONDS); + + /** + * 设置该用户拥有的角色,比如“admin,test” + */ + info.setRoles(new HashSet<>(roles)); + + // TODO 测试数据 + String permissions = "sys:role:update2,sys:role:add,/sys/user/add"; + Set<String> permission = new HashSet<>(Arrays.asList(permissions.split(","))); + + // 从数据库获取所有的权限 + Set<String> permissionSet = new HashSet<>(); + List<SysPermission> permissionList = sysPermissionService.queryByUser(username); + for (SysPermission po : permissionList) { + if (oConvertUtils.isNotEmpty(po.getUrl()) || oConvertUtils.isNotEmpty(po.getPerms())) { + if (oConvertUtils.isNotEmpty(po.getUrl())) { + //TODO URL是怎么控制的? + permissionSet.add(po.getUrl()); + } else if (oConvertUtils.isNotEmpty(po.getPerms())) { + permissionSet.add(po.getPerms()); + } + + } + } + + info.addStringPermissions(permissionSet); + return info; + } + + /** + * 获取身份验证信息 Shiro中,默认使用此方法进行用户名正确与否验证,错误抛出异常即可。 + * + * @param authenticationToken 用户身份信息 token + * @return 返回封装了用户信息的 AuthenticationInfo 实例 + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException { + log.debug("————身份认证方法————"); + String token = (String) auth.getCredentials(); + if (token == null) { + throw new AuthenticationException("token为空!"); + } + // 解密获得username,用于和数据库进行对比 + String username = JwtUtil.getUsername(token); + if (username == null) { + throw new AuthenticationException("token非法无效!"); + } + + // 查询用户信息 + SysUser sysUser = sysUserService.getUserByName(username); + if (sysUser == null) { + throw new AuthenticationException("用户不存在!"); + } + + //校验token是否超时失效 & 或者账号密码是否错误 + if (!jwtTokenRefresh(token, username, sysUser.getPassword())) { + throw new AuthenticationException("用户名或密码错误!"); + } + + // 判断用户状态 + if (sysUser.getStatus() != 1) { + throw new AuthenticationException("账号已被锁定,请联系管理员!"); + } + + return new SimpleAuthenticationInfo(sysUser, token, getName()); + } + + + /** + * JWTToken刷新生命周期 1、登录成功后将用户的JWT生成的Token作为k、v存储到cache缓存里面(这时候k、v值一样) + * 2、当该用户再次请求时,通过JWTFilter层层校验之后会进入到doGetAuthenticationInfo进行身份验证 + * 3、当该用户这次请求JWTToken值还在生命周期内,则会通过重新PUT的方式k、v都为Token值,缓存中的token值生命周期时间重新计算(这时候k、v值一样) + * 4、当该用户这次请求jwt生成的token值已经超时,但该token对应cache中的k还是存在,则表示该用户一直在操作只是JWT的token失效了,程序会给token对应的k映射的v值重新生成JWTToken并覆盖v值,该缓存生命周期重新计算 + * 5、当该用户这次请求jwt在生成的token值已经超时,并在cache中不存在对应的k,则表示该用户账户空闲超时,返回用户信息已失效,请重新登录。 + * 6、每次当返回为true情况下,都会给Response的Header中设置Authorization,该Authorization映射的v为cache对应的v值。 + * 7、注:当前端接收到Response的Header中的Authorization值会存储起来,作为以后请求token使用 + * + * @param userName + * @param passWord + * @return + */ + public boolean jwtTokenRefresh(String token, String userName, String passWord) { + String cacheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token)); + if (oConvertUtils.isNotEmpty(cacheToken)) { + //校验token有效性 + if (!JwtUtil.verify(token, userName, passWord)) { + String newAuthorization = JwtUtil.sign(userName, passWord); + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization); + //设置超时时间 + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME/1000); + } else { + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, cacheToken); + //设置超时时间 + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME/1000); + } + return true; + } + return false; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/aop/JwtFilter.java b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/aop/JwtFilter.java new file mode 100644 index 0000000..ea45a1d --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/aop/JwtFilter.java @@ -0,0 +1,73 @@ +package org.jeecg.modules.shiro.authc.aop; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter; +import org.jeecg.modules.shiro.authc.JwtToken; +import org.jeecg.modules.shiro.vo.DefContants; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.RequestMethod; +import lombok.extern.slf4j.Slf4j; + +/** + * @author Scott + * @create 2018-07-12 15:56 + * @desc 鉴权登录拦截器 + **/ +@Slf4j +public class JwtFilter extends BasicHttpAuthenticationFilter { + + /** + * 执行登录认证 + * + * @param request + * @param response + * @param mappedValue + * @return + */ + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { + try { + executeLogin(request, response); + return true; + } catch (Exception e) { + throw new AuthenticationException("Token失效,请重新登录", e); + } + } + + /** + * + */ + @Override + protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + String token = httpServletRequest.getHeader(DefContants.X_ACCESS_TOKEN); + + JwtToken jwtToken = new JwtToken(token); + // 提交给realm进行登入,如果错误他会抛出异常并被捕获 + getSubject(request, response).login(jwtToken); + // 如果没有抛出异常则代表登入成功,返回true + return true; + } + + /** + * 对跨域提供支持 + */ + @Override + protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin")); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers")); + // 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态 + if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) { + httpServletResponse.setStatus(HttpStatus.OK.value()); + return false; + } + return super.preHandle(request, response); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/aop/ResourceCheckFilter.java b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/aop/ResourceCheckFilter.java new file mode 100644 index 0000000..087cd3e --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/aop/ResourceCheckFilter.java @@ -0,0 +1,72 @@ +package org.jeecg.modules.shiro.authc.aop; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.AccessControlFilter; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author Scott + * @create 2019-02-01 15:56 + * @desc 鉴权请求URL访问权限拦截器 + */ +@Slf4j +public class ResourceCheckFilter extends AccessControlFilter { + + private String errorUrl; + + public String getErrorUrl() { + return errorUrl; + } + + public void setErrorUrl(String errorUrl) { + this.errorUrl = errorUrl; + } + + + /** + * 表示是否允许访问 ,如果允许访问返回true,否则false; + * @param servletRequest + * @param servletResponse + * @param o 表示写在拦截器中括号里面的字符串 mappedValue 就是 [urls] 配置中拦截器参数部分 + * @return + * @throws Exception + */ + @Override + protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception { + Subject subject = getSubject(servletRequest,servletResponse); + String url = getPathWithinApplication(servletRequest); + log.info("当前用户正在访问的 url => " + url); + return subject.isPermitted(url); + } + + + /** + * onAccessDenied:表示当访问拒绝时是否已经处理了; + * 如果返回 true 表示需要继续处理; + * 如果返回 false 表示该拦截器实例已经处理了,将直接返回即可。 + + * @param servletRequest + * @param servletResponse + * @return + * @throws Exception + */ + @Override + protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { + log.info("当 isAccessAllowed 返回 false 的时候,才会执行 method onAccessDenied "); + + HttpServletRequest request =(HttpServletRequest) servletRequest; + HttpServletResponse response =(HttpServletResponse) servletResponse; + response.sendRedirect(request.getContextPath() + this.errorUrl); + + + // 返回 false 表示已经处理,例如页面跳转啥的,表示不在走以下的拦截器了(如果还有配置的话) + return false; + } + +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/util/JwtUtil.java b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/util/JwtUtil.java new file mode 100644 index 0000000..bde4470 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/util/JwtUtil.java @@ -0,0 +1,87 @@ +package org.jeecg.modules.shiro.authc.util; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTDecodeException; +import com.auth0.jwt.interfaces.DecodedJWT; +import java.util.Date; +import javax.servlet.http.HttpServletRequest; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.util.oConvertUtils; + +/** + * @author Scott + * @create 2018-07-12 14:23 + * @desc JWT工具类 + **/ +public class JwtUtil { + + // 过期时间30分钟 + public static final long EXPIRE_TIME = 30 * 60 * 1000; + + /** + * 校验token是否正确 + * + * @param token 密钥 + * @param secret 用户的密码 + * @return 是否正确 + */ + public static boolean verify(String token, String username, String secret) { + try { + // 根据密码生成JWT效验器 + Algorithm algorithm = Algorithm.HMAC256(secret); + JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build(); + // 效验TOKEN + DecodedJWT jwt = verifier.verify(token); + return true; + } catch (Exception exception) { + return false; + } + } + + /** + * 获得token中的信息无需secret解密也能获得 + * + * @return token中包含的用户名 + */ + public static String getUsername(String token) { + try { + DecodedJWT jwt = JWT.decode(token); + return jwt.getClaim("username").asString(); + } catch (JWTDecodeException e) { + return null; + } + } + + /** + * 生成签名,5min后过期 + * + * @param username 用户名 + * @param secret 用户的密码 + * @return 加密的token + */ + public static String sign(String username, String secret) { + Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); + Algorithm algorithm = Algorithm.HMAC256(secret); + // 附带username信息 + return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm); + + } + + /** + * 根据request中的token获取用户账号 + * + * @param request + * @return + * @throws JeecgBootException + */ + public static String getUserNameByToken(HttpServletRequest request) throws JeecgBootException { + String accessToken = request.getHeader("X-Access-Token"); + String username = getUsername(accessToken); + if (oConvertUtils.isEmpty(username)) { + throw new JeecgBootException("未获取到用户"); + } + return username; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/DefContants.java b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/DefContants.java new file mode 100644 index 0000000..3cbf3e7 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/DefContants.java @@ -0,0 +1,7 @@ +package org.jeecg.modules.shiro.vo; + +public class DefContants { + + public static String X_ACCESS_TOKEN = "X-Access-Token"; + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/ResponseBean.java b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/ResponseBean.java new file mode 100644 index 0000000..9536bc8 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/ResponseBean.java @@ -0,0 +1,42 @@ +package org.jeecg.modules.shiro.vo; +public class ResponseBean { + + // http 状态码 + private int code; + + // 返回信息 + private String msg; + + // 返回的数据 + private Object data; + + public ResponseBean(int code, String msg, Object data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/UserBean.java b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/UserBean.java new file mode 100644 index 0000000..a526a7e --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/vo/UserBean.java @@ -0,0 +1,13 @@ +package org.jeecg.modules.shiro.vo; + +import java.util.HashSet; +import java.util.Set; +import lombok.Data; + +@Data +public class UserBean { + private String username; + private String password; + private Set<String> roles = new HashSet<>(); //用户所有角色值,用于shiro做角色权限的判断 + private Set<String> perms = new HashSet<>(); //用户所有权限值,用于shiro做资源权限的判断 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/shiro/web/TestWebController.java b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/web/TestWebController.java new file mode 100644 index 0000000..89d474f --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/shiro/web/TestWebController.java @@ -0,0 +1,85 @@ +package org.jeecg.modules.shiro.web; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.UnauthorizedException; +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresAuthentication; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.authz.annotation.RequiresRoles; +import org.apache.shiro.subject.Subject; +import org.jeecg.common.util.PasswordUtil; +import org.jeecg.modules.shiro.authc.util.JwtUtil; +import org.jeecg.modules.shiro.vo.ResponseBean; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.annotations.ApiOperation; + +@RestController +public class TestWebController { + + private ISysUserService userService; + + @Autowired + public void setService(ISysUserService userService) { + this.userService = userService; + } + + @PostMapping("/login") + @ApiOperation(value="用户登录", notes="用户登录") + public ResponseBean login(@RequestParam("username") String username, + @RequestParam("password") String password) { + SysUser user = userService.getUserByName(username); + if(user==null) { + return new ResponseBean(200, "用户不存在!", JwtUtil.sign(username, user.getPassword())); + } + String passwordEncode = PasswordUtil.encrypt(username, password, user.getSalt()); + if (passwordEncode.equals(user.getPassword())) { + return new ResponseBean(200, "Login success", JwtUtil.sign(username, user.getPassword())); + } else { + throw new UnauthorizedException(); + } + } + + @GetMapping("/article") + public ResponseBean article() { + Subject subject = SecurityUtils.getSubject(); + if (subject.isAuthenticated()) { + return new ResponseBean(200, "You are already logged in", null); + } else { + return new ResponseBean(200, "You are guest", null); + } + } + + @GetMapping("/require_auth") + @RequiresAuthentication + public ResponseBean requireAuth() { + return new ResponseBean(200, "You are authenticated", null); + } + + @GetMapping("/require_role") + @RequiresRoles("admin") + public ResponseBean requireRole() { + return new ResponseBean(200, "You are visiting require_role", null); + } + + @GetMapping("/require_permission") + @RequiresPermissions(logical = Logical.AND, value = {"view", "edit"}) + public ResponseBean requirePermission() { + return new ResponseBean(200, "You are visiting permission require edit,view", null); + } + + @RequestMapping(path = "/401") + @ResponseStatus(HttpStatus.UNAUTHORIZED) + public ResponseBean unauthorized() { + return new ResponseBean(401, "Unauthorized", null); + } +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/FindsDepartsChildrenUtil.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/FindsDepartsChildrenUtil.java new file mode 100644 index 0000000..62c0be0 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/FindsDepartsChildrenUtil.java @@ -0,0 +1,103 @@ +package org.jeecg.modules.system.controller; + +import org.jeecg.modules.system.entity.SysDepart; +import org.jeecg.modules.system.model.DepartIdModel; +import org.jeecg.modules.system.model.SysDepartTreeModel; + +import java.util.ArrayList; +import java.util.List; + +/** + * <P> + * 对应部门的表,处理并查找树级数据 + * <P> + * + * @author Steve + * @Since 2019-01-22 + */ +public class FindsDepartsChildrenUtil { + + + private static List<DepartIdModel> idList = new ArrayList<>(4); + + + /** + * queryTreeList的子方法 ====1===== + * 该方法是s将SysDepart类型的list集合转换成SysDepartTreeModel类型的集合 + */ + public static List<SysDepartTreeModel> wrapTreeDataToTreeList(List<SysDepart> recordList) { + // 在该方法每请求一次,都要对全局list集合进行一次清理 + idList.clear(); + List<SysDepartTreeModel> records = new ArrayList<>(); + for (int i = 0; i < recordList.size(); i++) { + SysDepart depart = recordList.get(i); + records.add(new SysDepartTreeModel(recordList.get(i))); + } + List<SysDepartTreeModel> tree = findChildren(records, idList); + setEmptyChildrenAsNull(tree); + return tree; + } + + public static List<DepartIdModel> wrapDepartIdModel() { + return idList; + } + + /** + * queryTreeList的子方法 ====2===== + * 该方法是找到并封装顶级父类的节点到TreeList集合 + */ + private static List<SysDepartTreeModel> findChildren(List<SysDepartTreeModel> recordList, + List<DepartIdModel> idList) { + + List<SysDepartTreeModel> treeList = new ArrayList<>(); + for (int i = 0; i < recordList.size(); i++) { + SysDepartTreeModel branch = recordList.get(i); + if (branch.getParentId().equals("")) { + treeList.add(branch); + DepartIdModel departIdModel = new DepartIdModel().convert(branch); + idList.add(departIdModel); + } + } + getGrandChildren(treeList,recordList,idList); + return treeList; + } + + /** + * queryTreeList的子方法====3==== + *该方法是找到顶级父类下的所有子节点集合并封装到TreeList集合 + */ + private static void getGrandChildren(List<SysDepartTreeModel> treeList,List<SysDepartTreeModel> recordList,List<DepartIdModel> idList) { + + for (int i = 0; i < treeList.size(); i++) { + SysDepartTreeModel model = treeList.get(i); + DepartIdModel idModel = idList.get(i); + for (int i1 = 0; i1 < recordList.size(); i1++) { + SysDepartTreeModel m = recordList.get(i1); + if (m.getParentId().equals(model.getId())) { + model.getChildren().add(m); + DepartIdModel dim = new DepartIdModel().convert(m); + idModel.getChildren().add(dim); + } + } + getGrandChildren(treeList.get(i).getChildren(), recordList, idList.get(i).getChildren()); + } + + } + + + /** + * queryTreeList的子方法 ====4==== + * 该方法是将子节点为空的List集合设置为Null值 + */ + private static void setEmptyChildrenAsNull(List<SysDepartTreeModel> treeList) { + + for (int i = 0; i < treeList.size(); i++) { + SysDepartTreeModel model = treeList.get(i); + if (model.getChildren().size() == 0) { + model.setChildren(null); + }else{ + setEmptyChildrenAsNull(model.getChildren()); + } + } + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/LoginController.java new file mode 100644 index 0000000..7d53484 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/LoginController.java @@ -0,0 +1,96 @@ +package org.jeecg.modules.system.controller; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.util.PasswordUtil; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.modules.shiro.authc.util.JwtUtil; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.model.SysLoginModel; +import org.jeecg.modules.system.service.ISysLogService; +import org.jeecg.modules.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +/** + * @author scott + * @since 2018-12-17 + */ +@RestController +@RequestMapping("/sys") +@Api("用户登录") +public class LoginController { + @Autowired + private ISysUserService sysUserService; + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + private ISysLogService logService; + @Autowired + private RedisUtil redisUtil; + + + @RequestMapping(value = "/login", method = RequestMethod.POST) + @ApiOperation("登录接口") + public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel) { + Result<JSONObject> result = new Result<JSONObject>(); + String username = sysLoginModel.getUsername(); + String password = sysLoginModel.getPassword(); + SysUser sysUser = sysUserService.getUserByName(username); + if(sysUser==null) { + result.error500("该用户不存在"); + sysBaseAPI.addLog("登录失败,用户名:"+username+"不存在!", CommonConstant.LOG_TYPE_1, null); + return result; + }else { + //密码验证 + String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt()); + String syspassword = sysUser.getPassword(); + if(!syspassword.equals(userpassword)) { + result.error500("用户名或密码错误"); + return result; + } + //生成token + String token = JwtUtil.sign(username, syspassword); + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + //设置超时时间 + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME/1000); + + JSONObject obj = new JSONObject(); + obj.put("token", token); + obj.put("userInfo", sysUser); + result.setResult(obj); + result.success("登录成功"); + sysBaseAPI.addLog("用户名: "+username+",登录成功!", CommonConstant.LOG_TYPE_1, null); + } + return result; + } + + /** + * 获取访问量 + * @return + */ + @GetMapping("loginfo") + public Result<JSONObject> loginfo() { + Result<JSONObject> result = new Result<JSONObject>(); + JSONObject obj = new JSONObject(); + // 获取系统访问记录 + Long totalVisitCount = logService.findTotalVisitCount(); + obj.put("totalVisitCount", totalVisitCount); + Long todayVisitCount = logService.findTodayVisitCount(); + obj.put("todayVisitCount", todayVisitCount); + Long todayIp = logService.findTodayIp(); + obj.put("todayIp", todayIp); + result.setResult(obj); + result.success("登录成功"); + return result; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java new file mode 100644 index 0000000..45c201e --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java @@ -0,0 +1,230 @@ +package org.jeecg.modules.system.controller; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.constant.CommonSendStatus; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.shiro.authc.util.JwtUtil; +import org.jeecg.modules.system.entity.SysAnnouncement; +import org.jeecg.modules.system.entity.SysDict; +import org.jeecg.modules.system.service.ISysAnnouncementService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + + /** + * @Title: Controller + * @Description: 系统通告表 + * @author: jeecg-boot + * @date: 2019-01-02 + * @version: V1.0 + */ +@RestController +@RequestMapping("/sys/annountCement") +@Slf4j +public class SysAnnouncementController { + @Autowired + private ISysAnnouncementService sysAnnouncementService; + + /** + * 分页列表查询 + * @param sysAnnouncement + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequestMapping(value = "/list", method = RequestMethod.GET) + public Result<IPage<SysAnnouncement>> queryPageList(SysAnnouncement sysAnnouncement, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result<IPage<SysAnnouncement>> result = new Result<IPage<SysAnnouncement>>(); + sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); + QueryWrapper<SysAnnouncement> queryWrapper = new QueryWrapper<SysAnnouncement>(sysAnnouncement); + Page<SysAnnouncement> page = new Page<SysAnnouncement>(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + IPage<SysAnnouncement> pageList = sysAnnouncementService.page(page, queryWrapper); + log.info("查询当前页:"+pageList.getCurrent()); + log.info("查询当前页数量:"+pageList.getSize()); + log.info("查询结果数量:"+pageList.getRecords().size()); + log.info("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param sysAnnouncement + * @return + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result<SysAnnouncement> add(@RequestBody SysAnnouncement sysAnnouncement) { + Result<SysAnnouncement> result = new Result<SysAnnouncement>(); + try { + sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); + sysAnnouncement.setSendStatus(CommonSendStatus.UNPUBLISHED_STATUS_0);//未发布 + sysAnnouncementService.save(sysAnnouncement); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param sysAnnouncement + * @return + */ + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + public Result<SysAnnouncement> eidt(@RequestBody SysAnnouncement sysAnnouncement) { + Result<SysAnnouncement> result = new Result<SysAnnouncement>(); + SysAnnouncement sysAnnouncementEntity = sysAnnouncementService.getById(sysAnnouncement.getId()); + if(sysAnnouncementEntity==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysAnnouncementService.updateById(sysAnnouncement); + //TODO 返回false说明什么? + if(ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result<SysAnnouncement> delete(@RequestParam(name="id",required=true) String id) { + Result<SysAnnouncement> result = new Result<SysAnnouncement>(); + SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id); + if(sysAnnouncement==null) { + result.error500("未找到对应实体"); + }else { + sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_1.toString()); + boolean ok = sysAnnouncementService.updateById(sysAnnouncement); + if(ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result<SysAnnouncement> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<SysAnnouncement> result = new Result<SysAnnouncement>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + String[] id = ids.split(","); + for(int i=0;i<id.length;i++) { + SysAnnouncement announcement = sysAnnouncementService.getById(id[i]); + announcement.setDelFlag(CommonConstant.DEL_FLAG_1.toString()); + sysAnnouncementService.updateById(announcement); + } + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @RequestMapping(value = "/queryById", method = RequestMethod.GET) + public Result<SysAnnouncement> queryById(@RequestParam(name="id",required=true) String id) { + Result<SysAnnouncement> result = new Result<SysAnnouncement>(); + SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id); + if(sysAnnouncement==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysAnnouncement); + result.setSuccess(true); + } + return result; + } + + /** + * 更新发布操作 + * @param id + * @return + */ + @RequestMapping(value = "/doReleaseData", method = RequestMethod.GET) + public Result<SysAnnouncement> doReleaseData(@RequestParam(name="id",required=true) String id, HttpServletRequest request) { + Result<SysAnnouncement> result = new Result<SysAnnouncement>(); + SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id); + if(sysAnnouncement==null) { + result.error500("未找到对应实体"); + }else { + sysAnnouncement.setSendStatus(CommonSendStatus.PUBLISHED_STATUS_1);//发布中 + sysAnnouncement.setSendTime(new Date()); + String currentUserName = JwtUtil.getUserNameByToken(request); + sysAnnouncement.setSender(currentUserName); + boolean ok = sysAnnouncementService.updateById(sysAnnouncement); + if(ok) { + result.success("该系统通知发布成功"); + } + } + + return result; + } + + /** + * 更新撤销操作 + * @param id + * @return + */ + @RequestMapping(value = "/doReovkeData", method = RequestMethod.GET) + public Result<SysAnnouncement> doReovkeData(@RequestParam(name="id",required=true) String id, HttpServletRequest request) { + Result<SysAnnouncement> result = new Result<SysAnnouncement>(); + SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id); + if(sysAnnouncement==null) { + result.error500("未找到对应实体"); + }else { + sysAnnouncement.setSendStatus(CommonSendStatus.REVOKE_STATUS_2);//撤销发布 + sysAnnouncement.setCancelTime(new Date()); + boolean ok = sysAnnouncementService.updateById(sysAnnouncement); + if(ok) { + result.success("该系统通知撤销成功"); + } + } + + return result; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java new file mode 100644 index 0000000..31f3a22 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java @@ -0,0 +1,190 @@ +package org.jeecg.modules.system.controller; + +import lombok.extern.slf4j.Slf4j; + +import org.apache.shiro.authz.annotation.RequiresRoles; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.shiro.authc.util.JwtUtil; +import org.jeecg.modules.system.entity.SysDepart; +import org.jeecg.modules.system.model.DepartIdModel; +import org.jeecg.modules.system.model.SysDepartTreeModel; +import org.jeecg.modules.system.service.ISysDepartService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +import javax.servlet.http.HttpServletRequest; + +/** + * <p> + * 部门表 前端控制器 + * <p> + * + * @author: Steve @Since: 2019-01-22 + */ +@RestController +@RequestMapping("/sysdepart/sysDepart") +@Slf4j +public class SysDepartController { + + @Autowired + private ISysDepartService sysDepartService; + + /** + * 查询数据 查出所有部门,并以树结构数据格式响应给前端 + * + * @return + */ + @RequestMapping(value = "/queryTreeList", method = RequestMethod.GET) + public Result<List<SysDepartTreeModel>> queryTreeList() { + Result<List<SysDepartTreeModel>> result = new Result<>(); + try { + List<SysDepartTreeModel> list = sysDepartService.queryTreeList(); + result.setResult(list); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 添加新数据 添加用户新建的部门对象数据,并保存到数据库 + * + * @param sysDepart + * @return + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @RequiresRoles({"admin"}) + public Result<SysDepart> add(@RequestBody SysDepart sysDepart, HttpServletRequest request) { + Result<SysDepart> result = new Result<SysDepart>(); + String username = JwtUtil.getUserNameByToken(request); + try { + sysDepart.setCreateBy(username); + sysDepartService.saveDepartData(sysDepart, username); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑数据 编辑部门的部分数据,并保存到数据库 + * + * @param sysDepart + * @return + */ + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + @RequiresRoles({"admin"}) + public Result<SysDepart> eidt(@RequestBody SysDepart sysDepart, HttpServletRequest request) { + + String username = JwtUtil.getUserNameByToken(request); + sysDepart.setUpdateBy(username); + Result<SysDepart> result = new Result<SysDepart>(); + SysDepart sysDepartEntity = sysDepartService.getById(sysDepart.getId()); + if (sysDepartEntity == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = sysDepartService.updateDepartDataById(sysDepart, username); + // TODO 返回false说明什么? + if (ok) { + result.success("修改成功!"); + } + } + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @RequiresRoles({"admin"}) + public Result<SysDepart> delete(@RequestParam(name="id",required=true) String id) { + + Result<SysDepart> result = new Result<SysDepart>(); + SysDepart sysDepart = sysDepartService.getById(id); + if(sysDepart==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysDepartService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + return result; + } + + + /** + * 批量删除 根据前端请求的多个ID,对数据库执行删除相关部门数据的操作 + * + * @param ids + * @return + */ + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + @RequiresRoles({"admin"}) + public Result<SysDepart> deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + + Result<SysDepart> result = new Result<SysDepart>(); + if (ids == null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + } else { + this.sysDepartService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 查询数据 添加或编辑页面对该方法发起请求,以树结构形式加载所有部门的名称,方便用户的操作 + * + * @return + */ + + @RequestMapping(value = "/queryIdTree", method = RequestMethod.GET) + public Result<List<DepartIdModel>> queryIdTree() { + Result<List<DepartIdModel>> result = new Result<List<DepartIdModel>>(); + try { + List<DepartIdModel> idList = FindsDepartsChildrenUtil.wrapDepartIdModel(); + result.setResult(idList); result.setSuccess(true); + return result; + } catch(Exception e) { + e.printStackTrace(); result.setSuccess(false); + return result; + } + } + + /** + * <p> + * 部门搜索功能方法,根据关键字模糊搜索相关部门 + * </p> + * + * @param keyWord + * @return + */ + @RequestMapping(value = "/searchBy", method = RequestMethod.GET) + public Result<List<SysDepartTreeModel>> searchBy(@RequestParam(name = "keyWord", required = true) String keyWord) { + Result<List<SysDepartTreeModel>> result = new Result<List<SysDepartTreeModel>>(); + try { + List<SysDepartTreeModel> treeList = this.sysDepartService.searhBy(keyWord); + if (treeList.size() == 0 || treeList == null) { + throw new Exception(); + } + result.setSuccess(true); + result.setResult(treeList); + return result; + } catch (Exception e) { + e.fillInStackTrace(); + result.setSuccess(false); + result.setMessage("查询失败或没有您想要的任何数据!"); + return result; + } + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictController.java new file mode 100644 index 0000000..704639c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictController.java @@ -0,0 +1,234 @@ +package org.jeecg.modules.system.controller; + + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysDict; +import org.jeecg.modules.system.model.SysDictTree; +import org.jeecg.modules.system.service.ISysDictService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + * <p> + * 字典表 前端控制器 + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +@RestController +@RequestMapping("/sys/dict") +@Slf4j +public class SysDictController { + + @Autowired + private ISysDictService sysDictService; + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public Result<IPage<SysDict>> queryPageList(SysDict sysDict,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) { + Result<IPage<SysDict>> result = new Result<IPage<SysDict>>(); + QueryWrapper<SysDict> queryWrapper = new QueryWrapper<SysDict>(sysDict); + Page<SysDict> page = new Page<SysDict>(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + //创建时间/创建人的赋值 + IPage<SysDict> pageList = sysDictService.page(page, queryWrapper); + log.info("查询当前页:"+pageList.getCurrent()); + log.info("查询当前页数量:"+pageList.getSize()); + log.info("查询结果数量:"+pageList.getRecords().size()); + log.info("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * @功能:获取树形字典数据 + * @param sysDict + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "/treeList", method = RequestMethod.GET) + public Result<List<SysDictTree>> treeList(SysDict sysDict,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) { + Result<List<SysDictTree>> result = new Result<>(); + LambdaQueryWrapper<SysDict> query = new LambdaQueryWrapper<>(); + // 构造查询条件 + String dictName = sysDict.getDictName(); + if(oConvertUtils.isNotEmpty(dictName)) { + query.like(true, SysDict::getDictName, dictName); + } + query.eq(true, SysDict::getDelFlag, "1"); + query.orderByDesc(true, SysDict::getCreateTime); + List<SysDict> list = sysDictService.list(query); + List<SysDictTree> treeList = new ArrayList<>(); + for (SysDict node : list) { + treeList.add(new SysDictTree(node)); + } + result.setSuccess(true); + result.setResult(treeList); + return result; + } + + /** + * 获取字典数据 + * @param dictCode + * @return + */ + @RequestMapping(value = "/getDictItems/{dictCode}", method = RequestMethod.GET) + public Result<List<Map<String, String>>> getDictItems(@PathVariable String dictCode) { + log.info(" dictCode : "+ dictCode); + Result<List<Map<String,String>>> result = new Result<List<Map<String,String>>>(); + List<Map<String,String>> ls = null; + try { + ls = sysDictService.queryDictItemsByCode(dictCode); + result.setSuccess(true); + result.setResult(ls); + } catch (Exception e) { + log.info(e.getMessage()); + result.error500("操作失败"); + return result; + } + + return result; + } + + /** + * 获取字典数据 + * @param dictCode + * @return + */ + @RequestMapping(value = "/getDictText/{dictCode}/{key}", method = RequestMethod.GET) + public Result<String> getDictItems(@PathVariable("dictCode") String dictCode, @PathVariable("key") String key) { + log.info(" dictCode : "+ dictCode); + Result<String> result = new Result<String>(); + String text = null; + try { + text = sysDictService.queryDictTextByKey(dictCode, key); + result.setSuccess(true); + result.setResult(text); + } catch (Exception e) { + log.info(e.getMessage()); + result.error500("操作失败"); + return result; + } + return result; + } + + /** + * @功能:新增 + * @param sysDict + * @return + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result<SysDict> add(@RequestBody SysDict sysDict) { + Result<SysDict> result = new Result<SysDict>(); + try { + sysDict.setCreateTime(new Date()); + sysDictService.save(sysDict); + result.success("保存成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * @功能:编辑 + * @param sysDict + * @return + */ + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + public Result<SysDict> edit(@RequestBody SysDict sysDict) { + Result<SysDict> result = new Result<SysDict>(); + SysDict sysdict = sysDictService.getById(sysDict.getId()); + if(sysdict==null) { + result.error500("未找到对应实体"); + }else { + sysDict.setUpdateTime(new Date()); + boolean ok = sysDictService.updateById(sysDict); + //TODO 返回false说明什么? + if(ok) { + result.success("编辑成功!"); + } + } + return result; + } + + /** + * @功能:删除 + * @param id + * @return + */ + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result<SysDict> delete(@RequestParam(name="id",required=true) String id) { + Result<SysDict> result = new Result<SysDict>(); + SysDict sysDict = sysDictService.getById(id); + if(sysDict==null) { + result.error500("未找到对应实体"); + }else { + sysDict.setDelFlag(2); + boolean ok = sysDictService.updateById(sysDict); + if(ok) { + result.success("删除成功!"); + } + } + return result; + } + + /** + * @功能:批量删除 + * @param ids + * @return + */ + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result<SysDict> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<SysDict> result = new Result<SysDict>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + String[] id=ids.split(","); + for(int i=0;i<id.length;i++) { + SysDict sysDict = sysDictService.getById(id[i]); + sysDict.setDelFlag(2); + sysDictService.updateById(sysDict); + } + result.success("删除成功!"); + } + return result; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java new file mode 100644 index 0000000..754497c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java @@ -0,0 +1,161 @@ +package org.jeecg.modules.system.controller; + + +import java.util.Arrays; +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysDictItem; +import org.jeecg.modules.system.service.ISysDictItemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + * <p> + * 前端控制器 + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +@RestController +@RequestMapping("/sys/dictItem") +@Slf4j +public class SysDictItemController { + + @Autowired + private ISysDictItemService sysDictItemService; + + /** + * @功能:查询字典数据 + * @param sysDictItem + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequestMapping(value = "/list", method = RequestMethod.GET) + public Result<IPage<SysDictItem>> queryPageList(SysDictItem sysDictItem,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) { + Result<IPage<SysDictItem>> result = new Result<IPage<SysDictItem>>(); + QueryWrapper<SysDictItem> queryWrapper = new QueryWrapper<SysDictItem>(sysDictItem); + Page<SysDictItem> page = new Page<SysDictItem>(pageNo,pageSize); + //update-begin--Author:zhangweijian Date:20190103 for:新增排序处理 + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + //update-end--Author:zhangweijian Date:20190103 for:根据业务配置id查询 + //TODO 过滤逻辑处理 + //TODO begin、end逻辑处理 + //TODO 一个强大的功能,前端传一个字段字符串,后台只返回这些字符串对应的字段 + //创建时间/创建人的赋值 + IPage<SysDictItem> pageList = sysDictItemService.page(page, queryWrapper); + log.info("查询当前页:"+pageList.getCurrent()); + log.info("查询当前页数量:"+pageList.getSize()); + log.info("查询结果数量:"+pageList.getRecords().size()); + log.info("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * @功能:新增 + * @param sysDict + * @return + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result<SysDictItem> add(@RequestBody SysDictItem sysDictItem) { + Result<SysDictItem> result = new Result<SysDictItem>(); + try { + sysDictItem.setCreateTime(new Date()); + sysDictItemService.save(sysDictItem); + result.success("保存成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * @功能:编辑 + * @param sysDictItem + * @return + */ + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + public Result<SysDictItem> edit(@RequestBody SysDictItem sysDictItem) { + Result<SysDictItem> result = new Result<SysDictItem>(); + SysDictItem sysdict = sysDictItemService.getById(sysDictItem.getId()); + if(sysdict==null) { + result.error500("未找到对应实体"); + }else { + sysDictItem.setUpdateTime(new Date()); + boolean ok = sysDictItemService.updateById(sysDictItem); + //TODO 返回false说明什么? + if(ok) { + result.success("编辑成功!"); + } + } + return result; + } + + /** + * @功能:删除字典数据 + * @param id + * @return + */ + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result<SysDictItem> delete(@RequestParam(name="id",required=true) String id) { + Result<SysDictItem> result = new Result<SysDictItem>(); + SysDictItem joinSystem = sysDictItemService.getById(id); + if(joinSystem==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysDictItemService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + return result; + } + + /** + * @功能:批量删除字典数据 + * @param ids + * @return + */ + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result<SysDictItem> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<SysDictItem> result = new Result<SysDictItem>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.sysDictItemService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysLogController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysLogController.java new file mode 100644 index 0000000..b3c152e --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysLogController.java @@ -0,0 +1,133 @@ +package org.jeecg.modules.system.controller; + + +import java.util.Arrays; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysLog; +import org.jeecg.modules.system.entity.SysRole; +import org.jeecg.modules.system.service.ISysLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + * <p> + * 系统日志表 前端控制器 + * </p> + * + * @author zhangweijian + * @since 2018-12-26 + */ +@RestController +@RequestMapping("/sys/log") +@Slf4j +public class SysLogController { + + @Autowired + private ISysLogService sysLogService; + + /** + * @功能:查询日志记录 + * @param syslog + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequestMapping(value = "/list", method = RequestMethod.GET) + public Result<IPage<SysLog>> queryPageList(SysLog syslog,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) { + Result<IPage<SysLog>> result = new Result<IPage<SysLog>>(); + QueryWrapper<SysLog> queryWrapper = new QueryWrapper<SysLog>(syslog); + Page<SysLog> page = new Page<SysLog>(pageNo,pageSize); + //开始结束时间 + String beginTime = req.getParameter("createTime_begin"); + String endTime = req.getParameter("createTime_end"); + if(oConvertUtils.isNotEmpty(beginTime) && oConvertUtils.isNotEmpty(endTime)) { + queryWrapper.ge(oConvertUtils.camelToUnderline("createTime"), beginTime); + queryWrapper.le(oConvertUtils.camelToUnderline("createTime"), endTime); + } + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + //日志关键词 + String keyWord = req.getParameter("keyWord"); + if(oConvertUtils.isNotEmpty(keyWord)) { + queryWrapper.like("log_content",keyWord); + } + //TODO 过滤逻辑处理 + //TODO begin、end逻辑处理 + //TODO 一个强大的功能,前端传一个字段字符串,后台只返回这些字符串对应的字段 + //创建时间/创建人的赋值 + IPage<SysLog> pageList = sysLogService.page(page, queryWrapper); + log.info("查询当前页:"+pageList.getCurrent()); + log.info("查询当前页数量:"+pageList.getSize()); + log.info("查询结果数量:"+pageList.getRecords().size()); + log.info("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * @功能:删除单个日志记录 + * @param id + * @return + */ + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public Result<SysLog> delete(@RequestParam(name="id",required=true) String id) { + Result<SysLog> result = new Result<SysLog>(); + SysLog sysLog = sysLogService.getById(id); + if(sysLog==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysLogService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + return result; + } + + /** + * @功能:批量,全部清空日志记录 + * @param ids + * @return + */ + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + public Result<SysRole> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<SysRole> result = new Result<SysRole>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + if("allclear".equals(ids)) { + this.sysLogService.removeAll(); + result.success("清除成功!"); + } + this.sysLogService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java new file mode 100644 index 0000000..43db126 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java @@ -0,0 +1,408 @@ +package org.jeecg.modules.system.controller; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresRoles; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.MD5Util; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysPermission; +import org.jeecg.modules.system.entity.SysRolePermission; +import org.jeecg.modules.system.model.SysPermissionTree; +import org.jeecg.modules.system.model.TreeModel; +import org.jeecg.modules.system.service.ISysPermissionService; +import org.jeecg.modules.system.service.ISysRolePermissionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import lombok.extern.slf4j.Slf4j; + +/** + * <p> + * 菜单权限表 前端控制器 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +@Slf4j +@RestController +@RequestMapping("/sys/permission") +public class SysPermissionController { + + @Autowired + private ISysPermissionService sysPermissionService; + + @Autowired + private ISysRolePermissionService sysRolePermissionService; + + + /** + * 加载数据节点 + * @return + */ + @RequestMapping(value = "/list", method = RequestMethod.GET) + public Result<List<SysPermissionTree>> list() { + //@RequestParam(name="pid",required=false) String parentId + Result<List<SysPermissionTree>> result = new Result<>(); + try { + LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>(); + query.eq(SysPermission::getDelFlag, 0); + query.orderByAsc(SysPermission::getSortNo); + List<SysPermission> list = sysPermissionService.list(query); + List<SysPermissionTree> treeList = new ArrayList<>(); + getTreeList(treeList, list, null); + result.setResult(treeList); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + + /** + * 查询用户的权限 + * @return + */ + @RequestMapping(value = "/queryByUser", method = RequestMethod.GET) + public Result<JSONArray> queryByUser(HttpServletRequest req) { + Result<JSONArray> result = new Result<>(); + try { + String username = req.getParameter("username"); + List<SysPermission> metaList = sysPermissionService.queryByUser(username); + JSONArray jsonArray = new JSONArray(); + this.getPermissionJsonArray(jsonArray, metaList, null); + result.setResult(jsonArray); + result.success("查询成功"); + } catch (Exception e) { + result.error500("查询失败:"+e.getMessage()); + e.printStackTrace(); + } + return result; + } + + + + + @RequestMapping(value = "/add", method = RequestMethod.POST) + @RequiresRoles({"admin"}) + public Result<SysPermission> add(@RequestBody SysPermission permission) { + Result<SysPermission> result = new Result<SysPermission>(); + try { + sysPermissionService.addPermission(permission); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + @RequiresRoles({"admin"}) + public Result<SysPermission> eidt(@RequestBody SysPermission permission) { + Result<SysPermission> result = new Result<>(); + try { + sysPermissionService.editPermission(permission); + result.success("修改成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @RequiresRoles({"admin"}) + public Result<SysPermission> delete(@RequestParam(name="id",required=true) String id) { + Result<SysPermission> result = new Result<>(); + try { + sysPermissionService.deletePermission(id); + result.success("删除成功!"); + } catch (Exception e) { + e.printStackTrace(); + result.error500(e.getMessage()); + } + return result; + } + + + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + @RequiresRoles({"admin"}) + public Result<SysPermission> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<SysPermission> result = new Result<>(); + try { + String arr[] = ids.split(","); + for (String id : arr) { + if(oConvertUtils.isNotEmpty(id)) { + sysPermissionService.deletePermission(id); + } + } + result.success("删除成功!"); + } catch (Exception e) { + e.printStackTrace(); + result.error500("删除成功!"); + } + return result; + } + + /** + * 获取全部的权限树 + * @return + */ + @RequestMapping(value = "/queryTreeList", method = RequestMethod.GET) + public Result<Map<String,Object>> queryTreeList() { + Result<Map<String,Object>> result = new Result<>(); + //全部权限ids + List<String> ids = new ArrayList<>(); + try { + LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>(); + query.eq(SysPermission::getDelFlag, 0); + query.orderByAsc(SysPermission::getSortNo); + List<SysPermission> list = sysPermissionService.list(query); + for(SysPermission sysPer : list) { + ids.add(sysPer.getId()); + } + + System.out.println(list.size()); + List<TreeModel> treeList = new ArrayList<>(); + getTreeModelList(treeList, list, null); + + Map<String,Object> resMap = new HashMap<String,Object>(); + resMap.put("treeList", treeList); //全部树节点数据 + resMap.put("ids", ids);//全部树ids + result.setResult(resMap); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + /** + * 异步加载数据节点 + * @return + */ + @RequestMapping(value = "/queryListAsync", method = RequestMethod.GET) + public Result<List<TreeModel>> queryAsync(@RequestParam(name="pid",required=false) String parentId) { + Result<List<TreeModel>> result = new Result<>(); + try { + List<TreeModel> list = sysPermissionService.queryListByParentId(parentId); + if(list==null||list.size()<=0) { + result.error500("未找到角色信息"); + }else { + result.setResult(list); + result.setSuccess(true); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return result; + } + + + + /** + * 查询角色授权 + * @return + */ + @RequestMapping(value = "/queryRolePermission", method = RequestMethod.GET) + public Result<List<String>> queryRolePermission(@RequestParam(name="roleId",required=true) String roleId) { + Result<List<String>> result = new Result<>(); + try { + List<SysRolePermission> list = sysRolePermissionService.list(new QueryWrapper<SysRolePermission>().lambda().eq(SysRolePermission::getRoleId, roleId)); + result.setResult(list.stream().map(SysRolePermission -> String.valueOf(SysRolePermission.getPermissionId())).collect(Collectors.toList())); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 保存角色授权 + * @return + */ + @RequestMapping(value = "/saveRolePermission", method = RequestMethod.POST) + public Result<String> saveRolePermission(@RequestBody JSONObject json) { + Result<String> result = new Result<>(); + try { + String roleId = json.getString("roleId"); + String permissionIds = json.getString("permissionIds"); + this.sysRolePermissionService.saveRolePermission(roleId, permissionIds); + result.success("保存成功!"); + } catch (Exception e) { + result.error500("授权失败!"); + e.printStackTrace(); + } + return result; + } + + + private void getTreeList(List<SysPermissionTree> treeList,List<SysPermission> metaList,SysPermissionTree temp) { + for (SysPermission permission : metaList) { + String tempPid = permission.getParentId(); + SysPermissionTree tree = new SysPermissionTree(permission); + if(temp==null && oConvertUtils.isEmpty(tempPid)) { + treeList.add(tree); + if(tree.getIsLeaf()==0) { + getTreeList(treeList, metaList, tree); + } + }else if(temp!=null && tempPid!=null && tempPid.equals(temp.getId())){ + temp.getChildren().add(tree); + if(tree.getIsLeaf()==0) { + getTreeList(treeList, metaList, tree); + } + } + + } + } + + private void getTreeModelList(List<TreeModel> treeList,List<SysPermission> metaList,TreeModel temp) { + for (SysPermission permission : metaList) { + String tempPid = permission.getParentId(); + TreeModel tree = new TreeModel(permission); + if(temp==null && oConvertUtils.isEmpty(tempPid)) { + treeList.add(tree); + if(permission.getIsLeaf()==0) { + getTreeModelList(treeList, metaList, tree); + } + }else if(temp!=null && tempPid!=null && tempPid.equals(temp.getKey())){ + temp.getChildren().add(tree); + if(permission.getIsLeaf()==0) { + getTreeModelList(treeList, metaList, tree); + } + } + + } + } + /** + * 获取菜单JSON数组 + * @param jsonArray + * @param metaList + * @param parentJson + */ + private void getPermissionJsonArray(JSONArray jsonArray,List<SysPermission> metaList,JSONObject parentJson) { + for (SysPermission permission : metaList) { + if(permission.getMenuType()==null) { + continue; + } + String tempPid = permission.getParentId(); + JSONObject json = getPermissionJsonObject(permission); + if(parentJson==null && oConvertUtils.isEmpty(tempPid)) { + jsonArray.add(json); + if(permission.getIsLeaf()==0) { + getPermissionJsonArray(jsonArray, metaList, json); + } + }else if(parentJson!=null && oConvertUtils.isNotEmpty(tempPid) && tempPid.equals(parentJson.getString("id"))){ + if(permission.getMenuType()==0) { + JSONObject metaJson = parentJson.getJSONObject("meta"); + if(metaJson.containsKey("permissionList")) { + metaJson.getJSONArray("permissionList").add(json); + }else { + JSONArray permissionList = new JSONArray(); + permissionList.add(json); + metaJson.put("permissionList", permissionList); + } + + }else if(permission.getMenuType()==1) { + if(parentJson.containsKey("children")) { + parentJson.getJSONArray("children").add(json); + }else { + JSONArray children = new JSONArray(); + children.add(json); + parentJson.put("children", children); + } + + if(permission.getIsLeaf()==0) { + getPermissionJsonArray(jsonArray, metaList, json); + } + } + } + + + } + } + + private JSONObject getPermissionJsonObject(SysPermission permission) { + JSONObject json = new JSONObject(); + //类型(0:一级菜单 1:子菜单 2:按钮) + if(permission.getMenuType()==2) { + json.put("action", permission.getPerms()); + json.put("describe", permission.getName()); + }else if(permission.getMenuType()==0||permission.getMenuType()==1) { + json.put("id", permission.getId()); + if(permission.getUrl()!=null&&(permission.getUrl().startsWith("http://")||permission.getUrl().startsWith("https://"))) { + json.put("path", MD5Util.MD5Encode(permission.getUrl(), "utf-8")); + }else { + json.put("path", permission.getUrl()); + } + + //重要规则:路由name (通过URL生成路由name,路由name供前端开发,页面跳转使用) + json.put("name", urlToRouteName(permission.getUrl())); + + //是否隐藏路由,默认都是显示的 + if(permission.isHidden()) { + json.put("hidden",true); + } + //聚合路由 + if(permission.isAlwaysShow()) { + json.put("alwaysShow",true); + } + json.put("component", permission.getComponent()); + JSONObject meta = new JSONObject(); + meta.put("title", permission.getName()); + if(oConvertUtils.isEmpty(permission.getParentId())) { + //一级菜单跳转地址 + json.put("redirect",permission.getRedirect()); + meta.put("icon", oConvertUtils.getString(permission.getIcon(), "")); + }else { + meta.put("icon", oConvertUtils.getString(permission.getIcon(), "")); + } + if(permission.getUrl()!=null&&(permission.getUrl().startsWith("http://")||permission.getUrl().startsWith("https://"))) { + meta.put("url", permission.getUrl()); + } + json.put("meta", meta); + } + + return json; + } + + /** + * 通过URL生成路由name(去掉URL前缀斜杠,替换内容中的斜杠‘/’为-) + * 举例: URL = /isystem/role + * RouteName = isystem-role + * @return + */ + private String urlToRouteName(String url) { + if(oConvertUtils.isNotEmpty(url)) { + if(url.startsWith("/")) { + url = url.substring(1); + } + url = url.replace("/", "-"); + return url; + }else { + return null; + } + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java new file mode 100644 index 0000000..21e1798 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java @@ -0,0 +1,233 @@ +package org.jeecg.modules.system.controller; + + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresRoles; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysRole; +import org.jeecg.modules.system.service.ISysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +/** + * <p> + * 角色表 前端控制器 + * </p> + * + * @author scott + * @since 2018-12-19 + */ +@RestController +@RequestMapping("/sys/role") +@Slf4j +public class SysRoleController { + @Autowired + private ISysRoleService sysRoleService; + + /** + * 分页列表查询 + * @param role + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @RequestMapping(value = "/list", method = RequestMethod.GET) + public Result<IPage<SysRole>> queryPageList(SysRole role, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result<IPage<SysRole>> result = new Result<IPage<SysRole>>(); + QueryWrapper<SysRole> queryWrapper = new QueryWrapper<SysRole>(role); + Page<SysRole> page = new Page<SysRole>(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + //TODO 过滤逻辑处理 + //TODO begin、end逻辑处理 + //TODO 一个强大的功能,前端传一个字段字符串,后台只返回这些字符串对应的字段 + //创建时间/创建人的赋值 + IPage<SysRole> pageList = sysRoleService.page(page, queryWrapper); + log.info("查询当前页:"+pageList.getCurrent()); + log.info("查询当前页数量:"+pageList.getSize()); + log.info("查询结果数量:"+pageList.getRecords().size()); + log.info("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param role + * @return + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + public Result<SysRole> add(@RequestBody SysRole role) { + Result<SysRole> result = new Result<SysRole>(); + try { + role.setCreateTime(new Date()); + sysRoleService.save(role); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param role + * @return + */ + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + @RequiresRoles({"admin"}) + public Result<SysRole> eidt(@RequestBody SysRole role) { + Result<SysRole> result = new Result<SysRole>(); + SysRole sysrole = sysRoleService.getById(role.getId()); + if(sysrole==null) { + result.error500("未找到对应实体"); + }else { + role.setUpdateTime(new Date()); + boolean ok = sysRoleService.updateById(role); + //TODO 返回false说明什么? + if(ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @RequiresRoles({"admin"}) + public Result<SysRole> delete(@RequestParam(name="id",required=true) String id) { + Result<SysRole> result = new Result<SysRole>(); + SysRole sysrole = sysRoleService.getById(id); + if(sysrole==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysRoleService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + @RequiresRoles({"admin"}) + public Result<SysRole> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<SysRole> result = new Result<SysRole>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.sysRoleService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @RequestMapping(value = "/queryById", method = RequestMethod.GET) + public Result<SysRole> queryById(@RequestParam(name="id",required=true) String id) { + Result<SysRole> result = new Result<SysRole>(); + SysRole sysrole = sysRoleService.getById(id); + if(sysrole==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysrole); + result.setSuccess(true); + } + return result; + } + + @RequestMapping(value = "/queryall", method = RequestMethod.GET) + public Result<List<SysRole>> queryall() { + Result<List<SysRole>> result = new Result<>(); + List<SysRole> list = sysRoleService.list(); + if(list==null||list.size()<=0) { + result.error500("未找到角色信息"); + }else { + result.setResult(list); + result.setSuccess(true); + } + return result; + } + + /** + * 校验角色编码唯一 + */ + @RequestMapping(value = "/checkRoleCode", method = RequestMethod.GET) + public Result<Boolean> checkUsername(String id,String roleCode) { + Result<Boolean> result = new Result<>(); + result.setResult(true);//如果此参数为false则程序发生异常 + log.info("--验证角色编码是否唯一---id:"+id+"--roleCode:"+roleCode); + try { + SysRole role = null; + if(oConvertUtils.isNotEmpty(id)) { + role = sysRoleService.getById(id); + } + SysRole newRole = sysRoleService.getOne(new QueryWrapper<SysRole>().lambda().eq(SysRole::getRoleCode, roleCode)); + if(newRole!=null) { + //如果根据传入的roleCode查询到信息了,那么就需要做校验了。 + if(role==null) { + //role为空=>新增模式=>只要roleCode存在则返回false + result.setSuccess(false); + result.setMessage("角色编码已存在"); + return result; + }else if(!id.equals(newRole.getId())) { + //否则=>编辑模式=>判断两者ID是否一致- + result.setSuccess(false); + result.setMessage("角色编码已存在"); + return result; + } + } + } catch (Exception e) { + result.setSuccess(false); + result.setResult(false); + result.setMessage(e.getMessage()); + return result; + } + result.setSuccess(true); + return result; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysUserController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysUserController.java new file mode 100644 index 0000000..98738c9 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysUserController.java @@ -0,0 +1,283 @@ +package org.jeecg.modules.system.controller; + + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresRoles; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.PasswordUtil; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.entity.SysUserRole; +import org.jeecg.modules.system.service.ISysUserRoleService; +import org.jeecg.modules.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import lombok.extern.slf4j.Slf4j; + +/** + * <p> + * 用户表 前端控制器 + * </p> + * + * @author scott + * @since 2018-12-20 + */ +@Slf4j +@RestController +@RequestMapping("/sys/user") +public class SysUserController { + + @Autowired + private ISysUserService sysUserService; + + @Autowired + private ISysUserRoleService sysUserRoleService; + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public Result<IPage<SysUser>> queryPageList(SysUser user,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) { + Result<IPage<SysUser>> result = new Result<IPage<SysUser>>(); + QueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>(user); + Page<SysUser> page = new Page<SysUser>(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + //TODO 多字段排序 + //TODO 过滤逻辑处理 + //TODO begin、end逻辑处理 + //TODO 一个强大的功能,前端传一个字段字符串,后台只返回这些字符串对应的字段 + //创建时间/创建人的赋值 + IPage<SysUser> pageList = sysUserService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + @RequestMapping(value = "/add", method = RequestMethod.POST) + @RequiresRoles({"admin"}) + public Result<SysUser> add(@RequestBody JSONObject jsonObject) { + Result<SysUser> result = new Result<SysUser>(); + String selectedRoles = jsonObject.getString("selectedroles"); + try { + SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class); + user.setCreateTime(new Date());//设置创建时间 + String salt = oConvertUtils.randomGen(8); + user.setSalt(salt); + String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), salt); + user.setPassword(passwordEncode); + user.setStatus(1); + user.setDelFlag("0"); + sysUserService.addUserWithRole(user, selectedRoles); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + @RequiresRoles({"admin"}) + public Result<SysUser> eidt(@RequestBody JSONObject jsonObject) { + Result<SysUser> result = new Result<SysUser>(); + try { + SysUser sysUser = sysUserService.getById(jsonObject.getString("id")); + if(sysUser==null) { + result.error500("未找到对应实体"); + }else { + SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class); + user.setUpdateTime(new Date()); + //String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), sysUser.getSalt()); + user.setPassword(sysUser.getPassword()); + String roles = jsonObject.getString("selectedroles"); + sysUserService.editUserWithRole(user, roles); + result.success("修改成功!"); + } + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @RequiresRoles({"admin"}) + public Result<SysUser> delete(@RequestParam(name="id",required=true) String id) { + Result<SysUser> result = new Result<SysUser>(); + SysUser sysUser = sysUserService.getById(id); + if(sysUser==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysUserService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + + return result; + } + + @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + @RequiresRoles({"admin"}) + public Result<SysUser> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<SysUser> result = new Result<SysUser>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.sysUserService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + @RequestMapping(value = "/frozenBatch", method = {RequestMethod.POST,RequestMethod.GET}) + public Result<SysUser> frozenBatch(@RequestParam(name="ids",required=true) String ids,@RequestParam(name="status",required=true) String status) { + Result<SysUser> result = new Result<SysUser>(); + try { + String[] arr = ids.split(","); + for (String id : arr) { + if(oConvertUtils.isNotEmpty(id)) { + this.sysUserService.update(new SysUser().setStatus(Integer.parseInt(status)), + new UpdateWrapper<SysUser>().lambda().eq(SysUser::getId,id)); + } + } + } catch (Exception e) { + e.printStackTrace(); + result.error500("操作失败"+e.getMessage()); + } + result.success("操作成功!"); + return result; + } + + + + @RequestMapping(value = "/queryById", method = RequestMethod.GET) + public Result<SysUser> queryById(@RequestParam(name="id",required=true) String id) { + Result<SysUser> result = new Result<SysUser>(); + SysUser sysUser = sysUserService.getById(id); + if(sysUser==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysUser); + result.setSuccess(true); + } + return result; + } + + @RequestMapping(value = "/queryUserRole", method = RequestMethod.GET) + public Result<List<String>> queryUserRole(@RequestParam(name="userid",required=true) String userid) { + Result<List<String>> result = new Result<>(); + List<String> list = new ArrayList<String>(); + List<SysUserRole> userRole = sysUserRoleService.list(new QueryWrapper<SysUserRole>().lambda().eq(SysUserRole::getUserId,userid)); + if(userRole==null || userRole.size()<=0) { + result.error500("未找到用户相关角色信息"); + }else { + for (SysUserRole sysUserRole : userRole) { + list.add(sysUserRole.getRoleId()); + } + result.setSuccess(true); + result.setResult(list); + } + return result; + } + + + /** + * 校验用户账号是否唯一<br> + * 可以校验其他 需要检验什么就传什么。。。 + * @param username + * @return + */ + @RequestMapping(value = "/checkOnlyUser", method = RequestMethod.GET) + public Result<Boolean> checkUsername(SysUser sysUser) { + Result<Boolean> result = new Result<>(); + result.setResult(true);//如果此参数为false则程序发生异常 + String id = sysUser.getId(); + log.info("--验证用户信息是否唯一---id:"+id); + try { + SysUser oldUser = null; + if(oConvertUtils.isNotEmpty(id)) { + oldUser = sysUserService.getById(id); + }else { + sysUser.setId(null); + } + //通过传入信息查询新的用户信息 + SysUser newUser = sysUserService.getOne(new QueryWrapper<SysUser>(sysUser)); + if(newUser!=null) { + //如果根据传入信息查询到用户了,那么就需要做校验了。 + if(oldUser==null) { + //oldUser为空=>新增模式=>只要用户信息存在则返回false + result.setSuccess(false); + result.setMessage("用户账号已存在"); + return result; + }else if(!id.equals(newUser.getId())) { + //否则=>编辑模式=>判断两者ID是否一致- + result.setSuccess(false); + result.setMessage("用户账号已存在"); + return result; + } + } + + } catch (Exception e) { + result.setSuccess(false); + result.setResult(false); + result.setMessage(e.getMessage()); + return result; + } + result.setSuccess(true); + return result; + } + + /** + * 修改密码 + */ + @RequestMapping(value = "/changPassword", method = RequestMethod.PUT) + @RequiresRoles({"admin"}) + public Result<SysUser> changPassword(@RequestBody SysUser sysUser) { + Result<SysUser> result = new Result<SysUser>(); + String password = sysUser.getPassword(); + sysUser = this.sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, sysUser.getUsername())); + if(sysUser==null) { + result.error500("未找到对应实体"); + }else { + String salt = oConvertUtils.randomGen(8); + sysUser.setSalt(salt); + String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(),password, salt); + sysUser.setPassword(passwordEncode); + this.sysUserService.updateById(sysUser); + result.setResult(sysUser); + result.success("密码修改完成!"); + } + return result; + } + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysAnnouncement.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysAnnouncement.java new file mode 100644 index 0000000..2869733 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysAnnouncement.java @@ -0,0 +1,70 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: 系统通告表 + * @author: jeecg-boot + * @date: 2019-01-02 + * @version: V1.0 + */ +@Data +@TableName("sys_announcement") +public class SysAnnouncement implements Serializable { + private static final long serialVersionUID = 1L; + + /**id*/ + @TableId(type = IdType.UUID) + private java.lang.String id; + /**标题*/ + private java.lang.String titile; + /**内容*/ + private java.lang.Object msgContent; + /**开始时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date startTime; + /**结束时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date endTime; + /**发布人*/ + private java.lang.String sender; + /**优先级(L低,M中,H高)*/ + private java.lang.String priority; + /**通告对象类型(USER:指定用户,ALL:全体用户)*/ + private java.lang.String msgType; + /**发布状态(0未发布,1已发布,2已撤销)*/ + private java.lang.String sendStatus; + /**发布时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date sendTime; + /**撤销时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date cancelTime; + /**删除状态(0,正常,1已删除)*/ + private java.lang.String delFlag; + /**创建人*/ + private java.lang.String createBy; + /**创建时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**更新人*/ + private java.lang.String updateBy; + /**更新时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; + /**指定用户**/ + private java.lang.String userIds; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDepart.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDepart.java new file mode 100644 index 0000000..88e8881 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDepart.java @@ -0,0 +1,114 @@ +package org.jeecg.modules.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.jeecg.modules.system.model.SysDepartTreeModel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * <p> + * 部门表 + * <p> + * + * @author Steve + * @Since 2019-01-22 + */ +@Data +@TableName("sys_depart") +public class SysDepart implements Serializable { + private static final long serialVersionUID = 1L; + + /**ID*/ + @TableId(type = IdType.UUID) + private String id; + /**父机构ID*/ + private String parentId; + /**机构/部门名称*/ + private String departName; + /**英文名*/ + private String departNameEn; + /**缩写*/ + private String departNameAbbr; + /**排序*/ + private Integer departOrder; + /**描述*/ + private Object description; + /**机构类型*/ + private String orgType; + /**机构编码*/ + private String orgCode; + /**手机号*/ + private String mobile; + /**传真*/ + private String fax; + /**地址*/ + private String address; + /**备注*/ + private String memo; + /**状态(1启用,0不启用)*/ + private String status; + /**删除状态(0,正常,1已删除)*/ + private String delFlag; + /**创建人*/ + private String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + /**更新人*/ + private String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 重写equals方法 + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + SysDepart depart = (SysDepart) o; + return Objects.equals(id, depart.id) && + Objects.equals(parentId, depart.parentId) && + Objects.equals(departName, depart.departName) && + Objects.equals(departNameEn, depart.departNameEn) && + Objects.equals(departNameAbbr, depart.departNameAbbr) && + Objects.equals(departOrder, depart.departOrder) && + Objects.equals(description, depart.description) && + Objects.equals(orgType, depart.orgType) && + Objects.equals(orgCode, depart.orgCode) && + Objects.equals(mobile, depart.mobile) && + Objects.equals(fax, depart.fax) && + Objects.equals(address, depart.address) && + Objects.equals(memo, depart.memo) && + Objects.equals(status, depart.status) && + Objects.equals(delFlag, depart.delFlag) && + Objects.equals(createBy, depart.createBy) && + Objects.equals(createTime, depart.createTime) && + Objects.equals(updateBy, depart.updateBy) && + Objects.equals(updateTime, depart.updateTime); + } + + /** + * 重写hashCode方法 + */ + @Override + public int hashCode() { + + return Objects.hash(super.hashCode(), id, parentId, departName, + departNameEn, departNameAbbr, departOrder, description, + orgType, orgCode, mobile, fax, address, memo, status, + delFlag, createBy, createTime, updateBy, updateTime); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDict.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDict.java new file mode 100644 index 0000000..7adcae1 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDict.java @@ -0,0 +1,75 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * <p> + * 字典表 + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysDict implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.UUID) + private String id; + + /** + * 字典名称 + */ + private String dictName; + + /** + * 字典编码 + */ + private String dictCode; + + /** + * 描述 + */ + private String description; + + /** + * 删除状态 + */ + private Integer delFlag; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDictItem.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDictItem.java new file mode 100644 index 0000000..ee2f2e1 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDictItem.java @@ -0,0 +1,74 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * <p> + * + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysDictItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.UUID) + private String id; + + /** + * 字典id + */ + private String dictId; + + /** + * 字典项文本 + */ + private String itemText; + + /** + * 字典项值 + */ + private String itemValue; + + /** + * 描述 + */ + private String description; + + /** + * 排序 + */ + private BigDecimal sortOrder; + + /** + * 状态(1启用 0不启用) + */ + private Integer status; + + private String createBy; + + private Date createTime; + + private String updateBy; + + private Date updateTime; + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysLog.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysLog.java new file mode 100644 index 0000000..8ac2a50 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysLog.java @@ -0,0 +1,108 @@ +package org.jeecg.modules.system.entity; + +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * <p> + * 系统日志表 + * </p> + * + * @author zhangweijian + * @since 2018-12-26 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.UUID) + private String id; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 耗时 + */ + private Long costTime; + + /** + * IP + */ + private String ip; + + /** + * 请求参数 + */ + private String requestParam; + + /** + * 请求类型 + */ + private String requestType; + + /** + * 请求路径 + */ + private String requestUrl; + /** + * 请求方法 + */ + private String method; + + /** + * 操作人用户名称 + */ + private String username; + /** + * 操作人用户账户 + */ + private String userid; + /** + * 操作详细日志 + */ + private String logContent; + + /** + * 日志类型(1登录日志,2操作日志) + */ + private Integer logType; + + /** + * 操作类型() + */ + private Integer operateType; + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermission.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermission.java new file mode 100644 index 0000000..5688ded --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermission.java @@ -0,0 +1,118 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * <p> + * 菜单权限表 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysPermission implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.UUID) + private String id; + + /** + * 父id + */ + private String parentId; + + /** + * 菜单名称 + */ + private String name; + + /** + * 菜单权限编码,例如:“sys:schedule:list,sys:schedule:info”,多个逗号隔开 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 组件 + */ + private String component; + + /** + * 路径 + */ + private String url; + /** + * 一级菜单跳转地址 + */ + private String redirect; + + /** + * 菜单排序 + */ + private Integer sortNo; + + /** + * 类型(0:一级菜单;1:子菜单 ;2:按钮权限) + */ + private Integer menuType; + + /** + * 是否叶子节点: 1:是 0:不是 + */ + private Integer isLeaf; + + /** + * 描述 + */ + private String description; + + /** + * 创建人 + */ + private String createBy; + + /** + * 删除状态 0正常 1已删除 + */ + private Integer delFlag; + + /** + * 是否隐藏路由菜单: 0否,1是(默认值0) + */ + private boolean hidden; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + /**alwaysShow*/ + private boolean alwaysShow; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRole.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRole.java new file mode 100644 index 0000000..5933454 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRole.java @@ -0,0 +1,78 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * <p> + * 角色表 + * </p> + * + * @author scott + * @since 2018-12-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysRole implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.UUID) + private String id; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色编码 + */ + private String roleCode; + + /** + * 描述 + */ + private String description; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRolePermission.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRolePermission.java new file mode 100644 index 0000000..61cdb3c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRolePermission.java @@ -0,0 +1,51 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * <p> + * 角色权限表 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysRolePermission implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.UUID) + private String id; + + /** + * 角色id + */ + private String roleId; + + /** + * 权限id + */ + private String permissionId; + + public SysRolePermission() { + } + + public SysRolePermission(String roleId, String permissionId) { + this.roleId = roleId; + this.permissionId = permissionId; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUser.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUser.java new file mode 100644 index 0000000..13fa1a2 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUser.java @@ -0,0 +1,116 @@ +package org.jeecg.modules.system.entity; + +import java.time.LocalDateTime; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * <p> + * 用户表 + * </p> + * + * @author scott + * @since 2018-12-20 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.UUID) + private String id; + + /** + * 登录账号 + */ + private String username; + + /** + * 真实姓名 + */ + private String realname; + + /** + * 密码 + */ + private String password; + + /** + * md5密码盐 + */ + private String salt; + + /** + * 头像 + */ + private String avatar; + + /** + * 生日 + */ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + private Date birthday; + + /** + * 性别(1:男 2:女) + */ + private Integer sex; + + /** + * 电子邮件 + */ + private String email; + + /** + * 电话 + */ + private String phone; + + /** + * 状态(1:正常 2:冻结 ) + */ + private Integer status; + + /** + * 删除状态(0,正常,1已删除) + */ + private String delFlag; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java new file mode 100644 index 0000000..4a3a35e --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java @@ -0,0 +1,50 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * <p> + * 用户角色表 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysUserRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.UUID) + private String id; + + /** + * 用户id + */ + private String userId; + + /** + * 角色id + */ + private String roleId; + + public SysUserRole() { + } + + public SysUserRole(String userId, String roleId) { + this.userId = userId; + this.roleId = roleId; + } + + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementMapper.java new file mode 100644 index 0000000..a3c7bc8 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.system.entity.SysAnnouncement; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 系统通告表 + * @author: jeecg-boot + * @date: 2019-01-02 + * @version: V1.0 + */ +public interface SysAnnouncementMapper extends BaseMapper<SysAnnouncement> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java new file mode 100644 index 0000000..65d66dc --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jeecg.modules.system.entity.SysDepart; +import org.jeecg.modules.system.model.SysDepartTreeModel; +import org.jeecg.modules.system.model.TreeModel; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +/** + * <p> + * 部门 Mapper 接口 + * <p> + * + * @author: Steve + * @Since: 2019-01-22 + */ +public interface SysDepartMapper extends BaseMapper<SysDepart> { +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java new file mode 100644 index 0000000..e92eec0 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java @@ -0,0 +1,16 @@ +package org.jeecg.modules.system.mapper; + +import org.jeecg.modules.system.entity.SysDictItem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * Mapper 接口 + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +public interface SysDictItemMapper extends BaseMapper<SysDictItem> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java new file mode 100644 index 0000000..001e28b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java @@ -0,0 +1,24 @@ +package org.jeecg.modules.system.mapper; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.system.entity.SysDict; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * 字典表 Mapper 接口 + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +public interface SysDictMapper extends BaseMapper<SysDict> { + + public List<Map<String,String>> queryDictItemsByCode(@Param("code") String code); + + public String queryDictTextByKey(@Param("code") String code,@Param("key") String key); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysLogMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysLogMapper.java new file mode 100644 index 0000000..098db61 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysLogMapper.java @@ -0,0 +1,42 @@ +package org.jeecg.modules.system.mapper; + +import org.jeecg.modules.system.entity.SysLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * 系统日志表 Mapper 接口 + * </p> + * + * @author zhangweijian + * @since 2018-12-26 + */ +public interface SysLogMapper extends BaseMapper<SysLog> { + + /** + * @功能:清空所有日志记录 + */ + public void removeAll(); + + /** + * 获取系统总访问次数 + * + * @return Long + */ + Long findTotalVisitCount(); + + /** + * 获取系统今日访问次数 + * + * @return Long + */ + Long findTodayVisitCount(); + + /** + * 获取系统今日访问 IP数 + * + * @return Long + */ + Long findTodayIp(); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java new file mode 100644 index 0000000..37e3c0c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java @@ -0,0 +1,28 @@ +package org.jeecg.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.system.entity.SysPermission; +import org.jeecg.modules.system.model.TreeModel; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * 菜单权限表 Mapper 接口 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +public interface SysPermissionMapper extends BaseMapper<SysPermission> { + + public List<TreeModel> queryListByParentId(@Param("parentId") String parentId); + + /** + * 根据用户查询用户权限 + */ + public List<SysPermission> queryByUser(@Param("username") String username); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java new file mode 100644 index 0000000..1db56f1 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.system.mapper; + +import org.jeecg.modules.system.entity.SysRole; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * 角色表 Mapper 接口 + * </p> + * + * @author scott + * @since 2018-12-19 + */ +public interface SysRoleMapper extends BaseMapper<SysRole> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysRolePermissionMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysRolePermissionMapper.java new file mode 100644 index 0000000..fd517ae --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysRolePermissionMapper.java @@ -0,0 +1,16 @@ +package org.jeecg.modules.system.mapper; + +import org.jeecg.modules.system.entity.SysRolePermission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * 角色权限表 Mapper 接口 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +public interface SysRolePermissionMapper extends BaseMapper<SysRolePermission> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java new file mode 100644 index 0000000..c9ec7ea --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java @@ -0,0 +1,21 @@ +package org.jeecg.modules.system.mapper; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.system.entity.SysUser; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * 用户表 Mapper 接口 + * </p> + * + * @author scott + * @since 2018-12-20 + */ +public interface SysUserMapper extends BaseMapper<SysUser> { + /** + * @param username + * @return + */ + public SysUser getUserByName(@Param("username") String username); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..61f4766 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,21 @@ +package org.jeecg.modules.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.jeecg.modules.system.entity.SysUserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * 用户角色表 Mapper 接口 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +public interface SysUserRoleMapper extends BaseMapper<SysUserRole> { + + @Select("select role_code from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_user where username=#{username}))") + List<String> getRoleByUserName(@Param("username") String username); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementMapper.xml new file mode 100644 index 0000000..2dbfe55 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.system.mapper.SysAnnouncementMapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml new file mode 100644 index 0000000..9dfdfe7 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.system.mapper.SysDepartMapper"> +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictItemMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictItemMapper.xml new file mode 100644 index 0000000..a1eee4c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictItemMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.system.mapper.SysDictItemMapper"> + +</mapper> diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml new file mode 100644 index 0000000..5982b45 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.system.mapper.SysDictMapper"> + + <!-- 通过字典code获取字典数据 --> + <select id="queryDictItemsByCode" parameterType="String" resultType="java.util.HashMap"> + select s.item_value value,s.item_text text from sys_dict_item s + where dict_id = (select id from sys_dict where dict_code = #{code}) + order by s.sort_order asc + </select> + + <!-- 通过字典code获取字典数据 --> + <select id="queryDictTextByKey" parameterType="String" resultType="String"> + select s.item_text from sys_dict_item s + where s.dict_id = (select id from sys_dict where dict_code = #{code}) + and s.item_value = #{key} + </select> + +</mapper> diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysLogMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysLogMapper.xml new file mode 100644 index 0000000..6f3342c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysLogMapper.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.system.mapper.SysLogMapper"> + + <!-- 清空所有日志记录 --> + <delete id="removeAll"> + DELETE FROM sys_log + </delete> + + <!-- 获取访问总数 --> + <select id="findTotalVisitCount" resultType="long"> + select count(1) from sys_log where log_type = 1 + </select> + + <!-- 获取今日访问总数 --> + <select id="findTodayVisitCount" resultType="long"> + select count(1) from sys_log where log_type = 1 and datediff(create_time,now())=0 + </select> + + <!-- 获取今日访问总IP数 --> + <select id="findTodayIp" resultType="long"> + select count(distinct(ip)) from sys_log where log_type = 1 and datediff(create_time,now())=0 + </select> + +</mapper> diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml new file mode 100644 index 0000000..decad84 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.system.mapper.SysPermissionMapper"> + + + <resultMap id="TreeModel" type="org.jeecg.modules.system.model.TreeModel" > + <result column="id" property="key" jdbcType="VARCHAR"/> + <result column="name" property="title" jdbcType="VARCHAR"/> + <result column="icon" property="icon" jdbcType="VARCHAR"/> + <result column="parent_id" property="parentId" jdbcType="VARCHAR"/> + <result column="leaf_flag" property="isLeaf" jdbcType="INTEGER"/> + </resultMap> + + + <select id="queryListByParentId" parameterType="Object" resultMap="TreeModel"> + SELECT + id + ,parent_id + ,name + ,icon + ,leaf_flag + FROM sys_permission + WHERE 1=1 + <choose> + <when test="parentId != null and parentId != ''"> + AND parent_id = #{parentId,jdbcType=VARCHAR} + </when> + <otherwise> + AND parent_id is null + </otherwise> + </choose> + </select> + + <select id="queryByUser" parameterType="Object" resultType="org.jeecg.modules.system.entity.SysPermission"> + SELECT p.* + FROM sys_permission p + WHERE exists( + select a.id from sys_role_permission a + join sys_role b on a.role_id = b.id + join sys_user_role c on c.role_id = b.id + join sys_user d on d.id = c.user_id + where p.id = a.permission_id AND d.username = #{username,jdbcType=VARCHAR} + ) + and p.del_flag = 0 + order by p.sort_no ASC + </select> + + + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml new file mode 100644 index 0000000..9641c5e --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.system.mapper.SysUserMapper"> + + <!-- 根据用户名查询 --> + <select id="getUserByName" resultType="org.jeecg.modules.system.entity.SysUser"> + select * from sys_user where username = #{username} + </select> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java new file mode 100644 index 0000000..d5e275b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java @@ -0,0 +1,78 @@ +package org.jeecg.modules.system.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * <p> + * 部门表 封装树结构的部门的名称的实体类 + * <p> + * + * @author Steve + * @Since 2019-01-22 + * + */ +public class DepartIdModel implements Serializable { + + private static final long serialVersionUID = 1L; + + // 主键ID + private String key; + + // 主键ID + private String value; + + // 部门名称 + private String title; + + List<DepartIdModel> children = new ArrayList<>(); + + /** + * 将SysDepartTreeModel的部分数据放在该对象当中 + * @param treeModel + * @return + */ + public DepartIdModel convert(SysDepartTreeModel treeModel) { + this.key = treeModel.getId(); + this.value = treeModel.getId(); + this.title = treeModel.getDepartName(); + return this; + } + + public List<DepartIdModel> getChildren() { + return children; + } + + public void setChildren(List<DepartIdModel> children) { + this.children = children; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java new file mode 100644 index 0000000..71b62ad --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java @@ -0,0 +1,344 @@ +package org.jeecg.modules.system.model; + +import org.jeecg.modules.system.entity.SysDepart; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * <p> + * 部门表 存储树结构数据的实体类 + * <p> + * + * @author Steve + * @Since 2019-01-22 + */ +public class SysDepartTreeModel implements Serializable{ + + private static final long serialVersionUID = 1L; + + /** 对应SysDepart中的id字段,前端数据树中的key*/ + private String key; + + /** 对应SysDepart中的id字段,前端数据树中的value*/ + private String value; + + /** 对应depart_name字段,前端数据树中的title*/ + private String title; + + + // 以下所有字段均与SysDepart相同 + + private String id; + + private String parentId; + + private String departName; + + private String departNameEn; + + private String departNameAbbr; + + private Integer departOrder; + + private Object description; + + private String orgType; + + private String orgCode; + + private String mobile; + + private String fax; + + private String address; + + private String memo; + + private String status; + + private String delFlag; + + private String createBy; + + private Date createTime; + + private String updateBy; + + private Date updateTime; + + private List<SysDepartTreeModel> children = new ArrayList<>(); + + + /** + * 将SysDepart对象转换成SysDepartTreeModel对象 + * @param sysDepart + */ + public SysDepartTreeModel(SysDepart sysDepart) { + this.key = sysDepart.getId(); + this.value = sysDepart.getId(); + this.title = sysDepart.getDepartName(); + this.id = sysDepart.getId(); + this.parentId = sysDepart.getParentId(); + this.departName = sysDepart.getDepartName(); + this.departNameEn = sysDepart.getDepartNameEn(); + this.departNameAbbr = sysDepart.getDepartNameAbbr(); + this.departOrder = sysDepart.getDepartOrder(); + this.description = sysDepart.getDescription(); + this.orgType = sysDepart.getOrgType(); + this.orgCode = sysDepart.getOrgCode(); + this.mobile = sysDepart.getMobile(); + this.fax = sysDepart.getFax(); + this.address = sysDepart.getAddress(); + this.memo = sysDepart.getMemo(); + this.status = sysDepart.getStatus(); + this.delFlag = sysDepart.getDelFlag(); + this.createBy = sysDepart.getCreateBy(); + this.createTime = sysDepart.getCreateTime(); + this.updateBy = sysDepart.getUpdateBy(); + this.updateTime = sysDepart.getUpdateTime(); + } + + + public String getKey() { + return key; + } + + + public void setKey(String key) { + this.key = key; + } + + + public String getValue() { + return value; + } + + + public void setValue(String value) { + this.value = value; + } + + + public String getTitle() { + return title; + } + + + public void setTitle(String title) { + this.title = title; + } + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List<SysDepartTreeModel> getChildren() { + return children; + } + + public void setChildren(List<SysDepartTreeModel> children) { + this.children = children; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getDepartName() { + return departName; + } + + public void setDepartName(String departName) { + this.departName = departName; + } + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + public String getOrgCode() { + return orgCode; + } + + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getFax() { + return fax; + } + + public void setFax(String fax) { + this.fax = fax; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public String getDepartNameEn() { + return departNameEn; + } + + public void setDepartNameEn(String departNameEn) { + this.departNameEn = departNameEn; + } + + public String getDepartNameAbbr() { + return departNameAbbr; + } + + public void setDepartNameAbbr(String departNameAbbr) { + this.departNameAbbr = departNameAbbr; + } + + public Integer getDepartOrder() { + return departOrder; + } + + public void setDepartOrder(Integer departOrder) { + this.departOrder = departOrder; + } + + public Object getDescription() { + return description; + } + + public void setDescription(Object description) { + this.description = description; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public SysDepartTreeModel() { } + + /** + * 重写equals方法 + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SysDepartTreeModel model = (SysDepartTreeModel) o; + return Objects.equals(id, model.id) && + Objects.equals(parentId, model.parentId) && + Objects.equals(departName, model.departName) && + Objects.equals(departNameEn, model.departNameEn) && + Objects.equals(departNameAbbr, model.departNameAbbr) && + Objects.equals(departOrder, model.departOrder) && + Objects.equals(description, model.description) && + Objects.equals(orgType, model.orgType) && + Objects.equals(orgCode, model.orgCode) && + Objects.equals(mobile, model.mobile) && + Objects.equals(fax, model.fax) && + Objects.equals(address, model.address) && + Objects.equals(memo, model.memo) && + Objects.equals(status, model.status) && + Objects.equals(delFlag, model.delFlag) && + Objects.equals(createBy, model.createBy) && + Objects.equals(createTime, model.createTime) && + Objects.equals(updateBy, model.updateBy) && + Objects.equals(updateTime, model.updateTime) && + Objects.equals(children, model.children); + } + + /** + * 重写hashCode方法 + */ + @Override + public int hashCode() { + + return Objects.hash(id, parentId, departName, departNameEn, departNameAbbr, + departOrder, description, orgType, orgCode, mobile, fax, address, + memo, status, delFlag, createBy, createTime, updateBy, updateTime, + children); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDictTree.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDictTree.java new file mode 100644 index 0000000..d2b31f3 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDictTree.java @@ -0,0 +1,89 @@ +package org.jeecg.modules.system.model; + +import java.io.Serializable; +import java.util.Date; + +import org.jeecg.modules.system.entity.SysDict; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * <p> + * 字典表 + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysDictTree implements Serializable { + + private static final long serialVersionUID = 1L; + + private String key; + + private String title; + + /** + * id + */ + @TableId(type = IdType.UUID) + private String id; + + /** + * 字典名称 + */ + private String dictName; + + /** + * 字典编码 + */ + private String dictCode; + + /** + * 描述 + */ + private String description; + + /** + * 删除状态 + */ + private Integer delFlag; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + public SysDictTree(SysDict node) { + this.id = node.getId(); + this.key = node.getId(); + this.title = node.getDictName(); + this.dictCode = node.getDictCode(); + this.description = node.getDescription(); + this.delFlag = node.getDelFlag(); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysLoginModel.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysLoginModel.java new file mode 100644 index 0000000..afd3787 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysLoginModel.java @@ -0,0 +1,37 @@ +package org.jeecg.modules.system.model; +/** + * 登录表单 + * + * @author scott + * @since 2019-01-18 + */ +public class SysLoginModel { + private String username; + private String password; + //验证码 + private String captcha; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getCaptcha() { + return captcha; + } + + public void setCaptcha(String captcha) { + this.captcha = captcha; + } +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java new file mode 100644 index 0000000..0f5fc10 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java @@ -0,0 +1,304 @@ +package org.jeecg.modules.system.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.jeecg.modules.system.entity.SysPermission; + +public class SysPermissionTree implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + private String id; + + private String key; + + /** + * 父id + */ + private String parentId; + + /** + * 菜单名称 + */ + private String name; + + /** + * 菜单权限编码 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 组件 + */ + private String component; + + /** + * 跳转网页链接 + */ + private String url; + + /** + * 一级菜单跳转地址 + */ + private String redirect; + + /** + * 菜单排序 + */ + private Integer sortNo; + + /** + * 类型(0:一级菜单;1:子菜单 ;2:按钮权限) + */ + private Integer menuType; + + /** + * 是否叶子节点: 1:是 0:不是 + */ + private Integer isLeaf; + + /** + * 描述 + */ + private String description; + + /** + * 删除状态 0正常 1已删除 + */ + private Integer delFlag; + + /** + * 创建人 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + /**alwaysShow*/ + private boolean alwaysShow; + /**是否隐藏路由菜单: 0否,1是(默认值0)*/ + private boolean hidden; + + + public SysPermissionTree() { + } + + public SysPermissionTree(SysPermission permission) { + this.key = permission.getId(); + this.id = permission.getId(); + this.perms = permission.getPerms(); + this.component = permission.getComponent(); + this.createBy = permission.getCreateBy(); + this.createTime = permission.getCreateTime(); + this.delFlag = permission.getDelFlag(); + this.description = permission.getDescription(); + this.icon = permission.getIcon(); + this.isLeaf = permission.getIsLeaf(); + this.menuType = permission.getMenuType(); + this.name = permission.getName(); + this.parentId = permission.getParentId(); + this.sortNo = permission.getSortNo(); + this.updateBy = permission.getUpdateBy(); + this.updateTime = permission.getUpdateTime(); + this.redirect = permission.getRedirect(); + this.url = permission.getUrl(); + this.hidden = permission.isHidden(); + this.alwaysShow= permission.isAlwaysShow(); + if (permission.getIsLeaf() == 0) { + this.children = new ArrayList<SysPermissionTree>(); + } + } + + private List<SysPermissionTree> children; + + public boolean isAlwaysShow() { + return alwaysShow; + } + + public void setAlwaysShow(boolean alwaysShow) { + this.alwaysShow = alwaysShow; + } + public List<SysPermissionTree> getChildren() { + return children; + } + + public void setChildren(List<SysPermissionTree> children) { + this.children = children; + } + + public String getRedirect() { + return redirect; + } + + public void setRedirect(String redirect) { + this.redirect = redirect; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public boolean isHidden() { + return hidden; + } + + public void setHidden(boolean hidden) { + this.hidden = hidden; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Integer getSortNo() { + return sortNo; + } + + public void setSortNo(Integer sortNo) { + this.sortNo = sortNo; + } + + public Integer getMenuType() { + return menuType; + } + + public void setMenuType(Integer menuType) { + this.menuType = menuType; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getDelFlag() { + return delFlag; + } + + public void setDelFlag(Integer delFlag) { + this.delFlag = delFlag; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getPerms() { + return perms; + } + + public void setPerms(String perms) { + this.perms = perms; + } + + public Integer getIsLeaf() { + return isLeaf; + } + + public void setIsLeaf(Integer isLeaf) { + this.isLeaf = isLeaf; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeModel.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeModel.java new file mode 100644 index 0000000..b6d2e94 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeModel.java @@ -0,0 +1,124 @@ +package org.jeecg.modules.system.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.jeecg.modules.system.entity.SysPermission; + +public class TreeModel implements Serializable { + + private static final long serialVersionUID = 4013193970046502756L; + + private String key; + + private String title; + + private boolean isLeaf; + + private String icon; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public boolean isLeaf() { + return isLeaf; + } + + public void setLeaf(boolean isLeaf) { + this.isLeaf = isLeaf; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + private List<TreeModel> children; + + public List<TreeModel> getChildren() { + return children; + } + + public void setChildren(List<TreeModel> children) { + this.children = children; + } + + public TreeModel() { + + } + + public TreeModel(SysPermission permission) { + this.key = permission.getId(); + this.icon = permission.getIcon(); + this.parentId = permission.getParentId(); + this.title = permission.getName(); + this.value = permission.getId(); + if(permission.getIsLeaf()==0) { + this.children = new ArrayList<TreeModel>(); + } + } + + private String parentId; + + private String label; + + private String value; + + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + /** + * @return the label + */ + public String getLabel() { + return label; + } + + /** + * @param label the label to set + */ + public void setLabel(String label) { + this.label = label; + } + + /** + * @return the value + */ + public String getValue() { + return value; + } + + /** + * @param value the value to set + */ + public void setValue(String value) { + this.value = value; + } + + + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeSelectModel.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeSelectModel.java new file mode 100644 index 0000000..14e219a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeSelectModel.java @@ -0,0 +1,72 @@ +package org.jeecg.modules.system.model; + +import java.io.Serializable; + +public class TreeSelectModel implements Serializable { + + + private static final long serialVersionUID = 9016390975325574747L; + + private String key; + + private String title; + + private boolean isLeaf; + + private String icon; + + private String parentId; + + private String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public boolean isLeaf() { + return isLeaf; + } + + public void setLeaf(boolean isLeaf) { + this.isLeaf = isLeaf; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java new file mode 100644 index 0000000..55c2b4a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.system.service; + +import org.jeecg.modules.system.entity.SysAnnouncement; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 系统通告表 + * @author: jeecg-boot + * @date: 2019-01-02 + * @version: V1.0 + */ +public interface ISysAnnouncementService extends IService<SysAnnouncement> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java new file mode 100644 index 0000000..6f65ba6 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java @@ -0,0 +1,52 @@ +package org.jeecg.modules.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.system.entity.SysDepart; +import org.jeecg.modules.system.model.SysDepartTreeModel; +import java.util.List; + +/** + * <p> + * 部门表 服务实现类 + * <p> + * + * @author:Steve + * @Since: 2019-01-22 + */ +public interface ISysDepartService extends IService<SysDepart>{ + + + /** + * 查询所有部门信息,并分节点进行显示 + * @return + */ + List<SysDepartTreeModel> queryTreeList(); + + /** + * 保存部门数据 + * @param sysDepart + */ + void saveDepartData(SysDepart sysDepart,String username); + + /** + * 更新depart数据 + * @param sysDepart + * @return + */ + Boolean updateDepartDataById(SysDepart sysDepart,String username); + + /** + * 删除depart数据 + * @param id + * @return + */ + /* boolean removeDepartDataById(String id); */ + + /** + * 根据关键字搜索相关的部门数据 + * @param keyWord + * @return + */ + List<SysDepartTreeModel> searhBy(String keyWord); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java new file mode 100644 index 0000000..f99e8ea --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java @@ -0,0 +1,16 @@ +package org.jeecg.modules.system.service; + +import org.jeecg.modules.system.entity.SysDictItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * 服务类 + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +public interface ISysDictItemService extends IService<SysDictItem> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictService.java new file mode 100644 index 0000000..2a06196 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictService.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.system.service; + +import java.util.List; +import java.util.Map; +import org.jeecg.modules.system.entity.SysDict; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * 字典表 服务类 + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +public interface ISysDictService extends IService<SysDict> { + public List<Map<String,String>> queryDictItemsByCode(String code); + + public String queryDictTextByKey(String code,String key); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysLogService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysLogService.java new file mode 100644 index 0000000..66d2927 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysLogService.java @@ -0,0 +1,43 @@ +package org.jeecg.modules.system.service; + +import org.jeecg.modules.system.entity.SysLog; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * 系统日志表 服务类 + * </p> + * + * @author zhangweijian + * @since 2018-12-26 + */ +public interface ISysLogService extends IService<SysLog> { + + /** + * @功能:清空所有日志记录 + */ + public void removeAll(); + + /** + * 获取系统总访问次数 + * + * @return Long + */ + Long findTotalVisitCount(); + + /** + * 获取系统今日访问次数 + * + * @return Long + */ + Long findTodayVisitCount(); + + /** + * 获取系统今日访问 IP数 + * + * @return Long + */ + Long findTodayIp(); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionService.java new file mode 100644 index 0000000..c41f5ed --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionService.java @@ -0,0 +1,34 @@ +package org.jeecg.modules.system.service; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.modules.system.entity.SysPermission; +import org.jeecg.modules.system.model.TreeModel; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * 菜单权限表 服务类 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +public interface ISysPermissionService extends IService<SysPermission> { + + public List<TreeModel> queryListByParentId(String parentId); + + /**真实删除*/ + public void deletePermission(String id) throws JeecgBootException; + /**逻辑删除*/ + public void deletePermissionLogical(String id) throws JeecgBootException; + + public void addPermission(SysPermission sysPermission) throws JeecgBootException; + + public void editPermission(SysPermission sysPermission) throws JeecgBootException; + + public List<SysPermission> queryByUser(String username); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysRolePermissionService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysRolePermissionService.java new file mode 100644 index 0000000..6965386 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysRolePermissionService.java @@ -0,0 +1,23 @@ +package org.jeecg.modules.system.service; + +import org.jeecg.modules.system.entity.SysRolePermission; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * 角色权限表 服务类 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +public interface ISysRolePermissionService extends IService<SysRolePermission> { + + /** + * 保存授权/先删后增 + * @param roleId + * @param permissionIds + */ + public void saveRolePermission(String roleId,String permissionIds); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysRoleService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysRoleService.java new file mode 100644 index 0000000..fd88297 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysRoleService.java @@ -0,0 +1,22 @@ +package org.jeecg.modules.system.service; + +import org.jeecg.modules.system.entity.SysRole; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * 角色表 服务类 + * </p> + * + * @author scott + * @since 2018-12-19 + */ +public interface ISysRoleService extends IService<SysRole> { + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java new file mode 100644 index 0000000..2d9b0f2 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java @@ -0,0 +1,16 @@ +package org.jeecg.modules.system.service; + +import org.jeecg.modules.system.entity.SysUserRole; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * 用户角色表 服务类 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +public interface ISysUserRoleService extends IService<SysUserRole> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserService.java new file mode 100644 index 0000000..04f4bdd --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserService.java @@ -0,0 +1,40 @@ +package org.jeecg.modules.system.service; + +import java.util.List; +import org.jeecg.modules.system.entity.SysUser; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * 用户表 服务类 + * </p> + * + * @author scott + * @since 2018-12-20 + */ +public interface ISysUserService extends IService<SysUser> { + + public SysUser getUserByName(String username); + + /** + * 添加用户和用户角色关系 + * @param user + * @param roles + */ + public void addUserWithRole(SysUser user,String roles); + + + /** + * 修改用户和用户角色关系 + * @param user + * @param roles + */ + public void editUserWithRole(SysUser user,String roles); + + /** + * 获取用户的授权角色 + * @param username + * @return + */ + public List<String> getRole(String username); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java new file mode 100644 index 0000000..fc810ee --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.system.service.impl; + +import org.jeecg.modules.system.entity.SysAnnouncement; +import org.jeecg.modules.system.mapper.SysAnnouncementMapper; +import org.jeecg.modules.system.service.ISysAnnouncementService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 系统通告表 + * @author: jeecg-boot + * @date: 2019-01-02 + * @version: V1.0 + */ +@Service +public class SysAnnouncementServiceImpl extends ServiceImpl<SysAnnouncementMapper, SysAnnouncement> implements ISysAnnouncementService { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysBaseAPI.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysBaseAPI.java new file mode 100644 index 0000000..e338466 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysBaseAPI.java @@ -0,0 +1,48 @@ +package org.jeecg.modules.system.service.impl; + +import java.util.Date; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.util.IPUtils; +import org.jeecg.common.util.SpringContextUtils; +import org.jeecg.modules.system.entity.SysLog; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.mapper.SysLogMapper; +import org.springframework.stereotype.Service; + +@Service +public class SysBaseAPI implements ISysBaseAPI { + @Resource + private SysLogMapper sysLogMapper; + + @Override + public void addLog(String LogContent, Integer logType, Integer operatetype) { + SysLog sysLog = new SysLog(); + //注解上的描述,操作日志内容 + sysLog.setLogContent(LogContent); + sysLog.setLogType(logType); + sysLog.setOperateType(operatetype); + + //请求的方法名 + //请求的参数 + + //获取request + HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); + //设置IP地址 + sysLog.setIp(IPUtils.getIpAddr(request)); + + //获取登录用户信息 + SysUser sysUser = (SysUser)SecurityUtils.getSubject().getPrincipal(); + if(sysUser!=null){ + sysLog.setUserid(sysUser.getUsername()); + sysLog.setUsername(sysUser.getRealname()); + + } + sysLog.setCreateTime(new Date()); + //保存系统日志 + sysLogMapper.insert(sysLog); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java new file mode 100644 index 0000000..705c99e --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java @@ -0,0 +1,196 @@ +package org.jeecg.modules.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import io.netty.util.internal.StringUtil; +import org.jeecg.modules.system.controller.FindsDepartsChildrenUtil; +import org.jeecg.common.util.YouBianCodeUtil; +import org.jeecg.modules.system.entity.SysDepart; +import org.jeecg.modules.system.mapper.SysDepartMapper; +import org.jeecg.modules.system.model.SysDepartTreeModel; +import org.jeecg.modules.system.service.ISysDepartService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.*; + +/** + * <p> + * 部门表 服务实现类 + * <p> + * + * @author Steve + * @Since 2019-01-22 + */ +@Service +public class SysDepartServiceImpl<T> extends ServiceImpl<SysDepartMapper, SysDepart> implements ISysDepartService { + + @Autowired + private ISysDepartService sysDepartService; + + // 该集合用来存储部门下的所有数据 + private List<SysDepart> globalList = new ArrayList<>(); + + + /** + * queryTreeList 对应 queryTreeList 查询所有的部门数据,以树结构形式响应给前端 + */ + @Override + public List<SysDepartTreeModel> queryTreeList() { + LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>(); + query.eq(SysDepart::getDelFlag, 0); + query.orderByAsc(SysDepart::getDepartOrder); + List<SysDepart> list = sysDepartService.list(query); + globalList = list; + // 调用wrapTreeDataToTreeList方法生成树状数据 + List<SysDepartTreeModel> listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(list); + return listResult; + } + + /** + * saveDepartData 对应 add 保存用户在页面添加的新的部门对象数据 + */ + @Override + @Transactional + public void saveDepartData(SysDepart sysDepart, String username) { + if (sysDepart != null && username != null) { + if (sysDepart.getParentId() == null) { + sysDepart.setParentId(""); + } + String s = UUID.randomUUID().toString().replace("-", ""); + sysDepart.setId(s); + // 先判断该对象有无父级ID,有则意味着不是最高级,否则意味着是最高级 + // 获取父级ID + String parentId = sysDepart.getParentId(); + String[] codeArray = generateOrgCode(parentId); + sysDepart.setOrgCode(codeArray[0]); + String orgType = codeArray[1]; + sysDepart.setOrgType(String.valueOf(orgType)); + sysDepart.setCreateTime(new Date()); + sysDepart.setDelFlag("0"); + sysDepartService.save(sysDepart); + } + + } + + /** + * saveDepartData 的调用方法,生成部门编码和部门类型 + * + * @param parentId + * @param strArray + * @param departList + * @return + */ + private String[] generateOrgCode(String parentId) { + //update-begin--Author:Steve Date:20190201 for:组织机构添加数据代码调整 + LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>(); + LambdaQueryWrapper<SysDepart> query1 = new LambdaQueryWrapper<SysDepart>(); + String[] strArray = new String[2]; + // 创建一个List集合,存储查询返回的所有SysDepart对象 + List<SysDepart> departList = new ArrayList<>(); + // 定义新编码字符串 + String newOrgCode = ""; + // 定义旧编码字符串 + String oldOrgCode = ""; + // 定义部门类型 + String orgType = ""; + // 如果是最高级,则查询出同级的org_code, 调用工具类生成编码并返回 + if (StringUtil.isNullOrEmpty(parentId)) { + // 线判断数据库中的表是否为空,空则直接返回初始编码 + query1.eq(SysDepart::getParentId, ""); + query1.orderByDesc(SysDepart::getOrgCode); + departList = sysDepartService.list(query1); + if(departList == null || departList.size() == 0) { + strArray[0] = YouBianCodeUtil.getNextYouBianCode(null); + strArray[1] = "1"; + return strArray; + }else { + SysDepart depart = departList.get(0); + oldOrgCode = depart.getOrgCode(); + orgType = depart.getOrgType(); + newOrgCode = YouBianCodeUtil.getNextYouBianCode(oldOrgCode); + } + } else { // 反之则查询出所有同级的部门,获取结果后有两种情况,有同级和没有同级 + // 封装查询同级的条件 + query.eq(SysDepart::getParentId, parentId); + // 降序排序 + query.orderByDesc(SysDepart::getOrgCode); + // 查询出同级部门的集合 + List<SysDepart> parentList = sysDepartService.list(query); + // 查询出父级部门 + SysDepart depart = sysDepartService.getById(parentId); + // 获取父级部门的Code + String parentCode = depart.getOrgCode(); + // 根据父级部门类型算出当前部门的类型 + orgType = String.valueOf(Integer.valueOf(depart.getOrgType()) + 1); + // 处理同级部门为null的情况 + if (parentList == null || parentList.size() == 0) { + // 直接生成当前的部门编码并返回 + newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, null); + } else { //处理有同级部门的情况 + // 获取同级部门的编码,利用工具类 + String subCode = parentList.get(0).getOrgCode(); + // 返回生成的当前部门编码 + newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, subCode); + } + } + // 返回最终封装了部门编码和部门类型的数组 + strArray[0] = newOrgCode; + strArray[1] = orgType; + return strArray; + //update-end--Author:Steve Date:20190201 for:组织机构添加数据代码调整 + } + + + /** + * removeDepartDataById 对应 delete方法 根据ID删除相关部门数据 + * + */ + /* + * @Override + * + * @Transactional public boolean removeDepartDataById(String id) { + * System.out.println("要删除的ID 为=============================>>>>>"+id); boolean + * flag = sysDepartService.removeById(id); return flag; } + */ + + /** + * updateDepartDataById 对应 edit 根据部门主键来更新对应的部门数据 + */ + @Override + @Transactional + public Boolean updateDepartDataById(SysDepart sysDepart, String username) { + if (sysDepart != null && username != null) { + sysDepart.setUpdateTime(new Date()); + sysDepart.setUpdateBy(username); + sysDepartService.updateById(sysDepart); + return true; + } else { + return false; + } + + } + + + /** + * <p> + * 根据关键字搜索相关的部门数据 + * </p> + */ + @Override + public List<SysDepartTreeModel> searhBy(String keyWord) { + LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>(); + query.like(SysDepart::getDepartName, keyWord); + List<SysDepart> departList = this.sysDepartService.list(query); + List<SysDepartTreeModel> newList = new ArrayList<>(); + if(departList.size() > 0 || sysDepartService != null) { + for(SysDepart depart : departList) { + newList.add(new SysDepartTreeModel(depart)); + } + return newList; + } + return null; + } + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictItemServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictItemServiceImpl.java new file mode 100644 index 0000000..d656fde --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictItemServiceImpl.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.system.service.impl; + +import org.jeecg.modules.system.entity.SysDictItem; +import org.jeecg.modules.system.mapper.SysDictItemMapper; +import org.jeecg.modules.system.service.ISysDictItemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * <p> + * 服务实现类 + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +@Service +public class SysDictItemServiceImpl extends ServiceImpl<SysDictItemMapper, SysDictItem> implements ISysDictItemService { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java new file mode 100644 index 0000000..c5b3074 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java @@ -0,0 +1,37 @@ +package org.jeecg.modules.system.service.impl; + +import java.util.List; +import java.util.Map; + +import org.jeecg.modules.system.entity.SysDict; +import org.jeecg.modules.system.mapper.SysDictMapper; +import org.jeecg.modules.system.service.ISysDictService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * <p> + * 字典表 服务实现类 + * </p> + * + * @author zhangweijian + * @since 2018-12-28 + */ +@Service +public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDict> implements ISysDictService { + + @Autowired + private SysDictMapper sysDictMapper; + @Override + public List<Map<String, String>> queryDictItemsByCode(String code) { + return sysDictMapper.queryDictItemsByCode(code); + } + + @Override + public String queryDictTextByKey(String code, String key) { + return sysDictMapper.queryDictTextByKey(code, key); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java new file mode 100644 index 0000000..a5348e3 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java @@ -0,0 +1,49 @@ +package org.jeecg.modules.system.service.impl; + +import javax.annotation.Resource; + +import org.jeecg.modules.system.entity.SysLog; +import org.jeecg.modules.system.mapper.SysLogMapper; +import org.jeecg.modules.system.service.ISysLogService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * <p> + * 系统日志表 服务实现类 + * </p> + * + * @author zhangweijian + * @since 2018-12-26 + */ +@Service +public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> implements ISysLogService { + + @Resource + private SysLogMapper sysLogMapper; + + /** + * @功能:清空所有日志记录 + */ + @Override + public void removeAll() { + sysLogMapper.removeAll(); + } + + @Override + public Long findTotalVisitCount() { + return sysLogMapper.findTotalVisitCount(); + } + + @Override + public Long findTodayVisitCount() { + return sysLogMapper.findTodayVisitCount(); + } + + @Override + public Long findTodayIp() { + return sysLogMapper.findTodayIp(); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java new file mode 100644 index 0000000..1e5fd2d --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java @@ -0,0 +1,125 @@ +package org.jeecg.modules.system.service.impl; + +import java.util.Date; +import java.util.List; + +import javax.annotation.Resource; + +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysPermission; +import org.jeecg.modules.system.mapper.SysPermissionMapper; +import org.jeecg.modules.system.model.TreeModel; +import org.jeecg.modules.system.service.ISysPermissionService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * <p> + * 菜单权限表 服务实现类 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +@Service +public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, SysPermission> implements ISysPermissionService { + + @Resource + private SysPermissionMapper sysPermissionMapper; + + @Override + public List<TreeModel> queryListByParentId(String parentId) { + return sysPermissionMapper.queryListByParentId(parentId); + } + + /** + * 真实删除 + */ + @Override + public void deletePermission(String id) throws JeecgBootException { + SysPermission sysPermission = this.getById(id); + if(sysPermission==null) { + throw new JeecgBootException("未找到菜单信息"); + } + String pid = sysPermission.getParentId(); + int count = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, pid)); + if(count==1) { + //若父节点无其他子节点,则该父节点是叶子节点 + this.update(new SysPermission().setIsLeaf(1),new UpdateWrapper<SysPermission>().eq("id",pid)); + } + sysPermissionMapper.deleteById(id); + } + + /** + * 逻辑删除 + */ + @Override + public void deletePermissionLogical(String id) throws JeecgBootException { + SysPermission sysPermission = this.getById(id); + if(sysPermission==null) { + throw new JeecgBootException("未找到菜单信息"); + } + String pid = sysPermission.getParentId(); + int count = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, pid)); + if(count==1) { + //若父节点无其他子节点,则该父节点是叶子节点 + this.update(new SysPermission().setIsLeaf(1),new UpdateWrapper<SysPermission>().eq("id",pid)); + } + sysPermission.setDelFlag(1); + this.updateById(sysPermission); + } + + @Override + public void addPermission(SysPermission sysPermission) throws JeecgBootException { + //---------------------------------------------------------------------- + //判断是否是一级菜单,是的话清空父菜单 + if(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) { + sysPermission.setParentId(null); + } + //---------------------------------------------------------------------- + String pid = sysPermission.getParentId(); + if(oConvertUtils.isNotEmpty(pid)) { + //设置父节点不为叶子节点 + this.update(new SysPermission().setIsLeaf(0),new UpdateWrapper<SysPermission>().eq("id",pid)); + } + sysPermission.setCreateTime(new Date()); + sysPermission.setDelFlag(0); + sysPermission.setIsLeaf(1); + this.save(sysPermission); + } + + @Override + public void editPermission(SysPermission sysPermission) throws JeecgBootException { + SysPermission p = this.getById(sysPermission.getId()); + //TODO 该节点判断是否还有子节点 + if(p==null) { + throw new JeecgBootException("未找到菜单信息"); + }else { + sysPermission.setUpdateTime(new Date()); + //---------------------------------------------------------------------- + //判断是否是一级菜单,是的话清空父菜单 + if(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) { + sysPermission.setParentId(""); + } + //---------------------------------------------------------------------- + this.updateById(sysPermission); + String pid = sysPermission.getParentId(); + if(oConvertUtils.isNotEmpty(pid) && !pid.equals(p.getParentId())) { + //设置父节点不为叶子节点 + this.update(new SysPermission().setIsLeaf(0),new UpdateWrapper<SysPermission>().eq("id",pid)); + } + } + + } + + @Override + public List<SysPermission> queryByUser(String username) { + return this.sysPermissionMapper.queryByUser(username); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java new file mode 100644 index 0000000..6785acf --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java @@ -0,0 +1,42 @@ +package org.jeecg.modules.system.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysRolePermission; +import org.jeecg.modules.system.mapper.SysRolePermissionMapper; +import org.jeecg.modules.system.service.ISysRolePermissionService; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * <p> + * 角色权限表 服务实现类 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +@Service +public class SysRolePermissionServiceImpl extends ServiceImpl<SysRolePermissionMapper, SysRolePermission> implements ISysRolePermissionService { + + @Override + public void saveRolePermission(String roleId, String permissionIds) { + LambdaQueryWrapper<SysRolePermission> query = new QueryWrapper<SysRolePermission>().lambda().eq(SysRolePermission::getRoleId, roleId); + this.remove(query); + List<SysRolePermission> list = new ArrayList<SysRolePermission>(); + String arr[] = permissionIds.split(","); + for (String p : arr) { + if(oConvertUtils.isNotEmpty(p)) { + SysRolePermission rolepms = new SysRolePermission(roleId, p); + list.add(rolepms); + } + } + this.saveBatch(list); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysRoleServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..026f965 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,27 @@ +package org.jeecg.modules.system.service.impl; + +import org.jeecg.modules.system.entity.SysRole; +import org.jeecg.modules.system.mapper.SysRoleMapper; +import org.jeecg.modules.system.service.ISysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * <p> + * 角色表 服务实现类 + * </p> + * + * @author scott + * @since 2018-12-19 + */ +@Service +public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService { + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java new file mode 100644 index 0000000..04b3bda --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.system.service.impl; + +import org.jeecg.modules.system.entity.SysUserRole; +import org.jeecg.modules.system.mapper.SysUserRoleMapper; +import org.jeecg.modules.system.service.ISysUserRoleService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * <p> + * 用户角色表 服务实现类 + * </p> + * + * @author scott + * @since 2018-12-21 + */ +@Service +public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements ISysUserRoleService { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..75d6724 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java @@ -0,0 +1,73 @@ +package org.jeecg.modules.system.service.impl; + +import java.util.List; +import java.util.UUID; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.entity.SysUserRole; +import org.jeecg.modules.system.mapper.SysUserMapper; +import org.jeecg.modules.system.mapper.SysUserRoleMapper; +import org.jeecg.modules.system.service.ISysUserService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * <p> + * 用户表 服务实现类 + * </p> + * + * @author scott + * @since 2018-12-20 + */ +@Service +public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService { + + @Autowired + private SysUserMapper userMapper; + + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + @Override + public SysUser getUserByName(String username) { + return userMapper.getUserByName(username); + } + + + @Override + public void addUserWithRole(SysUser user, String roles) { + String id =UUID.randomUUID().toString().replace("-", ""); + user.setId(id); + this.save(user); + if(oConvertUtils.isNotEmpty(roles)) { + String[] arr = roles.split(","); + for (String roleId : arr) { + SysUserRole userRole = new SysUserRole(id, roleId); + sysUserRoleMapper.insert(userRole); + } + } + } + + @Override + public void editUserWithRole(SysUser user, String roles) { + this.updateById(user); + //先删后加 + sysUserRoleMapper.delete(new QueryWrapper<SysUserRole>().lambda().eq(SysUserRole::getUserId, user.getId())); + if(oConvertUtils.isNotEmpty(roles)) { + String[] arr = roles.split(","); + for (String roleId : arr) { + SysUserRole userRole = new SysUserRole(user.getId(), roleId); + sysUserRoleMapper.insert(userRole); + } + } + } + + + @Override + public List<String> getRole(String username) { + return sysUserRoleMapper.getRoleByUserName(username); + } + +} diff --git a/jeecg-boot/src/main/resources/application.yml b/jeecg-boot/src/main/resources/application.yml new file mode 100644 index 0000000..bc5dbb6 --- /dev/null +++ b/jeecg-boot/src/main/resources/application.yml @@ -0,0 +1,95 @@ +server: + port: 8080 + servlet: + context-path: /jeecg-boot +spring: + ## quartz定时任务,采用数据库方式 + quartz: + job-store-type: jdbc + #json 时间戳统一转换 + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + aop: + proxy-target-class: true + #配置freemarker + freemarker: + # 设置模板后缀名 + suffix: .ftl + # 设置文档类型 + content-type: text/html + # 设置页面编码格式 + charset: UTF-8 + # 设置页面缓存 + cache: false + # 设置ftl文件路径 + template-loader-path: + - classpath:/templates + # 设置静态文件路径,js,css等 + mvc: + static-path-pattern: /** + resource: + static-locations: classpath:/static/,classpath:/public/ + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure + datasource: + druid: + stat-view-servlet: + loginUsername: admin + loginPassword: 123456 + dynamic: + druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置) + # 连接池的配置信息 + # 初始化大小,最小,最大 + initial-size: 5 + min-idle: 5 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + poolPreparedStatements: true + maxPoolPreparedStatementPerConnectionSize: 20 + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + filters: stat,wall,slf4j + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 + datasource: + master: + url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false + username: root + password: root + driver-class-name: com.mysql.jdbc.Driver + # 多数据源配置 + #multi-datasource1: + #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true + #username: root + #password: root + #driver-class-name: com.mysql.jdbc.Driver + #redis 配置 + redis: + database: 0 + #host: 127.0.0.1 + host: 192.168.1.199 + lettuce: + pool: + max-active: 8 #最大连接数据库连接数,设 0 为没有限制 + max-idle: 8 #最大等待连接中的数量,设 0 为没有限制 + max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 + min-idle: 0 #最小等待连接中的数量,设 0 为没有限制 + shutdown-timeout: 100ms + password: '' + port: 6379 +#mybatis plus 设置 +mybatis-plus: + mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml + +#文件上传根目录 设置 +uploadpath: D://upFiles diff --git a/jeecg-boot/src/main/resources/banner.txt b/jeecg-boot/src/main/resources/banner.txt new file mode 100644 index 0000000..5ac1b97 --- /dev/null +++ b/jeecg-boot/src/main/resources/banner.txt @@ -0,0 +1,7 @@ + (_) | | | | + _ ___ ___ ___ __ _ ______| |__ ___ ___ | |_ + | |/ _ \/ _ \/ __/ _` |______| '_ \ / _ \ / _ \| __| + | | __/ __/ (_| (_| | | |_) | (_) | (_) | |_ + | |\___|\___|\___\__, | |_.__/ \___/ \___/ \__| + _/ | __/ | + |__/ |___/ \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/db/data-mysql.sql b/jeecg-boot/src/main/resources/db/data-mysql.sql new file mode 100644 index 0000000..a4ce630 --- /dev/null +++ b/jeecg-boot/src/main/resources/db/data-mysql.sql @@ -0,0 +1,8 @@ +DELETE FROM demo; + +INSERT INTO demo (id, name, age, email,sex,birthday,content) VALUES +(1, 'Jone', 18, 'test1@baomidou.com','1','2017-12-28','很好'), +(2, 'Jack', 20, 'test2@baomidou.com','2','2018-02-28','努力型'), +(3, 'Tom', 28, 'test3@baomidou.com','1','2018-11-28','吃苦'), +(4, 'Sandy', 21, 'test4@baomidou.com','1','2018-07-28','聪明'), +(5, 'Billie', 24, 'test5@baomidou.com','2','2018-12-11','出色'); diff --git a/jeecg-boot/src/main/resources/db/schema-mysql.sql b/jeecg-boot/src/main/resources/db/schema-mysql.sql new file mode 100644 index 0000000..2eea9ec --- /dev/null +++ b/jeecg-boot/src/main/resources/db/schema-mysql.sql @@ -0,0 +1,11 @@ +DROP TABLE IF EXISTS demo; +CREATE TABLE demo ( + id BIGINT(20) NOT NULL auto_increment COMMENT '主键ID', + name varchar(30) default NULL COMMENT '姓名', + sex varchar(2) default NULL, + age int(11) default NULL COMMENT '年龄', + birthday date default NULL COMMENT '生日', + email varchar(50) default NULL COMMENT '邮箱', + content varchar(1000) default NULL COMMENT '个人简介', + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai new file mode 100644 index 0000000..31a63ac --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -0,0 +1,165 @@ +package ${bussiPackage}.${entityPackage}.controller; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.oConvertUtils; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + + /** + * @Title: Controller + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@RestController +@RequestMapping("/${entityPackage}/${entityName?uncap_first}") +@Slf4j +public class ${entityName}Controller { + @Autowired + private I${entityName}Service ${entityName?uncap_first}Service; + + /** + * 分页列表查询 + * @param ${entityName?uncap_first} + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/list") + public Result<IPage<${entityName}>> queryPageList(${entityName} ${entityName?uncap_first}, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result<IPage<${entityName}>> result = new Result<IPage<${entityName}>>(); + QueryWrapper<${entityName}> queryWrapper = new QueryWrapper<${entityName}>(${entityName?uncap_first}); + Page<${entityName}> page = new Page<${entityName}>(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper); + //log.debug("查询当前页:"+pageList.getCurrent()); + //log.debug("查询当前页数量:"+pageList.getSize()); + //log.debug("查询结果数量:"+pageList.getRecords().size()); + //log.debug("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param ${entityName?uncap_first} + * @return + */ + @PostMapping(value = "/add") + public Result<${entityName}> add(@RequestBody ${entityName} ${entityName?uncap_first}) { + Result<${entityName}> result = new Result<${entityName}>(); + try { + ${entityName?uncap_first}Service.save(${entityName?uncap_first}); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param ${entityName?uncap_first} + * @return + */ + @PutMapping(value = "/edit") + public Result<${entityName}> eidt(@RequestBody ${entityName} ${entityName?uncap_first}) { + Result<${entityName}> result = new Result<${entityName}>(); + ${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId()); + if(${entityName?uncap_first}Entity==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = ${entityName?uncap_first}Service.updateById(${entityName?uncap_first}); + //TODO 返回false说明什么? + if(ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result<${entityName}> delete(@RequestParam(name="id",required=true) String id) { + Result<${entityName}> result = new Result<${entityName}>(); + ${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id); + if(${entityName?uncap_first}==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = ${entityName?uncap_first}Service.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<${entityName}> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<${entityName}> result = new Result<${entityName}>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result<${entityName}> queryById(@RequestParam(name="id",required=true) String id) { + Result<${entityName}> result = new Result<${entityName}>(); + ${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id); + if(${entityName?uncap_first}==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(${entityName?uncap_first}); + result.setSuccess(true); + } + return result; + } + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai new file mode 100644 index 0000000..a617492 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai @@ -0,0 +1,39 @@ +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@Data +@TableName("${tableName}") +public class ${entityName} implements Serializable { + private static final long serialVersionUID = 1L; + + <#list originalColumns as po> + /**${po.filedComment}*/ + <#if po.fieldName == tableId> + @TableId(type = IdType.UUID) + </#if> + <#if po.fieldType =='java.util.Date'> + <#if po.fieldDbType =='date'> + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#elseif po.fieldDbType =='datetime'> + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + </#if> + </#if> + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName}; + </#list> +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai new file mode 100644 index 0000000..34deb8b --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai @@ -0,0 +1,17 @@ +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface ${entityName}Mapper extends BaseMapper<${entityName}> { + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml new file mode 100644 index 0000000..16f3d65 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai new file mode 100644 index 0000000..561b2ca --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai @@ -0,0 +1,14 @@ +package ${bussiPackage}.${entityPackage}.service; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface I${entityName}Service extends IService<${entityName}> { + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai new file mode 100644 index 0000000..6144399 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai @@ -0,0 +1,19 @@ +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@Service +public class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service { + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei new file mode 100644 index 0000000..ab6c8e1 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -0,0 +1,287 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + +<#list columns as po> +<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum> + <a-col :span="6"> + <a-form-item label="${po.filedComment}"> + <a-input placeholder="请输入${po.filedComment}" v-model="queryParam.${po.fieldName}"></a-input> + </a-form-item> + </a-col> +</#if> +</#list> + + <a-col :span="8" > + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + + </a-row> + </a-form> + </div> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="middle" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> + <a-menu slot="overlay"> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <${entityName?uncap_first}-modal ref="${entityName?uncap_first}Modal" @ok="modalFormOk"></${entityName?uncap_first}-modal> + </a-card> +</template> + +<script> + import ${entityName}Modal from './modules/${entityName}Modal' + import { filterObj } from '@/utils/util' + import { deleteAction,getAction } from '@/api/manage' + + export default { + name: "${entityName}List", + components: { + ${entityName}Modal + }, + data () { + return { + description: '${tableVo.ftlDescription}管理页面', + // 查询条件 + queryParam: {}, + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + <#list columns as po> + <#if po.fieldName !='id'> + { + title: '${po.filedComment}', + align:"center", + dataIndex: '${po.fieldName}' + }, + </#if> + </#list> + { + title: '操作', + dataIndex: 'action', + align:"center", + scopedSlots: { customRender: 'action' }, + } + ], + //数据集 + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/${entityPackage}/${entityName?uncap_first}/list", + delete: "/${entityPackage}/${entityName?uncap_first}/delete", + deleteBatch: "/${entityPackage}/${entityName?uncap_first}/deleteBatch", + }, + + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list,params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + var that = this; + that.queryParam={}; + that.loadData(1); + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function(id){ + var that = this; + deleteAction(that.url.delete,{id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleEdit: function(record){ + this.$refs.${entityName?uncap_first}Modal.edit(record); + this.$refs.${entityName?uncap_first}Modal.title="编辑"; + }, + handleAdd: function(){ + this.$refs.${entityName?uncap_first}Modal.add(); + this.$refs.${entityName?uncap_first}Modal.title="新增"; + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + } + } + } +</script> +<style lang="less" scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} +</style> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei new file mode 100644 index 0000000..20a115a --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei @@ -0,0 +1,155 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + +<#list columns as po><#rt/> +<#if po.fieldName !='id'><#rt/> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="${po.filedComment}"> + <#if po.fieldType =='date'> + <a-date-picker v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + <#elseif po.fieldType =='datetime'> + <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + <#elseif "int,decimal,double,"?contains(po.fieldType)> + <a-input-number v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + <#else> + <a-input placeholder="请输入${po.filedComment}" v-decorator="['${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + </#if> + </a-form-item> +</#if> +</#list> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction } from '@/api/manage' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: "${entityName}Modal", + data () { + return { + title:"操作", + visible: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + <#list columns as po> + <#if po.fieldName !='id'> + <#if po.nullable =='N'> + ${po.fieldName}:{rules: [{ required: true, message: '请输入${po.filedComment}!' }]}, + </#if> + </#if> + </#list> + }, + url: { + add: "/${entityPackage}/${entityName?uncap_first}/add", + edit: "/${entityPackage}/${entityName?uncap_first}/edit", + }, + } + }, + created () { + }, + methods: { + add () { + this.edit({}); + }, + edit (record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model<#list columns as po><#if po.fieldName !='id' && po.fieldType?index_of("date")==-1>,'${po.fieldName}'</#if></#list>)) + //时间格式化 + <#list columns as po> + <#if po.fieldName !='id' && po.fieldType?index_of("date")!=-1> + this.form.setFieldsValue({${po.fieldName}:this.model.${po.fieldName}?moment(this.model.${po.fieldName}):null}) + </#if> + </#list> + }); + + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if(!this.model.id){ + httpurl+=this.url.add; + method = 'post'; + }else{ + httpurl+=this.url.edit; + method = 'put'; + } + let formData = Object.assign(this.model, values); + //时间格式化 + <#list columns as po> + <#if po.fieldName !='id' && po.fieldType =='date'> + formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format():null; + <#elseif po.fieldName !='id' && po.fieldType =='datetime'> + formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format('YYYY-MM-DD HH:mm:ss'):null; + </#if> + </#list> + + console.log(formData) + httpAction(httpurl,formData,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + + + + } + }) + }, + handleCancel () { + this.close() + }, + + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai new file mode 100644 index 0000000..52d215c --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai @@ -0,0 +1,165 @@ +package ${bussiPackage}.controller.${entityPackage}; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.oConvertUtils; +import ${bussiPackage}.entity.${entityPackage}.${entityName}; +import ${bussiPackage}.service.${entityPackage}.I${entityName}Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + + /** + * @Title: Controller + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@RestController +@RequestMapping("/${entityPackage}/${entityName?uncap_first}") +@Slf4j +public class ${entityName}Controller { + @Autowired + private I${entityName}Service ${entityName?uncap_first}Service; + + /** + * 分页列表查询 + * @param ${entityName?uncap_first} + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/list") + public Result<IPage<${entityName}>> queryPageList(${entityName} ${entityName?uncap_first}, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result<IPage<${entityName}>> result = new Result<IPage<${entityName}>>(); + QueryWrapper<${entityName}> queryWrapper = new QueryWrapper<${entityName}>(${entityName?uncap_first}); + Page<${entityName}> page = new Page<${entityName}>(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper); + //log.debug("查询当前页:"+pageList.getCurrent()); + //log.debug("查询当前页数量:"+pageList.getSize()); + //log.debug("查询结果数量:"+pageList.getRecords().size()); + //log.debug("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param ${entityName?uncap_first} + * @return + */ + @PostMapping(value = "/add") + public Result<${entityName}> add(@RequestBody ${entityName} ${entityName?uncap_first}) { + Result<${entityName}> result = new Result<${entityName}>(); + try { + ${entityName?uncap_first}Service.save(${entityName?uncap_first}); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param ${entityName?uncap_first} + * @return + */ + @PutMapping(value = "/edit") + public Result<${entityName}> eidt(@RequestBody ${entityName} ${entityName?uncap_first}) { + Result<${entityName}> result = new Result<${entityName}>(); + ${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId()); + if(${entityName?uncap_first}Entity==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = ${entityName?uncap_first}Service.updateById(${entityName?uncap_first}); + //TODO 返回false说明什么? + if(ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result<${entityName}> delete(@RequestParam(name="id",required=true) String id) { + Result<${entityName}> result = new Result<${entityName}>(); + ${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id); + if(${entityName?uncap_first}==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = ${entityName?uncap_first}Service.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<${entityName}> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<${entityName}> result = new Result<${entityName}>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result<${entityName}> queryById(@RequestParam(name="id",required=true) String id) { + Result<${entityName}> result = new Result<${entityName}>(); + ${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id); + if(${entityName?uncap_first}==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(${entityName?uncap_first}); + result.setSuccess(true); + } + return result; + } + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/entity/${entityPackage}/${entityName}.javai b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/entity/${entityPackage}/${entityName}.javai new file mode 100644 index 0000000..1c1da2c --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/entity/${entityPackage}/${entityName}.javai @@ -0,0 +1,39 @@ +package ${bussiPackage}.entity.${entityPackage}; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@Data +@TableName("${tableName}") +public class ${entityName} implements Serializable { + private static final long serialVersionUID = 1L; + + <#list originalColumns as po> + /**${po.filedComment}*/ + <#if po.fieldName == tableId> + @TableId(type = IdType.UUID) + </#if> + <#if po.fieldType =='java.util.Date'> + <#if po.fieldDbType =='date'> + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#elseif po.fieldDbType =='datetime'> + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + </#if> + </#if> + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName}; + </#list> +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/${entityName}Mapper.javai b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/${entityName}Mapper.javai new file mode 100644 index 0000000..b58c461 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/${entityName}Mapper.javai @@ -0,0 +1,17 @@ +package ${bussiPackage}.mapper.${entityPackage}; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import ${bussiPackage}.entity.${entityPackage}.${entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface ${entityName}Mapper extends BaseMapper<${entityName}> { + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/xml/${entityName}Mapper.xml b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/xml/${entityName}Mapper.xml new file mode 100644 index 0000000..fb6f712 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/xml/${entityName}Mapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="${bussiPackage}.mapper.${entityPackage}.${entityName}Mapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/I${entityName}Service.javai b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/I${entityName}Service.javai new file mode 100644 index 0000000..0ff45a6 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/I${entityName}Service.javai @@ -0,0 +1,14 @@ +package ${bussiPackage}.service.${entityPackage}; + +import ${bussiPackage}.entity.${entityPackage}.${entityName}; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface I${entityName}Service extends IService<${entityName}> { + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/impl/${entityName}ServiceImpl.javai b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/impl/${entityName}ServiceImpl.javai new file mode 100644 index 0000000..fc9d000 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/impl/${entityName}ServiceImpl.javai @@ -0,0 +1,19 @@ +package ${bussiPackage}.service.${entityPackage}.impl; + +import ${bussiPackage}.entity.${entityPackage}.${entityName}; +import ${bussiPackage}.mapper.${entityPackage}.${entityName}Mapper; +import ${bussiPackage}.service.${entityPackage}.I${entityName}Service; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@Service +public class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service { + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/${entityName}List.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/${entityName}List.vuei new file mode 100644 index 0000000..ab6c8e1 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/${entityName}List.vuei @@ -0,0 +1,287 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + +<#list columns as po> +<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum> + <a-col :span="6"> + <a-form-item label="${po.filedComment}"> + <a-input placeholder="请输入${po.filedComment}" v-model="queryParam.${po.fieldName}"></a-input> + </a-form-item> + </a-col> +</#if> +</#list> + + <a-col :span="8" > + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + + </a-row> + </a-form> + </div> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="middle" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> + <a-menu slot="overlay"> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <${entityName?uncap_first}-modal ref="${entityName?uncap_first}Modal" @ok="modalFormOk"></${entityName?uncap_first}-modal> + </a-card> +</template> + +<script> + import ${entityName}Modal from './modules/${entityName}Modal' + import { filterObj } from '@/utils/util' + import { deleteAction,getAction } from '@/api/manage' + + export default { + name: "${entityName}List", + components: { + ${entityName}Modal + }, + data () { + return { + description: '${tableVo.ftlDescription}管理页面', + // 查询条件 + queryParam: {}, + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + <#list columns as po> + <#if po.fieldName !='id'> + { + title: '${po.filedComment}', + align:"center", + dataIndex: '${po.fieldName}' + }, + </#if> + </#list> + { + title: '操作', + dataIndex: 'action', + align:"center", + scopedSlots: { customRender: 'action' }, + } + ], + //数据集 + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/${entityPackage}/${entityName?uncap_first}/list", + delete: "/${entityPackage}/${entityName?uncap_first}/delete", + deleteBatch: "/${entityPackage}/${entityName?uncap_first}/deleteBatch", + }, + + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list,params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + var that = this; + that.queryParam={}; + that.loadData(1); + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function(id){ + var that = this; + deleteAction(that.url.delete,{id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleEdit: function(record){ + this.$refs.${entityName?uncap_first}Modal.edit(record); + this.$refs.${entityName?uncap_first}Modal.title="编辑"; + }, + handleAdd: function(){ + this.$refs.${entityName?uncap_first}Modal.add(); + this.$refs.${entityName?uncap_first}Modal.title="新增"; + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + } + } + } +</script> +<style lang="less" scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} +</style> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal.vuei new file mode 100644 index 0000000..dc56664 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal.vuei @@ -0,0 +1,155 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + +<#list columns as po><#rt/> +<#if po.fieldName !='id'><#rt/> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="${po.filedComment}"> + <#if po.fieldType =='date'> + <a-date-picker v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + <#elseif po.fieldType =='datetime'> + <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + <#elseif "int,decimal,double,"?contains(po.fieldType)> + <a-input-number v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + <#else> + <a-input placeholder="请输入${po.filedComment}" v-decorator="['${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + </#if> + </a-form-item> +</#if> +</#list> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction } from '@/api/manage' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: "${entityName}Modal", + data () { + return { + title:"操作", + visible: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + <#list columns as po> + <#if po.fieldName !='id'> + <#if po.nullable =='N'> + ${po.fieldName}:{rules: [{ required: true, message: '请输入${po.filedComment}!' }]}, + </#if> + </#if> + </#list> + }, + url: { + add: "/${entityPackage}/${entityName?uncap_first}/add", + edit: "/${entityPackage}/${entityName?uncap_first}/edit", + }, + } + }, + created () { + }, + methods: { + add () { + this.edit({}); + }, + edit (record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model<#list columns as po><#if po.fieldName !='id' && po.fieldType?index_of("date")==-1>,'${po.fieldName}'</#if></#list>)) + //时间格式化 + <#list columns as po> + <#if po.fieldName !='id' && po.fieldType?index_of("date")!=-1> + this.form.setFieldsValue({${po.fieldName}:this.model.${po.fieldName}?moment(this.model.${po.fieldName}):null}) + </#if> + </#list> + }); + + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if(!this.model.id){ + httpurl+=this.url.add; + method = 'post'; + }else{ + httpurl+=this.url.edit; + method = 'put'; + } + let formData = Object.assign(this.model, values); + //时间格式化 + <#list columns as po> + <#if po.fieldName !='id' && po.fieldType =='date'> + formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format():null; + <#elseif po.fieldName !='id' && po.fieldType =='datetime'> + formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format('YYYY-MM-DD HH:mm:ss'):null; + </#if> + </#list> + + console.log(formData) + httpAction(httpurl,formData,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + + + + } + }) + }, + handleCancel () { + this.close() + }, + + + } + } +</script> + +<style lang="less" scoped> + +</style> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai new file mode 100644 index 0000000..6889945 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -0,0 +1,207 @@ +package org.jeecg.modules.demo.test.controller; + +import java.util.Arrays; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; +import org.jeecg.modules.demo.test.entity.JeecgOrderMain; +import org.jeecg.modules.demo.test.entity.JeecgOrderTicket; +import org.jeecg.modules.demo.test.service.IJeecgOrderCustomerService; +import org.jeecg.modules.demo.test.service.IJeecgOrderMainService; +import org.jeecg.modules.demo.test.service.IJeecgOrderTicketService; +import org.jeecg.modules.demo.test.vo.JeecgOrderMainPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + + /** + * @Title: Controller + * @Description: 订单 + * @author: jeecg-boot + * @date: 2019-02-15 + * @version: V1.0 + */ +@RestController +@RequestMapping("/test/jeecgOrderMain") +@Slf4j +public class JeecgOrderMainController { + @Autowired + private IJeecgOrderMainService jeecgOrderMainService; + <#if isMainTable == "true"> + @Autowired + private IJeecgOrderCustomerService jeecgOrderCustomerService; + @Autowired + private IJeecgOrderTicketService jeecgOrderTicketService; + </#if> + + /** + * 分页列表查询 + * @param jeecgOrderMain + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/list") + public Result<IPage<JeecgOrderMain>> queryPageList(JeecgOrderMain jeecgOrderMain, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result<IPage<JeecgOrderMain>> result = new Result<IPage<JeecgOrderMain>>(); + QueryWrapper<JeecgOrderMain> queryWrapper = new QueryWrapper<JeecgOrderMain>(jeecgOrderMain); + Page<JeecgOrderMain> page = new Page<JeecgOrderMain>(pageNo,pageSize); + //排序逻辑 处理 + String column = req.getParameter("column"); + String order = req.getParameter("order"); + if(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if("asc".equals(order)) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + }else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + IPage<JeecgOrderMain> pageList = jeecgOrderMainService.page(page, queryWrapper); + //log.debug("查询当前页:"+pageList.getCurrent()); + //log.debug("查询当前页数量:"+pageList.getSize()); + //log.debug("查询结果数量:"+pageList.getRecords().size()); + //log.debug("数据总数:"+pageList.getTotal()); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param jeecgOrderMain + * @return + */ + @PostMapping(value = "/add") + public Result<JeecgOrderMain> add(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) { + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + try { + jeecgOrderMainService.saveMain(jeecgOrderMainPage.getJeecgOrderMain(), jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList());; + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param jeecgOrderMain + * @return + */ + @PutMapping(value = "/edit") + public Result<JeecgOrderMain> eidt(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) { + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + JeecgOrderMain jeecgOrderMain = jeecgOrderMainPage.getJeecgOrderMain(); + JeecgOrderMain jeecgOrderMainEntity = jeecgOrderMainService.getById(jeecgOrderMain.getId()); + if(jeecgOrderMainEntity==null) { + result.error500("未找到对应实体"); + }else { + jeecgOrderMainService.updateMain(jeecgOrderMain, jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList()); + result.success("修改成功!"); + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result<JeecgOrderMain> delete(@RequestParam(name="id",required=true) String id) { + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + JeecgOrderMain jeecgOrderMain = jeecgOrderMainService.getById(id); + if(jeecgOrderMain==null) { + result.error500("未找到对应实体"); + }else { + jeecgOrderMainService.delMain(id); + result.success("删除成功!"); + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<JeecgOrderMain> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.jeecgOrderMainService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result<JeecgOrderMain> queryById(@RequestParam(name="id",required=true) String id) { + Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + JeecgOrderMain jeecgOrderMain = jeecgOrderMainService.getById(id); + if(jeecgOrderMain==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(jeecgOrderMain); + result.setSuccess(true); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryOrderCustomerListByMainId") + public Result<List<JeecgOrderCustomer>> queryOrderCustomerListByMainId(@RequestParam(name="id",required=true) String id) { + Result<List<JeecgOrderCustomer>> result = new Result<List<JeecgOrderCustomer>>(); + List<JeecgOrderCustomer> jeecgOrderCustomerList = jeecgOrderCustomerService.selectCustomersByMainId(id); + result.setResult(jeecgOrderCustomerList); + result.setSuccess(true); + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryOrderTicketListByMainId") + public Result<List<JeecgOrderTicket>> queryOrderTicketListByMainId(@RequestParam(name="id",required=true) String id) { + Result<List<JeecgOrderTicket>> result = new Result<List<JeecgOrderTicket>>(); + List<JeecgOrderTicket> jeecgOrderTicketList = jeecgOrderTicketService.selectTicketsByMainId(id); + result.setResult(jeecgOrderTicketList); + result.setSuccess(true); + return result; + } + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai new file mode 100644 index 0000000..a617492 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai @@ -0,0 +1,39 @@ +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@Data +@TableName("${tableName}") +public class ${entityName} implements Serializable { + private static final long serialVersionUID = 1L; + + <#list originalColumns as po> + /**${po.filedComment}*/ + <#if po.fieldName == tableId> + @TableId(type = IdType.UUID) + </#if> + <#if po.fieldType =='java.util.Date'> + <#if po.fieldDbType =='date'> + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#elseif po.fieldDbType =='datetime'> + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + </#if> + </#if> + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName}; + </#list> +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai new file mode 100644 index 0000000..1e3fdb2 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai @@ -0,0 +1,27 @@ +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface ${entityName}Mapper extends BaseMapper<${entityName}> { + /** + * 通过主表外键批量删除客户 + * @param mainId + * @return + */ + @Delete("DELETE FROM JEECG_ORDER_TICKET WHERE ORDER_ID = #{mainId}") + public boolean deleteTicketsByMainId(String mainId); + + + @Select("SELECT * FROM JEECG_ORDER_TICKET WHERE ORDER_ID = #{mainId}") + public List<JeecgOrderTicket> selectTicketsByMainId(String mainId); +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml new file mode 100644 index 0000000..16f3d65 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai new file mode 100644 index 0000000..c39592f --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai @@ -0,0 +1,41 @@ +package ${bussiPackage}.${entityPackage}.service; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface I${entityName}Service extends IService<${entityName}> { +<#if isSubTable == "true"> + public List<JeecgOrderCustomer> selectCustomersByMainId(String mainId); +</#if> +<#if isMainTable == "true"> + /** + * 添加一对多 + * + */ + public void saveMain(JeecgOrderMain jeecgOrderMain,List<JeecgOrderCustomer> jeecgOrderCustomerList,List<JeecgOrderTicket> jeecgOrderTicketList) ; + + /** + * 修改一对多 + * + */ + public void updateMain(JeecgOrderMain jeecgOrderMain,List<JeecgOrderCustomer> jeecgOrderCustomerList,List<JeecgOrderTicket> jeecgOrderTicketList); + + /** + * 删除一对多 + * @param jformOrderMain + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * @param jformOrderMain + */ + public void delBatchMain (Collection<? extends Serializable> idList); +</#if> +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai new file mode 100644 index 0000000..31e1b16 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai @@ -0,0 +1,87 @@ +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@Service +public class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service { +<#if isSubTable == "true"> + @Autowired + private JeecgOrderTicketMapper jeecgOrderTicketMapper; + + @Override + public List<JeecgOrderTicket> selectTicketsByMainId(String mainId) { + return jeecgOrderTicketMapper.selectTicketsByMainId(mainId); + } +</#if> +<#if isMainTable == "true"> + @Autowired + private JeecgOrderMainMapper jeecgOrderMainMapper; + @Autowired + private JeecgOrderCustomerMapper jeecgOrderCustomerMapper; + @Autowired + private JeecgOrderTicketMapper jeecgOrderTicketMapper; + + @Override + @Transactional + public void saveMain(JeecgOrderMain jeecgOrderMain, List<JeecgOrderCustomer> jeecgOrderCustomerList, List<JeecgOrderTicket> jeecgOrderTicketList) { + jeecgOrderMainMapper.insert(jeecgOrderMain); + for(JeecgOrderCustomer entity:jeecgOrderCustomerList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderCustomerMapper.insert(entity); + } + for(JeecgOrderTicket entity:jeecgOrderTicketList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderTicketMapper.insert(entity); + } + } + + @Override + @Transactional + public void updateMain(JeecgOrderMain jeecgOrderMain, List<JeecgOrderCustomer> jeecgOrderCustomerList, List<JeecgOrderTicket> jeecgOrderTicketList) { + jeecgOrderMainMapper.updateById(jeecgOrderMain); + + //1.先删除子表数据 + jeecgOrderTicketMapper.deleteTicketsByMainId(jeecgOrderMain.getId()); + jeecgOrderCustomerMapper.deleteCustomersByMainId(jeecgOrderMain.getId()); + + //2.子表数据重新插入 + for(JeecgOrderCustomer entity:jeecgOrderCustomerList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderCustomerMapper.insert(entity); + } + for(JeecgOrderTicket entity:jeecgOrderTicketList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderTicketMapper.insert(entity); + } + } + + @Override + @Transactional + public void delMain(String id) { + jeecgOrderMainMapper.deleteById(id); + jeecgOrderTicketMapper.deleteTicketsByMainId(id); + jeecgOrderCustomerMapper.deleteCustomersByMainId(id); + } + + @Override + @Transactional + public void delBatchMain(Collection<? extends Serializable> idList) { + for(Serializable id:idList) { + jeecgOrderMainMapper.deleteById(id); + jeecgOrderTicketMapper.deleteTicketsByMainId(id.toString()); + jeecgOrderCustomerMapper.deleteCustomersByMainId(id.toString()); + } + } +</#if> +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei new file mode 100644 index 0000000..54a977e --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -0,0 +1,287 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + +<#list columns as po> +<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum> + <a-col :span="6"> + <a-form-item label="${po.filedComment}"> + <a-input placeholder="请输入${po.filedComment}" v-model="queryParam.${po.fieldName}"></a-input> + </a-form-item> + </a-col> +</#if> +</#list> + + <a-col :span="8" > + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + + </a-row> + </a-form> + </div> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="middle" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> + <a-menu slot="overlay"> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <${entityName?uncap_first}-modal ref="${entityName?uncap_first}Modal" @ok="modalFormOk"></${entityName?uncap_first}-modal> + </a-card> +</template> + +<script> + import ${entityName}Modal from './modules/${entityName}Modal' + import { filterObj } from '@/utils/util' + import { deleteAction,getAction } from '@/api/manage' + + export default { + name: "${entityName}List", + components: { + ${entityName}Modal + }, + data () { + return { + description: '${tableVo.ftlDescription}管理页面', + // 查询条件 + queryParam: {}, + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + <#list columns as po> + <#if po.fieldName !='id'> + { + title: '${po.filedComment}', + align:"center", + dataIndex: '${po.fieldName}' + }, + </#if> + </#list> + { + title: '操作', + dataIndex: 'action', + align:"center", + scopedSlots: { customRender: 'action' }, + } + ], + //数据集 + dataSource:[], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + isorter:{ + column: 'createTime', + order: 'desc', + }, + loading:false, + selectedRowKeys: [], + selectedRows: [], + url: { + list: "/${entityPackage}/${entityName?uncap_first}/list", + delete: "/${entityPackage}/${entityName?uncap_first}/delete", + deleteBatch: "/${entityPackage}/${entityName?uncap_first}/deleteBatch", + }, + + } + }, + created() { + this.loadData(); + }, + methods: { + loadData (arg){ + //加载数据 若传入参数1则加载第一页的内容 + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list,params).then((res)=>{ + if(res.success){ + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + getQueryParams(){ + var param = Object.assign({}, this.queryParam,this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + getQueryField(){ + //TODO 字段权限控制 + var str = "id,"; + for(var a = 0;a<this.columns.length;a++){ + str+=","+this.columns[a].dataIndex; + } + return str; + }, + onSelectChange (selectedRowKeys,selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + var that = this; + that.queryParam={}; + that.loadData(1); + }, + batchDel: function(){ + if(this.selectedRowKeys.length<=0){ + this.$message.warning('请选择一条记录!'); + return ; + }else{ + var ids = ""; + for(var a =0;a<this.selectedRowKeys.length;a++){ + ids+=this.selectedRowKeys[a]+","; + } + var that = this; + this.$confirm({ + title:"确认删除", + content:"是否删除选中数据?", + onOk: function(){ + deleteAction(that.url.deleteBatch,{ids: ids}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + that.onClearSelected(); + }else{ + that.$message.warning(res.message); + } + }); + } + }); + } + }, + handleDelete: function(id){ + var that = this; + deleteAction(that.url.delete,{id: id}).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.loadData(); + }else{ + that.$message.warning(res.message); + } + }); + }, + handleEdit: function(record){ + this.$refs.${entityName?uncap_first}Modal.edit(record); + this.$refs.${entityName?uncap_first}Modal.title="编辑"; + }, + handleAdd: function(){ + this.$refs.${entityName?uncap_first}Modal.add(); + this.$refs.${entityName?uncap_first}Modal.title="新增"; + }, + handleTableChange(pagination, filters, sorter){ + //分页、排序、筛选变化时触发 + console.log(sorter); + //TODO 筛选 + if (Object.keys(sorter).length>0){ + this.isorter.column = sorter.field; + this.isorter.order = "ascend"==sorter.order?"asc":"desc" + } + this.ipagination = pagination; + this.loadData(); + }, + modalFormOk () { + // 新增/修改 成功时,重载列表 + this.loadData(); + } + } + } +</script> +<style scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .ant-layout-content{ + margin:12px 16px 0 !important; + } + .ant-table-tbody .ant-table-row td{ + padding-top:15px; + padding-bottom:15px; + } + .anty-row-operator button{margin: 0 5px} + .ant-btn-danger{background-color: #ffffff} + + .ant-modal-cust-warp{height: 100%} + .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto} + .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden} +</style> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei new file mode 100644 index 0000000..20a115a --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei @@ -0,0 +1,155 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + +<#list columns as po><#rt/> +<#if po.fieldName !='id'><#rt/> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="${po.filedComment}"> + <#if po.fieldType =='date'> + <a-date-picker v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + <#elseif po.fieldType =='datetime'> + <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + <#elseif "int,decimal,double,"?contains(po.fieldType)> + <a-input-number v-decorator="[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + <#else> + <a-input placeholder="请输入${po.filedComment}" v-decorator="['${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + </#if> + </a-form-item> +</#if> +</#list> + + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import { httpAction } from '@/api/manage' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: "${entityName}Modal", + data () { + return { + title:"操作", + visible: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules:{ + <#list columns as po> + <#if po.fieldName !='id'> + <#if po.nullable =='N'> + ${po.fieldName}:{rules: [{ required: true, message: '请输入${po.filedComment}!' }]}, + </#if> + </#if> + </#list> + }, + url: { + add: "/${entityPackage}/${entityName?uncap_first}/add", + edit: "/${entityPackage}/${entityName?uncap_first}/edit", + }, + } + }, + created () { + }, + methods: { + add () { + this.edit({}); + }, + edit (record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model<#list columns as po><#if po.fieldName !='id' && po.fieldType?index_of("date")==-1>,'${po.fieldName}'</#if></#list>)) + //时间格式化 + <#list columns as po> + <#if po.fieldName !='id' && po.fieldType?index_of("date")!=-1> + this.form.setFieldsValue({${po.fieldName}:this.model.${po.fieldName}?moment(this.model.${po.fieldName}):null}) + </#if> + </#list> + }); + + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + const that = this; + // 触发表单验证 + this.form.validateFields((err, values) => { + if (!err) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if(!this.model.id){ + httpurl+=this.url.add; + method = 'post'; + }else{ + httpurl+=this.url.edit; + method = 'put'; + } + let formData = Object.assign(this.model, values); + //时间格式化 + <#list columns as po> + <#if po.fieldName !='id' && po.fieldType =='date'> + formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format():null; + <#elseif po.fieldName !='id' && po.fieldType =='datetime'> + formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format('YYYY-MM-DD HH:mm:ss'):null; + </#if> + </#list> + + console.log(formData) + httpAction(httpurl,formData,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + that.close(); + }) + + + + } + }) + }, + handleCancel () { + this.close() + }, + + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/jeecg_config.properties b/jeecg-boot/src/main/resources/jeecg/jeecg_config.properties new file mode 100644 index 0000000..c8a8df4 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/jeecg_config.properties @@ -0,0 +1,30 @@ +#code_generate_project_path +project_path=E:\\eclipse2018-workspace\\jeecg-boot +#bussi_package[User defined] +bussi_package=org.jeecg.modules.demo + + +#default code path +#source_root_package=src +#webroot_package=WebRoot + +#maven code path +source_root_package=src.main.java +webroot_package=src.main.webapp + +#ftl resource url +templatepath=/jeecg/code-template/one +system_encoding=utf-8 + +#db Table id [User defined] +db_table_id=id + +#db convert flag[true/false] +db_filed_convert=true + +#page Search Field num [User defined] +page_search_filed_num=1 +#page_filter_fields +page_filter_fields=create_time,create_by,update_time,update_by + + diff --git a/jeecg-boot/src/main/resources/jeecg/jeecg_database.properties b/jeecg-boot/src/main/resources/jeecg/jeecg_database.properties new file mode 100644 index 0000000..67ad5ab --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/jeecg_database.properties @@ -0,0 +1,27 @@ +#mysql +diver_name=com.mysql.jdbc.Driver +url=jdbc:mysql://localhost:3306/jeecg-boot?useUnicode=true&characterEncoding=UTF-8 +username=root +password=root +database_name=jeecg-boot + +#oracle +#diver_name=oracle.jdbc.driver.OracleDriver +#url=jdbc:oracle:thin:@192.168.1.200:1521:ORCL +#username=scott +#password=tiger +#database_name=ORCL + +#postgre +#diver_name=org.postgresql.Driver +#url=jdbc:postgresql://localhost:5432/jeecg +#username=postgres +#password=postgres +#database_name=jeecg + +#SQLServer2005\u4ee5\u4e0a +#diver_name=org.hibernate.dialect.SQLServerDialect +#url=jdbc:sqlserver://192.168.1.200:1433;DatabaseName=jeecg +#username=sa +#password=SA +#database_name=jeecg \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/logback-spring.xml b/jeecg-boot/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..f058602 --- /dev/null +++ b/jeecg-boot/src/main/resources/logback-spring.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration debug="false"> + <!--定义日志文件的存储地址--> + <property name="LOG_HOME" value="../logs" /> + + <!-- 控制台输出 --> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> + <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern> + </encoder> + </appender> + + <!-- 按照每天生成日志文件 --> + <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!--日志文件输出的文件名--> + <FileNamePattern>${LOG_HOME}/jeecgboot.%d{yyyy-MM-dd}.log</FileNamePattern> + <!--日志文件保留天数--> + <MaxHistory>30</MaxHistory> + </rollingPolicy> + <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> + <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern> + </encoder> + <!--日志文件最大的大小--> + <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> + <MaxFileSize>10MB</MaxFileSize> + </triggeringPolicy> + </appender> + + <!-- 生成html格式日志开始 --> + <appender name="HTML" class="ch.qos.logback.core.FileAppender"> + <!-- 过滤器,只记录WARN级别的日志 --> + <!-- <filter class="ch.qos.logback.classic.filter.LevelFilter"> + <level>info</level> + <onMatch>ACCEPT</onMatch> + <onMismatch>DENY</onMismatch> + </filter> --> + + <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> + <layout class="ch.qos.logback.classic.html.HTMLLayout"> + <pattern>%p%d%msg%M%F{32}%L</pattern> + </layout> + </encoder> + <file>${LOG_HOME}/error-log.html</file> + </appender> + <!-- 生成html格式日志结束 --> + + <!-- 每天生成一个html格式的日志开始 --> + <appender name="FILE_HTML" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!--日志文件输出的文件名--> + <FileNamePattern>${LOG_HOME}/jeecgboot.%d{yyyy-MM-dd}.html</FileNamePattern> + <!--日志文件保留天数--> + <MaxHistory>30</MaxHistory> + </rollingPolicy> + <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> + <layout class="ch.qos.logback.classic.html.HTMLLayout"> + <pattern>%p%d%msg%M%F{32}%L</pattern> + </layout> + </encoder> + <!--日志文件最大的大小--> + <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> + <MaxFileSize>10MB</MaxFileSize> + </triggeringPolicy> + </appender> + <!-- 每天生成一个html格式的日志结束 --> + + + <!-- show parameters for hibernate sql 专为 Hibernate 定制 --> + <!-- <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" /> + <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" /> + <logger name="org.hibernate.SQL" level="DEBUG" /> + <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" /> + <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /> --> + + <!--myibatis log configure--> + <logger name="com.apache.ibatis" level="TRACE"/> + <logger name="java.sql.Connection" level="DEBUG"/> + <logger name="java.sql.Statement" level="DEBUG"/> + <logger name="java.sql.PreparedStatement" level="DEBUG"/> + + <!-- 日志输出级别 --> + <root level="INFO"> + <appender-ref ref="STDOUT" /> + <appender-ref ref="FILE" /> + <appender-ref ref="HTML" /> + <appender-ref ref="FILE_HTML" /> + </root> + + <!--日志异步到数据库 --> + <!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">--> + <!--<!–日志异步到数据库 –>--> + <!--<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">--> + <!--<!–连接池 –>--> + <!--<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">--> + <!--<driverClass>com.mysql.jdbc.Driver</driverClass>--> + <!--<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>--> + <!--<user>root</user>--> + <!--<password>root</password>--> + <!--</dataSource>--> + <!--</connectionSource>--> + <!--</appender>--> +</configuration> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/static/demo1.html b/jeecg-boot/src/main/resources/static/demo1.html new file mode 100644 index 0000000..f984869 --- /dev/null +++ b/jeecg-boot/src/main/resources/static/demo1.html @@ -0,0 +1 @@ +demo1 \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/static/view/userlist.html b/jeecg-boot/src/main/resources/static/view/userlist.html new file mode 100644 index 0000000..049c822 --- /dev/null +++ b/jeecg-boot/src/main/resources/static/view/userlist.html @@ -0,0 +1,122 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>iview example</title> + <link rel="stylesheet" type="text/css" href="http://unpkg.com/iview/dist/styles/iview.css"> + <script type="text/javascript" src="http://vuejs.org/js/vue.min.js"></script> + <script type="text/javascript" src="http://unpkg.com/iview/dist/iview.min.js"></script> + <style> + #app{padding: 32px;} + </style> +</head> +<body> +<div id="app"> + <i-table border :columns="columns7" :data="data6"></i-table> +</div> +<script> + + var Main = { + data () { + return { + columns7: [ + { + title: 'Name', + key: 'name', + render: (h, params) => { + return h('div', [ + h('Icon', { + props: { + type: 'person' + } + }), + h('strong', params.row.name) + ]); + } + }, + { + title: 'Age', + key: 'age' + }, + { + title: 'Address', + key: 'address' + }, + { + title: 'Action', + key: 'action', + width: 150, + align: 'center', + render: (h, params) => { + return h('div', [ + h('Button', { + props: { + type: 'primary', + size: 'small' + }, + style: { + marginRight: '5px' + }, + on: { + click: () => { + this.show(params.index) + } + } + }, 'View'), + h('Button', { + props: { + type: 'error', + size: 'small' + }, + on: { + click: () => { + this.remove(params.index) + } + } + }, 'Delete') + ]); + } + } + ], + data6: [ + { + name: 'John Brown', + age: 18, + address: 'New York No. 1 Lake Park' + }, + { + name: 'Jim Green', + age: 24, + address: 'London No. 1 Lake Park' + }, + { + name: 'Joe Black', + age: 30, + address: 'Sydney No. 1 Lake Park' + }, + { + name: 'Jon Snow', + age: 26, + address: 'Ottawa No. 2 Lake Park' + } + ] + } + }, + methods: { + show (index) { + this.$Modal.info({ + title: 'User Info', + content: `Name:${this.data6[index].name}<br>Age:${this.data6[index].age}<br>Address:${this.data6[index].address}` + }) + }, + remove (index) { + this.data6.splice(index, 1); + } + } + } + +var Component = Vue.extend(Main) +new Component().$mount('#app') +</script> +</body> +</html> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/templates/demo3.ftl b/jeecg-boot/src/main/resources/templates/demo3.ftl new file mode 100644 index 0000000..d75badc --- /dev/null +++ b/jeecg-boot/src/main/resources/templates/demo3.ftl @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html> +<head lang="en"> +<title>Spring Boot FreeMarker</title> +</head> +<body> + Freemarker HTML <br><br> + + Sessionid: ${sessionid!}<br><br> + + <font> + <#list userList as item> + ${item!}<br /> + </#list> + </font> +</body> +</html> \ No newline at end of file diff --git a/jeecg-boot/src/test/java/org/jeecg/SampleTest.java b/jeecg-boot/src/test/java/org/jeecg/SampleTest.java new file mode 100644 index 0000000..e56027d --- /dev/null +++ b/jeecg-boot/src/test/java/org/jeecg/SampleTest.java @@ -0,0 +1,48 @@ +package org.jeecg; + +import java.util.List; + +import javax.annotation.Resource; + +import org.jeecg.modules.demo.test.entity.JeecgDemo; +import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper; +import org.jeecg.modules.demo.test.service.IJeecgDemoService; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SampleTest { + + @Resource + private JeecgDemoMapper jeecgDemoMapper; + @Resource + private IJeecgDemoService jeecgDemoService; + + @Test + public void testSelect() { + System.out.println(("----- selectAll method test ------")); + List<JeecgDemo> userList = jeecgDemoMapper.selectList(null); + Assert.assertEquals(5, userList.size()); + userList.forEach(System.out::println); + } + + @Test + public void testXmlSql() { + System.out.println(("----- selectAll method test ------")); + List<JeecgDemo> userList = jeecgDemoMapper.getDemoByName("Sandy12"); + userList.forEach(System.out::println); + } + + /** + * 测试事务 + */ + @Test + public void testTran() { + jeecgDemoService.testTran(); + } + +} -- libgit2 0.22.2